一个PSBT“缺资料”时,问题可能完全不同:签名器不知道前序输出金额,缺redeemScript或witnessScript,找不到密钥派生信息,或者根本缺少签名。utxoupdatepsbt只解决其中的数据补充环节。utxoupdatepsbt接收PSBT和可选描述符集合,返回补充了UTXO与脚本相关信息的PSBT。
先诊断缺口,再运行Updater
先用decodepsbt或analyzepsbt保存更新前快照,按输入逐项记录non_witness_utxo、witness_utxo、脚本、BIP32派生和签名字段。不要只比较PSBT字符串长度,因为字段排序或序列化变化不代表真正增加了可用信息。
| 缺口 | Updater可能补充 | Updater不会做 |
|---|---|---|
| 前序输出 | 可用UTXO信息 | 判断收款是否安全 |
| 脚本 | 描述符匹配的脚本材料 | 生成私钥 |
| 派生路径 | 描述符相关信息 | 证明设备归属 |
| 签名 | 不补签名 | 代替Signer |
描述符可携带范围,节点会利用UTXO集、内存池和可用索引信息匹配输入输出所需数据。 描述符可以带范围,但范围必须来自钱包真实派生策略。范围太小会匹配不到已用地址,范围过大会增加扫描成本并把不必要的公钥关系暴露给在线节点。
数据从哪里来决定能补什么
节点可能利用UTXO集、内存池、txindex等可用数据,再结合调用者提供的描述符。某笔前序交易已经完全花费、节点未启用相关索引、处于裁剪部署,或描述符与脚本不匹配时,更新结果可能仍不完整。
原始PSBT
+ 节点UTXO/内存池/索引
+ 公开描述符与范围
→ 更新后的PSBT
→ 独立签名器复核与签名
“没有补出来”不等于前序输出不存在;“补出来了”也不等于节点替你证明了交易意图。把数据来源、节点版本、索引状态和描述符checksum写入运行记录,后续才能解释差异。
更新前后怎样做字段级对照
对每个输入按outpoint建立表格,比较UTXO金额和scriptPubKey、redeemScript、witnessScript、派生路径与已有签名。对每个输出检查是否新增派生信息,同时确认目标地址、金额和找零归属没有改变。Updater正常情况下不应改变未签名交易的支付意图。
如果PSBT的全局交易、输入outpoint或输出金额在过程中发生意外变化,停止签名,回到创建端重建证据链,不要试图在同一文件上继续“修好”。
四个角色不要在自动化里混成一个
BIP 174把Creator、Updater、Signer、Combiner、Finalizer等角色分开。该RPC不会生成签名,也不会验证收款意图;更新后的PSBT仍需由签名方检查、签名、合并与最终化。 utxoupdatepsbt不会生成签名,也不会确认收款对象可信。硬件钱包或离线签名器仍应独立显示地址、金额、费用和脚本策略;多签参与者还要核对策略、阈值与其他公钥。
签名后可能需要combinepsbt合并各方结果,再由finalizepsbt完成脚本和提取。任何“更新成功”的日志都不能替代最终化状态与广播前解码。
一个安全测试矩阵
至少准备普通P2WPKH、多签、Taproot、已花费前序输出、索引关闭和范围不足六类样本。确认更新能补预期字段,不能补的场景会保留清晰缺口;把含xpub或派生关系的日志限制在受控环境。
本文基于Bitcoin Core 31和BIP 174,只讨论公开数据补充。它不构成签名授权、备份完整性或交易安全保证;在主网运行前,应在regtest重放更新、签名、合并、最终化和拒绝路径。
Updater完成后把PSBT交给谁
更新后的文件应连同前后字段差异、描述符checksum、节点索引状态和未补齐清单一起交给Signer。签名方只接受可解释的输入与输出;仍缺UTXO或脚本时退回Updater,不因流程赶时间而绕过设备确认。
后续角色与字段复核参照BIP-174 PSBT字段、Bitcoin Core完成PSBT、analyzepsbt判断下一步。在自动化中必须保留的限制是:不同脚本类型所需字段不同,描述符范围过大还会增加扫描成本和隐私暴露。
发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。