La máquina virtual Ethereum

Qtum Español
10 min readAug 14, 2021

Bienvenido de nuevo a la parte 2 de nuestra serie sobre el diseño de Qtum. En la parte anterior, hablamos sobre el modelo UTXO defendido por Bitcoin. Hoy, veremos el lado de la ecuación de Ethereum: la máquina virtual Ethereum.

¿Qué es la máquina virtual Ethereum?

Echemos un vistazo a Java como ejemplo, en Java, los desarrolladores escriben los códigos y los compilan en códigos de bytes. Estos códigos de bytes se cargan en la máquina virtual Java (JVM) y se ejecutan en la JVM. La especificación JVM asegura la interoperabilidad de los programas en diferentes implementaciones. Ethereum adopta un enfoque similar, donde los desarrolladores codifican contratos inteligentes en Solidity. Luego, estos contratos se convierten en códigos de bytes y se cargan en la blockchain para su ejecución en la EVM (máquina virtual Ethereum) que se ejecuta en varias plataformas de hardware.

La máquina virtual Ethereum es una máquina completa “quasi-Turing”. Una máquina completa de Turing es matemáticamente capaz de resolver cualquier problema que se le presente. Entonces, ¿por qué se ve la máquina virtual Ethereum solo como quasi-Turing completa? La razón es que los cálculos realizados por la máquina están limitados por Gas, que actúa como límite de seguridad en lo que respecta al número de cálculos que puede realizar la máquina.

Mencionamos anteriormente que la máquina virtual Ethereum está en el corazón del ecosistema Ethereum. Maneja el despliegue y la ejecución de contratos inteligentes. Las transacciones simples no necesitan la participación del EVM. Sin embargo, otras operaciones requerirán una actualización de estado por parte del EVM. La máquina virtual Ethereum contiene millones de objetos ejecutables, y cada objeto tiene su almacén de datos.

La máquina virtual Ethereum utiliza una arquitectura basada en pilas, que almacena los valores en memoria en una pila. Todas las operaciones se realizan como se define en el código EVM o el código de bytes. También tiene varios componentes de datos como

● ROM de código de programa inmutable, la ROM se carga con el código de bytes del contrato que debe ejecutarse.

● Una memoria volátil inicializada a cero

● Almacenamiento permanente, parte del estado Ethereum.

Comparación de EVM con tecnología existente

La máquina virtual Ethereum tiene un alcance operativo relativamente limitado. Es similar a la máquina virtual de Java, que actúa solo como un motor de cálculo, proporcionando una abstracción de cálculo y almacenamiento. La máquina virtual Java permite la compatibilidad entre varios sistemas porque proporciona un entorno independiente del sistema operativo subyacente.

El EVM funciona de manera similar, ejecutando su conjunto de instrucciones de código de bytes en el que se compilan los lenguajes de programación de contratos inteligentes de nivel superior. La orden de ejecución está organizada externamente, lo que significa que el EVM no tiene capacidad de programación. Los clientes de Ethereum determinan el orden de ejecución de los contratos inteligentes. La máquina virtual Ethereum tampoco tiene una interfaz de sistema ni una máquina física, ya que es completamente virtual.

Comprender cómo funciona la máquina virtual Ethereum

La máquina virtual Ethereum se puede definir como una pila virtual de espacio aislado incrustada dentro de un nodo Ethereum. La función principal de la máquina virtual Ethereum es permitir a los desarrolladores crear dApps y ejecutar contratos inteligentes. Ahora, no necesita experiencia previa como desarrollador o tener una amplia experiencia en codificación para usar EVM. Elimina la necesidad de hardware potente y costoso, lo que lo hace perfecto para principiantes.

Los contratos en la máquina virtual Ethereum se escriben en lenguajes como Solidity, Vyper y luego se compilan en el código de bytes EVM. Esto permite que el código esté completamente aislado de la red. Cada nodo de la red ejecuta una instancia de EVM, lo que les permite acordar la ejecución de las instrucciones.

La máquina virtual Ethereum permite a los desarrolladores crear y ejecutar su código en un entorno sin confianza. Un sistema realiza un seguimiento de cada instrucción que se implementa en el EVM. El sistema realiza un seguimiento del costo de ejecución de la instrucción. Luego asigna a la instrucción un costo asociado de gas. Para iniciar un contrato o transacción, el usuario debe proporcionar suficiente Ether para pagar el costo del gas.

El gas resuelve dos problemas para el EVM, los validadores reciben su monto prepago incluso si la ejecución falla, y la ejecución no puede durar más de lo que permite el monto prepago. Para cada transacción enviada a la red, el validador debe garantizar lo siguiente.

● Toda la información relacionada con la transacción debe ser válida.

● La EVM no se encuentra con ninguna excepción.

● El remitente debe tener fondos suficientes para pagar la ejecución.

Función de transición de estado de Ethereum

Ethereum actúa como una función matemática en la que le da una entrada y produce una salida. Eche un vistazo a la función a continuación.

Y(S, T)= S’

