Fundamentos de Rust para Solana
10 ejemplos para empezar con Rust en cadena (On-Chain): 7 básicos y 3 intermedios.
Busca en todas las páginas de la documentación
10 ejemplos para empezar con Rust en cadena (On-Chain): 7 básicos y 3 intermedios.
cargo y Solana CLI 3.0.10 (cargo build-sbf).solana-program (nativo) o Anchor 0.32.1.solana-test-validator para pruebas de integración.Cada programa en cadena expone un único entrypoint! que recibe cuentas y datos de instrucción.
use solana_program::{
account_info::AccountInfo, entrypoint, entrypoint::ProgramResult,
pubkey::Pubkey,
};
entrypoint!(process_instruction);
pub fn process_instruction(
_program_id: &Pubkey,
_accounts: &[AccountInfo],
_instruction_data: &[u8],
) -> ProgramResult {
Ok(())
}process_instruction para cada instrucción en una transacción.Ok(()) en caso de éxito; devuelve Err(ProgramError::...) para fallar la transacción.main: el cargador BPF/SBF invoca directamente tu punto de entrada.Relacionado: El Punto de Entrada y el Despacho - enrutamiento de instrucciones
no_stdLos crates en cadena compilan sin la biblioteca estándar.
#![no_std]
extern crate alloc;
use alloc::vec::Vec;#![no_std] deshabilita std; usa alloc para Vec, String y Box cuando sea necesario.solana_program.Relacionado: no_std y el Entorno del Programa - APIs disponibles
La mayoría de los diseños de cuentas usan Borsh para la codificación determinista de bytes.
use borsh::{BorshDeserialize, BorshSerialize};
#[derive(BorshSerialize, BorshDeserialize)]
pub struct Counter {
pub count: u64,
}
let mut data = account.try_borrow_mut_data()?;
counter.serialize(&mut &mut data[..])?;Relacionado: Serialización Borsh - guía completa
Los Pubkeys son identificadores de 32 bytes para cuentas y programas.
use solana_program::pubkey::Pubkey;
let key = Pubkey::new_from_array(account.key.to_bytes());
if *account.key != expected_owner {
return Err(ProgramError::IncorrectProgramId);
}Pubkey implementa Copy y compara en tiempo constante; úsalo para verificaciones de propietario.Los desbordamientos (overflow) provocan el pánico y abortan la transacción; usa matemáticas verificadas.
let new_balance = old_balance
.checked_add(amount)
.ok_or(ProgramError::InvalidArgument)?;checked_*.saturating_* es apropiado cuando limitar los valores es aceptable.+, - o * sin verificar.Relacionado: Aritmética Segura - patrones de desbordamiento
Falla rápidamente con errores tipados en lugar de entrar en pánico.
use solana_program::program_error::ProgramError;
if amount == 0 {
return Err(ProgramError::InvalidArgument);
}ProgramError son compactos y baratos en comparación con las cadenas personalizadas.thiserror o manualmente) se mapean a códigos u32 para los clientes.unwrap() o expect() en rutas de programas de producción.Relacionado: Manejo de Errores en Cadena - errores personalizados
Los datos de cuenta se acceden a través de préstamos al estilo RefCell.
let data = account.try_borrow_data()?;
if data.len() < Counter::LEN {
return Err(ProgramError::InvalidAccountData);
}try_borrow_data falla si la cuenta ya está prestada de forma mutable.data.len() coincida con el tamaño de tu struct antes de parsear.Las cuentas grandes pueden usar bytemuck para reinterpretar bytes sin copiar.
use bytemuck::{Pod, Zeroable};
#[repr(C)]
#[derive(Clone, Copy, Pod, Zeroable)]
pub struct Header {
pub discriminator: u64,
pub count: u64,
}
let header = bytemuck::from_bytes::<Header>(&data[..8]);Pod + Zeroable requieren #[repr(C)] y sin sorpresas de relleno.Relacionado: Zero-Copy con bytemuck - reglas de Pod
Usa msg! con moderación; los registros consumen unidades de cómputo.
solana_program::msg!("deposit: {} lamports", amount);Relacionado: Registro con msg! - registro consciente de CU
Limita las iteraciones y evita el crecimiento del heap en rutas críticas.
const MAX_ITEMS: usize = 32;
for (i, item) in items.iter().take(MAX_ITEMS).enumerate() {
process_item(i, item)?;
}push en cada instrucción.solana program show --programs y simulación de transacciones.Relacionado: Disciplina de Tamaño de Programa y CU - optimizació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: 16 jul 2026