HD Wallets 分层确定性钱包
分层确定性的概念在BIP32提案提出.
BIP32 是 HD 钱包的核心提案,通过种子来生成主私钥,然后派生海量的子私钥和地址,但是种子是一串很长的随机数,不利于记录,所以我们用算法将种子转化为一串助记词 (Mnemonic),方便保存记录,这就是 BIP39,他拓展了HD钱包种子的生成算法。
BIP43对BIP32树结构增加了子索引标识purpose的拓展m/purpose'/* 。
BIP44是在BIP43和BIP32的基础上增加了多币种, 通过HD钱包可以派生多个地址,可以同时管理主网和测试网的比特币, BIP44提出了5层的路径建议, 如下:
m / purpose' / coin_type' / account' / change / address_index
详细的BIP44设置可以参考https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki
BIP44的规则使得HD钱包非常强大, 用户只要保存一个种子,就能控制所有币种,所有账户的钱包。
生成HD钱包及根据种子生成子私钥的步骤:
1.首先,生成一个助记词(BIP39 Mnemonic)
2.该助记词使用PBKDF2转化为种子(BIP39 Seed)
3.种子用于使用HMAC-SHA512生成根私钥(BIP32 Root Key)
4.通过根私钥生成子私钥(参见BIP32),其中节点布局由BIP44设置
image
可以看出BIP39生成助记词的过程非常重要,如果一个HD钱包的助记词是12个有序单词,
单词拥有2048个不同单词的单词库中随机选择, 那么根据排列组合公式,n! / (n-r)!, 即2048!
/ (2048-12)! = 5.27e+39 。地球上的沙子数量大概是1e18, 如果每秒生成一百万个助记词,
那么一年可以生成 1000000606024365 = 3.15e+13, 大概需要 1.67e+26年才能遍历所有的助记词
HD钱包生成工具
除了各主流钱包均加入了对BIP39规则的支持, github上有很多HD钱包生成工具,例如:https://github.com/iancoleman/bip39, 建议下载下来后在断网环境下使用
使用HD钱包的好处
备份更容易
传统钱包的问题是一个钱包可能存有一堆密钥地址,每个地址都有一些比特币。这样备份钱包的时候,需要备份所有的密钥。但如果之后生成了一个新地址,你就需要重新备份一次。事实上,每次生成新地址的时候,你都需要做一次备份。 HD钱包允许你从一个主(根)密钥创建海量的子密钥。这意味着,一旦你控制了主密钥,你就可以生成所有的子密钥,主密钥和子密钥形成树状结构。所以你就不需要频繁的备份钱包,你只需要在创建钱包的时候备份一次就可以了,因为你可以从主密钥重新创建所有的子密钥。
私钥离线存放更安全
HD钱包还带来了一些新特性,比如不需要任何私钥,就可以从一个父公钥生成所有的子公钥。具体来说,你的主私钥是以纸钱包的方式备份的,并且离线存放在一个安全的地方。你手头有主公钥,用这个公钥,你就可以生成所有的子公钥。 举个实际的例子,我们要开一个网店,接受比特币付款。你可以离线存放你的私钥,只把公钥放在公网的服务器上。你的网站可以使用这个公钥为网站上的每一个商品生成一个收款地址,或者给你的每个顾客生成一个唯一的地址,甚至为每次交易生成一个地址(如何使用,取决于你的想象)。 并且因为私钥是离线存放的,没人可以黑进你的服务器偷走比特币。
权限控制
HD钱包有个额外好处,它让你可以控制你的组织里谁可以控制哪些密钥。 和一个商业组织的组织结构类似,HD钱包也是以树形结构组织密钥的。你可以给你的组织里的每个分支部门创建密钥,把私钥交给这个分支部门,这个部门就可以花它的分支上的币,而你,因为有主私钥,所以你可以看到并花费整个树上的币。
记账
想让会计看到所有的交易,但不想让他花你的钱?没问题,你可以给他任何一级上的公钥,他就可以看到该级下的所有交易,并且不能花任何的币。
网友评论