简明介绍比特币钱包及其安全性

前两天介绍了TEE与区块链、比特币钱包的一些东西!也许不是很明白比特币钱包这个东西,(本文来自于知乎内容、整理、编辑)

TEE与比特币硬件钱包应用之Ledger

TEE与区块链技术---Rivetz

1,首先把比特币可以理解成256bit的私钥。可以理解这个私钥是个随机数且不可能重复的。历史上几次因随机数导致的丢币(比如说 blockchain.info 曾经出过2-3次随机数事件),都是因为程序写错了。私钥决定了比特币的所有权,必须保护好这个私钥。

2,地址,可以理解成256bit的公钥,也就是存放比特币的地方。地址是由前面说的私钥成对生成的,但地址不能算出私钥。比特币地址是1开头的,从一个私钥计算出其对应的地址之后,就可以往该地址上转比特币了。这个地址上的比特币只有私钥的持有者才能用。地址是公开的。拥有该地址的私钥就拥有了转入该地址的比特币。

3,区块链,区块链就是个“账本”,其实是中本聪为了比特币所设计的一个“用来去中心化的存储比特币账目”的数据结构,所以,本质上,区块链上记录的都是 A 给 B 转账了 5 个比特币这类的信息,就这么简单。这个账本必须能自验证:因此,

① 这个账本被设计成了区块的结构,每过一段时间就会生成出一个新块,把账目做到新的区块中,做进区块的账目就不能再被修改了;

② 这个账本中的账目还别设计成了链表(既前后链接的数据结构),这样,每一笔账目都能最快的查询到上一笔来进行验证,一笔一笔的沿着链条向前验证,最终,任何一笔交易都能验证到最初的原始交易(也就是最初挖矿的那笔交易);这样就做到了去中心化及自我验证,这就是区块链这个数据结构的目的。

账目都是去中心化的存储在区块链上的,也就是存储在比特币网络的每一个节点上的,并不是存储在私钥或者地址上的,所以,一个地址当前的余额是多少,这类的问题需要问区块链,区块链上有着比特币历史上的全部账目,账目都是公开的。

比特币钱包:比特币钱包其实就是“私钥、地址和区块链数据的管理工具”,比如说,私钥这个随机数得生成吧?生成之后得计算出地址吧?相关的区块链数据得维护吧?收到的、花出的账目也都得列出来吧?得能用来收款,也得能进行付款吧?所有这些都得通过工具来完成,这类的工具我们统称为“比特币钱包”。

根据区块链数据的维护方式,我们可以把钱包分为:

1.全节点(如 bitcoin-core 核心钱包),维护着全部的区块链数据(当前在50GB以上),完全去中心化,同步所有数据;

2.SPV轻钱包,只维护与自己相关的区块链数据,基本上去中心化(要依赖比特币网络上的其他全节点),仅同步与自己相关的数据;

3.中心化钱包,不依赖比特币网络,只依赖自己的中心化服务器,不同步数据,所有的数据均从自己的中心化服务器中获得;

从去中心化角度上讲,我们希望更多的人使用全节点钱包,这样比特币网络上的节点数也会更多,不过,由于区块链的数据量太大,严重影响了普通用户的体验,因此,当前越来越流行 SPV 轻钱包模式,越来越多的钱包解决方案也开始转向 SPV。中心化钱包由于不依赖比特币网络,有着流量和体验上的优势,不过因其要依赖第三方中心化的服务,服务不可用则钱包不可用,用户也需要信赖该第三方服务才行。

根据所使用的硬件设备,我们可以把钱包分为:

1.电脑钱包,钱包软件运行于PC操作系统(Windows、MacOS、Linux等);

2.手机钱包,安卓、iOS等;

3.在线钱包(如 blockchain.info ),运行与云服务,私钥加密存储于服务器上,通过浏览器访问;

4.硬件钱包,运行与专门定制的硬件上,可能需要与电脑或手机配合使用;

除了上述分类方式外,还有一种所谓的“链上 on-chain、链下 off-chain”的分类方式,这又产生出了一种“钱包”,叫“off-chain 钱包”。其实,从本质上讲,我们并没有一种比特币交易叫“off-chain 交易”,也不应称这类的服务为“off-chain 钱包”,我们应该称其为“银行”或者是“存币平台”,因为在这种情况下,您手里所谓的一个比特币,其实只是该平台上的一个数字,而并非是比特币网络上真实的比特币,而是该平台欠您的钱,所以,我们应尽可能避免称这类平台为“钱包”。比如说,交易所其实就是存币平台,各类的理财平台、云算力平台等也都是存币平台,这些平台都属于“off-chain”的范畴,我们应称他们为“银行”或“存币平台”,而不要称他们为“off-chain 钱包”。

