34-Solidity8.0-不可变量 immutable

291 阅读1分钟

immutable

immutable 修饰的变量是在部署的时候确定变量的值, 它在构造函数中赋值一次之后,就不在改变, 这是一个运行时赋值, 就可以解除之前 constant 不支持使用运行时状态赋值的限制.

immutable不可变量同样不会占用状态变量存储空间, 在部署时,变量的值会被追加的运行时字节码中, 因此它比使用状态变量便宜的多, 同样带来了更多的安全性(确保了这个值无法在修改).

这个特性在很多时候非常有用, 最常见的如  ERC20 代币用来指示小数位置的  decimals  变量, 它应该是一个不能修改的变量, 很多时候我们需要在创建合约的时候指定它的值, 这时 immutable 就大有用武之地, 类似的还有要保存 创建者地址, 关联合约地址.

总结:既可以像常量一样节省gas费,又可以在合约部署的时候再给它定义变量值

immutable必须在部署合约的时候给它赋值,它才能像常量一样工作。

源码:

pragma solidity ^0.8.7;

contract Immutable {
    address public immutable owner = msg.sender;

    uint public x;
    function foo() external {
        require(msg.sender == owner);
        x += 1;
    }
}