Warum Arrays und keine Mappings verwenden? [Duplikat]

Ich habe also einen Handelsvertrag implementiert und musste eine Liste der zum Verkauf stehenden Produkte führen. Ich habe Arrays verwendet, bin aber später auf Mappings umgestiegen.

Also Array-Implementierung:

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

während der Verkauf mit erreicht werden kann

uint public totalProductsOnSale;

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

Da wir im Fall von Arrays die Werte an jedem Index verfolgen, können wir dies auch mithilfe von Mapping erreichen.

Gibt es Nachteile bei der Verwendung von Mappings anstelle eines Arrays? In Bezug auf die Rechenzeit oder in Bezug auf die Kosten (Gas)?

Antworten (2)

Array kostet mehr als Mapping, aber das liegt daran, dass es nicht dasselbe tut. Ein Array in Solidity ist im Grunde eine Struktur mit dieser Struktur

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

Und wenn Sie Mapping verwenden möchten, müssen Sie die Länge des Mappings speichern.

Die Implementierung von Mappings ist also im Hinblick auf die Kosten im Grunde besser?
Ich würde Array verwenden, weil Sie den uint-Schlüssel haben und ich denke, es wird einfacher sein als das Mapping. productsOnSale.length; - Sie nehmen die Länge Ihres Arrays. productsOnSale.push(value);- Sie fügen ein neues Element am Ende des Arrays hinzu. Wenn Sie beim Mapping einen vorhandenen Schlüssel verwenden, überschreiben Sie ihn.

Gibt es Nachteile bei der Verwendung von Mappings anstelle eines Arrays?

Ja, hier ist ein Aspekt, den Sie in Ihrer Frage nicht berücksichtigt haben:

Es gibt keine Möglichkeit, alle Schlüssel zu verfolgen, die Sie in einem Mapping festgelegt haben (außer natürlich die gesamte Blockchain zu scannen).

Sie könnten für jede Einfügung ein Ereignis ausgeben, was die Nachverfolgung erleichtert, aber das erhöht natürlich die Kosten.

Sie könnten alles Off-Chain speichern (z. B. auf Ihrem Server), aber das macht Ihr System anfällig für Off-Chain-Schwächen (z. B. jemand, der in Ihren Server einbricht).

Der einfachste Weg, alle in einer Zuordnung festgelegten Schlüssel zu verfolgen, besteht darin, diese Schlüssel in ein Hilfsarray zu verschieben.

Oder verwenden Sie in Ihrem Fall, wie Sie bereits erwähnt haben, zunächst nur ein Array anstelle einer Zuordnung.

Ich kann alle Schlüssel der Zuordnung mithilfe der indexToProduct-Zuordnung verfolgen. Wo jeder Schlüssel in Bezug auf einen Indexwert gespeichert wird. So etwas wie Artikel bei einem Index. So kann ich bis iterieren totalProductsOnSaleund abrufen, indexToProduct(i)um eine Liste aller Schlüssel zu erhalten.