为什么第一次调用函数时要使用更多的气体



这是我的代码。

contract Demo {
function add1(uint256 a, uint256 b) public pure returns (uint256) { 
if (a==0) {
return 0;
}
uint256 c = a + b;
return c;
}
}
contract Test {
Demo demo = new Demo();
function testGas() public {
uint256 startGas = gasleft();
demo.add1(1, 2);
uint256 endGas = gasleft();
uint256 gasUsage1 = startGas - endGas;
startGas = gasleft();
demo.add1(1, 2);
endGas = gasleft();
uint256 gasUsage2 = startGas - endGas;
}
}

gasUsage1为6434,gasUsage2为1919。
第三次调用函数时,气体使用量与第二次相同
我测试了其他功能,结果是一样的。

有两个主要贡献:从存储器中读取地址,然后触摸它。

  1. 通过执行demo.add1(1, 2);,代码首先需要读取(SLOAD(存储中保存的demo的地址。第一次的天然气成本是2100(冷接入(,然后是100(热接入(。文档

  2. 调用演示合同将";触摸";其地址。第一次(冷接入(的天然气成本是2600,然后是100。文档

这解释了2000+2500=4500的差异。

因此,6434-(1919+4500(=15。只有15个额外的气体,这可能是由于堆栈/内存操作。

相关内容

  • 没有找到相关文章

最新更新