首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >常量状态变量是否缓存在EVM中?

常量状态变量是否缓存在EVM中?
EN

Ethereum用户
提问于 2018-11-18 18:46:27
回答 1查看 463关注 0票数 1

来自文档

状态变量常量:不允许分配(初始化除外),不占用存储槽。

这是否意味着EVM使用某种DHT或稀疏默克尔树在所有契约中缓存常量?

EN

回答 1

Ethereum用户

回答已采纳

发布于 2018-11-18 19:19:38

我认为更容易的是将constant存储变量简单地放在编译代码中(就像在常规的宏或常量语言中那样),实际上每个变量的出现及其值都是预先知道的,因此在需要时可以将指令PUSH <constant-value>放入编译代码中。它将花费很少的天然气单位,3,并只有在需要!

你不必相信我,你可以尝试一个简单的例子(用混合IDE):

代码语言:javascript
复制
pragma solidity ^0.4.24;

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

如果您签入已编译的代码(尤其是程序集部分),您将注意到一个PUSH 137指令(您可以更改常量的值,并看到指令相应地发生变化)。

附加说明

常量状态变量(即常量!)应该在编译时知道,所以这样的例子如下:

代码语言:javascript
复制
uint8 constant x;

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

只是不起作用(我在0.4.24节中测试了它)。

同样的例子也适用于不那么危险的例子(理论上应该有效),比如以下例子:

代码语言:javascript
复制
uint8 constant x;

constructor () public { 
    x = 5;
}
票数 3
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/62595

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档