术语表 /钱包与托管
PSBT 第2版
又称 PSBTv2。
- PSBT 第2版是什么?
- PSBT 第2版是取消固定未签名交易的部分签名交易格式,因此参与者在文件创建之后仍可添加输入和输出。
规定于 BIP-370。
第0版在创建时就固定了输入和输出的集合;第2版则把所有细节移入各输入和各输出的映射中。BIP-370于2021年1月14日分配编号,并跳过了数字1,因为 BIP-174的格式是第0版,曾被口头称为第1版。对持有者而言,只有在签名过程中,另一位参与者向您已经发起的交易添加币时,第2版才有意义。
运作方式
PSBT 第2版保留了 BIP-174的外层容器,并重新安排了其内部内容。切换由两条规则界定:PSBT_GLOBAL_UNSIGNED_TX 必须不存在,PSBT_GLOBAL_VERSION 必须存在且设为2。
被移除的交易原先承载的内容,被分散到十二个新字段中。其中五个是全局字段:交易版本(0x02)、备用锁定时间(0x03)、输入数量(0x04)、输出数量(0x05)和可修改标志字节(0x06)。五个位于每个输入上:32字节的前序 txid(0x0e)、被花费输出的索引(0x0f)、序列号(0x10),以及两种必需的锁定时间,一种基于时间戳,大于或等于500000000(0x11),另一种基于区块高度,小于该值且大于零(0x12)。输出新增两个字段:以聪计的金额,为64位有符号小端整数(0x03),以及脚本(0x04)。
真正起作用的是可修改标志字节。位0表示仍可添加或移除输入,位1对输出表示同样的含义,位2则记录某个签名已使用 SIGHASH_SINGLE 作出承诺,因此其输入与输出的配对必须保留。签名方必须在签名过程中收紧这些位:未使用 SIGHASH_ANYONECANPAY 的签名会清除位0,未使用 SIGHASH_NONE 的签名会清除位1。继续编辑的权限会随着签名的加入而自行失效,而不是依赖下一位持有者的自觉。
BIP-370解决了缺失的交易留下的两个问题。锁定时间取各输入一致认可的最大值,若无则回退到全局字段,全局字段也不存在时则为0,且基于区块高度的要求在并列时优先。交易标识则取将所有序列号强制设为0后,由各字段组装得到的 txid,因为序列号之后仍可被编辑。
在哪里会遇到它
PSBT 第2版引入了 BIP-174中没有对应角色的构建者(Constructor)。创建者(Creator)打开文件时包含0个输入和0个输出,然后将其传递下去;构建者在检查可修改标志之后添加它们。预期会有他人贡献的创建者,还必须把交易版本至少设为2,这样依赖该版本的功能,例如 OP_CHECKSEQUENCEVERIFY,仍然可用。
第2版沿用了 BIP-174的序列化方式,因此文件从外部看起来相同,这种区分是有意为之:BIP 中的24个无效测试向量里,有13个是普通的第0版文件,因某个字段位置不当或版本号错误而被拒绝。转换比较容易,因为第2版文件可以根据自身字段重建为第0版文件。参考实现是 Bitcoin Core 的 pull request 21283,BIP 头部将状态记录为 Deployed。
在本站的41篇钱包评测中,有两篇提到 PSBT,分别是 Sparrow(评分4.7)和 BlueWallet(4.2),两者都没有指明版本。除非软件另有说明,请按第0版对待,并在让不熟悉的工具处理其余资金之前,先用小额金额测试。
PSBT 第2版 vs 交易版本号
PSBT 第2版是文件格式的编号,而交易版本号是文件内部正在组装的交易的编号。两者位于同一个全局映射中,BIP-370明确指出它们不是同一个字段。PSBT_GLOBAL_VERSION 在每个第2版文件中都是2;PSBT_GLOBAL_TX_VERSION 是所构建交易的有符号32位整数,当创建者预期会有他人贡献时,BIP-370要求其至少为2,这正是两者容易混淆的原因。更改前者,较旧的解析器会拒绝该文件。更改后者,则会改变判定该笔花费所依据的共识规则。