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
  • Estructura de una solicitud JSON-RPC
  • Uso de JSON-RPC en Ethereum
  • Conexión a Ethereum utilizando la terminal y JSON RPC.
  • Algunos métodos JSON-RPC
  • Información adicional

Was this helpful?

  1. Módulo 4
  2. Toolkit para desarrollo en Ethereum
  3. Toolkit

JSON-RPC

PreviousToolkitNextEthers.js

Last updated 8 months ago

Was this helpful?

¿Cómo conectamos una aplicación o nuestra terminal a una blockchain para que pueda interactuar con ella? Debemos conectarnos a un nodo de la blockchain utilizando un protocolo de comunicación.

En el caso de Ethereum, cada cliente de ejecución (Geth, Erigon, Besu, Nethermind) implementa una misma especificación JSON-RPC, de forma que existe un grupo de métodos al que las aplicaciones tienen acceso independientemente del cliente usado.

JSON-RPC es un protocolo para ejecutar métodos de forma remota que utiliza el formato JSON como estándar para transferir datos. JSON-RPC es independiente del lenguaje de programación, lo que permite su implementación en diversas tecnologías y entornos.

¿A qué nodo nos conectamos? A cualquier nodo de la blockchain, ya sea un nodo que nosotros controlemos o el de un tercero. En el segundo caso existen proveedores de acceso a blockchain como Alchemy, Quicknode o Infura, que brindan nodos para realizar esta conexión.

JSON-RPC puede ser transportado sobre diversos protocolos de comunicación, como HTTP, WebSockets, TCP, etc. En el caso de HTTP no mantiene la conexión abierta, a diferencia de WebSockets que sí lo hace.

Estructura de una solicitud JSON-RPC

Una solicitud JSON-RPC contiene los siguientes campos:

  • jsonrpc: La versión del protocolo (actualmente "2.0").

  • method: El nombre del método a invocar.

  • params: (Opcional) Los parámetros para el método, que pueden ser un array o un objeto.

  • id: (Opcional) Un identificador único para la solicitud, utilizado para correlacionar las respuestas. Si no se especifica, la solicitud se considera una notificación y no se espera una respuesta.

Veamos un ejemplo:

{
  "jsonrpc": "2.0",
  "method": "subtract",
  "params": [42, 23],
  "id": 1
}

Estructura de una respuesta JSON-RPC

Una respuesta JSON-RPC contiene los siguientes campos:

  • jsonrpc: La versión del protocolo (actualmente "2.0").

  • result: El resultado de la ejecución del método (presente si no hubo errores).

  • error: Un objeto de error (presente si hubo un error en la ejecución).

  • id: El identificador de la solicitud correspondiente.

Ejemplo de una respuesta exitosa

{
  "jsonrpc": "2.0",
  "result": 19,
  "id": 1
}

Ejemplo de una respuesta con error

{
  "jsonrpc": "2.0",
  "error": {
    "code": -32601,
    "message": "Method not found"
  },
  "id": 1
}

Estructura de una notificación JSON-RPC

Una notificación es una solicitud sin campo id, lo que indica que el cliente no espera una respuesta.

{
  "jsonrpc": "2.0",
  "method": "update",
  "params": ["parameter1", "parameter2"]
}

Uso de JSON-RPC en Ethereum

Los métodos JSON RPC en Ethereum permiten enviar transacciones, consultar balances, interactuar con contratos inteligentes, entre otras operaciones. A continuación algunos ejemplos:

  1. eth_blockNumber: Obtiene el número del bloque más reciente.

    Solicitud:

    {
      "jsonrpc": "2.0",
      "method": "eth_blockNumber",
      "params": [],
      "id": 1
    }

    Respuesta:

    {
      "jsonrpc": "2.0",
      "result": "0x5b8d80",
      "id": 1
    }

    Se puede observar que el resultado de la respuesta es devuelto en hexadecimal. Expresado en decimal el resultado sería “6000000”.

  2. eth_getBalance: Obtiene el saldo de una dirección especificada.

    Solicitud:

    {
      "jsonrpc": "2.0",
      "method": "eth_getBalance",
      "params": ["0x742d35Cc6634C0532925a3b844Bc454e4438f44e", "latest"],
      "id": 1
    }

    En este caso hubo que especificar como parámetros el address y el número bloque en el que queremos conocer el saldo (el más reciente).

    Respuesta:

    {
      "jsonrpc": "2.0",
      "result": "0x0234c8a3397aab58",
      "id": 1
    }

    Expresado en decimal el resultado sería “158972490234375000” wei, o lo que es lo mismo 0.159 ETH.

  3. eth_sendTransaction: Envía una transacción.

    Solicitud:

    jsonCopiar código
    {
      "jsonrpc": "2.0",
      "method": "eth_sendTransaction",
      "params": [{
        "from": "0xYourAddress",
        "to": "0xReceiverAddress",
        "value": "0x9184e72a000"  // 0.01 ether
      }],
      "id": 1
    }

    Respuesta:

    {
      "jsonrpc": "2.0",
      "result": "0xTransactionHash",
      "id": 1
    }

    El resultado que obtendremos como respuesta en este caso es el hash de la transacción.

