协议演进 / BIP/比特币改进提案 / BIP-49
BIP-49
为使用 P2WPKH 嵌套 P2SH 地址的分层确定性钱包定统一派生路径(purpose 取 49’),让同一主种子在不同钱包里能一致地找到隔离见证账户。本 BIP 目前处于已部署状态。
一、档案卡
| 编号 | BIP-49 |
|---|---|
| 标题 | Derivation scheme for P2WPKH-nested-in-P2SH based accounts |
| 作者 | Daniel Weigl <[email protected]> |
| 指定日期 | 2016-05-19 |
| 层级 | Applications(应用) |
| 类型 | Specification(规范类) |
| 状态 | Deployed(已部署) |
| 阅读版 | https://bips.dev/49 |
| 官方原文 | https://github.com/bitcoin/bips/blob/master/bip-0049.mediawiki |
二、放在哪一族
HD(分层确定性)钱包派生族,紧接 BIP-32、BIP-43、BIP-44 之后:
- BIP-32:分层确定性钱包的基本结构;
- BIP-43:用路径第一层 purpose 区分不同用途;
- BIP-44:以 purpose 44’ 定多币种、多账户层级;
- BIP-49:沿用同一结构,只把 purpose 换成 49’,表示账户里装的是隔离见证地址;
- BIP-141:隔离见证本身,其中定义了 P2WPKH 嵌套进 P2SH 的封装方式;
- BIP-16:P2SH,嵌套所依赖的脚本哈希地址形式。
一句话:路径结构借 BIP-44,地址封装借 BIP-141,BIP-49 只负责把两者对上号。
三、它要解决什么
隔离见证启用后,出现了一种过渡地址形式:把 P2WPKH(见证版公钥哈希)嵌套进 P2SH 地址里。旧钱包能识别这种以脚本哈希呈现的地址,新钱包则能按见证方式花费。
问题是:没有共同派生方案时,同一主种子导入不同 HD 钱包,各家派生出的账户位置可能不一致,用户找不到自己的币。
原文比较了两条路线:
- 沿用已有 BIP-44 账户,在原公钥旁额外派生 P2SH 地址,或从同一账户根分叉出专门的外部/内部链;
- 新建专用账户,只用于隔离见证地址。
路线 1 有一个共同缺点:把主种子导入不支持 BIP-49 的钱包时,账户可能显示出来,却漏掉一部分 UTXO,用户看到的余额是不完整的,自己还不容易察觉。
因此本 BIP 选择路线 2:失败方式要“显眼”——要么账户完整出现,要么完全不出现。用户不必在每次换钱包恢复后,还要逐笔核对余额有没有少。
四、规则本身
4.1 公钥派生路径
沿用 BIP-44 的账户结构,只改 purpose 一层:
m / purpose' / coin_type' / account' / change / address_index
其中 purpose 取 49',其余各层(coin_type、account、change、address_index)的用法与 BIP-44 相同。根账户来自 BIP-32。
4.2 地址派生
从上面派生出的公钥,按 BIP-141 的封装生成 P2SH 地址:
witness: <signature> <pubkey>
scriptSig: <0 <20-byte-key-hash>>
(0x160014{20-byte-key-hash})
scriptPubKey: HASH160 <20-byte-script-hash> EQUAL
(0xA914{20-byte-script-hash}87)
即先对公钥哈希做见证程序封装,再对这段 scriptSig 做 HASH160,得到最终呈现给付款方的 P2SH 地址。
4.3 扩展密钥版本字节
序列化扩展密钥时使用另一套版本字节,与 BIP-44 账户区分开:
- 主网扩展公钥:
0x049d7cb2,呈现为 “ypub” 前缀; - 主网扩展私钥:
0x049d7878,呈现为 “yprv” 前缀; - 测试网扩展公钥:
0x044a5262,呈现为 “upub” 前缀; - 测试网扩展私钥:
0x044a4e28,呈现为 “uprv” 前缀。
更多已登记的版本字节见原文所引的 SLIP-0132。原文还给出了完整的测试向量(主种子、账户扩展密钥、首个收款地址的推导过程)供实现者核对。
五、谁必须动
普通持币人:不必改节点。只需注意:恢复助记词时要选用支持 BIP-49 的钱包,隔离见证账户才会出现。
钱包开发者:需按 49’ 路径派生账户,按 BIP-141 封装生成地址,并使用 ypub/yprv(测试网 upub/uprv)版本字节序列化扩展密钥;扫描账户时要把这条路径纳入发现范围。
全节点与矿工:无变化。这类地址在链上就是普通的 P2SH 输出,验证按既有规则进行。
共识层:本 BIP 不修改共识规则。它定的只是钱包内部的派生约定。
六、现在算不算数,以及一个常见误读
状态为 Deployed。它是隔离见证过渡期里 HD 钱包识别“嵌套隔离见证账户”的统一约定:purpose 49’ 本身就是这类账户的识别标记。
它在设计上刻意不向后兼容:原文明确写道,不兼容的钱包根本不会发现这类账户——这是有意选择的“显眼失败”,好过账户显示出来却漏币。
常见误读:
“用同一个助记词,任何钱包恢复出来的账户都应该一样。”
不对。助记词只给出主种子,账户还要靠派生路径来找。路径(purpose)不同,看到的账户就不同;BIP-49 账户只在支持 49’ 路径的钱包里出现。恢复后“没看到币”,先核对钱包支持的派生路径,不要先怀疑种子错了。
七、延伸
- 阅读版:https://bips.dev/49
- 官方原文:https://github.com/bitcoin/bips/blob/master/bip-0049.mediawiki
- 相关:BIP-16 P2SH、BIP-32 HD 钱包、BIP-43 purpose 字段、BIP-44 多账户层级、BIP-141 隔离见证
- 仓库总目录:https://github.com/bitcoin/bips
