Está en la página 1de 18

OPTIMIZACIÓN EN EL USO

DEL GAS
TIPS

1. Storage
2. Slots y Variable Packing
3. Herencia
4. Short Circuiting Rules
5. “Mantén tu espacio limpio”
6. Evita usar Arrays (Parte 1)
7. Evita usar Arrays dinamicos (Parte 2)
8. Evita usar Strings (Parte 3)
9. Evita usar Arrays (Parte 4) (loop and
gas problem) //seguridad, no por
optimización
1. STORAGE

Las variables globales son guardadas en los contratos de la blockchain.


Este es en general el mayor costo en gas cuando pensamos en
SmartContracts. Por tanto tenemos que pensar cómo optimizar nuestro
manejo de información
EJEMPLO SIMPLE

string STATUS = ‘unknown status’; // Esto es muy caro

uint STATUS = 0; //Esto es mas barato

uint STATUS; //Esto es aun mas barato


2 SLOTS Y VARIABLE PACKING

Los contratos en solidity usan ranuras (Slots) de 32 bytes para


ordenar su almacenamiento (variables tipo Storage). Un Slot
aloja por tanto una o más variables.

Se conoce como "Variable Packing" cuando un Slot contiene


más de una variable.

Esto afecta solo a las variables tipo Storage, no a las variables


en memoria.
2 SLOTS Y VARIABLE PACKING

Los contratos en solidity usan ranuras (Slots) de 32 bytes para ordenar


su almacenamiento (variables tipo Storage). Un Slot aloja por tanto
una o más variables.

Se conoce como "Variable Packing" cuando un Slot contiene más


de una variable.

Esto afecta solo a las variables tipo Storage, no a las variables en


memoria.

El Storage en Ethereum se compone de 2^256 slots, y cada Slot es de


32 bytes
3. HERENCIA

Cuando realizamos herencia entre contratos, las variables de


la clase hijo pueden ser compactadas con las variables de la
clase padres.

El criterio usado es la linealizacion C3. A fines prácticos nos


conviene entender que las variables del hijo vienen después
de las variables del padre.
4. SHORT CIRCUITING RULES

Un método alternativo es optimizar en los operadores lógicos (OR // AND) y evaluar el


operador de la forma más barata en términos de Gas.

Si tenemos dos funciones de la cual una es más barata computacionalmente que la


otra, entonces:

● OR : Barata(x) || Costosa(y)
● AND : Barata(y) && Costosa(x)

Esto tiene mas que ver con lógica proposicional que con programación en sí.
5. MANTÉN TU ESPACIO LIMPIO

En Ethereum obtienes Gas al eliminar variables o contratos

enteros (self-destruct). Así que es una buena práctica eliminar

las variables cuando no las necesites.


6. EVITA USAR ARRAYS (MAPPING)

Un Mapping consume menos Gas que un Array. Si es que podemos usar


un mapping para resolver nuestro problema, deberíamos de usar un
mapping.

Sin embargo un mapping no tiene un orden de elementos y si tal orden lo


pretendemos simular agregando una variable uint el costo total va a ser
mayor que el array.
7. EVITA USAR ARRAYS DINÁMICOS

There is a small gas cost difference around the bounds checking for static
and dynamic arrays - dynamically sized arrays are a little more expensive
to access (about 200 gas per read) because of this.
8. EVITA USAR STRINGS

La verdadera razón es porque un String es un array dinámico de byte32. Y


así como recomendamos no usar arrays dinámicos debemos
recomendar no usar Strings
Memory over Storage
Memory over Storage
9. EVITA USAR ARRAYS (PARTE 4)

(loop and gas problem)


Es posible que intentemos recorrer un array de elementos y nos quedemos sin gas
en el medio debido a que no tenemos suficiente Gas para recorrer el array.

Si esto sucede de forma sistemática (o sea, nunca tenemos suficiente gas para
recorrerlo), la función no puede terminar de ejecutarse jamás y nuestro contrato
queda inutilizable
MAS INFO

https://www.researchgate.net/publication/340300470_Design_Patterns_f
or_Gas_Optimization_in_Ethereum#read

También podría gustarte