Transactions

呼叫合約方法時耗盡氣體 - 瀏覽器 Solidity 和 Metamask

  • June 12, 2018

嘗試在測試網合約https://testnet.etherscan.io/address/0xce8efd03766a309af57ddeb9c79f3e7cd23da0df上呼叫 sendFundsToFriend() 方法(合約程式碼在https://gist.github.com/anonymous/5bdc3d9032a8b3cb5cba7c7625afa4d7)我得到:

Warning! Error encountered during contract execution [Out of gas]

tx 結果顯示:

Result: {
 "blockHash": "0x585ca866c5143090c7a82443269d55658a176a018b1ad90827ec70adc1ff66c8",
 "blockNumber": 465927,
 "contractAddress": null,
 "cumulativeGasUsed": 508930,
 "from": "0xe5f68950d479fab12797dabbe5a4b0d88ec7a722",
 "gasUsed": 58787,
 "logs": [],
 "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
 "root": "0x1289d7517d81fa8c4894c0cd97fd200ec4e9f0fecebba586435daca8e4e8f9ec",
 "to": "0xce8efd03766a309af57ddeb9c79f3e7cd23da0df",
 "transactionHash": "0x703d7657c093557d1cd42dfeb7b8d0d3b74e413d22e8009b26d7ac966c85d048",
 "transactionIndex": 3
}
Transaction cost: 58787 gas.

在此處輸入圖像描述

發送 tx 時,Transaction gas limit 設置為 3000000,即預設的 browser-solidity 值。

如果 tx cost 是 58787 gas,limit 是 3000000,為什麼會出現 out of gas 錯誤?任何的想法?謝謝!

PS:嘗試了來自 geth 節點的類似 tx,而不是使用 metamask+browser-solidity,它工作正常:

https://testnet.etherscan.io/tx/0x56465b6594769578d9223ca902757780600dd2628074aedcf9635fb590b75bfa

所以,在呼叫合約方法時,我在瀏覽器可靠性方面做錯了,或者可能是這種環境中的某種錯誤……

我的理論,看看已部署的交易,失敗的交易是到一個不存在的地址(零隨機數,零 ETH 之前),而成功的交易是到一個存在的地址(顯然過去有交易和 ETH已經)。前者會消耗更多的氣體,使其超出正常的氣體限制。

測試這一點的方法是使用 metamask+browser-solidity 發送到已經有 ETH 的地址。如果失敗了,那就不是這樣了。如果它沒有失敗,那麼這可能就是發生了什麼。

它可能仍然是 metamask 中的一個錯誤,因為它錯誤地計算了要提供多少氣體。

編輯:

我可能已經找到了答案。

比較一個成功的 geth和一個不成功的元遮罩(我想)表明原始事務實際上是不同的。我懷疑無論哪個客戶端發送了不成功的交易,都會以不同的方式格式化欄位,或者只是錯誤地格式化欄位。

在這一點上,我會用元遮罩送出一個錯誤。這超出了我自己的調試能力。

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