Contract-Design
如何估算gas費用?
我有一個遍歷數組的函式,這可能會消耗大量氣體。但我仍然想測試估計的 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 成本?例如,如果成本是線性的,我可以計算一個客戶的成本,然後乘以客戶數量。問題是,我不認為它是線性的,有人可以對此有所了解嗎?
使用Truffle和testrpc。建構開發環境並測試不同的案例實際上非常容易。
對於 gas 估算,主要基於 Web3 原生函式:
- 您可以使用檢索 gas 價格(以 wei 為單位)
web3.eth.getGasPrice
- 該函式
estimateGas
將給出一個函式的氣體估計(通過參數)- 將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