9. 常数
WTF Solidity极简入门: 9. 常数 constant和immutable
我最近在重新学 Solidity,巩固一下细节,也写一个“WTF Solidity极简入门”,供小白们使用(编程大佬可以另找教程),每周更新 1-3 讲。
所有代码和教程开源在 github: github.com/AmazingAng/WTF-Solidity
这一讲,我们介绍Solidity中和常量相关的两个关键字,constant
(常量)和immutable
(不变量)。状态变量声明这两个关键字之后,不能在初始化后更改数值。这样做的好处是提升合约的安全性并节省gas
。
另外,只有数值变量可以声明constant
和immutable
;string
和bytes
可以声明为constant
,但不能为immutable
。
constant和immutable
constant
constant
变量必须在声明的时候初始化,之后再也不能改变。尝试改变的话,编译不通过。
1 | // constant变量必须在声明的时候初始化,之后不能改变 |
immutable
immutable
变量可以在声明时或构造函数中初始化,因此更加灵活。在Solidity v0.8.21
以后,immutable
变量不需要显式初始化,未显式初始化的immutable
变量将使用数值类型的初始值(见 8. 变量初始值)。反之,则需要显式初始化。
若immutable
变量既在声明时初始化,又在constructor中初始化,会使用constructor初始化的值。
1 | // immutable变量可以在constructor里初始化,之后不能改变 |
你可以使用全局变量例如address(this)
,block.number
或者自定义的函数给immutable
变量初始化。在下面这个例子,我们利用了test()
函数给IMMUTABLE_TEST
初始化为9
:
1 | // 利用constructor初始化immutable变量,因此可以利用 |
在remix上验证
-
部署好合约之后,通过remix上的
getter
函数,能获取到constant
和immutable
变量初始化好的值。 -
constant
变量初始化之后,尝试改变它的值,会编译不通过并抛出TypeError: Cannot assign to a constant variable.
的错误。 -
immutable
变量初始化之后,尝试改变它的值,会编译不通过并抛出TypeError: Immutable state variable already initialized.
的错误。
总结
这一讲,我们介绍了Solidity中两个关键字,constant
(常量)和immutable
(不变量),让不应该变的变量保持不变。这样的做法能在节省gas
的同时提升合约的安全性。