【问题标题】:Eternal storage pattern with structs带有结构的永恒存储模式
【发布时间】:2019-02-13 03:16:59
【问题描述】:

我正在研究可升级的智能合约设计,我发现永久存储模式非常有用(在键值对中分离逻辑和数据),但是,如果值是基本类型,它似乎适合(uint, bytes, address, bool..),但是当涉及到结构体等复杂类型时,分别存储和访问每个字段是否有意义?

【问题讨论】:

  • 取决于...如果您的数据差异很大,您可以查看json(或xml),或者如果您始终拥有相同的表格数据,则可以查看csv。如果没有样本数据以及您想用它做什么,这个问题很难回答。对于这个网站来说可能太宽泛了。

标签: design-patterns ethereum solidity smartcontracts


【解决方案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"));
}

【讨论】:

  • 非常感谢@Fernando 这个漂亮的插图,我知道它是如何工作的,如果我的结构包含两个字段(uint a,地址 b)怎么办,我的问题是我们必须向 EternalStorage 发送两个事务以存储我的事物实例,并访问两次 s 以检索它(如果我的结构包含 10 个字段,每个字段存储 10 个事务怎么办)?有没有一种有效的方法来解决这种情况?
  • 如果我没记错的话,这就是您为拥有 100% 通用存储所付出的代价。任何解决方法都将以通用性为代价。但我很想知道是否有人开发了解决方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-02
  • 2020-11-03
  • 2023-03-21
  • 2020-10-09
  • 2013-03-27
  • 1970-01-01
相关资源
最近更新 更多