Solidity
合約部署時對gas的錯誤估計
我有一個智能合約:
pragma solidity 0.5.3; import "./ERC20.sol"; contract Transfer { ERC20 private erc20iface; address private _owner; modifier validOwner() { require(msg.sender == _owner); _; } constructor() public { _owner = msg.sender; } function () external payable {} function transferTo(address[] memory receivers, uint[] memory amounts, address token) { //Some code uses ERC20 methods/or simple transfers with .call() } }
當我嘗試在 Remix 中部署合約時,它會顯示
transaction cost
=424652
gas。但是,當我嘗試使用 web3 .estimateGas() 估計氣體限制時const contractData = { data: '0x123', arguments: [] }; const contract = new web3.eth.Contract(CONTRACT_ABI).deploy( contractData ); const gasLimit = await contract.estimateGas();
我得到 gasLimit = 409652 當我嘗試部署時,我收到一個
error: Out of gas
但是,如果我使用 Remix ( ) 中的氣體量,
424652
它就可以正常工作。造成這種差異的原因是什麼(15000 氣體,例如 .estimateGas 缺少 ERC20 導入)?
gasLimit
以及如何.estimateGas()
正確估計?
由於您沒有在
estimateGas()
版本中包含創建者地址,因此它預設為 0x0 地址。所以在建構子中,它設置了_owner = 0x0
,它只花費了 5k。但是,Remix 版本使用非零創建者,這會導致 20k 成本。這就節省了 15kestimateGas()