比如五十个账户的私钥,调用他们去批量转账还好没出现什么大问题。 批量去调用薄饼接口去交易,比如三十多个号,就有十多个号失败的,大概效果就截图这样。 警告! 合约执行时遇到错误 [execution reverted ]
循环的以下代码,单一调用转是正常的,就是批量的时候,账户少也正常,账户多了就会出现广播出去了,但是链上出现失败。大概三十多个号,出现十多个失败的。
let txData = contract.methods.swapExactETHForTokens(
amountOutMin,
[_this.tokens['addressB'], _this.tokens['addressA']],
account,
_this.getTime(600),
).encodeABI();
const rawTx = {
from: account,
to: contract.options.address,
nonce: nonce,
data: txData,
value: value
}
let gas = await web3js.eth.estimateGas(rawTx);
rawTx.gas = gas;
let signTx = await web3js.eth.accounts.signTransaction(rawTx, privateKey);
web3js.eth.sendSignedTransaction(signTx.rawTransaction, function(error, txHash) {}
根据你这个交易的截图看,交易是因为实际使用的gas 超过了给出的gasLimit限制导致的。
之所以会出现这种情况,是因为Ethereum再估算gas消耗时,是根据当时的合约状态来计算的,但是,合约的状态是一直在变化的,引起变化的可能有多种:
上面两种,都有可能因为前面发的交易而被改变,而预估时的状态,到交易打包时已经发生变化,导致上面两种可能影响gas消耗的情概况发生,如果影响是实际gas消耗上涨,则使用原来预估时的gasLimit会导致交易失败。而这种情况在批量发交易时更容易发生,因此发生楼主描述的情况。
一种解决办法,是可以在预估gas的基础上,上调20%的变化空间。