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;
}
}