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

Datos Históricos y de Archivo de BNB Smart Chain: Consulta de Saldos, Registros y Estado Pasados

Aprende a consultar datos históricos de BNB Smart Chain (BSC) a través de RPC, cuándo necesitas un nodo de archivo y cómo evitar errores comunes con eth_getBalance, eth_getLogs y más.

TL;DR

Esta guía explica cómo consultar datos históricos de BNB Smart Chain (BSC) a través de RPC, centrándose en los requisitos de los nodos de archivo. Cubre el tiempo de bloque y el ecosistema de clientes de BSC, qué almacenan los nodos de archivo, y proporciona scripts ejecutables para eth_getBalance y eth_getLogs con consejos para solucionar problemas.

Respuesta Directa: Cómo Consultar Datos Históricos de BSC

Para consultar datos históricos de BNB Smart Chain (BSC), como saldos, registros o estado pasados, necesitas un endpoint RPC que tenga datos de archivo. Los nodos completos estándar eliminan el estado histórico, por lo que métodos como eth_getBalance en un bloque antiguo o eth_getLogs en un rango largo devolverán resultados incompletos o incorrectos. Usa un endpoint BSC con capacidad de archivo y especifica el bloque histórico como etiqueta o en los parámetros fromBlock/toBlock.

Por ejemplo, para obtener un saldo en el bloque 10,000,000, llamas a eth_getBalance con la dirección y la etiqueta de bloque '0x989680' (hex). Esto solo devuelve un valor significativo si el nodo tiene estado de archivo para ese bloque. De manera similar, eth_getLogs con un rango de bloques amplio requiere que el nodo conserve los registros y, a menudo, datos de archivo para procesarlos de manera eficiente. Consulta los tipos de nodos de BNB Smart Chain (Asistente RPC) para una comparación entre nodos completos y de archivo.

  • Usa un endpoint RPC de archivo para consultas históricas.
  • Especifica el número de bloque como cadena hexadecimal o etiqueta (por ejemplo, 'earliest', '0x...').
  • Para registros, establece fromBlock y toBlock al rango deseado.
  • Verifica la disponibilidad de archivo y la política de retención de tu proveedor.

Fundamentos de BSC: Tiempo de Bloque, Clientes y Tipos de Nodo

BNB Smart Chain es una blockchain compatible con EVM con un tiempo de bloque objetivo de aproximadamente 3 segundos, lo que resulta en un alto rendimiento de transacciones y un gran volumen de datos históricos. Esta alta cadencia significa que los nodos completos que eliminan el estado solo pueden servir datos recientes, mientras que los nodos de archivo almacenan todo el historial de estado para responder cualquier consulta histórica.

El ecosistema de clientes de BSC ha evolucionado. Originalmente una bifurcación de go-ethereum (geth), BSC ahora tiene múltiples implementaciones de clientes. La documentación oficial en docs.bnbchain.org describe los tipos de nodos: nodos completos (con poda), nodos de archivo y nodos validadores. Clientes de la comunidad como reth-bsc y bsc-erigon también se mencionan en búsquedas, ofreciendo diferentes compensaciones de rendimiento y almacenamiento. Para esta guía, nos centramos en los métodos RPC que funcionan en estos clientes, ya que siguen el estándar JSON-RPC de Ethereum.

Los nodos de archivo mantienen todos los datos del trie de estado histórico, lo que permite consultas como eth_getBalance en cualquier bloque pasado. Los nodos completos típicamente eliminan el estado más antiguo que un cierto número de bloques (por ejemplo, 128 bloques) y solo conservan el estado reciente. Los nodos validadores son nodos completos que participan en el consenso y pueden no servir solicitudes RPC públicamente.

  • Tiempo de bloque de BSC: ~3 segundos (documentado por BNB Chain).
  • Tipos de nodo: completo (con poda), archivo, validador.
  • Clientes: basados en geth, reth-bsc, bsc-erigon (comunidad).
  • Los nodos de archivo almacenan todo el estado histórico; los nodos completos eliminan.

Qué Almacena un Nodo de Archivo Más Allá de un Nodo Completo

Un nodo BSC de archivo retiene cada cambio de estado histórico, incluidos saldos de cuentas, código de contratos y almacenamiento en cada bloque. Esto contrasta con un nodo completo con poda, que solo mantiene el estado más reciente y un historial limitado de bloques y recibos. La documentación oficial de BNB Chain sobre Nodo de Archivo - BSC Develop establece que los nodos de archivo son necesarios para consultar datos históricos.

