簡體   English   中英

如何使用solidity有效地將大量地址存儲在智能合約中?

[英]How to efficiently store large amount of addresses in a smart contract using solidity?

我正在開發一個用戶需要存入資金的智能合約。 類似於 DeFi 項目。 我還是 Solidity 開發的新手,想知道您能否向我推薦一種存儲這些用戶地址的有效方法? 我發現了一個類似的問題,我知道將它們存儲在數組中效率不高,因為當我遍歷它時,成本會很高。 我看到了使用地圖的其他建議,這些都是不錯的選擇,但是,我不知道它們是否能解決我的問題。

我的想法是創建一個智能合約->存儲交互/存入資金的用戶地址->將這些地址轉移到另一個將支付利息的智能合約等。

我認為大多數 DeFi 項目應該已經解決了這個問題,因為他們需要存儲用戶的地址,所以你能給我一些關於如何完成的提示嗎?

您可以使用映射的組合。 映射就像 javascript 中的對象或 python 中的字典。

您想跟蹤存款的地址。 為此,您可能仍需要將它們保存在一個數組中以用於不同的目的。

// keep private and then set a getter.
address[] private fundersAddresses;

還設置了一個映射來跟蹤索引到地址。 為此,我還可以設置一個變量來跟蹤數組的索引

// you could call fundersAddresses.length and it's time complexity most likely O(1)  but since I am not 100% sure, I set up a index variable 
uint256 private index; 
mapping(uint256=>address) private indexToAddress

現在,如果您編寫一個函數來存儲資助者

function storeFunders() public payable {
   // add some logic
   fundersAddresses.push(msg.sender);
   index++;
   // then also store in a mapping
  
   indexToAddress[index]=msg.sender    
}

現在,如果您想獲取數組中的第 i 個項目,則需要 O(1) 時間,因為您將查找映射而不是調用array[i] array[i]的時間復雜度是 O(n) 因為以太坊引擎會遍歷數組直到第 i 個索引。

function getIndexedAddress (uint index) public returns(address){
    require(index<fundersAddresses.length,"Index out of bounds")
    return indexToAddress[index]  
}

這只是一個簡單的例子。 根據合同的需要,您可能會設置不同的結構。

如果地址在部署時是最終地址,則可以使用 Merkle 樹。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM