La latencia del RPC de Polygon a menudo se debe a la arquitectura de doble capa Bor/Heimdall, el volumen de datos de los nodos de archivo y consultas costosas como eth_getLogs en rangos amplios. Este artículo explica los mecanismos, proporciona un script de benchmark reproducible y ofrece un árbol de decisión para pasar de infraestructura compartida a dedicada.
Respuesta directa: por qué el RPC de Polygon se siente lento
Si tus llamadas RPC de Polygon se sienten lentas, la causa suele ser una de tres cosas: el nodo al que te conectas está sobrecargado (endpoint compartido), tu consulta es costosa (por ejemplo, eth_getLogs en un rango amplio de bloques), o el nodo es un nodo de archivo que debe leer del disco. La arquitectura de Polygon—Bor (EVM) y Heimdall (basado en Tendermint)—añade una capa extra de comprobaciones de finalidad de bloques que puede aumentar los tiempos de respuesta para ciertos métodos. En esta guía, desglosaremos los mecanismos, te mostraremos cómo medir la latencia con un script simple y te daremos un árbol de decisión para saber cuándo pasar de un nodo compartido a uno dedicado de Polygon.
El culpable más común no es la red en sí, sino el patrón de consulta. Por ejemplo, eth_getLogs con un rango de 100,000 bloques puede tardar segundos o incluso minutos en un nodo compartido. De manera similar, eth_call que simula interacciones complejas con contratos puede ser intensivo en CPU. Entender estos factores es el primer paso para solucionar respuestas RPC lentas.
- Bor (EVM) procesa transacciones y contratos inteligentes; Heimdall maneja checkpoints y sincroniza con Ethereum.
- Los nodos de archivo almacenan todo el estado histórico, lo que hace que consultas como
eth_getBalanceen bloques antiguos sean más lentas. - Los endpoints compartidos están sujetos a límites de tasa y vecinos ruidosos, lo que causa latencia variable.
- Los métodos pesados como
eth_getLogs,eth_callyeth_estimateGasson los más propensos a ser lentos.
Arquitectura de Polygon: Bor y Heimdall
Polygon PoS ejecuta dos capas: Bor (la capa de producción de bloques, una cadena compatible con EVM) y Heimdall (la capa de validadores, basada en Tendermint). Heimdall periódicamente envía checkpoints a Ethereum, y Bor produce bloques. Cuando envías una solicitud RPC, esta va a un nodo Bor, que puede necesitar consultar a Heimdall para obtener información de finalidad. Esto añade una pequeña sobrecarga en comparación con una cadena de una sola capa como Ethereum.
Para la mayoría de los métodos RPC (por ejemplo, eth_blockNumber, eth_getBalance), la latencia está dominada por la base de datos y la CPU del nodo. Sin embargo, los métodos que requieren acceso al estado (como eth_call) o filtrado de logs (eth_getLogs) son más costosos. La documentación técnica de Polygon proporciona detalles sobre la arquitectura, pero la conclusión clave es que los nodos Bor no están optimizados para consultas analíticas pesadas.
Además, si estás utilizando un endpoint RPC público, estás compartiendo recursos con muchos otros usuarios. Una sola consulta pesada de otro usuario puede degradar el rendimiento para todos. Por eso, los nodos dedicados a menudo se recomiendan para cargas de trabajo de producción.
Nodos de archivo vs. completos: el factor de datos
Polygon ofrece tanto nodos completos (que podan el estado histórico) como nodos de archivo (que almacenan todo el estado). Los nodos de archivo son necesarios para consultas que acceden a datos históricos, como eth_getBalance en un número de bloque antiguo o eth_getLogs para eventos pasados. Sin embargo, los nodos de archivo tienen requisitos de E/S de disco mucho mayores, lo que puede aumentar la latencia para cada solicitud.
Si tu aplicación solo necesita datos recientes, un nodo completo es más rápido y económico. Pero si necesitas consultar estado histórico, debes usar un nodo de archivo. En endpoints compartidos, a menudo no sabes a qué tipo te estás conectando, y el proveedor puede enrutarte a un nodo de archivo por defecto, añadiendo sobrecarga innecesaria.
Al hacer benchmarking, siempre verifica el tipo de nodo. Puedes hacerlo llamando a eth_getBalance en un bloque muy antiguo y comparando el tiempo de respuesta con un bloque reciente. Si el bloque antiguo es significativamente más lento, probablemente estás en un nodo de archivo.
- Los nodos completos podan el estado más antiguo que un cierto umbral (por ejemplo, 128 bloques).
- Los nodos de archivo almacenan todo el estado, permitiendo consultas históricas pero aumentando la E/S de disco.
- Para producción, elige el tipo de nodo según tus patrones de consulta.
Consultas pesadas: eth_getLogs, eth_call y más
La causa más común de respuestas RPC lentas en Polygon es la propia consulta. eth_getLogs es notoriamente lento cuando solicitas logs en un rango amplio de bloques o con temas de filtro complejos. El nodo debe escanear cada bloque en el rango y hacer coincidir el filtro, lo que es intensivo en CPU y E/S. De manera similar, eth_call ejecuta una función de contrato inteligente sin crear una transacción, y si la función es compleja (por ejemplo, un bucle sobre muchos slots de almacenamiento), puede tardar segundos.
eth_estimateGas también es costoso porque simula la transacción. Y esperar muchas confirmaciones (por ejemplo, 10 o más bloques) puede hacer que tu aplicación se sienta lenta, incluso si el RPC en sí es rápido. La solución es optimizar tus patrones de consulta: limitar los rangos de bloques, usar paginación y almacenar en caché los resultados.
Por ejemplo, en lugar de llamar a eth_getLogs para un rango de 100,000 bloques, divídelo en rangos más pequeños (por ejemplo, 10,000 bloques) y procésalos en paralelo. Esto reduce la carga en el nodo y mejora el rendimiento general.
- eth_getLogs: usa rangos de bloques más pequeños y temas específicos para reducir el tiempo de escaneo.
- eth_call: evita funciones complejas que iteran sobre arrays grandes.
- eth_estimateGas: úsalo con moderación; considera usar un límite de gas fijo para transacciones simples.
- Confirmaciones: espera solo el número requerido de bloques (por ejemplo, 2-3 para la mayoría de los casos de uso).
Cómo medir la latencia del RPC de Polygon: un script reproducible
Para diagnosticar un RPC lento, necesitas medirlo. A continuación se muestra un script bash que usa curl y time para hacer benchmark de tres métodos comunes: eth_blockNumber, eth_getBalance y eth_getLogs. Muestra el tiempo tomado para cada llamada. Ejecútalo contra tu endpoint para obtener una línea base.
El script es autocontenido y usa herramientas estándar. Reemplaza YOUR_RPC_URL con tu endpoint. Imprimirá la respuesta y el tiempo transcurrido en segundos. Para eth_getLogs, usa un rango de 1000 bloques, que es moderado; ajústalo según sea necesario.
#!/bin/bash
# Benchmark de latencia RPC de Polygon
# Uso: ./benchmark.sh <RPC_URL>
RPC_URL=${1:?Uso: $0 <RPC_URL>}
# Función para medir el tiempo de una llamada JSON-RPC
time_call() {
local method=$1
local params=$2
local start=$(date +%s%N)
local response=$(curl -s -X POST -H "Content-Type: application/json" \
--data "{\"jsonrpc\":\"2.0\",\"method\":\"$method\",\"params\":$params,\"id\":1}" \
$RPC_URL)
local end=$(date +%s%N)
local elapsed=$(echo "scale=3; ($end - $start) / 1000000000" | bc)
echo "$method: $elapsed segundos"
echo "Respuesta: $response"
echo "---"
}
# 1. eth_blockNumber (ligero)
time_call "eth_blockNumber" "[]"
# 2. eth_getBalance para una dirección conocida en el último bloque (acceso a estado)
# Usa una dirección popular como la de Vitalik (0x...)
time_call "eth_getBalance" "[\"0xAb5801a7D398351b8bE11C439e05C5B3259aeC9B\",\"latest\"]"
# 3. eth_getLogs para un rango de 1000 bloques (pesado)
# Reemplaza la dirección del contrato y los temas según sea necesario; aquí usamos un filtro dummy
time_call "eth_getLogs" "[{\"fromBlock\":\"0x1\",\"toBlock\":\"0x3e8\",\"address\":\"0x0000000000000000000000000000000000000000\"}]"]Resultados esperados y cómo verificar
Cuando ejecutes el script, deberías ver que eth_blockNumber es el más rápido (típicamente menos de 100 ms en un nodo saludable), eth_getBalance es ligeramente más lento (100-300 ms), y eth_getLogs es el más lento (puede tardar segundos). Estos no son benchmarks oficiales; son ilustrativos. Debes ejecutar el script varias veces y en diferentes momentos del día para tener una idea de la variabilidad.
Para verificar si tu nodo es el cuello de botella, compara los resultados con un endpoint conocido rápido, como la página de red de Polygon de OnFinality o un endpoint público. Si tu endpoint es consistentemente más lento, puede estar sobrecargado o mal configurado. Además, verifica el estado de sincronización del nodo: si no está completamente sincronizado, puede devolver errores o respuestas lentas.
Para eth_getLogs, si el tiempo de respuesta es proporcional al rango de bloques, eso es esperado. Si es desproporcionadamente lento, el nodo podría ser un nodo de archivo o tener problemas de E/S de disco. También puedes probar con un rango más pequeño (por ejemplo, 100 bloques) para ver la línea base.
- Ejecuta el script 5 veces y toma la mediana para reducir el ruido.
- Compara con un endpoint público como https://polygon-rpc.com (pero ten en cuenta que puede tener límites de tasa).
- Verifica el estado de sincronización del nodo con
eth_syncing; si devuelve true, el nodo no está listo.
Fallos comunes y soluciones
Si tu llamada eth_getLogs agota el tiempo de espera, a menudo es porque el rango de bloques es demasiado grande. La solución es reducir el rango o usar paginación. Algunos proveedores tienen un rango máximo (por ejemplo, 10,000 bloques); consulta la documentación de tu proveedor. Si necesitas logs durante un período largo, considera usar un servicio de indexación como The Graph o un indexador personalizado.
Otro problema común es el límite de tasa en endpoints compartidos. Si ves errores HTTP 429, estás siendo limitado. La solución es reducir tu tasa de solicitudes o pasar a un nodo dedicado. El servicio de API de OnFinality ofrece límites de tasa más altos y opciones dedicadas.
Para eth_call, si obtienes un error como "execution reverted", no es un problema de latencia sino de lógica del contrato. Sin embargo, si la llamada tarda demasiado, puede ser porque el contrato está haciendo un cálculo pesado. En ese caso, considera usar una llamada estática con un límite de gas o optimizar el contrato.
Finalmente, si estás esperando muchas confirmaciones (por ejemplo, 20 bloques), tu aplicación se sentirá lenta incluso si el RPC es rápido. Reduce el número de confirmaciones al mínimo requerido para tu modelo de seguridad.
- Timeout en eth_getLogs: reduce el rango de bloques o usa paginación.
- HTTP 429: implementa backoff o actualiza a un nodo dedicado.
- Reverts en eth_call: verifica la lógica del contrato, no la latencia del RPC.
- Confirmaciones altas: baja el umbral para mejorar la velocidad percibida.
Compensaciones y limitaciones
Si bien pasar a un nodo dedicado puede reducir la latencia, conlleva costos y sobrecarga operativa. Eres responsable de mantener el nodo sincronizado, monitorear su salud y escalarlo a medida que crece tu tráfico. OnFinality ofrece nodos dedicados gestionados que manejan estas tareas, pero debes evaluar la compensación entre costo y rendimiento.
También ten en cuenta que incluso un nodo dedicado puede ser lento si tus consultas son ineficientes. Optimizar tus patrones de consulta a menudo es más efectivo que actualizar el hardware. Por ejemplo, almacenar en caché los resultados de eth_getBalance por un corto período puede reducir drásticamente la carga.
Finalmente, la latencia no es la única métrica a considerar. La fiabilidad y el tiempo de actividad son igualmente importantes. Un nodo rápido que se cae con frecuencia es peor que uno más lento pero estable. Usa un proveedor con un buen SLA, como muestra la página de precios de OnFinality.
- Los nodos dedicados cuestan más pero ofrecen un rendimiento consistente.
- La optimización de consultas puede reducir la latencia sin cambiar la infraestructura.
- Considera la fiabilidad y el tiempo de actividad junto con la latencia.
Árbol de decisión: nodo compartido vs. dedicado de Polygon
¿Cómo saber cuándo pasar de un nodo compartido a uno dedicado de Polygon? Usa este árbol de decisión:
- Mide tu latencia actual usando el script anterior. Si el tiempo mediano de
eth_blockNumberes consistentemente superior a 200 ms, oeth_getLogsagota el tiempo de espera, puede que necesites un nodo dedicado. 2. Revisa tus patrones de consulta. Si haces consultas pesadas con frecuencia, un nodo dedicado ayudará. 3. Evalúa tu volumen de tráfico. Si haces más de 10 solicitudes por segundo, los endpoints compartidos pueden limitarte. 4. Considera tu presupuesto. Los nodos dedicados son más caros, pero si tu aplicación depende de baja latencia, vale la pena.
Si decides cambiar, OnFinality ofrece nodos dedicados de Polygon con monitoreo y soporte 24/7. También puedes usar el Asistente de RPC para configurar tu endpoint de manera óptima.
- Latencia > 200 ms en eth_blockNumber: considera dedicado.
- Timeouts en eth_getLogs: reduce el rango o usa dedicado.
- Límites de tasa alcanzados: actualiza a un plan con límites más altos.
- Carga de trabajo de producción: siempre usa un nodo dedicado.
Próximos pasos y lecturas adicionales
Ahora que entiendes las causas de la latencia del RPC de Polygon, puedes tomar acción. Comienza haciendo benchmark de tu endpoint actual, luego optimiza tus consultas. Si aún ves problemas, considera pasar a un nodo dedicado.
Para obtener una guía más profunda, consulta nuestro artículo sobre soluciones generales de latencia RPC, que cubre técnicas aplicables a cualquier cadena. También puedes explorar el centro de aprendizaje de OnFinality para más tutoriales. Si estás listo para actualizar, visita nuestra página de precios para ver opciones de nodos dedicados.
Recuerda, la clave para una baja latencia es una combinación de buena infraestructura y consultas eficientes. Siguiendo los pasos de este artículo, puedes asegurarte de que tus llamadas RPC de Polygon sean lo más rápidas posible.