Hola a todos!

Luego de un tiempo sin escribir algo para el blog, me animo a redactar un breve artículo sobre los OPCODES de Ethereum… ¡Manos a la obra!

Estuve leyendo estos días sobre programación de Contratos Inteligentes en lenguajes alternativos a Solidity, como Serpent y LLL. Si curioseamos un poco sobre Contratos Inteligentes rápidamente veremos que nos encontramos con la palabra OPCODE, ya sea cuando miramos un Smart Contract en Etherscan.io o cuando estamos desarrollando en Truffle, Remix o cualquier otro.

Por ejemplo, si revisamos el Smart Contract de la dApp que tenemos en Rinkeby llamada dMessenger y damos clic en la pestaña Code, podremos ver un largo código hexadecimal

Que toma más sentido si damos clic en Switch to Opcodes View

¿Qué es un OPCODE?

La traducción al español sería Código de Operación, término que tampoco nos dice mucho, así que para que vamos a inventar cosas, vamos a Wikipedia y nos encontramos con que un OPCODE es:

En informática, un opcode (operation code) o código de operación, es la porción de una instrucción de lenguaje de máquina que especifica la operación a ser realizada(…)

Los opcodes también pueden ser encontrados en los bytecodes interpretados por un interpretador de código de byte (o la máquina virtual, en un sentido de ese término). En éstos, una arquitectura de conjunto de instrucciones es creada para ser interpretada por software en vez de un dispositivo de hardware. A menudo, los interpretadores de código de byte trabajan con tipos de datos y operaciones de más alto nivel, que el de un conjunto de instrucciones por hardware, pero son construidas a lo largo de líneas similares. Ejemplos incluyen la máquina virtual de Java (JVM) del lenguaje de programación Java, el código de byte usado en GNU Emacs para el código compilado de LISP, y muchos otros.

Es decir, cada una de las instrucciones que indicamos en nuestro Smart Contract (al igual que en cualquier muchos otros lenguajes de programación (por no decir todos)) es convertida a una instrucción en lenguaje Ensamblador, la cuál a su vez tiene una representación como OPCODE.

¿Cuál es la gracia de los OPCODE?

Escribir el código de un Smart Contract en lenguajes como LLL te acercan mucho a la memoria, tal como Ensamblador lo haría, por lo que crear y asignar valores a las variables es mucho más barato de realizar a nivel de GAS, pues estamos enviando las instrucciones de manera directa y no esperando ser “interpretadas” por un compilador (como SOLC). Es decir, crear una variable y posteriormente asignarle un valor sería más barato mediante su OPCODE correspondiente antes que crear una función en un lenguaje compilado como Solidity.

Según este artículo de Consensys un código binario en LLL es un 70% más liviano que un código Solidity.

¿Cuales son los OPCODE que nos provee la EVM?

0x0… : Stop y Operaciones aritméticas

0x1… : Operadores Lógicos y Comparaciones

0x20 : Convierte valor a hash Keccak-256

0x3… : Información del contrato.

0x4… : Información del Bloque

0x5… : Operaciones de pila, memoria, almacenamiento y flujo

0x6… / 0x7… : Administración de pila

0x8… : Operaciones de duplicación de la pila

0x9… : Operaciones de intercambio de elementos en la pila

0xa… : Operaciones de LOG

0xf… : Operaciones del Sistema

Próximamente podríamos hacer un Contrato Inteligente en LLL y ver la aplicación directa de estos OPCODES, por lo que de momento me retiro 🙂

¡Muchas gracias a quienes leen!

Saludos, Javier Guajardo 😀