O Entrypoint e o Dispatch
O entrypoint é a única superfície RPC do seu programa. O dispatch faz parsing de instruction_data, valida o contexto e roteia para handlers com semântica de erro consistente.
Busque em todas as páginas da documentação
O entrypoint é a única superfície RPC do seu programa. O dispatch faz parsing de instruction_data, valida o contexto e roteia para handlers com semântica de erro consistente.
entrypoint!(process_instruction);
let ix = MyInstruction::try_from_slice(data)?;
match ix { /* ... */ }Quando usar:
use borsh::BorshDeserialize;
use solana_program::{account_info::AccountInfo, entrypoint, entrypoint::ProgramResult, pubkey::Pubkey};
entrypoint!(process_instruction);
#[derive(BorshDeserialize)]
pub enum MyInstruction { Init, Increment }
pub fn process_instruction(program_id: &Pubkey, accounts: &[AccountInfo], data: &[u8]) -> ProgramResult {
if data.is_empty() { return Err(ProgramError::InvalidInstructionData); }
let ix = MyInstruction::deserialize(&mut &data[..]).map_err(|_| ProgramError::InvalidInstructionData)?;
match ix {
MyInstruction::Init => init(program_id, accounts),
MyInstruction::Increment => increment(program_id, accounts),
}
}O que isso demonstra:
InvalidInstructionData.program_id para derivação de PDA.| Estilo | Prós |
|---|---|
| Enum Borsh | Idiomático, compacto |
| Byte opcode manual | Estilo C, versionamento explícito |
Anchor #[program] | IDL + constraints automáticos |
// Mantenha handlers finos; empurre checks compartilhados para validators.data.is_empty() quando não existir instruction padrão.program_id ausente - Handlers não podem verificar PDAs. Correção: Passe program_id por todos os caminhos.deserialize.| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
| Dispatch Anchor | IDL + validação de conta | Binário mínimo |
| Entrypoint Pinocchio | Menor overhead | Ecossistema de macros |
| Tabelas de opcode | Programas estilo firmware | Enums simples |
Não - um por binário de programa.
Dentro de cada handler após parse do cabeçalho compartilhado.
Padrão comum: primeiro byte é versão do schema.
Publique crate de instruction para builders @solana/kit.
Serialize bytes de ix em testes LiteSVM.
Borsh retorna erro - mapeie para InvalidInstructionData.
Documente e use sentinel ou instructions separadas.
Limitado pelo tamanho da transação (~1232 bytes).
Padrão avançado para evitar allocator no entry.
Nunca confie no callee para fazer parse dos seus dados.
OK para dev; evite em hot path de produção.
Use fn pointers apenas se ganho de tamanho de binário importar.
Versões do 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