Go-Ethereum

如何在合約創建/部署到私有乙太坊區塊鏈時估算 gas

  • September 2, 2021

我做
了什麼 a) 當我web3.eth.estimateGas用來估計沒有參數的契約創建建構子的成本時,估計是正確的。

b) 如果合約已經部署,然後使用參數估計合約函式的 gas 成本,它工作正常。(contract.myMethod.estimateGas()使用 web3 api)

問題

a) 當我使用參數化建構子在合約創建時間 ( contractObject.new) 上估計合約中的 gas 時,它給出的 gas 成本估計不正確。( web3.eth.estimateGasweb3 api)

我想要什麼

a) 當我用合約的多個參數建構子估計氣體時,它應該估計正確的氣體。(contractObject.new用於呼叫建構子)

b) Browser-soldity 使用參數化建構子對合約進行正確的氣體估計 –> 在合約創建/部署之前(如交易成本或執行成本,我如何使用他們的算法和 web3 api 來正確估計氣體?)

嘗試使用.getData().

.getData()返回函式的編碼參數,以便手動發送交易。然後,您可以將其粘貼在web3.eth.estimateGas()(on 上web3.eth,而不是給定方法上)以模擬發送交易。

這是一個未經測試的範例,但希望它可以幫助您:

var contractData = contractObject.new.getData(someparam, another, {data: contractBytecode});
var estimate = web3.eth.estimateGas({data: contractData})

參考:

web3.eth.estimateGas()

使用 .getData() 的範例(這是第四個選項。)

使用 web3.js 版本 1.2.x 時,沒有 .getData 方法。我找到的解決方案是估算 .deploy() 方法的 gas,它有效地返回了合約創建的成本。

操作順序為:

let contractJSON = // JSON compiled contract
const contractABI = contractJSON.abi;
const bytecode = contractJSON.bytecode;
const contract = new web3.eth.Contract(contractABI);
let options = {
   arguments: [ arg1, arg2,... ],
   data: bytecode
}
const estimatedGas = await contract.deploy(options).estimateGas();

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