Evm

常量狀態變數是否記憶體在 EVM 中?

  • November 20, 2018

文件

狀態變數的常量:不允許賦值(初始化除外),不佔用儲存槽。

這是否意味著 EVM 使用某種DHT或稀疏 Merkle 樹在所有合約中記憶體常量?

我認為將constant儲存變數簡單地放在編譯程式碼中更容易(就像在帶有 MACRO 或 CONSTANTS 的傳統語言中一樣),實際上每次出現及其值都是預先知道的,因此可以將編譯程式碼放入需要時隨時指導PUSH <constant-value>。它將花費很少的氣體單位,3 並且僅在需要時!

您不必相信我,您可以嘗試一個簡單的範例(使用 REMIX IDE):

pragma solidity ^0.4.24;

contract C {
   uint8 constant x = 137;
   uint y;
   constructor () public {
      y = 1 + x;
   }
}

如果您簽入已編譯的程式碼(特別是在彙編部分),您會注意到一條PUSH 137指令(您可以更改常量的值並查看指令相應地更改)。

附加說明

常量狀態變數(即常量!)在編譯時應該是已知的,所以像這樣的例子:

uint8 constant x;

constructor (uint _x) public { 
   x = _x;
}

根本不起作用(我在 v. 0.4.24 中對其進行了測試)。

對於不太危險的範例(理論上應該有效)也是如此,例如以下範例:

uint8 constant x;

constructor () public { 
   x = 5;
}

引用自:https://ethereum.stackexchange.com/questions/62595