JSON-RPC
Last updated
Last updated
¿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.
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:
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
Ejemplo de una respuesta con error
Una notificación es una solicitud sin campo id
, lo que indica que el cliente no espera una respuesta.
Los métodos JSON RPC en Ethereum permiten enviar transacciones, consultar balances, interactuar con contratos inteligentes, entre otras operaciones. A continuación algunos ejemplos:
eth_blockNumber: Obtiene el número del bloque más reciente.
Solicitud:
Respuesta:
Se puede observar que el resultado de la respuesta es devuelto en hexadecimal. Expresado en decimal el resultado sería “6000000”.
eth_getBalance: Obtiene el saldo de una dirección especificada.
Solicitud:
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:
Expresado en decimal el resultado sería “158972490234375000” wei, o lo que es lo mismo 0.159 ETH.
eth_sendTransaction: Envía una transacción.
Solicitud:
Respuesta:
El resultado que obtendremos como respuesta en este caso es el hash de la transacción.
Para establecer comunicación entre tu terminal y la blockchain de Ethereum utilizando llamadas JSON-RPC debemos seguir los siguientes pasos:
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.
Para conectarte a un nodo de Alchemy debes crear una cuenta en https://www.alchemy.com/ y obtener una URL de endpoint JSON-RPC.
Regístrate en Alchemy.
Crea un nuevo proyecto y obtén la URL de tu endpoint, que tendrá un formato similar a:
Puedes utilizar herramientas como curl
para hacer llamadas JSON-RPC directamente desde la terminal.
Usando curl
, puedes hacer una llamada JSON-RPC para obtener el número de bloque actual de la red Ethereum.
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.
La respuesta será un objeto JSON que contiene el número de bloque actual en formato hexadecimal.
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 ] } |