区块链百科

解析HD钱包核心:BIP32、BIP39与BIP44协议详解

引言

对于许多用户而言,以太坊或其他加密货币钱包是进入区块链世界的第一扇大门。无论是移动端App还是浏览器插件,面对那串陌生且至关重要的字符,用户往往既感到好奇又深知其重要性,并必须进行备份。这种设计源于比特币早期的钱包架构,通常被称为HD钱包(Hierarchical Deterministic Wallets,分层确定性钱包)。

随着比特币生态的演进,单一账户已无法满足用户需求,许多人拥有多个地址以隔离风险或管理不同资金。然而,这意味着需要保存大量私钥,操作繁琐且容易出错。为解决这一痛点,BIP32确定性算法应运而生,它允许用户仅通过一个主种子即可派生出无数个私钥和地址,显著优化了用户体验。但原始种子数据较长,记忆和输入困难,于是BIP39出现,它采用助记词方式生成种子。用户只需牢记12个或24个单词(目前主流支持6至24个单词,其中12和24最为普遍),便大幅降低了使用门槛。此外,随着区块链行业爆发式增长,多种币种涌现,早期的确定性算法仅针对比特币,无法兼顾其他资产。为了用同一套种子管理不同币种,BIP44协议随之诞生。作为BIP32的扩展,它为层级路径赋予了特定含义,有效解决了多币种、多账户管理的复杂性问题。

协议官方链接若需深入了解这些协议的技术细节,建议查阅官方文档(这是最权威的解读):

bip32:

bip39:

bip44:

验证网站:

数字钱包概念

在传统金融中,钱包用于存放现金;而在区块链领域,数字资产均关联到特定的账户地址。只有持有该账户对应的私钥,才能对资产进行转移或消费(即使用私钥对交易进行签名)。私钥与地址的生成关系如下:

简而言之,私钥通过椭圆曲线加密算法生成公钥,公钥再经哈希函数处理生成地址。这两个过程均为单向不可逆操作。

因此,数字钱包本质上是一个私钥管理工具,负责私钥的生成、存储及签名运算。需要注意的是,钱包本身并不“储存”资产,资产实际上记录在区块链账本上。

如何创建账号

创建账号的核心在于生成私钥。私钥是一个32字节的数值,从数学角度看,相当于在1到2^256的范围内随机选取一个数字。
因此,生成密钥最关键且首要的步骤是获取足够安全的熵源,即高质量的随机数来源。只要选取的结果具备不可预测性和不可重复性,具体的选取方法并非决定性因素。

例如,可以通过掷硬币256次,记录正反面并转换为0和1,这256位二进制组合即可作为钱包私钥。

在编程实现上,通常是从密码学安全的随机数发生器中截取一串随机字节,并对其进行SHA256哈希运算,从而方便地产生一个256位的数字。

实际过程中,还需要校验生成的数值是否小于n-1(其中 n = 1.158 * 10^77,略小于2^256)。若满足条件,则该私钥有效;否则,需重新抽取随机数再次尝试。获得合适的私钥后,即可按照上述流程进一步生成公钥及地址。

BIP32、BIP39、BIP44

BIP全称为Bitcoin Improvement Proposals(比特币改进提案),旨在提出比特币网络的新功能或优化措施。任何人均可提交提案,经社区审核通过后公布在bitcoin/bips仓库中。BIP与比特币的关系,类似于RFC之于互联网协议体系。

BIP32、BIP39和BIP44共同构成了当前广泛使用的HD钱包标准,涵盖了其设计初衷、核心理念、具体实现及实例应用。

BIP32:定义了分层确定性钱包(HD Wallet)。这是一种系统级方案,能够从单个种子文件生成树状结构的密钥对集合(包含私钥和公钥)。其优势在于便于备份(只需保存种子)、迁移至其他兼容设备以及实现分层权限管理。

BIP39:将难以记忆的机器种子转换为用户易于记忆和书写的单词序列。通常由12个单词组成,被称为助记码(Mnemonic Code),中文常称为助记词。示例如下:

rose rocket invest real refuse margin festival danger anger border idle brow

BIP44:基于BIP32的系统,为树状结构中的每一层赋予特定语义,使得同一个种子能够支持多币种和多账户管理。各层级定义如下:

m / purpose' / coin_type' / account' / change / address_index

其中,purpose'固定为44',表示遵循BIP44标准。coin_type'用于标识不同的加密货币,例如比特币为0',以太坊为60'。

BIP32

钱包本质上是私钥的容器。依据前文所述的方法,用户可以生成大量私钥以满足多账号隐私保护需求,但这导致每个私钥都需要单独备份,极为不便。

早期比特币钱包正是如此运作,因此它们有一个别称:“Just a Bunch Of Keys”(一堆私钥)。

为解决这一痛点,BIP32提案提出:基于一个随机种子,通过分层确定性推导算法生成n个子私钥。这样,用户只需安全保存一个种子,所有私钥均可由此推导得出,如图所示:

(图片来源:精通比特币)

图中所示的子私钥可用于签署交易。

补充说明:BIP代表Bitcoin Improvement Proposals(比特币改进提案),BIP32即第32号提案。
BIP32提案的全称为:Hierarchical Deterministic Wallets,即我们常说的HD钱包。

接下来分析分层推导的具体过程。第一步是生成主密钥:

将根种子输入HMAC-SHA512算法,可得到一个主私钥(m)和一个主链编码(master chain code)。随后,将该步骤生成的密钥(私钥或公钥)及主链编码,结合一个索引号,共同作为HMAC-SHA512算法的输入,继续衍生下一层的私钥及链编码,流程如下:

