执行智能合约时如果没有给出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的默认值即可。