Solidity 中 immutable (不可变量)与constant(常量)
Solidity 0.6.5 中关键字 immutable 怎么用?
[Solidity 0.6.5](https://learnblockchain.cn/docs/solidity/) 更新引入了一个新的关键字 `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](https://learnblockchain.cn/2018/01/12/create_token)代币用来指示小数位置的 `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 作者: [Tiny熊](https://learnblockchain.cn/people/15) , 欢迎大家在[知乎](https://www.zhihu.com/people/xiong-li-bing),[微博](http://weibo.com/xionglb),[GitHub](https://github.com/xilibi2003) 关注我. 本文首发于[登链社区](https://learnblockchain.cn/)
Solidity 0.6.5 更新引入了一个新的关键字 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代币用来指示小数位置的 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 作者: Tiny熊 , 欢迎大家在知乎,微博,GitHub 关注我. 本文首发于登链社区
区块链技术网。
- 发表于 2020-05-27 12:19
- 阅读 ( 5360 )
- 学分 ( 82 )
- 分类:Solidity
- 专栏:全面掌握Solidity智能合约开发
评论