Esta guía explica cómo consultar el estado histórico de Polygon PoS a través de JSON-RPC usando nodos de archivo. Cubre la arquitectura única de Polygon (bor + Heimdall), la diferencia entre nodos completos y de archivo, métodos prácticos para leer saldos, estado y registros en bloques históricos, y un script Node.js reproducible para verificar el soporte de archivo. También aborda errores comunes como límites de tasa y datos de archivo incompletos.
Respuesta Directa: Cómo Consultar el Estado Histórico de Polygon
Para consultar el estado histórico de Polygon PoS a través de JSON-RPC, necesitas un endpoint de nodo de archivo que conserve el historial completo del estado de la capa de ejecución bor. Con dicho endpoint, puedes usar métodos JSON-RPC estándar de Ethereum—eth_getBalance, eth_call, eth_getCode, eth_getStorageAt, eth_getLogs y eth_getProof—pasando un número de bloque histórico o etiqueta como parámetro final. Polygon PoS es compatible con EVM, por lo que la superficie RPC es idéntica a la de Ethereum, pero la cadencia de bloques de ~2 segundos significa que incluso un solo día de registros abarca más de 43,000 bloques, lo que hace que la disponibilidad de archivo y la paginación de consultas sean críticas.
Si tu endpoint no se ejecuta en modo de archivo, las consultas de estado histórico fallarán con un error (por ejemplo, "nodo trie faltante") o devolverán silenciosamente el estado más reciente, lo cual es engañoso. Esta guía explica la arquitectura específica de Polygon, proporciona un script ejecutable para probar el soporte de archivo y describe las mejores prácticas para consultar datos históricos de manera confiable.
- Polygon PoS usa dos capas: bor (ejecución EVM, bifurcación de geth) y Heimdall (checkpointing basado en Tendermint).
- Los nodos de archivo almacenan todo el estado histórico, permitiendo consultas en cualquier bloque pasado.
- Los métodos JSON-RPC estándar funcionan, pero debes especificar un parámetro de bloque.
- Siempre verifica que tu endpoint realmente devuelva datos históricos, no un respaldo.
Arquitectura de Polygon PoS: Por Qué la Historia es Diferente
Polygon PoS es una red de doble capa. La capa de ejecución, bor, es una bifurcación de go-ethereum (geth) y produce bloques cada ~2 segundos. La capa de consenso/checkpoint, Heimdall, es una cadena basada en Tendermint que periódicamente hace checkpoint del estado de bor a la red principal de Ethereum. Para consultas JSON-RPC, interactúas directamente con bor, que expone la API JSON-RPC estándar de Ethereum más algunos métodos específicos de Polygon (por ejemplo, bor_getAuthor, bor_getSnapshot). La capa de ejecución/archivo y los modos de cliente relevantes se describen en la documentación oficial de nodo completo de Polygon, y la guía de construir sobre Polygon cubre el uso de endpoints.
Debido a que bor es una bifurcación de geth, la semántica de las consultas históricas es la misma que en Ethereum: un nodo completo mantiene solo el estado más reciente (típicamente los últimos 128 bloques) necesario para la validación, mientras que un nodo de archivo conserva cada trie de estado histórico. La documentación oficial de Polygon para ejecutar un nodo completo describe la bandera --gcmode=archive para bor para habilitar el modo de archivo. Este es un comportamiento documentado, no una afirmación específica del proveedor.
El tiempo de bloque de ~2 segundos tiene un impacto directo en las consultas de rango. Por ejemplo, una ventana de eth_getLogs de 7 días cubre aproximadamente 302,400 bloques (7 * 24 * 3600 / 2). En Ethereum (bloques de 12 segundos), la misma ventana es de aproximadamente 50,400 bloques. Esto significa que las consultas de archivo de Polygon son más propensas a alcanzar límites de tasa o tiempos de espera del proveedor, y debes paginar los resultados en fragmentos más pequeños.
- Bor: cliente de ejecución EVM, bifurcación de geth, bloques de ~2s.
- Heimdall: cadena Tendermint, checkpoint del estado a Ethereum.
- Modo de archivo:
--gcmode=archiveen bor (según documentación oficial). - Nodo completo: solo estado reciente; nodo de archivo: todo el estado histórico.
Nodo Completo vs Nodo de Archivo en Polygon
La distinción entre nodos completos y de archivo es la misma que en Ethereum, pero los requisitos de almacenamiento se amplifican por la alta tasa de bloques de Polygon. Un nodo completo poda el estado histórico, manteniendo solo el estado más reciente y un conjunto limitado de bloques recientes. Un nodo de archivo almacena cada estado histórico, permitiendo consultas en cualquier número de bloque.
Para los desarrolladores, la diferencia práctica es que un nodo completo no puede responder eth_getBalance en un bloque antiguo (devolverá un error o, si el proveedor está mal configurado, el saldo más reciente). Los nodos de archivo son esenciales para aplicaciones como análisis, auditorías y seguimiento histórico de posiciones DeFi.
Al elegir un proveedor de RPC, verifica si ofrecen endpoints de archivo. Muchos RPC públicos son solo nodos completos. La página de precios de RPC de OnFinality enumera opciones de acceso a archivo, y el servicio de API proporciona endpoints dedicados. Para configuraciones autohospedadas, sigue las guías oficiales de despliegue de nodos de Polygon.
- Nodo completo: estado podado, consultas históricas limitadas.
- Nodo de archivo: historial completo del estado, requerido para RPC histórico.
- La disponibilidad de archivo del proveedor varía; verifica antes de confiar.
- Autohospedado: ejecuta bor con
--gcmode=archive.
Consultando Estado Histórico: Métodos y Ejemplos
Los métodos JSON-RPC centrales para consultas de estado histórico aceptan un parámetro de bloque. Por ejemplo, eth_getBalance(address, blockNumber) devuelve el saldo en ese bloque. De manera similar, eth_call acepta un objeto de transacción y un número de bloque, eth_getCode y eth_getStorageAt toman un número de bloque, y eth_getProof puede generar una prueba para un bloque histórico si el nodo lo soporta.
A continuación se muestra un ejemplo práctico usando curl para consultar un saldo en un bloque específico. Reemplaza <YOUR_RPC_URL> con tu endpoint de archivo.
curl -X POST <YOUR_RPC_URL> \
-H "Content-Type: application/json" \
--data '{"jsonrpc":"2.0","method":"eth_getBalance","params":["0x...","0x1F4"],"id":1}'
El número de bloque está en hexadecimal (0x1F4 = 500). Si el endpoint es de archivo, obtendrás un saldo; si no, puedes obtener un error o un valor de respaldo.
- eth_getBalance: saldo en un bloque histórico.
- eth_call: ejecutar una llamada en un bloque histórico.
- eth_getCode: código de contrato en un bloque histórico.
- eth_getStorageAt: valor de ranura de almacenamiento en un bloque histórico.
- eth_getLogs: registros dentro de un rango de bloques (requiere archivo para rangos antiguos).
Script de Verificación Reproducible (Node.js)
El siguiente script Node.js usa ethers v6 para probar si un endpoint RPC proporciona datos de archivo reales. Realiza tres comprobaciones: (1) lee un bloque histórico por número, (2) lee un saldo en ese bloque y lo compara con el saldo más reciente, y (3) pagina eth_getLogs en una ventana acotada con retroceso. El script imprime resultados y una tabla para que la completes.
Suposiciones: red principal de Polygon PoS, número de bloque 50,000,000 (elige un bloque que sepas que existe), y una URL RPC proporcionada a través de la variable de entorno POLYGON_RPC_URL. El script usa una dirección conocida (por ejemplo, el contrato USDC) para las comprobaciones de saldo.
const { ethers } = require("ethers");
const RPC_URL = process.env.POLYGON_RPC_URL;
if (!RPC_URL) {
console.error("Set POLYGON_RPC_URL environment variable.");
process.exit(1);
}
const provider = new ethers.JsonRpcProvider(RPC_URL);
const TARGET_BLOCK = 50000000; // Choose a block you know exists
const ADDRESS = "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174"; // USDC on Polygon
async function main() {
// 1. Read historical block
const block = await provider.getBlock(TARGET_BLOCK);
console.log(`Block ${TARGET_BLOCK}: timestamp=${block.timestamp}, txs=${block.transactions.length}`);
// 2. Balance at historical block vs latest
const balanceHistorical = await provider.getBalance(ADDRESS, TARGET_BLOCK);
const balanceLatest = await provider.getBalance(ADDRESS, "latest");
console.log(`Balance at block ${TARGET_BLOCK}: ${ethers.formatEther(balanceHistorical)} ETH`);
console.log(`Balance at latest: ${ethers.formatEther(balanceLatest)} ETH`);
// 3. Page eth_getLogs over a small window (e.g., 1000 blocks)
const startBlock = TARGET_BLOCK;
const endBlock = TARGET_BLOCK + 1000;
const logs = [];
const pageSize = 100;
for (let from = startBlock; from <= endBlock; from += pageSize) {
const to = Math.min(from + pageSize - 1, endBlock);
try {
const pageLogs = await provider.getLogs({
fromBlock: from,
toBlock: to,
address: ADDRESS
});
logs.push(...pageLogs);
console.log(`Fetched logs from ${from} to ${to}: ${pageLogs.length} logs`);
} catch (e) {
console.error(`Error fetching logs from ${from} to ${to}: ${e.message}`);
// Implement backoff: wait 1 second before retrying
await new Promise(resolve => setTimeout(resolve, 1000));
// Retry once
try {
const retryLogs = await provider.getLogs({
fromBlock: from,
toBlock: to,
address: ADDRESS
});
logs.push(...retryLogs);
} catch (retryErr) {
console.error(`Retry failed: ${retryErr.message}`);
}
}
}
console.log(`Total logs fetched: ${logs.length}`);
// Fill in the results table
console.log("\nResults Table:");
console.log("| Check | Result |");
console.log("|-------|--------|");
console.log(`| Historical block accessible | ${block ? "Yes" : "No"} |`);
console.log(`| Balance at historical block differs from latest | ${balanceHistorical.toString() !== balanceLatest.toString() ? "Yes" : "No (possible fallback)"} |`);
console.log(`| eth_getLogs paging successful | ${logs.length > 0 ? "Yes" : "No"} |`);
}
main().catch(console.error);
Forma esperada de salida: El script imprime los detalles del bloque, los dos saldos y un recuento de registros. Si el endpoint no es de archivo, el saldo en el bloque histórico puede igualar al saldo más reciente (si el proveedor retrocede) o lanzar un error. La tabla de resultados te ayuda a registrar el resultado.
Para ejecutar: POLYGON_RPC_URL=https://your-rpc-url node script.js
- Usa ethers v6; instala con
npm install ethers. - Reemplaza la dirección y el número de bloque con los tuyos.
- El script incluye un retroceso simple para límites de tasa.
- Completa la tabla de resultados para documentar el comportamiento de tu endpoint.
Fallos Comunes y Soluciones
Al consultar el estado histórico de Polygon, puedes encontrar varios problemas. Aquí están los más comunes y cómo solucionarlos.
1. Errores de "nodo trie faltante" o "encabezado no encontrado": Esto indica que el nodo no es un nodo de archivo. Solución: usa un endpoint de archivo o ejecuta el tuyo con --gcmode=archive.
2. Límite de tasa (HTTP 429): La alta tasa de bloques de Polygon significa que las consultas de rango pueden ser pesadas. Solución: pagina en fragmentos más pequeños, agrega demoras y usa un proveedor con límites más altos. Consulta la guía de errores 429 y límites de tasa de Polygon.
3. Tiempos de espera: Los rangos grandes de eth_getLogs pueden agotar el tiempo. Solución: reduce el rango a unos pocos miles de bloques y usa paginación.
4. Retroceso silencioso al estado más reciente: Algunos proveedores pueden devolver el saldo más reciente cuando se les pide un bloque antiguo. Solución: siempre compara con un valor histórico conocido o usa un proveedor que soporte explícitamente archivo.
5. Número de bloque no encontrado: Si especificas un número de bloque que aún no está finalizado o está más allá de la retención del nodo, obtendrás un error. Solución: usa un número de bloque que sea más antiguo que la ventana de poda del nodo (para nodos completos) o asegúrate de que el bloque exista.
- Errores de archivo: cambia a un endpoint de archivo.
- Límites de tasa: pagina y retrocede.
- Tiempos de espera: reduce el tamaño del rango.
- Retroceso: verifica con un valor conocido.
- Bloque no encontrado: verifica el número de bloque y la retención del nodo.
Compensaciones y Limitaciones
Los nodos de archivo en Polygon requieren espacio en disco y recursos computacionales significativos. El tamaño exacto de almacenamiento crece con el tiempo y varía según el proveedor; no hay un número oficial único. A partir de 2026, un nodo de archivo de Polygon puede requerir varios terabytes, pero esto no es una constante documentada: depende de la versión del cliente y la configuración de poda.
La disponibilidad de archivo del proveedor no es universal. Muchos RPC públicos son solo nodos completos. Al usar un proveedor de terceros, consulta su documentación para soporte de archivo y límites de tasa. La página de precios de RPC de OnFinality detalla opciones de archivo, pero los números de capacidad específicos se documentan por proveedor y pueden cambiar.
Otra limitación es que eth_getProof en bloques históricos puede no ser soportado por todos los nodos de archivo, ya que requiere datos adicionales del trie de estado. Siempre prueba con tu endpoint.
Finalmente, la cadena Heimdall de Polygon no expone estado histórico a través de JSON-RPC; todas las consultas de estado pasan por bor. Esto significa que no puedes consultar datos de checkpoint a través de métodos RPC estándar.
- Los requisitos de almacenamiento son altos y crecen con el tiempo.
- El soporte de archivo del proveedor varía; verifica antes de confiar.
- El soporte histórico de eth_getProof no está garantizado.
- El estado de Heimdall no es accesible a través de JSON-RPC.
Próximos Pasos y Lecturas Adicionales
Ahora que entiendes cómo consultar el estado histórico de Polygon, puedes integrar llamadas RPC de archivo en tus aplicaciones. Para más contexto sobre la red de Polygon, consulta la descripción general de la red Polygon. Si eres nuevo en consultas históricas, lee el recetario EVM sobre acceso a datos históricos de blockchain y la guía de nodo de archivo vs nodo completo.
Para consideraciones de rendimiento, revisa la guía de latencia RPC de Polygon y la guía de límites de tasa. Si estás eligiendo un proveedor de RPC, compara opciones en el Asistente de RPC para tipos de nodos de Polygon.
OnFinality ofrece servicios RPC dedicados con soporte de archivo; consulta el servicio de API y los precios para más detalles. Siempre prueba tu endpoint con el script anterior para asegurarte de que cumple con tus necesidades de datos históricos.
- Explora los detalles de la red Polygon: Red Polygon.
- Aprende patrones generales de datos históricos: Acceso a datos históricos de blockchain.
- Comprende los tipos de nodos: Nodo de archivo vs nodo completo.
- Optimiza el rendimiento RPC: Latencia RPC de Polygon y límites de tasa.
- Elige un tipo de nodo: Tipos de nodos de Polygon (Asistente de RPC).