Gas-Limit
轉賬 USDT 時的 Gas 限制問題
我的客戶一直要求在轉出他的 USDT 時保存 ETH,他希望他的新 USDT 地址中沒有或只剩下很少的 ETH。請假設 USDT 地址沒有初始 ETH,接下來我必須將一些 ETH 轉入其中。
經過其他舊交易的長時間參考。我決定使用 26500 作為 gas 限制(我保證收件人地址有 USDT),此後不久就不需要 ETH,現在我有足夠的 gas 來轉移 USDT。
將新的 tx 廣播到網路後,過了一會兒我遇到了氣體不足的錯誤。我嘗試了更高的氣體限制,直到我放棄並將其設置為 60000。那麼現在猜猜看,tx 是成功的!實際耗氣量甚至低於26500。
有人解釋一下為什麼會這樣嗎?為什麼我不能設置確切的氣體限制來解決我的問題?usdt 合約中的 transfer() 是否有特殊條件?提前致謝。
最終我設法為自己找到了這個答案。
這種現象的發生是因為合約執行觸發了退還gas機制。
回到當我轉移我的整個 USDT 的時候,在合約執行時,腳本被觸發操作碼
sstore[x] = 0
以刪除我的地址資訊,因為我什麼都沒有,這反過來又會退還我 15,000 天然氣。為了獲得退款,必須設置更高的gas限制。值得注意的是,退款總是在契約執行結束時發生。所以你必須確保你有足夠的汽油來獲得退款。例如,一個流程需要 300 gas 才能獲得 50 gas 的退款,如果設置為 250 gas,那麼您將遇到 out-of-gas 錯誤並失去所有資金。
進一步研究 Gas 退款如何運作? https://www.btcschools.net/ethereum/eth_gas.php