¿Qué es la Ethereum Virtual Machine (EVM)? La máquina virtual de Ethereum

José Maldonado
28 MAY 2020
¿Qué es la Ethereum Virtual Machine (EVM)? La máquina virtual de Ethereum
1.

Introducción

La blockchain de Ethereum es en la actualidad el segundo proyecto blockchain más grande del criptomundo. Un logro que ha alcanzado gracias a una revolucionaria tecnología que le ha permitido destacar por sobre otros proyectos. Estamos hablando de Ethereum Virtual Machine (EVM), una máquina virtual de la cual depende toda la estructura de funcionamiento de Ethereum.

Pero ¿Qué es la Ethereum Virtual Machine (EVM)? ¿Cómo funciona? Todas estas preguntas y muchas más serán respondidas a continuación.

2.

¿Qué es una máquina virtual?

En primer lugar, para comprender exactamente qué es la Ethereum Virtual Machine (EVM) debemos conocer qué es exactamente una máquina virtual. Pues bien, una máquina virtual o VM (Virtual Machine), es un software diseñado para crear una capa de emulación de lo que es un ordenador real. En palabras más sencillas, una máquina virtual es un ordenador cuya creación y funcionamiento dependen de software.

Por supuesto, esta máquina virtual emula todas las funciones de un computador. Hablamos de que es capaz de recrear un procesador, memoria RAM, discos duros, tarjetas de red y cualquier dispositivo que necesite. Pero no solo eso, también es capaz de ejecutar software específico dentro de esa máquina virtual. En definitiva, es como tener un computador completo dentro de otro computador.

Para lograr esto, las máquinas virtuales son capaces de aislar todas estas funciones en un contenedor, al cual podemos conectarnos e interactuar por medio de una interfaz de control. Esto nos ofrece la capacidad de que todo lo que sea ejecutado dentro de esta máquina virtual está aislado del resto del sistema. Una característica de seguridad única, pero también una característica que permite una gran portabilidad, o la capacidad de llevar esta máquina virtual a distintos sistemas y hardware.

En definitiva, las máquinas virtuales son una creación de software altamente flexible y que permite ofrecer funcionalidades únicas. Como, por ejemplo, puedes crear una máquina virtual que actué frente a una serie de instrucciones únicas, con comportamientos bien definidos y aislados de los sistemas de los que se ejecuta. Todo ello de forma económica y con un desarrollo abierto a grandes posibilidades.

3.

Conociendo la Ethereum Virtual Machine (EVM)

Aclarado ya el concepto de lo que es una máquina virtual, entonces podemos explicar que es la Ethereum Virtual Machine o EVM. En tal caso, la EVM es un software diseñado para emular un maquina con determinadas capacidades que hacen posible el funcionamiento de la blockchain de Ethereum.

Estas capacidades podemos usarlas gracias a que podemos programar instrucciones para la EVM, usando una serie de OP_CODES o códigos de operación, que luego podemos compilar o traducir a un bytecode o lenguaje específico que la EVM puede comprender y ejecutar. Estos OP_CODES son nuestra interfaz de interacción para que la EVM realice las instrucciones que programamos. Y son los que hacen posible que todo en Ethereum funcione, desde las más sencillas transacciones hasta avanzadas operaciones de smart contracts y DApps.

En este punto, Ethereum y Bitcoin se parecen mucho. Recordemos que Bitcoin cuenta también con códigos de operación y una máquina virtual capaz de traducir estas instrucciones en acciones dentro de la blockchain. Sin embargo, la EVM lleva mucho más allá de Bitcoin sus capacidades, y nos permite realizar de forma sencilla operaciones que en Bitcoin son imposibles o muy complejas de realizar.

Sin embargo, para hacer más sencilla la programación para esta máquina virtual se creó un lenguaje especializado de alto nivel llamado Solidity. A través de este lenguaje de programación se facilita la creación de los smart contracts. En primer lugar, se transforma Solidity a los códigos de operación (OP_CODES) y luego a un bytecode. Este bytecode es finalmente ejecutado por la EVM para realizar las operaciones especificadas en un smart contract. Todo ello hace que la EVM puede funcionar como un computador de verdad, ejecutando desde las más sencillas hasta las más complejas operaciones.

