Revert-Opcode

在 revert() 之前通過“自毀”返還 Gas

  • January 7, 2021

在最終呼叫 revert() 的事務中,如果在 revert 之前我們有 SELFDESTRUCT 一些契約並因此收到了 gas 退款,那麼 gas 退款是否也會被退回?

一個有趣的問題!我在文件中找不到任何關於此的內容,但我也找不到任何關於selfdestruct’s gas 退款的資訊(直到我注意到這個How do do gas returns work?)。

我對以下合約做了一些試驗:

pragma solidity ^0.7.0;

contract A {
   function die() public {
       selfdestruct(msg.sender);
   }
}

contract B
{
   A aRef;
   function init() public {
       aRef = new A();
   }
   function killIt() public {
       uint i;
       for (i = 0; i < 10000; i++) { }
       aRef.die();
       revert();
   }
}

所以我所做的是:

  1. 部署 B
  2. 執行初始化
  3. 執行 killIt

我在兩種情況下檢查了gas費用:

  1. 就像我在上面粘貼的那樣執行。撥打killIt費用 588914
  2. 執行aRef.die();註釋掉的行。撥打killIt費用 581421

顯然,selfdestruct這裡沒有應用 ’s gas 退款,所以退款被浪費了。

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