Evm
常量狀態變數是否記憶體在 EVM 中?
從文件:
狀態變數的常量:不允許賦值(初始化除外),不佔用儲存槽。
這是否意味著 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; }