Es gracias a estas características de la EVM que Ethereum tiene funcionalidades como los smart contracts. Y es que en definitiva, la EVM es una gigantesca computadora descentralizada conformada por todos los nodos que forman parte de la red Ethereum.

Semejante creación ha llevado un enorme trabajo de cientos de personas en todo el mundo. Pero las mentes que iniciaron este trabajo fueron los desarrolladores Gavin Woods y Greg Colvin. Un trabajo que comenzó en 2013 con las primeras ideas para crear una blockchain que contará con un lenguaje del tipo Turing completo para todas operaciones. Una idea nacida en la mente de Vitalik Buterin, el creador de Ethereum. El resultado se puede ver en el Yellow Paper de Ethereum.

Relacionado: ¿Qué es Ethereum?

4.

Características de la Ethereum Virtual Machine

Ahora bien, la Ethereum Virtual Machine, cuenta con una serie de características bastante únicas que resumimos a continuación:

  1. En primer lugar, ayuda a proporcionar un alto nivel de seguridad. Al ser una máquina virtual con limitaciones en las instrucciones y en la forma en cómo se ejecutan, EVM es capaz de ejecutar códigos no confiables sin consecuencias desastrosas.

     
  2. EVM es una construcción completamente descentralizada. Cada nodo dentro de la red Ethereum ejecuta una copia de esta máquina virtual en conjunto y sincronía con el resto de nodos que forman la red. Esto garantiza que las instrucciones dadas las EVM se ejecuten siempre y cuando exista al menos un nodo en activo. Ello permite el acceso a dicho sistema desde cualquier parte del mundo, resistiendo la censura y garantizando el acceso a los recursos de la red. Además no requiere de la participación de terceros, tampoco pueden ser modificadas ni alteradas.

     
  3. La EVM permite el desarrollo de una mayor cantidad de aplicaciones, y que éstas puedan ejecutarse sobre una misma red blockchain, sin afectar otras operaciones. Lo vemos claramente en el funcionamiento de las DApps de Ethereum y su explosión de desarrollo hasta la actualidad.

     
  4. EVM es capaz de hacer realidad a los smart contracts o contratos inteligentes de Turing completo. Estos son programaciones específicas e invariables que pueden ejecutarse y hacerse cumplir por sí mismos, de una manera autónoma y automática.

     
  5. La EVM posee la capacidad de ejecutar una serie de códigos de operación u OP_CODES bien definidos, fuero de estos códigos la EVM no es capaz de realizar absolutamente nada. Pero para que esta ejecución sea posible, dichos OP_CODES deben transformarse en bytecode o código máquina. Esto permite que EVM tenga un mayor rendimiento en la realización de operaciones en comparación con aproximaciones como las de Bitcoin.
5.

¿Cómo funciona la Ethereum Virtual Machine (EVM)?

Ahora bien, el funcionamiento de la Ethereum Virtual Machine es un proceso bastante complejo. De hecho, un esquema resumido del funcionamiento de la EVM sería algo como esto:

https://lh4.googleusercontent.com/TiLfd6jOKB31qnORcERvWh_McbUB-RuX5AlICNPS9mowZr81iPrxSTIhOeoPWL4EATQ3l5sM8IPVNG4Hb6hF6_dohCJ5WZRVFTUGBey3PUD0cIvqo91CPRwWuZyFuY3Fq4dCo7ZR

Pese a esto, el funcionamiento de la EVM puede simplificarse de la siguiente forma. En primer lugar, los desarrolladores de EVM han creado un lenguaje de programación llamado Solidity. Este lenguaje de programación de alto nivel es muy parecido al JavaScript, un lenguaje muy usado en el mundo de la programación Web. El objetivo de este lenguaje es facilitar la tarea de escribir código para los smart contracts de Ethereum y las DApps asociadas a los mismos.

Con Solidity, los programadores pueden acelerar la creación de estos programas, gracias a que sirve de interfaz a una serie de códigos de operación u OP_CODES. Estos OP_CODES son una forma más abstracta de dar instrucciones a la EVM. Pero además, cada uno de estos OP_CODES es transformado luego a un bytecode o lenguaje de máquina. Esto con el fin de facilitar la realización de las tareas de la EVM. De hecho, lo que realmente ejecuta la EVM es este bytecode, el cual es generado por una pieza de software llamada compilador.

