El Punto de Entrada y Despacho
El punto de entrada es la única superficie RPC de tu programa. Dispatch analiza instruction_data, valida el contexto y enruta a los manejadores con semántica de error consistente.
Busca en todas las páginas de la documentación
El punto de entrada es la única superficie RPC de tu programa. Dispatch analiza instruction_data, valida el contexto y enruta a los manejadores con semántica de error consistente.
entrypoint!(process_instruction);
let ix = MyInstruction::try_from_slice(data)?;
match ix { /* ... */ }Cuándo usar esto:
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),
}
}Lo que esto demuestra:
InvalidInstructionData.program_id para la derivación de PDA.| Estilo | Pros |
|---|---|
| Enumeración Borsh | Idiomático, compacto |
| Byte de opcode manual | Estilo C, versionado explícito |
#[program] de Anchor | IDL + restricciones automáticas |
// Mantén los manejadores ligeros; delega las comprobaciones compartidas a los validadores.data.is_empty() cuando no existe una instrucción predeterminada.match extensos - Los manejadores grandes oscurecen el rastro de auditoría. Solución: Una función por instrucción.program_id - Los manejadores no pueden verificar PDAs. Solución: Pasar program_id a través de todas las rutas.unwrap sin verificar en slice - Pánicos por longitud incorrecta. Solución: Usar el mapeo de Result de deserialize.| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
| Despacho de Anchor | IDL + validación de cuentas | Binario mínimo |
| Punto de entrada Pinocchio | Menor sobrecarga | Ecosistema de macros |
| Tablas de opcodes | Programas estilo firmware | Enumeraciones simples |
No, uno por binario de programa.
Dentro de cada manejador después del análisis de la cabecera compartida.
Patrón común: el primer byte es la versión del esquema.
Publicar el crate de instrucciones para constructores de @solana/kit.
Serializar bytes de ix en pruebas de LiteSVM.
Borsh devuelve un error; mapearlo a InvalidInstructionData.
Documentar y usar un centinela o instrucciones separadas.
Limitado por el tamaño de la transacción (aprox. 1232 bytes).
Patrón avanzado para evitar el asignador en la entrada.
Nunca confíes en que la llamada de programa analice tus datos.
OK para desarrollo; evitar en la ruta crítica de producción.
Usar punteros a funciones solo si el tamaño del binario es crítico.
Versiones de la Pila: 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