Qitmeer Network 周报(2020/9/21-2020/9/27)

每周一聊

你可能不知道的助记词和HD钱包

使用加密数字货币,我们首先会离不开钱包,钱包是普通用户与加密货币系统交互的入口,各种形态的钱包百花齐放,手机钱包、桌面钱包、硬件钱包、网页钱包和纸质钱包等。通过钱包可以无国界无限制地转移你的数字资产。从开发者的角度看,钱包的作用是管理用户的私钥、通过私钥签名交易管理用户在区块链上的数字货币。

Bitcoin Address + Private key = Bitcoin Wallet

根据密钥之间是否有关联可把钱包分为两类:非确定性钱包(nondeterministic wallet) 和 确定性钱包(deterministic wallet)

  • 非确定性钱包:密钥对之间没有关联

  • 确定性钱包: 密钥对由一个原始的种子主密钥推导而来。最常见的推导方式是树状层级推导 (hierarchical deterministic) 简称 HD

比特币最早的客户端(Satoshi client)就是非确定性钱包,钱包是一堆随机生成的私钥的集合。 客户端会预先生成 100 个随机私钥,并且每个私钥只使用一次。如果交易比较频繁,私钥可能会用光,然后再产生一批私钥,所以每次完成 100 个交易后,你必须备份新的 wallet.dat 文件,否则可能会丢失资产。如果你生成很多私钥,你必须保存它们所有的副本。这种钱包难以管理和备份。

后来,根据 BIP32 标准实现了确定性钱包(deterministic wallet),通过一个共同的种子维护 n 多私钥,种子推导私钥采用不可逆哈希算法,在需要备份钱包私钥时,只备份这个种子即可(大多数情况下的种子是通过 BIP44 生成了助记词,方便抄写),在支持 BIP32, BIP44 标准的钱包只需导入助记词即可导入全部的私钥。

现在我们常用的大多数钱包,都是根据 BIP32, BIP44 标准而实现的分层确定性钱包,也就是常说的HD钱包。在使用过程中,我们只需要备份好一套助记词,也即主密钥,就能管理多个资产。

上图展示了 BIP39 标准生成助记词的过程。

  1. 规定熵的位数必须是 32 的整数倍,所以熵的长度取值位 128 到 256 之间取 32 的整数倍的值,分别为 128, 160, 192, 224, 256;

  2. 校验和的长度为熵的长度/32 位, 所以校验和长度可为 4,5,6,7,8 位;

  3. 助记词库有 2048 个词,用 11 位可全部定位词库中所有的词,作为词的索引,故一个词用 11 位表示,助记词的个数可为 (熵+校验和)/11,值为 12,15,18,21,24

助记词由长度为 128 到 256 位的随机序列(熵)匹配词库而来,随后采用 PBKDF2 function 推导出更长的种子(seed)。生成的种子被用来生成构建 deterministic Wallet 和推导钱包密钥。

为了从助记词中生成二进制种子,BIP39 采用 PBKDF2 函数推算种子,其参数如下:

  • 助记词句子作为密码

  • “mnemonic” + passphrase 作为盐

  • 2048 作为重复计算的次数

  • HMAC-SHA512 作为随机算法

  • 512 位(64 字节)是期望得到的密钥长度

DK = PBKDF2(PRF, Password, Salt, c, dkLen)

根据 BIP39 标准,助记词库是一个固定的不重复的2048个有序的单词库,我们经常用到的是英文词库,实际上它还有对应的多语言词库,比如简体汉语、繁体汉语、日语、韩语、法语等,他们都是一一对应的。

比如 "army van defense carry ..." 这样的助记词,我们只要按照 BIP39 的英文词库 找到其对应的词序 “97 1930 460 280 ...”,便可以在 BIP39 的简体中文词库 找出对应的中文助记词 “点 挡 眼 器 ...”

以上文中观点,纯属社区个人观点,如有不当,请指正。

qitmeertalk.org 时刻欢迎您来聊)


Qitmeer Network 周报

项目技术进展

基础产品及开发工具更新

一系列 qitmeer-wallet API 更新


Qitmeer Network Development Report

Project Development Progress

Basic Products and Development Tools

A series of qitmeer wallet API updates.


Qitmeer Common Links