Solidity 小白教程:9. 常数 constant 和 immutable

Solidity 小白教程:9. 常数 constant 和 immutable

这一讲,我们介绍solidity中两个关键字,constant(常量)和immutable(不变量)。状态变量声明这个两个关键字之后,不能在合约后更改数值;并且还可以节省gas。另外,只有数值变量可以声明constantimmutablestringbytes可以声明为constant,但不能为immutable

constant 和 immutable

constant

constant变量必须在声明的时候初始化,之后再也不能改变。尝试改变的话,编译不通过。

// constant变量必须在声明的时候初始化,之后不能改变
    uint256 constant CONSTANT_NUM = 10;
    string constant CONSTANT_STRING = "0xAA";
    bytes constant CONSTANT_BYTES = "WTF";
    address constant CONSTANT_ADDRESS = 0x0000000000000000000000000000000000000000;

immutable

immutable变量可以在声明时或构造函数中初始化,因此更加灵活。

// immutable变量可以在constructor里初始化,之后不能改变
    uint256 public immutable IMMUTABLE_NUM = 9999999999;
    address public immutable IMMUTABLE_ADDRESS;
    uint256 public immutable IMMUTABLE_BLOCK;
    uint256 public immutable IMMUTABLE_TEST;

你可以使用全局变量例如address(this)block.number ,或者自定义的函数给immutable变量初始化。在下面这个例子,我们利用了test()函数给IMMUTABLE_TEST初始化为9

// 利用constructor初始化immutable变量,因此可以利用
    constructor(){
        IMMUTABLE_ADDRESS = address(this);
        IMMUTABLE_BLOCK = block.number;
        IMMUTABLE_TEST = test();
    }

    function test() public pure returns(uint256){
        uint256 what = 9;
        return(what);
    }

在 remix 上验证

  1. 部署好合约之后,通过 remix 上的getter函数,能获取到constantimmutable变量初始化好的值。image.png
  2. constant变量初始化之后,尝试改变它的值,会编译不通过并抛出**TypeError: Cannot assign to a constant variable.**的错误。

image.png

  1. immutable变量初始化之后,尝试改变它的值,会编译不通过并抛出**TypeError: Immutable state variable already initialized.**的错误。image.png

总结

这一讲,我们介绍solidity中两个关键字,constant(常量)和immutable(不变量),让不应该变的变量保持不变。这样的做法能在节省gas的同时提升合约的安全性。

猜你喜欢

转载自blog.csdn.net/weixin_52148451/article/details/132666112
今日推荐