Las 10 mejores prácticas de optimización de Gas para Ethereum Contratos inteligentes

El costo del gas en la red principal de Ethereum ha sido un problema difícil de resolver, especialmente durante la congestión de la red. En períodos de alta demanda, los usuarios suelen tener que pagar costos de blanqueo de capitales muy altos. Por lo tanto, es crucial optimizar los costos de gas durante la fase de desarrollo de contratos inteligentes. La optimización del consumo de gas no solo puede reducir eficazmente el costo de la transacción, sino que también puede mejorar la eficiencia de las transacciones, brindando a los usuarios una experiencia de uso de blockchain más económica y eficiente.

Este artículo describirá el mecanismo de tarifas de Gas de la Máquina Virtual de Ethereum (EVM), los conceptos centrales relacionados con la optimización de las tarifas de Gas, y las mejores prácticas para optimizar las tarifas de Gas al desarrollar contratos inteligentes. Con suerte, estos contenidos proporcionarán inspiración y ayuda práctica a los desarrolladores, al tiempo que ayudarán a los usuarios comunes a comprender mejor cómo funcionan las tarifas de Gas de EVM, y a abordar juntos los desafíos del ecosistema de blockchain.

Introducción al mecanismo de tarifas de gas de EVM

En una red compatible con EVM, 'Gas' se refiere a la unidad utilizada para medir la capacidad de cálculo necesaria para ejecutar operaciones específicas.

El siguiente diagrama ilustra la disposición estructural de EVM. En el diagrama, el consumo de gas se divide en tres partes: ejecución de operaciones, llamadas de mensajes externos y lectura/escritura de memoria y almacenamiento.

ETH坊 Contrato inteligente的Gas优化十大最佳实践

Fuente: Sitio web oficial de Ethereum [1]

Debido a que la ejecución de cada transacción requiere recursos de cálculo, se cobra una tarifa para evitar bucles infinitos y ataques de denegación de servicio (DoS). El costo necesario para completar una transacción se conoce como "tarifa de gas".

Desde la implementación de EIP-1559 (London Hard Fork), la tarifa de gas se calcula mediante la siguiente fórmula:

Tarifa de gas = unidades de gas utilizadas * (tarifa base + tarifa de prioridad)

La tarifa base se destruirá, mientras que la tarifa prioritaria actuará como un incentivo para alentar a los validadores a agregar transacciones a la cadena de bloques. Configurar una tarifa prioritaria más alta al enviar una transacción puede aumentar la probabilidad de que la transacción se incluya en el próximo bloque. Esto es similar a una especie de 'propina' que los usuarios pagan a los validadores.

1. Comprender la optimización de gas en EVM

Cuando se compila un contrato inteligente con Solidity, el contrato se convierte en una serie de "códigos de operación", es decir, opcodes.

Cualquier fragmento de código de operación (por ejemplo, la creación de contratos, la realización de llamadas de mensaje, el acceso al almacenamiento de cuentas y la ejecución de operaciones en la máquina virtual) tiene un costo de consumo de gas reconocido, estos costos se registran en el Libro amarillo de Ethereum [2].

