Go-Ethereum

如何在使用 web3.js 部署合約時設置 gas 價格?

  • May 7, 2019

我最近在 Rinkeby 網路上建立了一個 Geth 節點。雖然我可以在幾秒鐘內毫無問題地發送普通交易,但我似乎無法在不到一小時的時間內完成合約的創建。當我在 Remix 中編譯一個簡單的合約,然後將它生成的 web3.js 部署程式碼粘貼到 Geth 控制台中時——它將交易送出到網路上,但隨後它就在那里呆了一個多小時,沒有任何授權節點接受它進入一個塊。雖然最終它被接受了。

我想知道這裡的問題是否可能是汽油價格。基於 etherscan,web3.js 似乎決定將交易的 gas 價格設置為 4 gwei。我已經驗證網路的平均值目前只有 2 gwei,但我仍然想排除這種可能性。(gas 限制絕對不是問題——設置為 4700000,根據 Remix 的合約創建程式碼的估計 gas 僅為 80924。)

如果有人讀到這篇文章並懷疑我所看到的不是因為汽油價格太低,那麼請隨時在此處查看交易並提出建議:

https://rinkeby.etherscan.io/tx/0xe134c193cead33031e3348ebb1db42115fdf156cb5e1a1d43d5c4ecfdf026413

無論如何,我的具體問題是:這個 4gwei 的預設汽油價格來自哪裡,我怎樣才能用更高的價格覆蓋它?

出於某種原因,在 web3.js 的文件中沒有提到任何指定合約創建的 gas 價格的方法,儘管它確實提供了一種為普通交易指定它的方法:

https://github.com/ethereum/wiki/wiki/JavaScript-API

我可以將一個附加選項傳遞給 gasPrice= 的 web3.eth.contract(),或者傳遞給 myContract.new() 嗎?

從文件中:

var contractInstance = MyContract.new([constructorParam1] [, constructorParam2],
 {data: '0x12345...', from: myAccount, gas: 1000000});

是的,您只需gasPrice向該對象添加一個:

var contractInstance = MyContract.new([constructorParam1] [, constructorParam2],
{data: '0x12345...', from: myAccount, gas: 1000000, gasPrice: web3.toWei(2, 'gwei')});

web3 還具有估算所需氣體的功能,您可以執行以下操作:

var gasEstimate = web3.eth.estimateGas({data: bytecode});
var contract = web3.eth.contract(abi);
var instance = contract.new({data: bytecode, from: from, gas: gasEstimate});
var receipt = web3.eth.getTransactionReceipt(instance.transactionHash);

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