从Solidity

时间:2018-01-30 06:58:14

标签: ethereum solidity

我有这样的事情: mapping(address => mapping(string => uint))m_Map;

可以访问 m_Map [strCampaignName] [addrRecipient],广告系列可以有多个收件人...

现在在某个时候(ICO失败),我需要删除所有收件人的广告系列。我不觉得简单 删除m_Map [strCampaignName]将起作用。 如果我使用 m_Map [strCampaignName] = null,我认为数据不会被删除... 如果我遍历所有收件人的列表,我将耗尽气体......

如何处理这种情况? 敏:我希望m_Map [strCampaignName]为空, 马克斯:我想停止在上面浪费记忆。

提前谢谢。

2 个答案:

答案 0 :(得分:0)

如果您拥有映射的所有 addrRecipient

delete m_Map[strCampaignName][addrRecipient];

有效。

答案 1 :(得分:-1)

如您所述,您无法删除Solidity中的mapping。 “清除”数据的唯一方法是遍历键(使用存储键的单独数组)并删除单个元素。但是,关注成本是正确的......根据映射的大小,您可能会遇到耗气问题。

解决此问题的常用方法是在映射中使用struct进行软删除:

struct DataStruct {
  mapping(string => uint) _data;
  bool _isDeleted;
}

mapping(address => DataStruct) m_Map;

现在,删除条目只需要设置标记:m_Map[someAddr]._isDeleted = true;