自 Bitcoin Core 0.17 起,存在一个用于部分签名比特币交易(PSBT,如 中所规定)的 RPC 接口。本文档描述了通过使用 PSBT 生成签名交易的总体工作流程,以及典型场景中使用的特定 RPC 命令。
PSBT 概述
PSBT 是一种比特币交易的交换格式,这些交易尚未完全签名,但包含了相关的元数据,以帮助实体完成签名。其旨在简化多个参与方需要合作生成交易的工作流程。示例包括硬件钱包、多重签名设置和 交易。
总体工作流程
总的来说,构造一个完全签名的比特币交易需要经过以下步骤:
- 创建者(Creator) 提议创建一个特定的交易。他们构造一个 PSBT,其中包含某些输入和输出,但没有额外的元数据。
- 对于每个输入,更新者(Updater) 将关于交易正在花费的 UTXO 的信息添加到 PSBT 中。他们还会添加关于 PSBT 的每个输入(以及可能的输出)中涉及的脚本和公钥的信息。
- 签名者(Signers) 检查交易及其元数据,以决定是否同意该交易。他们可以使用来自 UTXO 的金额信息来评估所涉及的价值和费用。如果他们同意,他们会为他们拥有相关密钥的输入生成部分签名。
- 对于每个输入,运行 定稿者(Finalizer) 以将部分签名和可能的脚本信息转换为最终的 scriptSig
和/或 scriptWitness
。
- 提取器(Extractor) 从 PSBT 中生成一个有效的比特币交易(以网络格式),该 PSBT 的所有输入都已定稿。
通常,上述每个角色(不包括创建者和提取器)都会简单地向特定的 PSBT 添加越来越多的数据,直到所有输入都完全签名。在一个简单的工作流程中,他们都必须按顺序操作,将 PSBT 从一个传递到下一个,直到提取器可以将其转换为真正的交易。为了允许并行操作,可以使用 组合器(Combiners),它可以合并来自同一未签名交易的不同 PSBT 的元数据。
上面以粗体显示的名称是在 BIP174 中定义的角色名称。它们有助于理解底层步骤,但在实践中,软件和硬件实现通常会同时实现多个角色。
Bitcoin Core 中的 PSBT
RPCs
converttopsbt (创建者)
是一个实用工具 RPC,可将未签名的原始交易转换为 PSBT 格式。它忽略现有的签名。createpsbt (创建者)
是一个实用工具 RPC,它接受输入和输出的列表,并将它们转换为没有额外信息的 PSBT。它等同于调用createrawtransaction
,然后调用converttopsbt
。walletcreatefundedpsbt (创建者,更新者)
是一个钱包 RPC,它创建一个具有指定输入和输出的 PSBT,向其添加额外的输入和更改以使其平衡,并添加相关的元数据。特别是,对于钱包知道的输入(计入其正常或仅观察余额),将添加 UTXO 信息。对于存在 UTXO 信息的输出和输入,将添加钱包知道的密钥和脚本信息。它等同于运行createrawtransaction
,然后运行fundrawtransaction
和converttopsbt
。walletprocesspsbt (更新者,签名者,定稿者)
是一个钱包 RPC,它接受一个 PSBT 作为输入,将 UTXO、密钥和脚本数据添加到缺少它的输入和输出,并可选地对输入进行签名。在可能的情况下,它还会最终确定部分签名。descriptorprocesspsbt (更新者,签名者,定稿者)
是一个节点 RPC,它接受一个 PSBT 和一个描述符列表作为输入。它使用 UTXO 集和内存池中可用的信息更新 SegWit 输入,并使用提供的描述符对输入进行签名。在可能的情况下,它还会最终确定部分签名。utxoupdatepsbt (更新者)
是一个节点 RPC,它接受一个 PSBT 并更新它,以包括 UTXO 集中可用的信息(仅适用于 SegWit 输入)。finalizepsbt (定稿者,提取器)
是一个实用工具 RPC,用于最终确定任何部分签名,如果所有输入都已最终确定,则将结果转换为完全签名的交易,该交易可以使用sendrawtransaction
进行广播。combinepsbt (组合器)
是一个实用工具 RPC,它实现了一个组合器。它可以在工作流程中的任何时间点使用,以合并添加到同一 PSBT 的不同版本的信息。特别是,它对于合并多个更新者或签名者的输出非常有用。joinpsbts
(创建者) 是一个实用工具 RPC,它将多个 PSBT 连接在一起,连接输入和输出。这可以用于构建 CoinJoin 交易。decodepsbt
是一个诊断实用工具 RPC,它将以人类可读的形式显示 PSBT 中的所有信息,如果已知,还会计算其最终费用。analyzepsbt
是一个实用工具 RPC,它检查 PSBT 并报告其输入的状态,工作流程中的下一步(如果已知),并且如果可能,计算结果交易的费用并估计最终权重和 费率(feerate)。
工作流程
具有多个 Bitcoin Core 实例的多重签名。