solders e solana-py
solders fornece primitivos Solana rápidos e tipados em Python; solana-py (import solana) envolve JSON-RPC, helpers de transação e assinaturas websocket. Juntos formam a stack Python off-chain padrão contra nós RPC Agave 4.1.1.
Receita
Cartão de receita de referência rápida - pronto para copiar e colar.
pip install solders solana
from solders.pubkey import Pubkey
from solders.keypair import Keypair
from solana.rpc.api import Client
client = Client("https://api.devnet.solana.com")
payer = Keypair()
balance = client.get_balance(payer.pubkey()).valueQuando usar isso:
- Construir bots ou backends que leem estado da chain e enviam transações.
- Precisar de performance nível Rust para serialização e manipulação de chaves em Python.
- Evitar tooling JS pesado quando sua equipe já roda serviços Python.
- Prototipar scripts de ops que espelham workflows Solana CLI 3.0.10.
Exemplo de Trabalho
import asyncio
from solders.keypair import Keypair
from solders.pubkey import Pubkey
from solders.system_program import TransferParams, transfer
from solders.hash import Hash
from solders.message import Message
from solders.transaction import VersionedTransaction
from solana.rpc.async_api import AsyncClient
from solana.rpc.types import TxOpts
RPC = "https://api.devnet.solana.com"
RECIPIENT = Pubkey.from_string("11111111111111111111111111111111")
async def main():
payer = Keypair()
async with AsyncClient(RPC) as client:
bh_resp = await client.get_latest_blockhash()
blockhash = Hash.from_string(str(bh_resp.value.blockhash))
ix = transfer(
TransferParams(
from_pubkey=payer.pubkey(),
to_pubkey=RECIPIENT,
lamports=1_000,
)
)
msg = Message.new_with_blockhash([ix], payer.pubkey(), blockhash)
tx = VersionedTransaction(msg, [payer])
sim = await client.simulate_transaction(tx)
if sim.value.err:
raise RuntimeError(sim.value.err)
sig = await client.send_transaction(
tx,
opts=TxOpts(skip_preflight=True, preflight_commitment="confirmed"),
)
print("signature:", sig.value)
asyncio.run(main())O que isso demonstra:
soldersconstrói instruções, mensagens e transações versionadas.AsyncClientbusca blockhashes e submete transações.- Simulação detecta falhas antes de gastar taxa.
VersionedTransactioné o padrão moderno em clusters Agave 4.x.
Deep Dive
Como Funciona
- solders faz bind a implementações Rust de tipos Solana (
Pubkey,Keypair,Instruction, sysvars). - solana-py implementa JSON-RPC 2.0 sobre HTTP/WebSocket com tipos compatíveis com solders.
- Serialização cruza a fronteira Python/Rust em caminhos quentes como assinatura e empacotamento de mensagem.
- Nenhum pacote compila programas on-chain - combine com Anchor 0.32.1 para trabalho de programa.
Responsabilidades dos Pacotes
| Pacote | Papel | Imports típicos |
|---|---|---|
solders | Primitivos, helpers de programa, sysvars | Pubkey, Keypair, Instruction, system_program |
solana (solana-py) | Cliente RPC, assinaturas, tx opts | Client, AsyncClient, TxOpts |
anchorpy | Clientes IDL Anchor (opcional) | Program, Provider, Wallet |
Notas Python
# tipos solders são imutáveis - reconstrua em vez de mutar
from solders.instruction import Instruction, AccountMeta
# Prefira encodings explícitos em chamadas RPC
client.get_account_info(pubkey, encoding="base64")
# Async para leituras concorrentes em bots
async with AsyncClient(RPC) as client:
await asyncio.gather(
client.get_balance(pk1),
client.get_balance(pk2),
)Armadilhas
- Misturar exemplos web3.js com solders - nomes de campos e formas de transação diferem. Correção: siga APIs de mensagem solders ponta a ponta.
- Matemática float de lamports -
0.1 * 1e9introduz erros de arredondamento. Correção: apenas lamports inteiros. - Blockhashes obsoletos em loops longos - transações expiram após ~60-90s. Correção: atualize blockhash a cada tentativa.
get_program_accountssem limite - pode causar OOM no processo. Correção: filtros memcmp e indexadores externos.- Commitment padrão
finalized- lento demais para bots. Correção: useconfirmedouprocessedexplicitamente por chamada.
Alternativas
| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
@solana/kit 7.0.0 (TypeScript) | dApp full-stack com Next.js | Equipe só Python |
| Solana CLI 3.0.10 scripts | Ops e deploys pontuais | Automação nível exchange |
httpx + JSON-RPC bruto | Dependências mínimas | Você reimplementará tipos mal |
Cliente TS gill | Camada de app Kit-native | Camada de serviço Python |
FAQs
solders é obrigatório com solana-py?
Sim para releases modernas de solana-py - depende de solders para tipos core.
Cliente sync ou async?
Use AsyncClient para bots e serviços com I/O concorrente; Client para notebooks e scripts.
Funciona em mainnet-beta?
Sim - aponte URL RPC ao seu provedor; comportamento corresponde ao JSON-RPC Agave 4.1.1.
Como adicionar taxas de prioridade?
Anexe instruções Compute Budget construídas com solders antes do envio.
Transações versionadas vs legacy?
Prefira transações versionadas; caminhos legacy estão depreciados em muitos guias.
Onde entram IDLs?
Use AnchorPy sobre esta stack para chamadas de programa Anchor.
Teste local?
Aponte RPC para http://127.0.0.1:8899 com solana-test-validator ou Surfpool 0.12.0.
Armazenamento de chaves?
Carregue de env ou HSM - nunca embuta secrets no controle de versão.
Limites de taxa RPC?
Backoff com jitter; distribua leituras entre múltiplos endpoints se necessário.
Logar falhas de simulação?
Imprima sim.value.logs - espelham logs de programa on-chain.
Relacionado
- Noções Básicas de Python para Solana - intro da seção
- Construindo Transações em Python - assinatura e envio
- AnchorPy - clientes IDL Anchor
- Noções Básicas de RPC - conceitos JSON-RPC
Versões da 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.