Entonces nos queda un proceso en el que el desarrollador usa Solidity para escribir sus smart contracts de forma rápida y sencilla. Pero a partir de este punto, este desarrollador usa herramientas especiales para transformar este código en OP_CODES y finalmente en bytecodes para que la EVM pueda llevar a cabo todas las instrucciones que se han programado.

Así cada transacción y operación que se realiza en la blockchain de Ethereum pasa por este proceso, y su ejecución es llevada a cabo por la EVM, que al terminar graba todo en la blockchain de Ethereum, dejando registro público de esas operaciones.  En pocas palabras, cada transacción en Ethereum, desde un envío de Ether hasta alguna acción en un smart contract o DApps es llevada a cabo por la EVM. No existe nada en Ethereum que no pase por esta máquina virtual.

6.

¿Qué son los OP_CODES y Bytecode de la Ethereum Virtual Machine?

En este punto te preguntarás ¿Qué son los OP_CODES y el Bytecode de la EVM? Pues bien, para explicar esto tomaremos prestado un ejemplo del lenguaje de programación Python:

https://lh3.googleusercontent.com/OQTegrii6cpm5TB8JKwm9Xk_WmFIbdZpK9omaSjc8rxx_y_8fw-pXS6gfcrHymNGYUX1YljeZgOr6R8YQioxvnoHZWuPM9ps8QcfsUW5795KggiKU2aZ5sA_PyaPoghIXYfCpfkn

Ejecutar este pequeño código nos ofrece esta salida:

https://lh4.googleusercontent.com/FsdfpU4kcpLXze13Br7Nv2cYFI03YjvMVOVIDxK7L7a1GizrdybgqKBG6DX9siiLHD9XVgdhJRY8K3W385Um_-ICpDZhVUcjAuHFcgjcJ8JlfGzAQNn8qR_en-xjdoQD6l4OAFOz

Acá podemos definir dos elementos. El primero, es el lenguaje de alto nivel que estamos usando, en este caso Python. Y, en segundo lugar, los OP_CODES o códigos de operación que genera dicho código. El primer elemento es fácilmente identificable y legible, pero el segundo no lo es tanto. De hecho, la dificultad de los OP_CODES aumenta con la complejidad del código que escribamos. Así que un código de miles de líneas es realmente todo un desafío de lectura y análisis, para cualquier persona incluso para los especialistas.

Esto nos dice el porqué los desarrolladores de la EVM decidieron crear Solidity para facilitar el desarrollo de smart contracts. Pero también nos dice el lugar y la importancia de los OP_CODES, puesto que de ellos depende que se realicen las operaciones que se transcriben en el código. En definitiva, los OP_CODES en Ethereum Virtual Machine, son un punto intermedio entre un lenguaje de alto nivel y el código de más bajo nivel capaz de ejecutar la EVM. Y al mismo tiempo, delimitan las instrucciones que la EVM puede realizar en su conjunto. De hecho, por diseño la EVM solo puede contener un máximo de 256 códigos de operación, mismo que podemos ver en este enlace.

El nivel más bajo lo tenemos en el bytecode. Este viene a ser el resultado de compilar los OP_CODES en el equivalente a lenguaje máquina de la EVM. Un proceso que es posible gracias a los compiladores y del cual obtenemos algo prácticamente imposible de entender y escribir por un ser humano.

Siguiendo el mismo ejemplo de Python, un bytecode sería algo como esto:

https://lh3.googleusercontent.com/cdkBEownPm0xEwoiH7fKW4r2Z_ZMUSz2gToCQRUHp5Z7AuuBYnIGjmGHkbO_-HL6VcmypKP98ye6y97izybkABAieyPmwiXXt1icNNYdV-_dwWztu4HEFCM1WPcznQTBIQ7bJjDz

Como ven, el bytecode es mucho más complejo de leer y de un nivel mucho más bajo hablando computacionalmente. Esto es precisamente lo que pasa en Ethereum y su EVM. Programamos usando Solidity o cualquier otro lenguaje compatible, luego transformamos a OP_CODES y finalmente a bytecode. El contenido final es luego puesto en la blockchain desde donde podemos interactuar con el mismo de la forma en como se ha programado. Podemos ver un ejemplo final de esto en la siguiente dirección, donde podrás observar el smart contract de la popular aplicación CryptoKitties.

