Bupt3分享14-拆解比特币psbt

Hacker Dōjo Workshop
资助金额:100 USDT
分享者:北邮在读硕士 Syshems
本项目由Hacker Dōjo资助,文章转载请联系
Telegram: @DoraDojo0
WeChat: @HackerDojo0

部分签名的比特币交易 PSBT(Partially signed bitcoin transactions)是尚未完全签好名的比特币交易的传输格式,它携带有相关的元数据,可帮助人们签名交易。它的设计初衷是简化多个参与者合作生成一笔交易的流程。这样的场景包括硬件钱包、多签名钱包和 CoinJoin 交易。本研究旨在分析 PSBT 的实现方案,拆解交易的发起流程,以及基于 PSBT 技术探索去中心化 NFT Marketplace 的可能性。

一、什么是 PSBT

前段时间 Yuga Labs 的拍卖 BTC NFT 被 Ordinals 创始人怼,原因是拍卖流程是很中心化的,拍卖人相当于直接把 token 发到 Yuga Labs 的账户下,开了一个很不好的头。我看到社区讨论 PSBT 技术完全可以解决去中心化的信任问题,并且可以实现后续 NFT 的点对点去中心化交易。今天我们来看一下这个 PSBT 技术是什么,它是怎么协调去中心化的多方的信任的。

1、PSBT

部分签名的比特币交易(PSBT)是一种用于构建和处理比特币交易的描述格式,它提供了一种安全且灵活的方式,使多个参与方能够协同工作,构建和签名比特币交易,而无需将私钥暴露给其他人。PSBT 标准定义了用来传递比特币交易的一种精确格式,可以携带一笔交易的元数据,并使它们可以在多个设备之间传递让签名者更容易签名和验证这笔交易,以便不同的参与者可以对其进行签名。

2、流程概述

构建一笔完整签名的比特币交易比较复杂,我们可以简化角色为:创建者、签名者、协调员。我们以 Alice、Bob 和 Charlie 之间的一笔交易为例。Alice、Bob 和 Charlie 有一笔 UTXO 存在一个 2/3 的多签中,他们想把这笔钱取出并均分为 3 份,他们三人必须签署同一个交易去花费这个UTXO。

假设他们互不信任,他们需要怎么做才能保证资金安全呢?

首先,Alice 作为创建者发起一个 PSBT 交易,多签的 UTXO 作为输入,输出是三人各自的钱包地址。由于 PSBT 保证了除此交易外的其他交易都无法调用任何一人的签名,所以 Alice 可以签完名后发给 Bob。

同样,Bob 检查 PSBT 后,如果觉得没问题也进行签名;签名后给到 Charlie 进行签名和交易发布。Charlie 也进行同样的操作。

Partially signed,其实就是解决了每个人只需要检查跟自己相关的那部分交易,只要和自己相关的交易没问题就能保证交易上链后不会有问题。为了上述流程的高效,之后引入了「协调员」这个角色。协调员作为一个中心化聚合节点,分别给 A、B、C 发送交易三个同样的交易让他们签名确认,随后将三个签名后的交易合并后上链,提高了 PSBT 流程的效率。

举个例子,五位参与者要建构一笔 CoinJoin 交易,他们各自给一位协调员发送一条消息,包含自己希望放入这笔 CoinJoin 中的 UTXO。每个参与者也都提供接收比特币的地址。

协调员实用所有的 UTXO 作为输入,建构出一笔交易,并创建相应的输出,将相同数量的比特币发到各参与者的接收地址。

下一步,协调员将这笔交易转化成一个部分签名的比特币交易,然后将这个 PSBT 发送给每一位参与者。参与者们各自为自己收到的 PSBT 加入自己的签名,然后将签过名的 PSBT 发回给协调员,协调员会将这 5 个 PSBT 合并起来、形成最终的交易。最终,协调员得到了一个完整签名的交易,每个参与者的输入都有相应的签名。

这个过程是完全免信任的:虽然每个成员都依赖于协调员来创建和敲定 PSBT,无论协调员还是参与者,没有人能从其他参与中手上偷取资金。

二、PSBT 实现方案

