Logo
Nuevos usuarios de RPC: 35% de descuento el primer mesVer oferta
OnFinality Learn
Guías de Red y Protocolo12 min de lectura

Latencia de RPC en Polkadot: Ruta de Datos de Substrate, Medición y Optimización

Aprende qué impulsa la latencia de RPC en Polkadot, cómo medirla de manera reproducible y cómo optimizar tus llamadas RPC basadas en Substrate.

TL;DR

La latencia de RPC en Polkadot está dominada por los patrones de acceso al estado de Substrate, la geografía de la red y la saturación del endpoint. Esta guía explica la ruta de datos, proporciona un método de medición reproducible y ofrece estrategias de optimización.

¿Qué determina la latencia de RPC en Polkadot?

La latencia de RPC en Polkadot es el tiempo entre enviar una solicitud JSON-RPC a un nodo de Polkadot y recibir una respuesta. A diferencia de las cadenas EVM donde la mayoría de las llamadas acceden a un saldo de cuenta simple o a una ranura de almacenamiento, Polkadot se ejecuta sobre Substrate, que introduce una ruta de datos diferente: el estado se almacena en un trie de Merkle Patricia, y muchos métodos RPC (como state_getStorage) requieren recorrer ese trie. La cadena de relevo también usa finalidad GRANDPA, por lo que el bloque 'más reciente' que consultes puede ser una cabeza de bloque suave, aún no finalizada.

Los factores dominantes son: (1) la distancia física entre tu cliente y el nodo, (2) el tipo de almacenamiento del nodo (archivo vs. podado), (3) la carga en el endpoint compartido y (4) la eficiencia de tu biblioteca cliente (por ejemplo, polkadot.js vs. JSON-RPC puro). Este artículo explica la mecánica específica de Substrate, te da un método de medición reproducible y enumera tácticas de optimización.

  • Los métodos RPC de estado de Substrate (state_getStorage, state_getPairs, state_queryStorage) son más pesados que un simple eth_getBalance en cadenas EVM.
  • La finalidad GRANDPA significa que puedes consultar un bloque que aún no está finalizado; el retraso de finalidad afecta la consistencia.
  • Los nodos de archivo mantienen todo el estado histórico, lo que hace que las consultas profundas sean más lentas pero posibles; los nodos podados solo sirven el estado reciente.
  • Las conexiones WebSocket tienen una sobrecarga de protocolo de enlace y las tormentas de reconexión pueden parecer picos de latencia.

Ruta de datos de Substrate: Por qué el RPC de Polkadot es diferente

La cadena de relevo de Polkadot está construida sobre Substrate, que almacena todo el estado en un trie. Cuando llamas a state_getStorage con una clave de almacenamiento, el nodo debe recorrer el trie desde la raíz hasta la hoja, leyendo nodos de su base de datos. Esto es más intensivo en E/S que leer un almacén de clave-valor plano. La profundidad del trie crece con el número de entradas, por lo que las consultas en mapas grandes (como conjuntos de validadores) pueden ser más lentas.

Además, Substrate expone llamadas a la API de runtime (por ejemplo, state_call para invocar un método de runtime) que pueden ejecutar lógica compleja. Estas no son lecturas simples; se ejecutan en un entorno Wasm y pueden tardar más. La API de polkadot.js a menudo usa estas bajo el capó, por lo que podrías ver una latencia mayor que una llamada chain_getBlock pura.

Finalidad de bloque: Polkadot usa GRANDPA para la finalidad, que va por detrás del mejor bloque. Cuando consultas chain_getHeader sin especificar un hash de bloque, obtienes el mejor bloque, que puede no estar finalizado. Si necesitas el estado finalizado, debes especificar un hash de bloque finalizado, lo que añade un paso de búsqueda. Esto está documentado en los documentos JSON-RPC de Polkadot y en los documentos RPC de Substrate.

  • El recorrido del trie de estado añade latencia proporcional a la profundidad del trie y al tiempo de lectura de la base de datos.
  • Las llamadas a la API de runtime (state_call) son más costosas que las lecturas de almacenamiento simples.
  • Retraso de finalidad: el bloque 'más reciente' no está necesariamente finalizado; usa finalized_head para consistencia.
  • Los nodos de archivo almacenan todo el estado histórico, por lo que las consultas de bloques antiguos son posibles pero más lentas; los nodos podados devuelven errores para el estado antiguo.

