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)?
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.
¿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.
totalProductsOnSale
y buscar indexToProduct(i)
para obtener una lista de todas las claves.
Prashant Prabhakar Singh
Tcс
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á.