[英]How to write to an arbitrary storage slot using assembly in Solidity smart contracts?
[英]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.