20 转账到一个从未见过的地址额外花费 25,000个GAS 的疑问

Call, send 和transfer 函数对应于CALL指令。基本消耗是7,400 GAS。事实上,消费将近7,600 GAS。值得注意的是,如果转账到一个从未见过的地址,将额外增加25,000个GAS。

我发现我的智能合约买一个币,第一次花费12.5万gas,第二次也差不多。并没有减少 2.5万gas。

照理说第一次购买,薄饼转账到一个从未见过的地址花费额外的2.5万gas,第二次交易应该更少的gas花费才是。

因为我无论怎么优化我的智能合约,我需要花费的燃料依然比人家多了大概2万左右,所以我怀疑问题在这。

----------------------------------更新-------------------------------------

感谢Tiny熊的答复。

卖出的时候我用到了balanceOf函数,然后第一次卖出确实花费了很多的gas,但是买的时候没有涉及balanceOf的调用,故而第一次和第二次没有太大的变化。

这是我涉及到薄饼的核心交易代码,就2行而已。我也不知道怎么优化了,但是目前来看swap函数用的燃料费比人家的多,但是swap又不归我管。我也不知道对方用了什么方法,燃料费就是比我们的省了2万左右。

swap_token_address.call(abi.encodeWithSelector(SELECTOR, pair_address, transfer_amount));

IUniswapV2Pair(pair_address).swap(
amount0Out, uint(0), address(this), new bytes(0)
);

swap函数的代码: https://github.com/Uniswap/v2-core/blob/4dd59067c76dea4a0e8e4bfdda41877a6b16dedc/contracts/UniswapV2Pair.sol

请先 登录 后评论

最佳答案 2022-06-20 11:48

你引用的句子我不知道他说的是否准确。 在柏林升级的时候,gas 是有调整的。

不过token转账并不是使用你这里说的send transfer 函数,token转账调用合约,涉及的gas变化是第一写balance(好像是2万gas)还是更新balance(好像是5千)。

你的合约比别人的gas,你可以对比合约代码,查看差异。

请先 登录 后评论

其它 0 个回答