¿Por qué usar arreglos y no mapeos? [duplicar]

Así que estaba implementando un contrato comercial y necesito mantener una lista de productos en venta. Estaba usando matrices pero luego cambié a asignaciones.

Así que la implementación de arreglos:

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

mientras que la venta se puede lograr usando

uint public totalProductsOnSale;

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

Dado que en el caso de las matrices hacemos un seguimiento de los valores en cualquier índice, también podemos lograrlo utilizando el mapeo.

¿Hay alguna desventaja de usar asignaciones en lugar de una matriz? ¿En términos de tiempo de cálculo o en términos de costo (gas)?

Respuestas (2)

Array cuesta más que el mapeo, pero eso es porque no está haciendo lo mismo. Un Array en Solidity es básicamente una estructura con esta estructura

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

Y si desea utilizar el mapeo, debe almacenar la longitud del mapeo.

Entonces, ¿básicamente la implementación de mapeos es mejor en términos de costo?
Usaría matriz, porque tiene una clave uint y creo que será más fácil que mapear. productsOnSale.length; - tomas la longitud de tu matriz. productsOnSale.push(value);- agrega un nuevo elemento al final de la matriz. En el mapeo, si usará la clave existente, la sobrescribirá.

¿Hay alguna desventaja de usar asignaciones en lugar de una matriz?

Sí, aquí hay un aspecto que no ha considerado en su pregunta:

No hay forma de que pueda realizar un seguimiento de todas las claves que ha establecido en un mapeo (aparte de escanear toda la cadena de bloques, por supuesto).

Podría emitir un evento para cada inserción, lo que facilitará el seguimiento, pero eso obviamente aumentará el costo.

Puede almacenar todo fuera de la cadena (p. ej., en su servidor), pero eso hará que su sistema sea vulnerable a debilidades fuera de la cadena (p. ej., alguien que ingrese a su servidor).

La forma más fácil de realizar un seguimiento de todas las claves establecidas en una asignación es insertar esas claves en una matriz auxiliar.

O en su caso, como mencionó, simplemente use una matriz en lugar de una asignación para empezar.

Puedo realizar un seguimiento de todas las claves del mapeo usando el mapeo indexToProduct. Donde cada clave se almacena con respecto a un valor de índice. Algo así como elemento en un índice. Entonces puedo iterar hasta totalProductsOnSaley buscar indexToProduct(i)para obtener una lista de todas las claves.