no_std y el Entorno del Programa
Los programas de Solana compilan a SBF y se ejecutan en un entorno aislado sin std. Tienes las llamadas al sistema solana_program, alloc opcional y un presupuesto estricto de CUs.
Busca en todas las páginas de la documentación
Los programas de Solana compilan a SBF y se ejecutan en un entorno aislado sin std. Tienes las llamadas al sistema solana_program, alloc opcional y un presupuesto estricto de CUs.
#![no_std]
extern crate alloc;
use solana_program::{
account_info::AccountInfo, entrypoint, program_error::ProgramError,
pubkey::Pubkey,
};Cuándo recurrir a esto:
cargo build-sbf.alloc y diseños de cuentas de tamaño fijo.#![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(())
}Lo que esto demuestra:
#![no_std] junto con extern crate alloc es la disposición predeterminada del programa nativo.AccountInfo proporcionadas por el runtime..so e invoca el símbolo registrado por entrypoint!.panic abortan la instrucción; no hay desenrollado (unwinding) a través del límite del host.| Capa | Ejemplos | Notas |
|---|---|---|
| Núcleo | solana_program | Cuentas, CPI, sysvars, errores |
| Serialización | borsh, bytemuck | Diseños de instrucciones y cuentas |
| Matemáticas | num-traits, operaciones verificadas | Evita las matemáticas de std |
| Evitar | std, tokio, reqwest | No compilará para SBF |
// Prefiere &[u8] sobre Vec a menos que necesites poseer los bytes.
// solana_program reexporta Pubkey, ProgramError y sysvars.std rompe cargo build-sbf. Solución: Fija las dependencias con cargo tree y prefiere crates compatibles con no_std.Vec::push en rutas críticas asigna y cuesta CUs. Solución: Usa tamaños de cuenta fijos o arrays en la pila con límites conocidos.unwrap en datos incorrectos del cliente aborta toda la transacción. Solución: Devuelve ProgramError::InvalidAccountData en su lugar.Vec sin extern crate alloc falla al enlazar. Solución: Añade extern crate alloc en la raíz del crate.println! no está disponible en la cadena. Solución: Usa msg! o errores personalizados con moderación.| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
| Anchor 0.32.1 | Iteración más rápida con macros de cuenta | Máxima eficiencia de CU/binario |
| Pinocchio | Puntos de entrada sin dependencias | Necesitas la ergonomía de Anchor |
| Solo bytemuck | Diseños fijos grandes | Cadenas de longitud variable |
No std. Usa alloc (Vec, String) o almacena datos en cuentas.
La instrucción falla y no se confirman cambios de estado.
Usa msg! - cuesta CUs y aparece en los registros de transacciones.
No. Ejecución de un solo hilo por instrucción.
No hay E/S más allá de los datos de la cuenta y las llamadas al sistema.
Habilita la asignación de memoria dinámica a través del asignador del programa.
Solana Bytecode Format - el objetivo en cadena (sucesor de BPF).
Usa #[cfg(test)] en el host con solana-program-test o LiteSVM 0.6.x.
No hay runtime asíncrono en cadena.
Clock, Rent, Instructions - se leen a través de los módulos sysvar.
Mantén el uso de la pila pequeño; el estado grande pertenece a las cuentas.
Asigna mucha memoria; evítalo en rutas de producción.
Versiones de la pila: 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.
Revisado por Chris St. John·Última actualización: 19 jul 2026