Out-of-Gas
EVM:執行發送時氣體不足
我想考慮一個場景,假設合約使用 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.send
EVM 處理 CALL 操作碼失敗時,它將在頂部堆棧條目上留下 0(假)。EVM 將嘗試執行下一個操作碼以將 0 分配給 retVal。無論它試圖執行什麼操作碼,如果沒有足夠的氣體來支付它,EVM 將立即停止恢復任何更改。
require()
是一種返回錯誤消息的奇特方式。如果出現被零除、無效操作碼等錯誤,EVM 可以在不需要的情況下恢復。