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.
Busque em todas as páginas da documentação
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.
#![no_std]
extern crate alloc;
use solana_program::{
account_info::AccountInfo, entrypoint, program_error::ProgramError,
pubkey::Pubkey,
};Quando usar:
cargo build-sbf.alloc e layouts de conta de tamanho fixo.#![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] mais extern crate alloc é o layout padrão de programa nativo.AccountInfo fornecidas pelo runtime..so e invoca o símbolo registrado por entrypoint!.| 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 |
// Prefira &[u8] sobre Vec a menos que precise possuir bytes.
// solana_program re-exporta Pubkey, ProgramError e sysvars.std quebra cargo build-sbf. Correção: Fixe deps com cargo tree e prefira crates compatíveis com no_std.Vec::push em caminhos quentes aloca e custa CUs. Correção: Use tamanhos fixos de conta ou arrays na stack com limites conhecidos.unwrap em dados ruins do cliente aborta a transação inteira. Correção: Retorne ProgramError::InvalidAccountData.Vec sem extern crate alloc falha no link. Correção: Adicione extern crate alloc na raiz do crate.println! indisponível on-chain. Correção: Use msg! ou erros customizados com moderação.| 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 |
Não std. Use alloc (Vec, String) ou armazene dados em contas.
A instrução falha e nenhuma mudança de estado commita.
Use msg! - custa CUs e aparece nos logs de transação.
Não. Execução single-threaded por instrução.
Sem I/O além de dados de conta e syscalls.
Habilita alocação em heap pelo allocator do programa.
Solana Bytecode Format - target on-chain (sucessor de BPF).
Use #[cfg(test)] no host com solana-program-test ou LiteSVM 0.6.x.
Sem runtime async on-chain.
Clock, Rent, Instructions - leia via módulos sysvar.
Mantenha uso de stack pequeno; estado grande pertence a contas.
Aloca pesadamente - evite em caminhos de produção.
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.
Revisado por Chris St. John·Última atualização: 19 de jul. de 2026