Hedera测试网近乎相同交易中gasUsed差异原因咨询
问题:Hedera测试网中gasLimit设置不同导致gasUsed不一致的原因
我在Hedera测试网部署了指定Solidity合约,使用ethers.js发起两次参数完全一致的合约调用:
- 第一次将gasLimit设为
eth_estimateGas返回的精确值(400000) - 第二次设为该值的1.1倍(440000)
结果显示两次交易的gasUsed分别为320000和352000,第二次额外消耗32000 gas,按预期两次gasUsed应一致,特此咨询原因。
合约代码
// SPDX-License-Identifier: GPL-3.0 pragma solidity 0.8.18; contract ExpendSomeGasDemo { uint256 public state; function updateState( uint256 newState ) public returns (uint256 updatedState) { state = newState; updatedState = newState; } }
交易代码(ethers.js)
// with exact estimated amount of gas const estimatedGas2 = (await expendGasSc.estimateGas.updateState(1_000_000_123n)).toBigInt(); console.log('estimatedGas2', estimatedGas2); const gasLimit2 = estimatedGas2 * 1n; console.log('gasLimit2', gasLimit2); const txResponse2 = await (await expendGasSc .updateState( 1_000_000_123n, { gasLimit: gasLimit2 }, )) .wait(); const gasUsed2 = txResponse2.gasUsed.toBigInt(); console.log('gasUsed2', gasUsed2); // with 110% of estimated amount of gas const estimatedGas3 = (await expendGasSc.estimateGas.updateState(1_000_000_123n)).toBigInt(); console.log('estimatedGas3', estimatedGas3); const gasLimit3 = estimatedGas3 * 11n / 10n; console.log('gasLimit3', gasLimit3); const txResponse3 = await (await expendGasSc .updateState( 1_000_000_123n, { gasLimit: gasLimit3 }, )) .wait(); const gasUsed3 = txResponse3.gasUsed.toBigInt(); console.log('gasUsed3', gasUsed3);
输出结果
estimatedGas2 400000n gasLimit2 400000n gasUsed2 320000n estimatedGas3 400000n gasLimit3 440000n gasUsed3 352000n
原因分析
这是Hedera网络特有的gas计费机制导致的:
- Hedera的gas计算逻辑和以太坊不同,它要求交易的gasUsed至少为设置的
gasLimit的80%(即0.8倍),这是平台为避免用户设置过低gasLimit浪费网络资源设计的规则。 - 第一次设置gasLimit=400000,0.8×400000=320000,刚好等于合约实际执行消耗的gas,因此gasUsed显示为320000。
- 第二次设置gasLimit=440000,0.8×440000=352000,即便合约实际执行只需要320000 gas,Hedera也会按最低比例收取费用,所以gasUsed显示为352000。
内容的提问来源于stack exchange,提问作者bguiz
相关产品推荐
相关产品推荐