El antiguo estado S y un conjunto de instrucciones T significa que la función de estado de Ethereum Y (S, T) produce una nueva salida S ‘.

El estado

En el contexto de Ethereum, el estado es una estructura de datos conocida como “Merkle Patricia Trie modificada”. ¿Cuál es el papel de Merkle Patricia Trie? Proporciona una estructura de datos persistente criptográficamente autenticada que mapea datos binarios de longitud arbitraria. Es una estructura de datos mutable que puede mapear entre fragmentos binarios de 256 bits y datos binarios de longitud arbitraria. Cuando se trata de Ethereum, el único requisito del Merkle Tree es proporcionar un valor de 32 bytes que se pueda usar para identificar un conjunto determinado de pares clave-valor.

El estado mundial de Ethereum se encuentra en el nivel superior, asignando direcciones de Ethereum a cuentas. Cada dirección representa una cuenta que consta de un saldo de ether, un nonce, almacenamiento de cuenta y el código del programa de la cuenta. Cuando se ejecuta un código de contrato inteligente, el EVM se presenta con el bloque actual y la información de la transacción. El código de la cuenta del contrato se carga en la ROM del código del programa y el contador del programa se pone a cero. El almacenamiento también se carga desde el almacenamiento de la cuenta del contrato y la memoria también se establece en cero.

¿Qué son las transacciones?

Ethereum utiliza dos tipos de cuentas: cuentas normales (o cuentas de propiedad externa) y cuentas de contrato. Las cuentas normales pueden realizar pagos ETH utilizando su clave privada. Las cuentas de contrato son responsables de las llamadas de mensajes y las transacciones que dan lugar a la creación de contratos.

¿Qué son las instrucciones de EVM?

La máquina virtual Ethereum tiene una profundidad de 1.025 elementos, y cada elemento es una palabra de 256 bits. Cuando el EVM ejecuta una transacción, mantiene una memoria transitoria (matriz de bytes con dirección de palabra). Esta memoria no persiste entre transacciones. Los contratos inteligentes que se han compilado se ejecutan como códigos de operación EVM. Estos pueden realizar operaciones de pila como AND, XOR, ADD, SUB y más. El EVM también puede implementar operaciones de pila específicas como BALANCE, ADDRESS, BLOCKHASH, etc.

Gas y EVM

Las transacciones de una cuenta a otra contienen datos Ether o binarios, también conocidos como carga útil. No hay una autoridad central y los contratos se ejecutan en los nodos de Ethereum. Esto presenta el riesgo de que un actor malintencionado ralentice la red creando varios contratos complejos. Para proteger la red de tales ataques, los códigos de operación tienen un costo de gas base que se usa para pagar la ejecución de la transacción. El Gas limita el trabajo requerido por las operaciones. A medida que se ejecuta la transacción, el gas comienza a usarse.

Si tomamos el ejemplo del código de operación KECCAK256, vemos que tiene un costo de Gas base de 30, con un costo de Gas dinámico de 6 Gas por palabra. Las instrucciones computacionalmente costosas cobrarán una tarifa más alta que las instrucciones sencillas. Sin embargo, el Gas también se puede reembolsar si se ejecutan instrucciones que reducen el tamaño del estado. Si el valor de almacenamiento se establece en cero, entonces se reembolsarán 15,000 de gas, y si se usa el código de operación SELF-DESTRUCT, entonces se reembolsarán 24,000 de gas.

¿Qué son los códigos de operación?

Ahora que hemos visto un ejemplo, comprendamos los códigos de operación. Los códigos de operación ayudan a la máquina virtual Ethereum a realizar tareas muy específicas. Los códigos de operación son los que permiten que la máquina virtual Ethereum sea Turing completa. Al momento de escribir, el EVM puede ejecutar un poco más de 150 códigos de operación que se pueden dividir en los siguientes. Las descripciones completas de los códigos de operación están disponibles en el Ethereum Yellow Paper.

● Comparación y operación lógica bitwise

● Operación de parada y aritmética

● SHA3

● Informacion de bloque

● Informacion ambiental

● Operaciones de stack, memoria, almacenamiento y flujo

● Operaciones de duplicación

● Operaciones push

● Operaciones logging

● Operaciones de exchange

● Operaciones del sistema

Bytecode

Los códigos de bytes son cruciales para los EVM, ya que almacenan los códigos de operación de manera eficiente. A cada código de operación se le asigna un byte. Veamos un ejemplo para comprender mejor los códigos de bytes.

En la ilustración anterior, la instrucción al principio es 0x60, que se traduce en PUSH 1. Esto nos dice que los datos tienen 1 byte de longitud y podemos agregar el siguiente byte a el srack. Ahora el stack consta de 1 artículo. A continuación, sabemos que 0x01 es una instrucción PUSH; la siguiente instrucción necesaria es otro 0x60 con los mismos datos. Ahora el stack consta de dos elementos idénticos. La última instrucción, 0x01, se traduce en ADD> Esto tomará ambos elementos de el stack y empujará la suma de ellos a el stack. Ahora el stack contiene solo un elemento, 0x02.

