Logo
Nuevos usuarios de RPC: 35% de descuento el primer mesVer oferta
OnFinality Learn
Integración y desarrollo11 min de lectura

RPC de blockchain: cómo las llamadas a procedimientos remotos conectan las aplicaciones con los datos en cadena

Una guía práctica sobre RPC de blockchain: cómo llegan las solicitudes JSON-RPC a los nodos, cómo implementar y verificar llamadas, y cómo diagnosticar los fallos que afectan a las dApps.

TL;DR

El RPC de blockchain es la interfaz de llamada a procedimiento remoto que permite a una aplicación solicitar a un nodo de blockchain que lea el estado, simule la ejecución o difunda una transacción firmada. La aplicación envía una solicitud JSON-RPC a una URL de endpoint; el nodo la ejecuta contra su copia local del estado de la cadena y devuelve un resultado estructurado o un error. Este artículo explica el ciclo de vida de la solicitud, muestra llamadas ejecutables que puedes adaptar a cualquier red compatible con EVM, proporciona un procedimiento de verificación y solución de problemas, y separa el comportamiento documentado del protocolo de las cifras de latencia y fiabilidad que debes medir tú mismo. Cierra con las ventajas y desventajas entre endpoints autoalojados, públicos y gestionados para que puedas elegir una configuración que se ajuste a tu carga de trabajo.

Qué es realmente el RPC de blockchain

La llamada a procedimiento remoto (RPC) es un patrón informático general: un programa invoca un procedimiento en otra máquina y recibe el resultado como si la llamada fuera local. En blockchain, el cliente es tu aplicación y el servidor es un nodo que ejecuta el software cliente de la red. La aplicación no necesita saber cómo almacena el estado el nodo ni de qué pares se sincroniza; solo necesita un formato de solicitud y una dirección a la que enviarla.

La mayoría de las redes EVM hablan JSON-RPC 2.0 sobre HTTP o WebSocket. Una solicitud lleva un nombre de método, un array de params, un id y una cadena de versión jsonrpc. El nodo responde con el mismo id y, o bien un resultado, o bien un objeto de error. Las redes no EVM exponen sus propias superficies RPC, pero el modelo mental es idéntico: un transporte, un espacio de nombres de métodos y un nodo que responde desde el estado de la cadena.

A menudo se usan tres términos indistintamente y conviene separarlos. RPC es el protocolo. El nodo es la máquina que responde. El endpoint es la URL a la que marca tu aplicación. Con un proveedor gestionado, una única URL de endpoint puede estar delante de una flota de nodos, por lo que una sola dirección no se corresponde con una sola máquina.

  • RPC: el protocolo de solicitud/respuesta y el contrato de métodos.
  • Nodo: software cliente que mantiene el estado de la cadena y las conexiones con pares.
  • Endpoint: la dirección de red (HTTP o WSS) a la que llama tu aplicación.

Alcance, supuestos y qué cubre esta guía

Esta guía supone que tienes un cliente HTTP básico, una terminal y acceso a un endpoint RPC para una red compatible con EVM. Los ejemplos usan marcadores de posición como RPC_URL y PRIVATE_KEY; sustituye tus propios valores y nunca confirmes secretos en el control de código fuente. Los procedimientos se aplican a cualquier red JSON-RPC, aunque los nombres de los métodos difieren fuera de EVM.

El objetivo es la comprensión operativa: qué hace una llamada, cómo demostrar que funciona y cómo interpretar los fallos. La selección del proveedor es una decisión aparte. Si quieres una recomendación concreta para una cadena específica, el Asistente de RPC la responde directamente; esta página te da el marco para evaluar cualquier endpoint al que llegues.

El ciclo de vida de la solicitud desde la aplicación hasta el estado de la cadena

Una llamada de lectura como eth_getBalance viaja desde tu aplicación por HTTPS hasta el endpoint, que la enruta a un nodo. El nodo busca la cuenta en su trie de estado en la altura de bloque solicitada y devuelve un saldo codificado en hexadecimal. No se crea ninguna transacción y no se gasta gas. Las llamadas de lectura son idempotentes y seguras de reintentar.

Una ruta de escritura es diferente. Tu aplicación construye una transacción, la firma localmente con una clave privada y envía los bytes firmados en bruto mediante eth_sendRawTransaction. El nodo valida la firma y el nonce, añade la transacción a su mempool y devuelve un hash de transacción. Ese hash es un recibo de envío, no una prueba de inclusión. La confirmación solo llega cuando un bloque posterior incluye la transacción, lo que observas consultando eth_getTransactionReceipt.

Esta separación importa para la depuración. Una lectura fallida suele significar un parámetro incorrecto, un método no soportado o un nodo que está por detrás de la cabeza de la cadena. Una escritura fallida suele significar un conflicto de nonce, fondos insuficientes, un problema de estimación de gas o un nodo que rechazó la transacción antes de que llegara al mempool.

