Mist

在 Mist 中部署新合約時如何指定 gas?

  • April 1, 2017

當我向我的合約發送交易時,錢包告訴我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

  1. 獲取 Mist 部署合約的地址。為此,請在 Mist 中點擊您的合約並複制地址。在geth中,將地址分配給變數:
> var myContractAddress = "0xf5D623C03d245D36286D97689f8dE8B629c8f46a";
undefined
  1. 獲取 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
  1. 通過在中鍵入以下命令,使用公開的 ABI 函式創建一個指向您的合約地址的變數geth
> var myContract = eth.contract(myContractABI).at(myContractAddress);
undefined
  1. 您可以通過在中鍵入以下命令來檢查您是否已正確分配變數geth
> myContract
{
 address: "0xf5D623C03d245D36286D97689f8dE8B629c8f46a",
 allEvents: function(),
 getNumber: function(),
 setNumber: function()
}
  1. 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
}
  1. 您可以使用以下命令呼叫該getNumber()函式:geth
> myContract.getNumber()
123

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