协议演进 / BIP/比特币改进提案 / BIP-44
BIP-44
把 HD 钱包的派生路径定为五层:用途 / 币种 / 账户 / 找零 / 地址索引,并规定账户发现与地址间隔上限,一个种子由此管起多币种、多账户。本 BIP 目前处于已部署状态。
一、档案卡
| 编号 | BIP-44 |
|---|---|
| 标题 | Multi-Account Hierarchy for Deterministic Wallets |
| 作者 | Marek Palatinus <[email protected]>, Pavol Rusnak <[email protected]> |
| 指定日期 | 2014-04-24 |
| 层级 | Applications(应用) |
| 类型 | Specification(规范类) |
| 状态 | Deployed(已部署) |
| 依赖 | BIP-32, BIP-43 |
| 阅读版 | https://bips.dev/44 |
| 官方原文 | https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki |
二、放在哪一族
BIP-44 是 HD 钱包派生路径族里最基础、使用最广的一份具体结构。它是 BIP-43 的一个具体应用(原文在摘要中明说),建立在 BIP-32 的派生算法之上:BIP-32 管“怎么派生”,BIP-43 管“第一层先声明用途”,BIP-44 管“声明为 44 之后,整棵树长什么样”。
同族的后续结构都以它为参照或底座:
BIP-45:P2SH 多签的另一套结构(purpose = 45’)
BIP-47:可复用支付码,自述为对实现 BIP-44 的 HD 钱包的补充
BIP-48:多签多脚本层级,账户层沿用 BIP-44 的模式
BIP-46:时间锁定保真保证金地址,结构借用了 BIP-84 一脉的账户形态
三、它要解决什么
BIP-32 与 BIP-43 解决了“能派生”和“先分用途”,但单账户用途之下到底怎么组织,仍需一份完整约定。原文动机说,这套层级相当完备,要一次覆盖:
- 多个币种:同一个主种子服务多种加密货币;
- 多个账户:同一币种下分出互不混用的身份空间;
- 每个账户下的外部链与内部链;
- 每条链上数以百万计的地址。
没有统一结构时,用户换一个钱包导入同一种子,币种、账户、找零地址的对应关系全靠各家猜测,恢复结果不可靠。BIP-44 把这五层全部写死,并连“导入种子后如何发现已有账户”也一并规定,使不同实现对同一种子得出同一棵树。
四、规则本身
4.1 五层路径
m / purpose' / coin_type' / account' / change / address_index
撇号表示硬化派生。前三层用硬化派生,后两层用公开派生。
4.2 逐层含义
purpose(用途):常量 44’(0x8000002C),按 BIP-43 的建议取值,表示这棵子树按本规范使用。硬化派生。
coin_type(币种):一个主节点(种子)可服务数量不限的独立加密货币,但共用同一空间有缺点;这一层为每种币划出独立子树,避免跨币种复用地址、改善隐私。每种币的常量由其开发者申请注册未用编号。原文表中只列了两个:0 = Bitcoin,1 = Bitcoin Testnet,均用硬化派生。完整注册表不在本 BIP 内维护,原文指向 SatoshiLabs 维护的 SLIP-0044。
account(账户):把密钥空间切成独立的用户身份,钱包不得跨账户混币。用户可以像使用银行账户一样组织资金:捐赠(地址全部公开)、储蓄、日常开支等。账户从索引 0 起顺序编号,硬化派生。软件不得在前一账户没有任何交易历史(即其地址从未被使用过)时创建新账户——这条约束是 4.3 的账户发现算法能成立的前提。
change(找零):常量 0 为外部链,1 为内部链(即找零地址)。外部链的地址对外可见、用于收款;内部链的地址不对外部可见、用于接收交易找零。公开派生。
address_index(地址索引):地址从索引 0 起顺序编号,作为 BIP32 子索引。公开派生。
4.3 账户发现
从外部导入主种子时,软件按以下顺序发现账户:
- 派生第一个账户节点(索引 0);
- 派生该账户的外部链节点;
- 扫描外部链地址,遵守下面的间隔上限;
- 外部链上若无任何交易,停止发现;
- 若有交易,账户索引加一,回到第 1 步。
原文强调:算法依据的是交易历史而非账户余额——余额为零的账户只要有过交易,发现过程就会继续向后走。只扫外部链,因为内部链收到的币都来自与之关联的外部链。
4.4 地址间隔上限(gap limit)
间隔上限当时定为 20:若连续遇到 20 个未使用地址,软件即认定此后再无已用地址,停止搜索该地址链。用户在外部链上生成的地址若要超过这一上限,钱包软件应给出警告。
4.5 路径示例
- 比特币、第一个账户、外部链、第一个地址:
m / 44' / 0' / 0' / 0 / 0 - 比特币、第一个账户、找零链、第一个地址:
m / 44' / 0' / 0' / 1 / 0 - 比特币、第二个账户、外部链、第一个地址:
m / 44' / 0' / 1' / 0 / 0 - 比特币测试网、第一个账户、外部链、第一个地址:
m / 44' / 1' / 0' / 0 / 0
五、谁必须动
普通持币人:只需备份种子。换钱包恢复时,应选支持 BIP-44 路径的实现,账户与地址才能按原结构找回;尤其注意间隔上限:手动跳过大量地址收款,可能让恢复扫描提前停下。
钱包开发者:必须实现五层路径、硬化/公开派生的分工、账户创建约束、账户发现算法与 20 的间隔上限,缺一层都会与其他实现恢复出不同的钱包。
全节点与矿工:不受影响。派生路径是钱包内部组织方式,链上不可见。
共识层:无变化。
六、现在算不算数,以及一个常见误读
状态为 Deployed。BIP-44 是 HD 钱包互通的事实底座:路径 m/44'/… 本身就是它的标记。后来针对不同脚本类型的结构(如沿 BIP-43 另立 purpose 的方案)改变的是第一层与地址对应的脚本形态,不改变这套五层组织逻辑的参照地位。
常见误读:
“只要说自己是 BIP32 钱包,导入种子就能恢复 BIP-44 的账户。”
不对。BIP-32 只给派生算法,正是 BIP-43 动机里批评过的情形:都自称 BIP32 兼容,结构却各不相同、并不互通。能恢复 BIP-44 账户的前提,是钱包实现了 BIP-44 这套五层结构与发现算法本身。
七、延伸
- 阅读版:https://bips.dev/44
- 官方原文:https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki
- 相关:BIP-32 分层确定性钱包、BIP-43 用途字段、BIP-45 P2SH 多签结构、BIP-47 可复用支付码、BIP-48 多脚本层级
- 仓库总目录:https://github.com/bitcoin/bips
