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

BIP-86 单密钥 P2TR 输出的密钥派生

为单密钥 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 的钱包,与合规实现互不相认。

七、延伸

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