1、细节流程

  • 一位创建者提出需要创建的某一笔交易。他们构造一个 PSBT,包含特定的输入和输出,但不包含其它元数据。
  • 对每个输入,都由一位更新者为该 PSBT 加入关于被花费的 UTXO 的信息。他们也在该 PSBT 的每一个输入(可能的时候包括输出)中加入关于脚本和公钥的信息。
  • 签名者检查交易及其元数据,来决定是否同意该交易。他们可以利用来自 UTXO 的数额信息,知晓相关的价值和手续费。如果他们同意,就为自己具有相关公钥的输入生成一个「部分签名」。
  • 为每个输入运行一个定稿器,将「部分签名和可能的脚本信息转化为一个最终的 scriptSig (脚本签名)以及/或者 scriptWitness (脚本见证数据)。
  • 抽取器从各输入已经定稿的 PSBT 中产生一笔有效的比特币交易(变成可在网络中广播的形式)。

一般来说,上述的每一个流程(除了创建者和抽取器)都会为处理中的 PSBT 加入越来越多的数据,直至所有输入都被签名。在一个粗疏的工作流中,他们必须按照顺序、一个接一个地参与,直到抽取器将 PSBT 转化为一笔真实的交易。为了允许「并行」操作,可以增加一个合并者,由 TA 来为同一笔未签名的交易合并来自不同 PSBT 的元数据。

