Descargo de Responsabilidad
Este artículo ha sido traducido de su idioma original para su conveniencia. A pesar de que nos esforzamos por ser precisos, puede haber pequeños errores o diferencias en la interpretación. Para obtener la representación más precisa y verdadera, consulte la publicación original, disponible aquí.
Agradecemos su comprensión y le animamos a consultar la fuente original para obtener información detallada.
Esta es la Parte I de una serie de varias partes de Fuel Labs que cubre temas relacionados con la escalabilidad y la ejecución en Ethereum. Esta serie pretende ofrecer una visión completa de los retos asociados a la mejora del rendimiento y la capacidad de Ethereum, así como de las soluciones actuales que trabajan para hacerlo más eficiente y escalable para su adopción generalizada.
La arquitectura de Ethereum consta de varias capas, cada una de las cuales desempeña un papel crucial en el funcionamiento de la red. Entre estas capas, la de ejecución es especialmente significativa. El procesamiento de transacciones, la ejecución de smart contract y el mantenimiento de un estado coherente y seguro se realizan en la capa de ejecución. Sin embargo, esta capa es a menudo un cuello de botella que limita el rendimiento general y la escalabilidad de la red Ethereum.
La ejecución se refiere a la computación necesaria para ejecutar transacciones y realizar cambios de estado en la blockchain. Esta computación a menudo implica la validación de transacciones mediante la comprobación de sus firmas y saldos de tokens, y la ejecución de la lógica en la cadena necesaria para actualizar el estado. Los cambios de estado se producen cuando los full nodes actualizan su copia del ledger para reflejar nuevas transferencias de tokens, actualizaciones de código de smart contracts y cambios en el almacenamiento de datos.
Las funciones principales de la capa de ejecución incluyen:
Procesamiento de Transacciones: Validación y ejecución de las transacciones enviadas por los usuarios.
Ejecución de Smart Contracts: Ejecutar el código de los smart contracts, que son contratos autoejecutables en los que los términos del acuerdo se escriben directamente en código.
Gestión del Estado: Mantener el estado de la blockchain, incluidos los saldos de las cuentas, los estados de los smart contracts y otros datos esenciales. La gestión del estado de Ethereum es especialmente complicada debido a su complejo árbol de estados, pero innovaciones como los árboles Verkle, que optimizan el almacenamiento de estados al permitir pruebas de datos más pequeñas y eficientes, están trabajando para solucionar este problema. Mientras tanto, otras blockchains como Solana, a pesar de no tener un árbol de estados global, también han tenido que lidiar con problemas de gestión de estados.
El objetivo de la escalabilidad es mejorar el rendimiento aumentando la velocidad de las transacciones (mayor rapidez de finalización) y el rendimiento de las transacciones (mayor número de transacciones por segundo). La gente suele pensar en el rendimiento en términos de TPS, o transacciones por segundo. En realidad, la escalabilidad se refiere al número de cálculos por segundo que puede manejar una blockchain, ya que las transacciones pueden variar en complejidad y demanda de recursos. Ethereum utiliza "gas" para medir los cálculos necesarios para ejecutar transacciones y smart contracts. El reto de escalar la capa de ejecución reside en aumentar el número de cálculos por segundo sin elevar significativamente los requisitos de hardware de los full nodes individuales que validan las transacciones en bloques. Resolver eficazmente este problema es crucial para mejorar el rendimiento y las prestaciones de las redes blockchains.
Para entender por qué es necesario tener en cuenta la escalabilidad desde el punto de vista computacional, es importante analizar más detenidamente cómo se procesan las transacciones en Ethereum. Cuando un usuario inicia una transacción en Ethereum, ésta pasa por varios pasos antes de finalizar. He aquí un resumen simplificado de este proceso:
Inicio de la Transacción: Una Cuenta de Propiedad Externa (Externally Owned Account - EOA) o el propietario de un smart contract inicia una transacción mediante la creación de una solicitud JSON-RPC firmada. Esta solicitud incluye detalles como la dirección del destinatario, la cantidad de Ether (si la hay) a transferir, los datos a incluir (si se interactúa con un contrato), el límite de gas y otros parámetros de la transacción.
Verificación de la Firma Digital: Los nodos de la red Ethereum verifican primero la firma digital de la transacción para confirmar su autenticidad y asegurarse de que no ha sido manipulada durante la transmisión.
Comprobación del Nonce: La red comprueba el nonce de la cuenta del remitente para garantizar que la transacción es secuencial y evitar ataques de repetición. El nonce se incrementa con cada transacción enviada desde una cuenta.
Cálculo de Gas: El gas es una unidad utilizada para medir el esfuerzo computacional y es necesario para ejecutar transacciones y smart contracts. La transacción especifica un límite de gas, que es la cantidad máxima de gas que el remitente está dispuesto a utilizar para esa transacción. Las tasas de gas se pagan en Ether y cubren el coste de computación y almacenamiento en la red Ethereum.
Transmisión de la Transacción: Una vez validada, la transacción se transmite a todos los nodos de la red P2P Ethereum. Los nodos reciben la transacción y comienzan el proceso de incluirla en un bloque para su validación.
Creación de Bloques: Los validadores del mecanismo de consenso Proof of Stake (PoS) de Ethereum validan y proponen un nuevo bloque, incorporando lotes de transacciones validadas, incluida la iniciada más recientemente.
Validación del Bloque: Otros nodos también verifican la corrección de las transacciones, comprueban las firmas, confirman los fondos disponibles y se aseguran de que no se produzca un doble gasto.
Actualización del estado: Cuando un bloque es válido, cada nodo actualiza su copia local de la blockchain de Ethereum con los nuevos cambios de estado de las transacciones en ese bloque. Esto significa actualizar los saldos de las cuentas, el almacenamiento de contratos y otros datos importantes. Ethereum mantiene un árbol de Merkle global, que consolida todos los datos de estado organizándolos en una estructura jerárquica en la que el estado de cada bloque se convierte en hash y se enlaza, lo que conduce finalmente a un único hash raíz. Esto nos da una raíz de estado única y ordenada que permite a los clientes ligeros verificar la integridad de transacciones específicas o piezas de datos sin necesidad de descargar toda la blockchain.
Confirmación de la Transacción: Una vez que una transacción se incluye en un bloque y ese bloque se añade a la blockchain, la transacción se considera confirmada. La confirmación indica que la transacción es irreversible y ha sido aceptada por la red Ethereum.
Ejecución Final e Interacción con Contratos: Para las transacciones que interactúan con smart contracts, el código del contrato se ejecuta de acuerdo con los datos de entrada proporcionados en la transacción. Esta ejecución puede implicar la actualización de las variables de estado internas del contrato, la emisión de eventos o la activación de otras transacciones.
Recibo de Transacción: Se genera un recibo de transacción que puede inspeccionarse para confirmar detalles como la cantidad de gas utilizado, el número de bloque en el que se incluyó la transacción y cualquier registro producido durante la ejecución del contrato.
Aunque la capa de ejecución es fundamental para la funcionalidad de Ethereum, también supone un importante cuello de botella para el número de cálculos que Ethereum puede realizar en un momento dado. La disponibilidad de datos (DA) era un problema crítico, pero soluciones como la EIP-4844, que introdujo "blobs" temporales de datos que son mucho más baratos de almacenar que las transacciones regulares de Ethereum, han mitigado en gran medida estos retos. Al mejorar la distribución de datos y el almacenamiento fuera de la cadena, innovaciones como el EIP-4844 han desplazado la atención a la capa de ejecución como principal obstáculo para la escalabilidad de Ethereum.
Varios factores contribuyen al cuello de botella de ejecución en Ethereum.
La latencia es el tiempo que transcurre desde que se envía una transacción hasta que se confirma y se incluye en la blockchain. Una latencia elevada puede provocar una confirmación más lenta de las transacciones, tiempos de espera más largos para los usuarios y retrasos en la ejecución de los smart contracts. Los principales cuellos de botella de latencia incluyen:
Tiempo de Bloque y Latencia de Confirmación: El tiempo medio de bloque de Ethereum, actualmente alrededor de 12 segundos, impone una latencia mínima para las confirmaciones de transacciones. Si una transacción se incluye en el siguiente bloque, el tiempo medio de espera es aproximadamente la mitad del tiempo de bloque, es decir, 6 segundos. Si el volumen de transacciones es bajo, la latencia puede aumentar, ya que las transacciones esperan más tiempo para ser incluidas en un bloque.
Sincronización de la blockchain (consenso): Los nodos de la red Ethereum deben llegar a un consenso sobre la validez de cada bloque. Este proceso puede introducir latencia, ya que los nodos verifican las transacciones, validan los bloques y se sincronizan con el estado de la red. La variabilidad en los tiempos de propagación de los bloques también contribuye a la latencia.
El rendimiento es directamente la capacidad de la red para procesar y gestionar eficazmente grandes volúmenes de transacciones en un plazo determinado. Un mayor rendimiento significa que la red puede gestionar más transacciones por segundo. Los cuellos de botella del rendimiento incluyen:
Ejecución Monohilo: La máquina virtual de Ethereum (EVM) procesa las transacciones de una en una de forma monohilo. Esto significa que las transacciones no se pueden paralelizar, lo que limita el número de transacciones que se pueden procesar simultáneamente.
Ejecución Desaprovechada: La EVM utiliza palabras de 256 bits y un enfoque basado en pilas en lugar de registros. Esta elección de diseño conlleva un uso ineficiente de los recursos informáticos, lo que aumenta el tiempo y la energía necesarios para ejecutar los contratos.
Gestión de Estados: Ethereum mantiene un gran árbol de estado profundamente anidado con 256 niveles. Cada vez que se actualiza un par clave-valor, deben realizarse 256 actualizaciones en la base de datos. Este extenso proceso de actualización ralentiza considerablemente la red.
Sobrecarga del Contador de Gas: Aunque la medición de gas pretende prevenir el uso excesivo de recursos y evitar el problema de la detención, el seguimiento de cada operación añade una sobrecarga significativa. Esta sobrecarga contribuye a ralentizar el procesamiento de las transacciones.
Límites de Capacidad de los Nodos: Los nodos de Ethereum tienen límites prácticos en sus capacidades de procesamiento y almacenamiento. Cuando las demandas de procesamiento de transacciones superan estos límites, los nodos luchan por mantener el ritmo, lo que provoca retrasos en la validación y propagación de bloques.
Crecimiento del Estado: A medida que aumenta el número de transacciones, también lo hace el estado de la blockchain. Este crecimiento requiere más almacenamiento y hace que la verificación y el acceso al estado requieran más tiempo, lo que ralentiza aún más la red.
Los problemas de rendimiento derivados de la capa de ejecución se manifiestan de diversas maneras, afectando tanto a la escalabilidad de la red como a la experiencia del usuario. He aquí algunos ejemplos:
Congestión de la red: Durante los periodos de alta demanda, como los populares GTE o los drops de NFT, el número de transacciones puede desbordar la red, provocando congestión. Esto se traduce en tiempos de confirmación más largos y tarifas de gas más elevadas, ya que los usuarios compiten por procesar sus transacciones.
Comisiones de gas elevadas: Cuando la red está congestionada, las tasas de gas pueden dispararse, haciendo prohibitivo para los usuarios realizar incluso transacciones sencillas. Esto limita la accesibilidad y facilidad de uso de la red.
Problemas de escalabilidad: El rendimiento limitado de la EVM dificulta la capacidad de Ethereum para escalar eficazmente. A medida que crece el número de usuarios y aplicaciones descentralizadas (dApps), la red tiene dificultades para ajustar el aumento de carga sin una degradación significativa del rendimiento.
El cuello de botella en la ejecución tiene efectos tangibles tanto para los usuarios finales como para los desarrolladores, e influye de forma significativa en el ecosistema Ethereum en general.
Las elevadas tarifas de gas durante las horas punta hacen que a los usuarios les resulte costoso interactuar con la red, ya sea para enviar ETH, participar en protocolos DeFi o acuñar NFT. La congestión de la red puede provocar retrasos en la confirmación de las transacciones, causando frustración y molestias a los usuarios que esperan interacciones en tiempo real. Estos elevados costes y retrasos reducen la usabilidad general de la red, disuadiendo a los usuarios potenciales y limitando el crecimiento del ecosistema.
Desde la perspectiva de un desarrollador, la necesidad de optimizar los smart contracts para minimizar el uso de gas añade complejidad y tiempo al proceso de desarrollo. También tienen que lidiar con la optimización de la infraestructura, a menudo a través de proveedores externos como los servicios de nodos (por ejemplo, Infura). Esto puede suponer un obstáculo aún mayor que la mera optimización de los smart contracts. La construcción de dApps escalables en Ethereum se complica aún más por el rendimiento limitado de la red, que a menudo requiere que los desarrolladores implementen soluciones fuera de la cadena o técnicas de escalado de capa 2 para un mejor rendimiento.
La locura de CryptoKitties NFT a finales de 2017 fue un momento crucial que demostró lo congestionada que podía llegar a estar la red. El aumento de las transacciones de usuarios que criaban e intercambiaban gatos virtuales provocó retrasos significativos en la red. En su punto álgido, CryptoKitties fue responsable de casi el 16 % de todas las transacciones de la red Ethereum, lo que provocó que algunas transacciones se retrasaran durante horas o incluso días. Según un artículo de Coindesk, en un momento dado había unas 30.000 transacciones atascadas y a la espera de ser procesadas.
El Verano DeFi de 2020 marcó otro periodo de importante congestión de la red. La rápida adopción de dApps como Uniswap y Compound provocó un aumento sustancial de la actividad en la red. Estos factores, entre otros, provocaron una gran demanda de espacio en la cadena y el consiguiente aumento de las tarifas de gas, con miles de ETH gastados diariamente en costes de transacción.
El auge de los NFT de 2021 a 2022 puso aún más de relieve los problemas de escalabilidad de Ethereum. Los lanzamientos y subastas de NFT de alto perfil, como el lanzamiento de NFT de Otherside por parte de Yuga Labs, atrajeron a miles de participantes, disparando las tarifas de gas por las nubes. La tarifa media de gas el día de la menta de Otherside superó los 400 dólares por transacción.
Más allá de las actividades de nicho como el comercio de NFT y la especulación DeFi, los altos costes y retrasos también pueden socavar la experiencia del usuario de dApps, reduciendo el compromiso y la retención. Varios proyectos blockchain se han visto obligados a migrar a otras blockchains o a cerrar por completo. Por ejemplo, UniLogin, que pretendía simplificar el inicio de sesión de los usuarios en aplicaciones basadas en ETH -una función crítica para la adopción generalizada- tuvo que cesar sus operaciones porque la escalada de las tarifas de gas lo hizo insostenible financieramente, costando más de 130 dólares por registro en ocasiones. Además, Publish0x, una plataforma en la que los usuarios pueden ganar criptomonedas por crear y leer contenidos, tuvo que retrasar los pagos y cambiar a desembolsos mensuales debido a los elevados costes. Para que Ethereum se extienda eficazmente a aplicaciones del mundo real en finanzas, gestión de la cadena de suministro e identidad descentralizada, entre otras, debe resolver estos problemas de escalabilidad para apoyar una adopción más amplia.
Las implicaciones en el mundo real de los cuellos de botella en la ejecución son de gran alcance y afectan tanto a usuarios como a desarrolladores. Las elevadas tarifas de gas, la congestión de la red y las limitaciones de escalabilidad dificultan el crecimiento y la usabilidad del ecosistema Ethereum. Abordar estos retos requiere innovación y mejoras en la capa de ejecución.
En la Parte II, analizaremos la importancia de innovar en la capa de ejecución para el futuro de Ethereum. Analizaremos de cerca las limitaciones actuales de la EVM, las posibles soluciones y los beneficios de evolucionar más allá del modelo de ejecución tradicional.
Lecturas recomendadas: