Go-Ethereum

為什麼部署在 Solidity 瀏覽器中的合約功能沒有部署在 geth 中?

  • December 1, 2016

我有我的私人乙太坊網路。

Solidity 瀏覽器內部:

  1. 從 Web3 Provider 我已經連接到我的本地乙太坊節點。
  2. 我按下create按鈕並成功部署了我的契約。
  3. 現在我可以呼叫合約中的任何函式並且全部部署都沒有任何問題。

在此處輸入圖像描述

舉個例子:我insertfront(string val)在 Solidity 瀏覽器中部署了事務(探勘大約需要一分鐘)。天然氣成本為 203893。

在此處輸入圖像描述

蓋特內部:

  1. 連接到私有乙太坊網路。
  2. 從將指向已部署合約的 Solidity 瀏覽器獲取地址和 abi(位於界面框內)。

在此處輸入圖像描述

  1. var mycontract = eth.contract(abi).at(address)

mycontract { ... insertfront: function(), allEvents: function(), construct: function(), delete_: function(), delete_items: function(), deleteback: function(), deletefront: function(), get: function(), get_: function(), get_map: function(), ... }

  1. mycontract.deletefront( {from: eth.accounts[0]} )//這在geth內部起作用,函式完成它必須做的事情。交易探勘和部署。deletefront() 函式的 gas 使用量為 41920。
  2. 但是當我insertfront(string val)在 geth 中呼叫函式時(請注意,交易在 Solidity 瀏覽器中花費了 203893 氣體),它永遠不會在我的區塊鏈中部署或探勘(我已經等了幾個小時但沒有幫助)。

> mycontract.insertfront("some_string", {from: eth.accounts[0]} ) "0x7048278dcdb02c02894082af541c73ad6a8e0e37cf1ab90ac914c58cc2d2f983"

//但它沒有影響,並沒有完成函式必須做的事情。

$$ Q $$為什麼部署在 Solidity 瀏覽器中的功能沒有部署在 geth 中?可能是因為某個功能使用了高氣體量嗎? 感謝您寶貴的時間和幫助。

我不會馬上知道,但我懷疑這確實是一個氣體問題。geth 預設只提供 90k gas,這還不夠。您可以像這樣在交易中設置氣體{from: eth.accounts[0], gas: 300000}:請注意,您需要設置氣體,而不是gasPrice。不用擔心準確無誤,因為任何未使用的 gas 都會退還。

這是幫助調試的附加提示:使用web3.getTransaction()web3.getTransactionReceipt(). 交易後給出的十六進製字元串 geth(即"0x7048278dcdb02c02894082af541c73ad6a8e0e37cf1ab90ac914c58cc2d2f983")是該交易的雜湊值。通過使用getTransactionReceipt(hash),您將看到發生了什麼。如果getTransactionReceipt()說交易使用的gas與getTransaction()最初所說的一樣多,那麼交易很可能會用盡gas。

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