带有结构的永恒存储模式

时间:2019-02-09 22:59:30

标签: design-patterns ethereum solidity smartcontracts

我正在进行可升级的智能合约设计,我发现永恒的存储模式将非常有用(键值对中的逻辑和数据分开),但是,如果值是基本类型,这似乎很合适(uint,字节,地址,布尔值..),但是当涉及诸如结构之类的复杂类型时,分别存储和访问每个字段有意义吗?

1 个答案:

答案 0 :(得分:1)

如果问题是:“但是当涉及诸如结构之类的复杂类型时,分别存储和访问每个字段有意义吗?”

那么答案是,这不是理性,而是唯一的方法。永恒的存储为您提供了一种存储现在正在使用以及将来将要使用的每个可能数据的方法。为此,它为每种数据类型提供了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"));
}