Solidity
重置儲存槽會增加氣體使用量,但應該會減少它
我有一個簡單的契約,刪除數組的最後一個元素:
pragma solidity^0.4.11; contract GasRefundTest { uint[] myArray = [1, 2]; function deleteLastElem() public returns(bytes32) { myArray.length--; } }
呼叫的交易成本為
deleteLastElem()
17182 gas。當我將其更改為:
pragma solidity^0.4.11; contract GasRefundTest { uint[] myArray = [1, 2]; function deleteLastElem() public returns(bytes32) { delete myArray[1]; myArray.length--; } }
交易成本變為22480 gas。
我認為刪除儲存槽應該會導致 gas 退款,但我看到 gas 增加了。
誰能解釋這裡發生了什麼。
減小動態大小數組的大小已經將“刪除”的元素清零。
因此,首先執行 a 的程式碼版本
delete myArray[1]
只是對即將完成的儲存進行額外的寫入。有趣的嘗試:
// This doesn't take more gas depending on how big you make the array. myArray.length = 3; // or 300 or 3000 myArray = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; ... // This takes more gas the more elements you're removing, because it has to zero // out more positions in storage. myArray.length = 9; // vs. 1
編輯
我應該指出,最後一個例子有點令人困惑。汽油退款確實在那裡開始,但僅限於消耗汽油的一半。