我将构造函数中的状态变量更改为数值并打印消耗的气体差异。这是我的代码。结果显示,构建BeforeDemo消耗了93915个gas,构建AfterDemo消耗了76288个gas,相差17627。我以为差异来自于1个SLOAD,但1个SLOAD不可能消耗这么多gas。为什么两者差别这么大?
contract BeforeDemo {
uint256 public constant INITIAL_SUPPLY = 10000 * (10 ** 18);
constructor() {
check(INITIAL_SUPPLY);
}
function check(uint256 supply) public {
}
}
contract AfterDemo {
constructor() {
check(10000 * (10 ** 18));
}
function check(uint256 supply) public {
}
}
没有 SLOAD,因为常量存储在字节码中,而不是存储中。您看到的 Gas 成本差异是由于合约字节码大小造成的。
使用
uint256 public constant INITIAL_SUPPLY
时,编译器会为其生成一个公共 getter 函数:
function INITIAL_SUPPLY() public pure returns(uint256) { return 10000 * (10 ** 18) }
这意味着合约部署上运行更多的操作码,从而产生更大的合约字节码。
合约部署成本 32k Gas + 200 每字节。在混音时,我检查了 BeforeDemo 的长度为 373 字节,AfterDemo 的长度为 284 字节。
(373 - 284)* 200 = 17800
所以你得到大约。由于合约字节码大小的原因,部署时存在 17800 Gas 差异。