Instruction Handlers
Instruction handlers são funções públicas dentro de #[program]. Elas recebem Context<T>, onde T é a struct de contas validada, além de argumentos deserializados com Borsh.
Busque em todas as páginas da documentação
Instruction handlers são funções públicas dentro de #[program]. Elas recebem Context<T>, onde T é a struct de contas validada, além de argumentos deserializados com Borsh.
pub fn deposit(ctx: Context<Deposit>, amount: u64) -> Result<()> {
require!(amount > 0, VaultError::InvalidAmount);
// business logic
Ok(())
}Quando usar: Você implementa a lógica de negócio de uma instrução on-chain.
#[program]
pub mod vault {
use super::*;
pub fn deposit(ctx: Context<Deposit>, amount: u64) -> Result<()> {
let vault = &mut ctx.accounts.vault;
vault.total = vault.total.checked_add(amount).ok_or(VaultError::Overflow)?;
emit!(Deposited { amount, vault: vault.key() });
Ok(())
}
}
#[derive(Accounts)]
pub struct Deposit<'info> {
#[account(mut, seeds = [b"vault"], bump = vault.bump)]
pub vault: Account<'info, VaultState>,
#[account(mut)]
pub depositor: Signer<'info>,
}O que isso demonstra:
Context<Deposit> encapsula contas e program_idResult<()> propaga erros customizadosctx.bumps expõe bumps canônicos a partir de seeds| Campo | Uso |
|---|---|
ctx.accounts | Contas validadas mutáveis/imutáveis |
ctx.program_id | Pubkey do programa atual |
ctx.bumps | Mapa de bump seeds a partir de constraints |
ctx.remaining_accounts | Contas extras fora da struct |
Mantenha handlers pequenos; delegue lógica complexa para funções de módulo.
ctx.bumps.vault a partir do nome em seeds.Result<()> ou APIs de retorno de dados.| Alternativa | Use quando | Não use quando |
|---|---|---|
| Helpers de módulo | Lógica compartilhada entre handlers | Inline em programas pequenos |
| APIs return_data | Retornar bytes ao caller | A maioria das instruções usa contas para saída |
| Arms de match de instrução nativa | Sem Anchor | Ergonomia do Context do Anchor |
0.32.1 em toda esta seção.
Não. Use constraints de seeds e assinatura em CPI.
No campo da struct de conta, definido na inicialização.
Use @solana/kit 7.0.0 com os mesmos bytes de seed.
O endereço declare_id do seu programa Anchor.
Não no array de seeds; bump é parâmetro separado em find_program_address.
Compare chaves logadas; verifique seeds e program id no client-side.
Sim quando mantêm dados; financie com payer no init.
Sim, com as mesmas signer seeds em cada CPI.
Veja os links em Relacionados para tópicos mais profundos sobre handlers.
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