
分层确定性钱包
Hello , 我是09
此篇内容为我2018~2020年在【库神】工作时,对部分重要知识做的学习总结
随着比特币冲破10万美金,行业又再次兴起,希望相关从业者可以学习到你需要的内容
钱包 is what ?
数字货币钱包有几个阶段的大改进分别为:
非确定性钱包
(也被称为随机钱包)、HD钱包
。BIP32提出的HD钱包在最早期还是有很多不足,经过了两次较大变化,分别为
BIP39、BIP44
。
本篇文章就是讲解这几个重要的改进版本都改了哪些内容。
“BIP” 又是 what ?
分层确定性源于
BIP32
。该协议在2012年2月11日这一天,由比特币代码维护者、区块链协议公司Blockstream联合创始人”Pieter Wuille”
提出。于2013年4月16日正式使用。接下来我们来了解那么何为BIP
!BIP:全名为”Bitcoin Improvement Proposals”,这个BIP中的文件可以是由任何拥有区块链知识人员提出的针对Bitcoin新功能或改进措施。提出后,需要经过Bitcoin维护团队来审核,最终公布再bitcoin/bips上。链接:https://github.com/bitcoin/bips。
确定性钱包的问世就来自这个BIP的改进文件,与确定性钱包相关最重要的改进协议文件有三个,分别为
BIP32、BIP39以及BIP44
。
非确定性钱包
在BIP32问世前,我们的数字货币钱包只是具备
随机生成私钥
的功能,这种钱包被称为非确定性钱包
。在比特币的结构中,开发者建议大家每一次使用都更换一个新地址。这样做以保证丢失或被盗其中任何一个私钥也不至于丢失全部资产。于是早期的非确定性钱包在最初创建时,就会生成足够多的私钥,并且
每个私钥只使用一次
,一旦生成的私钥全部用过后,还会再继续随机生成新的私钥
。随着时间推移,它的弊端渐渐呈现。用户管理自己的私钥是非常不友好的,难以管理难以备份。私钥使用过后就会产生新的私钥,那么用户就必须经常备份。
BIP32确定性钱包问世
由”Pieter Wuille”提出的分层确定性概念BIP32协议规范包括两部分。在第一部分中,提出一种用于从单个种子派生出秘钥对树的系统,我们看看演示图:
这个系统从seed产生一树状结构储存多组秘钥对(私钥和公钥)。好处是显而易见的,无论生成多少秘钥对,用户只需要备份seed就可以了。那么这个系统直接适用于钱包吗?可以但是还不够好。
再来看BIP32协议规范的第二部分:如何再这种树状结构顶部构建钱包结构。我们来看一下结构图:
我来带大家简单分析一下分层确定性结构
Entropy -> m -> accounts -> chalns ->addresses
熵 -> 主密钥 -> 账户 -> 链 -> 地址
该结构通过128bit长度的随机熵,经过HMac函数推导出主密钥对,主密钥对通过扩展建生成自秘钥对,一层一层最终推出地址。
很了不起的协议,但是我们现在市面上的数字货币钱包还不仅仅如此。
随机熵长度为128个bit,也就是32位长度的十六进制数据。这对于用户备份来说十分不友好,通俗点说就他大爷的脑瓜疼,因为一旦其中任何一位数抄写错误,就意味着丢失资产,还是不方便备份。
而且随着区块链1.0、2.0、3.0的发展,数字货币的种类越来越多,据不完全统计2019年已经达到了2万+的数字货币币种。用户很有可能拥有多个数字货币资产,那么想要支持多个币种要怎么办呢?BIP39出现了
BIP39
2013年9月10日,BIP39协议诞生了,作者”Marek Palatinus”提出了一份建议助记词。
助记词必须以32位的倍数编码熵。随着熵的增加,安全性得到改善,但是句子长度增加了。我们将初始熵长度称为ENT。ENT的大小为128~256bit。
1. 用户可以决定使用密码来保护自己的助记符。如果不存在密码,则使用空字符串“”代替。
2. 要从助记符创建二进制种子,我们将PBKDF2函数与助记符语句(在UTF-8 NFKD中)用作密码,将字符串“助记符” +密码短语(在UTF-8 NFKD中再次)用作盐。迭代计数设置为2048,HMAC-SHA512用作伪随机函数。派生密钥的长度为512位(= 64字节)。
(作者PS:盐,目前市面上的钱包钱包默认盐为”mnemonic”,这也就是每个不同公司钱包产品之间可以用过助记词互相恢复钱包的原因。
一旦钱包的默认盐发生了变化,创建出来的最上层助记词符钱包再导入其他钱包产品得到的任何币种的地址都是不同的,无法恢复资产。)
3. 以后可以使用BIP-0032或类似方法将此种子用于生成确定性钱包。
4. 助记符句子到二进制种子的转换完全独立于生成句子。这样就产生了相当简单的代码。句子结构没有任何限制,客户可以自由地实现自己的单词表甚至整个句子生成器,从而可以灵活地使用单词表进行错别字检测或其他目的。
5. 尽管可以使用“生成助记符”一节中描述的算法未生成的助记符,但不建议这样做,软件必须使用单词表为助记符语句计算校验和,并在警告无效时发出警告。
6. 所描述的方法还提供了合理的可否认性,因为每个密码短语都会生成一个有效的种子(并因此生成确定性的钱包),但是只有正确的种子才能使所需的钱包可用。
BIP39的出现,改变了钱包备份的最友好解决方式,也就是现在大家使用钱包第一步要备份的助记词。(门罗币略有特别)
例如:frame team cricket honey business rifle essay diary raven head menu next
BIP44
2014年4月24日,BIP44协议诞生了。作者同样是”Marek Palatinus”,他在这一天提出了一份基于BIP32的协议
《确定性钱包的多账户层次结构》
。了解了BIP32后,对应的BIP44理解起来会很简单:
BIP44结构如下:
m / purpose' / coin_type' / account' / change / address_index
主密钥 / 44' / 币种类型' / 账户' / 更改 / 地址索引
注释:
1. 符号“ ’ ”代表增强。
官方解释:Rename keys with index ≥ 0x80000000 to hardened keys, and add explicit conversion functions.
将索引≥0x80000000的密钥重命名为强化密钥,并添加显式转换功能。
代码中:KDpriv(&tempSecret, &tempChain, index | 0x80000000);
2. 币种类型
该级别为每个加密货币创建一个单独的子树,避免重复使用数字货币中的地址。
类型为一个常量,每个拥有主链的数字货币需要为其项目注册一个未使用的编码。
3. 账户
此级别将秘钥控件划分为独立的用户身份,因此钱包永远不会再不同账户中混合币种。
官方建议账户的目的可以用于捐赠,用于保存目的,用于共同费用等。
4. 更改
常数0用于外部链,常数1用于内部链(也称为更改地址)。
外部链用于在钱包外部可见的地址(例如,用于接收付款)。
内部链用于在钱包外部不可见的地址,并且用于退货交易更改。
5. 索引
地址从索引0开始按顺序递增编号。此数字在BIP32派生中用作子索引。
举例:
BTC的Slip44编号为:0, 完整Slip44路径为:m/44’/0’/0’/0/0
LTC的Slip44编号为:2, 完整Slip44路径为:m/44’/2’/0’/0/0
EOS的Slip44编号为:194,完整Slip44路径为:m/44’/194’/0’/0/0
ETH的Slip44编号为:60, 完整Slip44路径为:m/44’/60’/0’/0/0
ETC的Slip44编号为:61, 完整Slip44路径为:m/44’/61’/0’/0/0
总结
分层确定性钱包的优势:
比特币参考客户端使用随机生成的密钥。为了避免每次事务后都需要备份,(默认情况下)100个密钥被缓存在保留密钥池中。尽管如此,这些钱包并不打算同时在多个系统上共享和使用。
确定性钱包不需要频繁的备份,椭圆曲线允许使用这样的方案,即人们可以在不泄露私钥的情况下计算公钥。
支持处理多个币种、多个账户、每个账户的内部、外部链以及每个链的数百万个地址。
友情分享
主链币的Slip44编号请参考:https://github.com/satoshilabs/slips/blob/master/slip-0044.md