记录和跟踪映射结构的变化

Posted

技术标签:

【中文标题】记录和跟踪映射结构的变化【英文标题】:Logging and tracing changes of mapping a struct 【发布时间】:2021-09-04 13:37:00 【问题描述】:

我有一个结构并在映射中使用它。

struct Cotton
    uint256 balance;
    string form;
    address producer;
    string certificate;

mapping(address=>Cotton) public cotton;

我能够访问 cotton 的最后一个值。但是,一旦有很多交易,我也需要访问它的先前状态。 我尝试发出一个事件,但它不接受结构作为输入参数。 有没有办法检索 cotton 上的所有更改?

【问题讨论】:

【参考方案1】:

首先,事件不支持结构,因为当前最新版本的solidity(0.8.6),您需要将特定的值类型变量(地址,uint等)传递给事件。

...

// Event for cotton
event oracleCotton(uint256 balance, string form, address producer, string certificate);

...

// Emit event.
emit oracleCotton(cotton.balance, cotton.form, cotton.producer, cotton.certificate);

...

此外,无法访问以前的数据状态,因为当您将新的 Cotton 分配给地址时,它将覆盖以前的地址。

您的问题的解决方案类似于以下内容:

...

struct Cotton
    uint256 balance;
    string form;
    address producer;
    string certificate;


struct CottonWrapper
    uint256 counter;
    Cotton[] cottonHistory;     


mapping(address => CottonWrapper) public cotton;

...

然后……

// Logic to iterate over each cotton of an address.
for (uint i = cotton[address].counter; i > 0; i--) 
  Cotton memory c = cotton[address].cottonHistory[i];
  
  // Now here you can do whatever you want with that cotton.
  emit oracleCotton(c.balance, c.form, c.producer, c.certificate);
  
  ...


【讨论】:

以上是关于记录和跟踪映射结构的变化的主要内容,如果未能解决你的问题,请参考以下文章

什么是Intel LBR(上次分支记录),BTS(分支跟踪存储)和AET(体系结构事件跟踪)?

如何跟踪 PostgreSQL 中任何函数的变化

Python跟踪多列值的变化

Spring LTW+DDD实现业务数据变化的自动跟踪与回退

SQL查询以跟踪新订单或旧订单中的余额变化,没有日期

内存高效结构,以原始顺序跟踪数组的子集