He estado usando matrices de struct
para mi contrato. En Remix IDE con la red privada, una función me cuesta alrededor de 300.000 de gas. Sin embargo, si llamo a la misma función desde web3js, me cuesta mucho y, a veces, el costo supera el límite de gas del bloque que se estableció en 9,999,999.
¿Podría decirme si la matriz cuesta más gasolina que la que cuesta mapping
?
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;
}
Además de esto, las matrices tienen límites que verifican la longitud, de modo que intentan acceder a un elemento en el items
mapeo con una afirmación de 0>index>length-1
voluntad. Puede desplegar su propia "Array" como estructura como la anterior si no necesita la funcionalidad para verificar los límites
Editar: para aclarar, la comparación de una matriz con una variable de mapeo + longitud fue solo un ejemplo. Una matriz almacena los elementos reales en orden en el almacenamiento a partir de la ranura que es el hash de la ubicación en el almacenamiento de la longitud de la matriz. Un mapeo, por otro lado, se almacena como cabría esperar, como un hash de la ubicación almacenada de la raíz del mapa (r) y la clave individual (k), es decir, la ubicación del valor v con la clave k es keccak256(r + k)
array
cuesta un que un mapping
para su almacenamiento? Creo que hay una diferencia significativa para almacenar un array
en lugar de un mapping
dentro de una estructura @flygoing
samuel barnes
Truong largo
mapping
, el problema desaparece.