协议演进 / 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 账户发现

从外部导入主种子时,软件按以下顺序发现账户:

  1. 派生第一个账户节点(索引 0);
  2. 派生该账户的外部链节点;
  3. 扫描外部链地址,遵守下面的间隔上限;
  4. 外部链上若无任何交易,停止发现;
  5. 若有交易,账户索引加一,回到第 1 步。

原文强调:算法依据的是交易历史而非账户余额——余额为零的账户只要有过交易,发现过程就会继续向后走。只扫外部链,因为内部链收到的币都来自与之关联的外部链。

4.4 地址间隔上限(gap limit)

间隔上限当时定为 20:若连续遇到 20 个未使用地址,软件即认定此后再无已用地址,停止搜索该地址链。用户在外部链上生成的地址若要超过这一上限,钱包软件应给出警告。

4.5 路径示例

五、谁必须动

普通持币人:只需备份种子。换钱包恢复时,应选支持 BIP-44 路径的实现,账户与地址才能按原结构找回;尤其注意间隔上限:手动跳过大量地址收款,可能让恢复扫描提前停下。

钱包开发者:必须实现五层路径、硬化/公开派生的分工、账户创建约束、账户发现算法与 20 的间隔上限,缺一层都会与其他实现恢复出不同的钱包。

全节点与矿工:不受影响。派生路径是钱包内部组织方式,链上不可见。

共识层:无变化。

六、现在算不算数,以及一个常见误读

状态为 Deployed。BIP-44 是 HD 钱包互通的事实底座:路径 m/44'/… 本身就是它的标记。后来针对不同脚本类型的结构(如沿 BIP-43 另立 purpose 的方案)改变的是第一层与地址对应的脚本形态,不改变这套五层组织逻辑的参照地位。

常见误读:

“只要说自己是 BIP32 钱包,导入种子就能恢复 BIP-44 的账户。”

不对。BIP-32 只给派生算法,正是 BIP-43 动机里批评过的情形:都自称 BIP32 兼容,结构却各不相同、并不互通。能恢复 BIP-44 账户的前提,是钱包实现了 BIP-44 这套五层结构与发现算法本身。

七、延伸

本页内容整理自 bitcoin/bips 仓库与 bips.dev,事实已与仓库核对;解读仅供学习参考。