https://lh6.googleusercontent.com/PWrY8nXlEopgd1xLQxMMYDn5MEyqK09DCo4r5P-TSYNhOMZOglLrBOoyOOtdqAd9lHeUnTJQnrFnmhZTvvDL1uK3Xxrx0rjgfPfEXZGAFs2cOjNLAtEOARcLckQO2iWYNx3W-iEO

7.

Smart Contracts y la EVM

Como ya hemos mencionado anteriormente la funcionalidad de los smart contracts de Ethereum es posible gracias a la Ethereum Virtual Machine. Para diseñar estos contratos inteligentes los desarrolladores usan Solidity o un lenguaje de programación compatible con la EVM, como el caso de Vyper o Bamboo. Esto es posible debido a que EVM es capaz de realizar operaciones de Turing completo.

El funcionamiento de los smart contracts dentro de la EVM es sencillo. Se programa las condiciones del contrato, las formas en las que podemos interactuar con el mismo, y la EVM se encarga de realizar estas operaciones. Dicho así, suena muy sencillo y sin complicaciones, pero lo cierto es que encierra una enorme complejidad.

En primer lugar, ejecutar smart contracts requiere de recursos. Memoria, CPU, almacenamiento, todo esto es necesario. Además, debido a la forma en cómo funciona la tecnología blockchain, cada interacción con los contratos tiene un coste asociado. El primer problema se soluciona gracias a que la EVM organiza su memoria en forma de pila. Para ello crea espacios de almacenamiento en el que se contiene la información durante la ejecución de un contrato. Esta memoria, permite que los contratos tengan un espacio donde almacenar datos de ejecución y otras variables.

Por otro lado, las necesidades de almacenamiento son atendidas por un espacio de almacenamiento externo a la blockchain. Generalmente las DApps usan este almacenamiento para resguardar información que es necesario resguardar entre ejecuciones, y para que estén siempre disponibles de forma local, evitando hacer una transacción al smart contract y el costo asociado con la misma.

Estos costes de interacción se miden en Gas, una medida creada por Ethereum para calcular el costo de interactuar con la EVM. El objetivo del Gas es brindar seguridad frente a un atacante malicioso que pueda aprovecharse de la red para realizar algún acto malicioso o simplemente dejarla fuera de servicio. Así que cada operación realizada tiene un coste asociado. Por ejemplo, usar el código de operación KECCAK256 tiene un costo de operación de 30 Gas. Pero el costo aumenta en razón de 6 Gas por cada palabra que añadamos a esta operación cuya finalidad es realizar un hash de la información que coloquemos.

Esta medida se mantiene con el resto de instrucciones que es capaz de ejecutar la EVM. A mayor complejidad de la instrucción mayor es su costo en Gas.

Relacionado: ¿Qué son los smart contracts o contratos inteligentes?

8.

Implementaciones de la EVM

En la actualidad el desarrollo de la EVM continua a grandes pasos. De hecho, la EVM cuenta con un desarrollo oficial muy activo, pero también con desarrollos e implementaciones alternas muy activas. Algunas de estas implementaciones son:

  1. Go-Ethereum:  Un popular cliente de Ethereum con su propia implementación de EVM (directorio core / vm)
  2. Parity on Rust: Otro popular cliente de Ethereum con su propia implementación de EVM (directorio ethcore).
  3. Cpp-Ethereum: Un cliente de Ethereum que genera el conjunto de pruebas de consenso (libevm / VM.cpp)
  4. Pyethereum: Otro cliente con probablemente la mejor implementación de EVM legible (ethereum / vm.py)
  5. Py-EVM: Una implementación alternativa de Python diseñada para ser altamente configurable y modular.
  6. EthereumJ: Un cliente con su propia implementación de EVM escrita en Java.
  7. SputnikVM: una implementación realizada por Ethereum Classic el fork de Ethereum centrada en alta escalabilidad, paralelismo y portabilidad.

Esto nos dice mucho del desarrollo de Ethereum Virtual Machine (EVM) y de lo que podemos esperar de la misma. Uno de los desarrollos más grandes del mundo cripto que sigue evolucionando y mejorando, mostrando al mundo que sencillamente a tecnología blockchain puede permitirnos crear grandes cosas.