从 Solidity 中的映射中删除映射

Ste*_*own 5 ethereum solidity

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

它可以作为 m_Map[strCampaignName][addrRecipient] 访问,活动可以有多个收件人...

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

这种情况应该如何处理?Min:我希望 m_Map[strCampaignName] 为空,Max:我不想在上面浪费内存。

先感谢您。

Ada*_*nis 4

正如您所说,您无法mapping在 Solidity 中删除 a 。“清除”数据的唯一方法是迭代键(使用存储键的单独数组)并删除各个元素。但是,您对成本的担忧是正确的......根据映射的大小,您可能会遇到气体消耗问题。

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

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

mapping(address => DataStruct) m_Map;
Run Code Online (Sandbox Code Playgroud)

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

  • Solidity 中不存在 null。所有内容都是使用与数据类型相对应的默认零值创建的(0 表示整数,0x0 表示地址,false 表示布尔值等)。删除元素与将值设置为 0 相同。存在存储限制,但您无法达到它(2^256 个插槽,每个插槽 32 字节)。您需要为更新存储中的数据付费,但映射查找是恒定的,因此总体大小不会成为问题。 (4认同)