硬件设备签名时如何识别异常找零输出:PSBT核对清单
在硬件设备上签名时识别异常找零输出,核心是核对PSBT中找零输出是否使用了与你输入来源一致的派生路径。正常交易中,找零输出会携带描述符路径信息供签名者核验;异常找零往往会缺失路径、路径深度不一致或索引跳跃过大,直接暴露篡改企图。
1. 签名前先确认:这个输出是"付款"还是"找零"
步骤1:在PSBT中定位找零输出
做什么:打开PSBT文件,在outputs[]数组中找到属于你自己的那笔输出。
怎么做:
情况A(钱包软件可查看):用支持PSBT预览的钱包(如Sparrow Wallet),点开交易详情,看输出列表中哪些是"To"地址(付款),哪些标注了"Change"(找零)。找零输出通常会显示一个由你钱包生成的新地址。
情况B(命令行或文本查看):直接读取PSBT的JSON或文本格式,在outputs字段中,带有bip32_derivs信息的输出很可能是找零(只有找零输出会携带完整派生路径,对外付款输出通常不附带)。
做到什么程度算完成:你明确知道这笔交易里哪一笔输出是返回给你自己的找零。
2. 核对找零输出的派生路径(核心防线)
异常找零攻击的本质,是篡改PSBT中的派生路径,把本该回到你钱包的找零指向另一个你无法控制的路径。
步骤2:检查找零输出是否携带bip32_derivs字段
做什么:在PSBT的找零输出中,查找bip32_derivs信息。
怎么做:
情况A(有bip32_derivs):继续步骤3,核对路径是否和你本钱包的描述符一致。
情况B(没有bip32_derivs):这是强警报信号。如果这是找零输出但缺少派生路径,硬件设备无法核验这个地址是否真的属于你。部分设备会显示"Change Fraud"或"找零欺诈"警告。
做到什么程度算完成:你确认找零输出是否有bip32_derivs信息。
步骤3:核对派生路径的规范性
做什么:检查bip32_derivs中的路径(如m/84'/0'/0'/1/4)是否匹配你的钱包描述符格式。
怎么做:重点核对以下指标:
路径长度一致:找零输出的派生路径长度,必须和你输入UTXO的派生路径长度相同。
硬化/非硬化模式一致:路径中'(硬化索引)的分布模式应保持一致。
倒数第二位为0或1:按BIP44标准,找零路径的倒数第二位通常是0(外部地址)或1(内部地址/找零地址),/1/是找零地址的常见位置。
最后一位索引在合理范围:正常找零地址索引不会与输入地址索引差距过大(通常不超过200)。
路径深度不超过12层:超过12层的路径应视为可疑。
做到什么程度算完成:所有指标均通过验证,路径看起来"正常"而非"故意构造"。
前置条件:你已经有了描述符(Descriptor)备份。没有描述符,你无法在本地独立验证找零输出是否真的属于你。描述符就是你钱包的"蓝图",记录着所有地址的派生规则。
3. 签名设备上的实操核对
步骤4:在硬件设备屏幕上逐一核对
做什么:在硬件设备上签名前,仔细看屏幕显示的每个输出地址和金额。
怎么做:如果设备显示"Change Fraud"警告或"Troublesome Change Outs",立即中止签名。这表示设备检测到找零路径异常。记录下设备显示的预期路径与实际路径,对比差异。
做到什么程度算完成:设备显示的找零地址与你之前记录的预期地址一致,且没有弹出任何找零相关的警告。
常见失败原因
"硬件设备检测到Change Fraud,但我觉得交易没问题"——多签钱包中,如果某个参与方使用了不同格式的钱包,可能导致生成的找零路径格式不一致,被硬件设备误判为异常。Coldcard的文档明确提到这种情况"会有误报",需要手动确认后选择放行,前提是你确实知道这笔找零会去哪,而不是盲目点击通过。
风险提醒:异常找零攻击的前提是攻击者拿到了你的XPUB。XPUB本身不能动你的钱,但结合篡改PSBT,可以让找零流向一个极端路径——虽然你的私钥仍然能控制那个地址,但你不知道路径是什么,等于永远找不回来。建议XPUB只在受信任的设备和钱包软件间流转,不要通过非加密渠道传输。
做完以上核对,怎么确认找零是安全的?
最简单的方法:用你的描述符(Descriptor)在离线钱包软件中独立派生当前交易使用的找零地址,然后与PSBT里找零输出的地址逐字符比对。二者一致,说明找零没有被动过。 如果你发现地址不一致,或者找不到描述符来验证——不要签名。先确认描述符备份在哪,再继续。
