Storage
一組字元串中的成員資格
我正在尋找可靠的幫助來儲存一組字元串並檢查該集合中的成員資格。我對此有一個具體和抽象的問題:
具體的
什麼是可靠的資料結構,它給了我一個(可能僅附加的)我可以詢問成員資格的集合?例如,我正在尋找類似的東西:
myset = ["a", "b", "c"] # registers my set on-chain "d" in myset # return True or False
此外,在沒有大量數據重複的情況下,是否有更好或更差的方法來使用這種資料結構?
myset
如果有一百萬個成員,答案會改變嗎?抽象的
這樣的事情是如何在幕後實現的?成員資格的讀取訪問測試似乎是可能的,但由於鍊是不可變的,那麼如何實際更新這樣的列表?
A
mapping
就是你所需要的:pragma solidity ^0.4.25; contract Test { mapping(string => bool) seen; function add(string foo) external { seen[foo] = true; } function alreadySeen(string foo) external view returns (bool) { return seen[foo]; } }
合約儲存是可變的。將區塊鏈稱為“不可變”可能具有誤導性……更好的術語可能是“僅附加”。通過向智能合約發送新交易,您可以附加到區塊鏈中,並且最新區塊中的狀態可能與之前區塊中的狀態不同。所以所有的舊塊仍然存在並且不可變,但是你的智能合約儲存的目前狀態可能會隨著時間的推移而不同(因為“目前”是指最新的塊)。
請注意,
mapping
不能列舉 a 的鍵。如果您需要列舉已添加到集合中的值,我有一篇關於可列舉集合的部落格文章應該有所幫助:https ://programtheblockchain.com/posts/2018/06/03/storage-patterns-set/ .