Solidity 中 immutable (不可变量)与constant(常量)

2020-06-01 16:40:48 浏览数 (1)

Solidity 0.6.5[1] 更新引入了一个新的关键字 immutable , 它与之前的constant常量有何不同呢?

constant 常量

constant 修饰的变量需要在编译期确定值, 链上不会为这个变量分配存储空间, 它会在编译时用具体的值替代, 因此, constant常量是不支持使用运行时状态赋值的(例如: block.number , now , msg.sender 等 )

constant 目前仅支持修饰 strings 及 值类型.

以下是常量的声明:

代码语言:javascript复制
pragma solidity >0.6.4 <0.7.0;

contract C {
    uint constant X = 32**22   8;
    string constant TEXT = "abc";
}

immutable 不可变量

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

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

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

以下是 immutable 的声明举例:

代码语言:javascript复制
contract Example {

    uint public constant decimals_constant;

    uint immutable decimals;
    uint immutable maxBalance;
    address immutable owner = msg.sender;

    function Example(uint _decimals, address _reference) public {
       decimals_constant = _decimals; // TypeError: Cannot assign to a constant variable.
       decimals = _decimals;
       maxBalance = _reference.balance; 
    }

    function isBalanceTooHigh(address _other) public view returns (bool) {
        return _other.balance > maxBalance;
    }

}

原文链接: https://learnblockchain.cn/article/1059

References

[1] Solidity 0.6.5: https://learnblockchain.cn/docs/solidity/ [2] ERC20: https://learnblockchain.cn/2018/01/12/create_token [3] Tiny熊: https://learnblockchain.cn/people/15 [4] 知乎: https://www.zhihu.com/people/xiong-li-bing [5] 微博: http://weibo.com/xionglb [6] GitHub: https://github.com/xilibi2003 [7] 登链社区: https://learnblockchain.cn/

0 人点赞