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.
Receita
#[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.
Exemplo Funcional
#[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:
- Eventos registrados no IDL
emit!usa o padrão self-CPI internamente- Campos devem ser serializáveis com Borsh
- Indexadores se inscrevem nos logs do programa
Análise Detalhada
Self-CPI
emit! clássico aciona um self-CPI do qual alguns indexadores dependem. Para captura garantida em todos os runtimes, veja emit_cpi!.
Design de Campos
Inclua chaves necessárias para juntar dados off-chain; evite blobs enormes em eventos.
Armadilhas
- Cargas de evento enormes - Limites de CU e de log. Correção: Armazene o hash on-chain, detalhes off-chain.
msg!apenas para depuração - Não é analisável por máquina. Correção: Use#[event].- Campos privados não no IDL - Devem ser
pubna struct do evento. Correção: Todos os campos de evento devem serpub. - Emitir segredos - Logs são públicos. Correção: Nunca emita chaves privadas.
- Evento ausente no caminho de erro - Análises incompletas. Correção: Emita antes da falha ou use eventos de erro separados.
Alternativas
| 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 |
FAQs
Formato de erro do Anchor 0.32.1?
Códigos personalizados no IDL mais strings #[msg].
emit! vs emit_cpi!?
emit_cpi! custa mais CU, mas melhora a confiabilidade da captura.
Devo usar msg! na mainnet?
Evite, exceto atrás de flags de recurso.
Como os clientes obtêm códigos de erro?
Do IDL via Anchor ou codegen Codama.
Eventos aparecem no IDL?
Sim, tipos #[event] são listados.
Restrições podem retornar erros personalizados?
Sim, com @ MyError::Variant.
O que usa CU em logging?
Cada linha de log e string formatada.
Como testar erros?
anchor test esperando códigos de erro.
Logs são dados de consenso?
Sim, mas não um contrato de API; use eventos.
Próxima leitura?
Veja Relacionados para eventos.
Relacionados
- emit_cpi! & Eventos Self-CPI - emit confiável
- Logging & Custo de CU - CU
- Construindo um Indexador - indexadores
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.