来路不明的PSBT为什么不能顺手就签:BIP174字段里藏着的授权边界 图 1
来路不明的PSBT为什么不能顺手就签:BIP174字段里藏着的授权边界 · 图 1

一、PSBT 装的是什么

BIP174 定义的可签名比特币交易(PSBT)本质上是一个容器:里面躺着一笔未签名的原始交易,外加每个输入、每个签名者各自需要的补充信息。它的出现是为了解决跨软件协作的难题——钱包 A 构造交易,冷钱包 B 签名,服务器 C 补签名,最后由钱包 A 组合广播,各软件不必再为”对方能不能看懂我的交易”发明私有格式。容器结构决定了协作伦理:任何一环都可以往字段里填料,也意味着任何一环都可能往字段里塞料。签名者真正要审的不是”这份文件能不能被解析”,而是”这些字段拼起来是不是一笔我愿意认账的转账”。

来路不明的PSBT为什么不能顺手就签:BIP174字段里藏着的授权边界 图 2
来路不明的PSBT为什么不能顺手就签:BIP174字段里藏着的授权边界 · 图 2

二、两类 utxo 字段决定你签的是哪种算法

PSBT 为每个输入准备了两种提供前手信息的方式。一种是 non_witness_utxo,即整笔前手交易;另一种是 witness_utxo,只给这一笔输出的金额与锁定脚本。对走隔离见证签名(BIP143 那套逐输入承诺金额与脚本的算法)的签名者来说,witness_utxo 足够了。但 non_witness_utxo 多给了东西,也就多开了口子:如果签名实现被诱导改用需要完整前手交易的旧签名算法,构造者对前手交易做的手脚就可能绕开签名者的核对视野——前手金额被夸大时,费用这一项的计算基准就变了,而钱包界面展示的汇总完全正常。这不是猜测,而是两种算法对输入信息需求的直接差异。因此审阅 PSBT 的第一原则是:这笔输入到底打算按哪种算法签,就该只按那种算法所需的最少信息来核对,多出来的字段要问一句为什么带。

三、签名前五分钟核对清单

第一,绕开钱包界面直接读容器:用命令行或检查工具把每个输入的 prevout、金额、锁定脚本打印出来,与你在区块浏览器上看到的真实资金交易逐字节比对,确认每一笔输入真实存在且未被改动。第二,读输出意图:把输出地址与备注核对一遍,留意有没有多出你计划之外的输出——构造者改输出地址不需要破坏任何格式规则。第三,检查 unknown 字段:标准之外的自定义数据是协作扩展的通道,也是藏信息的地方,看不懂的 unknown 先拒绝。第四,确认自己这一签的边界:SIGHASH 类型决定了你放弃什么、锁定什么,联合多个输入时尤其要看清。最后,只签一次:同一输入在一份容器里塞入多份不同签名再走不同分支的玩法,靠的就是签名者的重复顺手操作。

四、三个常见误区

第一个误区是”PSBT 还没最终成形,签一下没关系,反正广播前还能改”。恰恰相反,你签下的签名会永久留在交易里,交易一旦广播,签名对应的就是真实转账,没有任何环节会替你复核。

第二个误区是把”字段齐全”当成”交易安全”。PSBT 校验格式合法性,不校验资金去向:收款地址被换掉、手续费被改大,都不违反格式规则,格式检查全部照过。

第三个误区是只在自己的钱包界面核对,就断定离线端没有盲区。钱包界面通常展示金额与地址的汇总,而攻击藏在细节里,比如某个输入的 utxo 字段被换成另一笔真钱交易而汇总数字分毫不差。把 PSBT 当作需要逐字段读懂的合同而不是待点的按钮,是防盲签的第一步。

一句话总结:PSBT 只是把签名拆成多段流水线,没有替你决定信任交给谁。对来历不明的容器,先读字段、再读意图,最后才谈签名。涉及资产的签名操作请按本文思路逐项核对,本文不构成任何投资建议。

五、离线签名的落地姿势

多数家庭冷机方案可以顺着字段设计:联网端构造 PSBT,里面把每个输入的 witness_utxo 与见证脚本填齐;冷机端只做两件事——按上文清单逐字段读,读得懂才签,然后输出带回签名的同一容器;联网端组合并广播。四方以上协作时,同一容器在多机间往返,每经手一次都要重跑一遍核对,而不是信任上一家的结论。企业多签还应记录每份 PSBT 的哈希与经手人,出现争议时能定位到具体环节。记住 PSBT 的标准格式并不规定谁先谁后签,也不阻止任何中间人替换字段——它的互操作性与它的可篡改性来自同一个设计选择。