declare_program!
El macro declare_program! de Anchor 0.32.1 genera módulos de Rust para programas externos: constructores de instrucciones, tipos de cuenta y ayudantes de CPI a partir de JSON de IDL.
Busca en todas las páginas de la documentación
El macro declare_program! de Anchor 0.32.1 genera módulos de Rust para programas externos: constructores de instrucciones, tipos de cuenta y ayudantes de CPI a partir de JSON de IDL.
declare_program!(other_program);
other_program::cpi::initialize(
CpiContext::new(
ctx.accounts.other_program.to_account_info(),
other_program::cpi::accounts::Initialize { /* ... */ },
),
)?;Cuándo usar esto: Tu programa realiza una CPI a otro programa de Anchor con una IDL publicada.
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(())
}Lo que esto demuestra:
program::Program para validación.cpi refleja las instrucciones llamadas.Coloca la IDL marketplace.json en el espacio de trabajo y referénciala en la configuración de compilación según la documentación de Anchor 0.32.
Las estructuras de cuenta generadas reducen los errores de metadatos de CPI en comparación con invoke crudo.
Program<T> - Fallo de restricción. Solución: Usa el tipo de módulo de programa generado.Anchor.toml.| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
invoke manual con bytes de discriminador | Llamados que no son de Anchor | Programas con IDL disponible |
| Composición solo del lado del cliente | Sin CPI en cadena | Composición atómica de programas |
0.32.1 para temas avanzados.
Diseños fijos grandes cuando el CU de Borsh es demasiado alto.
No fácilmente; planifica el crecimiento futuro.
No; documéntalas por separado.
JSON de IDL del llamado en tiempo de compilación.
Sí, con las metadatos de cuenta correctas.
Evita IDLs diferentes por característica en mainnet.
LiteSVM, Surfpool, simulación en devnet.
No; último recurso.
Ver enlaces relacionados para declare_program.
Versiones de la pila: Esta página fue 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 y LiteSVM 0.6.x.
Revisado por Chris St. John·Última actualización: 16 jul 2026