本文將分享 CertiK 對 PSBT 的深入研究和洞察,包括其組件、在比特幣 DeFi 中的應用以及不當使用可能帶來的安全風險。我們旨在提供安全實施 PSBT 的最佳實踐,幫助開發者和 Web3 成員更了解其安全性,為加強比特幣生態系統的安全性貢獻力量。

作者:Certik

近年来,部分签名比特币交易(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 的出現是交易管理領域的重要創新。 PSBT 的定義來自比特幣改進提案 174(BIP-174 [5]),其透過標準化流程為比特幣交易的創建、共享和簽名提供了規範,尤其適用於多方或多設備的場景。

在 2017 年 PSBT 推出之前,協調需要多個簽章或涉及多方的複雜交易的過程困難又有安全風險。錢包軟體通常採用專有格式來處理部分簽名交易,這導致了不同錢包和平台之間的不相容問題。而 BIP-174 提案為 PSBT 制定通用格式來解決這些問題。此標準化使得不同的錢包軟體和硬體設備之間能夠無縫兼容通信,從而促進了多方交易的協作創建和簽名過程。

隨著 2023 年 Ordinal 協議 [6]的出現,PSBT 再次成為焦點。 Ordinal 協定為單一聰(satoshi)指派序號,並允許使用者將額外資料附加到聰上。這項協議使用戶能夠透過在比特幣區塊鏈上為聰刻寫數據,直接創建非同質化代幣(NFT)及其他獨特的數位資產(如 BRC-20 [7 ])。管理這些資產需要精確控制交易的入帳和出賬,以及擁有處理複雜腳本和簽名的能力,而 PSBT 都能滿足這些需求。因此,PSBT 技術在去年迎來了復興,並在比特幣生態中的多個領域中廣泛應用。

1. PSBT 工作流程解析

PSBT 以標準化且安全的方式支援比特幣交易的創建、共享和簽名,尤其適用於多方參與的場景。

PSBT 工作流程的主要步驟:

1. 發起者透過選擇必要的輸入和輸出來建立未簽署的交易,並將其轉換為 PSBT 格式。這份 PSBT 包含所有必要的交易細節,但不含任何簽名,隨後安全地分發給相關各方。

2. 每位參與者獨立審核 PSBT,以驗證輸入、輸出、金額和地址是否符合其預期,確保交易細節的準確性和有效性。

3. 隨後,參與者在不暴露私鑰的前提下,為他們控制的輸入添加部分簽名。簽名完成後,他們可以驗證其他人添加的部分簽名,以確保其有效性和準確性。此協作過程可能需要多次簽名貢獻與驗證的迭代,直到添加了所有所需的簽名為止。

4. PSBT 回傳給交易的發起者或協調者,他們會檢查是否已收集到所有必要的簽名。

5. 一旦所有簽名確認收集並驗證後,PSBT 將透過替換部分簽名和腳本為最終輸入腳本(scriptSig 和 scriptWitness)來完成最終化,隨後產生完整簽名的交易,並準備進行廣播。

6. 最終完成的交易被廣播到比特幣網絡,等待確認和執行。一旦交易被確認並包含在區塊鏈中,比特幣帳本將更新以記錄交易的輸入和輸出。

以下圖表可以幫助更清楚地理解上述工作流程:

PSBT CoinJoin 工作流程

2. PSBT 與多簽交易的關鍵差異

儘管 PSBT 和多簽交易都涉及多個簽名,但它們在比特幣網路中有著不同的用途。多簽交易需要多個私鑰來授權一筆交易,在資金可以花費之前,必須滿足指定數量的簽名要求。而另一方面,PSBT 則允許多個參與者合作建立和簽署交易,無論交易本身是否需要多個簽名。

3. PSBT 組件

理解 PSBT 的組件結構對於有效使用它並確保交易安全至關重要。以下是其關鍵組件的詳細說明。

1. 輸入

PSBT 中的輸入引用了用於資助交易的未花費交易輸出(UTXO)。

  • 前一個交易雜湊和索引:每個輸入引用了一個特定的 UTXO,該 UTXO 透過 txid(前一個交易的雜湊)和 vout(在引用交易中的輸出索引)來識別。

範例輸入:

  • 序號:表示輸入的序列,用於相對時間鎖定(Relative Timelock),常見於高階腳本場景。
  • 非見證未消費的交易輸出(Non-Witness UTXO):此元件包含完整的上一筆交易資料。需要用於非隔離見證(non-SegWit)輸出,以便根據整個交易驗證輸入。
  • 見證未消費交易輸出(Witness UTXO):對於隔離見證(SegWit)交易,僅包含正在花費的輸出。其比非見證 UTXO 更有效率,但卻提供更少的資訊。
  • 可選組件:
    • 付款見證腳本哈希 (P2WSH):包含花費 SegWit 輸出所需的見證腳本。
    • 支付腳本雜湊 (P2SH):包含花費 P2SH 輸出所需的贖回腳本。
    • 簽章哈希類型 (Sighash):定義簽章哈希類型,指定交易中被簽章的範圍。

2. 輸出

輸出定義了資金的發送目標,以 UTXO 的形式存在,通常用於找零或退款。

  • 腳本公鑰(ScriptPubKey):是用於指定花費輸出的條件的鎖定腳本。
  • 金額:以聰為單位,表示輸出的價值。

3. 交易元數據

  • 版本:指定交易格式的版本;在 BIP-0370 [8]之後,「PSBT 版本 2」成為標準。
  • 鎖定時間(Locktime):表示交易可納入區塊的最早時間或區塊高度。

4. 簽名

  • 部分簽名:每個簽署者根據其私鑰添加自己的簽名。
  • 公鑰標識:將簽名與正確的公鑰關聯以進行驗證。

5. 最終化數據

  • 解鎖腳本(ScriptSig)和見證資料:滿足腳本公鑰(ScriptPubKey)中指定條件的最終腳本。

4. SBT 工具

多種工具和庫支援 PSBT 的創建、操作和簽名,促進了其在不同平台上的應用。

Bitcoin Core 指令

作為比特幣協議的參考實現,Bitcoin Core 提供了多個用於處理 PSBT 的命令:

  • converttopsbt:將原始交易轉換為 PSBT 格式。
  • createpsbt:根據提供的輸入和輸出產生 PSBT,而無須存取錢包。
  • walletcreatefundedpsbt:使用錢包中的 UTXO 為交易提供資金,自動選擇輸入併計算費用,產生 PSBT。
  • decodepsbt:傳回一個 JSON 對象,用來表示序列化的 Base64 編碼 PSBT。

PSBT 在比特幣生態系統中的應用場景

一些协议例如 Ordinal、Runes 和 BRC-20 代币等的兴起显著扩展了比特币的功能,使得代币资产和 NFT 可以直接在比特币链上实现。PSBT 在这些发展中发挥了关键作用,通过允许对交易输入和输出进行精确控制,这对于安全地管理和转移这些独特的数字资产至关重要。PSBT 还帮助改善了钱包签名过程,特别是在硬件钱包和安全签名设备的集成方面。

比特幣 DeFi 的關注度成長也加速了 PSBT 的使用。開發者利用 PSBT 建構去中心化交易所、atomic 交換協議和協作交易平台,確保這些平台的安全性和高效性。透過將涉及多方的交易創建、共享和簽名流程標準化,PSBT 促進了以前難以在比特幣網路上安全實現的複雜財務操作。

1. Ordinal 市場中的訂單簿交易所

PSBT 被 Ordinal 市場用來推進 Ordinal NFT 的交易。買家或賣家可以使用 PSBT 建立訂單交易。交易創建者將 PSBT 檔案發送給其他參與者。在所有參與者簽署 PSBT 文件後,即可被最終確認並廣播到比特幣網路。

為什麼 PSBT 在 Ordinal 市場中不可或缺?

Ordinal 是一種刻在單一聰上獨特的數位資產,需要精確控制交易輸入和輸出以確保其完整性。 PSBT 使買家和賣家等多方能夠協作建立和簽署交易,同時避免暴露私鑰或降低安全性。

其他選項(如原始交易或自訂協議)並不適用,因為它們缺乏必要的功能和安全保證。原始交易不支援部分簽名,這意味著整個交易的構建完全由單一交易創建者負責。此方法需要用戶手動驗證交易,增加了出錯和安全漏洞的風險。而自訂協議則可能強迫用戶使用市場提供的特定錢包。這種要求限制了用戶使用其首選錢包的自由性,同時減少了互通性,因為這些市場專屬錢包可能與其他平台或服務不相容​​。此外,一些市場可能會使用中心化託管服務來促進交易,但這引入了第三方風險,因為用戶必須授信託管代理能夠妥善處理資金。

以下是一個典型用於市場交易的 PSBT 工作流程案例。以下以 msigner [12]為例,展示了一個賣單的創建過程,具體步驟如下:

1. 賣家使用 SIGHASH_SINGLE|ANYONECANPAY 簽署 PSBTPSBT 輸入 [13]

PSBT 輸出 [14]

2. 買家使用 SIGHASH_DEFAULT 簽署完整的 PSBT,並根據可用的全部資訊完成操作。買家應選擇支付 UTXO,並避免包含銘文的支出 UTXO。

輸入 [15]

輸出 [16]

3. 在 PSBT 工作流程中擔任合併角色的交易所執行以下操作:

  • 驗證賣家的簽名
  • 驗證買家的簽名
  • 合併賣家和買家的簽名
  • 完成交易並運行內存池接受測試
  • 廣播交易

2.協作交易

PSBT 透過標準化簽名流程,簡化多簽設定中的工作流程,使多個參與者能夠貢獻輸入與輸出達成協議。

  • 聯合籌資是一種多個參與者共同集資以實現集體支付的過程。這在共享投資、聯合購買或團體捐贈等場景中尤其有用。透過使用 PSBT,這種無須信任的協作機制得以實現。使用者使用所有參與者的 UTXO 作為輸入來建立 PSBT,然後每個參與者審核交易內容,確保交易符合其意圖。在確認無誤後,他們使用自己的私鑰對交易進行簽署。只有當所有參與者完成簽名後,PSBT 才能被最終確認並成為可以廣播的有效交易。
  • UTXO 共享管理是指多個參與者對 UTXO 的協作控制和管理,這通常用於企業或組織環境中。 PSBT 透過引入資金在多方審批下進行共同管理,從而增強了安全性和監督能力。

3. 哈希時間鎖合約(HTLC)與跨鏈兌換

PSBT 對於實現原子性兌換和不同區塊鏈之間的無須信任的交易所至關重要。透過建構僅在特定條件下有效的交易,PSBT 能夠在無須中介的情況下促成跨鏈交換。在這過程中,通常會結合使用 PSBT 和雜湊時間鎖合約(HTLC)來確保兌換的原子性。

HTLC 利用加密雜湊函數和基於時間的條件來保證交易的公平性。如果在預定時間內未滿足必要條件,交易將自動取消。這項機制確保了雙方要麼完成兌換交易,要麼恢復到原始狀態,無任何損失。將 PSBT 與 HTLC 結合,用戶可以在比特幣與其他區塊鏈之間進行安全的跨鏈兌換,實現無須依賴中心化平台或可信任第三方的資產交換。

4. 交易批次與費用優化

PSBT 的獨特功能允許批次交易中的每個輸入和輸出單獨簽署。在交易批次中使用 PSBT 有助於降低交易費用。透過將多個交易合併,用戶不僅節省了費用,還能緩解比特幣網路的擁塞問題。

5. 離線簽章與硬體錢包集成

PSBT 透過標準化未完成交易的表示方式,為離線簽名提供了更安全且高效的工作流程。在引入 PSBT 之前,使用者需要手動處理原始交易資料並自行驗證輸入和輸出。在多方交易中,通常由一方參與者組裝完整交易,其他參與者再進行驗證。這種方法依賴可信任的第三方,或要求用戶仔細驗證交易。借助 PSBT,每方都可以獨立添加自己的輸入和輸出,並驗證所有元件,而無須聯網。這使簽名和驗證過程保持離線狀態,對硬體錢包來說是一項重要的安全優勢。此外,標準化的 PSBT 格式確保了與各種硬體錢包的兼容性,即使是隔離網路的設備,也能輕鬆解析並簽署交易。

安全問題與常見誤用

儘管 PSBT 有許多優勢,但對於急於推出新型比特幣 DeFi 解決方案的新手來說可能並不熟悉。不當使用可能會導致嚴重的安全漏洞,從而引發資料外洩和資金損失。

我們將透過以下的實際案例分析誤用 PSBT 的場景。這些例子旨在為開發者提供關鍵見解,幫助其保護資產安全並確保比特幣 DeFi 生態系統中交易的完整性。

1. 錯誤使用 Sighash 標誌

Sighash 標誌決定了一筆交易在簽名後哪些部分不可更改。不正確地使用 Sighash 標誌可能導致交易容易被駭客竄改。以下是不同 Sighash 標誌及其影響的解釋:

  • SIGHASH_ALL (0x01):對所有輸入和輸出進行簽署;提供最高的安全性,防止任何修改。
  • SIGHASH_NONE (0x02):對所有輸入簽名,但不簽署任何輸出;允許更改輸出。
  • SIGHASH_SINGLE (0x03):對所有輸入和一個對應的輸出簽章;如果輸出順序被重新排列,風險較高。
  • SIGHASH_ANYONECANPAY (0x80):修改上述標誌,使其僅對目前輸入簽名;允許添加其他輸入。

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_SINGLE 且未確保輸出索引與輸入索引匹配,則可能會使攻擊者在部分簽章後竄改輸出。
  • 重播攻擊:攻擊者可能會在不同的上下文或時間內重新提交有效的 PSBT,透過利用不當的 SIGHASH 或交易缺乏唯一性進行攻擊。

安全使用 SigHash 標誌的最佳實務:

  • 預設使用 SIGHASH_ALL:確保在簽署後,所有交易細節都不可更改。
  • 避免複雜的 Sighash 組合:除非確有必要並完全理解其用途,否則避免將 SIGHASH_ANYONECANPAY 與其他 Sighash 標誌組合使用。
  • 徹底驗證:在簽名前,請核實所有交易細節,包括輸入、輸出和腳本,以確保交易的完整性和安全性。

2. 不正確的 UTXO 選擇策略

高效的 UTXO 選擇對 PSBT 交易的安全性和效率至關重要。不當的 UTXO 選擇可能導致各種問題,例如,暴露用戶隱私風險,不必要地增加交易費用和潛在地導致交易失敗。

在建立交易時,錢包會選擇 UTXO 來為交易輸出和費用提供資金。而這些 UTXO 選擇策略可能產生重要影響:

  • 隱私問題:合併來自不同位址的 UTXO 可能會將這些位址關聯起來,降低使用者匿名性。
  • 費用優化:選擇較小的 UTXO 可能需要包含更多的輸入,增加交易大小和費用。
  • 粉尘输入(Dust Inputs):包含非常小的 UTXO(称为 dust)会增加交易大小,却不能显著增加价值,从而导致交易效率低下。

優化 UTXO 選擇策略的最佳實踐

為降低因 UTXO 的不當選擇所帶來的風險,可採用以下最佳實務:

  • 最佳化 UTXO 管理:優先使用較大的 UTXO 來盡量減少輸入數量,從而降低交易大小和費用。採用能夠自動平衡隱私和費用效率的演算法。
  • 注意 dust 限制:確保找零輸出高於 dust 限制,以便在未來交易中保持其有效性。

3. 意外資產焚毀

要防止意外遺失或燒毀,必須妥善處理 Ordinal 和其他代幣化資產。 Ordinal、Runes、ARC-20 等協議透過將資料與單一聰關聯,可以直接在比特幣鏈上展示非同質化代幣(NFT)和其他數位資產。在 PSBT 處理中對這些資產管理不當可能導致不可逆的損失。

防止基於 Ordinal 資產焚化的最佳實踐

  • UTXO 管理:避免將 Ordinal 與常規 UTXO 混合。將包含 Ordinal 的 UTXO 與常規資金分開管理。對每個 Ordinal 資產使用單獨的程式碼邏輯。
  • 謹慎處理 dust 限制:低於最小輸出值(通常為標準 P2PKH 輸出的 546 satoshi)的輸出被認為是不經濟的,可能會被網路拒絕。開發者應確保包含 Ordinal 的輸出高於 dust 限制,以保持其有效性和可支出性。如果 Ordinal 被發現包含在低於 dust 限制的輸出中,它可能會被 “焚毀”,因為它無法被花費或可能被節點忽略。
  • 明確定義輸出:確保 Ordinal 被指派到特定的輸出中,而不會意外地包含在找零輸出中。

使用者的 UTXO 管理策略

  • 為不同的 Ordinal 資產使用專用錢包:為 Ordinal 資產使用獨立的錢包,以防止其與常規交易混合。透過將 Ordinal 資產隔離在專用錢包中,可以降低其與常規 UTXO 混合的風險。
  • 標記與追蹤:詳細記錄包含 Ordinal 的 UTXO,包括交易 ID、位址和相關元數據,以便於管理和追蹤。
  • 簽名前的驗證:在為 PSBT 簽署前,重複檢查所有交易輸出並確保 Ordinal 資產被正確分配。

PSBT 安全檢查清單

為了在審計過程中系統地識別 PSBT 實現中的潛在安全問題,我們基於以往審計 PSBT 專案的經驗,為開發者制定了一份全面的安全檢查清單作為實用指南,提供在比特幣 DeFi 專案中安全使用 PSBT 的必要見解和最佳實踐。

1.PSBT 輸入

  • 過濾 dust UTXO:排除低於 dust 限制的 UTXO,避免產生無法使用的輸出,並防止資產意外被銷毀。這對包含 Ordinal 和代幣化資產的交易尤其重要。
  • 總 UTXO 值匹配:驗證輸入值的總和是否會覆蓋輸出值和交易費用的總和,以防止資金不足的交易,這可能導致交易失敗或被網路拒絕。
  • 避免混合 Ordinal 和常規 UTXO:保持包含 Ordinal 或代幣化資產的 UTXO 與常規 UTXO 分離,防止意外轉移或資產遺失。
  • Taproot 皮夾使用 tapInternalKey:在處理 Taproot 位址時,加入 tapInternalKey 以確保正確的花費條件,並增強 Taproot 提供的隱私防護功能。
  • 制定合適的 UTXO 策略:根據具體情境選擇 UTXO,優先考慮隱私、費用優化,以及避免不必要的地址關聯等因素。
  • 檢查交易版本:在使用如 OP_CHECKSEQUENCEVERIFY 等高級腳本功能時,請確保使用交易版本 2。

2.PSBT 輸出

  • 退回多餘的聰(satoshi):設定找零輸出,將多餘的資金退回給發送者,確保沒有價值被意外遺留而未被認領。
  • 找零金額高於 dust 限制:確保找零輸出金額高於 dust 限制,使其有效且可支出,避免產生無法使用的「粉塵(dust)」輸出。

3. 費用管理

  • 精準費用估算:利用即時網路數據或 API,結合交易大小和複雜度計算準確的費用,確保交易能及時確認且不會支付過高費用。
  • 記憶體池接受性檢查:驗證最終交易是否符合網路接受標準,如標準規則和最低費用要求。

4.PSBT 簽名

預設使用 SIGHASH_ALL:預設採用 SIGHASH_ALL 標誌,提供最高等級的交易完整性,簽署所有輸入和輸出,防止未經授權的修改。

謹慎變更 Sighash:在偏離預設 Sighash 標誌前,充分了解其安全性影響。除非絕對必要且正確實現,否則避免使用諸如 SIGHASH_ANYONECANPAY 等複雜組合。

驗證部分簽名:確認每個部分簽名正確地簽署了對應的輸入。識別並處理針對相同輸入的任何重複或衝突簽名。

5. 正確完成 PSBT

  • 填寫所有字段:在完成之前,請核實所有 PSBT 必填字段,包括輸入、輸出和全域交易資料等。
  • 資訊完整性檢查:檢查 PSBT 是否缺少必要的資料(如贖回腳本、見證腳本)。
  • 鎖定 PSBT:在合併並驗證所有簽章後,最終確定 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 錢包擴充:https://unisat.io/

[3] SwapSats:https://swapsats.io/

[4] Trac 的 Tap 協定: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 |任何人都可以付款:https://twitter.com/atomicalsxyz/status/1727771786287206717

免責聲明:作為區塊鏈資訊平台,本站所發布文章僅代表作者及來賓個人觀點,與 Web3Caff 立場無關。文章內的資訊僅供參考,均不構成任何投資建議及要約,並請您遵守所在國家或地區的相關法律法規。