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

Arquitectura de endpoints RPC: cómo las llamadas a procedimientos remotos llegan a un nodo de blockchain

Una guía práctica sobre cómo funcionan los endpoints RPC, cómo viajan las solicitudes JSON-RPC del cliente al nodo y cómo implementar, verificar y solucionar problemas de acceso a endpoints sin conjeturas.

TL;DR

Un endpoint RPC es la dirección de red que un cliente utiliza para invocar procedimientos en un servidor remoto y, en contextos de blockchain, suele ser una URL HTTP o WebSocket que acepta solicitudes JSON-RPC y las reenvía a un nodo. El endpoint en sí no es el nodo: es la capa de enrutamiento, autenticación y protocolo que expone capacidades seleccionadas del nodo. Este artículo explica la ruta de la solicitud, muestra código de cliente ejecutable y ofrece un procedimiento repetible para verificar la corrección, la latencia y el comportamiento ante fallos. También separa el comportamiento documentado del protocolo de las afirmaciones específicas de cada proveedor y de las mediciones que debes ejecutar contra tu propio endpoint.

Respuesta directa y alcance

Un endpoint RPC es una URL o dirección de red mediante la cual un cliente envía una llamada a procedimiento remoto a un servidor y recibe un resultado estructurado. En los sistemas de blockchain, el servidor suele ser un nodo que ejecuta software cliente, como un cliente de ejecución de Ethereum, y el endpoint habla JSON-RPC sobre HTTP o WebSocket. El endpoint es el límite del contrato: define qué métodos se exponen, cómo se autentican las solicitudes, qué límites de velocidad se aplican y cómo se devuelven los errores.

Esta guía se centra en la mecánica y el flujo de trabajo de verificación, no en recomendar un proveedor específico. Para elegir endpoints y redes concretas, consulta la guía de endpoints RPC y la guía de endpoints RPC multicadena. Si necesitas un endpoint gestionado en lugar de infraestructura autoalojada, la descripción general del servicio de API describe el modelo operativo.

  • Endpoint RPC: la interfaz direccionable que acepta llamadas a procedimientos.
  • Nodo RPC: el proceso que mantiene el estado de la cadena y ejecuta los métodos.
  • JSON-RPC: la convención de codificación que la mayoría de las cadenas EVM usan para los cuerpos de solicitud y respuesta.
  • Transporte: HTTP para llamadas de solicitud-respuesta, WebSocket para suscripciones y actualizaciones push.

Supuestos y requisitos previos

Los ejemplos suponen que tienes una URL de endpoint accesible, una terminal con curl y, opcionalmente, Node.js o Python para comprobaciones mediante scripts. No suponen una cadena específica, porque los nombres de métodos y las formas de los parámetros difieren entre redes EVM, Solana y otros protocolos. Sustituye RPC_URL por tu endpoint y confirma los nombres de los métodos con la documentación de la cadena de destino antes de interpretar los resultados.

También debes saber si tu endpoint requiere una clave de API en un encabezado, en un segmento de la ruta o en un parámetro de consulta. La ubicación de la autenticación depende del proveedor y no forma parte de la especificación JSON-RPC. Nunca confirmes claves reales en el control de código fuente; usa variables de entorno como RPC_URL y API_KEY.

La ruta de la solicitud del cliente al nodo

Una llamada JSON-RPC pasa por varias capas. El cliente serializa un objeto de solicitud con los campos jsonrpc, method, params e id. La capa de transporte abre una conexión con el host del endpoint. Una puerta de enlace o balanceador de carga termina TLS, autentica la solicitud, aplica límites de velocidad y la enruta a un nodo. El nodo ejecuta el método contra su estado local y devuelve un resultado o un objeto de error con un código numérico y un mensaje.

