只备份助记词为什么恢复不出原地址:钱包还需要输出脚本描述符

把助记词导入另一个钱包后地址对不上,如果助记词本身没有抄错,问题往往不在密钥材料,而在密钥之外的信息:这组密钥应当生成哪类输出脚本、按什么派生路径组织。按 BIP 380《Output Script Descriptors General Operation》的说明,仅凭私钥,恢复钱包无法知道应生成哪些种类的输出脚本和地址。助记词解决的是密钥来源,脚本类型与派生路径则是另一层信息。

助记词、输出脚本、恢复钱包
本文涉及的概念与核对环节。

助记词备份的边界

BIP 380 的动机部分指出,比特币钱包传统上保存一组密钥,再将其序列化、变换,生成钱包监视的输出脚本和提供给用户的地址;备份往往只包含私钥,如今主要是 BIP 39 助记词。该提案认为这种备份方案并不充分,尤其在隔离见证(Segregated Witness)引入新的输出类型之后。给定私钥,恢复钱包并不知道要产生哪一种输出脚本和地址。换言之,助记词能恢复密钥,却不携带“密钥应装入哪种脚本模板”的说明。

同一组密钥可以对应不同脚本类型

输出脚本类型不同,地址形式也会不同。BIP 380 明确写道,仅凭私钥无法让恢复钱包判断应生成何种输出脚本与地址,这已导致钱包之间在恢复备份或导出只读钱包数据时出现不兼容。这里的关键不是私钥算错,而是私钥本身不包含脚本类型这一层含义。若两个钱包采用的脚本类型不同,由同一组密钥生成的地址就会不同,导入后对不上并不奇怪。

派生路径让不兼容进一步扩大

BIP 380 还提到 BIP 32 派生路径带来的复杂之处。BIP 44、49、84 分别为不同输出脚本和地址规定了标准 BIP 32 派生路径,但并非所有钱包都支持这些路径,也并非所有钱包都使用它们。备份和导出中缺少派生路径信息,会造成进一步的不兼容。因此,即使两个钱包支持相同的脚本类型,只要派生路径选择不同,恢复出的地址序列也可能不同。把所有问题都归因于“助记词不通用”,并不准确。

描述符补的是脚本与路径说明

BIP 380 将输出脚本描述符定义为一种简单语言,用于描述输出脚本的集合,并规定描述符的一般语法、校验和与常见表达式。按其设计,脚本类型通过脚本表达式显式指定,密钥派生路径通过密钥表达式显式指定,使钱包备份和导出能够指明要生成的具体脚本、子脚本(如 redeemScript、witnessScript)和密钥。该提案状态为 Deployed,类型为 Specification,指派日期为 2021 年 6 月 27 日,作者为 Pieter Wuille 与 Ava Chow。本文只解释描述符要解决的问题,不展开也不推荐任何具体描述符写法;实际恢复时应以原钱包支持的备份格式和说明为准。

回到最初的问题:只备份助记词不够,是因为助记词不描述输出脚本类型和派生路径。恢复钱包若只拿到密钥材料,就缺少生成哪类输出脚本的依据;描述符的价值,正在于把这类信息随备份一起明确下来。

原始资料

bips.dev

上一篇 PSBT里的未签名交易:scriptSig和见证为什么必须留空