BTC-BIP
参考
HD钱包和BIP32、BIP44、BIP39
什么是 BIP-39
概念
比特币改进提案BIP(Bitcoin Improvement Proposals),用来提出比特币的协议、客户端或环境的新特性或改进。
BIP主要分为三种:
标准化BIP:这种类型的BIP负责向网络、区块链或者协议等添加新特性。
信息性BIP:这类BIP不涉及比特币协议的变化,主要是为了设计问题、指南、或者提供某个情况的常规信息给比特币社区。
进程BIP:这种BIP描述的是进程或者环境的改变,但是它本身并不会加入到BIP的技术规范中。
所有的BIP都以一个建议的形式开始,在经过社区的充分讨论和修改后,如果收到了足够的支持,就可能被导入到比特币协议的标准中。
BIP-32
BIP-32,分层确定性钱包(Hierarchical Deterministic Wallets),即HD钱包。
比特币钱包原先实现方式是每次生成一个新私钥后,就要生成一个新公钥和相应比特币地址,并存储在钱包文件中。这种方式问题在于每次生成都需要生成新的钱包备份。BIP32创造一种新的公私钥生成方式,只要一个种子,就可生成树形结构的无限个私钥和公钥。
特点:
- 单私钥支持生成无限密钥对:从一个种子生成公私钥对,在仅知道种子的情况下可以创建整个密钥树。这解决了备份问题,因为只需备份这个种子就可以恢复整个钱包。
- 钱包的分层管理:BIP32规定了的一种钱包的结构,使得用户可以将钱包按照用途、业务、账号等进行分层管理。
- 公钥派生:BIP32允许在知道一个节点的公钥和链码的情况下,派生出子公钥。这个特性可以使得公钥的派生可以在无须知道私钥的情况下完成,增强了安全性。
- 隐私增强:传统的钱包使用随机生成的独立地址,而BIP32的钱包则是根据一样的种子来生成一批密钥,每次交易都可以使用新的地址,提高了隐私。
BIP-39
BIP-39,助记词的生成方法。
BIP-39提供了一种如何生成BIP32种子的规范。规范主要描述了基于助记词(一组便于记忆的单词)来生成确定性钱包的算法和过程。
规范主要由两部分构成:
- 如何生成助记词;
- 如何将助记词转化成一个二进制种子。
特点:
- 助记词生成方法:助记词是由一组英文单词组成,这些单词都来自固定的单词表(共2048个)中。首先,根据用户的随机动作(如鼠标移动、键盘打字速度等)生成一个随机数,然后将这个随机数转换为一组单词。这个过程(随机数<--->助记词)是可逆的,只要记住这组单词,就能恢复原始的随机数。
- 密钥恢复:在BIP39规定的助记词生成方法中,只需记住12-24个简单的单词,用户就可以恢复整个钱包。这极大地简化了钱包私钥的备份和恢复问题,提高了钱包的可用性。
- 密码功能:BIP39规定的密码功能可以增加恢复私钥的难度,使别人更难通过助记词恢复到你的私钥。一旦设置了BIP39密码,就必须通过助记词+密码的方式来恢复钱包。
- 跨钱包兼容性:由于BIP39是一个开放的标准,各个钱包厂商之间有很高的兼容性,这意味着你可以把一个钱包的助记词导入到另一个钱包中,这极大地方便了用户。
生成助记词
- 创建一个 128 到 256 位(步长 32 位)的随机序列(熵)
- 对上一步生成的随机序列进行 SHA256 生成 Hash 值,并取出该 Hash 值的前 N 位(熵长/32,如:128 位,则 N = 4)作为随机序列的校验和(Checksum)
- 将 Checksum 添加至第一步生成的随机序列的尾部,此时对于图中示例加上 Checksum 之后为 128 + 4 = 132 位的随机序列
- 将上一步的随机序列按照 11 位一段进行分隔(split),这样对于 128 位熵长的序列就会生成 12 段(132/11=12)
- 此时将每个包含 11 位部分的值与一个预定义的 2048 个单词的词典进行对应
- 按照切割顺序生成了最终的单词组就是助记词
256位的熵对应24个助记词
助记词生成种子
助记词生成之后通过密钥生成函数 PBKDF2 算法来生成种子。PBKDF2 需要提供两个参数:助记词和盐(salt)。其中 salt 的目的就是增加破解难度,在 BIP-39 中还引入**密码(passphrase)**来作为保护种子的附加安全因素。
- PBKDF2 的第一个参数是上面生成的助记词;
- PBKDF2 的第二个参数就是 salt,一般有字符串和可选的用户提供的密码字符串连接组成
- PBKDF2 使用 HMAC-SHA512 算法,使用了 2048 次 Hash 之后产生一个 512 位的值作为种子
从种子开始生成 HD 钱包
上面生成的种子作为 HD 钱包的根种子(root seed),任何 HD 钱包的根种子都可以重新创造整个 HD 钱包。
将根种子输入HMAC-SHA512算法,得到一个512位Hash值,左256位作主私钥m(Master Private Key),右256位作主链码(Master Chain Code)。主公钥M(Master Public Key,264 bits)可以通过 主私钥 m 生成。
除了生成主私钥m、主公钥M和主链码外,还有32bit整型索引号。
将主公钥M、主链码和索引号输入HMAC-SHA512算法,可以生成下一级的子私钥、子公钥、子链码,构成父子关系。另外调整索引号还可以生成同一层级的多套子密钥。
扩展密钥
上述密钥衍生函数是单向的,所有子密钥不能推导出父密钥,也不能推导出同级的姊妹密钥。只有父密钥和父链码才能推动出所有子密钥和子链码。
扩展密钥:密钥和链码组合起来
密钥分公钥、私钥,分别和链码组合又分别称扩展公钥(K,c)、扩展私钥(k,c),K=point(k)。扩展私钥可以推导出扩展公钥,反之不行。
一些场景下,可以将扩展私钥存储在硬件钱包或纸质钱包里,扩展公钥为每笔交易都生成一个新公钥和地址来收款。以下通过扩展公钥里的父公钥来衍生子私钥,进而生成子公钥。
BIP-44
BIP-44,多币种和多账户的规范。
BIP44基于种子(由BIP39生成)和BIP32路径,为确定性钱包定义了一个逻辑层次结构,并在此基础上定义了五层的树状路径。BIP44允许生成和管理多个币种和多个账户,每个账户有自己的接收和更改地址。
跟随这个规范,HD钱包能根据一个种子生成多元化的钱包系统,即你可以使用一个私钥种子生成并管理不同币种的账户与地址。
BIP44定义的路径结构是m / purpose' / coin_type' / account' / change / address_index
- m:主密钥的根
- purpose:固定为44,表示BIP-44
- coin_type:加密货币类型,如0表示Bitcoin、2表示Litecoin、60表示以太坊等等
- account:账户索引,允许在同一钱包中有多个账户,账本分开
- change:地址类型,0表示接收地址,1表示找零地址
- address_index:地址索引,用于标识生成的第n个地址
只要知道种子和BIP-44路径,就能够在符合BIP-44规范的钱包上生成和恢复你需要管理的币种和地址。