Solidity

保留一組有限的地址(Solidity)

  • October 6, 2019
struct Data {
 ...
}

contract Court {
 mapping(address => Data) subcourts;
}

我想跟踪這個映射的所有鍵的一個小的有限集(可以添加或刪除)。

更好的方法是什麼?

  1. 將地址數組作為新欄位Court
  2. 添加一個新address欄位來Data製作一個鍊錶;
  3. 添加兩個新address欄位以Data創建雙向鍊錶。

假設順序無關緊要(由“集合”暗示),映射和數組的組合可以在恆定時間內處理集合操作。訣竅是跟踪數組中每個元素的位置,並將元素交換到末尾以進行刪除。我寫了一篇關於這種模式的部落格文章:https ://programtheblockchain.com/posts/2018/06/03/storage-patterns-set/ 。

這是該文章的完成程式碼:

pragma solidity ^0.4.24;

contract Set {
   bytes32[] public items;

   // 1-based indexing into the array. 0 represents non-existence.
   mapping(bytes32 => uint256) indexOf;

   function add(bytes32 value) public {
       if (indexOf[value] == 0) {
           items.push(value);
           indexOf[value] = items.length;
       }
   }

   function remove(bytes32 value) public {
       uint256 index = indexOf[value];

       require(index > 0);

       // move the last item into the index being vacated
       bytes32 lastValue = items[items.length - 1];
       items[index - 1] = lastValue;  // adjust for 1-based indexing
       indexOf[lastValue] = index;

       items.length -= 1;
       indexOf[value] = 0;
   }

   function contains(bytes32 value) public view returns (bool) {
       return indexOf[value] > 0;
   }

   function count() public view returns (uint256) {
       return items.length;
   }
}

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