AnchorPy
AnchorPy gera clientes Python a partir de IDLs Anchor para que backends e bots chamem programas on-chain com builders de instrução tipados. Mira semânticas de IDL Anchor 0.32.1 e roda sobre solders + solana-py contra RPC Agave 4.1.1.
Receita
Cartão de receita de referência rápida - pronto para copiar e colar.
pip install anchorpy
from anchorpy import Program, Provider, Wallet
from solana.rpc.async_api import AsyncClient
PROGRAM_ID = "<YOUR_PROGRAM_PUBKEY>"
async def load_program():
client = AsyncClient("https://api.devnet.solana.com")
wallet = Wallet.local()
provider = Provider(client, wallet)
program = await Program.at(PROGRAM_ID, provider)
return programQuando usar isso:
- Serviços Python devem invocar instruções de programa Anchor 0.32.1.
- Você já publica IDL Anchor de
anchor build. - Bots precisam de resolução tipada de contas em vez de empacotar dados de instrução à mão.
- Scripts de pesquisa chamam views de programa sem frontend TypeScript.
Exemplo de Trabalho
import asyncio
import json
from pathlib import Path
from anchorpy import Program, Provider, Wallet, Idl
from solana.rpc.async_api import AsyncClient
PROGRAM_ID = "Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS"
RPC = "https://api.devnet.solana.com"
async def main():
idl_path = Path("target/idl/my_program.json")
idl = Idl.from_json(idl_path.read_text())
async with AsyncClient(RPC) as client:
wallet = Wallet.local()
provider = Provider(client, wallet, opts={"preflight_commitment": "confirmed"})
program = await Program.at(PROGRAM_ID, provider, idl=idl)
# Exemplo: buscar conta definida no IDL
# state = await program.account["MyAccount"].fetch(pda)
# Exemplo: enviar instrução
# sig = await program.rpc["initialize"](ctx=..., signer=wallet.payer)
print("Loaded program:", program.program_id)
asyncio.run(main())O que isso demonstra:
- IDL JSON é carregado explicitamente para geração de cliente reproduzível.
Provideracopla cliente RPC, carteira e opções padrão de transação.Program.atresolve program ID e anexa metadados IDL.- Namespaces de conta e RPC espelham clientes TypeScript Anchor.
Deep Dive
Como Funciona
anchor buildemitetarget/idl/<program>.jsoncorrespondendo a anchor-lang 0.32.1.- AnchorPy analisa IDL em tipos Python e encoders de instrução (layout Borsh).
Wallet.local()lêANCHOR_WALLETou~/.config/solana/id.jsoncomo toolchain TS.- Transações são construídas com tipos solders e submetidas via RPC async solana-py.
AnchorPy vs Cliente TypeScript
| Preocupação | AnchorPy | @coral-xyz/anchor TS |
|---|---|---|
| Fonte IDL | Mesmo JSON de Anchor 0.32.1 | Mesmo |
| Runtime | Serviços Python asyncio | Browser / Node |
| Tipos | Stubs Python gerados | TS gerado |
| Melhor para | Bots, triggers ETL, backends | dApps frontend |
Notas Python
# Fixe IDL no repo - regenere no CI quando programa mudar
# anchor build && cp target/idl/my_program.json clients/python/
# Use keypair explícito em produção
from solders.keypair import Keypair
from anchorpy import Wallet
secret = Keypair.from_bytes(bytes(json.load(open("bot.json"))))
wallet = Wallet(secret)
# Busque múltiplas contas concorrentemente
# accounts = await program.account["Position"].all()Armadilhas
- Drift de IDL - programa atualizado sem refresh de IDL quebra encoders. Correção: versione IDL junto ao hash do binário do programa.
- Program ID de cluster errado - IDs devnet vs mainnet diferem. Correção: tabela de config por ambiente.
- Signer ausente em chamadas
rpc- contas Anchor precisam signers explícitos. Correção: passectxcom contasSigner. - RPC bloqueante em código async - use
AsyncClientem todo lugar. Correção: semClientsync dentro de loops asyncio. - Assumir que AnchorPy faz deploy - é apenas cliente. Correção: use Anchor CLI 0.32.1 / Solana CLI 3.0.10 para deploy.
Alternativas
| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
Instruction empacotada à mão | Conjunto pequeno e estável de instruções | Superfície IDL grande |
@solana/kit + Codama TS | Frontend + tipos compartilhados | Equipe só Python |
Cliente Rust declare_program! | Serviços off-chain Rust | Stack Python |
| CPI bruto de outro programa | Composição on-chain | Automação off-chain |
FAQs
AnchorPy suporta Anchor 0.32.1?
Sim - use IDLs gerados por Anchor CLI 0.32.1 / anchor-lang 0.32.1.
Como gerar tipos Python?
Use codegen CLI anchorpy a partir do IDL quando quiser stubs commitados; Program.at também funciona dinamicamente.
Posso chamar programas não-Anchor?
Não via helpers IDL - construa instruções brutas com solders.
Derivação PDA?
AnchorPy expõe helpers de seeds alinhados com convenções Anchor.
Eventos e logs?
Analise logs de transação ou use parsers de evento IDL onde disponíveis.
Testes?
Aponte provider para validator local ou fork Surfpool 0.12.0.
Múltiplos programas?
Instancie um Program por par program ID / IDL.
Decodificação de erros?
Mapeie códigos de erro customizados usando tabela de erros IDL - espelhe padrões do cliente TS.
Chaves mainnet?
Use wrappers HSM em nuvem ou hardware em torno de Wallet - nunca commite secrets.
Funciona com Token-2022?
Sim se seu programa Anchor e IDL incluem esses tipos de conta.
Relacionado
- Noções Básicas de Python para Solana - intro da seção
- Construindo Transações em Python - montagem de tx bruta
- O IDL Anchor - formato IDL
- Gerando Clientes TS - caminho TS paralelo
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.