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.
Busque em todas as páginas da documentação
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.
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.
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:
program::Program para validaçãocpi espelha as instruções chamadasColoque o IDL marketplace.json no workspace e referencie-o na configuração de build conforme a documentação do Anchor 0.32.
As structs de conta geradas reduzem erros de metadados de CPI em comparação com invoke bruto.
Program<T> - Falha na restrição. Correção: Use o tipo de módulo de programa gerado.Anchor.toml.| 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 |
0.32.1 para tópicos avançados.
Layouts fixos grandes quando o CU do Borsh é muito alto.
Não facilmente; planeje o crescimento futuro.
Não; documente separadamente.
IDL JSON do chamado em tempo de compilação.
Sim, com metadados de conta corretos.
Evite IDLs diferentes por recurso na mainnet.
LiteSVM, Surfpool, simulação em devnet.
Não; último recurso.
Veja os links Relacionados para declare_program.
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.
Revisado por Chris St. John·Última atualização: 16 de jul. de 2026