协议演进 / BIP/比特币改进提案 / BIP-43

BIP-43 确定性钱包的用途字段

把 BIP32 派生树的第一层定为“用途”:每种钱包结构占用一个编号,编号与 BIP 号相同,从此不同结构不再共用同一棵树而互不相认。本 BIP 目前处于已部署状态。

一、档案卡

档案卡
编号BIP-43
标题Purpose Field for Deterministic Wallets
作者Marek Palatinus <[email protected]>, Pavol Rusnak <[email protected]>
指定日期2014-04-24
层级Applications(应用)
类型Specification(规范类)
状态Deployed(已部署)
阅读版https://bips.dev/43
官方原文https://github.com/bitcoin/bips/blob/master/bip-0043.mediawiki

二、放在哪一族

BIP-43 是 HD(分层确定性)钱包派生路径族的“分族规则”本身。它建立在 BIP-32(分层确定性钱包)之上:BIP-32 给出从一个种子派生整棵密钥树的方法,BIP-43 则规定这棵树的第一层用来声明“这棵子树按哪份规范使用”。

它之后的具体应用,都是它的实例:

BIP-44:多账户层级,purpose = 44'

BIP-45:确定性 P2SH 多签钱包结构,purpose = 45'

BIP-47:可复用支付码,purpose = 47'

BIP-48:多签钱包多脚本层级,purpose = 48'

没有 BIP-43,这些结构会彼此重叠;有了它,每份结构各占一条互不相交的派生空间。

三、它要解决什么

BIP-32 是钱包体验与安全上的一大步,但它留给实现者的自由度太多。原文动机说得很直白:

问题不在派生算法,而在树形结构没有统一约定:同一个种子,在 A 钱包里按一种层级长出地址,在 B 钱包里按另一种层级长,导入种子也恢复不出原来的账户。

BIP-43 的解法是把分歧前置并编号:结构可以不同,但每种结构必须先声明自己是谁,写在派生路径的第一层。这样钱包看到第一层,就知道该按哪份规范去理解整棵子树。

它还附带一条纪律:只需有限结构的功能,不应摘取已定义结构的一部分就自称“兼容某某 BIP”;应当另写一份 BIP 说明自己的结构,并使用不同的 purpose 值。

四、规则本身

4.1 第一层即用途

派生路径的第一层用作 purpose(用途):

m / purpose' / *

其中撇号表示使用 BIP32 的硬化派生(hardened derivation)。purpose 决定该节点之下子树的全部进一步结构。

4.2 用途编号与 BIP 编号相同

原文鼓励不同的方案各自申请一个独立的 BIP 编号,并把同一个数字用作 purpose 字段,这样不同方案的地址不会从重叠的 BIP32 空间中生成。

例:BIP-44 描述的方案应使用 44’(即 0x8000002C)作为 purpose。

两个例外与保留:

4.3 节点序列化不用特殊版本魔数

因为这套方案可以同时为多种加密货币、甚至与加密货币无关的用途生成节点,原文认为没有理由使用 BIP-32“序列化格式”一节里的特殊版本魔数。它建议统一使用:

即无论子树是什么用途,扩展公钥/私钥都用同一套序列化前缀,靠路径第一层而不是靠前缀来区分用途。

五、谁必须动

普通持币人:无直接操作。备份的仍然只是一个种子;变化在于不同钱包对这个种子的解释方式从此有了统一的第一层标记。

钱包开发者:实现某种派生结构时,先为它确定 purpose 值(原则上与其 BIP 编号相同),并使用硬化派生;导入种子时先读第一层,再按对应规范发现账户与地址。只做有限结构时,应另行定义,而不是裁剪现成结构冒充兼容。

全节点与矿工:不受影响。本 BIP 只约定钱包内部的密钥派生组织方式,不改变交易与区块规则。

共识层:无变化。链上看不出一个地址来自哪条 purpose 路径。

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

状态为 Deployed。它是本组后续文档的共同前提:BIP-44、BIP-45、BIP-47、BIP-48 都自称是 BIP-43 的一个具体应用。现代 HD 钱包的派生路径第一层(如 44’、49’、84’、86’)就是这条规则的日常形态。

常见误读:

“BIP-43 定义了钱包的完整派生路径。”

不对。它只定义了第一层:第一层是用途编号、要用硬化派生、编号与 BIP 号对应。第一层之下的币种、账户、链、地址索引怎么排,是 BIP-44 等后续各自规范的事。BIP-43 定的是“分岔口的命名规则”,不是每条岔路的走法。

七、延伸

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