固体中的状态变量是什么? [英] what are state variables in solidity?

查看:12
本文介绍了固体中的状态变量是什么?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我读了一些关于storagememoryviewpure的文档,但我不完全理解它们。我有以下代码:

contract {
    struct Random {
        uint32 state;
        uint8 i;
    }

    function main() pure internal {
        Random rand = Random(seed, 0);
        ...
    }

    function get_rand(Random rand, uint8 n) pure internal returns (uint16) {
        assert(n <= 16)
        while (true) {
            if (rand.i >= 8) {
                rand.state = xorshift32(rand.state);
                rand.i = 0;
            }

            uint8 r = uint8(rand.state >> (rand.i << 4)) & 0x0f;
            rand.i += 1;

            if (r < n) {
                return r;
            }
        }
    }
}

我的问题是:

1)我应该为main中的局部变量标记storagememory吗?我应该为get_rand中的参数标记什么?

2)突变会奏效吗?比方说,我读到pure函数不能更改状态变量,而内存变量被复制。将两者都标记为storage是否足够?如果get_rand更改其参数,我是否仍应声明purefor?

谢谢

推荐答案

viewpure是描述该函数中的逻辑如何与约定状态交互的函数修饰符。如果您的约定将从存储中读取,但不向其写入,则可以使用view(或constant,这是完全相同的)修饰符(参见view functions documentation)。如果您不打算从协定状态读取或写入,并且您所做的所有操作都只使用内存变量,则它是pure function

我应该在main中为局部变量标记存储空间还是内存?我应该为get_rand中的参数标记什么?

默认情况下,结构是storage变量,它会尝试将结构写入状态。这就是您需要小心的地方,因为如果在应该使用memory的地方使用storage变量,实际上可能会覆盖您的状态。示例:

contract C {
  uint _var;

  function f() public {
    Random r;
    ...
  }
}
在本例中,r是未初始化的存储指针,它使变量指向存储插槽0。当您在结构(r.state = 100;)中设置某个变量时,它会将该值写入槽0,将覆盖_var处的值。

当您想要创建一个新的结构作为局部变量时,您需要使用memory修饰符,然后将其设置为状态变量(或将其添加到状态映射/数组)。如果要将结构从映射/数组读入局部变量,请使用storage

对于您提供的示例,您希望将其设置为memory变量。仔细阅读中的this section

突变会奏效吗?比方说,我读到纯函数不能更改状态变量,而内存变量被复制。将这两个标记都标记为存储是否足够?如果get_rand更改了它的参数,我是否仍然应该声明它是纯的?

不会,它不会更改您的合同状态。虽然局部结构变量在默认情况下是storage,但函数参数在默认情况下总是memory(甚至是结构)。在get_rand内修改rand不会修改任何状态。如果将函数更改为Access状态,则会因为pure修饰符而出现编译错误。

这篇关于固体中的状态变量是什么?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