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 ] }