Ethereum 从实体映射中删除映射

Ethereum 从实体映射中删除映射,ethereum,solidity,Ethereum,Solidity,我有这样的想法: 映射(地址=>mapping(字符串=>uint))m_映射 它可以通过以下方式访问: m_Map[strcompaignname][addrRecipient],活动可以有多个收件人 现在,在某个时刻(ICO失败),我需要删除所有收件人的活动。我认为这并不简单 删除m_地图[strCompaignName]将起作用。 如果我使用 m_Map[strCompaignName]=null,我想数据不会被删除。。。 如果我反复浏览所有收件人的列表,我会用完汽油 这种情况应该如何处理

我有这样的想法: 映射(地址=>mapping(字符串=>uint))m_映射

它可以通过以下方式访问: m_Map[strcompaignname][addrRecipient],活动可以有多个收件人

现在,在某个时刻(ICO失败),我需要删除所有收件人的活动。我认为这并不简单 删除m_地图[strCompaignName]将起作用。 如果我使用 m_Map[strCompaignName]=null,我想数据不会被删除。。。 如果我反复浏览所有收件人的列表,我会用完汽油

这种情况应该如何处理? 敏:我希望m_Map[strcompaignname]为空, 麦克斯:我不想再在上面浪费内存了


提前感谢。

如您所述,您不能删除完整的
映射。“清除”数据的唯一方法是遍历键(使用存储键的单独数组)并删除单个元素。但是,您担心成本是正确的……根据映射的大小,您可能会遇到气体消耗问题

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

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

mapping(address => DataStruct) m_Map;

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

这样行吗:m_Map[strcompaignname]=null?或者m_Map[strcompaignname]=新映射……我关心的是这个东西的大小。一个成功的ICO可以很容易地管理10000多个地址——我是否需要为随身携带而“付费”?有限制吗?在坚固性上没有空值。所有内容都是使用与数据类型对应的默认零值创建的(0表示int,0x0表示addresses,false表示bool,等等)。删除元素与将值设置为0相同。存在存储限制,但您无法达到该限制(2^256个插槽,每个插槽32字节)。更新存储中的数据需要付费,但映射查找是恒定的,因此总体大小不会成为问题。正在寻找重置整个映射的选项,如删除整个实例并分配新实例。为什么这么复杂?@AnupamKumar-因为合同中的数据存储为链(因此称为“区块链”),而当前状态是通过获取初始值并在后续交易中处理所有更新来确定的。如果你只是想消灭一切,为什么不部署另一个契约呢?