固体中的状态变量是什么? [英] what are state variables in solidity?
本文介绍了固体中的状态变量是什么?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
storage
、memory
和view
、pure
的文档,但我不完全理解它们。我有以下代码:
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
中的局部变量标记storage
或memory
吗?我应该为get_rand
中的参数标记什么?
2)突变会奏效吗?比方说,我读到pure
函数不能更改状态变量,而内存变量被复制。将两者都标记为storage
是否足够?如果get_rand
更改其参数,我是否仍应声明pure
for?
谢谢
推荐答案
view
和pure
是描述该函数中的逻辑如何与约定状态交互的函数修饰符。如果您的约定将从存储中读取,但不向其写入,则可以使用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屋!
查看全文