181 / 736BIP370

PSBT v2

先共同准备付款,再向网络广播

一笔付款可以先在电脑上准备,再到另一台设备上核对,最后签名。PSBT 携带尚未完成的交易及签名所需的资料。v2 版本允许按照规定逐步添加输入和输出;仅仅把文件交给别人,并不会转走任何钱。

PSBT v2 是 Partially Signed Bitcoin Transaction(部分签名的比特币交易)格式中第二个正式定义的版本。BIP 370 将它定义为钱包和签名设备共用的工作格式,其中也可以只有一份尚未签名的草案。它方便多人共同构建交易,但不能代替参与者的核对,也不会改变 Bitcoin 网络的规则。

安娜和扬想合付一张账单。两人各出一部分资金,并在自己的设备上添加签名。他们需要交换的是一致的交易草案,而不是私钥。私钥是一个秘密数值,钱包用它生成数字签名,授权花费资金。PSBT 就像装着交易及辅助资料的工作信封。输入指出要花费的既有金额;输出规定新的金额以及今后花费这些金额的条件。最初的 PSBT v0 把这副骨架保存在一笔固定的全局未签名交易中。到了 v2,参与者可以遵循相应规则,逐步添加输入和输出。它带来的好处是共同构建,而不是任意改写别人已经签过的内容。 [1] [2]

安娜不必逐项阅读技术字段,但她需要在可信的签名设备上核对真正的收款人、金额、手续费,以及是否有找零回到自己的钱包。最后这一点容易被忽略:不能把属于别人的输出误当成自己的找零。设备必须验证 UTXO,即尚未花费输出的相关资料,并核对其条件是否与准备签名的内容一致。密钥派生路径记录了钱包从主密钥推导出某个具体密钥所需的步骤。文件列出这条路径,并不能单独证明相应资金属于该钱包。设备还要理解 SIGHASH,它决定签名保护交易的哪些部分。为了签名,无须把私钥或 Seed Phrase,也就是钱包的备份词,加入交换的文件。 [2] [4]

设备或应用写着“支持 PSBT”,不代表就支持 v2。需要核实的是完整流程:具体软件和设备之间能否创建、导入、签名,并把结果传回来。PSBT v0 与 v2 不能直接互换。转换为 v0 时,必须构建未签名交易,并按该版本的规则调整字段;只改一个版本号并不够。Taproot 是较新的 Bitcoin 输出花费条件设计,也不等于 v2。BIP 371 为两种 PSBT 版本都规定了相应的签名资料。用小额操作验证完整流程,可以检验这一组合的兼容性,但不能保证以后每笔付款都正确。 [1] [3]

文件格式的版本与 Bitcoin 交易的版本含义不同。在 v2 中,PSBT_GLOBAL_VERSION 必须为 2,而旧字段 PSBT_GLOBAL_UNSIGNED_TX 必须不存在。另一个必填字段 PSBT_GLOBAL_TX_VERSION 指定交易本身的版本。输入数和输出数也必须提供。这样,每个项目的资料可以放在它自己的位置,软件不必再到一份共同的交易骨架中查找。如果创建者将后续构建交给其他参与者,BIP 370 要求设置适当的修改标志,并将交易版本设为至少 2。无论哪种情况,这都是工作格式,不是网络的新共识规则。 [1]

每个输入都需要 TXID,即前一笔交易的标识符,以及要花费的具体输出在其中的索引。只有 TXID 不够,因为一笔交易可能有多个输出。每个新输出包含以 satoshi,也就是 Bitcoin 最小单位计量的金额,以及 scriptPubKey,即规定花费条件的脚本。添加项目时,也要相应更新全局数量。可选的 sequence 字段保存另一个输入控制值;缺省时使用 0xffffffff。这些构建资料说明如何组装交易,却不能代替待花费 UTXO 的金额和花费条件资料。设备需要后者,才能安全评估签名和手续费。 [1]

假设扬还要添加一个输入。软件不能仅仅因为手里有文件,就认定可以这样做。在 PSBT_GLOBAL_TX_MODIFIABLE 中,位 0 表示是否允许修改输入,位 1 表示是否允许修改输出。位 2 提示存在 SIGHASH_SINGLE 签名,它把一个输入与相应位置上的输出配对。即使插入其他项目,也必须保留这种配对关系。因此,构建者要检查实际的签名及其限制。这些标志是在向协作软件传达信息;它们不能绕过密码学签名,也不能让原本无效的修改变得有效。 [1]

有些输入要求交易等到某个区块高度或时间边界后才能使用。区块是写入网络共同历史的一组交易,区块高度表示它在链中的位置。共同的 nLockTime 字段必须采用所有输入都能接受的要求类型,再取该类型中所需的最大值;如果两种类型都可行,则优先采用区块高度。因此,不能把高度与时间当成两个普通数字直接比较。如果所有输入都没有要求,就使用全局备用值;连备用值也没有时,使用 0。要求不兼容的输入不能加入。已有签名时,新输入还不能改变计算出的 nLockTime。仅有这些字段,并不保证交易符合全部时间锁规则。 [1]

每添加一个签名,后续能改动的范围就可能缩小。BIP 370 要求:签名未使用 SIGHASH_ANYONECANPAY 时关闭输入修改,未使用 SIGHASH_NONE 时关闭输出修改;使用 SIGHASH_SINGLE 时,记录必须保留的配对关系。这些名称表示签名保护范围的差别,不是让初学者随意切换的选项。所有输入准备好后,最终化步骤组装所需的签名数据,再由提取器根据字段生成网络格式的交易。只有广播后,节点才能评估它,矿工才能将它纳入区块。安娜和扬因此要区分草案、已签名结果和已确认付款:单纯交换 PSBT,既不等于完成签名,也不等于付款已获确认。 [1] [2] [4]

要获得更完整的理解,请将本词条与以下词条结合阅读: PSBT, Hardware Wallet, Multisig, Taproot, Bitcoin, UTXO.

DOC · 001BIP 370 — PSBT Version 2规范 DOC · 002BIP 174 — Partially Signed Bitcoin Transaction Format规范 DOC · 003BIP 371 — Taproot Fields for PSBT规范 DOC · 004Bitcoin Core — PSBT workflow文档
修订日期: 来源优先 · 非投资建议