Solidity語言學習筆記————4、常量

FLy_鵬程萬里發表於2018-06-22

常量(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");
}


相關文章