Esta división en capas explica una confusión habitual: dos endpoints pueden apuntar a la misma cadena pero comportarse de forma distinta porque enrutan a tipos de nodo diferentes, aplican límites distintos o exponen conjuntos de métodos diferentes. Un nodo completo puede servir eth_getBalance pero no estado histórico; un nodo de archivo puede servir bloques más antiguos. La URL del endpoint indica dónde enviar la llamada, no de qué es capaz el backend.

  • Cliente: construye el sobre JSON-RPC y gestiona los reintentos.
  • Transporte: keep-alive de HTTP o tramas de WebSocket.
  • Puerta de enlace: TLS, autenticación, cuotas y enrutamiento.
  • Nodo: ejecuta el método y devuelve datos de la cadena o un error.

Verificación ejecutable de un endpoint JSON-RPC con curl

La comprobación de corrección más rápida es una única solicitud JSON-RPC con un método conocido. El ejemplo siguiente usa eth_blockNumber, que devuelve la altura del último bloque como una cadena hexadecimal en las cadenas EVM. Ejecútalo y confirma que la respuesta contiene un campo jsonrpc, un campo result y el mismo id que enviaste.

Si la respuesta es un objeto de error, lee el código y el mensaje antes de modificar la solicitud. Un error de método no encontrado suele significar que el endpoint no expone ese método; un error de autenticación significa que la clave o el encabezado son incorrectos; un error de límite de velocidad significa que la solicitud fue limitada.

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

Cliente JavaScript ejecutable con manejo de errores

Un cliente de producción debe validar el sobre de respuesta, distinguir los fallos de transporte de los errores JSON-RPC y aplicar reintentos acotados. El script siguiente usa fetch, comprueba el estado HTTP, analiza el cuerpo y lanza un error estructurado cuando la capa JSON-RPC informa de un problema. Es intencionadamente mínimo para que puedas adaptarlo a tu cadena y conjunto de métodos.

Ejecútalo con RPC_URL definido en tu entorno. Si tu endpoint requiere una clave, añade el encabezado necesario en lugar de incrustar la clave en la URL.

const RPC_URL = process.env.RPC_URL;

async function rpcCall(method, params = []) {
  const res = await fetch(RPC_URL, {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify({ jsonrpc: "2.0", method, params, id: Date.now() })
  });
  if (!res.ok) throw new Error(`HTTP ${res.status}`);
  const body = await res.json();
  if (body.error) {
    throw new Error(`JSON-RPC ${body.error.code}: ${body.error.message}`);
  }
  return body.result;
}

rpcCall("eth_blockNumber")
  .then((height) => console.log("latest block:", parseInt(height, 16)))
  .catch((err) => console.error("rpc failed:", err.message));

Medir la latencia y la consistencia sin inventar cifras

Las afirmaciones sobre latencia y consistencia solo son significativas cuando se miden contra tu propio endpoint desde tu propia ubicación de red. Crea un pequeño arnés que envíe el mismo método de solo lectura repetidamente, registre la duración en tiempo real de cada llamada y cuente los éxitos, los errores JSON-RPC y los fallos de transporte. Usa un reloj monotónico para las duraciones y registra la marca de tiempo de cada solicitud para poder correlacionar los picos con las condiciones de la red.

Registra los resultados en una tabla con columnas para el número de ejecución, el método, la duración en milisegundos, el estado HTTP, el código de error JSON-RPC y la altura de bloque devuelta. No rellenes valores esperados; deja las celdas en blanco hasta que la ejecución los produzca. Un procedimiento representativo es: ejecutar 50 llamadas secuenciales, luego 50 llamadas concurrentes con un nivel de concurrencia que puedas justificar, y comparar las distribuciones. Informa percentiles en lugar de solo la media, porque la latencia de cola afecta más a la experiencia del usuario que los promedios.

  • Ejecución secuencial: aísla el tiempo de ida y vuelta de referencia.
  • Ejecución concurrente: expone el comportamiento de limitación y de colas.
  • Ejecución entre regiones: muestra si domina el enrutamiento o la geografía.
  • Ejecución prolongada: revela ventanas de límite de velocidad y efectos de reutilización de conexiones.

