Solidity

在不知道索引的情況下刪除動態數組元素的最佳方法

  • March 16, 2019

我有這個映射

 mapping(bytes32 => address[]) public authorisation;

這將雜湊與授權使用者列表映射。

我有一個要添加和確認的功能 - 這些工作正常且不是問題。但是現在我需要添加一個刪除功能,在給定雜湊和地址的情況下,該地址被撤銷訪問/權限

function deletePermission(bytes32 hash, address user) public {// get index of element with the address = user, then delete this element from the array.}

我已經看過這裡,但沒有找到任何索引未知的解決方案。我知道您可以遍歷數組,直到找到與地址匹配的元素,但這將非常昂貴(就 gas 而言)。有沒有更有效的方法來做到這一點?謝謝

添加到數組時,您還可以儲存添加到的索引。您可以使用第二個映射來做到這一點:

mapping(bytes32 => mapping(address => uint256)) public authorisation_arrayIndex;

添加到authorisation映射時:

authorisation_arrayIndex[hash][addr] = authorisation[hash].length;
authorisation[hash].push(addr);

此外,也許您應該考慮直接使用一個映射而不是數組和數組索引映射。例如:

mapping(bytes32 => mapping(address => bool)) public authorisation;

這樣您就可以輕鬆添加和刪除:

authorisation[hash][addr] = true;
authorisation[hash][addr] = false;

…缺點是您無法遍歷它們。

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