Mapping

MultiSig 合約重置簽名(映射)

  • May 24, 2021

我有一個多重簽名契約,可以啟動或停用實體(由地址表示)。這些是我為表示單個實體 (_entityIdentity) 和實體列表 (_entityStruct) 而創建的結構

struct _entityIdentity{
   bool _activated;
   uint256 _addValidations;
   mapping(address => bool) _AddValidated;
   uint256 _removeValidations;
   mapping(address => bool) _RemoveValidated;
}

struct _entityStruct{
   mapping(address => _entityIdentity) _entities;
   address[] _activatedEntities;
}

這個想法是:

  • 為了啟動實體“X”需要驗證(來自特定的所有者地址)。
  • _AddValidated 跟踪已經驗證實體啟動的地址
  • _addvalidations 跟踪收到的驗證數量
  • 當達到 X 時 _activate 設置為 TRUE
  • 僅使用其他屬性(_RemoveValidated,_removeValidations)停用的相同想法

我遇到的問題是,當我想刪除實體時,我只需執行以下操作:delete(entity)(實體的類型為 _entityIdentity),顯然這將正確設置為布爾值 false,uint256 為 0,但映射不會被重置為假……

是否有特定的模式/建議來處理這個問題?

我發現的唯一解決方案是用數組替換映射,並通過程式碼確保地址不會被複製。數組可以很容易地通過對它們使用“刪除”來刪除。

solidity 中的所有變數的預設值為 0,布爾鍵映射具有錯誤值,因此您可以直接將它們顯式設置為預設值,而不是使用 delete,這將允許您像使用 delete 時一樣獲得 gas 退款,但在這裡您可以重置您的映射也可以使用 UI 上的子圖進行過濾

引用自:https://ethereum.stackexchange.com/questions/98814