分层确定性钱包BIP的原理解析
扫描二维码
随时随地手机看文章
BIP 全名是 Bitcoin Improvement Proposals,是提出Bitcoin 的新功能或改进措施的文件。可由任何人提出,经过审核后公布在bitcoin/bips 上。
BIP32:定义 Hierarchical Deterministic wallet(简称“HD Wallet”,”分层确定性钱包”),是一个系统可以从单一个 seed 产生一树状结构储存多组keypairs(私钥和公钥)。好处是可以方便的备份、转移到其他相容装置,以及分层的权限控制等。这种母钥匙可以生成子钥匙的序列。这些子钥匙又可以衍生出孙钥匙,以此无穷类推。
BIP32提出,可以以特定规则生成私钥,这样只需要存储少量“种子”,就能推算出无数个可用私钥,它的实现称为“分层确定性钱包”。是HD的核心HD Wallets因其只需要一个主(根)私钥,就能生成海量子私钥,这个特性广受欢迎,越来越多的解决方案和企业开始支持或采用HD模型来进行私钥管理。HD模型的最大优点是不使用私钥就能生成大量的由您掌握的地址,其原理就在于直接通过主公钥就可以生成任意数量的子公钥,整个过程无需访问主私钥。这个特性有如下好处:
· 备份容易,只需备份主私钥,新增地址无需再次备份私钥;
· 保证主私钥的冷存储,无论新增多少个地址,仅需主公钥就能完成,无需主私钥介入;
· 方便的第三方审计,只需给第三方机构或会计提供主公钥,他就可以看到所有下级地址的交易,但又不能花费任何币(因为没有子私钥);
BIP39标准就是为了解决助记词的需求,通过随机生成12~24个容易记住的单词,单词序列通过PBKDF2与HMAC-SHA512函数创建出随机种子作为BIP32的种子。
BIP39生成助记词过程:
· 生成一个长度为128~256 位(bits) 的随机序列(熵);
· 取熵哈希后的前n 位作为校验和(n= 熵长度/32),就可以创造一个随机序列的校验和;
· 将校验和添加在随机序列(熵)的末尾;
· 将序列化分为包含11位的不同部分;
· 将每个包含11位不分的值与一个已经预先定义2048个单词的字典作对应;
· 生成的有顺序的单词组就是助记词。
在上面的例子中,我们选取了长度为128位的熵,来生成了有12个单词的助记码。在实际的应用中,熵的长度越长,校验码的长度和助记词的长度也会相应的增长。下图展示了熵数据的大小和助记词的长度之间的关系:
步骤一:随机序列的长度为【128,160,192,224,256】。(熵一定是32的倍数,so熵是16进制数的序列)
步骤二:校验和的长度为【4,5,6,7,8】。(熵/32=校验和)
步骤三+步骤四:随机序列一定是11的倍数,平均划分为不同的11位倍数。
步骤五:与2048个单词的预定义字典作对应。
步骤六:生成助记词的数量:(熵+校验和)/11=助记词的数量。
BIP43提出了BIP32的一个规范(或者说是限制),因为BIP32过于自由,使基于BIP32的各种应用总是互相不能兼容。是32增加了域的扩展。
BIP44是BIP43的一个特殊应用,一个特点是能够包容更多账户(币种),是在43和32的基础上增加多币种,例如你一个HD的钱包可以同时管理主网和测试网的比特币。
BIP0043提出使用第一个强化子索引作为特殊的标识符表示树状结构的“purpose”。基于BIP0043,HD钱包应该使用且只用第一层级的树的分支,而且有索引号码去识别结构并且有命名空间来定义剩余的树的目的地。举个例子,HD钱包只使用分支m/i‘/是为了表明那个被索引号“i”定义的特殊为目地。
在BIP0043标准下,为了延长的那个特殊规范,BIP0044提议了多账户结构作为“purpose”。所有遵循BIP0044的HD钱包依据只使用树的第一个分支的要求而被定义:m/44’/。
BIP0044指定了包含5个预定义树状层级的结构:
m / purpose‘ / coin_type’ / account‘ / change / address_index
第一层的目的地总是被设定为44’。第二层的“coin_type”特指密码货币硬币的种类并且允许多元货币HD钱包中的货币在第二个层级下有自己的亚树状结构。目前有三种货币被定义:Bitcoin is m/44‘/0’、Bitcoin Testnet is m/44‘/1’,以及Litecoin is m/44‘/2’。
树的第三层级是“account”,这可以允许使用者为了会计或者组织目的,而去再细分他们的钱包到独立的逻辑性亚账户。举个例子,一个HD钱包可能包含两个比特币“账户”:m/44‘/0’/0‘ 和m/44’/0‘/1’。每个账户都是它自己亚树的根。
第四层级就是“change”。每一个HD钱包有两个亚树,一个是用来接收地址一个是用来创造找零地址。注意无论先前的层级是否使用是否使用强化衍生,这一层级使用的都是常规衍生。这是为了允许这一层级的树可以在可供不安全环境下,输出扩展的公共钥匙。被HD钱包衍生的可用的地址是第四层级的子级,就是第五层级的树的“address_index”。比如,第三个层级的主账户收到比特币支付的地址就是M/44‘/0’/0‘/0/2。表4-9展示了更多的例子。