no_std e o Ambiente de Programa
Programas Solana compilam para SBF e executam em sandbox sem std. Você obtém syscalls solana_program, alloc opcional e orçamento estrito de CU.
Receita
#![no_std]
extern crate alloc;
use solana_program::{
account_info::AccountInfo, entrypoint, program_error::ProgramError,
pubkey::Pubkey,
};Quando usar:
- Iniciar qualquer crate de programa nativo (não-Anchor).
- Auditar por que uma dependência falha em
cargo build-sbf. - Escolher entre coleções
alloce layouts de conta de tamanho fixo.
Exemplo Funcional
#![no_std]
extern crate alloc;
use alloc::vec::Vec;
use solana_program::{
account_info::AccountInfo, entrypoint, entrypoint::ProgramResult,
program_error::ProgramError, pubkey::Pubkey,
};
entrypoint!(process_instruction);
pub fn process_instruction(
_program_id: &Pubkey,
accounts: &[AccountInfo],
instruction_data: &[u8],
) -> ProgramResult {
if instruction_data.is_empty() {
return Err(ProgramError::InvalidInstructionData);
}
let _owner = accounts.get(0).ok_or(ProgramError::NotEnoughAccountKeys)?;
let buf: Vec<u8> = instruction_data.to_vec();
solana_program::msg!("bytes: {}", buf.len());
Ok(())
}O que isso demonstra:
#![no_std]maisextern crate allocé o layout padrão de programa nativo.- Dados de instrução chegam como slice de bytes - copie só quando mutação for necessária.
- Acesso a conta passa por referências
AccountInfofornecidas pelo runtime.
Aprofundamento
Como Funciona
- Runtime Agave 4.1.1 carrega seu
.soe invoca o símbolo registrado porentrypoint!. - Syscalls (logging, CPI, borrow de conta) são a única forma de interagir com estado da chain.
- Panics abortam a instrução; não há unwinding através da fronteira do host.
Crates Disponíveis
| Camada | Exemplos | Notas |
|---|---|---|
| Core | solana_program | Contas, CPI, sysvars, erros |
| Serialize | borsh, bytemuck | Layouts de instrução e conta |
| Math | num-traits, ops verificados | Evite math std |
| Evite | std, tokio, reqwest | Não compila para SBF |
Notas Rust
// Prefira &[u8] sobre Vec a menos que precise possuir bytes.
// solana_program re-exporta Pubkey, ProgramError e sysvars.Armadilhas
- Importar std - Crate que puxa
stdquebracargo build-sbf. Correção: Fixe deps comcargo treee prefira crates compatíveis comno_std. - Churn de heap -
Vec::pushem caminhos quentes aloca e custa CUs. Correção: Use tamanhos fixos de conta ou arrays na stack com limites conhecidos. - Panic no parse -
unwrapem dados ruins do cliente aborta a transação inteira. Correção: RetorneProgramError::InvalidAccountData. - alloc ausente - Usar
Vecsemextern crate allocfalha no link. Correção: Adicioneextern crate allocna raiz do crate. - Debug prints -
println!indisponível on-chain. Correção: Usemsg!ou erros customizados com moderação.
Alternativas
| Alternativa | Use quando | Não use quando |
|---|---|---|
| Anchor 0.32.1 | Iteração mais rápida com macros de conta | Máxima eficiência CU/binário |
| Pinocchio | Entrypoints zero-dependency | Precisa ergonomia Anchor |
| Só bytemuck | Layouts fixos grandes | Strings de comprimento variável |
FAQs
Posso usar coleções std on-chain?
Não std. Use alloc (Vec, String) ou armazene dados em contas.
O que acontece em panic?
A instrução falha e nenhuma mudança de estado commita.
Como imprimir debug?
Use msg! - custa CUs e aparece nos logs de transação.
Threading disponível?
Não. Execução single-threaded por instrução.
Programas leem filesystem?
Sem I/O além de dados de conta e syscalls.
Por que `extern crate alloc`?
Habilita alocação em heap pelo allocator do programa.
O que é SBF?
Solana Bytecode Format - target on-chain (sucessor de BPF).
Como testar código no_std?
Use #[cfg(test)] no host com solana-program-test ou LiteSVM 0.6.x.
Posso usar async/await?
Sem runtime async on-chain.
Quais sysvars existem?
Clock, Rent, Instructions - leia via módulos sysvar.
Quão grande pode ser a stack?
Mantenha uso de stack pequeno; estado grande pertence a contas.
`format!` funciona?
Aloca pesadamente - evite em caminhos de produção.
Relacionado
- Rust for Solana Basics - Orientação da seção
- Borsh Serialization - Codificação de dados
- Program Size & CU Discipline - Performance
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.