Sin estado de archivo, eth_getBalance en un bloque antiguo devolverá el saldo actual o un error, porque el nodo no puede reconstruir el estado pasado. De manera similar, eth_getLogs en un rango largo puede fallar o devolver resultados incompletos si el nodo ha eliminado registros o no puede procesar el rango de manera eficiente. Los nodos de archivo también habilitan funciones avanzadas de depuración y rastreo, como los rastreos estructurados de reth/erigon, que son útiles para análisis profundos.

Los requisitos de almacenamiento para nodos de archivo son significativamente mayores que para nodos completos, pero las cifras exactas varían según el cliente y la configuración. No proporcionamos cifras específicas en GB porque no están estandarizadas; consulta a tu proveedor de nodos o la documentación del cliente para estimaciones actuales.

  • Los nodos de archivo almacenan todo el historial de estado, lo que permite cualquier consulta histórica.
  • Los nodos completos eliminan el estado, limitando el acceso histórico.
  • Los nodos de archivo admiten rastreo y depuración avanzada.
  • Los requisitos de almacenamiento varían; consulta la documentación del proveedor.

Métodos RPC de BSC para Datos Históricos

Los siguientes métodos JSON-RPC son esenciales para consultar datos históricos de BSC. Siguen el estándar de Ethereum y son compatibles con los clientes de BSC.

eth_getBlockByNumber: Recupera un bloque por número, con objetos de transacción completos si se solicita. Esto funciona en nodos completos para cualquier bloque, ya que los encabezados de bloque no se eliminan.

eth_getLogs: Filtra registros por dirección y temas dentro de un rango de bloques. Esto puede ser intensivo en recursos en BSC debido al alto volumen de transacciones; los nodos de archivo manejan rangos más grandes mejor.

eth_call, eth_getBalance, eth_getCode, eth_getProof: Estos métodos aceptan un parámetro de bloque. Al consultar estado histórico, debes pasar el número de bloque o etiqueta. Requieren estado de archivo para bloques más antiguos que la ventana de poda.

Para rastreo, clientes como reth-bsc y bsc-erigon proporcionan rastreos estructurados a través de debug_traceTransaction o métodos trace_*, pero estos no son parte del RPC estándar y pueden requerir soporte específico del cliente.

  • eth_getBlockByNumber: funciona en nodos completos para cualquier bloque.
  • eth_getLogs: necesita archivo para rangos grandes.
  • eth_getBalance, eth_call, etc.: requieren archivo para bloques históricos.
  • Métodos de rastreo: específicos del cliente, no estándar.

Ejemplo Ejecutable: Consulta de Saldo Histórico y Registros

A continuación se muestra un script de Node.js que usa ethers v6 para consultar un saldo histórico y paginar a través de registros. Es autónomo y requiere que establezcas una URL RPC (por ejemplo, tu endpoint de archivo). El script demuestra cómo manejar tiempos de espera y retroceso para eth_getLogs.

Para ejecutarlo, instala ethers: npm install ethers. Luego establece la variable de entorno RPC_URL a tu endpoint de archivo. El script primero verifica el saldo en un bloque específico (por ejemplo, bloque 10000000) y luego obtiene registros para un rango pequeño para evitar abrumar al nodo.

Salida esperada: Para un endpoint sin archivo, la consulta de saldo puede devolver el saldo actual o un error. Para un endpoint de archivo, devuelve el saldo histórico. La consulta de registros devuelve una matriz de objetos de registro.

const { ethers } = require('ethers');

const RPC_URL = process.env.RPC_URL || 'https://your-archive-endpoint.example';
const provider = new ethers.JsonRpcProvider(RPC_URL);

async function getHistoricalBalance(address, blockNumber) {
  const balance = await provider.getBalance(address, blockNumber);
  console.log(`Balance at block ${blockNumber}: ${ethers.formatEther(balance)} BNB`);
}

async function getLogsPaged(contractAddress, fromBlock, toBlock, pageSize = 1000) {
  let logs = [];
  let currentFrom = fromBlock;
  while (currentFrom <= toBlock) {
    const currentTo = Math.min(currentFrom + pageSize - 1, toBlock);
    const filter = {
      address: contractAddress,
      fromBlock: currentFrom,
      toBlock: currentTo
    };
    try {
      const batch = await provider.getLogs(filter);
      logs = logs.concat(batch);
      console.log(`Fetched ${batch.length} logs from ${currentFrom} to ${currentTo}`);
    } catch (error) {
      console.error(`Error fetching logs from ${currentFrom} to ${currentTo}:`, error.message);
      // Implement backoff: wait 1 second and retry
      await new Promise(resolve => setTimeout(resolve, 1000));
      continue;
    }
    currentFrom = currentTo + 1;
  }
  return logs;
}

