Out-of-Gas

EVM:執行發送時氣體不足

  • February 28, 2021

我想考慮一個場景,假設合約使用 send 執行傳輸。此時,出現氣體耗盡並發送返回-1。現在合約沒有gas,send沒有revert,EVM怎麼辦,會不會因為沒有gas而阻塞?EVM 將如何擺脫這種阻塞情況?請提供乙太坊文件中的一些連結。

contract TestOutofGas{
    :
    :
     function transaction(address otherContract, uint x) public returns () {
      :
      retVal = otherContract.send(1000);//out of gas
      bool success = findPrime(x);
        :
       :
     }//func transaction
}//contract OutofGas

現在假設另一種情況,

contract TestOutofGas{
    uint trnNo=0;
    :
    function transaction(address otherContract) public returns (uint) {
      :
        retVal = otherContract.send(1000);//out of gas
        require(retVal);
        trnNo++;
      :
      :
    }//func ends
}//contract ends

如果合約沒有任何 gas,EVM 是否能夠執行 require(…) 指令?

祖爾菲。

我們來分析第二種情況

function transaction(address otherContract) public returns (uint) {
  :
    retVal = otherContract.send(1000);//out of gas
    require(retVal);
    trnNo++;
  :
  :
}//func ends

otherContract.sendEVM 處理 CALL 操作碼失敗時,它將在頂部堆棧條目上留下 0(假)。

EVM 將嘗試執行下一個操作碼以將 0 分配給 retVal。無論它試圖執行什麼操作碼,如果沒有足夠的氣體來支付它,EVM 將立即停止恢復任何更改。

require()是一種返回錯誤消息的奇特方式。如果出現被零除、無效操作碼等錯誤,EVM 可以在不需要的情況下恢復。

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