Es posible que haya encontrado algunos consejos de Solidity para mejorar sus habilidades de codificación y ahorrar algo de gasolina, pero hoy quiero centrarme más en cómo comprender la máquina virtual Ethereum puede ahorrarle costos de gasolina de manera efectiva en sus contratos inteligentes.

Ya que vamos a sumergirnos en Ethereum, voy a dejar aquí el fragmento de su Libro Amarillo que especifica los costos de gas de los códigos de operación, y durante el artículo nos estaremos haciendo referencia a ellos.



° 1: acceso frío versus acceso cálido

Gcarga fria: 2100 gas

Acceso cálido: 100 gasolina

Ahí tenemos nuestros primeros OPCODES, el primero especifica cuánto cuesta acceder a una variable por primera vez (o acceso en frío) mientras que el segundo especifica cuánto cuesta acceder a la variable por segunda vez y más (acceso en caliente). ). Como puede ver, la diferencia de precio es bastante grande, por lo que comprender esto puede marcar una gran diferencia en los costos de las transacciones de su contrato inteligente. Veamos un ejemplo.





Almacenar en caché los datos dentro de una función en Solidity puede resultar en un menor uso de gas, incluso si necesita más líneas de código. En este caso, se cambia la ubicación de la matriz y, en lugar de usarla desde el almacenamiento y, por lo tanto, acceder a ella en frío cada vez que se realiza el ciclo, almacena la matriz en la memoria, donde es más barato acceder a ella.

° 2: valores cero frente a valores distintos de cero y reembolsos de gasolina

Gsset = 20.000 gasolina

Rsclear = {descuento en el precio de ejecución}

Cambiar un valor de 0 a distinto de cero en la cadena de bloques Ethereum es costoso, como vemos en el precio de Gsset, pero cambiar un valor de distinto de cero a 0 puede brindarle un reembolso en el valor del gas según el código de operación Rsclear. Para no acogerse al reembolso, se establece que sólo se podrá reembolsar hasta un máximo del 20% del coste total de la transacción.

Puede encontrar un escenario de este tipo en un escenario muy común en blockchain, que es la actualización del saldo de direcciones en contratos inteligentes. Veamos un ejemplo de cada uno:





  • En el primer ejemplo de contrato ZeroToNonZero, distinto de cero a distinto de cero (5000 gas*) + cero a distinto de cero (20 000 gas) = ​​25 000 gas

  • En el segundo ejemplo de contrato NonZeroToZero, distinto de cero a cero (5000 gas*) + cero a distinto de cero (20 000 gas) — Reembolso (4800 gas) = ​​21 200 gas

*2100 (Gcolssload) + 2900 (Gsreset) = 5000 gasolina

Consejo #3: El orden de las variables de estado importa

El Almacenamiento es como una estructura de datos clave-valor que contiene los valores de las variables de estado de un contrato inteligente de Solidity.

Puede pensar en el almacenamiento como una matriz que ayudará a visualizar esto. Cada espacio en esta "matriz" de almacenamiento se llama ranura y contiene 32 bytes (256 bits) de datos y cada variable de estado declarada en el contrato inteligente ocupará una ranura dependiendo de su posición de declaración y su tipo.

No todos los tipos de datos ocupan los 32 bytes de cada ranura, ya que hay algunos tipos de datos (bool, uint8, dirección…) que ocupan menos que eso.

El truco aquí es que si dos/tres o más variables juntas tienen 32 bytes o menos, el compilador de solidity intentará empaquetarlas juntas en una sola ranura, pero estas variables deben definirse una al lado de la otra.





Aquí utilizamos los tipos de datos bool (1 byte), dirección (20 bytes) y uint256 (32 bytes). Entonces, conociendo el tamaño de estas variables, puedes entender fácilmente que en el primer ejemplo del contrato TwoSlots, dado que tenemos bool y dirección juntos (1 + 20 = 21 bytes, que es menos de 32 bytes), ocuparán un espacio. En el contrato ThreeSlots, dado que bool y uint256 no pueden estar en la misma ranura (1 + 32 = 33 bytes, que es mayor que la capacidad de la ranura), en total usaremos tres ranuras.

Ahora bien, ¿por qué es esto tan importante?

El código de operación SLOAD cuesta 2100 gasolina y se usa para leer desde ranuras de almacenamiento, por lo que si puede almacenar las variables en menos ranuras, terminará ahorrando algo de gasolina.

Consejo #4: uint256 es más barato que uint8

Hemos aprendido en el consejo n.° 3 que uint256 (256 bits = 32 bytes) ocupa por sí solo un espacio y también hemos aprendido que uint8 tiene menos de 32 bytes. Entonces, si bien es bastante sencillo decir que 8 bits son más pequeños que 256 bits, ¿por qué uint256 es más barato?

Para entender esto es importante saber que si una variable no llena por sí sola todo el slot y si este slot no lo llena ninguna otra variable, el EVM va a llenar el resto de los bits restantes con “0”. para poder manipularlo.

Esta adición "0" realizada por EVM costará gas, lo que significa que para ahorrar gas en las transacciones, es mejor usar uint256 en lugar de uint8.

__________________

Con suerte, mientras conoces estos consejos para reducir los costes del gas en tus contratos inteligentes también habrás aprendido un poco de cómo funciona el EVM.

__________________

Twitter @TheBlockChainer para encontrar más actualizaciones diarias sobre contratos inteligentes, seguridad Web3, solidez, auditoría de contratos inteligentes y más.

__________________