我将构造函数中的状态变量更改为一个数值,并打印消耗的气体的差异。这是我的代码。结果表明,构建BeforeDemo消耗93915 gas,构建AfterDemo消耗76288 gas,差值为17627 gas。我以为差异来自于一个SLOAD,但是一个SLOAD不可能花费那么多汽油。为什么两者之间有这么大的区别?
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 cos的差异是由于合约字节码的大小。
当使用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气体差异。