我们知道私钥的安全性可以通过TEE技术来保证钱包的安全性,或者通过SE的U盾形式,那么除了私钥的安全性需要保证之外,交易的安全性如何保证呢?

我们知道由于数字货币无法像金属货币(比如黄金)那样,仅靠物理转移即可转移所有权————即当A将一份黄金交给B后,A必然不再拥有这份黄金。 而A将一份数字货币转给(签名)B后,A仍可以把同一笔交易转给C,因为A掌握私钥,这两份签名均为有效签名,这就构成了“双花”。因此必须有一种机制来确保每笔交易只能使用一次,即只有对“尚未使用过”的交易签名才能是有效签名。以往的密码学货币无法有效解决双花问题,因而无法摆脱对第三方中心化机构认证的依赖(第三方信任)。

UTXO: Unspent TXO(未花费的交易输出):只有对“尚未使用过”的交易签名才能是有效签名。UTXO(Unspent Transaction Outputs)是未花费的交易输出,它是比特币交易生成及验证的一个核心概念。交易构成了一组链式结构,所有合法的比特币交易都可以追溯到前向一个或多个交易的输出,这些链条的源头都是挖矿奖励,末尾则是当前未花费的交易输出。所有的未花费的输出即整个比特币网络的UTXO。比特币规定每一笔新的交易的输入必须是某笔交易未花费的输出,每一笔输入同时也需要上一笔输出所对应的私钥进行签名,并且每个比特币的节点都会存储当前整个区块链上的UTXO,整个网络上的节点通过UTXO及签名算法来验证新交易的合法性。这样,节点不需要追溯历史就可以验证新交易的合法性。

假设你是Alice,有个比特币钱包,该钱包内含有一个比特币地址,该地址含有一个UTXO,该UTXO内含有10BTC余额。现在你要转帐10个BTC给Bob(不考虑手续费),那么产生的Transaction很简单(用你的UTXO作为input,用Bob的地址作为output)。

现在,情况变得稍复杂一点,你只需要转5个BTC给Bob,这时Transaction就会变得复杂一点(1个input还是引用你的UTXO,2个output,1个是给Bob的地址5BTC,另一个给自己的地址5BTC)。

这时问题就来了。转给自己的那5个BTC是用原来的地址,还是新创建的地址?这就是比特币里的一个标准政策,称为:Change Address(改变地址)。我们现在看一下比特币为什么要设定这样的政策?在没有change address政策之前,我们转账的模式是这样的:

所有剩余的BTC都转回到发送的地址中。因为比特币的blockchain都是公开可查询的,这种方式你很容易追踪到A的付款行为和他的财富状态,没有任何隐私性可言。于是比特币推出了change address的政策(不是强制的),在新模式下工作方式是这样的:

为每次转账的余额创建新的地址。实际上上图中的C是A用户的另一个地址。

在一个Transaction的output中,output是有顺序的(index),总是把目标地址放在第一个(index为0)会导致交易行为泄露。为了进一步增强隐私性,会在此基础上增加shuffleOutputs(洗牌)的功能,该功能会让Transaction中的output顺序打乱,随机排列。经过几次这样的转帐,你就无法追踪A的交易行为了。

这是一个完美的方案,已经被广泛使用。但是,这却为钱包的安全引进了巨大风险,这也是我们今天文章主要的阐述的观点。

现在我们大家绝大多数使用比特币钱包的标准步骤是(不研究在线钱包和交易所,他们会有另外的安全问题):

1. 下载一个比特币钱包(PC或者手机端)

2. 备份钱包(钱包里的密钥)

3. 各种转入、转出

我们以为这样是安全的,因为我已经备份了钱包,即使电脑报废、手机丢失,我还可以用备份进行恢复。是的,没错!但是那只是你不进行转出操作的情况下!一旦你进行转出操作,你的钱包就有可能会为你产生新的地址,而这个新的地址可能不包含你在的备份中!

设想你的钱包里有100BTC,你进行了多次的转出操作,一共转出了50BTC。突然有一天你的手机丢了(钱包在你手机里),你赶紧买了新手机,装了新钱包,拿出备份进行恢复,却发现钱包的余额变成了0。因为你的剩余的50BTC所在的地址你没有备份,这是在转帐过程中产生的新地址!

下面是笔者通过用手机钱包转帐,红框部分的地址是新产生的地址,不在笔者的上次备份之中。

我们这里说是可能,是因为现在不同钱包采取了不同模式。当前大致的模式分为下面几种:

单地址钱包,该种类型就是最原始,没有应用change address方案的钱包; 随机地址池钱包,这种类型的钱包一开始为你随机生成一个地址池,比如含有100个地址(有的可以通过-keypool参数设置池的大小)。在100次转帐范围内,是不需要产生新地址的。但是随着次数增多,还是会有同样的问题; 层级指定地址池钱包(HD钱包),通过密码生成主私钥,再通过主私钥生成若干子私钥;可自定义,支持多种模式的钱包;

