协议演进 / BIP/比特币改进提案 / BIP-86
BIP-86
为单密钥 Taproot(P2TR)输出定下派生路径 m/86’/…,并规定派生密钥须经 Taproot 微调后才成为链上输出密钥。本 BIP 目前处于已部署状态。
一、档案卡
| 编号 | BIP-86 |
|---|---|
| 标题 | Key Derivation for Single Key P2TR Outputs |
| 作者 | Ava Chow <[email protected]> |
| 指定日期 | 2021-06-22 |
| 层级 | Applications(应用) |
| 类型 | Specification(规范类) |
| 状态 | Deployed(已部署) |
| 阅读版 | https://bips.dev/86 |
| 官方原文 | https://github.com/bitcoin/bips/blob/master/bip-0086.mediawiki |
二、放在哪一族
HD 钱包派生路径族在 Taproot 时代的续篇,方法直接承袭前作:
BIP-44:多账户层级骨架
BIP-49:P2WPKH 嵌套 P2SH(49’)
BIP-84:原生 SegWit P2WPKH(84’)
BIP-86 为单密钥 P2TR 再占一个 purpose:86’。它依赖的链上规则在另一族里:BIP-340(Schnorr 签名)、BIP-341(Taproot 花费规则)、BIP-342(Tapscript)。本 BIP 只管“钱包从种子走到地址”的那一段,且只覆盖单密钥、无脚本路径的情形;多签与脚本树钱包不在其内。
三、它要解决什么
Taproot 激活后,单密钥 P2TR 输出需要一套共同派生方案,理由与 BIP-84 当年相同:许多软件钱包与硬件签名器仍然只备份 HD 种子,备份里不带派生路径与脚本信息。若各家自选路径,用户仅凭种子在另一款钱包里就很可能找不回 Taproot 输出。
原文同时承认:已有方案可以免除“每种脚本类型固定一条路径”的需要(指描述符等做法),但只要种子-only 备份仍是主流,固定路径就是最稳妥、也最易沿用 BIP-49、BIP-84 实现经验的做法。
四、规则本身
4.1 公钥派生路径
与 BIP-44、BIP-49、BIP-84 同构,只换 purpose:
m / purpose' / coin_type' / account' / change / address_index
purpose 固定为 86',其余各层照前述 BIP 的定义。路径派生出的密钥在文中称为 derived_key。
4.2 从派生密钥到地址:必须多一步微调
这是与 BIP-84 最关键的区别。derived_key 只是 Taproot 的内部密钥(internal key),不能直接当作输出密钥使用。按 BIP-341 的要求:当花费条件不需要脚本路径时,输出密钥也应承诺一个不可花费的脚本路径,而不是没有脚本路径。具体计算为:
internal_key: lift_x(derived_key)
32_byte_output_key: internal_key + int(HashTapTweak(bytes(internal_key)))G
即先把派生公钥提升为曲线点,再加上以自身为输入的 TapTweak 哈希对应的点,得到 32 字节输出密钥。
4.3 交易中的形态
按 BIP-341 的定义:
witness: <signature>
scriptSig: (empty)
scriptPubKey: 1 <32_byte_output_key>
(0x5120{32_byte_output_key})
见证版本 1 加 32 字节输出密钥,编码后即 bc1p… 地址。原文附测试向量,给出账户 0 的 xprv/xpub,以及每个地址的 internal_key、output_key 与 scriptPubKey,实现时须逐项对上——只对上 internal_key 还不算完成。
五、谁必须动
普通持币人:备份种子即可在支持 BIP-86 的钱包间恢复单密钥 Taproot 账户;不支持的钱包扫不到这批地址。
钱包开发者:实现 m/86’/… 路径,并务必执行 TapTweak 微调再构造 P2TR 输出;漏掉微调会生成与所有合规钱包都不一致的地址。
全节点与矿工:无须改动,本 BIP 不涉及共识与网络规则。
共识层:无变化。P2TR 的有效性由 BIP-341 定义。
六、现在算不算数,以及一个常见误读
状态为 Deployed,表示该派生方案已被实际部署使用,是目前单密钥 Taproot 钱包恢复的通用约定。
常见误读:“BIP-86 路径派生出的公钥,就是地址里那个公钥。”
不对。路径派生出的是内部密钥;地址承诺的是经 TapTweak 微调后的输出密钥。两者不同是刻意设计:即使只用密钥路径花费,也要按 BIP-341 承诺一个不可花费的脚本路径。把内部密钥直接放进 scriptPubKey 的钱包,与合规实现互不相认。
