Guía de optimización de tarifas de Gas para contratos inteligentes EVM - 13 consejos prácticos

Optimización de Gas EVM - Guía de desarrollo de contratos inteligentes de Ethereum

Las tarifas de Gas en la red principal de Ethereum han sido un tema de gran preocupación, especialmente en momentos de congestión de la red. Durante los picos, los usuarios a menudo tienen que pagar tarifas de transacción elevadas. Por lo tanto, es crucial optimizar los costos de Gas en la etapa de desarrollo de contratos inteligentes. Optimizar el consumo de Gas no solo puede reducir efectivamente los costos de 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 resumirá el mecanismo de tarifas de Gas de la máquina virtual de Ethereum (EVM), los conceptos clave relacionados con la optimización de tarifas de Gas, así como las mejores prácticas para optimizar tarifas de Gas al desarrollar contratos inteligentes. Se espera que este contenido ofrezca inspiración y ayuda práctica a los desarrolladores, al mismo tiempo que ayude a los usuarios comunes a comprender mejor cómo funcionan las tarifas de Gas del EVM, enfrentando juntos los desafíos en el ecosistema blockchain.

Gas optimización de los diez mejores prácticas de contratos inteligentes de Ethereum

Introducción al mecanismo de tarifas de Gas de EVM

En redes compatibles con EVM, "Gas" es la unidad utilizada para medir la capacidad de cálculo necesaria para ejecutar operaciones específicas.

En la estructura del EVM, el consumo de Gas se divide en tres partes: ejecución de operaciones, llamadas de mensajes externos y lectura/escritura de memoria y almacenamiento.

Debido a que la ejecución de cada transacción requiere recursos de cálculo, se cobrará una cierta tarifa para prevenir bucles infinitos y ataques de denegación de servicio (DoS). La tarifa necesaria para completar una transacción se denomina "Gas fee".

Desde que EIP-1559 entró en vigor, las tarifas de Gas se calculan mediante la siguiente fórmula:

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

La tarifa base será destruida, mientras que la tarifa prioritaria se utilizará como incentivo para alentar a los validadores a agregar transacciones a la cadena de bloques. Establecer una tarifa prioritaria más alta al enviar una transacción puede aumentar la probabilidad de que la transacción se incluya en el siguiente bloque. Esto es similar a una "propina" que los usuarios pagan a los validadores.

Ethereum contratos inteligentes de Gas optimización diez mejores prácticas

Comprender la optimización del Gas en EVM

Cuando se compilan contratos inteligentes 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 (, como la creación de contratos, la realización de llamadas a mensajes, 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, y estos costos están registrados en el libro blanco de Ethereum.

Después de múltiples modificaciones de EIP, el costo de Gas de algunos códigos de operación ha sido ajustado, lo que puede diferir del libro amarillo.

Conceptos básicos de la optimización de Gas

La idea central de la optimización de Gas es priorizar operaciones de alto costo-eficiencia en la cadena de bloques 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 la variable calldata, como el array y la estructura calldata
  • Llamada a función interna

Las operaciones de alto costo incluyen:

  • Leer y escribir variables de estado almacenadas en el almacenamiento del contrato
  • Llamadas a funciones externas
  • Operación en bucle

Mejores prácticas de optimización de Gas para contratos inteligentes de Ethereum

Mejores Prácticas para la Optimización de Costos de Gas EVM

1. Intenta reducir el uso del almacenamiento.

En Solidity, el almacenamiento( es un recurso limitado, cuyo consumo de Gas es mucho mayor que la memoria). Cada vez que un contrato inteligente lee o escribe datos desde el almacenamiento, se 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 superior al de las operaciones de memoria. Por ejemplo, las instrucciones OPcodesmload y mstore consumen solo 3 unidades de Gas, mientras que las operaciones de almacenamiento como sload y sstore, incluso en las condiciones más ideales, requieren al menos 100 unidades.

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

  • Almacenar datos no permanentes en la memoria
  • Reducir la cantidad de modificaciones de almacenamiento: Almacenar los resultados intermedios en la memoria y asignar los resultados a las variables de almacenamiento una vez que todos los cálculos se hayan completado.

Gas optimización de los diez mejores prácticas de contratos inteligentes de Ethereum

( 2. Empaquetado de variables

La cantidad de slots de almacenamiento ) utilizados en contratos inteligentes y la forma en que los desarrolladores representan los datos afectará enormemente el consumo de Gas.

El compilador de Solidity empaquetará las variables de almacenamiento continuas durante el proceso de compilación y utilizará un espacio de almacenamiento de 32 bytes como la unidad básica para el almacenamiento de variables. El empaquetado de variables se refiere a organizar las variables de manera razonable para que múltiples variables puedan adaptarse a un solo espacio de almacenamiento.

A través del empaquetado de variables, los desarrolladores pueden ahorrar una gran cantidad de unidades de Gas. 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.

![Mejores prácticas para la optimización de Gas en contratos inteligentes de Ethereum]###https://img-cdn.gateio.im/webp-social/moments-995905cb414526d4d991899d0c2e6443.webp(

) 3. Optimizar tipos de datos

