术语表 /地址与密钥
BIP-86派生
- BIP-86派生是什么?
- BIP-86派生将单密钥 Taproot 账户置于 m/86'/0'/0',再用各自的哈希对每个派生密钥进行调整(tweak),使地址承诺一条无法花费的脚本路径。
规定于 BIP-86。
BIP-86适用于为单一签名方持有 Taproot 输出的钱包,沿用 BIP-44的账户结构,并在用途层使用86'。BIP-49和 BIP-84同样定义了地址的第二个步骤,但只有 BIP-86会改变密钥本身:您地址中的32字节数值,是您派生出的密钥再经其自身哈希调整后的结果。如果将助记词恢复到只扫描 BIP-84的软件中,您的 bc1p 余额将显示为零。
运作方式
BIP-86派生分两步进行,只有第一步是人们熟悉的沿密钥树向下推导。
第一步是路径。模板为 m / purpose' / coin_type' / account' / change / address_index,用途位置为86',其下各层均保持不变,因此第一个比特币账户位于 m/86'/0'/0',其第一个收款密钥位于 m/86'/0'/0'/0/0。
第二步是 BIP-86与前代标准分道扬镳之处。BIP-49和 BIP-84同样定义了第二步,但其做法是把派生密钥包裹进一个脚本,见证数据仍会暴露路径所产生的密钥。BIP-86则替换了密钥。它引用 BIP-341中必须满足的规则:"If the spending conditions do not require a script path, the output key should commit to an unspendable script path instead of having no script path." 因此,派生密钥通过 lift_x 被视为内部密钥,上链的是该内部密钥加上 int(HashTapTweak(bytes(internal_key)))G。结果是 OP_1之后的单个32字节推入数据,写作0x5120 后接调整后的密钥,花费它只需在见证数据中提供一个签名,且 scriptSig 为空。
已公布的测试向量显示了二者的差别。在 m/86'/0'/0'/0/0,由种子派生出的内部密钥为 cc8a4bc64d897bddc5fbc2f670f7a8ba0b386779106cf1223c6fc5d7cd6fc115,而网络上看到的密钥为 a60869f0dbcf1dc659c9cecbaf8050135ea9e8cdc487053f1dc6880949dc684c,编码为 bc1p5cyxnuxmeuwuvkwfem96lqzszd02n6xdcjrs20cac6yqjjwudpxqkedrcr。跳过第二步的实现会发布前一个数值,于是给出看似合理的地址,而符合标准的钱包用同一种子恢复时永远找不到这些地址。
Ava Chow 撰写了该文档,其编号于2021年6月22日分配,目前状态为 Deployed。
在哪里会遇到它
BIP-86派生是大多数直接给出 bc1p 地址、不询问您想要哪种格式的单签名钱包的底层机制。Bitcoin Core 在23.0版本中将描述符钱包设为默认,该版本的发行说明称,新创建的描述符钱包包含自动生成的 tr() 描述符,"which allows for creating single key Taproot receiving addresses"。
硬件设备跟进的速度差别很大。本站对 KeepKey 的评测将该设备对 Taproot 输出的支持追溯到2025年2月的固件7.10.0,因此一台廉价的签名设备可能保存着一个种子,却不会向您显示其86' 分支,而读取同一组助记词的其他软件则可以正常花费这些币。
该规范对为何仍需要固定路径相当坦率。其动机部分承认,"there are now solutions which obviate the need for fixed derivation paths for specific script types",即描述符,接着说明这些方案为何仍不能解决问题:许多软件钱包和硬件签名设备仍然只备份种子,旁边没有路径或脚本类型的记录。描述符携带这些信息,而单词列表不携带,所以改由数字86来承载。
BIP-86派生 vs P2TR
BIP-86派生是填充 P2TR 输出的一种方法,而不是其定义。P2TR 是见证版本1,接受任意32字节的输出密钥,包括由多个签名方通过 MuSig2 聚合而成的密钥,以及承诺一棵真正可用的脚本树的密钥。BIP-86涵盖的是这一空间中最狭窄的情形:一个签名方、一个种子,以及一条被有意设为无法花费的脚本路径,使密钥背后不藏任何东西。BIP-86产生的每个地址都是 P2TR 输出,而 P2TR 能表达的大部分内容完全不在其范围内,因此,宣称支持 Taproot 的钱包仍可能拒绝使用相同地址格式的多重签名或带时间锁的分支。