Contract-Development
數組與實體映射:何時使用一個而不是另一個?
什麼時候應該在solidity中使用數組或映射?
假設我有多個問題問卷,只有一個問題,我想將不同人(地址)的回答儲存在智能合約中。儲存它們的最佳方法是什麼。在數組或映射中?
例如:
struct Answer { address answerer; // address of the answerer. uint answer; // multiple choice answer. } mapping(address => uint) public answers; Answer[] public answers;
我什麼時候應該使用上述任何一種?
它始終取決於您的需求。
最大的區別是您不能迭代映射。因此,如果您在映射中儲存兩個條目(鍵 => 值),則在不知道鍵的情況下無法獲取值。
在您的範例中,它還取決於您的需求。如果您只想根據已知鍵訪問答案(例如,一個將地址作為輸入並返回其答案的函式),那麼您應該使用映射。但是,如果您需要能夠找出已經給出了多少答案和/或來自哪些地址,則不能使用映射(至少單獨使用)。
有時最佳解決方案是同時使用兩者:將實際數據儲存在映射中,然後將鍵儲存在單獨的數組中,您可以對其進行迭代。原因是在給定密鑰的情況下,從映射中訪問實際值更容易且更便宜。如果值僅在數組中,則必須遍歷整個數組才能找到正確的條目。
數組也有一個缺點,如果它變得太大,你的合約可能會變得不可用。例如,如果您需要從數組中搜尋一個值,並且迭代整個數組的成本超過了塊 gas 限制,那麼合約基本上是磚塊和無用的。