Solidity: Bytecode vs ABI — EVM vs VM 🥊.
Tags: solidity, blockchain, programming, tutorial
Published: 2024-03-03 02:55:26

¿Alguna vez viste un **bytecode** o un **ABI **y no entendiste nada? ¿Cuál es la diferencia entre ambos? ¿Y que hay de las maquinas virtuales, sirven para lo mismo? Vamos a explicar un poco de estos conceptos, acompáñame:

![Lagarto rey de las criptomonedas.](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/i74ep58f0zsj0unhns2v.jpg)

## Bytecode vs ABI

## Bytecode
Cuando hacemos deploy de nuestros contratos en la blockchain, nuestro código de Solidity es traducido a un lenguaje que la EVM pueda entender. Si bien Solidity está pensando para ser compatible con la EVM, al compilarse se traduce en una secuencia de números y letras que indican cada función que especificamos en nuestro código. Los bytecode suelen ser extremadamente largos. ¿Pero cómo pueden reemplazar una secuencia de números y letras a todas nuestras funciones en Solidity?.

Esto es gracias a que _Ethereum _implementa algo conocido como los “opcodes”. Estos son conjuntos de 2 caracteres que representan una función. Acá te dejo la primera parte de la tabla de opcodes disponibles:

![Lista de Opcodes](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/c8ol1tzbvyqru2mtcugg.jpg)


De esta manera, el compilador traduce todo nuestro código Solidity a bytecode para poder ser ejecutado por la EVM.

## Application Binary Interface (ABI)
Si bien estamos explicando los conceptos por separado, estos trabajan en conjunto a la hora de interactuar y deployear nuestros contratos. Siendo el bytecode el qué se envía a la EVM y el ABI el encargado de mostrarnos los métodos y funciones que tiene el contrato para que podamos interactuar con el.

El ABI define los métodos y variables que están disponibles en un Smart Contract y que podemos usar para interactuar con ese contrato. Dado que los Smart Contracts se convierten en bytecode antes de implementarse en la cadena de bloques, el **ABI **nos brinda una forma de saber qué operaciones e interacciones podemos realizar con ellos.

Además, si vemos el formato que posee un ABI, nos daremos cuenta que nos permite leerlo de forma fácil e interactuar con lenguajes más populares, dado a que se compila en formato JSON. Veamos un ejemplo:

`[
 {
  "inputs": [],
  "stateMutability": "nonpayable",
  "type": "constructor"
 },
 {
  "inputs": [
   {
    "internalType": "bytes4",
    "name": "interfaceID",
    "type": "bytes4"
   }
  ],
  "name": "supportsInterface",
  "outputs": [
   {
    "internalType": "bool",
    "name": "",
    "type": "bool"
   }
  ],
  "stateMutability": "view",
  "type": "function"
 }
]`

## EVM y VM ¿Cuál es la diferencia?

Pasemos a hablar sobre entornos de ejecución virtuales. Son el paso final para poder utilizar nuestro código.

## VM
Las Virtual Machines son entornos de ejecución virtuales, es decir, no poseen un lugar físico. Son emulaciones de hardware en un entorno virtual. Esto sirve para poder generar poder de cómputo y procesamiento sin la necesidad de ocupar espacio físico. Existen muchas VM conocidas, como la JVM, la cuál es el entorno de ejecución de Java. Estos entornos virtuales nos permiten ejecutar software de manera controlada y aislada.

## EVM
Una vez compilado y traducido nuestro código, se envía a la _Ethereum Virtual Machine_ para ser ejecutado y poder utilizarlo. La EVM es específica para la plataforma de Ethereum, es descentralizada y vive en cada uno de los nodos que participan de la red. Es gracias a esta máquina virtual que todos nuestros Smart Contracts puede cumplir sus funciones.

![Ethereum Virtual Machine por dentro.](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bvnv4ds6piqto22sp9fz.jpg)

En resumen, la EVM es una VM pero específicamente diseñada para la plataforma de Ethereum.



📢 **Redes sociales**: [Twitter](https://twitter.com/Ialkaild), [LinkdIn](https://www.linkedin.com/in/armando-zlatkowicz/), [Instagram](https://www.instagram.com/arman__zlat/), [Medium](https://medium.com/@armandozlatkowicz).