PSBT v2 是 BIP 370 定义的格式,用来交换尚未完成的 Bitcoin 交易及签名所需资料。数字表示 PSBT 封装的版本,并不自动代表交易版本或新的网络验证方式。
BIP 174 定义的 PSBT v0 包含一笔全局未签名交易。BIP 370 将其构建数据移到独立字段。因此,参与者可以在创建封装后按规则添加输入和输出。这不意味着可以任意修改已签名的部分,也不意味着文件本身就是一次付款。 [BIP 370 — PSBT Version 2] [BIP 174 — Partially Signed Bitcoin Transaction Format]
PSBT_GLOBAL_VERSION 必须为 2,且不能包含 PSBT_GLOBAL_UNSIGNED_TX。必填字段 PSBT_GLOBAL_TX_VERSION 单独指定所构建交易的版本;全局映射还包含输入和输出数量。仅把旧文件的版本号改掉,并不能得到有效的 PSBT v2。 [BIP 370 — PSBT Version 2]
输入必须指定前一笔交易的 TXID 以及被花费输出的索引。输出必须包含以 satoshi 为单位的金额和 scriptPubKey;添加时还须更新对应的全局数量。省略输入 sequence 时,其值视为 0xffffffff。这些构建数据不能替代对 UTXO 资料以及签名设备所需其他信息的核验。 [BIP 370 — PSBT Version 2]
在 PSBT_GLOBAL_TX_MODIFIABLE 中,位 0 允许修改输入,位 1 允许修改输出。位 2 提示存在 SIGHASH_SINGLE 签名:必须保持该输入与对应索引输出的配对。构建者必须检查实际签名;单纯启用标志,不能让原本无效的修改变得安全。 [BIP 370 — PSBT Version 2]
确定 nLockTime 时,先选择所有输入都兼容的要求类型,再取该类型的最大值。两种类型都可行时优先采用区块高度;不兼容的输入不得加入。输入没有要求时使用全局备用值,未提供则用零。如果已经存在签名,新增输入不得改变 nLockTime。 [BIP 370 — PSBT Version 2]
签名者按 SIGHASH 更新标志。不使用 SIGHASH_ANYONECANPAY 时关闭输入修改;不使用 SIGHASH_NONE 时关闭输出修改,使用 SIGHASH_SINGLE 时标记必要配对。完成最终处理后,提取器从各字段组装网络交易。广播以及被网络接受是后续步骤,并非传输封装自带的属性。 [BIP 370 — PSBT Version 2] [BIP 174 — Partially Signed Bitcoin Transaction Format] [Bitcoin Core — PSBT workflow]
PSBT v0 与 v2 不能直接互换。转换为 v0 必须构建未签名交易,并遵守该版本的字段规则。BIP 371 单独为两个版本定义 Taproot 资料。因此,仅支持 PSBT 或 Taproot,不能证明钱包能够导入、签名和导出 PSBT v2。 [BIP 370 — PSBT Version 2] [BIP 371 — Taproot Fields for PSBT]
在可信设备上,将收款方、金额、自己的找零输出及手续费与原定意图逐项比较。核验 UTXO 资料、脚本和所用 SIGHASH;密钥派生元数据本身不能证明输出归属。通过特定协调器与设备试走一遍流程,只能检验兼容性,不能证明未来所有交易都安全。 [BIP 174 — Partially Signed Bitcoin Transaction Format] [Bitcoin Core — PSBT workflow]
要获得更完整的理解,请将本词条与以下词条结合阅读: PSBT, Hardware Wallet, Multisig, Taproot.