Solidity

怎麼知道合約函式里面最後退還的gas量

  • June 4, 2016

考慮以下情況:我的功能可以分為2部分

  1. 總是消耗恆定的氣體;
  2. 總是會導致退款0 < R < 1500000

在第二部分發生之後,但在函式呼叫結束之前,我怎麼知道 的值R

問題是msg.gas(剩餘的gas)沒有考慮退款(因為退款不能在交易本身內部使用)。因此,以下方法將失敗:

uint startGas = msg.gas;                   // e.g. 100000 gas
delete myArray;                            // consumes 40000 gas, but will refund 20000 in the end
uint gasUsed = startGas - msg.gas + 21500; // gasUsed = 100000 - 60000 + 21500 == 61500 gas (21500 is for initial tx and function call)

我們估計執行所花費的gas為61500,但實際上退款後,交易收據gasUsed值為41500

我想知道是否有類似msg.refundGas的計劃,或者我應該創建一個功能請求?

無法從 EVM 內部得知 EVM 的退款計數器的值;如果您想處理退款,您必須自己手動處理。

鑑於這delete myArray可能很危險(如何在不超過 gas 限制的情況下清除大型陣列?),您可能想確切地知道要清除多少儲存空間。然後您可以將清除的儲存槽數乘以15,000,然後檢查是否需要限制退款。 精確的氣體計算可能很棘手,可能需要測試。

隨意,任何人都可以在 Github 上送出功能請求。

引用自:https://ethereum.stackexchange.com/questions/3860