MetaMask与Web3中智能合约调用(2)


MetaMask与Web3中智能合约调用(2)_第1张图片

合约发起交易前准备工作

智能合约交易区别于点对点交易,智能合约交易只需付费给矿工费用,也就是gas fee,是支付给矿工的手续费,当我们在以太坊区块链上进行转账时,矿工要把我们的交易打包并放上区块链,才能使交易完成,在这过程中会消耗区块链的运算资源,所以要支付费用

这个过程为Gas Fee=Gas Limit(限制) x Gas Price(价格)

gas limit:每一次交易或合约调用都要设置一个gas limit,如果该次操作所使用的gas数量小于或等于您所设置的gas limit,则会被执行,但如果gas总消耗量超过gas limit,所有的操作都会被重置,但费用依旧会被收取。也就是设置较少可能会导致交易失败而且钱不会退回,但同时设置过高同样不太合理

gas Price:在发起交易或合约调用时,我们可以自己设置gas的价格,即gas price,一般以GWei(1 ETH = 1000000000 GWei)为单位。通过gas price可以节省矿工费用,但也会减慢矿工打包的速度,矿工会优先打包gas price设置高的交易,如果您想加快转账,您可以把gas price设置得更高

gas limit是可以调用web3的方法进行预估,如下代码所示

//gas设置特定值有助于检测数量不足错误。如果使用了所有gas limit,它将返回相同的数字
//estimateGas方法为检测智能合约方法调用的gas limit
contract.methods.Mycontract().estimateGas({ from: '钱包地址', gas: web3.utils.toHex(1000000) })
.then(function (gas_limit) {
//gas_limit为估计数量,可在此数量上增加20%左右,防止交易失败
if(gas_limit == 1000000)
        console.log('该方法耗尽gas limit');
}

gas Price分为两个部分,最大优先费用与最大费用,如果在交易中只设置gas Price,会导致如下问题

contract.methods.Mycontart().send({ from: '钱包地址',gasPrice:web3.utils.toHex(web3.utils.toWei('10', 'gwei')) })

MetaMask与Web3中智能合约调用(2)_第2张图片

最大优先费用与最大费用相同导致用户付费过高问题,这就需要控制这两个参数

maxPriorityFeePerGas 为控制最大优先费用参数

maxFeePerGas 为控制最大费用参数

该方法的两个参数在web3官方文档中是没有说明的

//maxFeePerGas为最大费用,值可以使用web3方法获取
web3.eth.getGasPrice().then((price) => {
      console.log(price)//值一般为链gas平均值,可以在此基础上增加30%-40%,防止交易时间过长
})
//maxPriorityFeePerGas一般设置为1.5
contract.methods.Mycontract().send({ 
      from: '钱包地址', 
      gas: web3.utils.toHex(gas_limit),
      maxPriorityFeePerGas: web3.utils.toHex(web3.utils.toWei('1.5', 'gwei')),
      maxFeePerGas: web3.utils.toHex(web3.utils.toWei(price, 'wei')) 
})

如下为设置成功

MetaMask与Web3中智能合约调用(2)_第3张图片

你可能感兴趣的:(web3,智能合约,区块链)