【发布时间】:2019-02-13 03:16:59
【问题描述】:
我正在研究可升级的智能合约设计,我发现永久存储模式非常有用(在键值对中分离逻辑和数据),但是,如果值是基本类型,它似乎适合(uint, bytes, address, bool..),但是当涉及到结构体等复杂类型时,分别存储和访问每个字段是否有意义?
【问题讨论】:
标签: design-patterns ethereum solidity smartcontracts
我正在研究可升级的智能合约设计,我发现永久存储模式非常有用(在键值对中分离逻辑和数据),但是,如果值是基本类型,它似乎适合(uint, bytes, address, bool..),但是当涉及到结构体等复杂类型时,分别存储和访问每个字段是否有意义?
【问题讨论】:
标签: design-patterns ethereum solidity smartcontracts
如果问题是:“但是当涉及到结构等复杂类型时,分别存储和访问每个字段是否有意义?”
那么答案就是,这不是意义的问题,是唯一的方法。永恒存储为您提供了一种方法来存储您现在使用的每一个可能的数据,并且您将在未来使用。为此,它为您提供了每种数据类型的 256 位映射。
如果问题是你将如何在永恒存储中模拟一个结构,我会给你我的 2 美分:
假设您要翻译以下代码:
struct thing{
uint a;
}
mapping(byte32 => thing) things;
insertThing(byte32 index, uint v) ... {
things[index].a = v;
}
getThingValue(byte32 thingIndex){
return things[thingIndex].a;
}
进入使用永久存储的代码。我的 2 美分如下:
[...]
EternalStorage s;
insertThing(byte32 index, uint v){
s.setUint(keccak256("things", index, "a"), v);
}
getThingValue(byte32 index) returns (uint){
return s.getUint(keccak256("things", index, "a"));
}
【讨论】: