Noções Básicas de Rust para Solana
10 exemplos para você começar com Rust On-Chain - 7 básicos e 3 intermediários.
Busque em todas as páginas da documentação
10 exemplos para você começar com Rust On-Chain - 7 básicos e 3 intermediários.
cargo e toolchain Solana CLI 3.0.10 (cargo build-sbf).solana-program (nativo) ou Anchor 0.32.1.solana-test-validator para testes de integração.Todo programa on-chain expõe um único entrypoint! que recebe contas e dados de instrução.
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 instrução em uma transação.Ok(()) em sucesso; retorne Err(ProgramError::...) para falhar a transação.main - o loader BPF/SBF invoca seu entrypoint diretamente.Relacionado: The Entrypoint & Dispatch - roteamento de instruções
Crates on-chain compilam sem a biblioteca padrão.
#![no_std]
extern crate alloc;
use alloc::vec::Vec;#![no_std] desabilita std; use alloc para Vec, String e Box quando necessário.solana_program.Relacionado: no_std & the Program Environment - APIs disponíveis
A maioria dos layouts de conta usa Borsh para codificação de bytes determinística.
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: Borsh Serialization - guia completo
Pubkeys são identificadores de 32 bytes para contas e 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 e compara em tempo constante - use para checagens de owner.Overflow em panic aborta a transação - use math verificada.
let new_balance = old_balance
.checked_add(amount)
.ok_or(ProgramError::InvalidArgument)?;checked_*.saturating_* é apropriado quando limitar valores é aceitável.+, - ou * sem verificação.Relacionado: Safe Arithmetic - padrões de overflow
Falhe rápido com erros tipados em vez de panic.
use solana_program::program_error::ProgramError;
if amount == 0 {
return Err(ProgramError::InvalidArgument);
}ProgramError são compactos e baratos comparados a strings customizadas.thiserror ou manual) mapeiam para códigos u32 para clientes.unwrap() ou expect() em caminhos de produção do programa.Relacionado: Error Handling On-Chain - erros customizados
Dados de conta são acessados por borrows estilo RefCell.
let data = account.try_borrow_data()?;
if data.len() < Counter::LEN {
return Err(ProgramError::InvalidAccountData);
}try_borrow_data falha se a conta já estiver em borrow mutável.data.len() corresponde ao tamanho da struct antes de parsear.Contas grandes podem usar bytemuck para reinterpretar bytes sem 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 exigem #[repr(C)] e sem surpresas de padding.Relacionado: Zero-Copy with bytemuck - regras Pod
Use msg! com moderação; logs custam compute units.
solana_program::msg!("deposit: {} lamports", amount);Relacionado: Logging with msg! - logging consciente de CU
Limite iterações e evite crescimento de heap em caminhos quentes.
const MAX_ITEMS: usize = 32;
for (i, item) in items.iter().take(MAX_ITEMS).enumerate() {
process_item(i, item)?;
}solana program show --programs e simulação de transação.Relacionado: Program Size & CU Discipline - otimizaçã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: 16 de jul. de 2026