Lendo dados da cadeia
Os serviços Python leem o estado Solana por meio de JSON-RPC (getAccountInfo, getTokenAccountsByOwner, getSignaturesForAddress) e, para NFTs e ativos compactados, a API Digital Asset Standard (DAS). Use solana-py para RPC principal e httpx para endpoints HTTP DAS em provedores Agave 4.1.1.
Receita
Cartão de receitas de referência rápida - pronto para copiar e colar.
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)},
)
Quando fazer isso:
- Backends servindo saldos e histórico do portfólio.
- Bots monitorando mudanças de estado da conta entre envios.
- Trabalhos ETL hidratando armazéns de contas na rede.
- Painéis NFT/cNFT via DAS
getAssete métodos de pesquisa.
Exemplo de trabalho
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>" # provider with DAS enabled
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()))
O que isso demonstra:
- Core RPC lê saldo SOL, assinaturas e contas de token SPL.
- Contas de token analisadas por JSON evitam a decodificação manual de layout.
- DAS complementa RPC para agregação de metadados NFT/cNFT.
- Async reúne chamadas de provedor vinculadas a E/S com eficiência.
Aprofundamento
Como funciona
- Contas armazenam lamports + bytes opacos; a interpretação depende do programa proprietário.
- Contas SPL Token usam um layout conhecido - RPC
jsonParsedretorna campos estruturados. - Assinaturas de endereço paginam de trás para frente com o cursor
before. - Índices DAS compactados e ativos digitais padrão - não um substituto para todas as leituras de RPC.
Ler mapa da API
| Necessidade | Método | Cliente |
|---|---|---|
| Bytes de conta brutos | getAccountInfo | solana-py |
| Saldo SOL | getBalance | solana-py |
| Saldos SPL | getTokenAccountsByOwner (jsonParsed) | solana-py |
| História do Tx | getSignaturesForAddress | solana-py |
| Metadados NFT | getAsset / searchAssets | DASHTTP |
| Verificação de contas do programa | getProgramAccounts + memcmp | solana-py (cuidadoso) |
Notas Python
# Decode Anchor account with AnchorPy after fetching raw data
# account = await program.account["MyState"].fetch(pubkey)
# Paginate signatures
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].signature
Pegadinhas
getProgramAccountssem filtros - baixa todo o estado do programa. Correção: memcmp no discriminador; use um indexador.- Assumindo DAS em cada URL RPC - o devnet público pode não ter DAS. Correção: use explicitamente um provedor compatível com DAS.
- Confusão de codificação -
base64vsjsonParsedaltera o formato da resposta. Correção: escolha por chamada e documento. - Limites de taxa durante preenchimentos - verificações sequenciais disparam 429s. Correção: limitar, fragmentar por slot ou exportar do BigTable.
- Contas token fechadas - contas com saldo zero podem ser omitidas. Correção: lidar com listas vazias; rastreie as balas separadamente.
Alternativas
| Alternativa | Usar quando | Não use quando |
|---|---|---|
| Fluxo gRPC do gêiser | Indexação em tempo real | Leituras únicas simples |
@solana/kit no front-end | Leituras da carteira do usuário | Análise Python |
| APIs aprimoradas Helius / Triton | DAS + histórico analisado | Somente devnet com isolamento aéreo |
| Réplica do armazém (ClickHouse) | Análise em escala | Verificação de saldo único |
Perguntas frequentes
Preciso de DAS para tokens SPL?
Não - as contas de token SPL estão disponíveis por meio da codificação jsonParsed RPC padrão.
Quando o DAS é necessário?
NFTs compactados, pesquisa NFT unificada e metadados ricos sem caminhadas manuais por PDA.
Quão atualizados são os dados DAS?
Dependente do provedor - verifique os SLAs de atraso do indexador para seu fornecedor.
getMultipleAccounts?
Agrupe até o limite do provedor (geralmente 100) para caminhos ativos.
Saldos históricos?
RPC é um momento específico; use RPC de arquivamento ou seu indexador para histórico.
Analisar contas Anchor sem AnchorPy?
Possível com layouts Borsh - AnchorPy é mais simples quando existe IDL.
Assinaturas WebSocket?
solana-py suporta assinaturas de contas e registros para bots.
URLs Devnet vs mainnet?
Nunca compartilhe uma instância de cliente entre clusters – configurações separadas.
Conjunto de dados público do BigQuery?
Bom para análises em lote; não para loops comerciais de baixa latência.
Registro de conformidade?
Registre qual provedor RPC atendeu cada leitura para trilhas de auditoria.
Relacionado
- solders & solana-py - Configuração do cliente RPC
- Análise de dados - exportação de pandas/Polars
- A API DAS - Referência DAS
- Noções básicas de RPC - Núcleo JSON-RPC
Versões Stack: Esta página foi escrita 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 e LiteSVM 0.6.x.