Solidity

重置儲存槽會增加氣體使用量,但應該會減少它

  • February 12, 2018

我有一個簡單的契約,刪除數組的最後一個元素:

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

編輯

我應該指出,最後一個例子有點令人困惑。汽油退款確實在那裡開始,但僅限於消耗汽油的一半。

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