第七章 去中心化自治组织(DAO)

2.5 钱包的类型与特色

百度百科云:钱包,顾名思义是装钱的包包。

但数字加密货币的钱包,更像一个银行。一个以太坊钱包里,可有很多个(无限制)地址。每个地址相当于一个银行帐号。还有:没有人能够冻结你的账号,撤销你的转账,也没有消费限额……无论对方在地球的哪个角落,ETH转账的确认时间只需9秒左右。

每个区块链,都至少需要一种具有货币属性的专属通证(token)。我们通常也把这个具有货币属性的通证叫做代币。这就意味着每个区块链也都需要钱包。每个区块链项目也都可以发行一种自己的代币——但一个公有链上的不同的区块链项目可以共用同一个钱包,譬如以太坊上面的去中心化应用(DAPP),就可直接共用MyEtherWallet钱包。

根据载体的不同,区块链里的数字加密货币钱包分为计算机钱包、手机钱包、浏览器钱包、硬件钱包和脑钱包等等,这样不管您使用的是何种设备,或者有什么样的需求,都有配套的钱包供您使用。

其中脑钱包基本已经被淘汰。

硬件钱包是为了离线生成和保存私钥,是目前“公认”比较安全的数字加密货币存储方案——签署交易必须具有加载在内存中的未锁定私钥。传输必须连接到互联网并运行以太坊客户端。如果这两个功能在一台电脑或手机上,那确实是蛮危险的。硬件钱包采用的分离签名和传输的功能称为离线签名,是一种常见的安全措施。其中硬件钱包创建和签名交易,由手机或电脑里对应的app传输交易。

但是由于一些硬件钱包没有开源代码,同时还有一些没有经过硬件安全认证(硬件的全面开源还要假以时日),增加了很高的监守自盗风险。

浏览器钱包的代表为Metamask、Jaxx。

因为使用方便、用户群体大,手机钱包已经成为主流。计算机钱包的特点则刚好相反。

根据数据存储方式的不同,数字加密货币钱包又可分为全节点钱包、轻钱包、分层确定钱包。

全节点钱包(Full Nodes Wallet):是指包含了全部历史交易数据的钱包。多被矿工所使用。其优点是安全可靠。缺点是要下载或更新全部数据后才能正常使用,有时候的确很慢,会影响到用户的使用。

轻钱包(Light Wallet):它通过一种名为“简易支付验证”(Simplified Payment Verification ,SPV)的方式来完成交易验证。简易支付验证节点即“SPV节点”又叫“轻量级节点”,相对应的钱包就是轻钱包。SPV节点只需下载区块头信息,而不下载每个区块中的所有交易信息,由此产生的不含交易信息的区块链,比完整区块链小了很多。“简易支付验证”只是“支付验证”而非“交易验证”,所以SPV节点可以证实某个交易的存在,但不能验证某个交易不存在,这个缺陷可被针对SPV节点的拒绝服务攻击或双重支付攻击所利用。为了防御这些攻击,SPV节点往往会随机连接多个节点,以增加与至少一个可靠节点相连接的概率。

轻钱包的优点是使用快捷、占用存储空间小。随着比特币的使用热潮,轻钱包越来越常用。但对于网络有问题的人来说缺点还是更新数据太慢,加上也不是百分百安全,因此近年其风头被分层确定钱包抢走。

分层确定性钱包(Hierarchical Deterministic Wallet, HD Wallet,HD钱包):常常也被称为多层确定钱包,也曾被称为双层确定钱包。

比特币最早的客户端(Satoshi client)是分层确定性钱包。分层确定性钱包会预先生成 100个随机私钥(对应于100个公钥和100个地址),并且每个私钥只使用一次。每个交易使用一个地址的概念是中本聪提出的。如果交易比较频繁,私钥可能很快会用光,然后再产生100个随机私钥,所以每次完成 100 个交易后,你必须备份钱包的wallet.dat文件,否则可能会丢失资产。这就意味着这个钱包必须被经常性地备份。每个私钥都必须备份,否则一旦钱包不可访问时,就可能无法找回钱包。这种钱包难以管理和备份,经常发生有人清空钱包app的缓存和数据,然后资产全数丢失!

分层确定性钱包则无需每次转账后都备份。它的私钥是对种子密码(Seed,一串由随机数生成器生成的随机数)进行单向哈希运算生成的,在分层确定性钱包中,只要有这个种子密码,就可以找回所有私钥,因此备份了种子密码就相当于备份了您的所有资产,所以它非常方便使用。

分层确定性的概念是根据比特币核心开发者Gregory Maxwell的原始描述和讨论,Pieter Wuille在2012年2月11日整理完善通过BIP32提案提出。但它直到2016年6月15日才被合并到Bitcoin Core,目前几乎所有的比特币钱包服务商都整合了该协议。

BIP32 是HD 钱包的核心提案,通过种子密码来生成主私钥,然后派生海量的子私钥和地址,但是种子密码是一串很长的随机数,不利于记录,后来BIP39用算法将种子密码转化为一串助记词 (Mnemonic),方便种子密码的保存。再后来BIP43对BIP32树结构增加了子索引标识purpose的扩展“m/purpose'/ * ”。最后,BIP44在BIP43和BIP32的基础上增加多币种,通过分层确定性钱包派生多个地址,可以同时管理主网和测试网的比特币,BIP44 提出了5层的路径建议,如下:

m/purpse'/coin_type'/account'/change/address_index

BIP44的规则使得HD钱包非常强大,用户只需要保存一个种子密码(12~18个英文单词),就能控制其钱包里的所有币种。

比特币分层确定性钱包实现机制:

1. 生成一个助记词(BIP39)

2. 该助记词使用PBKDF2转化为种子(BIP39)

3. 种子用于使用HMAC-SHA512生成根私钥(BIP39)

4. 从该根私钥,导出子私钥(BIP32),其中节点布局由BIP44设置

可以看出 BIP39 生成助记词的过程非常重要,早期的HD 钱包助记词是12个单词(现在有的钱包已经增加到18个单词),一共有 2048 个单词可能性,根据这个公式“n!/( n - r )!”我们可以计算出随机生成的助记词所有可能性:

2048!/(2048-12)! = 5.2715379713014884760003093175282 e+39

地球上的沙子数量在大约是1 后面 18 个零。如果你可以每秒生成 一百万个助记词,那么一年可以生成 1000000*60*60*24*365=3.1536e+13,你大约需要 1.6715937e+26 年遍历以上所有助记词!

以太坊的EIP85提案HD钱包的路径为 : m/44'/60'/a'/0/n

a——表示帐号

n——第 n 生成的地址

60 是在SLIP44提案中暂定的补充协议,对应的币种就是ETH,因为BIP44对币种只定义到0 – 31。

以太坊各钱包的具体实现如下:

m/44'/60'/0'/0/x——imToken(可自定义路径),MetaMask,Jaxx,MyEtherWallet,TREZOR,Exodus

m/44'/60'/x'/0/0——KeepKey,MetaMask

m/44'/60'/0'/x——Electrum,Ledger Chrome App,

m/44'/coin_type'/account'/0——Coinomi