gas优化

gas优化: constant和immutable

2022-11-03  本文已影响0人  梁帆

constant和immutable都代表不可变常量。

1.constant和immutable的主要区别

constant只能在声明的时候初始化,而immutable可以在构造函数中初始化:

contract A {
    uint256 constant MAX_VALUE = 100;
}

contract B {
    uint256 immutable MAX_VALUE = 100;
    uint256 immutable CONS_VALUE;
    constructor() {
        CONS_VALUE = 120;
    }
}

2.部署时的gas消耗量对比

有以下3个合约:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;

contract A {
    uint256  maxValue = 100;
}

contract B {
    uint256 constant MAX_VALUE = 100;
}

contract C {
    uint256 immutable MAX_VALUE = 100;
}

部署这些合约的时候,gas消耗量如下:

合约 修饰符 gas消耗量
A 102626
B constant 77126
C immutable 77448

可以发现定义常量的合约B、C在部署时消耗的gas要比A少很多,而且constant修饰的合约是最省gas的。

3.非只读函数函数中读取时的gas消耗量

我们要对比以上三个合约中,读取时的gas消耗量大小。由于只读函数是不消耗gas的,所以为了方便我们探查,可以构造一个非只读函数,所以就有以下三个合约:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;

contract A {
    uint256  MAX_VALUE = 100;
    uint256 x = 0;

    function get() external returns (uint256) {
        x = 1;
        return MAX_VALUE;
    }
}

contract B {
    uint256 constant MAX_VALUE = 100;
    uint256 x = 0;

    function get() external returns (uint256) {
        x = 1;
        return MAX_VALUE;
    }
}

contract C {
    uint256 immutable MAX_VALUE = 100;    
    uint256 x = 0;

    function get() external returns (uint256) {
        x = 1;
        return MAX_VALUE;
    }
}

但我们部署完成后,执行get函数时,gas消耗量如下:

合约 修饰符 gas消耗量
A 52432
B constant 50017
C immutable 50017

可以看到,常量读取时的gas消耗要比非常量要少。

上一篇 下一篇

猜你喜欢

热点阅读