Mapping
MultiSig 合約重置簽名(映射)
我有一個多重簽名契約,可以啟動或停用實體(由地址表示)。這些是我為表示單個實體 (_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 上的子圖進行過濾