Array o mapeo, ¿qué cuesta más gasolina?

He estado usando matrices de structpara 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?

En términos de precio de la gasolina, depende de la cantidad de datos que se almacenen y cuánto cueste acceder a una matriz frente a un mapa, por ejemplo, para encontrar un elemento específico en una matriz, se requiere un bucle. Puede encontrar más información granular aquí: ethdocs.org/en/latest/contracts-and-transactions/… ¿Podría proporcionar el código fuente para que podamos entender por qué podría estar alcanzando el límite de gasolina?
@SamuelBarnes Creo que un bucle sobre una matriz en mi función provoca "Exceder el límite de gas del bloque". Después de cambiar a mapping, el problema desaparece.

Respuestas (1)

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 itemsmapeo con una afirmación de 0>index>length-1voluntad. 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)

¡Es interesante que Solidity haya implementado arreglos como mapas! ¿Tienes la fuente?
@NicSzer No es una comparación 1 a 1, solo un ejemplo para demostrar que la longitud es una variable de almacenamiento que agrega costos. Las matrices en Solidity son en realidad matrices normales en las que el índice inicial de la matriz es el hash del índice almacenado.
¿Cuánto más arraycuesta un que un mappingpara su almacenamiento? Creo que hay una diferencia significativa para almacenar un arrayen lugar de un mappingdentro de una estructura @flygoing
Las lecturas , las actualizaciones y las eliminaciones con matrices serán ligeramente más altas (200-300 gases), ya que lee la longitud y valida que el índice está dentro de los límites. Las inserciones en arreglos serán sustancialmente más altas ya que tanto las asignaciones como los arreglos necesitan 20k para asignar la ranura, pero los arreglos tienen un costo adicional de 5k para actualizar la longitud (20k en lugar de 5k para el primer elemento, ya que la longitud va de cero a distinto de cero ). En general, evite las matrices si puede, pero obviamente no siempre puede hacer eso.