Mist

如何趕上天然氣異常

  • September 20, 2016

據我所知,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稱呼:

進行呼叫或交易,不會添加到區塊鏈中並返回已使用的氣體,可用於估算已使用的氣體。

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