Odaily星球日报@HD钱包灵魂大检查:到底有哪些钱包经得住考验?


—撰文 | Cobo金库大掌柜
相信所有用过“去中心化钱包”的同学对助记词都不陌生 。
不管是硬件钱包还是软件钱包 , 创建钱包都有两种方式:

  • 创建助记词:钱包随机生成一组助记词 , 用户需要抄写备份
  • 导入助记词:用户导入一套已有的助记词到钱包内恢复资产
那助记词又是如何变成我们的主私钥 , 进而用HD的方式生成所有子私钥的呢?
其实很简单 。 一套助记词 , 经过2048轮的HMAC-SHA512算法的狂虐 , 生成一个主私钥 , 进而派生出一套HD钱包 。
所以 , 助记词和主私钥是一一对应的关系 , 一套助记词对应一个主私钥 , 也就是对应一个HD钱包 。
大家这里有没有想过一个很恐怖的问题:
比方说这是掌柜手里的12个助记词:
cat tonight sadness walnut fan captain sure assume gorilla caution story pull
方便起见 , 我们称这套词为【cat助记词】
但是 , 当掌柜把【cat助记词】导入钱包的时候 , 第一个词手抖输入成了dog , 于是助记词变成了:
dog tonight sadness walnut fan captain sure assume gorilla caution story pull
方便起见 , 我们称这套词为【dog助记词】
这时候就是悲剧的开始 。
作为一名纯24K囤币党 , 掌柜千辛万苦省吃俭用 , 把所有信仰都充值到了【dog助记词】下的地址上 。
然后有一天 , 可能因为手机或者硬件钱包坏了 , 也可能是又手抖删除了钱包App , 总之种种原因 , 导致需要拿出助记词才能恢复资产 。
此时 , 掌柜掏出了那套尘封已久的【cat助记词】 , 将它导入了钱包 。
前面已经提过 , 一套助记词跟一个HD钱包是一一对应的 。 此时用【cat助记词】恢复得到的地址 , 跟【dog助记词】的地址是不一样的 。 也就是说 , 【cat助记词】下 , 没有任何资产 。
因为误输入了一个助记词dog , 掌柜的所有资产和信仰 , 全丢了 。
是不是很恐怖?
其实机智的比特币开发者早就想到了这一切 。 他们定义了助记词的标准协议 , 会对所有助记词有效与否 , 进行校验 。
在讲“校验原理”之前 , 掌柜先普及一个关于助记词的基础知识 。
BIP39 定义了助记词的标准 , 标准内含有一份2048个词的词表(参考链接1) 。 所有钱包只要遵循BIP39 , 生成的助记词都是从这个2048个词的词表中获得的 , 【cat助记词】的所有词也不例外 。
2048词表的每个单词我们都标上序号 , 从“0”到“2047” 。 最大的序号“2047”用二进制表示刚好是11位“11111111111” 。 所以词表里的每一个词 , 我们都可以根据它的序号对应一个11位的二进制数 。 对于转换二进制后不满11位的 , 我们在它的二进制数前面补“0” , 直至满足11位 。
比如cat是第287个词 , 序列号为“286” , 其对应的11位二进制数就是“100011110” , 我们补足11位 , 将其表示为“00100011110” 。
Odaily星球日报@HD钱包灵魂大检查:到底有哪些钱包经得住考验?
本文插图
接下来我们看看具体的“校验”步骤:
第一步:我们按照上面的方法 , 根据2048词表找到【cat助记词】12个词对应的11位二进制数 。
Odaily星球日报@HD钱包灵魂大检查:到底有哪些钱包经得住考验?
本文插图
第二步:我们把这12个词对应的11位二进制数串在一起 , 得到一个132位的二进制数:
001000111101110010010010111101111111101101100101001011000100010001110110100000000110111101100100101001001001011101011010010101101010
第三步:我们把这个132位的二进制数拆成两部分 , 左边的128位 , 以及右边的4位 。
左边128位:00100011110111001001001011110111111110110110010100101100010001000111011010000000011011110110010010100100100101110101101001010110


推荐阅读