Contract-Development

數組與實體映射:何時使用一個而不是另一個?

  • April 12, 2021

什麼時候應該在solidity中使用數組或映射?

假設我有多個問題問卷,只有一個問題,我想將不同人(地址)的回答儲存在智能合約中。儲存它們的最佳方法是什麼。在數組或映射中?

例如:

struct Answer {
   address answerer; // address of the answerer.
   uint answer; // multiple choice answer.
}


mapping(address => uint) public answers;

Answer[] public answers;

我什麼時候應該使用上述任何一種?

它始終取決於您的需求。

最大的區別是您不能迭代映射。因此,如果您在映射中儲存兩個條目(鍵 => 值),則在不知道鍵的情況下無法獲取值。

在您的範例中,它還取決於您的需求。如果您只想根據已知鍵訪問答案(例如,一個將地址作為輸入並返回其答案的函式),那麼您應該使用映射。但是,如果您需要能夠找出已經給出了多少答案和/或來自哪些地址,則不能使用映射(至少單獨使用)。

有時最佳解決方案是同時使用兩者:將實際數據儲存在映射中,然後將鍵儲存在單獨的數組中,您可以對其進行迭代。原因是在給定密鑰的情況下,從映射中訪問實際值更容易且更便宜。如果值僅在數組中,則必須遍歷整個數組才能找到正確的條目。

數組也有一個缺點,如果它變得太大,你的合約可能會變得不可用。例如,如果您需要從數組中搜尋一個值,並且迭代整個數組的成本超過了塊 gas 限制,那麼合約基本上是磚塊和無用的。

引用自:https://ethereum.stackexchange.com/questions/97146