declare_program!
A macro declare_program! do Anchor 0.32.1 gera módulos Rust para programas externos: construtores de instruções, tipos de conta e helpers de CPI a partir do IDL JSON.
Receita
declare_program!(other_program);
other_program::cpi::initialize(
CpiContext::new(
ctx.accounts.other_program.to_account_info(),
other_program::cpi::accounts::Initialize { /* ... */ },
),
)?;Quando usar isto: Seu programa faz CPI para outro programa Anchor com um IDL publicado.
Exemplo Funcional
use anchor_lang::prelude::*;
declare_program!(marketplace);
#[derive(Accounts)]
pub struct ListViaMarketplace<'info> {
pub marketplace_program: Program<'info, marketplace::program::Marketplace>,
#[account(mut)]
pub listing: Signer<'info>,
}
pub fn list(ctx: Context<ListViaMarketplace>, price: u64) -> Result<()> {
marketplace::cpi::list(
CpiContext::new(
ctx.accounts.marketplace_program.to_account_info(),
marketplace::cpi::accounts::List {
listing: ctx.accounts.listing.to_account_info(),
},
),
price,
)?;
Ok(())
}O que isto demonstra:
- O arquivo IDL deve estar no caminho de busca da macro
- Gera o tipo
program::Programpara validação - O submódulo
cpiespelha as instruções chamadas - Reexecuta a compilação quando o IDL do chamado é atualizado
Mergulho Profundo
Configuração
Coloque o IDL marketplace.json no workspace e referencie-o na configuração de build conforme a documentação do Anchor 0.32.
Segurança de Tipo
As structs de conta geradas reduzem erros de metadados de CPI em comparação com invoke bruto.
Armadilhas
- Discrepância de versão do IDL com o programa implantado - A CPI falha em tempo de execução. Correção: Fixe o SHA do git do IDL na implantação.
- Contas ausentes na struct CPI - O chamado rejeita a transação. Correção: Corresponda exatamente à struct gerada.
- ID de programa incorreto em
Program<T>- Falha na restrição. Correção: Use o tipo de módulo de programa gerado. - Caminho da macro não encontrado - A compilação falha. Correção: Configure o caminho do IDL em
Anchor.toml. - Chamado não é Anchor - O IDL pode estar incompleto. Correção: Use CPI manual ou IDL compatível.
Alternativas
| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
invoke manual com bytes do discriminador | Chamados não-Anchor | Programas com IDL disponível |
| Composição apenas no cliente | Sem CPI on-chain | Composição atômica de programas |
FAQs
Versão do Anchor?
0.32.1 para tópicos avançados.
Quando usar `zero_copy`?
Layouts fixos grandes quando o CU do Borsh é muito alto.
A realocação é reversível?
Não facilmente; planeje o crescimento futuro.
As contas restantes estão no IDL?
Não; documente separadamente.
`declare_program!` precisa de quê?
IDL JSON do chamado em tempo de compilação.
O Anchor pode fazer CPI para Pinocchio?
Sim, com metadados de conta corretos.
Flags de recursos e IDL?
Evite IDLs diferentes por recurso na mainnet.
Como medir o CU?
LiteSVM, Surfpool, simulação em devnet.
Tipos de conta personalizados são comuns?
Não; último recurso.
Próximos passos?
Veja os links Relacionados para declare_program.
Relacionados
- CPI para Programas Personalizados - Uso de CPI
- O IDL do Anchor - Formato do IDL
- Codama a partir de um IDL do Anchor - Geração de código TS
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.