Lectura de Datos de la Cadena
Los servicios de Python leen el estado de Solana a través de JSON-RPC (getAccountInfo, getTokenAccountsByOwner, getSignaturesForAddress) y, para NFTs y activos comprimidos, la API Digital Asset Standard (DAS). Usa solana-py para el RPC principal y httpx para los endpoints HTTP de DAS en proveedores Agave 4.1.1.
Receta
Tarjeta de referencia rápida - lista para copiar y pegar.
from solders.pubkey import Pubkey
from solana.rpc.api import Client
client = Client("https://api.devnet.solana.com")
mint = Pubkey.from_string("<MINT_PUBKEY>")
info = client.get_account_info(mint)
print(info.value.lamports if info.value else "missing")
tokens = client.get_token_accounts_by_owner_json_parsed(
Pubkey.from_string("<OWNER>"),
{"mint": str(mint)},
)Cuándo usar esto:
- Backends que sirven saldos y historial de carteras.
- Bots que monitorizan cambios de estado de cuentas entre envíos.
- Trabajos ETL que hidratan almacenes de datos a partir de cuentas en la cadena.
- Dashboards de NFT/cNFT a través de los métodos
getAssety de búsqueda de DAS.
Ejemplo de Trabajo
import asyncio
import httpx
from solders.pubkey import Pubkey
from solana.rpc.async_api import AsyncClient
RPC = "https://api.devnet.solana.com"
DAS = "https://devnet.helius-rpc.com/?api-key=<KEY>" # proveedor con DAS habilitado
OWNER = Pubkey.from_string("<OWNER_PUBKEY>")
async def fetch_portfolio():
async with AsyncClient(RPC) as client:
sol = await client.get_balance(OWNER)
sigs = await client.get_signatures_for_address(OWNER, limit=10)
token_resp = await client.get_token_accounts_by_owner_json_parsed(
OWNER,
{"programId": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},
)
tokens = token_resp.value
async with httpx.AsyncClient() as http:
das_resp = await http.post(
DAS,
json={
"jsonrpc": "2.0",
"id": 1,
"method": "getAssetsByOwner",
"params": {"ownerAddress": str(OWNER), "page": 1, "limit": 50},
},
)
assets = das_resp.json()["result"]
return {
"lamports": sol.value,
"recent_signatures": [s.signature for s in sigs.value],
"spl_tokens": len(tokens),
"das_assets": len(assets.get("items", [])),
}
print(asyncio.run(fetch_portfolio()))Lo que esto demuestra:
- El RPC principal lee el saldo de SOL, las firmas y las cuentas de tokens SPL.
- Las cuentas de tokens analizadas con JSON evitan la decodificación manual del diseño.
- DAS complementa el RPC para la agregación de metadatos de NFT/cNFT.
- La recopilación asíncrona de llamadas a proveedores vinculadas a E/S de manera eficiente.
Inmersión Profunda
Cómo Funciona
- Las cuentas almacenan lamports + bytes opacos; la interpretación depende del programa propietario.
- Las cuentas de tokens SPL utilizan un diseño bien conocido; el RPC
jsonParseddevuelve campos estructurados. - Las firmas para una dirección se paginan hacia atrás en el tiempo con el cursor
before. - DAS indexa activos digitales comprimidos y estándar; no es un reemplazo para todas las lecturas RPC.
Mapa de API de Lectura
| Necesidad | Método | Cliente |
|---|---|---|
| Bytes brutos de cuenta | getAccountInfo | solana-py |
| Saldo de SOL | getBalance | solana-py |
| Saldos SPL | getTokenAccountsByOwner (jsonParsed) | solana-py |
| Historial de Tx | getSignaturesForAddress | solana-py |
| Metadatos NFT | getAsset / searchAssets | DAS HTTP |
| Escaneo de cuentas de programa | getProgramAccounts + memcmp | solana-py (con cuidado) |
Notas de Python
# Decodificar cuenta de Anchor con AnchorPy después de obtener datos brutos
# account = await program.account["MyState"].fetch(pubkey)
# Paginación de firmas
before = None
while True:
batch = await client.get_signatures_for_address(addr, before=before, limit=1000)
if not batch.value:
break
before = batch.value[-1].signatureTrampas
getProgramAccountssin filtros - descarga el estado completo del programa. Solución:memcmpen el discriminador; usar un indexador.- Asumir DAS en cada URL RPC - el devnet público puede carecer de DAS. Solución: usar explícitamente un proveedor capaz de DAS.
- Confusión de codificación -
base64vsjsonParsedcambia la forma de la respuesta. Solución: elegir por llamada y documentar. - Límites de tasa durante las copias de seguridad - los escaneos secuenciales activan 429s. Solución: limitar la velocidad, dividir por slot o exportar desde BigTable.
- Cuentas de tokens cerradas - las cuentas con saldo cero pueden omitirse. Solución: manejar listas vacías; rastrear los Mints por separado.
Alternativas
| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
| Stream gRPC Geyser | Indexación en tiempo real | Lecturas únicas simples |
@solana/kit en frontend | Lecturas de cartera del usuario | Análisis de Python |
| APIs mejoradas Helius / Triton | DAS + historial analizado | Solo devnet air-gapped |
| Réplica de almacén (ClickHouse) | Análisis a escala | Comprobación de saldo única |
Preguntas Frecuentes
¿Necesito DAS para tokens SPL?
No, las cuentas de tokens SPL están disponibles a través de la codificación jsonParsed estándar de RPC.
¿Cuándo se requiere DAS?
NFT comprimidos, búsqueda unificada de NFT y metadatos enriquecidos sin recorridos manuales de PDA.
¿Qué tan actualizados están los datos de DAS?
Depende del proveedor; consulta los SLAs de latencia del indexador para tu proveedor.
getMultipleAccounts?
Agrupa hasta el límite del proveedor (a menudo 100) para rutas críticas.
¿Saldos históricos?
RPC es puntual; usa RPC de archivo o tu indexador para el historial.
¿Analizar cuentas de Anchor sin AnchorPy?
Posible con diseños Borsh; AnchorPy es más simple cuando existe la IDL.
¿Suscripciones WebSocket?
solana-py admite suscripciones de cuentas y logs para bots.
¿URLs de Devnet vs Mainnet?
Nunca compartas una instancia de cliente entre clústeres; usa configuraciones separadas.
¿Conjunto de datos público de BigQuery?
Bueno para análisis por lotes; no para bucles de trading de baja latencia.
¿Registro de cumplimiento?
Registra qué proveedor RPC sirvió cada lectura para pistas de auditoría.
Relacionado
- solders y solana-py - Configuración del cliente RPC
- Análisis de Datos - Exportación a pandas/Polars
- La API DAS - Referencia de DAS
- Conceptos Básicos de RPC - Núcleo de JSON-RPC
Versiones de Stack: 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.