如何解决?

如果你不关心隐私问题(因为大部分人不关心交易行为的泄露,因为地址本身就是匿名的,他们更关注币的安全性),可以采用单地址钱包。对于在线钱包也是类似。

对于使用比特币钱包的用户,要看钱包类型(尤其是非HD钱包,大多目前使用的是非HD钱包)。一般需要更多次的备份。一定记住,要么你不转帐,转帐完你可能需要立即备份!

附录(https://github.com/wink/money-tree):

HD 钱包全称为 分层确定性 (Hierarchical Deterministic) 比特币钱包

传统钱包的问题是一个钱包可能存有一堆密钥地址,每个地址都有一些比特币。这样备份钱包的时候,需要备份所有的密钥。但如果之后生成了一个新地址,你就需要重新备份一次。事实上,每次生成新地址的时候,你都需要做一次备份。 HD钱包允许你从一个主(根)密钥创建海量的子密钥。这意味着,一旦你控制了主密钥,你就可以生成所有的子密钥,主密钥和子密钥形成树状结构。所以你就不需要频繁的备份钱包,你只需要在创建钱包的时候备份一次就可以了,因为你可以从主密钥重新创建所有的子密钥。

HD钱包还带来了一些新特性,比如不需要任何私钥,就可以从一个父公钥生成所有的子公钥。具体来说,你的主私钥是以纸钱包的方式备份的,并且离线存放在一个安全的地方。你手头有主公钥,用这个公钥,你就可以生成所有的子公钥。 举个实际的例子,我们要开一个网店,接受比特币付款。你可以离线存放你的私钥,只把公钥放在公网的服务器上。你的网站可以使用这个公钥为网站上的每一个商品生成一个收款地址,或者给你的每个顾客生成一个唯一的地址,甚至为每次交易生成一个地址(如何使用,取决于你的想象)。 并且因为私钥是离线存放的,没人可以黑进你的服务器偷走比特币。

HD钱包有个额外好处,它让你可以控制你的组织里谁可以控制哪些密钥。 和一个商业组织的组织结构类似,HD钱包也是以树形结构组织密钥的。你可以给你的组织里的每个分支部门创建密钥,把私钥交给这个分支部门,这个部门就可以花它的分支上的币,而你,因为有主私钥,所以你可以看到并花费整个树上的币。

想让会计看到所有的交易,但不想让他花你的钱?没问题,你可以给他任何一级上的公钥,他就可以看到该级下的所有交易,并且不能花任何的币。

原文发布于微信公众号 - 安智客(china_safer)

原文发表时间:2017-12-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏区块链大本营

10分钟,前端工程师也能玩转区块链Web3.js开发

3134
来自专栏申龙斌的程序人生

以太坊代币取出到imtoken钱包

最近半个月币圈发生了许多事,“I吸O”一刀切、交易所全关,真是币圈一周人间一年。还有一些坚定地活在未来的人们恶补区块链知识,开始忙着把一些token拼命地往钱包...

1K9
来自专栏区块链技术指北

ERC20 协议 Token 钱包浅谈

这是「区块链技术指北」的第 3 篇文章。 以太坊,Ethereum 是一个分布式的计算机,有许多的节点,其中的每一个节点,都会执行字节码(其实就是智能合约),然...

5959
来自专栏区块链大本营

大年初二已憋不住想写代码的心!来来来教你仅用15分钟在以太坊编写一个区块链Web应用

3277
来自专栏CDA数据分析师

以太坊是什么丨以太坊开发入门指南

原文地址:https://www.cnblogs.com/tinyxiong/p/7878468.html

710
来自专栏极客编程

一个比特币交易流程是如何完成的 原

作为加密货币用户,你需要熟悉交易雏形——为了你对这种不断发展的创新有信心,以及作为理解新兴多签名交易和合约的基础,这两者都将在本系列的后期进行探讨。这不是纯技术...

7674
来自专栏深入浅出区块链技术

以太坊是什么 - 以太坊开发入门指南

1474
来自专栏华仔的技术笔记

关于eth gas的思考

4166
来自专栏区块链入门

【易错概念】以太坊的账户、交易、Gas和Gas Limit的概念

所有以太坊区块链上的行动都是由各账户发送的交易激活。每次一个合约账户收到一个交易,交易自带的参数都会成为代码的输入值运行。合约代码会被以太坊虚拟机(EVM)在每...

793
来自专栏极客编程

不同的区块链技术,涉及那些编程语言?

区块链技术入门,涉及那些编程语言?在本文中,将介绍比特币、超级账本Fabric和以太坊这三种区块链中,分别使用什么开发语言来进行智能合约编程,并提供你进一步学习...

1451

扫码关注云+社区

领取腾讯云代金券