Conexión a Ethereum utilizando la terminal y JSON RPC.

Para establecer comunicación entre tu terminal y la blockchain de Ethereum utilizando llamadas JSON-RPC debemos seguir los siguientes pasos:

Paso 1: Configurar un nodo Ethereum o utilizar un nodo público

Como ya lo indicamos anteriormente, para interactuar con la blockchain de Ethereum, necesitas conectarte a un nodo. Puedes configurar tu propio nodo usando software como Geth o Nethermind, o utilizar un nodo público como Alchemy, Infura o QuickNode. Para efectos de este ejemplo utilizaremos un nodo de Alchemy.

Paso 2: Obtener un Endpoint JSON-RPC

  • Crea un nuevo proyecto y obtén la URL de tu endpoint, que tendrá un formato similar a:

    <https://eth-mainnet.g.alchemy.com/v2/YOUR_ALCHEMY_PROJECT_ID>

Paso 3: Hacer Llamadas JSON-RPC desde la terminal

Puedes utilizar herramientas como curl para hacer llamadas JSON-RPC directamente desde la terminal.

Ejemplo: Obtener el número de bloque Actual

Usando curl, puedes hacer una llamada JSON-RPC para obtener el número de bloque actual de la red Ethereum.

curl -X POST <https://eth-mainnet.g.alchemy.com/v2/YOUR_ALCHEMY_PROJECT_ID> \\
     -H "Content-Type: application/json" \\
     -d '{
           "jsonrpc":"2.0",
           "method":"eth_blockNumber",
           "params":[],
           "id":1
         }'

Explicación del comando

  • X POST: Indica que se trata de una solicitud POST.

  • https://eth-mainnet.g.alchemy.com/v2/YOUR_ALCHEMY_PROJECT_ID: URL del nodo Ethereum al que te estás conectando.

  • H "Content-Type: application/json": Establece el tipo de contenido de la solicitud como JSON.

  • d '...': Define el cuerpo de la solicitud, que contiene los parámetros de la llamada JSON-RPC.

Respuesta esperada

La respuesta será un objeto JSON que contiene el número de bloque actual en formato hexadecimal.

{
  "jsonrpc": "2.0",
  "id": 1,
  "result": "0x131f640" // Número de bloque en formato hexadecimal
}

Algunos métodos JSON-RPC

Método
Descripción
Parámetros
JSON

eth_chainId

Devuelve el ID de la blockchain actual. En el caso de Ethereum es 1.

{ "jsonrpc": "2.0", "method": "eth_chainId", "params": [] }

eth_blockNumber

Devuelve el número del bloque más reciente.

{ "jsonrpc": "2.0", "method": "eth_blockNumber", "params": [] }

eth_gasPrice

Devuelve el precio actual del gas expresado en wei.

{ "jsonrpc": "2.0", "method": "eth_gasPrice", "params": [] }

eth_blobBaseFee

Devuelve la tarifa base por gas de blob expresado en wei..

{ "jsonrpc": "2.0", "method": "eth_blobBaseFee", "params": [] }

eth_getBalance

Devuelve el saldo de una cuenta en un bloque determinado

account, block (earliest, latest, safe, finalized, pending)

{ "jsonrpc": "2.0", "method": "eth_getBalance", "params": [ "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045", "latest" ] }

eth_getCode

Devuelve el código almacenado en una dirección determinada.

account, block (earliest, latest, safe, finalized, pending)

{ "jsonrpc": "2.0", "method": "eth_getCode", "params": [ "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", "latest" ] }

eth_call

Ejecuta una llamada sin crear una transacción en la blockchain (lectura).

nonce, type, from, to, gas, value, data, gas price, max fee per gas, max priority fee per gas, max fee per blob gas, block.

{ "jsonrpc": "2.0", "method": "eth_call", "params": [ { "nonce": null, "type": null, "from": null, "to": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", "gas": null, "value": null, "data": null, "gasPrice": null, "maxFeePerGas": null, "maxPriorityFeePerGas": null, "maxFeePerBlobGas": null }, "latest" ] }

eth_getBlockByNumber

Devuelve información de un bloque en función del número de bloque.

block, is full (boolean)

{ "jsonrpc": "2.0", "method": "eth_getBlockByNumber", "params": [ "latest", false ] }

Información adicional

Para conectarte a un nodo de Alchemy debes crear una cuenta en y obtener una URL de endpoint JSON-RPC.

Regístrate en .

https://www.alchemy.com/
Alchemy
JSON-RPC en ethereum.org
Playground de JSON-RPC
Especificación técnica de los métodos JSON-RPC