async function main() {
  const address = '0x0000000000000000000000000000000000001000'; // example
  const block = 10000000; // example historical block
  await getHistoricalBalance(address, block);

  const contract = '0x...'; // replace with contract address
  const logs = await getLogsPaged(contract, 10000000, 10001000);
  console.log(`Total logs: ${logs.length}`);
}

main().catch(console.error);

Verificación y Tabla de Resultados

Para verificar que tu endpoint tiene capacidad de archivo, ejecuta el script anterior con un saldo histórico conocido. Por ejemplo, puedes verificar el saldo de una dirección conocida en un bloque anterior a una transferencia importante. Si el saldo devuelto coincide con el valor esperado de un explorador de bloques, tu endpoint tiene datos de archivo.

Completa la tabla a continuación con tus resultados para documentar el comportamiento de tu endpoint. Este método es reproducible y te ayuda a comprender las limitaciones de tu proveedor RPC.

  • Tipo de endpoint (completo/archivo)
  • Número de bloque consultado
  • Saldo devuelto (BNB)
  • Registros obtenidos (cantidad)
  • Errores encontrados
| Endpoint Type | Block Number | Balance (BNB) | Logs Fetched | Errors |
|---------------|--------------|---------------|--------------|--------|
| Archive       | 10000000     | 123.45        | 500          | None   |
| Full          | 10000000     | 0.00 (or error) | 0          | 'missing trie node' |

Errores Comunes y Soluciones

Al consultar datos históricos de BSC, puedes encontrar varios errores comunes. Aquí hay fallas típicas y cómo resolverlas.

Error: 'missing trie node' o 'header not found' – Esto indica que el nodo no tiene estado de archivo para el bloque solicitado. Solución: Usa un endpoint de archivo o reduce la profundidad histórica.

Error: 'query returned more than 10000 results' – eth_getLogs tiene un límite en el número de resultados por llamada. Solución: Pagina a través de rangos de bloques más pequeños, como se muestra en el script.

Error: 'rate limit exceeded' – Los proveedores RPC de BSC imponen límites de velocidad. Solución: Implementa retroceso y reintento, y consulta la guía de límites de velocidad RPC de BNB Chain y errores 429.

Registros incompletos: Si usas un nodo completo, los registros más antiguos que la ventana de poda pueden faltar. Solución: Usa un nodo de archivo o un proveedor que retenga registros por más tiempo.

  • Nodo trie faltante: usa endpoint de archivo.
  • Demasiados resultados: pagina a través de rangos.
  • Límites de velocidad: implementa retroceso.
  • Registros incompletos: usa nodo de archivo.

Compensaciones y Limitaciones

Usar un nodo de archivo para consultas históricas tiene compensaciones. Los nodos de archivo son más costosos de operar y tienen mayor latencia para ciertas consultas debido al gran estado. Los proveedores pueden ofrecer endpoints de archivo a un precio premium o con diferentes límites de velocidad. Siempre consulta la documentación de tu proveedor para conocer las características específicas de retención y rendimiento.

Para BSC, el alto volumen de transacciones significa que eth_getLogs en un rango amplio puede ser lento incluso en nodos de archivo. Es recomendable reducir tu búsqueda con filtros de dirección y temas. Además, no todos los proveedores RPC ofrecen datos de archivo para BSC; algunos solo pueden proporcionar nodos completos. Las páginas del servicio API de OnFinality y precios RPC pueden ayudarte a comprender las opciones.

Finalmente, ten en cuenta que el ecosistema de clientes de BSC está evolucionando. Si bien los métodos descritos son estándar, los métodos de rastreo y depuración pueden variar. Siempre prueba tus consultas contra tu endpoint específico.

  • Los nodos de archivo cuestan más y pueden tener mayor latencia.
  • eth_getLogs en rangos amplios puede ser lento; usa filtros.
  • La disponibilidad de archivo del proveedor varía; consulta la documentación.
  • Los métodos específicos del cliente pueden diferir.

Próximos Pasos y Lecturas Adicionales

Ahora que comprendes cómo consultar datos históricos de BSC, explora estos recursos relacionados para profundizar tu conocimiento.

Para una comprensión más amplia de las consultas de datos históricos en cadenas EVM, consulta Consultando datos históricos de blockchain (recetario EVM). Para comparar tipos de nodos, lee Nodo de archivo vs nodo completo. Si eres nuevo en BSC, comienza con la Descripción general de la red BNB Smart Chain.

Para uso práctico de RPC, consulta los tipos de nodos de BNB Smart Chain (Asistente RPC) y el centro de aprendizaje de OnFinality para más guías. Además, revisa los límites de velocidad RPC de BNB Chain y errores 429 para evitar alcanzar los límites.

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