Cómo descompilar códigos de bytes

Varios proyectos están intentando crear programas que ayuden a descompilar un contrato. Un par de ejemplos de tales proyectos son eveem.org y ethervm.io. Sin embargo, incluso al utilizar estos programas, los fragmentos del contrato original casi siempre se pierden debido a la optimización. Sin embargo, los nombres de las funciones aún se pueden mostrar mediante la fuerza bruta comparando las firmas con conjuntos de datos que contienen nombres de funciones y eventos.

Almacenamiento

La máquina virtual Ethereum utiliza un stack de 256 bits, lo que permite acceder simultáneamente a 16 elementos recientes.El stack puede contener un total de 1.024 elementos. Estas limitaciones son muy restrictivas y los códigos de operación terminan usando la memoria del contrato para pasar datos. Cuando se ha ejecutado el contrato, la memoria no se guarda.

Solo hay una forma de almacenar datos de forma permanente: utilizar el “almacenamiento” para que sea accesible para la ejecución de contratos. ¿Qué es el almacenamiento por contrato? Es una base de datos disponible públicamente donde los valores se pueden leer externamente sin enviar una transacción al contrato. Sin embargo, escribir en el almacenamiento es caro en comparación con escribir en la memoria.

AUTO DESTRUCCIÓN

SELF-DESTRUCT es una operación en Solidity que se utiliza para eliminar códigos de la blockchain. Sin embargo, los códigos podrían permanecer en la historia del EVM y definitivamente permanecerán en la historia de la cadena. Cuando se ejecuta una operación de AUTOdestrucción, tanto el código como el almacenamiento se eliminan del estado.

Creando un contrato inteligente

Los contratos inteligentes en Ethereum están escritos en un lenguaje de programación llamado Solidez. Como lenguaje de programación, Solidity es similar a otros lenguajes como JavaScript y C ++. Hay otros lenguajes que se utilizan para escribir contratos inteligentes, como Vyper y Bamboo. La máquina virtual Ethereum no puede ejecutar contratos inteligentes escritos en Solidity directamente. En cambio, se ensamblan en códigos de operación.

Un ejemplo de contrato inteligente escrito en Solidity

Veamos un ejemplo sencillo de cómo redactar un contrato inteligente. Supongamos que desea redactar un contrato inteligente para comprar algunas cosas con su familia. Hay varias cosas que debería incluir en el contrato inteligente.

● Primero, usted y los miembros de su familia deberán crear cuentas individuales.

● Cada miembro depositará algo de dinero de sus cuentas en una cuenta comun temporal.

● Cada miembro estará de acuerdo en que nadie puede sacar dinero de la cuenta comun.

● Puede retirar dinero de la cuenta comun solo si todos los miembros proporcionan una firma digital.

¿Qué sucede si desea crear un contrato inteligente diferente que se ocupe de la compra de alimentos para la casa? Tendría que especificar el presupuesto para comestibles, la tienda donde se deben comprar los suministros y dónde se deben entregar. Ese contrato inteligente debería especificar lo siguiente

● El presupuesto semanal para comestibles

● La tienda o la dirección de la tienda donde se deben comprar los alimentos

● La dirección donde desea que se entregue el mercardo

Implementación de contratos inteligentes

Repasemos el proceso de implementación de un contrato inteligente. Cuando necesita implementar un contrato inteligente, se crea una transacción. Sin embargo, la transacción no tiene una dirección “para”. El código de bytes se agrega como datos de entrada, que luego actúa como constructor. Se necesita el constructor para escribir las variables iniciales en el almacenamiento. Una vez que se implementa el contrato, el código de bytes se ejecuta solo una vez, mientras que el código de bytes de tiempo de ejecución se ejecuta en cada llamada de contrato

El código de bytes se puede dividir en los siguientes

● Constructor

● Tiempo de ejecución

● Metadata

Al final, Solidity crea un hash de enjambre y se incluirá en el código de bytes de tiempo de ejecución. Swarm es una plataforma de almacenamiento distribuida y un servicio de dispersión de contenido. Swarm no será visto como un código de operación por la Máquina Virtual Ethereum ya que su ubicación es inalcanzable.

Conclusion

La máquina virtual Ethereum es la base de Ethereum y su interfaz, actuando como una computadora descentralizada que contiene millones de proyectos ejecutables. El EVM es fundamental para la ejecución de funciones y el despliegue de contratos inteligentes. Asegura que los usuarios no enfrenten problemas en el libro mayor distribuido al emplear varias funcionalidades adicionales.

Finalmente, terminemos las cosas en la siguiente parte. En la parte 3, veremos cómo UTXO y EVM se unen con Qtum.

Sign up to discover human stories that deepen your understanding of the world.

Free

Distraction-free reading. No ads.

Organize your knowledge with lists and highlights.

Tell your story. Find your audience.

Membership

Read member-only stories

Support writers you read most

Earn money for your writing

Listen to audio narrations

Read offline with the Medium app

No responses yet

Write a response