Solidity

為什麼使用數組而不是映射?

  • September 25, 2018

所以我正在執行一份貿易契約,需要保留一份銷售產品清單。我正在使用數組,但後來切換到映射。

所以數組實現:

uint[] public productsOnSale;
uint public totalProductsOnSale; 
// array of product to its position
mapping(uint => uint) productToIndex;

而銷售可以使用

uint public totalProductsOnSale;

mapping(uint => uint) indextoProduct;
mapping(uint => uint) productToIndex;

因為在數組的情況下,我們跟踪任何索引處的值,我們也可以使用映射來實現。

**使用映射而不是數組有什麼缺點嗎?**在計算時間方面還是在成本(gas)方面?

數組確實比映射成本更高,但那是因為它沒有做同樣的事情。Solidity 中的 Array 基本上是具有這種結構的結構

struct Array{
 mapping(uint => someType) items;
 uint length;
}

如果要使用映射,則必須儲存映射的長度。

使用映射而不是數組有什麼缺點嗎?

是的,這是您在問題中沒有考慮的一個方面:

您無法跟踪您在映射中設置的所有鍵(當然,除了掃描整個區塊鏈)。

您可以為每次插入發出一個事件,這將使跟踪更容易,但這顯然會增加成本。

您可以將所有內容都儲存在鏈下(例如,在您的伺服器上),但這會使您的系統容易受到鏈下弱點的影響(例如,有人闖入您的伺服器)。

跟踪映射中設置的所有鍵的最簡單方法是將這些鍵推送到輔助數組中。

或者在您的情況下,正如您所提到的,只需使用數組而不是映射開始。

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