区块链/等级 IV · 深入协议/4.2 升级/课程 3
部分签名交易(PSBT)
让陌生人也能核实设备签署内容的容器
材料支持 PSBT 的硬件钱包可使用“decodepsbt”命令的 Bitcoin Core 软件物理隔离的计算机或设备
好奇
- 为什么未完成的交易需要比已完成交易更多的数据?
- 为什么过去每款硬件钱包都需要自己的一套未签名交易格式?
- 在初始模板已经创建之后,用户如何添加新的输出内容?
探索
- 标准的原始交易是一种紧凑的最终产物,可直接广播。部分签名比特币交易(PSBT)则不同,它由 Andrew Chow 于2017年在 BIP174 中定义:它是一个容器,装有一笔未完成的交易,以及日后完成该交易所需的全部元数据。它有三种状态:已完整构建但未签名;部分签名,即部分输入已签名、其余待签;或已完全签名、可提取为原始十六进制交易。这种格式使不受信任的程序能够生成模板,再由受信任的设备进行验证,而该设备无需联网。
- PSBT 工作流定义了六种角色:创建者(Creator)、更新者(Updater)、签名者(Signer)、组合者(Combiner)、最终确定者(Finalizer)和提取者(Extractor)(版本2增加了第七种角色:构造者(Constructor))。创建者构建交易后,更新者会附上正在花费的先前输出、它们的脚本以及密钥的派生路径,这样签名者就能准确核实自己所批准的内容,包括金额和手续费。明确包含这些元数据会让文件比标准序列化格式大得多,但这必不可少,因为它让硬件钱包无需连接可能已被入侵或运行恶意软件的联网节点,就能验证交易结构。
- 互操作性是推动 PSBT 发展的主要动力。在该标准出现之前,不同的钱包软件使用彼此不兼容的方式在热钱包与冷存储设备之间传输数据,从而导致用户被锁定在特定厂商的系统中。BIP174 通过建立一种通用格式解决了这一问题;如今,像 Sparrow 这样的协调工具可以通过 USB、SD 卡或二维码,将相同的 PSBT 传递给不同制造商生产的签名设备。这样一来,跨厂商的多签功能便得以实现:每个签名者只需将自己的签名添加到文件中,而私钥始终不会离开其设备。
- PSBT 版本0有一个僵硬的结构限制:一旦创建,全局未签名交易就固定不变。版本0将完整的未签名交易存放在一个全局字段中,因此创建之后无法再添加输入或输出。这种僵硬意味着,如果有人开始构建一笔复杂的多方交易,随后发现需要额外的找零输出,就不得不放弃整个流程,用新模板从头开始。
- BIP370 引入了 PSBT 版本2来解决这一不可变性问题。在版本2中,某个输入或输出的所有信息都集中在该输入或输出自己的字段中,而不是分散在局部数据和全局数据之间。只要 PSBT 的“可修改”标志允许,参与者就可以在创建后添加输入或输出。它确保查看单个输入时,与之相关的每一项数据都集中在那里,从而简化了协作流程,便于硬件设备验证,并降低了状态不同步的风险。
- 其实际应用范围从硬件钱包签名,到 payjoin、coinjoin 等需要多方协同处理的交易方式;在这些交易中,参与者会互相传递 PSBT,直到所有人都完成签名。对于普通用户而言,这意味着他们可以在手机上创建交易,再连接硬件钱包在离线状态下进行安全签名,之后提取最终的原始交易数据并发送出去——这样每个设备都能清楚地看到自己需要签名的内容。
关键事实
- BIP174定义了PSBT的0版本,该版本要求存在一个全局性的、未签名的交易字段,且该字段在创建后不可修改。
- BIP370定义了版本2(PSBTv2),该版本允许在创建后通过将数据整合到特定字段中来添加输入和输出。
- PSBT 的结构刻意比标准序列化格式更为冗余,因为它需要存储大量用于供签名设备进行验证的元数据。
- 原始工作流包含六种角色:创建者、更新者、签名者、组合者、最终确定者和提取者。
- PSBT 有助于实现各类钱包软件与硬件签名设备之间的互操作性。
- Sparrow等协调器与Coldcard等签名设备通过文件或二维码来交换PSBT。
练习 九、六、三、一
9收集列出比特币交易从创建到最终广播的整个生命周期中涉及的9种不同角色或状态。
6归类将这9项分为6类,分类依据是它们涉及添加数据、验证结构、施加密码学签名、合并各方贡献、完成格式,还是广播结果。
3提炼将这6组归纳为任何交易管理系统为确保安全性和互操作性而必须执行的3项核心功能。
1凝结用一句话说明为什么未完成的交易比已完成的交易需要更多数据。
事实核查
日期、数字及数据均依据下方列出的已发表资料进行核实。