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

左敲右滑手艺人 左敲右滑手艺人 提出于 2022-03-10 19:43 7151 浏览

比如五十个账户的私钥,调用他们去批量转账还好没出现什么大问题。 批量去调用薄饼接口去交易,比如三十多个号,就有十多个号失败的,大概效果就截图这样。 警告! 合约执行时遇到错误 [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%的变化空间。

jackson

采纳率 60% · 回答于 2022-03-11 10:56

其它 3 个回答

zen 2022-03-11 08:21
左敲右滑手艺人 币圈慈善家 2022-03-10 20:18

写回答

你需要登录后才可以回答问题,登录