Contract-Design

如何估算gas費用?

  • October 13, 2021

我有一個遍歷數組的函式,這可能會消耗大量氣體。但我仍然想測試估計的 gas 成本,然後決定是否應該保持設計。

function giveAwayDividend(uint amount) onlyOwner payable {
for(uint i=0;i<size();i++){
   customerAddress[i].call.value((balances[customerAddress[i]] * amount * 100) / totalSupply)();
}}

如果我在 testnet 上進行測試,我必須手動創建超過 1000 個使用者帳戶並向每個使用者發送一些令牌,這似乎很愚蠢。有沒有更好的方法來計算 gas 成本?例如,如果成本是線性的,我可以計算一個客戶的成本,然後乘以客戶數量。問題是,我不認為它是線性的,有人可以對此有所了解嗎?

使用Truffletestrpc。建構開發環境並測試不同的案例實際上非常容易。

對於 gas 估算,主要基於 Web3 原生函式:

  1. 您可以使用檢索 gas 價格(以 wei 為單位)web3.eth.getGasPrice
  2. 該函式estimateGas將給出一個函式的氣體估計(通過參數)
  3. gas 數量乘以gas 價格得到gas 成本估算

例如

var TestContract = artifacts.require("./Test.sol");

// Run unit tests to populate my contract
// ...
// ...

// getGasPrice returns the gas price on the current network
TestContract.web3.eth.getGasPrice(function(error, result){ 
   var gasPrice = Number(result);
   console.log("Gas Price is " + gasPrice + " wei"); // "10000000000000"

   // Get Contract instance
   TestContract.deployed().then(function(instance) {

       // Use the keyword 'estimateGas' after the function name to get the gas estimation for this particular function 
       return instance.giveAwayDividend.estimateGas(1);

   }).then(function(result) {
       var gas = Number(result);

       console.log("gas estimation = " + gas + " units");
       console.log("gas cost estimation = " + (gas * gasPrice) + " wei");
       console.log("gas cost estimation = " + TestContract.web3.fromWei((gas * gasPrice), 'ether') + " ether");
   });
});

結果在我的情況下(私有網路):

> truffle test
Using network 'test'.

Compiling .\contracts\Migrations.sol...
Compiling .\contracts\Test.sol...

Gas Price is 20000000000 wei
gas estimation = 26794 units
gas cost estimation = 535880000000000 wei
gas cost estimation = 0.00053588 ether

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