首页 > 世链号 > Solidity 中 immutable (不可变量) 与 constant(常量)
币小葱  

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

摘要:引入了一个新的关键字 immutable 它与之前的 constant 常量有何不同呢 ?

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

constant 常量

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

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

以下是常量的声明 :

 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 的声明举例 :

 * 
 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

来源链接:mp.weixin.qq.com
来源:登链社区

免责声明
世链财经作为开放的信息发布平台,所有资讯仅代表作者个人观点,与世链财经无关。如文章、图片、音频或视频出现侵权、违规及其他不当言论,请提供相关材料,发送到:2785592653@qq.com。
风险提示:本站所提供的资讯不代表任何投资暗示。投资有风险,入市须谨慎。
世链粉丝群:提供最新热点新闻,空投糖果、红包等福利,微信:juu3644。