摘要:可以看到增發 USDT 需要 TetherToken 合約的 owner 賬戶調用 issue(uint) 增發函數進行,增發成功後還會拋出 Issue(amount) 增發事件。可以看到在上圖交易詳情中並沒有調用 TetherToken 合約的 issue(uint) 增發函數,而是調用了 MultiSigWallet 合約的 confirmTransaction(uint) 函數完成的增發操作。

        近日,聽說以太坊上的泰達幣(USDT)頻繁被增發。本着學習的目的在 etherscan 上審計了泰達幣的智能合約(TetherToken)源碼以及 USDT 增發相關的調用事件,本文記錄一下分析過程。</p> 
以下是 TetherToken 智能合約的 USDT 增發函數:

可以看到增發 USDT 需要 TetherToken 合約的 owner 賬戶調用 issue(uint) 增發函數進行,增發成功後還會拋出 Issue(amount) 增發事件。 再看下最近的增發記錄截圖:

Transaction Hash:0xdd108cd36fbeaab03b29ac46d465ad9824618d683268681d3206bd78302e0d71

可以看到在上圖交易詳情中並沒有調用 TetherToken 合約的 issue(uint) 增發函數,而是調用了 MultiSigWallet 合約的 confirmTransaction(uint) 函數完成的增發操作。 需要注意以下兩點:

TetherToken 合約調用分析 我們先看看 MultiSigWallet 合約的 confirmTransaction(uint) 函數的實現

調用 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 即可看到調用參數

轉換成以下僞代碼:

那麼 Bitfinex: MultiSig 2 地址的 USDT 是哪來的呢?根據 transactionId 繼續向前追蹤一個事務即可找到真正爲 Bitfinex: MultiSig 2 地址增發 USDT 的交易:

轉換成以下僞代碼:

Transaction Hash:0xb467ea92b5c0095b1a96f35eb466b239c13e5b0b3f493e3e452f832d99830d6b 這纔是真正爲 Bitfinex: MultiSig 2 地址增發 USDT 的操作。 USDT 增發如下圖所示: < p style="text-align:center">
相關文章