Elegir el tipo de dato adecuado ayuda a optimizar el uso de Gas. Por ejemplo, en Solidity, los enteros se pueden dividir en diferentes tamaños: uint8, uint16, uint32, etc. Dado que la EVM ejecuta operaciones en unidades de 256 bits, usar uint8 significa que la EVM debe convertirlo primero a uint256, y esta conversión consumirá Gas adicional.

Sin embargo, si se utiliza la optimización de empaquetado de variables y se empaquetan cuatro variables uint8 en una única 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 y escribir una ranura de almacenamiento una vez, y colocar las cuatro variables uint8 en memoria/almacenamiento en una sola operación.

Mejores prácticas de optimización de Gas para contratos inteligentes de Ethereum

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

Si los datos pueden controlarse dentro de 32 bytes, se recomienda utilizar el tipo de datos bytes32 en lugar de bytes o strings. En general, las variables de tamaño fijo consumen menos Gas que las variables de tamaño variable. Si la longitud en bytes puede limitarse, intente elegir la longitud mínima de bytes1 a bytes32.

( 5. Mapeo y arreglos

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

El mapeo es más eficiente y menos costoso en la mayoría de los casos, pero los arrays son iterables y admiten el empaquetado de tipos de datos. Por lo tanto, se recomienda priorizar el uso de mapeos al gestionar listas de datos, a menos que se necesite iterar o se pueda optimizar el consumo de Gas mediante el empaquetado de tipos de datos.

![Mejores prácticas para la optimización de Gas en contratos inteligentes de Ethereum]###https://img-cdn.gateio.im/webp-social/moments-5f3d7e103e47c886f50599cffe35c707.webp(

) 6. Usar calldata en lugar de memory

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

Recuerda este principio: si los parámetros de la función son de solo lectura, se debe preferir el uso de calldata en lugar de memory. Esto puede evitar operaciones de copia innecesarias desde calldata de la función a memory.

Gas optimización de los diez mejores prácticas de contratos inteligentes de Ethereum

( 7. Intenta usar las palabras clave Constant/Immutable siempre que sea posible.

Las variables Constant/Immutable no se almacenan en el almacenamiento del contrato. Estas variables se calculan en el momento de la 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.

![Ethereum contratos inteligentes de optimización de Gas: diez mejores prácticas])https://img-cdn.gateio.im/webp-social/moments-c0701f9e09280a1667495d54e262dd2f.webp###

( 8. Usar Unchecked asegurando que no ocurran desbordamientos/subdesbordamientos.

Cuando los desarrolladores pueden asegurarse de que las operaciones aritméticas no causarán desbordamiento o subdesbordamiento, pueden utilizar la palabra clave unchecked introducida en Solidity v0.8.0 para evitar comprobaciones innecesarias de desbordamiento o subdesbordamiento, ahorrando así costos 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 compilador en sí mismo ha incorporado funciones de protección contra desbordamientos y subdesbordamientos.

![Gas optimización de los diez mejores prácticas de contratos inteligentes de Ethereum])https://img-cdn.gateio.im/webp-social/moments-a823fb7761aafa6529a6c45304e0314b.webp###

( 9. optimizar modificador

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 eleva el consumo de Gas. Se puede reducir el tamaño del bytecode y disminuir el costo de Gas reestructurando la lógica en funciones internas y reutilizando esa función interna en el modificador.

![Gas optimization de los diez mejores prácticas de contratos inteligentes de Ethereum])https://img-cdn.gateio.im/webp-social/moments-839b91e2f02389949aa698d460a497d8.webp###