Hacer tu primera llamada RPC verificada con curl

Empieza con una llamada de solo lectura para confirmar la conectividad y la forma de la respuesta sin arriesgar fondos. La siguiente solicitud pide el número de bloque más reciente. Sustituye RPC_URL por tu endpoint.

Una respuesta saludable devuelve un objeto JSON con jsonrpc, id y un resultado hexadecimal. Convierte el hexadecimal a decimal para compararlo con un explorador de bloques de la misma red. Si el número está muy por detrás del explorador, el nodo va con retraso; si la solicitud agota el tiempo de espera, el endpoint es inaccesible o está limitado por tasa.

curl -s -X POST "$RPC_URL" \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":1,"method":"eth_blockNumber","params":[]}'

Implementar lecturas y escrituras firmadas en JavaScript

Los clientes de producción suelen usar una biblioteca en lugar de JSON construido a mano. El ejemplo siguiente usa ethers para leer un saldo y enviar una transferencia de valor. Separa la lectura, la estimación de gas y la difusión para que cada paso pueda fallar de forma independiente y quede registrado.

Observa que la clave privada nunca sale del proceso; el proveedor solo ve la transacción en bruto firmada. Fíjate también en la configuración explícita de nonce y gas. Dejar que la biblioteca los infiera está bien para scripts, pero los valores explícitos hacen que los reintentos sean deterministas cuando un intento anterior puede haberse completado parcialmente.

import { JsonRpcProvider, Wallet, parseEther } from "ethers";

const provider = new JsonRpcProvider(process.env.RPC_URL);
const wallet = new Wallet(process.env.PRIVATE_KEY, provider);

async function demo() {
  const balance = await provider.getBalance(wallet.address);
  console.log("balance:", balance.toString());

  const nonce = await provider.getTransactionCount(wallet.address, "pending");
  const fee = await provider.getFeeData();

  const tx = await wallet.sendTransaction({
    to: "0x000000000000000000000000000000000000dEaD",
    value: parseEther("0.0001"),
    nonce,
    maxFeePerGas: fee.maxFeePerGas,
    maxPriorityFeePerGas: fee.maxPriorityFeePerGas,
    gasLimit: 21000n,
  });

  console.log("submitted:", tx.hash);
  const receipt = await tx.wait(1);
  console.log("included in block:", receipt.blockNumber);
}

demo().catch(console.error);

Un procedimiento repetible de verificación y medición de latencia

No confíes en la cifra de latencia de marketing de un proveedor; mide la ruta que tus usuarios tomarán realmente. Ejecuta el procedimiento siguiente desde la misma región y condiciones de red que tu carga de trabajo de producción, y repítelo a varias horas del día. Registra cada ejecución en una tabla de resultados para poder comparar endpoints en igualdad de condiciones.

El procedimiento: (1) envía eth_blockNumber 50 veces de forma secuencial y registra el tiempo de ida y vuelta de cada llamada; (2) envía la misma llamada 20 veces de forma concurrente y registra p50 y p95; (3) llama a eth_getBalance para una dirección conocida en un bloque histórico fijo y confirma que el valor coincide con un explorador; (4) llama a un método no soportado y confirma que la forma del error es un error JSON-RPC adecuado en lugar de una página HTML; (5) repite toda la secuencia contra un segundo endpoint.

Rellena una tabla como la siguiente con tus propias mediciones. Deja las celdas en blanco hasta que tengas datos reales; no estimes.

| Endpoint label | Region | Sequential p50 (ms) | Sequential p95 (ms) | Concurrent p95 (ms) | Historical read matches explorer | Error shape valid |
| -------------- | ------ | ------------------- | ------------------- | ------------------- | ------------------------------- | ----------------- |
| RPC_URL_A      |        |                     |                     |                     |                                 |                   |
| RPC_URL_B      |        |                     |                     |                     |                                 |                   |

Leer los resultados y saber cuándo una llamada es saludable

Un endpoint saludable devuelve un sobre JSON-RPC válido para cada solicitud, incluidos los errores. El id de la respuesta debe coincidir con el id que enviaste; las discrepancias indican un proxy o una caché en la ruta. Las lecturas históricas deben coincidir con una fuente independiente, porque un nodo que se está sincronizando o podado devolverá null o un error para bloques antiguos en lugar de un valor incorrecto.

Las distribuciones de latencia importan más que los promedios. Un p50 de unos cientos de milisegundos con un p95 varias veces mayor sugiere colas bajo carga. Si el p95 concurrente es mucho peor que el p95 secuencial, el endpoint está limitando la tasa o el nodo está saturado. Estas son las cifras que debes comparar cuando evalúas un servicio gestionado, y las cifras que debes volver a ejecutar después de cualquier cambio de infraestructura.

