ETH Kipu
  • Ethereum Developer Pack
  • Módulo 1
    • Intro a Smart Contracts
      • Fundamentos de Blockchain
        • Antecedentes
        • Bitcoin
        • Qué es Blockchain
        • Conceptos Clave en Blockchain
        • Cómo funciona la Blockchain
        • Tipos de Blockchain
        • Modelos de Consenso
      • El nuevo Internet
        • Web 3
        • Elementos Fundamentales
        • Impacto de Ethereum en Diversos Sectores
      • Wallets
        • Componentes de una wallet
        • Tipos de Wallet
        • Códigos mnemónicos
      • Ethereum 101
        • Smart Contracts
        • Cuentas
          • Tipos de cuentas
          • Contenido de cuentas
        • Transacciones
          • Componentes
          • Ciclo de vida
        • Gas
        • Solidity
        • EVM
          • La máquina de estados
          • Opcodes
          • Cómo funciona la EVM
          • Clientes de ejecución
          • DApps
      • Blockchain Explorer
        • Funciones de un blockchain explorer
        • Beneficios de utilizar un blockchain explorer
      • Remix
        • Características de Remix
        • Workspaces o espacios de trabajo
        • Cargar y compilar un contrato
        • Desplegar en la máquina virtual de Remix (Remix VM)
        • Interactuando con funciones
        • Desplegar en una red pública
      • Crea tu primer Smart Contract
  • Módulo 2
    • Fundamentos de Solidity
      • Hello World
      • Tipos de Datos
      • Funciones
      • Variables
        • Ejercicio 1
      • Operadores
        • Ejercicio 2
      • Constructor
        • Ejercicio 3
      • Convenciones de nomenclatura
      • Tipos de almacenamiento para variables
      • Estructuras de Control
        • Ejercicio 4
      • Modificadores
      • Eventos
        • Ejercicio 5
      • Tipos de Referencia
        • Arrays
          • Ejercicio 6
        • Mappings
          • Ejercicio 7
        • Structs
          • Ejercicio 8
      • Address Payable
      • Cómo reciben Ether los contratos y funciones
      • Transferencias de Ether
      • Conceptos Avanzados
        • Codificación ABI
        • Hashing
        • This
        • Herencia
        • Abstract
        • Interface
        • Llamadas entre contratos
        • EVM
        • ABI
        • Bytecode
        • Opcodes
  • Módulo 3
    • Estándares, Librerías y Patrones
      • Buenas Prácticas de Diseño
      • Patrones de Diseño
      • EIP y ERC
      • ERC-20
      • ERC-721
      • Open Zeppelin
      • Crea un Token ERC-20
      • Almacenamiento Descentralizado: IPFS
      • Crea un Token ERC-721
      • DeFi
  • Módulo 4
    • Toolkit para desarrollo en Ethereum
      • Requisitos para el módulo 4
        • Terminal
        • Git y Github
        • Node.js y npm
        • Visual Studio Code para Solidity
      • Toolkit
        • JSON-RPC
        • Ethers.js
          • Ejercicio
        • Hardhat
          • Despliegue de un contrato en Hardhat
          • Despliegue de un contrato en una red pública
        • Scaffold-ETH
          • Características
          • Cómo instalar Scaffold-ETH
  • Módulo 5
    • Seguridad, Pruebas y Auditoría
      • Pruebas
        • Importancia de realizar pruebas
        • Métodos para probar contratos inteligentes
          • Pruebas automatizadas
          • Pruebas manuales
        • Conceptos importantes en testing
        • Herramientas para testing
        • Testing con Hardhat
        • Recursos adicionales
      • Seguridad
        • Una mentalidad distinta de diseño
        • Principales vulnerabilidades en smart contracts
          • Reentrancy attack (ataque de reentrada)
          • Replay attack (ataque de repetición)
          • Price Oracle Manipulation (Manipulación de Oráculos de Precios)
          • Missing Access Control (Pérdida de Control de Acceso)
          • Reward Manipulation (Manipulación de Recompensas)
          • Failure to Initialize (Falla al Inicializar)
          • Front-running
          • Invariant Breaks (Ruptura de invariantes)
          • Mishandling of ETH (Mal manejo de ETH)
          • Denial of Service (DoS - Denegación de Servicio)
          • Integer overflow and underflow (desbordamiento y subdesbordamiento de enteros)
          • Phishing y Typosquatting
        • Recursos adicionales
      • Auditoría de smart contracts
        • Proceso de Auditoría
        • Herramientas
        • Cómo prepararse para una auditoría
        • El test Rekt
        • Retos
        • Recursos adicionales
  • Contribuye
    • Kipu Explorer
Powered by GitBook
On this page

Was this helpful?

  1. Módulo 2
  2. Fundamentos de Solidity
  3. Conceptos Avanzados

