Solidity

合約部署時對gas的錯誤估計

  • June 27, 2019

我有一個智能合約:

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= 424652gas。但是,當我嘗試使用 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()

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