pinocchio & steel
Pinocchio es un framework mínimo de Rust para programas nativos de Solana que enfatiza binarios pequeños y una baja sobrecarga de CU en Agave 4.1.1. Steel añade estructura (cuentas, instrucciones, registro) sobre los patrones estilo Pinocchio para equipos que desean convenciones sin la generación de código completa de Anchor 0.32.1. Ambos se dirigen a desarrolladores que optimizan más allá de los valores predeterminados de anchor-lang.
Receta
Tarjeta de receta de referencia rápida, lista para copiar y pegar.
[dependencies]
pinocchio = "0.8"
# steel = "4.0" # añadir cuando se usen los crates del framework Steeluse pinocchio::{
account_info::AccountInfo,
entrypoint,
program_error::ProgramError,
pubkey::Pubkey,
ProgramResult,
};
entrypoint!(process_instruction);
fn process_instruction(
_program_id: &Pubkey,
accounts: &[AccountInfo],
data: &[u8],
) -> ProgramResult {
if data.is_empty() {
return Err(ProgramError::InvalidInstructionData);
}
let _ = accounts;
Ok(())
}Cuándo recurrir a esto:
- Los presupuestos de CU y tamaño de binario son ajustados en instrucciones críticas.
- Rechazas la magia de macros de Anchor pero deseas patrones más seguros que
solana-programpuro. - Los modelos de registro de Steel encajan en tu diseño de programa multi-instrucción.
- Migrando rutas críticas de rendimiento desde Anchor con pruebas en LiteSVM 0.6.x.
Ejemplo de Trabajo
use pinocchio::{
account_info::AccountInfo,
entrypoint,
msg,
program_error::ProgramError,
pubkey::Pubkey,
ProgramResult,
};
entrypoint!(process_instruction);
enum MyInstruction {
Ping,
}
impl MyInstruction {
fn unpack(data: &[u8]) -> Result<Self, ProgramError> {
match data.first() {
Some(0) => Ok(MyInstruction::Ping),
_ => Err(ProgramError::InvalidInstructionData),
}
}
}
fn process_instruction(
_program_id: &Pubkey,
accounts: &[AccountInfo],
data: &[u8],
) -> ProgramResult {
match MyInstruction::unpack(data)? {
MyInstruction::Ping => {
let payer = accounts.get(0).ok_or(ProgramError::NotEnoughAccountKeys)?;
if !payer.is_signer() {
return Err(ProgramError::MissingRequiredSignature);
}
msg!("ping from {}", payer.key());
Ok(())
}
}
}Lo que esto demuestra:
- El enum de instrucción manual reemplaza los discriminadores de Anchor.
- Indexación explícita de cuentas con validación de firmante.
- Registro
msg!compatible con el análisis de logs RPC. - No se genera IDL; los clientes empaquetan bytes de instrucción coincidentes.
Inmersión Profunda
Cómo Funciona
- Pinocchio proporciona helpers de punto de entrada y accesores de cuenta ligeros.
- Steel añade registros de cuentas, manejadores tipados y utilidades de prueba.
- Ambos compilan con
cargo build-sbfcomo programas nativos. - Los clientes deben empaquetar manualmente o usar IDLs de Codama/Shank si publicas una por separado.
Tabla de Crates de Rust
| Crate | Rol | IDL |
|---|---|---|
pinocchio | Helpers mínimos de tiempo de ejecución del programa | Manual |
pinocchio-log | Registro eficiente | N/A |
steel | Estructura del framework sobre Pinocchio | Convenciones opcionales |
steel-cli | Andamiaje | N/A |
Tabla de TypeScript / NPM
| Paquete | Rol | Notas |
|---|---|---|
@solana/kit | Construcción de transacciones del cliente | 7.0.0 |
| Codama | Si publicas una IDL | Desde exportación de Shank/Anchor |
| Ix empaquetado a mano | Programas simples | Documenta el diseño de bytes en la documentación |
Notas de Rust
// Mide la CU antes/después de migrar desde Anchor
// existen helpers de cpi de pinocchio para programas comunes - consulta la documentación para ver la coberturaTrampas
- Sin restricciones de cuenta de Anchor - fácil pasar por alto las comprobaciones de propietario. Solución: lista de verificación por instrucción; pruebas LiteSVM.
- Diseño de instrucción no documentado - errores del cliente. Solución: publicar IDL o especificación estricta en el repositorio.
- Desajuste de versión de Steel con Pinocchio - fallos de compilación. Solución: seguir la tabla de compatibilidad de lanzamientos de Steel.
- Optimización excesiva prematura - entrega más lenta. Solución: perfilar Anchor primero; migrar solo las rutas críticas.
- Verbosidad de CPI de SPL - más código repetitivo que
anchor-spl. Solución: helpers internos delgados.
Alternativas
| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
anchor-lang 0.32.1 | IDL + velocidad | Límites de tamaño extremos |
solana-program puro | Control total | Necesita barreras de protección del framework |
solana-nostd-entrypoint | Punto de entrada diminuto | Quieres la ergonomía de Pinocchio |
| Computación fuera de la cadena | Lógica pesada | Debe ser confiable en la cadena |
Preguntas Frecuentes
¿Ahorro de CU de Anchor vs Pinocchio?
Dependiente de la instrucción - compara con simulate_transaction y LiteSVM.
¿Steel sin Pinocchio?
Steel está diseñado en torno a programas estilo Pinocchio - sigue la guía upstream.
¿Opciones de IDL?
Shank o JSON manual; alimenta Codama para clientes @solana/kit.
¿Pruebas?
LiteSVM 0.6.x y Mollusk son comunes; Bankrun para pruebas de integración TS.
¿Ruta de actualización desde Anchor?
Extrae instrucciones críticas incrementalmente; mantén clientes IDL durante la transición.
¿CPI de Token?
Usa los helpers de token de pinocchio o instrucciones spl-token puras.
¿Tamaño del binario?
Compara los tamaños ELF con solana program show después de desplegar.
¿Nivel de habilidad del equipo?
Más alto que Anchor - presupuesta tiempo de revisión para comprobaciones de seguridad.
¿Interoperabilidad con programas Anchor?
CPI funciona a nivel de programa - la elección del framework es por binario de programa.
¿Costo de registro?
Aún gasta CU - limita msg! con flags de características en compilaciones de producción si es necesario.
Relacionado
- Conceptos Básicos de Pinocchio - introducción al framework
- Framework Steel - guía de Steel
- Cuándo usar Programación Nativa - marco de decisión
- solana-program & solana-sdk - crates base
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.