Opcodes

En el contexto de Ethereum y Solidity, los opcodes (código de operación) son instrucciones de bajo nivel que la Ethereum Virtual Machine (EVM) puede ejecutar. Cada opcode representa una operación específica, como realizar cálculos matemáticos, leer y escribir en el almacenamiento, manipular el stack, realizar saltos condicionales e incondicionales, gestionar llamadas a otros contratos, y más. Los opcodes son los elementos fundamentales del bytecode que se ejecuta en la EVM.

Los opcodes de Ethereum se codifican como un byte (2 caracteres hexadecimales). Cada opcode tiene un significado específico. Por ejemplo, el opcode ADD se utiliza para sumar dos valores, el opcode SUB se utiliza para restar dos valores y el opcode EQ se utiliza para comparar dos valores.

Si empezamos a desmenuzar el bytecode de la sección anterior encontraremos al principio los siguientes opcodes:

  • 60 es el opcode para PUSH1, lo que indica que el siguiente byte (u octeto) debe ser colocado en el stack.

  • 80 sería el dato empujado por el PUSH1.

  • 60 nuevamente indica otro PUSH1.

  • 40 es el dato para este segundo PUSH1.

  • 52 corresponde al opcode MSTORE, que guarda la palabra en memoria.

La EVM tiene un conjunto de 144 opcodes. Los opcodes se dividen en las siguientes categorías:

  • Operaciones aritméticas. Se utilizan para realizar operaciones básicas, como sumar, restar, multiplicar y dividir.

  • Operaciones lógicas. Se utilizan para realizar operaciones lógicas, como AND, OR y NOT.

  • Operaciones de comparación. Se utilizan para comparar dos valores.

  • Operaciones de asignación. Se utilizan para asignar un valor a una variable.

  • Operaciones de control de flujo. Se utilizan para controlar el flujo de ejecución de un contrato inteligente.

  • Operaciones de memoria. Se utilizan para manipular la memoria de la EVM.

  • Operaciones de llamadas. Se utilizan para llamar a funciones de contratos inteligentes.

  • Operaciones de creación de contratos. Se utilizan para crear nuevos contratos inteligentes.

Características de los Opcodes

  • Bajo Nivel: Los opcodes operan a un nivel más bajo que el código Solidity. Mientras que los desarrolladores escriben contratos inteligentes en Solidity (u otros lenguajes de alto nivel), estos contratos son compilados a bytecode que consiste en una secuencia de opcodes.

  • Determinismo: Cada opcode realiza una función específica y determinista, lo que es crucial para asegurar que todas las copias de la EVM en diferentes nodos de la red Ethereum ejecuten el mismo conjunto de instrucciones de manera idéntica y lleguen al mismo estado final.

  • Consumo de Gas: Ejecutar opcodes en la EVM consume una cantidad específica de gas.

Ejemplos de Opcodes

Aquí hay algunos ejemplos de opcodes en Ethereum y sus funciones:

  • ADD, SUB, MUL, DIV: Realizan operaciones aritméticas básicas como sumar, restar, multiplicar y dividir.

  • PUSH1, PUSH2, ..., PUSH32: Colocan una constante de 1 a 32 bytes en el stack.

  • CALL: Realiza una llamada a otro contrato.

  • STORE, LOAD: Escriben y leen datos del almacenamiento persistente del contrato.

  • JUMP, JUMPI: Realizan saltos incondicionales y condicionales, respectivamente, lo que permite la ejecución de bucles y condicionales.

  • STOP, RETURN, REVERT: Controlan la terminación de la ejecución, devolviendo datos o revirtiendo la transacción.

Aunque los desarrolladores de Solidity generalmente no trabajan directamente con opcodes (ya que escriben código en un nivel más alto de abstracción), entender cómo el código Solidity se compila a opcodes puede ser útil para optimizar contratos inteligentes, especialmente en términos de consumo de gas. Además, la seguridad de los contratos inteligentes puede depender de comprender las implicaciones de bajo nivel de las operaciones de la EVM.

Finalmente veamos la relación entre ABI, bytecode y opcodes.

A través de la compilación se obtiene el ABI y el bytecode.

Cuando se quiere ejecutar alguna función del smart contract que está en la blockchain bajo la forma de bytecode, se llama a esta función utilizando el ABI.

Con la información del ABI se identificará dentro del bytecode la función que luego se descompondrá en sus opcodes que a su vez serán procesados por la EVM.

PreviousBytecodeNextEstándares, Librerías y Patrones

Last updated 8 months ago

Was this helpful?

Una muy buena referencia para entender el funcionamiento de los opcodes es la página donde puedes ver la relación entre el código de un smart contracts y sus opcodes.

EVM Opcodes