2、具体实现(以 Bitcoin Core 为例

Alice、Bob 和 Carol 希望创建一个 2-of-3 的多签名地址。他们都使用 Bitcoin Core。我们假设他们的钱包中只包含多签名资金。与此同时他们各有一个个人钱包,这可以通过 Bitcoin Core 的多钱包特性来实现 —— 可能因此在使用命令行工具 bitcoin-cli 时需要使用 rpcwallet=name 来指明调用哪个钱包。

2.1 创建多签地址

  • **生成地址:**三人各使用 getnewaddress 来创建一个新地址;我们把这三个地址分别叫做 AaliceAbobAcarol。生成新地址是为了确保交易的隐私和安全性。
  • **生成公钥:**三人各自调用 getaddressinfo "X" ,X 就是他们各自的地址,并记录相应的公钥;我们把这几个公钥分别叫做 KaliceKbobKcarol
  • **生成多签地址:**三人可以各自运行 addmultisigaddress 2 ["Kalice","Kbob","Kcarol"] 以产生多签名脚本并告知钱包模块;这条命令所产生的多签名地址,我们叫做 Amulti 。他们可以需要手动指定相同的地址类型,以免因为不同的节点设置而建构出不同版本的地址。各自运行的原因是为了实现并行地签名同一笔交易。
  • **监测多签地址:**他们还各自运行 importaddress "Amulti" "" false ,命令钱包跟踪 Amulti 所收到的支付并作为观察钱包余额。
  • **检验地址是否正确:**其他人可以通过运行 createmultisig 2 ["Kalice","Kbob","Kcarol"] 、检查结果是否为 Amulti 来验证这个地址。同上,可能有必要指定地址类型,才能获得匹配的地址。不过,这个命令不能用来初始化交易。

2.2 PSBT使用多签地址

他们现在可以对外给出 Amulti,作为其他人可以支付的地址。当 Amulti 收到 V BTC 之后,Bob 和 Carol 想把资金全部移到 Asend,没有找零。Alice 不需要参与。

  • 其中一人 —— 这里假设是 Carol —— 初始化创建流程。她运行 walletcreatefundedpsbt [] {"Asend":V} 0 {"subtractFeeFromOutputs":[0], "includeWatching":true} 。我们把这个命令所返回的 PSBT 叫做 PP 不包含任何签名。
  • Carol 需要自己签名这笔交易。为此,她运行 walletprocesspsbt "P" ,然后将结果 P2 (也是一个 PSBT)交给 Bob。
  • Bob 使用 decodepsbt "P2" 来检查这个 PSBT,确认这笔交易是否有预期的输入、有一个输出给 Asend、手续费合理。如果他也同意这笔交易,他调用 walletprocesspsbt "P2" 来签名。结果是 P3,包含了 Carol 和 Bob 的签名。
  • 现在,任何一人都可以调用 finalizepsbt "P3" ,抽取出完整签名的交易 T
  • 最后,任何人都可以使用 sendrawtransaction "T" 来广播这笔交易。

2.3 并行操作

在需要更多签名者参与的情形中,让所有者并行签名而不是按顺序处理可能会有一些好处。在我们的例子中,就会变成 Carol 分别给每个签名者传递 P 的拷贝;签名者各自调用 walletprocesspsbt "P" 来签名,最终得到各自签名的 PSBT 结构体。然后,他们将各自的 PSBT 结构体发回给 Carol(发给其他某一人也可以),由后者来运行 combinepsbt 。最后的两个步骤( finalizepsbtsendrawtransaction )保持不变。

3、PSBT 有什么用处

PSBT 给比特币社区提供了许多好处,也让此前的复杂协议得到简化,变得更容易验证。

  • 互通性。PSBT 的设计初衷是强化钱包和其它比特币软件的互通性,让交易可以更容易地在钱包和节点间传输。PSBT 在很大程度上已经成功了,它获得了所有主要的钱包供应商和节点软件的支持,也就是已经得到了行业的接受。
  • 离线签名。PSBT 格式提供了有用的元数据,可以协助冷存储设备验证即将被签名的交易相关的地址和金额。这使得从冷存储设备发起签名变得更加安全,而且 观察钱包构造交易-冷钱包签名-比特币节点广播交易 的整个过程也变得更加容易。
  • 多签名流程。因为 PSBT 让一个部分签名的比特币交易变得更容易传输和理解,多方(或者说多个设备)签名一笔交易也变得更容易、更安全,因此多签名技术也变得更容易使用。用户友好型多签名钱包将给比特币社区带来进一步的好处,包括更好的隐私性、安全性和私钥丢失抗性。
  • 多方交易。PSBT 对想要签名同一笔交易的协作多方尤为实用。比如,CoinJoin、CoinSwapPayJoin 协议,都要求多方签名同一笔交易。PSBT 格式提供了构造交易、在多个签名者之间传输交易、组装成最终交易的方法。

三、去中心化 Marketplace 探索

当前,比特币 NFT 的一大问题就是交易门槛极高,如果不通过 Ordinals 桥接至以太坊网络,并在 OpenSea 上交易,就只能通过 OTC 的渠道进行买卖。但 OTC 最大的问题就是需要信任,目前是缺少交易信息和信任渠道的。PSBT 在比特币 NFT 发展中扮演的角色,就是在没有智能合约的情况下,实现交易的去信任化。

假设现在有一对比特币 NFT 交易者,且 NFT 卖方的公钥是双方可知的信息。在发起一笔 NFT 交易时,买方先在交易中写好自己的 UTXO 输入以及一个承接 NFT 的输出。买方在构建好交易并签名后,将其转为 PSBT 发给卖方,卖方通过中间服务商等方式接收到消息后签名,这笔比特币 NFT 交易就成交了。

上述整个过程对买卖双方而言都是完全去信任的。对于买方来说,出价、接受地址等信息已经提前构建在交易中,一旦发生改动,签名便会失效。对于卖方来说,只有自己完成签名,NFT 才会卖出,而价格则是经过自己审核衡量的。在阿剑看来,这种简单的交易结构还在很大程度上剔除了 OpenSea、Blur 这类 NFT 交易中间服务商的抽成空间,「只要卖方的消息渠道通畅,就完全不需要中介,因为买方签好名的交易直接就是出价」。

现如今,PSBT 已经被广泛应用于多方签名、硬件钱包、CoinJoin 交易、闪电网络等领域。以下是一些 PSBT 的应用案例:

  1. 多方签名:PSBT 可以用于多方签名的比特币交易,以确保交易的安全性和可靠性。
  2. 硬件钱包:PSBT 可以用于硬件钱包中,以便在不暴露私钥的情况下,构建和签名比特币交易。例如用公开钱包构建交易,只用硬件钱包签署 PSBT 。
  3. CoinJoin 交易:PSBT 可以用于 CoinJoin 交易中,以便将多个交易合并为一个交易,从而提高交易的隐私性。
  4. 闪电网络:在创建支付通道时,需要使用 PSBT 来构建和签名比特币交易,以便将比特币存入支付通道中;在使用支付通道进行交易时,需要使用多重签名技术和 PSBT 来签名交易

参考