Solidity
如果函式末尾的動態呼叫使用了呼叫者的所有剩餘氣體怎麼辦?
假設我們有這樣的聯繫人:
contract x { function y() external { // do some majic! if (some_condition) { another_contract_address.call(abi.encodeWithSignature("another_contract_func()")); } } }
它在函式中執行某些操作,
y
然後在特定條件下動態呼叫另一個合約的另一個方法作為其最後一句話。據我所知,呼叫者合約的所有剩餘氣體都將用於執行被呼叫者函式。關於這個動態呼叫是 中的最後一個表達式這一事實,y
如果這個動態呼叫耗盡了所有剩餘的氣體會發生什麼?交易是否成功完成(由於RETURN
操作碼使用 0 gas)還是會因燃料不足錯誤而失敗?
狀態將恢復到初始狀態(呼叫函式時的狀態)。但是您提供給礦工的gas費和獎勵將不予退還。交易塊將永遠存在。如果您已付款,任何數量的乙太幣都將被退回。動態呼叫將像同一合約的函式呼叫一樣執行。所以在還原過程中,動態合約呼叫和呼叫者合約的狀態變數都會被還原。
根據這篇OpenZepplin 部落格文章:
鑑於每次呼叫都可能以耗盡氣體 (OOG) 異常結束,為避免安全問題,發送者至少 1/64 的剩餘氣體將被保存。這允許發送者處理內部呼叫的氣體不足錯誤,以便他們能夠在自己沒有耗盡氣體的情況下完成其執行,從而使異常冒泡。