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消耗要比非常量要少。