PSBT 和普通比特币交易的区别在于用途:普通交易是节点接受并上链的最终格式,只包含输入、输出和签名;PSBT 是签名完成前的中间格式,在交易之外附带了签名者核对和签名所需的信息。PSBT 不能直接广播,必须签完并转换成普通交易。
普通比特币交易里有什么?
一笔普通交易由版本号、输入、输出和锁定时间组成。每个输入只写明花费的是哪笔交易的第几个输出,以及解锁它的签名;每个输出写明金额和锁定脚本。节点自己有完整的 UTXO 集合,可以查到每个输入花的是多少钱、锁在什么条件下,所以交易里不用重复这些信息。
普通交易为什么不适合交给别人签名?
签名者往往没有节点。一笔未签名的普通交易在离线硬件钱包看来缺少三样东西:每个输入的金额,没有它就算不出手续费,也无法为隔离见证输入签名,因为签名要承诺输入金额;解锁用的脚本,比如多签的见证脚本;以及该用哪把密钥签、哪个输出是自己的找零。
PSBT 把这些信息逐项附在交易旁边:输入花费的 UTXO、赎回脚本或见证脚本、密钥的 HD 派生路径,以及已经收到的部分签名。签名设备不联网,也能自己算出手续费、识别找零并完成签名。为了防止联网端伪造金额,许多硬件钱包还要求 PSBT 附上完整的前序交易,而不只是一个金额。
为什么 PSBT 不能直接广播?
节点只接受普通交易格式。PSBT 要先在“完成”阶段把收集到的签名和脚本拼成最终的解锁数据,再在“提取”阶段去掉所有附加信息,得到一笔普通交易。此后它和任何其他交易没有区别,链上也看不出它曾经是 PSBT。
所以 PSBT 通常比最终交易大得多,但这不影响手续费,手续费只按最终上链的交易大小计算。未完成的 PSBT 要妥善保管,它不含私钥,但会暴露钱包的地址和余额结构。
有 PSBT 之前人们怎么协作签名?
PSBT 由 BIP174 在 2017 年提出。在此之前,各家钱包和硬件设备都用自己的私有格式传递待签交易和辅助数据,用 A 家的软件创建、又用 B 家的设备签名几乎不可能,多签的所有参与方往往只能用同一套软件。
PSBT 把这套数据标准化后,主流钱包和硬件设备都逐步支持,跨厂商协作成为常态。后来的 BIP370 又定义了 PSBT 第二版,允许在构造过程中继续添加输入和输出。
结语
普通交易是给节点看的最终结果,PSBT 是给签名者看的工作底稿,带着核对和签名所需的一切信息,签完之后再变回普通交易上链。对企业来说,这份底稿也是在签名前做策略核对的最佳位置。Safeheron 的 MPC 钱包即服务为企业提供 MPC 密钥管理和策略引擎。
想在每笔比特币交易签名前自动核对去向和金额?