如何趕上天然氣異常
據我所知,solidity 沒有自定義例外。唯一的例外是
Out of Gas
。無論我們throw
在哪裡寫合約程式碼,它都會拋出out-of-gas
異常。但是,有什麼辦法可以捕捉到那個異常嗎?我的意思是我是否可以在發生異常時執行一段程式碼?即使在使用 geth 控制台時,我也沒有收到任何關於是否發生任何異常的通知。
我認為很有可能捕捉到這樣的異常,因為 Mist 能夠Intrinsic gas too low
在發生異常時顯示錯誤消息,所以它一定在某個地方處理了該異常。編輯:
基本上問題是:
在發送交易之前,我們如何知道該交易將消耗所有提供的氣體?
我不是在問如何為我的交易提供足夠的 gas,而是我如何知道我的交易會用完 gas。
這樣做的一種方法是發送交易,讓它被探勘,然後檢查
gasUsed=gasSend
是否有thow
使用debug.traceTransaction
。但我想知道我的交易是否會在不發送交易的情況下通過。在 Mist 中,每當我嘗試發送會遇到
throw
語句的事務時,它都會Intrinsic gas too low
在發送事務之前顯示。我想從geth
.
Solidity 沒有像 try/catch 那樣提供異常管理機制(對於 Java/c#)。
由於無效的 EVM 程式碼,throw 會消耗所有提供的 gas 終止並恢復對目前合約執行和 Ether 餘額所做的狀態的所有更改。這個概念旨在防止網路垃圾郵件。
在黃皮書中提到:
就像合約創建一樣,如果執行以異常方式停止(即由於耗盡氣體供應、堆棧下溢、無效跳轉目標或無效指令),則不會將任何氣體退還給呼叫者,並且狀態會恢復到該點在餘額轉移之前(即 σ)
作為“固有氣體過低”資訊的資訊
Mist 在不執行任何程式碼的情況下檢查 gas 數量,它會告訴您交易將失敗,因為您沒有提供足夠的 gas 來執行交易。
如果你想像 Mist 一樣估計氣體,你可以這樣
eth_estimateGas
稱呼:進行呼叫或交易,不會添加到區塊鏈中並返回已使用的氣體,可用於估算已使用的氣體。