Solidity
怎麼知道合約函式里面最後退還的gas量
考慮以下情況:我的功能可以分為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 上送出功能請求。