这是我的代码。
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。
第三次调用函数时,气体使用量与第二次相同
我测试了其他功能,结果是一样的。
有两个主要贡献:从存储器中读取地址,然后触摸它。
-
通过执行
demo.add1(1, 2);
,代码首先需要读取(SLOAD(存储中保存的demo
的地址。第一次的天然气成本是2100(冷接入(,然后是100(热接入(。文档 -
调用演示合同将";触摸";其地址。第一次(冷接入(的天然气成本是2600,然后是100。文档
这解释了2000+2500=4500的差异。
因此,6434-(1919+4500(=15。只有15个额外的气体,这可能是由于堆栈/内存操作。