为什么在构造函数中删除 SLOAD 可以节省这么多 Gas?

问题描述 投票:0回答:1

我将构造函数中的状态变量更改为数值并打印消耗的气体差异。这是我的代码。结果显示,构建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 {

    }

}
solidity smartcontracts
1个回答
1
投票

没有 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 差异。

© www.soinside.com 2019 - 2024. All rights reserved.