近年来,部分签名比特币交易(PSBT)在比特币生态系统中获得了显著关注。随着如 Ordinal 和基于铭文的资产[1]等创新的兴起,安全的多方签名和复杂交易的需求不断增加,这使得 PSBT 成为应对比特币生态不断发展中不可或缺的工具。
CertiK 致力于推动 PSBT 使用的安全性和完整性。近期,我们对 UniSat Wallet Extension[2]、SwapSats[3]和 Trac’s Tap Protocol[4]等热门项目进行了全面的审计和渗透测试,这些项目广泛使用了 PSBT 来支持其复杂的交易工作流程。通过深入分析,我们识别出与 PSBT 实现相关的漏洞,并提供了切实可行的建议以加强其安全能力。
本文将分享 CertiK 对 PSBT 的深入研究和洞察,包括其组件、在比特币 DeFi 中的应用以及不当使用可能带来的安全风险。我们旨在提供安全实施 PSBT 的最佳实践,帮助开发者和 Web3 成员更好地了解其安全性,为加强比特币生态系统的安全性贡献力量。
自比特币网络诞生以来,其不断演进以应对日益增长的安全性、效率和可扩展性需求。在这一发展过程中,PSBT 的出现是交易管理领域的一个重要创新。PSBT 的定义来源于比特币改进提案 174(BIP-174[5]),其通过标准化流程为比特币交易的创建、共享和签名提供了规范,尤其适用于多方或多设备的场景。
在 2017 年 PSBT 推出之前,协调需要多个签名或涉及多方的复杂交易的过程困难又存在安全风险。钱包软件通常采用专有格式来处理部分签名交易,这导致了不同钱包和平台之间的不兼容问题。而 BIP-174 提案为 PSBT 制定通用格式来解决这些问题。此标准化使得不同的钱包软件和硬件设备之间能够无缝兼容通信,从而促进了多方交易的协作创建和签名过程。
随着 2023 年 Ordinal 协议[6]的出现,PSBT 再次成为焦点。Ordinal 协议为单个聪(satoshi)分配序列号,并允许用户将额外数据附加到聪上。这一协议使用户能够通过在比特币区块链上为聪刻写数据,直接创建非同质化代币(NFT)及其他独特的数字资产(如 BRC-20[7])。管理这些资产需要精确控制交易的入账和出账,以及拥有处理复杂脚本和签名的能力,而 PSBT 都能满足这些需求。因此,PSBT 技术在去年迎来了复兴,并在比特币生态中的多个领域被广泛应用。
PSBT 以标准化且安全的方式支持比特币交易的创建、共享和签名,尤其适用于多方参与的场景。
PSBT 工作流程的主要步骤:
1. 发起者通过选择必要的输入和输出来构建未签名的交易,并将其转换为 PSBT 格式。这份 PSBT 包含所有必要的交易细节,但不含任何签名,随后安全地分发给相关各方。
2. 每位参与者独立审核 PSBT,以验证输入、输出、金额和地址是否符合其预期,确保交易细节的准确性和有效性。
3. 随后,参与者在不暴露私钥的前提下,为他们控制的输入添加部分签名。签名完成后,他们可以验证其他人添加的部分签名,以确保其有效性和准确性。该协作过程可能需要多次签名贡献与验证的迭代,直到添加了所有所需的签名为止。
4. PSBT 返回给交易的发起者或协调者,他们会检查是否已收集到所有必要的签名。
5. 一旦所有签名确认收集并验证后,PSBT 将通过替换部分签名和脚本为最终输入脚本(scriptSig 和 scriptWitness)来完成最终化,随后生成一份完整签名的交易,并准备进行广播。
6. 最终完成的交易被广播到比特币网络,等待确认和执行。一旦交易被确认并包含在区块链中,比特币账本将更新以记录交易的输入和输出。
以下图表可以帮助更清晰地理解上述工作流程:
PSBT CoinJoin 工作流程
尽管 PSBT 和多签交易都涉及多个签名,但它们在比特币网络中有着不同的用途。多签交易需要多个私钥来授权一笔交易,在资金可以被花费之前,必须满足指定数量的签名要求。而另一方面,PSBT 则允许多个参与方协作创建和签署交易,无论交易本身是否需要多个签名。
理解 PSBT 的组件结构对于有效使用它并确保交易安全至关重要。以下是其关键组件的详细说明。
PSBT 中的输入引用了用于资助交易的未花费交易输出(UTXO)。
前一个交易哈希和索引:每个输入引用了一个特定的 UTXO,该 UTXO 通过 txid(前一个交易的哈希)和 vout(在引用交易中的输出索引)来标识。
示例输入:
序列号:表示输入的序列,用于相对时间锁定(Relative Timelock),常见于高级脚本场景中。
非见证未消费的交易输出(Non-Witness UTXO):此组件包含完整的上一笔交易数据。需要用于非隔离见证(non-SegWit)输出,以便根据整个交易验证输入。
见证未消费交易输出(Witness UTXO):对于隔离见证(SegWit)交易,仅包含正在花费的输出。其比非见证 UTXO 更高效,但却提供更少的信息。
可选组件:
解锁脚本(ScriptSig)和见证数据:满足脚本公钥(ScriptPubKey)中指定条件的最终脚本。
多种工具和库支持 PSBT 的创建、操作和签名,促进了其在不同平台上的应用。
Bitcoin Core 命令
作为比特币协议的参考实现,Bitcoin Core 提供了多个用于处理 PSBT 的命令:
一些协议例如 Ordinal、Runes 和 BRC-20 代币等的兴起显著扩展了比特币的功能,使得代币资产和 NFT 可以直接在比特币链上实现。PSBT 在这些发展中发挥了关键作用,通过允许对交易输入和输出进行精确控制,这对于安全地管理和转移这些独特的数字资产至关重要。PSBT 还帮助改善了钱包签名过程,特别是在硬件钱包和安全签名设备的集成方面。
比特币 DeFi 的关注度增长也加速了 PSBT 的使用。开发者利用 PSBT 构建去中心化交易所、atomic 交换协议和协作交易平台,确保这些平台的安全性和高效性。通过将涉及多方的交易创建、共享和签名过程标准化,PSBT 促进了以前难以在比特币网络上安全实现的复杂金融操作。
PSBT 被 Ordinal 市场用于推进 Ordinal NFT 的交易。买家或卖家可以使用 PSBT 创建一笔订单交易。交易创建者将 PSBT 文件发送给其他参与者。在所有参与者签署 PSBT 文件后,即可被最终确认并广播到比特币网络。
为什么 PSBT 在 Ordinal 市场中不可或缺?
Ordinal 是刻在单个聪上独特的数字资产,需要对交易输入和输出进行精确控制以确保其完整性。PSBT 使买家和卖家等多方能够协作构建和签署交易,同时避免暴露私钥或降低安全性。
其他选项(如原始交易或自定义协议)并不适用,因为它们缺乏必要的功能和安全保证。原始交易不支持部分签名,这意味着整个交易的构建完全由单个交易创建者负责。此方法需要用户手动验证交易,增加了出错和安全漏洞的风险。而自定义协议则可能强迫用户使用市场提供的特定钱包。这种要求限制了用户使用其首选钱包的自由性,同时减少了互操作性,因为这些市场专属钱包可能与其他平台或服务不兼容。此外,一些市场可能会使用中心化托管服务来促进交易,但这引入了第三方风险,因为用户必须授信托管代理能够妥善处理资金。
以下是一个典型用于市场交易的 PSBT 工作流程案例。以下以 msigner[12]为例,展示了一个卖单的创建过程,具体步骤如下:
1. 卖家使用 SIGHASH_SINGLE|ANYONECANPAY 签署 PSBT
PSBT 输入[13]:
PSBT 输出[14]:
2. 买家使用 SIGHASH_DEFAULT 签署完整的 PSBT,并根据可用的全部信息完成操作。买家应选择支付 UTXO,并避免包含铭文的支出 UTXO。
输入[15]:
输出[16]:
3. 在 PSBT 工作流程中担任合并角色的交易所执行以下操作:
PSBT 通过标准化签名流程,简化多签设置中的工作流程,使多个参与方能够贡献输入与输出达成一致。
联合筹资是一种多个参与者共同集资以实现集体支付的过程。这在共享投资、联合购买或团体捐赠等场景中尤为有用。通过使用 PSBT,这种无须信任的协作机制得以实现。用户使用所有参与方的 UTXO 作为输入创建一个 PSBT,然后每个参与者审核交易内容,确保交易符合其意图。在确认无误后,他们使用自己的私钥对交易进行签名。只有当所有参与者完成签名后,PSBT 才能被最终确认并成为可以广播的有效交易。
UTXO 共享管理是指多个参与方对 UTXO 的协作控制和管理,这通常用于企业或组织环境中。PSBT 通过引入资金在多方审批下进行共同管理,从而增强了安全性和监督能力。
PSBT 对于实现原子性兑换和不同区块链之间的无须信任的交易所至关重要。通过构建仅在特定条件下有效的交易,PSBT 能够在无须中介的情况下促成跨链交换。在这一过程中,通常会结合使用 PSBT 和哈希时间锁合约(HTLC)来确保兑换的原子性。
HTLC 利用加密哈希函数和基于时间的条件来保证交易的公平性。如果在预定时间内未满足必要条件,交易将自动取消。这一机制确保了双方要么完成兑换交易,要么恢复到原始状态,无任何损失。将 PSBT 与 HTLC 相结合,用户可以在比特币与其他区块链之间进行安全的跨链兑换,实现无须依赖中心化平台或可信第三方的资产交换。
PSBT 的独特功能允许批处理交易中的每个输入和输出单独签署。在交易批处理中使用 PSBT 有助于降低交易费用。通过将多个交易合并,用户不仅节省了费用,还能缓解比特币网络的拥堵问题。
PSBT 通过标准化未完成交易的表示方式,为离线签名提供了更安全且高效的工作流程。在引入 PSBT 之前,用户需要手动处理原始交易数据并自行验证输入和输出。在多方交易中,通常由一方参与者组装完整交易,其他参与者再进行验证。这种方法依赖可信的第三方,或要求用户仔细验证交易。借助 PSBT,每方都可以独立添加自己的输入和输出,并验证所有组件,而无须联网。这使签名和验证过程保持离线状态,对硬件钱包来说是一项重要的安全优势。此外,标准化的 PSBT 格式确保了与各种硬件钱包的兼容性,即使是隔离网络的设备,也能轻松解析并签署交易。
尽管 PSBT 有诸多优势,但对于急于推出新型比特币 DeFi 解决方案的新手来说可能并不熟悉。不当使用可能会导致严重的安全漏洞,从而引发数据泄露和资金损失。
我们将通过以下的实际案例分析误用 PSBT 的场景。这些例子旨在为开发者提供关键见解,帮助其保护资产安全并确保比特币 DeFi 生态系统中交易的完整性。
Sighash 标志决定了一笔交易在签名后哪些部分不可更改。不正确地使用 Sighash 标志可能导致交易容易被黑客篡改。以下是不同 Sighash 标志及其影响的解释:
Sighash 标志误用的实际案例:Atomicals Market 事件
2023 年 11 月 15 日,Atomicals Market 发生了一起“零元购”事件。卖家在市场上挂单出售 $ATOM,但却被黑客以零成本购买。Atomicals Protocol 表示,事件的根本原因在于 Atomicals Market 使用了 SIGHASH_NONE|ANYONECANPAY 标志,导致用户资金被窃取。
SIGHASH_NONE|ANYONECANPAY 标志只对签名者的输入进行签名,可以添加其他输入,并允许修改输出。黑客可能会利用这一点,在输入签名后更改资金的去向。用户和开发者必须了解并正确实现 Sighash 标志,以避免误用导致资产损失。
在这种情况下,卖家的挂单应使用 SIGHASH_SINGLE|ANYONECANPAY[17]进行签名,以确保交易安全。
SIGHASH_NONE|ANYONECANPAY 标志表明仅对卖方的输入进行签名,而交易输出部分是可变的。如果黑客获得了卖方的签名,并将交易重新构建为输出值为零,再对其签名并广播交易,就会导致卖方的代币以零支付的方式被出售。
其他潜在攻击向量:
安全使用 SigHash 标志的最佳实践:
高效的 UTXO 选择对 PSBT 交易的安全性和效率至关重要。不当的 UTXO 选择可能导致各种问题,例如,暴露用户隐私风险,不必要地增加交易费用和潜在地导致交易失败。
在构建交易时,钱包会选择 UTXO 来为交易输出和费用提供资金。而这些 UTXO 选择策略可能产生重要影响:
为降低因 UTXO 的不当选择带来的风险,可采用以下最佳实践:
要防止意外丢失或烧毁,必须妥善处理 Ordinal 和其他代币化资产。Ordinal、Runes、ARC-20 等协议通过将数据与单个聪关联,可以直接在比特币链上展示非同质化代币(NFT)和其他数字资产。在 PSBT 处理中对这些资产管理不当可能导致不可逆的损失。
为不同的 Ordinal 资产使用专用钱包:为 Ordinal 资产使用独立的钱包,以防止其与常规交易混合。通过将 Ordinal 资产隔离在专用钱包中,可以降低其与常规 UTXO 混合的风险。
标记和追踪:详细记录包含 Ordinal 的 UTXO,包括交易 ID、地址和相关元数据,以便于管理和追踪。
签名前的验证:在为 PSBT 签名前,反复检查所有交易输出并确保 Ordinal 资产被正确分配。
为了在审计过程中系统地识别 PSBT 实现中的潜在安全问题,我们基于以往审计 PSBT 项目的经验,为开发者制定了一份全面的安全检查清单作为实用指南,提供在比特币 DeFi 项目中安全使用 PSBT 的必要见解和最佳实践。
部分签名比特币交易(PSBT)已被广泛应用于比特币生态系统,以实现对 DeFi 应用至关重要的安全、复杂且协作的交易流程。然而,不当使用 PSBT 可能导致严重的安全漏洞,包括交易的可篡改性和资产的意外损失。
CertiK 凭借对 PSBT 安全方面的丰富的技术经验和专业,帮助项目解决安全实施中的复杂挑战。通过审计服务和全面的最佳实践,我们为开发者和组织机构提供开发知识以确保 PSBT 的安全高效使用。
如果您需要对协议代码进行深入审计,或希望与经验丰富的审计师和安全专家团队进行咨询,请点击“阅读原文”或访问 CertiK.com 与我们联系。
[1] Ordinal 和基于铭文的资产: https://www.certik.com/resources/blog/ordinals-and-the-brc-20-standard-overview-and-risk-analysis
[2] UniSat Wallet Extension: https://unisat.io/
[3] SwapSats: https://swapsats.io/
[4] Trac’s Tap Protocol: https://trac.network/tap/
[5] BIP-174: https://github.com/bitcoin/bips/blob/master/bip-0174.mediawiki
[6] Ordinal 协议: https://docs.ordinals.com/overview.html
[7] BRC-20: https://www.coindesk.com/learn/brc-20-explained-how-tokens-on-bitcoin-work-and-why-they-are-controversial
[8] BIP-0370: https://github.com/bitcoin/bips/blob/master/bip-0370.mediawiki
[9] BitcoinJS: https://github.com/bitcoinjs/bitcoinjs-lib
[10] Libwally: https://github.com/ElementsProject/libwally-core
[11] BTCD: https://github.com/btcsuite/btcd
[12] msigner: https://github.com/me-foundation/msigner
[13] PSBT 输入:https://github.com/me-foundation/msigner/blob/30499e1a8b352b8e4b6007450932be1a15b92955/src/signer.ts#L70
[14] PSBT 输出:https://github.com/me-foundation/msigner/blob/30499e1a8b352b8e4b6007450932be1a15b92955/src/signer.ts#L89
[15] 输入: https://github.com/me-foundation/msigner/blob/30499e1a8b352b8e4b6007450932be1a15b92955/src/signer.ts#L416
[16] 输出: https://github.com/me-foundation/msigner/blob/30499e1a8b352b8e4b6007450932be1a15b92955/src/signer.ts#L458
[17] SIGHASH_SINGLE|ANYONECANPAY: https://twitter.com/atomicalsxyz/status/1727771786287206717
【免责声明】市场有风险,投资需谨慎。本文不构成投资建议,用户应考虑本文中的任何意见、观点或结论是否符合其特定状况。据此投资,责任自负。