Conceptos básicos de Pinocchio
10 ejemplos para empezar con Pinocchio: 7 básicos y 3 intermedios.
Prerrequisitos
- Conceptos de programas nativos de Conceptos básicos de programas nativos.
- Rust 1.91.1 y Solana CLI 3.0.10.
Ejemplos básicos
1. Añadir dependencia de pinocchio
Pinocchio reemplaza la entrada de solana-program para una sobrecarga mínima.
[dependencies]
pinocchio = "0.8"- Consulta las notas de la versión de pinocchio para la compatibilidad con Agave.
- Árbol de dependencias más pequeño que el de Anchor completo.
- Sigue siendo
#![no_std]en la cadena.
2. Macro de punto de entrada
Pinocchio proporciona la conexión del punto de entrada.
use pinocchio::{account_info::AccountInfo, entrypoint, pubkey::Pubkey, ProgramResult};
entrypoint!(process_instruction);- Modelo mental similar a
solana-program. - Ruta de invocación con menor sobrecarga.
- Un punto de entrada por crate.
3. Acceso a AccountInfo
Leer las banderas de firmante y escritura.
if !account.is_signer() { return Err(ProgramError::MissingRequiredSignature); }- La API refleja las comprobaciones nativas.
- Aún validas todo manualmente.
- Sin restricciones automáticas.
4. No std alloc
Patrones opcionales de asignador.
#![no_std]
extern crate alloc;- Las mismas reglas de
allocque las nativas. - Minimiza el uso del heap.
- Prefiere el almacenamiento de cuentas.
5. Tipo Pubkey
Los tipos Pubkey de Pinocchio se alinean con los bytes del SDK.
let key = account.key();- Claves de 32 bytes.
- Compara para comprobaciones de propietario.
- Derivación de PDA fuera de la cadena o mediante ayudantes de syscall.
6. Retornos de error
El patrón ProgramResult no cambia.
return Err(ProgramError::InvalidArgument);- Los errores personalizados se mapean a
u32. - Sin macro de error de Anchor.
- Documenta los códigos para los clientes.
7. CPI con pinocchio
Invoca ayudantes con semántica similar.
pinocchio::program::invoke(&ix, &accounts)?;invoke_signedpara PDAs.- El orden de los metadatos de la cuenta sigue definido por el llamado.
- Consulta la página de creación de programas.
Ejemplos intermedios
8. Análisis de instrucciones
Despacho manual o con Borsh.
let (tag, rest) = data.split_at(1);
match tag[0] { 0 => init(rest), 1 => swap(rest), _ => Err(...) }- El estilo de opcode ahorra bytes.
- Borsh sigue siendo válido para cargas útiles complejas.
- Mantén el analizador estricto.
Relacionado: Creación de un programa con Pinocchio
9. Estilo consciente de las UC
Evita fmt y logs en rutas críticas.
// no msg in loop- Las ventajas de Pinocchio se erosionan con el registro.
- Perfila con Surfpool.
- Compara con la línea base de Anchor.
Relacionado: Ventajas de UC y tamaño binario
10. Pruebas
LiteSVM 0.6.x ejecuta binarios de pinocchio.
// deploy .so in test fixture- Los mismos patrones de integración que los nativos.
- Métricas de UC de instantánea.
- Fuzz el analizador de instrucciones.
Relacionado: LiteSVM
Versiones de la pila: Esta página se escribió 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.