区块链/等级 IV · 深入协议/4.2 升级/课程 4
输出描述符
密钥的语法:为何仅凭种子可能无法恢复你所构建的一切
材料一个正在运行的 Bitcoin Core 实例(版本23或更高)能够导出公钥描述符的硬件钱包用于查看和修改描述符字符串的文本编辑器
好奇
- 由24个单词组成的助记词缺少哪些具体信息,导致它不足以恢复多签钱包中的每一个地址?
- 附加在描述符字符串末尾的校验和,如何在软件尝试导入之前就检测出一处相邻字符互换的错误?
- 为什么 Bitcoin Core 在版本23中将新钱包默认设为描述符模式?如果用现代备份恢复旧式钱包,会出现什么问题?
探索
- 在描述符出现之前,HD 钱包依赖隐式的派生路径。用户备份助记词或扩展公钥(xpub),并默认软件会按照标准的 BIP44 约定重建地址。这种方式对简单的单签钱包一直可行,直到2017年8月隔离见证在区块高度481,824激活。P2WPKH 和 P2WSH 地址类型的引入意味着单个 xpub 已无法完整描述地址的派生结构,从而导致恢复失败:由于钱包扫描的脚本类型不对,资金看起来像是丢失了。
- BIP380 将输出脚本描述符定义为一种标准语言,用于描述 HD 比特币钱包中使用的输出脚本集合。BIP380 建立了整体框架,而 BIP381 至 BIP386 则规定了各个具体的表达式类型,如 pk()、pkh()、sh()、wpkh() 和 wsh()。描述符是一种结构化表达式,能够完整描述一个输出脚本(scriptPubKey)。例如,'wpkh([d34db33f/84'/0'/0']xpub…/0/*)' 明确写出了脚本类型、由主指纹和派生路径给出的密钥来源、扩展公钥,以及需要扫描的索引范围。没有任何需要猜测的地方。
- 该格式在“#”字符之后附带校验和,用于发现输入错误。如果用户手动编辑描述符或复制出错,软件会在接受输入之前先验证校验和。这可以防止无声的数据损坏,即无效地址被无限期扫描却毫无结果。硬件钱包可以导出包含公钥和派生路径的描述符,但会明确排除私钥,使在线节点能够安全地监控离线资产,而无需暴露种子。
- Miniscript 由 Pieter Wuille、Andrew Poelstra 和 Sanket Kanjalkar 自2019年起开发,并在 BIP379(2023年)中得到规范,它为编写和分析脚本提供了一种结构化方法。它将复杂的脚本逻辑分解为简单、可分析的单元,使钱包能够安全地组合时间锁、多签和哈希锁。描述符随后便可以描述带时间锁的恢复路径和多方条件,而这些是仅凭助记词永远无法表达的。
- Bitcoin Core 在版本23(2022年)中将新钱包默认改为描述符钱包,版本30(2025年)则彻底移除了旧式钱包;旧钱包只能迁移。基于 BIP39 助记词的钱包也面临同样的教训:对于标准单密钥钱包以外的任何钱包,都必须在备份助记词的同时备份描述符。这些数据即使泄露也不会危及私钥安全——因为其中只包含公开信息——但仍需防范隐私泄露,因为它会准确暴露用户控制哪些地址及其派生结构。
- 要实际体验这一点,可在 Bitcoin Core 中创建一个新钱包,然后运行 'listdescriptors' 打印其描述符,每个描述符都以“#”之后的校验和结尾。复制其中一个,修改一个字符,再将其传给 'getdescriptorinfo':Bitcoin Core 会以校验和错误拒绝它。注意,普通的 'listdescriptors' 只显示公钥,足以创建一个仅观察副本;要恢复花费能力,则需要 'listdescriptors true'(其中包含私钥,必须相应妥善保管),或者钱包文件的备份。
关键事实
- BIP380 将输出脚本描述符定义为用于描述 HD 钱包输出脚本的标准语言。
- 描述符明确包含脚本类型、密钥来源(指纹/路径)、公钥以及索引范围。
- 附加在“#”之后的校验和用于验证描述符字符串的完整性,防止输入错误。
- Bitcoin Core 版本23(2022年)将描述符钱包设为新建钱包的默认类型。
- Miniscript(BIP379)使描述符能够安全地表示多签和时间锁等复杂脚本。
- 硬件钱包导出仅含公开信息的描述符,使物理隔离的签名设备能够与在线节点配合使用。
练习 九、六、三、一
9收集列出9种不同的输出脚本类型或钱包配置(例如 P2PKH、P2SH-P2WSH、2-of-3 多签)。针对每一种,注明恢复它所需的具体数据。
6归类根据标准 BIP44 路径是否足够,或是正确恢复是否必须使用明确的描述符数据,将这 9 种情况分为 6 类。
3提炼将这6组归纳为3个核心原因,说明隐式派生路径为何无法适用于现代钱包类型。
1凝结用一句话说明描述符为助记词补充了什么,从而使恢复过程具有确定性。
事实核查
日期、数字及数据均依据下方列出的已发表资料进行核实。