推导方案主要有两种:一种使用父私钥进行推导(称为 hardened derivation,强化衍生),另一种使用父公钥进行推导(normal derivation,常规衍生)。为了区分这两种衍生方式,索引号也被做了特殊划分:索引号小于2^31用于常规衍生,而2^31到2^32-1之间用于强化衍生。为方便书写,索引号i’表示2^31+i。

因此,通过增加索引号(水平扩展)和向子密钥递进(深度扩展),可以无限生成私钥。

值得注意的是,该推导过程具有确定性和单向性:相同的输入必然产生相同的输出;子密钥无法反推同级的兄弟密钥,也无法推导父密钥。若无子链码,亦无法推导孙密钥。至此,我们对分层推导机制有了清晰的认识。

一句话总结BIP32:为解决管理众多私钥的繁琐问题而提出的分层推导方案。

秘钥路径及BIP44

通过这种树状结构推导出的密钥,通常用路径字符串来表示,各级别之间用斜杠 / 分隔。由主私钥衍生的私钥路径以“m”开头。例如,第一个子私钥的路径为m/0,第一个子公钥为M/0。第二个层级的子密钥路径则为m/0/1,依此类推。

BIP44则为这条路径约定了标准化的语义(同时也扩展了对多币种的支持)。BIP0044指定了包含5个预定义层级的结构:
m 是固定的起点,Purpose 固定为44(或十六进制 0x8000002C)
Coin type:代表币种类型,0代表比特币主网,1代表比特币测试网,60代表以太坊。完整币种列表可参考SLIP44提案。
Account:代表该币种下的账户索引,从0开始计数。
Change:常量0用于外部地址(收款地址),常量1用于内部地址(找零地址)。外部地址指在钱包外可见的地址(如接收付款),内部链用于钱包不可见的地址(用于退回交易变更,通常设为0)。
address_index:即地址索引,从0开始,表示生成的第几个地址。官方建议,每个account下的address_index不宜超过20。

根据EIP85提议的讨论,以太坊钱包也遵循BIP44标准,确定路径格式为a表示帐号,n是第n个生成的地址,60则是SLIP44提案中确定的以太坊编码。因此,开发以太坊钱包时,同样需要深入理解比特币的BIP32和BIP39提案。

一句话总结BIP44就是:为BIP32的分层路径制定标准化规范。

示例

coinaccountchangeaddresspath
Bitcoinfirstexternalfirstm / 44’ / 0’ / 0’ / 0 / 0
Bitcoinfirstexternalsecondm / 44’ / 0’ / 0’ / 0 / 1
Bitcoinfirstinternalsecondm / 44’ / 0’ / 0’ / 1 / 1
Bitcoin Testnetfirstexternalfirstm / 44’ / 1’ / 0’ / 0 / 0
Bitcoin Testnetsecondexternalfirstm / 44’ / 1’ / 1’ / 0 / 0

BIP39

BIP32让我们只需保存一个随机种子(通常为16进制字符串),而非大量私钥,确实简便了许多。但对于普通用户而言,尤其是在冷备份场景下,记忆或输入长串16进制数依然繁琐。为此,BIP39引入助记词机制,用户仅需记住12个或24个单词。这些单词序列通过PBKDF2函数与HMAC-SHA512算法处理,最终生成用于BIP32的种子。

我们可以简单对比一下,哪种备份方式对用户更友好:

使用助记词作为种子主要包含两个环节:助记词的生成以及助记词到随机种子的推导。下面我们将详细分析这一过程。

生成助记词

助记词的生成逻辑如下:首先生成一个128位的随机数,接着计算该校验和(占4位),合计得到132位的数据。然后将其按每11位进行切分,形成12个二进制数。最后,利用每个二进制数作为索引,查找BIP39定义的单词表,从而得到12个助记词。流程图示如下:

(图片来源:网络)

以下是使用BIP39库生成助记词的一段代码示例:

助记词推导出种子

此过程使用密钥拉伸(Key stretching)函数,旨在增强弱密钥的安全性,PBKDF2是常用的密钥拉伸算法之一。
PBKDF2的基本原理是:利用伪随机函数(如HMAC),将助记词明文和盐值(Salt)作为输入参数,经过多次迭代运算,最终生成一个更长(512位)的密钥种子。该种子随后可用于构建确定性钱包并派生密钥。

密钥拉伸函数需要两个关键参数:助记词和盐。盐值的加入提高了暴力破解的难度。盐由常量字符串“mnemonic”加上一个可选的用户密码组成。请注意,如果使用不同的密码,即使助记词相同,拉伸函数也会生成不同的种子。流程图示如下:

(图片来源:网络)

同样,这里提供相应的代码实现示意:

校验和地址是EIP-55中定义的一种包含大小写混合特征的地址形式。

密码可作为额外的安全因子来保护种子。即便助记词备份泄露,若有强密码加持,钱包依然安全(前提是密码具备足够的复杂度与长度)。反之,若忘记密码,则将永久无法恢复数字资产。

一句话总结BIP39就是:通过定义助记词机制,让种子的备份更加友好便捷。

小结

HD钱包(Hierarchical Deterministic Wallets)的概念源自BIP32,其核心目的是解决管理海量私钥的难题,通过分层推导方案实现密钥的高效管理。
BIP44在此基础上,为BIP32的分层路径制定了标准化规范,并扩展了对多币种的支持能力。
BIP39则通过定义助记词,极大地优化了种子的备份体验。

目前市面上主流的以太币、比特币等钱包产品,基本都严格遵循这些BIP标准。