合约的gas 和 gasLimit / 学习智能合约#35

Words
280
Reading
2 min
Listen
Play
6y

gasLimit.jpg

执行智能合约时如果没有给出gasLimit和gasPrice的参数,那么MetaMask钱包会给出默认值。如果你想要比别人稍提前点得到确认,那么就要提高点gasPrice。获取gasPrice的价格比较简单,就是查一下实际的网络就行,getGasPrice()这个方法就可以查询:

web3.eth.getGasPrice()gas gas
web3.eth.getGasPrice().then(console.log);
> "20000000000"  //20G

你在此gasPrice的基础上再加些价格就可以得到确认的优先权。

还有一个gasLimit的参数。执行智能合约每一步都要消耗gas, 那么一整个合约执行下来要设个上限(有点类似油箱的最大容量)。要计算每一步消耗的gas倒要费点功夫。

web3.eth.estimateGas(callObject [, callback])
 gas 

eg:
let option = {
  from: addr,
  gasPrice: gasPrice
} 
let res = await instance.methods.setOrder(orderNumber, amount, price, isTrust).estimateGas(option) 
//184680

比如上面的案例中得到184680的gas量,那么gasLimit要设得比它大,可以看到MetaMask设的值是277038。剩下的没有消耗的gas会返还给调用者。

gasLimit和gasPrice可以由网络计算得到精确的值,但它们是随时变化的。一般可以不用设,用MetaMask的默认值即可。

合约的gas 和 gasLimit / 学习智能合约#35 | Ecency