( 10. Optimización de cortocircuito

Para los operadores || y &&, la operación lógica sufrirá una evaluación de cortocircuito, 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 se puede saltar potencialmente los cálculos costosos.

![Mejores prácticas para la optimización de Gas en contratos inteligentes de Ethereum])https://img-cdn.gateio.im/webp-social/moments-a141884dcdcdc56faff12eee2601b7b7.webp###

Sugerencias generales adicionales

( 1. Eliminar código innecesario

Si hay funciones o variables no utilizadas en el contrato, se recomienda eliminarlas. Este es el método más directo para reducir el costo de implementación del contrato y mantener el tamaño del contrato pequeño.

A continuación se presentan algunos consejos útiles:

  • Utilizar los algoritmos más eficientes para realizar cálculos. Si el contrato utiliza directamente los resultados de ciertos cálculos, entonces se deben eliminar estos procesos de cálculo redundantes. Esencialmente, cualquier cálculo no utilizado debe ser eliminado.

  • En Ethereum, los desarrolladores pueden obtener recompensas de Gas al liberar espacio de almacenamiento. Si ya no se necesita una variable, se debe usar la palabra clave delete para eliminarla o establecerla en su valor predeterminado.

  • Optimización de bucles: evitar operaciones de bucle de alto costo, combinar bucles siempre que sea posible y mover cálculos repetidos fuera del cuerpo del bucle.

) 2. Uso de contratos inteligentes precompilados

Los contratos precompilados proporcionan funciones de biblioteca complejas, como operaciones de cifrado y hash. Dado que el código no se ejecuta en el EVM, sino que se ejecuta localmente en el nodo del cliente, se requiere menos Gas. Usar contratos precompilados puede ahorrar Gas al reducir la carga computacional necesaria para ejecutar contratos inteligentes.

Los ejemplos de contratos precompilados incluyen el algoritmo de firma digital de curva elíptica ###ECDSA( y el algoritmo de hash SHA2-256. Al utilizar estos contratos precompilados en contratos inteligentes, los desarrolladores pueden reducir los costos de Gas y mejorar la eficiencia de ejecución de las aplicaciones.

) 3. Uso de código de ensamblaje en línea

La ensambladura en línea ### in-line assembly ### permite a los desarrolladores escribir código de bajo nivel, pero eficiente, que puede ser ejecutado directamente por la EVM, sin necesidad de utilizar costosos códigos de operación de Solidity. La ensambladura en línea también permite un control más preciso sobre el uso de la memoria y el almacenamiento, lo que a su vez reduce aún más las tarifas de Gas. Además, la ensambladura en línea puede realizar algunas operaciones complejas que son difíciles de implementar solo con Solidity, proporcionando más flexibilidad para optimizar el consumo de Gas.

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

( 4. Uso de soluciones de Layer 2

El uso de soluciones de Layer 2 puede reducir la cantidad de datos que necesitan ser almacenados y calculados en la red principal de Ethereum.

Las soluciones de Layer 2 como rollups, cadenas laterales y canales de estado pueden descargar el procesamiento de transacciones de la cadena principal de Ethereum, lo que permite transacciones más rápidas y económicas.

Al agrupar una gran cantidad de transacciones, estas soluciones reducen el número de transacciones en la cadena, lo que a su vez disminuye las tarifas de Gas. El uso de soluciones de Layer 2 también puede mejorar la escalabilidad de Ethereum, permitiendo que más usuarios y aplicaciones participen en la red, sin causar

ETH2.98%
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
  • 4
  • Compartir
Comentar
0/400
GateUser-beba108dvip
· hace21h
¿La tarifa de gas me presiona, verdad?
Ver originalesResponder0
BTCBeliefStationvip
· hace22h
Gas también debe estar en la competencia, ¿no? Soltar un poco también está bien, ¿verdad?
Ver originalesResponder0
ParanoiaKingvip
· hace22h
Esta tarifa de Gas es una estafa total.
Ver originalesResponder0
DegenGamblervip
· hace22h
gas está loco, ¿tiene un final?
Ver originalesResponder0
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)