Solidity
檢查和插入非奇偶數組地址的有效方法
我有一個需要滿足 dapp 的以下要求。
- 插入地址數組
- 數組必須是唯一的。如果其中一個數組地址已經存在,則拒絕並還原整個操作。
- dapp 必須能夠檢索使用者地址列表
- dapp 必須能夠根據使用者地址輸入檢測使用者地址是否存在
筆記:
- 必須滿足上述要求。
- 完整的驗證檢查必須由智能合約完成。(不能單獨依賴客戶端檢查)。
嘗試使用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; }