Resultado esperado de la verificación

Un endpoint saludable devuelve una respuesta JSON-RPC bien formada con el mismo id, sin campo error y con un resultado cuyo tipo coincide con el método. Para eth_blockNumber, el resultado debe ser una cadena hexadecimal que aumenta con el tiempo. Para eth_chainId, el resultado debe coincidir con la cadena que pretendías consultar; una discrepancia significa que apuntas a la red equivocada o a un proxy con un enrutamiento inesperado.

Si estás probando suscripciones sobre WebSocket, un resultado saludable es una confirmación de suscripción seguida de notificaciones. Si no llega ninguna notificación dentro de tu tiempo de espera, trátalo como un fallo y registra el id de suscripción para poder correlacionarlo con el comportamiento del lado del servidor.

Solución de problemas comunes de endpoints

La mayoría de los fallos de endpoints se agrupan en unas pocas categorías. Los fallos de transporte incluyen errores de DNS, fallos del handshake TLS y restablecimientos de conexión. Los fallos de protocolo incluyen JSON mal formado, campos obligatorios ausentes y métodos no admitidos. Los fallos de política incluyen errores de autenticación, agotamiento de cuotas y restricciones de métodos. Cada categoría tiene una solución diferente, así que clasifica el fallo antes de reintentar.

Para fallos intermitentes, añade ids de solicitud y registra el cuerpo completo de la respuesta. Para fallos persistentes, prueba la misma solicitud contra un segundo endpoint para determinar si el problema está del lado del cliente o del endpoint. Si operas tu propio nodo, comprueba el estado de sincronización y la salud del disco; si usas un endpoint gestionado, consulta la página de estado del proveedor y los límites de tu clave.

  • HTTP 401 o 403: comprueba la ubicación de la clave y los nombres de los encabezados.
  • HTTP 429: reduce la concurrencia o solicita una cuota mayor.
  • JSON-RPC -32601: método no expuesto por este endpoint.
  • JSON-RPC -32000 o similar: error de ejecución o de estado del lado del nodo.
  • Tiempos de espera sin respuesta: comprueba DNS, TLS y reglas de firewall.

Limitaciones y compromisos

Los endpoints públicos son cómodos pero suelen tener límites de velocidad y pueden restringir métodos o datos históricos. Los endpoints dedicados ofrecen una capacidad más predecible pero requieren configuración y planificación de costes. Los nodos autoalojados dan el máximo control pero trasladan la carga operativa a tu equipo, incluidas las actualizaciones, la monitorización y el crecimiento del almacenamiento. Ninguna de estas opciones elimina la necesidad de verificar el comportamiento con tu propia carga de trabajo.

El comportamiento del protocolo está documentado, pero el de los proveedores no es uniforme. Las afirmaciones sobre disponibilidad, latencia y profundidad de archivo deben tratarse como declaraciones del proveedor hasta que las reproduzcas con tus propias mediciones. Para la planificación de capacidad, revisa las opciones de precios de RPC y de nodo dedicado, y confirma la disponibilidad de la red en la página de redes.

Próximos pasos para una integración fiable

Empieza definiendo los métodos que tu aplicación necesita realmente y luego verifica cada uno contra el endpoint elegido con las comprobaciones con curl y mediante scripts anteriores. Añade registro estructurado, reintentos acotados con jitter y un endpoint de respaldo para llamadas de solo lectura. Mide la latencia y las tasas de error de forma continua en lugar de una sola vez, porque el comportamiento del endpoint cambia con la carga y el enrutamiento.

Cuando estés listo para elegir un endpoint concreto o comparar opciones de proveedores para una red específica, usa RPC Assistant para obtener recomendaciones breves y directas, y mantén el flujo de verificación de esta guía como tu prueba de aceptación.

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