Mist
在 Mist 中部署新合約時如何指定 gas?
當我向我的合約發送交易時,錢包告訴我gas用完了,那麼我在部署新合約時如何指定gas量?
2017 年 4 月 2 日更新
正如@jeff 在下面的評論中指出的那樣:
一次更正;在第二張圖片中,Mist 建議使用 113,250 氣體,藍色文本實際上是可編輯的(儘管根本不清楚)。所以你可以指定氣體限制:)
謝謝@傑夫!
假設乙太坊錢包
我假設您問題中的“錢包”是指乙太坊錢包(Mist),因為您最初的問題沒有指定“Mist”。
Q : 在 Mist 中部署新合約時如何指定 gas?
A : 當您在 Mist 中部署合約時(Contracts -> Deploy New Contract),您可以在螢幕中更改費用。這表示 gas x 估計的 gas 價格,如下面的螢幕所示:
Q : 當我向我的合約發送交易時,錢包告訴我gas用完了,那麼我在部署新合約時如何指定gas量?
A : 您不能在標準 Mist 界面中指定最大氣體。Mist 似乎試圖估算所需的氣體,並在估算的基礎上增加了 100,000 單位的氣體。在下面的螢幕中,估計為 13,250 氣體。Mist 指定最大值為 113,250 氣體:
如果您正在使用
geth
如果您使用
geth
的是2 個帶有地址數組的映射結構 - 推送不起作用:在創建合約時指定 gas:
> var twoStructsContract = web3.eth.contract(twoStructsCompiled.TwoStructs.info.abiDefinition); > var twoStructs = twoStructsContract.new({from:web3.eth.accounts[0], data: twoStructsCompiled.TwoStructs.code, gas: 1000000}, function(e, contract) { if (!e) { if (!contract.address) { console.log("Contract transaction send: TransactionHash: " + contract.transactionHash + " waiting to be mined..."); } else { console.log("Contract mined! Address: " + contract.address); console.log(contract); } } } )
在向您的合約發送交易時指定 gas:
> twoStructs.add(eth.accounts[0], 123, { from:web3.eth.accounts[0], data: twoStructsCompiled.TwoStructs.code, gas: 1000000 });
如果您在 Mist 中創建了合約並希望通過
geth
在本節中,我在 Mist on Testnet 中部署了以下程式碼。您可以使用以下地址和資訊在測試網上複製此範例:
contract TestMistGas { uint256 number; function getNumber() constant returns (uint) { return number; } function setNumber(uint256 _number) { number = _number; } }
然後獲取契約詳細資訊並將其用於
geth
:
- 獲取 Mist 部署合約的地址。為此,請在 Mist 中點擊您的合約並複制地址。在
geth
中,將地址分配給變數:> var myContractAddress = "0xf5D623C03d245D36286D97689f8dE8B629c8f46a"; undefined
- 獲取 JSON 應用程序二進制介面 (ABI)。為此,請在 Mist 中點擊您的合約,然後點擊 Show Interface。在
geth
中,將此字元串分配給一個變數:> var myContractABI = [ { "constant": false, "inputs": [ { "name": "_number", "type": "uint256" } ], "name": "setNumber", "outputs": [], "type": "function" }, { "constant": true, "inputs": [], "name": "getNumber", "outputs": [ { "name": "", "type": "uint256", "value": "12345" } ], "type": "function" } ]; undefined
- 通過在中鍵入以下命令,使用公開的 ABI 函式創建一個指向您的合約地址的變數
geth
:> var myContract = eth.contract(myContractABI).at(myContractAddress); undefined
- 您可以通過在中鍵入以下命令來檢查您是否已正確分配變數
geth
:> myContract { address: "0xf5D623C03d245D36286D97689f8dE8B629c8f46a", allEvents: function(), getNumber: function(), setNumber: function() }
setNumber()
您可以使用以下命令發送交易以呼叫該函式geth
:> myContract.setNumber(123, {from: eth.accounts[0], gas: 100000});
“0xc8eeba52b5970c93e8d8be91632548b1d6400b74bd6dbbc7017e08bcc0b15648” 6. 您可以使用以下命令檢查交易狀態
geth
:> eth.getTransaction("0xc8eeba52b5970c93e8d8be91632548b1d6400b74bd6dbbc7017e08bcc0b15648") { blockHash: "0x964860acb5cd6af52ff01004ba471e2c5304ea47a788bc34462c973e9f969c80", blockNumber: 1000864, from: "0x3b449dfd7c15c60a45ce1d401b5a1a6081d2a400", gas: 90000, gasPrice: 20000000000, hash: "0xc8eeba52b5970c93e8d8be91632548b1d6400b74bd6dbbc7017e08bcc0b15648", input: "0x3fb5c1cb000000000000000000000000000000000000000000000000000000000000007b", nonce: 1048582, to: "0xf5d623c03d245d36286d97689f8de8b629c8f46a", transactionIndex: 1, value: 0 }
- 您可以使用以下命令呼叫該
getNumber()
函式:geth
> myContract.getNumber() 123