50 请教下bsc测试网,为什么批量私钥去调用薄饼合约很多出现失败。

比如五十个账户的私钥,调用他们去批量转账还好没出现什么大问题。 批量去调用薄饼接口去交易,比如三十多个号,就有十多个号失败的,大概效果就截图这样。 警告! 合约执行时遇到错误 [execution reverted ]

0220310193458422222.png

202203108888888888888888.png

循环的以下代码,单一调用转是正常的,就是批量的时候,账户少也正常,账户多了就会出现广播出去了,但是链上出现失败。大概三十多个号,出现十多个失败的。

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) {}
请先 登录 后评论

最佳答案 2022-03-11 18:57

根据你这个交易的截图看,交易是因为实际使用的gas 超过了给出的gasLimit限制导致的。

之所以会出现这种情况,是因为Ethereum再估算gas消耗时,是根据当时的合约状态来计算的,但是,合约的状态是一直在变化的,引起变化的可能有多种:

  1. 将值为0的状态改变为非零,消耗2万gas。将非0改为0,会返还1.5万gas
  2. 一些循环,或者条件分支,是根据状态来确定的

上面两种,都有可能因为前面发的交易而被改变,而预估时的状态,到交易打包时已经发生变化,导致上面两种可能影响gas消耗的情概况发生,如果影响是实际gas消耗上涨,则使用原来预估时的gasLimit会导致交易失败。而这种情况在批量发交易时更容易发生,因此发生楼主描述的情况。

一种解决办法,是可以在预估gas的基础上,上调20%的变化空间。

请先 登录 后评论

其它 3 个回答

zen
请先 登录 后评论
左敲右滑手艺人 - 币圈慈善家
请先 登录 后评论
0xluck
请先 登录 后评论