Web3.0安全开發實踐:探索比特幣DeFi生態中的PSBT
近年來,部分籤名比特幣交易(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. PSBT工具
多種工具和庫支持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 籤署PSBT
PSBT輸入[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 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
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播信息之目的,不構成任何投資建議,如有侵權行為,請第一時間聯絡我們修改或刪除,多謝。
24H熱門幣種與要聞 | Michael Saylor發布數字資產框架提案;Azuki疑似即將發幣(12.23)
24 H 熱門幣種 1、CEX 熱門幣種 CEX 成交額 Top 10 及 24 小時漲跌幅: B...
CertiK
文章數量
18粉絲數
0