5 minutos de lectura
Resumen
La Máquina Virtual de Ethereum (EVM) es un componente fundamental de Ethereum que contribuye al funcionamiento de la cadena de bloques y los contratos inteligentes. Es esencial para ayudar a Ethereum a lograr la adopción por parte de los usuarios y la descentralización. En esta guía, analizaremos en detalle la EVM para comprender qué es y cómo funciona. A continuación, abordaremos algunos puntos clave para afianzar nuestros conocimientos.
¿Prefieres un tutorial en vídeo? Sigue a Sahil y descubre la Máquina Virtual de Ethereum (EVM) en 5 minutos.
Lo que necesitarás
- Conocimientos básicos sobre Ethereum
- Conocimientos básicos sobre estructuras de datos y memoria
Lo que aprenderás
- ¿Qué es la Máquina Virtual de Ethereum (EVM)?
- Cómo funciona la Máquina Virtual de Ethereum (EVM)
- Puntos clave sobre la Máquina Virtual de Ethereum (EVM)
¿Qué es el EVM?
La Máquina Virtual de Ethereum (EVM) es el motor de cálculo de Ethereum que gestiona el estado de la cadena de bloques y permite el funcionamiento de los contratos inteligentes. La EVM está integrada en el software de cliente (por ejemplo, Geth, Nethermind y otros) que se necesita para ejecutar un nodo en Ethereum. Los nodos de Ethereum conservan copias de los datos de las transacciones, que la EVM procesa para actualizar el libro mayor distribuido. En términos generales, los nodos de Ethereum son compatibles de forma nativa con la EVM, ya que el software de cliente implementa esta funcionalidad.
A continuación, veamos algunas de las tareas que realiza la EVM.
La EVM participa en la creación de bloques y en la ejecución de transacciones. En la creación de bloques, la EVM establece las normas para gestionar el estado de un bloque a otro. Estos estados se almacenan en un árbol Merkle Patricia Trie y contienen el estado de referencia de Ethereum.
En la ejecución de transacciones, la EVM lleva a cabo tareas (por ejemplo, llamadas a funciones de un contrato inteligente) interpretando las instrucciones en códigos de operación (instrucciones de máquina de bajo nivel); sin embargo, los datos se formatean en bytecode. Para convertir los datos a bytecode, puedes utilizar un lenguaje de programación como Solidity (es decir, el lenguaje de programación nativo de los contratos inteligentes) para compilar e implementar el contrato inteligente utilizando bytecode.
Ten en cuenta que, cuando la EVM ejecuta tareas, está limitada por la cantidad de gas proporcionada por la transacción y por las restricciones generales de la EVM. El gas es una unidad de medida de la potencia de cálculo en Ethereum.
Para obtener más información sobre las transacciones, consulta nuestra guía «¿Qué son las transacciones de Ethereum?»
A continuación, echemos un vistazo a la arquitectura de la EVM.
¿Cómo está diseñada la EVM?
La EVM funciona con una estructura de memoria basada en pila y contiene componentes de memoria como «Memory», «Storage» y «Stack» (que se utilizan para leer y escribir en la cadena de bloques y gestionar el estado).
Se considera que la EVM es cuasi-Turing completo, lo que significa que puede resolver problemas a partir de un conjunto de instrucciones y datos de entrada, pero está limitado por la cantidad de gas proporcionada junto con la transacción.
Ahora, veamos cómo funciona internamente la EVM cuando se ejecuta el bytecode de una transacción o cuando se crea un nuevo bloque.
¿Cómo funciona la EVM?
En esta sección, explicaremos cómo funciona la EVM. Ten en cuenta que se trata de una explicación general y que no abarca todas las operaciones de la EVM.
Como hemos mencionado anteriormente, la EVM ejecuta tareas formateadas en bytecode, que la EVM interpreta en códigos de operación. Veamos cómo se desglosa el código de un contrato inteligente (bytecode) en códigos de operación.
Para este ejemplo, utilizaremos como referencia el contrato de almacenamiento simple (1_Storage.sol) en Remix.IDE. El bytecode compilado del contrato de almacenamiento simple tiene este aspecto:
608060405234801561001057600080fd5b50610150806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80632e64cec11461003b5780636057361d14610059575b600080fd5b610043610075565b60405161005091906100d9565b60405180910390f35b610073600480360381019061006e919061009d565b61007e565b005b60008054905090565b8060008190555050565b60008135905061009781610103565b92915050565b6000602082840312156100b3576100b26100fe565b5b60006100c184828501610088565b91505092915050565b6100d3816100f4565b82525050565b60006020820190506100ee60008301846100ca565b92915050565b6000819050919050565b600080fd5b61010c816100f4565b811461011757600080fd5b5056fea26469706673582212209a159a4f3847890f10bfb87871a61eba91c5dbf5ee3cf6398207e292eee22a1664736f6c63430008070033
Puedes ver el mismo código de bytes entrando en Remix.IDE, accediendo al contrato de ejemplo 1_Storage.sol, compilándolo y haciendo clic en el botón «Copiar código de bytes».
Ten en cuenta que la EVM solo utiliza 140 códigos de operación únicos; sin embargo, hay un total de 256 códigos de operación con una longitud de 1 byte. Veamos ahora el código de bytes de una de las funciones del contrato (por ejemplo, `store()`).
60003560e01c80632e64cec11461003b5780636057361d1461005957
Cada byte del ejemplo anterior hace referencia a un código de operación diferente. Por ejemplo, el primer byte (p. ej., 60) hace referencia a un código de operación PUSH1, el siguiente byte (p. ej., 00) hace referencia a los datos que se insertan, el tercer byte (60) vuelve a hacer referencia al código de operación PUSH1 y el siguiente byte hace referencia a su entrada (p. ej., e0). Para ver todos los códigos de operación de la función anterior, puedes ir a evm.codes/playground, introducir el código de bytes en el IDE y hacer clic en «Run» (asegúrate de seleccionar «Bytecode» en el menú desplegable).
Ahora que sabemos un poco más sobre cómo ejecuta el EVM el bytecode, pasemos a comprender la función de transición de estado de Ethereum.
La función de transición de estado de Ethereum
Y(S, T) = S'
Dónde:
Y= Función de transición de estadosS= Estado actual de la cadena de bloques (saldos, contratos, almacenamiento)T= Nueva transacciónS'= Estado resultante tras la transacción
La función de transición de estado de Ethereum es una fórmula que la EVM procesa cada vez que ejecuta una transacción. El objetivo de esta función es garantizar que las transacciones cumplan con el estándar de transacciones y sean técnicamente válidas (por ejemplo, que el nonce sea correcto y la firma sea válida). Piensa en ella como una función pura que toma la instantánea actual de la cadena de bloques y una transacción, y a continuación genera el nuevo estado válido.
Ahora deberías comprender mejor cómo funciona y cómo está diseñada la EVM. A continuación, veamos algunas de las principales ventajas de la EVM.
Puntos clave
- Turing completo: el hecho de que Ethereum sea Turing completo le permite ejecutar lógica arbitraria, a diferencia de otras cadenas de bloques como Bitcoin.
- Compatibilidad: Ethereum no es la única cadena de bloques compatible con EVM. Muchas cadenas de Capa 1 (L1) y Capa 2 (L2) son compatibles con EVM, lo que facilita la migración y el despliegue de contratos o la transferencia de tokens entre cadenas. Algunos ejemplos son Polygon, BNB Smart Chain, Avalanche y otras.
- Descentralización: La EVM permite a los desarrolladores implementar dApps (aplicaciones descentralizadas) en Ethereum.
Recursos adicionales
Si quieres profundizar en el EVM, echa un vistazo a los siguientes recursos:
O si te interesa crear tu propio contrato inteligente, echa un vistazo a nuestra guía «Una visión general del funcionamiento de los contratos inteligentes en Ethereum ».
Reflexiones finales
¡Enhorabuena! Ahora ya entiendes un poco mejor cómo funciona la EVM. ¿Tienes alguna idea o pregunta, o quieres presumir de lo que has aprendido? Cuéntanoslo en Discord o ponte en contacto con nosotros a través de Twitter.
¡Nos encanta recibir comentarios!
Si tienes algún comentario o pregunta sobre esta guía, háznoslo saber. ¡Nos encantaría saber tu opinión!
