Solidity

檢查和插入非奇偶數組地址的有效方法

  • November 25, 2018

我有一個需要滿足 dapp 的以下要求。

  1. 插入地址數組
  2. 數組必須是唯一的。如果其中一個數組地址已經存在,則拒絕並還原整個操作
  3. dapp 必須能夠檢索使用者地址列表
  4. dapp 必須能夠根據使用者地址輸入檢測使用者地址是否存在

筆記:

  1. 必須滿足上述要求。
  2. 完整的驗證檢查必須由智能合約完成。(不能單獨依賴客戶端檢查)。

嘗試使用3 for 循環似乎不是一個非常聰明的方法,因為它成為一項成本昂貴的操作。不幸的是,這是我能想到的滿足上述條件的唯一解決方案。有人有處理這個問題的經驗嗎?

// probably only one of mapping or list is needed
address[] public addressList;
mapping (address => bool) public userAddr; 


   function insertAddress(address[] addressUser) public returns (bool) {
       // loop addressUser and check if it is unique
       // loop addressUser and check if it exists in mapping
       // loop and push addressUser to addressList + insert addressUser to userAddr


       return true;
   }

看到您的要求,我會這樣做:

address[] public addressList;
mapping (address => bool) public userAddr; 

function insertAddress(address[] addressUser) public returns (bool) {
   // used to check adressUser uniqueness
   mapping (address => bool) memory uniq;
   for(uint i = 0; i < addressUser.length, i++) {
       address addr = addressUser[i];
       // check if addressUser is unique
       require(uniq[addr] == false);
       uniq[addr] = true;
       // if addr is not already list
       if (userAddr[addr] == false) {
           userAddr[addr] = true;
           addressList.push(addr);
       }
   }

   return true;
}

編輯:

看到另一個合約後,您可以使用此處的方法並要求所有地址按升序發送。由於記憶體分配較少,因此在 gas 方面的成本可能較低。

那會做:

function insertAddress(address[] addressUser) public returns (bool) {
   // used to check adressUser uniqueness
   address lastAddr = addres(0);
   for(uint i = 0; i < addressUser.length, i++) {
       address addr = addressUser[i];
       // check if addressUser is unique
       // by forcing all address to be sent 
       // in increasing order
       require(addr > lastAddr);
       lastAddr = addr;
       // if addr is not already in list
       if (userAddr[addr] == false) {
           userAddr[addr] = true;
           addressList.push(addr);
       }
   }

   return true;
}

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