pinocchio & steel
Pinocchio é um framework Rust minimalista para programas Solana nativos, com ênfase em binários pequenos e baixo overhead de CU no Agave 4.1.1. Steel adiciona estrutura (contas, instruções, registro) sobre os padrões do Pinocchio para equipes que desejam convenções sem a geração completa de código do Anchor 0.32.1. Ambos visam desenvolvedores que otimizam além dos padrões do anchor-lang.
Receita
Cartão de receita de referência rápida - pronto para copiar e colar.
[dependencies]
pinocchio = "0.8"
# steel = "4.0" # adicione ao usar crates do 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(())
}Quando usar isso:
- Orçamentos de CU e tamanho de binário são apertados em instruções críticas.
- Você recusa a mágica de macros do Anchor, mas deseja padrões mais seguros do que
solana-programpuro. - Modelos de registro do Steel se encaixam no layout do seu programa multi-instrução.
- Migrando caminhos de desempenho críticos do Anchor com testes no LiteSVM 0.6.x.
Exemplo de Trabalho
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(())
}
}
}O que isso demonstra:
- Enumeração manual de instruções substitui os discriminadores do Anchor.
- Indexação explícita de contas com validação de signatário.
- Log
msg!compatível com análise de logs RPC. - Nenhuma IDL gerada - clientes empacotam bytes de instrução correspondentes.
Mergulho Profundo
Como Funciona
- Pinocchio fornece helpers de entrypoint e acessadores de conta leves.
- Steel adiciona registros de conta, manipuladores tipados e utilitários de teste.
- Ambos compilam com
cargo build-sbfcomo programas nativos. - Clientes devem empacotar manualmente ou usar IDLs Codama/Shank se você publicar uma separadamente.
Tabela de Crates Rust
| Crate | Papel | IDL |
|---|---|---|
pinocchio | Helpers mínimos de runtime de programa | Manual |
pinocchio-log | Logging eficiente | N/A |
steel | Estrutura do framework sobre Pinocchio | Convenções opcionais |
steel-cli | Scaffolding | N/A |
Tabela TypeScript / NPM
| Pacote | Papel | Notas |
|---|---|---|
@solana/kit | Construção de tx do cliente | 7.0.0 |
| Codama | Se você publicar uma IDL | De exportação Shank/Anchor |
| ix empacotado manualmente | Programas simples | Documente o layout de bytes na documentação |
Notas Rust
// Meça a CU antes/depois de migrar do Anchor
// helpers cpi do pinocchio existem para programas comuns - verifique a documentação para coberturaArmadilhas
- Sem restrições de conta Anchor - fácil de perder verificações de proprietário. Correção: checklist por instrução; testes LiteSVM.
- Layout da instrução não documentado - bugs do cliente. Correção: publique IDL ou especificação rigorosa no repositório.
- Descompasso de versão do Steel com Pinocchio - falhas de compilação. Correção: siga a tabela de compatibilidade de lançamento do Steel.
- Otimização excessiva prematura - entrega mais lenta. Correção: perfil do Anchor primeiro; migre apenas os caminhos críticos.
- Verbosidade do CPI SPL - mais boilerplate do que
anchor-spl. Correção: helpers internos finos.
Alternativas
| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
anchor-lang 0.32.1 | IDL + velocidade | Limites extremos de tamanho |
solana-program puro | Controle total | Precisa de guardrails de framework |
solana-nostd-entrypoint | Entrypoint minúsculo | Quer a ergonomia do Pinocchio |
| Computação off-chain | Lógica pesada | Deve ser confiável on-chain |
FAQs
Economia de CU Anchor vs Pinocchio?
Dependente da instrução - compare com simulate_transaction e LiteSVM.
Steel sem Pinocchio?
Steel é projetado em torno de programas estilo Pinocchio - siga as orientações upstream.
Opções de IDL?
Shank ou JSON manual; alimente Codama para clientes @solana/kit.
Testes?
LiteSVM 0.6.x e Mollusk são comuns; Bankrun para testes de integração TS.
Caminho de atualização do Anchor?
Extraia instruções críticas incrementalmente; mantenha clientes IDL durante a transição.
CPI de Token?
Use helpers de token pinocchio ou instruções spl-token brutas.
Tamanho do binário?
Compare os tamanhos ELF com solana program show após a implantação.
Nível de habilidade da equipe?
Mais alto que Anchor - reserve tempo para revisões de segurança.
Interoperabilidade com programas Anchor?
CPI funciona no nível do programa - a escolha do framework é por binário de programa.
Custo de logging?
Ainda gasta CU - limite msg! com flags de feature em builds de produção, se necessário.
Relacionado
- Noções Básicas do Pinocchio - introdução ao framework
- Framework Steel - guia do Steel
- Quando Usar Nativo - enquadramento de decisão
- solana-program & solana-sdk - crates base
Versões da 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.