Eventos con emit!
Los tipos #[event] y la macro emit! escriben logs estructurados que los indexadores pueden parsear. Prefiere eventos sobre msg! ad-hoc para cambios de estado observables.
Busca en todas las páginas de la documentación
Los tipos #[event] y la macro emit! escriben logs estructurados que los indexadores pueden parsear. Prefiere eventos sobre msg! ad-hoc para cambios de estado observables.
#[event]
pub struct TradeExecuted {
pub user: Pubkey,
pub amount_in: u64,
pub amount_out: u64,
}
emit!(TradeExecuted { user: ctx.accounts.user.key(), amount_in, amount_out });Cuándo usar esto: Los indexadores, analíticas o clientes necesitan observación fiable a posteriori.
#[event]
pub struct PositionOpened {
pub owner: Pubkey,
pub market: Pubkey,
pub size: u64,
pub timestamp: i64,
}
pub fn open_position(ctx: Context<OpenPosition>, size: u64) -> Result<()> {
let clock = Clock::get()?;
emit!(PositionOpened {
owner: ctx.accounts.owner.key(),
market: ctx.accounts.market.key(),
size,
timestamp: clock.unix_timestamp,
});
Ok(())
}Lo que esto demuestra:
emit! usa el patrón self-CPI internamenteemit! clásico activa un self-CPI en el que algunos indexadores confían. Para una captura garantizada en todos los runtimes, consulta emit_cpi!.
Incluye las claves necesarias para unir datos off-chain; evita grandes bloques en los eventos.
msg! solo para depuración - No es interpretable por máquinas. Solución: Usa #[event].pub en la struct del evento. Solución: Todos los campos de evento deben ser pub.| Alternativa | Úsalo Cuando | No lo Uses Cuando |
|---|---|---|
emit_cpi! | Captura fiable | Desarrollo local simple |
| Solo estado de cuenta | No se necesitan logs | Analíticas impulsadas por indexador |
| Geyser gRPC | Requiere mucha infraestructura | Eventos a nivel de aplicación |
Códigos personalizados en IDL más strings #[msg].
emit_cpi! cuesta más CU pero mejora la fiabilidad de captura.
Evítalo excepto detrás de flags de características.
Desde IDL a través de Anchor o la generación de código de Codama.
Sí, los tipos #[event] están listados.
Sí, con @MyError::Variant.
Cada línea de log y string formateado.
anchor test esperando códigos de error.
Sí, pero no un contrato de API; usa eventos.
Ver Relacionados para eventos.
Versiones de Stack: 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: 19 jul 2026