Solución de problemas comunes de RPC

La mayoría de los incidentes de producción se engloban en un pequeño conjunto de categorías. Recórrelas en orden, porque un fallo de transporte enmascara todas las capas superiores.

Conexión rechazada o errores TLS significan que el endpoint es incorrecto, el host está caído o un firewall está bloqueando la salida. HTTP 429 significa que superaste un límite de tasa; retrocede con jitter y considera un plan con límites más altos. El error JSON-RPC -32000 con un mensaje sobre nonce significa que tu transacción entra en conflicto con otra ya pendiente; vuelve a leer el nonce pendiente y reconstruye. El error -32000 que menciona fondos insuficientes significa que la cuenta no puede cubrir el valor más el gas con la tarifa actual. Un resultado null para un recibo significa que la transacción aún no se ha minado; sigue consultando con un tiempo de espera acotado. Un resultado que va por detrás de la cabeza de la cadena significa que el nodo está retrasado; cambia a otro endpoint.

Registra el id de solicitud completo, el método, los params y el cuerpo de la respuesta en caso de fallo. Sin el id y los params, no puedes distinguir un error del cliente de un problema del nodo.

  • 429 o 5xx: problema de transporte o de cuota, reintenta con retroceso.
  • Errores de nonce: vuelve a leer el nonce pendiente antes de reenviar.
  • Recibos null: transacción aún no incluida, consulta con un plazo límite.
  • Números de bloque obsoletos: nodo retrasado, cambia de endpoint o alerta.

Comparación de endpoints públicos, autoalojados y gestionados

Los endpoints públicos son gratuitos y cómodos para prototipos, pero son compartidos, a menudo tienen límites de tasa y puede que no garanticen datos de archivo ni suscripciones WebSocket. Autoalojar un nodo te da control total y privacidad, pero asumes el tiempo de sincronización, el crecimiento del disco, las actualizaciones y el tiempo de actividad. Un proveedor gestionado se sitúa entre ambos: obtienes una URL estable y soporte operativo, y cambias algo de control y coste por fiabilidad.

La elección correcta depende de tu mezcla de lecturas y escrituras, tu tolerancia al tiempo de inactividad y si necesitas estado histórico. Una cartera que solo lee bloques recientes tiene necesidades distintas de un indexador que reproduce años de logs. Si necesitas capacidad dedicada y rendimiento predecible, un nodo dedicado es la opción relevante; si quieres una configuración gestionada multicadena, revisa la cobertura de red y los precios antes de comprometerte.

  • Público: coste más bajo, capacidad compartida, mejor para pruebas y prototipos.
  • Autoalojado: máximo control, mayor carga operativa.
  • Gestionado: endpoint estable y soporte, coste por uso o por plan.
  • Dedicado: capacidad reservada para cargas de alto rendimiento o sensibles a la latencia.

Limitaciones y compensaciones que debes planificar

RPC es una interfaz de solicitud/respuesta, no un índice de streaming. Si necesitas cada evento en orden, construirás una canalización de sondeo de logs o de suscripción y gestionarás las reorganizaciones tú mismo. Las consultas de archivo son caras y no todos los endpoints las sirven. Las suscripciones WebSocket pueden caerse silenciosamente, por lo que los clientes de producción necesitan lógica de reconexión y un respaldo basado en sondeo.

Ningún endpoint único es una estrategia de fiabilidad completa. Usa al menos dos endpoints independientes, comprueba su estado y redirige alrededor de los fallos. Trata los límites de tasa como una restricción de diseño, no como algo secundario, y cachea datos inmutables como bloques históricos confirmados cuando tu aplicación lo permita.

Próximos pasos para una configuración RPC lista para producción

Pasa de una única URL codificada directamente a una capa de configuración con endpoints primarios y de respaldo, tiempos de espera por método y registro estructurado. Añade una comprobación sintética que ejecute el procedimiento de verificación de forma programada y alerte cuando el p95 o la tasa de errores cruce un umbral que establezcas a partir de tu propia línea base. Documenta de qué métodos depende tu aplicación para que un cambio de proveedor pueda validarse rápidamente.

Cuando estés listo para elegir endpoints concretos, empieza con la guía de endpoints RPC para el modelo general y luego usa el Asistente de RPC para recomendaciones específicas de cada cadena. Revisa las redes soportadas y los precios para ajustar la cobertura y el presupuesto, y considera un nodo dedicado si tus mediciones muestran que la capacidad compartida es el cuello de botella.

Nunca te preocupes por la infraestructura nuevamente

OnFinality elimina la carga pesada de DevOps para que puedas construir de forma más inteligente y rápida.

Comenzar