Optimizando variables Struct en Solidity.

Alberto Lasa - Blockchain/Crypto
3 min readJan 14, 2019

--

Una breve introducción al concepto de Gas:

¿Por qué existe el Gas? Básicamente para evitar un ataque de denegación de servicio (DOS). Piensa que un contrato inteligente puede ejecutar cualquier tipo de lógica, abriendo así la puerta a loops infinitos o cálculos muy intensos. Y esto es muy peligroso, ya que un contrato mal intencionado o con un error de diseño, podría paralizar toda la minería y por tanto tumbar la blockchain de Ethereum por completo. Piensa que todos los nodos mineros deben ejecutar paralelamente las funciones que se llaman en cada transacción.

Ethereum está pensado para que las transacciones tengan un límite de Gas (en realidad límite del bloque), y por tanto un límite de capacidad de ejecución. Así mismo, el Gas supone un coste para el emisor que desincentiva por completo este tipo de ataques. Ya que la unidad de Gas se paga en Ethers (weights).

No obstante, también se busca que los desarrolladores diseñen contrato optimizados. Hay que pensar que los dueños de un Smart Contract quieren cargar los menores costes posibles a sus clientes (usuarios del contrato).

El coste de Gas está basado aproximadamente en los “recursos computacionales” que necesita una función para ejecutarse dentro de un Smart Contract, pero hay instrucciones más caras que otras. Concretamente las instrucciones de escritura en el “estado del contrato” (variables declaradas en el scope global) son las más caras con diferencia. Y esto es muy lógico, ya que cuanto más escribamos en el estado del contrato, más grande será la base de datos guardada por los mineros (+ coste de almacenamiento). Lo que se busca, por tanto, es incentivar el almacenamiento de los datos extrictamente necesarios en la blockchain y ninguno más.

¿Cómo podemos reducir u optimizar el consumo de Gas?

Lo primero que nos puede venir a la mente es reducir el espacio reservado para la variables de estado a su mínimo necesario. Si tenemos por ejemplo una variable para guardar un número entero que se solo va a ocupar 32bits, podríamos declarar un “unit32”. Pero esto NO te ahorrará nada de Gas, porque Solidity reserva “256 bits” de almacenamiento independientemente del tamaño del “uint”.

La máquina virtual de Ethereum (EVM) opera en 32 bytes (256bits), y esto condiciona mucho el consumo de Gas.

*Sin embargo, existe una excepción: Las variables de tipo “Struct”.

En este tipo de variables, Solidity empaqueta las sub-variables del mismo tipo para rellenar espacios de 256bits. Por eso, una buena práctica es ajustar aquellas sub-variables del mismo tipo al mínimo posible, y colocarlas al lado en la estructura. Ten pongo un ejemplo que he programado:

Espero que te haya sido de utilidad este artículo, muchas gracias por tu lectura. Saludos. Aaaaa!!!!! Si te ha gustado dame un aplauso ;)

Sígueme también en:

  • YouTube:

https://www.youtube.com/channel/UCGArGu3QXNolrJ63qGSrw6w

  • Twitter:

https://twitter.com/LasaAlberto

--

--

Alberto Lasa - Blockchain/Crypto

Programación de Smart Contracts y Dapps sobre Ethereum: Solidity, Truffle, Web3.js, Node.js, Angular, React, JavaScript, TypeScript, Google Cloud, etc..