Medición de la latencia de RPC en Polkadot: Un método reproducible

Para medir la latencia con precisión, necesitas separar el tiempo de ida y vuelta de la red del tiempo de procesamiento del nodo. El siguiente método usa curl para HTTP y un script de Node.js para WebSocket. Mide system_chain, chain_getBlock, state_getStorage y una conexión WebSocket con protocolo de enlace. Ejecútalo desde tu propia infraestructura para obtener números relevantes para tu ubicación. Los resultados son ejecutados por el lector, no un punto de referencia del proveedor.

Requisitos previos: curl, websocat (o un script de Node.js) y un endpoint RPC de Polkadot. Puedes usar un endpoint público o tu propio nodo. Para obtener resultados reproducibles, ejecuta múltiples iteraciones y calcula p50/p95.

  • Usa curl -w para capturar detalles de tiempo para solicitudes HTTP.
  • Para WebSocket, usa un script de Node.js con el paquete ws para medir la latencia de conexión y solicitud.
  • Ejecuta al menos 10 iteraciones para obtener percentiles significativos.
  • Registra la URL del endpoint, la fecha y tu ubicación geográfica para contexto.
#!/bin/bash
# Prueba de latencia HTTP para RPC de Polkadot
ENDPOINT="https://rpc.polkadot.io"
for i in {1..10}; do
  curl -s -o /dev/null -w "%{time_total}\n" \
    -H "Content-Type: application/json" \
    -d '{"jsonrpc":"2.0","method":"system_chain","params":[],"id":1}' \
    $ENDPOINT
done
# Salida esperada: 10 números (segundos), p. ej., 0.234, 0.198, ...

Latencia de WebSocket y efectos de reconexión

WebSocket es el predeterminado para polkadot.js porque admite suscripciones. Sin embargo, una conexión WebSocket tiene un protocolo de enlace (actualización HTTP) que añade latencia en la primera solicitud. Las solicitudes posteriores comparten la conexión, por lo que la latencia por solicitud es menor. Pero si la conexión se cae, el cliente se reconecta y el re-anuncio (re-suscribirse a todas las suscripciones activas) puede causar una ráfaga de solicitudes que parecen picos de latencia.

Al medir la latencia de WebSocket, separa el tiempo de conexión del tiempo de solicitud. Usa un script que se conecte una vez y luego mida el tiempo de solicitudes individuales. También ten en cuenta que polkadot.js puede agrupar solicitudes o usar suscripciones, lo que puede afectar la latencia percibida.

  • El protocolo de enlace añade ~1 RTT a la primera solicitud.
  • Las reconexiones provocan re-suscripciones, lo que puede causar una carga temporal.
  • Usa unsub después de cada suscripción para evitar suscripciones obsoletas.
  • Para consultas únicas, HTTP puede ser más simple y rápido.
// Prueba de latencia WebSocket en Node.js (requiere paquete 'ws')
const WebSocket = require('ws');
const ws = new WebSocket('wss://rpc.polkadot.io');
let id = 0;
const t0 = Date.now();
ws.on('open', () => {
  console.log('Tiempo de conexión (ms):', Date.now() - t0);
  for (let i = 0; i < 10; i++) {
    const start = Date.now();
    ws.send(JSON.stringify({jsonrpc:'2.0', method:'system_chain', params:[], id:++id}));
    ws.on('message', (data) => {
      const msg = JSON.parse(data);
      if (msg.id === id) {
        console.log('Solicitud', id, 'latencia (ms):', Date.now() - start);
      }
    });
  }
});
// Salida esperada: tiempo de conexión y latencias por solicitud.

Fallos comunes y soluciones

Al medir o usar RPC de Polkadot, puedes encontrar tiempos de espera, límites de velocidad o datos obsoletos. Aquí hay problemas comunes y cómo solucionarlos.

