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.
Receta
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.
Ejemplo de Trabajo
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:
- El archivo IDL debe estar en la ruta de búsqueda del macro.
- Genera el tipo
program::Programpara validación. - El submódulo
cpirefleja las instrucciones llamadas. - Vuelve a ejecutar la compilación cuando la IDL del llamado se actualiza.
Análisis Profundo
Configuración
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.
Seguridad de Tipos
Las estructuras de cuenta generadas reducen los errores de metadatos de CPI en comparación con invoke crudo.
Trampas Comunes
- Desajuste de versión de IDL con el programa desplegado - La CPI falla en tiempo de ejecución. Solución: Fija el SHA de git de la IDL al despliegue.
- Cuentas faltantes en la estructura de CPI - El llamado rechaza la transacción. Solución: Haz coincidir exactamente la estructura generada.
- ID de programa incorrecta en
Program<T>- Fallo de restricción. Solución: Usa el tipo de módulo de programa generado. - Ruta del macro no encontrada - La compilación falla. Solución: Configura la ruta de IDL en
Anchor.toml. - El llamado no es Anchor - La IDL puede estar incompleta. Solución: Usa CPI manual o una IDL compatible.
Alternativas
| 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 |
Preguntas Frecuentes
¿Versión de Anchor?
0.32.1 para temas avanzados.
¿Cuándo usar `zero_copy`?
Diseños fijos grandes cuando el CU de Borsh es demasiado alto.
¿Es `realloc` reversible?
No fácilmente; planifica el crecimiento futuro.
¿Están las cuentas restantes en la IDL?
No; documéntalas por separado.
¿Qué necesita `declare_program!`?
JSON de IDL del llamado en tiempo de compilación.
¿Puede Anchor hacer CPI a Pinocchio?
Sí, con las metadatos de cuenta correctas.
¿Banderas de características y IDL?
Evita IDLs diferentes por característica en mainnet.
¿Cómo medir CU?
LiteSVM, Surfpool, simulación en devnet.
¿Son comunes los tipos de cuenta personalizados?
No; último recurso.
¿Próximos pasos?
Ver enlaces relacionados para declare_program.
Relacionado
- CPI a Programas Personalizados - Uso de CPI
- La IDL de Anchor - Formato de IDL
- Codama desde una IDL de Anchor - Generación de código TS
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.