Construyendo un Programa con Pinocchio
Un programa Pinocchio combina un punto de entrada delgado, validación estricta de cuentas, despacho por Borsh u opcode, y ayudantes de CPI, reflejando la estructura nativa con menos sobrecarga de boilerplate.
Receta
entrypoint!(process_instruction);
fn process_instruction(id: &Pubkey, accounts: &[AccountInfo], data: &[u8]) -> ProgramResult {
match data.first() { Some(0) => init(id, accounts), _ => Err(ProgramError::InvalidInstructionData) }
}Cuándo usar esto:
- Programa sensible al rendimiento "greenfield".
- Reescribiendo una instrucción de Anchor.
- Aprendiendo patrones de frameworks ligeros.
Ejemplo de Trabajo
pub fn init(program_id: &Pubkey, accounts: &[AccountInfo]) -> ProgramResult {
let [payer, state, system @ ..] = accounts else { return Err(ProgramError::NotEnoughAccountKeys) };
if !payer.is_signer() { return Err(ProgramError::MissingRequiredSignature); }
// CPI create vía pinocchio invoke / system instructions
Ok(())
}Lo que esto demuestra:
- Desestructuración fija de slices de cuentas.
- Verificación del firmante primero.
- El CPI del sistema para crear sigue a la validación.
Análisis Profundo
Diseño del Módulo
- entry.rs / lib.rs
- instructions/
- state.rs
- cpi.rs
IDL
Generar con Codama para clientes @solana/kit 7.0.0.
Notas de Rust
// Centralizar ayudantes de validación de cuentas.Errores Comunes
- Omitir validación - Peor que Anchor - sin protecciones. Solución: Copiar listas de verificación nativas.
- Sin IDL publicado - Los clientes se rompen. Solución: Pipeline de Codama.
- Tipos mixtos de pinocchio/solana-program - Confusión FFI. Solución: Elegir una superficie de SDK por crate.
- Ampliación de funcionalidades - Re-añadir macros tipo Anchor. Solución: Mantener la disciplina.
- Sin pruebas - Regresiones de CU no detectadas. Solución: CI de LiteSVM.
Alternativas
| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
| Proyecto nuevo de Anchor | Velocidad | CU |
| Framework Steel | Más azúcar sintáctico | Ligeramente más pesado |
| Repositorios de plantillas | Arranque rápido | Mantenimiento |
Preguntas Frecuentes
¿Pinocchio + Anchor en el repositorio?
Programas separados a través de CPI.
¿Entrypoint con asignación de memoria (alloc)?
Configurar según la documentación.
¿CPI de Token?
Mismos ayudantes de spl.
¿Firmar PDA?
Equivalente a invoke_signed.
¿Comando de compilación?
cargo build-sbf.
¿Verificar?
solana-verify.
¿Desplegar?
solana program deploy.
¿Actualizar?
Mismo cargador que nativo.
¿Errores?
Códigos u32 personalizados.
¿Logs?
Syscall log mínimo.
¿Surfpool?
Prueba de despliegue local.
¿Agave 4.1.1?
Toolchain de Pin.
Relacionado
- Conceptos Básicos de Pinocchio - Introducción
- Conceptos Básicos de Programas Nativos - Conceptos paralelos
- Interoperabilidad y Migración - Mover stacks
Versiones de Stack: 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.