Si obtienes un tiempo de espera en state_getStorage para un bloque antiguo, tu nodo puede estar podado. Usa un endpoint de archivo o especifica un bloque reciente. Si te limitan la velocidad, reduce la frecuencia de solicitudes o usa un endpoint dedicado. Si ves resultados inconsistentes, verifica si estás consultando un bloque finalizado.

  • Tiempo de espera en estado histórico: usa un nodo de archivo o consulta un bloque reciente.
  • Límite de velocidad: implementa retroceso o usa un endpoint dedicado (ver límites de velocidad de RPC de Polkadot).
  • Desconexiones de WebSocket: implementa reconexión con retroceso exponencial y re-suscríbete con cuidado.
  • Alta latencia de endpoints compartidos: considera un proveedor con distribución geográfica o un nodo dedicado.
  • Fugas de suscripción de polkadot.js: siempre llama a unsub después de usar.

Estrategias de optimización

Para reducir la latencia de RPC en Polkadot, concéntrate en las siguientes áreas: selección de endpoint, eficiencia del lado del cliente y diseño de consultas.

Selección de endpoint: elige un proveedor con nodos cercanos a tus usuarios o a tu backend. Proveedores con distribución geográfica como el servicio API de OnFinality enrutan las solicitudes al nodo más cercano. Evita endpoints públicos que estén muy compartidos; pueden tener mayor latencia bajo carga.

Lado del cliente: usa polkadot.js de manera eficiente. Minimiza las suscripciones, usa unsub después de cada una y agrupa solicitudes cuando sea posible. Para consultas únicas, usa JSON-RPC puro sobre HTTP para evitar la sobrecarga de WebSocket. Almacena en caché el estado que no cambia a menudo.

Diseño de consultas: reduce state_getPairs con un prefijo específico para disminuir la transferencia de datos. Usa state_queryStorage para consultas históricas solo cuando sea necesario. Prefiere chain_getBlock sobre chain_getBlockHash si necesitas el bloque completo.

  • Usa un endpoint con distribución geográfica o un nodo dedicado.
  • Mantén las suscripciones de polkadot.js al mínimo y siempre cancela la suscripción.
  • Agrupa solicitudes donde el SDK lo permita (por ejemplo, api.queryMulti).
  • Almacena en caché el estado accedido con frecuencia (por ejemplo, versión de runtime, constantes).
  • Reduce los prefijos de clave de almacenamiento para disminuir el tamaño de la respuesta.
  • Elige WebSocket para suscripciones, HTTP para llamadas únicas.

Compensaciones y limitaciones

Optimizar la latencia a menudo implica compensaciones. Los nodos de archivo proporcionan datos históricos completos pero son más lentos y costosos. Los nodos podados son más rápidos pero limitados al estado reciente. Usar un endpoint dedicado reduce la contención pero cuesta más. Agrupar solicitudes reduce los viajes de ida y vuelta pero puede aumentar el tiempo de respuesta del lote.

La medición en sí tiene limitaciones: las condiciones de red varían y tus resultados dependen de tu ubicación y la carga del endpoint. Siempre documenta tu metodología y ejecuta múltiples pruebas. Puntos de referencia independientes como CompareNodes proporcionan su propia metodología; trátalos como referencias, no como tus propias mediciones.

  • Archivo vs. podado: el archivo es necesario para historia profunda pero más lento.
  • Dedicado vs. compartido: dedicado da latencia consistente pero cuesta más.
  • Agrupación: reduce la sobrecarga pero puede retrasar respuestas individuales.
  • Variabilidad de medición: ejecuta pruebas en diferentes momentos y desde diferentes ubicaciones.

Próximos pasos

Ahora que entiendes la latencia de RPC en Polkadot, puedes aplicar estas técnicas a tu propia infraestructura. Para más detalles, explora los siguientes recursos:

Comienza con la descripción general de la red Polkadot para entender la arquitectura. Luego sumérgete en la guía de RPC WebSocket de Polkadot para conocer las mejores prácticas de conexión. Si estás alcanzando límites, lee sobre tiempos de espera y reintentos de RPC de Polkadot y límites de velocidad de RPC de Polkadot. Para la selección de endpoints, consulta los endpoints RPC de Polkadot (Asistente RPC) y considera precios de RPC para opciones dedicadas. Finalmente, explora el centro de aprendizaje de OnFinality para más guías.

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