Eventos com emit!
Tipos #[event] e a macro emit! escrevem logs estruturados que os indexadores podem analisar. Prefira eventos em vez de msg! ad-hoc para mudanças de estado observáveis.
Busque em todas as páginas da documentação
Tipos #[event] e a macro emit! escrevem logs estruturados que os indexadores podem analisar. Prefira eventos em vez de msg! ad-hoc para mudanças de estado observáveis.
#[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 });Quando usar isso: Indexadores, análises ou clientes precisam de observação confiável pós-execução.
#[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(())
}O que isso demonstra:
emit! usa o padrão self-CPI internamenteemit! clássico aciona um self-CPI do qual alguns indexadores dependem. Para captura garantida em todos os runtimes, veja emit_cpi!.
Inclua chaves necessárias para juntar dados off-chain; evite blobs enormes em eventos.
msg! apenas para depuração - Não é analisável por máquina. Correção: Use #[event].pub na struct do evento. Correção: Todos os campos de evento devem ser pub.| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
emit_cpi! | Captura confiável | Desenvolvimento local simples |
| Apenas estado da conta | Nenhum log necessário | Análises orientadas por indexador |
| Geyser gRPC | Pesado em infraestrutura | Eventos no nível do aplicativo |
Códigos personalizados no IDL mais strings #[msg].
emit_cpi! custa mais CU, mas melhora a confiabilidade da captura.
Evite, exceto atrás de flags de recurso.
Do IDL via Anchor ou codegen Codama.
Sim, tipos #[event] são listados.
Sim, com @ MyError::Variant.
Cada linha de log e string formatada.
anchor test esperando códigos de erro.
Sim, mas não um contrato de API; use eventos.
Veja Relacionados para eventos.
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: 19 de jul. de 2026