¡Las 10 mejores prácticas de optimización de gas para los contratos inteligentes de ETH坊! (https://cdn-img.panewslab.com/yijian/2024/12/30/images/e8ce9cea17ea2b3c9fc563822a42898d.jpg)

Después de varias modificaciones del EIP, los costos de gas de algunos códigos de operación han sido ajustados, pudiendo diferir de lo establecido en el libro amarillo. Para obtener información detallada sobre los costos más recientes de los códigos de operación, consulte aquí[3].

2. Conceptos básicos de optimización de gas

La idea central de la optimización de gas es seleccionar operaciones de alta eficiencia en costes en la cadena de bloques de EVM, evitando operaciones costosas en gas.

En EVM, las siguientes operaciones tienen un costo más bajo:

  • Leer y escribir variables de memoria
  • Leer constantes y variables inmutables
  • Leer y escribir variables locales
  • Leer variables de calldata, como matrices y estructuras de calldata
  • Llamada de función interna

Las operaciones con altos costos incluyen:

  • Leer y escribir variables de estado almacenadas en el almacenamiento de contratos
  • Llamada externa de función
  • Operación cíclica

Optimización del costo de gas EVM mejores prácticas

Basado en los conceptos básicos mencionados anteriormente, hemos elaborado una lista de mejores prácticas para optimizar el costo de gas para la comunidad de desarrolladores. Siguiendo estas prácticas, los desarrolladores pueden reducir el consumo de gas de los contratos inteligentes y los costos de transacción, y construir aplicaciones más eficientes y amigables para los usuarios.

1. Trate de reducir al mínimo el uso del almacenamiento

En Solidity, el almacenamiento es un recurso finito que consume mucho más gas que la memoria. Cada vez que Contrato inteligent lee o escribe datos del almacenamiento, incurre en altos costos de gas.

Según la definición del Libro Amarillo de Ethereum, el costo de las operaciones de almacenamiento es más de 100 veces mayor que el de las operaciones en memoria. Por ejemplo, las instrucciones OPcodesmload y mstore solo consumen 3 unidades de gas, mientras que las operaciones de almacenamiento como sload y sstore, incluso en el mejor de los casos, requieren al menos 100 unidades de costo.

Ether坊 contratos inteligentes的gas优化十大最佳实践

Los métodos para limitar el uso de almacenamiento incluyen:

  • Almacena datos no permanentes en memoria
  • Reducir la frecuencia de modificaciones de almacenamiento: al guardar los resultados intermedios en la memoria, asignar los resultados a las variables de almacenamiento después de que se completen todos los cálculos.

2. Empaquetado de variables

La cantidad de ranuras de almacenamiento utilizadas en el contrato inteligente y la forma en que el desarrollador representa los datos tendrán un gran impacto en el consumo de gas.

El compilador de Solidity empaqueta variables de almacenamiento continuas y utiliza un espacio de almacenamiento de 32 bytes como unidad básica para el almacenamiento de variables durante el proceso de compilación. El empaquetamiento de variables se refiere a organizar las variables de manera adecuada para que varias variables puedan caber en un solo espacio de almacenamiento.

A la izquierda hay una forma de implementación menos eficiente que consume 3 ranuras de almacenamiento; a la derecha hay una forma de implementación más eficiente.

ETH坊 Contrato inteligente的Gas优化十大最佳实践

A través de este ajuste de detalle, los desarrolladores pueden ahorrar 20,000 unidades de gas (almacenar una ranura de almacenamiento no utilizada requiere 20,000 gas), pero ahora solo se necesitan dos ranuras de almacenamiento.

Dado que cada ranura de almacenamiento consume gas, el empaquetado de variables optimiza el uso de gas al reducir la cantidad de ranuras de almacenamiento necesarias.

3. Optimización de tipos de datos

Una variable puede ser representada por varios tipos de datos, pero los costos de operación correspondientes para diferentes tipos de datos también son diferentes. Elegir el tipo de dato adecuado ayuda a optimizar el uso de gas.

Por ejemplo, en Solidity, los enteros se pueden subdividir en diferentes tamaños: uint8, uint16, uint32, etc. Dado que la EVM opera en unidades de 256 bits, usar uint8 significa que la EVM debe convertirlo primero en uint256, lo que consume gas adicionalmente.

ETH坊 Contrato inteligente的Gas优化十大最佳实践

Podemos comparar el costo de gas de uint8 y uint256 en el código de la imagen. La función UseUint() consume 120,382 unidades de gas, mientras que la función UseUInt8() consume 166,111 unidades de gas.

Al mirar solo esto, usar uint256 es más barato que uint8. Sin embargo, si se usa la optimización de empaquetado de variables que recomendamos anteriormente, la situación será diferente. Si el desarrollador puede empaquetar cuatro variables uint8 en una ranura de almacenamiento, el costo total de iterar sobre ellas será menor que el de cuatro variables uint256. De esta manera, el contrato inteligente puede leer/escribir una vez en la ranura de almacenamiento y colocar las cuatro variables uint8 en la memoria/almacenamiento en una sola operación.

4. Utilice variables de tamaño fijo en lugar de variables dinámicas

Si los datos se pueden controlar dentro de 32 bytes, se recomienda utilizar el tipo de datos bytes32 en lugar de bytes o strings. Por lo general, las variables de tamaño fijo consumen menos gas que las variables de tamaño variable. Si la longitud de bytes se puede limitar, es preferible elegir la longitud mínima de bytes1 a bytes32.

ETH坊 Contrato inteligente的Gas优化十大最佳实践

ETH坊 Contrato inteligente的Gas优化十大最佳实践

5. Mapeo y matrices

Las listas de datos en Solidity se pueden representar con dos tipos de datos: matrices (Arrays) y mapeos (Mappings), pero su sintaxis y estructura son completamente diferentes.

En la mayoría de los casos, el mapeo es más eficiente y tiene un menor costo, pero los arreglos son iterables y admiten empaquetamiento de tipos de datos. Por lo tanto, se recomienda utilizar mapas en primer lugar al administrar listas de datos, a menos que se necesite iterar o se pueda optimizar el consumo de gas mediante el empaquetamiento de tipos de datos.

6. Usar calldata en lugar de memoria

Las variables declaradas en los parámetros de la función pueden almacenarse en calldata o en memory. La principal diferencia entre los dos es que memory puede ser modificada por la función, mientras que calldata es inmutable.

Recuerda este principio: si los argumentos de la función son de solo lectura, debes usar calldata en lugar de memory. Esto evitará copias innecesarias de calldata a memory en la función.

Ejemplo 1: usar memoria

ETH坊 Las 10 mejores prácticas de optimización de gas para contratos inteligentes

Al utilizar la palabra clave de memoria, el valor del array se copiará de calldata codificado a memoria durante el proceso de decodificación de ABI. El costo de ejecución de este bloque de código es de 3,694 unidades de gas.

Ejemplo 2: usando calldata

ETH坊 Las 10 mejores prácticas de optimización de gas para contratos inteligentes

Cuando se lee directamente desde calldata, se omiten las operaciones de memoria intermedias. Esta optimización reduce el costo de ejecución a solo 2,413 unidades de Gas, lo que mejora la eficiencia de Gas en un 35%.

7. Utilice la palabra clave Constant/Immutable siempre que sea posible

Las variables Constant/Immutable no se almacenan en el almacenamiento del contrato. Estas variables se calculan en tiempo de compilación y se almacenan en el bytecode del contrato. Por lo tanto, en comparación con el almacenamiento, su costo de acceso es mucho más bajo. Se recomienda utilizar las palabras clave Constant o Immutable siempre que sea posible.

8. Al utilizar Unchecked, asegúrese de que no haya desbordamiento / subdesbordamiento

Cuando los desarrolladores pueden determinar que las operaciones aritméticas no causarán desbordamientos o subdesbordamientos, pueden usar la palabra clave sin verificar introducida en Solidity v0.8.0 para evitar comprobaciones innecesarias de desbordamiento o subdesbordamiento, ahorrando así costos de gas.

En la siguiente figura, sujeta a la restricción i

Ether contratos inteligentes Las diez mejores prácticas de optimización de gas

Además, las versiones 0.8.0 y superiores del compilador ya no requieren el uso de la biblioteca SafeMath, ya que el propio compilador tiene funciones incorporadas de protección contra desbordamiento y subflujo.

9. Modificador de optimización

El código del modificador se incrusta en la función modificada, y cada vez que se utiliza el modificador, su código se copia. Esto aumenta el tamaño del bytecode y aumenta el consumo de gas. A continuación se muestra un método para optimizar el costo de gas del modificador:

Antes de la optimización:

Las 10 mejores prácticas de optimización de gas para los contratos inteligentes en la red Ethereum

Optimizado:

ETH坊 Contrato inteligente的Gas优化十大最佳实践

En este ejemplo, al refacturar la lógica como una función interna _checkOwner(), se permite reutilizar esta función interna en los modificadores, lo que reduce el tamaño del bytecode y el costo de gas.

10. Optimización de cortocircuito

Para los operadores || y &&, se produce una evaluación de cortocircuito en la operación lógica, es decir, si la primera condición ya puede determinar el resultado de la expresión lógica, no se evaluará la segunda condición.

Para optimizar el consumo de gas, se deben colocar las condiciones de bajo costo de cálculo al principio, de esta manera puede ser posible omitir cálculos costosos.

Sugerencia general adjunta

1. Eliminar código innecesario

Si hay funciones o variables no utilizadas en el contrato, se recomienda eliminarlas. Esta es la forma más directa de reducir el costo de implementación del contrato y mantener su tamaño pequeño.

A continuación se presentan algunos consejos prácticos:

Utilizar el algoritmo más eficiente para realizar cálculos. Si el contrato utiliza directamente el resultado de ciertos cálculos, entonces se deben eliminar los procesos de cálculo redundantes. Básicamente, cualquier cálculo no utilizado debe ser eliminado.

En Ethereum, los desarrolladores pueden obtener recompensas de gas liberando espacio de almacenamiento. Cuando ya no se necesita una variable, se debe eliminar con la palabra clave 'delete' o establecerla en su valor predeterminado.

Optimización de bucles: Evitar operaciones de bucle de alto costo, combinar bucles tanto como sea posible y sacar cálculos repetidos del cuerpo del bucle.

2. Usar contratos precompilados

Los contratos precompilados brindan funciones de biblioteca complejas, como operaciones de cifrado y hash. Debido a que el código no se ejecuta en EVM sino en el nodo del cliente local, se requiere menos gas. El uso de contratos precompilados puede ahorrar gas mediante la reducción de la carga de trabajo de cálculo necesaria para ejecutar el contrato inteligente.

Los ejemplos de contratos precompilados incluyen el algoritmo de firma digital de curva elíptica (ECDSA) y el algoritmo hash SHA2-256. Al utilizar estos contratos precompilados en el contrato inteligente, los desarrolladores pueden reducir el costo de la transacción de gas y mejorar la eficiencia operativa de la aplicación.

Para obtener la lista completa de contratos precompilados admitidos por la red Ethereum, consulte aquí [4].

3. Usar código de ensamblaje en línea

La asamblea en línea permite a los desarrolladores escribir código de bajo nivel pero eficiente que puede ser ejecutado directamente por EVM, sin necesidad de utilizar los costosos opcodes de Solidity. La asamblea en línea también permite un control más preciso del uso de la memoria y el almacenamiento, lo que reduce aún más los costos de gas. Además, la asamblea en línea puede realizar operaciones complejas que son difíciles de implementar solo con Solidity, lo que proporciona más flexibilidad para optimizar el consumo de gas.

A continuación se muestra un ejemplo de código que utiliza ensamblador en línea para ahorrar gas:

ETH坊 Contrato inteligente的Gas优化十大最佳实践

Como puede ver en el gráfico anterior, el segundo caso de uso que utiliza la técnica de ensamblaje en línea tiene una mayor eficiencia de gas en comparación con el caso de uso estándar.

Sin embargo, el uso de ensamblaje en línea también puede conllevar riesgos y ser propenso a errores. Por lo tanto, se debe utilizar con precaución y solo por desarrolladores experimentados.

4. Utilizando soluciones de Capa 2

El uso de la solución de Capa 2 puede reducir la cantidad de datos que necesitan ser almacenados y calculados en el Mainnet de Ethereum.

Soluciones de capa 2 como rollups, sidechains y canales de estado pueden descargar el procesamiento de transacciones de la cadena principal de ETH, lo que permite transacciones más rápidas y económicas.

Al agrupar una gran cantidad de transacciones, estas soluciones reducen la cantidad de transacciones en la cadena, lo que disminuye el blanqueo de capitales de gas. El uso de soluciones de capa 2 también puede mejorar la escalabilidad de Ethereum, permitiendo que más usuarios y aplicaciones participen en la red sin causar congestión.

5. Utilización de herramientas y bibliotecas de optimización

Existen varias herramientas de optimización disponibles, como el optimizador solc, el optimizador de construcción de Truffle y el compilador Solidity de Remix.

ETH坊 Contrato inteligente的Gas优化十大最佳实践

Estas herramientas pueden ayudar a minimizar el tamaño del byte code, eliminar el código no utilizado y reducir el número de operaciones necesarias para ejecutar contratos inteligentes. Combinadas con otras bibliotecas de optimización de gas, como 'solmate', los desarrolladores pueden reducir eficazmente el costo de transacción y mejorar la eficiencia de los contratos inteligentes.

Conclusión

Optimizar el consumo de gas es un paso importante para los desarrolladores, ya que permite minimizar el costo de la transacción y mejorar la eficiencia de los contratos inteligentes en la red EVM compatible. Al priorizar la ejecución de operaciones de bajo costo, reducir el uso de almacenamiento, utilizar ensamblador en línea y seguir otras mejores prácticas discutidas en este documento, los desarrolladores pueden reducir eficazmente el consumo de gas de los contratos.

Sin embargo, es importante tener en cuenta que, durante el proceso de optimización, los desarrolladores deben operar con precaución para evitar la introducción de vulnerabilidades de seguridad. En el proceso de optimización del código y la reducción del consumo de gas, nunca se debe sacrificar la seguridad inherente de los contratos inteligentes.

[1] :

[2] :

[3] :

[4] :precompiled

ETH-2.24%
GAS9.31%
Ver originales
Esta página puede contener contenido de terceros, que se proporciona únicamente con fines informativos (sin garantías ni declaraciones) y no debe considerarse como un respaldo por parte de Gate a las opiniones expresadas ni como asesoramiento financiero o profesional. Consulte el Descargo de responsabilidad para obtener más detalles.
  • Recompensa
  • 1
  • Compartir
Comentar
0/400
IELTSvip
· 2024-12-31 01:14
Debido a su rápido y enorme pump en 2024, se informa que el BTCETF de BlackRock 'IBIT' es 'el lanzamiento más grande en la historia de los ETF'. #圣诞冒险岛:喜迎新年,$50,000福利派送中# #2024 Gate.io 年度账单# #荣誉积分新年抽奖,赢Macbook、周边好礼# BSV eth ethw etcDoge xrp adapepe
Ver originalesResponder0
  • Anclado
Opere con criptomonedas en cualquier momento y lugar
qrCode
Escanee para descargar la aplicación Gate
Comunidad
Español
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)