Conceptos básicos de indexación
8 ejemplos para empezar a indexar Solana: 5 básicos y 3 intermedios.
Prerrequisitos
- Proveedor de RPC o nodo autoalojado para backfill.
- Base de datos (Postgres es común) para el estado del índice persistente.
- Comprensión de Métodos RPC principales.
Ejemplos básicos
1. Por qué RPC solo falla a escala
El historial de billeteras a través de getSignaturesForAddress requiere miles de llamadas HTTP paginadas.
# Lento para ballenas: cada página es un viaje de ida y vuelta de RPC
solana confirm -v $(solana transaction-history <PUBKEY> 2>/dev/null | head -1) 2>/dev/null || true- RPC es solicitud/respuesta: no hay una capa de consulta duradera para analítica SQL.
- Los límites de tasa limitan los backfills históricos durante el lanzamiento del producto.
- Los indexadores escriben una vez, consultan muchas veces desde tu base de datos.
Relacionado: Paginación y eficiencia - Límites de RPC.
2. Flujo de datos del indexador
Ingerir, analizar, almacenar, servir.
Validator → Geyser/Yellowstone/Webhook → Parser → Postgres → API
- La ingesta son eventos inmutables ordenados por ranura.
- El analizador mapea las instrucciones a filas de dominio (swaps, votes, mints).
- La API sirve consultas paginadas a las aplicaciones.
Relacionado: Construir un indexador - Implementación.
3. Backfill vs. Transmisión en vivo
Ponerse al día históricamente y luego seguir las nuevas ranuras.
# Conceptual: reproducir ranuras 250000000..última desde el ledger archivado o RPC- El backfill utiliza
getBlock/getTransactiono archivos del proveedor. - La transmisión en vivo utiliza Geyser o WebSocket después de que el cursor alcance la punta.
- Almacena la última ranura procesada para recuperación ante fallos.
4. Escrituras idempotentes
Usa claves naturales para que las reproducciones no dupliquen filas.
INSERT INTO transfers (signature, idx, amount)
VALUES ($1, $2, $3)
ON CONFLICT (signature, idx) DO NOTHING;- Las transacciones tienen firmas únicas; el índice de instrucciones desambigua las instrucciones internas.
- Las reorganizaciones son raras en
confirmed, pero diseña para indicadores de retroceso de ranura en finanzas críticas. - La reproducción desde la ranura N después de una interrupción debe ser segura.
5. Analizar con IDL
Decodifica los datos de la instrucción de forma determinista.
// Concepto: usar el cliente generado o la coincidencia del discriminador de Anchor
// if data[..8] == DEPOSIT_DISCRIMINATOR { ... }- Los discriminadores de IDL de Anchor identifican las variantes de instrucción.
- Los analizadores generados por Codama mantienen el esquema sincronizado con las versiones del programa.
- Nunca bases la lógica de negocio solo en el análisis de cadenas de logs.
Relacionado: Analizar datos de programas - Detalle de la decodificación.
Ejemplos intermedios
6. Hook de plugin Geyser
El validador transmite actualizaciones de cuentas/transacciones a tu sink.
# Indicador del validador (configuración del operador)
agave-validator --geyser-plugin-config geyser.json- Los plugins reciben un flujo de datos a la velocidad del validador.
- Filtras los programas que te interesan desde el principio para ahorrar CPU.
- Ver Plugins Geyser.
7. Consumidor gRPC de Yellowstone
Consumidores de Rust/Go de alto rendimiento se suscriben a flujos filtrados.
# El consumidor se conecta al punto final de Yellowstone del proveedor
# Filtrar por ID de programa propietario y memcmp de cuenta- Menor latencia que el sondeo de RPC para indexadores.
- Requiere un proveedor administrado o una pila autoalojada.
- Ver Yellowstone gRPC.
8. Ingesta de Webhook
El proveedor envía eventos a tu punto final HTTPS.
# Webhook de Helius -> POST https://api.yourapp.com/helius- No se requiere un servidor WebSocket de larga duración de tu lado.
- Verifica las firmas en las cargas útiles de webhook según la documentación del proveedor.
- Ver Webhooks.
Versiones de la pila: Esta página se escribió para Agave 4.1.1, Solana CLI 3.0.10, Anchor 0.32.1, anchor-lang 0.32.1, Rust 1.91.1, @solana/kit 7.0.0, Surfpool 0.12.0 y LiteSVM 0.6.x.