近日,聽說以太坊上的泰達幣(USDT)頻繁被增發。本著學習的目的在 etherscan 上審計了泰達幣的智能合約(TetherToken)源碼以及 USDT 增發相關的調用事件,本文記錄一下分析過程。
以下是 TetherToken 智能合約的 USDT 增發函數:
可以看到增發 USDT 需要 TetherToken 合約的 owner 賬戶調用 issue(uint) 增發函數進行,增發成功後還會拋出 Issue(amount) 增發事件。
再看下最近的增發記錄截圖:
Transaction Hash:0xdd108cd36fbeaab03b29ac46d465ad9824618d683268681d3206bd78302e0d71
可以看到在上圖交易詳情中並沒有調用 TetherToken 合約的 issue(uint) 增發函數,而是調用了 MultiSigWallet 合約的 confirmTransaction(uint) 函數完成的增發操作。
需要注意以下兩點:
TetherToken 合約調用分析
我們先看看 MultiSigWallet 合約的 confirmTransaction(uint) 函數的實現
<code>/<code>
調用 confirmTransaction(uint) 函數確認並執行交易需要滿足以下條件
submitTransaction(address,uint,bytes) 會調用到合約內部的 addTransaction(address,uint,bytes) 函數,其實現如下:
最終一次完整的提交 -> 確認操作流程如下:
1、調用 submitTransaction(address,uint,bytes) 函數提交事務並傳入參數:contract-address、eth-value、payload。注意:提交事務包含一次事務確認。
依次發送 Submission 事件 -> Confirmation 事件。
2、調用 confirmTransaction(uint) 確認並執行事務,需要 3 個不同的 owner 賬戶完成最終的確認。
依次發送 Confirmation 事件 -> 執行 payload 所產生的事件(滿足確認數量)-> Execution 事件。
TetherToken 跨合約調用如下圖所示:
USDT 增發分析
繼續看這筆增發交易的調用事件,正好滿足調用 confirmTransaction(uint) 函數所產生的事件。
通過查詢 transactionId 即可看到調用參數
轉換成以下偽代碼:
<code>/<code>
那麼 Bitfinex: MultiSig 2 地址的 USDT 是哪來的呢?根據 transactionId 繼續向前追蹤一個事務即可找到真正為 Bitfinex: MultiSig 2 地址增發 USDT 的交易:
轉換成以下偽代碼:
<code>/<code>
Transaction Hash:0xb467ea92b5c0095b1a96f35eb466b239c13e5b0b3f493e3e452f832d99830d6b
這才是真正為 Bitfinex: MultiSig 2 地址增發 USDT 的操作。
USDT 增發如下圖所示:
總結
可以看到,USDT 的增發需要通過 MultiSigWallet 跨合約調用才能完成。而 MultiSigWallet 智能合約存在多個 owner 用戶,完成一次跨合約調用需要至少 3 個 owner 的確認。這種增發機制在一定程度上杜絕了當某一 owner 賬戶丟失或被盜時 USDT 被惡意增發的安全隱患。
作者:北京鏈安;來自鏈得得內容開放平臺“得得號”,本文僅代表作者觀點,不代表鏈得得官方立場凡“得得號”文章,原創性和內容的真實性由投稿人保證,如果稿件因抄襲、作假等行為導致的法律後果,由投稿人本人負責得得號平臺發佈文章,如有侵權、違規及其他不當言論內容,請廣大讀者監督,一經證實,平臺會立即下線。如遇文章內容問題,請發送至郵箱:[email protected]
關鍵字: confirmTransaction uint 事件