Solidity语言学习笔记————4、常量

常量(Constant State Variables)

状态变量可以被定义为constant。这样的话,它必须在编译期间通过一个表达式赋值。 
这种情况下,以下功能的表达式不被允许:

  • 访问storage
  • 访问区块链数据,如nowthis.balanceblock.number
  • 访问合约执行的中间数据,如msg.gas
  • 向外部合约发起调用。

可能会造成内存分配副作用表达式是允许的,但对其它内存对象的产生副作用的表达式不被允许。内置的函数keccak256keccak256ripemd160ecrecoveraddmodmulmod可以允许调用,即使它们调用的是外部合约。

允许内存分配带来可能的副作用的原因是,因为这将允许构建复杂的对象,比如,查找表。虽然当前的特性尚未完整支持。

编译器并不会为常量在storage上预留空间,每个使用的常量都会被对应的常量表达式所替换,也许优化器会直接替换为常量表达式的结果值。

不是所有的类型都支持常量,当前支持的仅有值类型和字符串。

pragma solidity ^0.4.0;

contract C {
    uint constant x = 32**22 + 8;
    string constant text = "abc";
    bytes32 constant myHash = keccak256("abc");
}


猜你喜欢

转载自blog.csdn.net/fly_hps/article/details/80764138