Serialização Borsh
Borsh (Binary Object Representation Serializer for Hashing) é a codificação canônica para dados de instrução Solana e a maioria das structs de conta. É determinístico, little-endian e com prefixo de comprimento para coleções.
Busque em todas as páginas da documentação
Borsh (Binary Object Representation Serializer for Hashing) é a codificação canônica para dados de instrução Solana e a maioria das structs de conta. É determinístico, little-endian e com prefixo de comprimento para coleções.
use borsh::{BorshDeserialize, BorshSerialize};
#[derive(BorshSerialize, BorshDeserialize)]
pub struct Deposit {
pub amount: u64,
}
let ix_data = Deposit { amount: 1_000 }.try_to_vec()?;Quando usar:
use borsh::{BorshDeserialize, BorshSerialize};
use solana_program::{
account_info::{next_account_info, AccountInfo},
entrypoint::ProgramResult,
program_error::ProgramError,
pubkey::Pubkey,
};
#[derive(BorshSerialize, BorshDeserialize)]
pub enum VaultInstruction {
Deposit { amount: u64 },
Withdraw { amount: u64 },
}
#[derive(BorshSerialize, BorshDeserialize)]
pub struct VaultState {
pub total: u64,
}
pub const VAULT_LEN: usize = 8;
pub fn process_deposit(
accounts: &[AccountInfo],
amount: u64,
) -> ProgramResult {
let iter = &mut accounts.iter();
let vault = next_account_info(iter)?;
let mut state = VaultState::deserialize(&mut &vault.data.borrow()[..])
.map_err(|_| ProgramError::InvalidAccountData)?;
state.total = state
.total
.checked_add(amount)
.ok_or(ProgramError::InvalidArgument)?;
state.serialize(&mut &mut vault.data.borrow_mut()[..])?;
Ok(())
}O que isso demonstra:
u8 inicial por padrão.String e Vec<T> prefixam com comprimento u32.| Campo | Bytes |
|---|---|
u64 | 8 |
Pubkey | 32 |
bool | 1 |
String | 4 + utf8 len |
// Use try_to_vec para dados de instrução; verifique account.data.len() >= size.
const STATE_LEN: usize = core::mem::size_of::<u64>();data.len() for insuficiente. Correção: Aloque espaço exato na criação da conta e armazene constante LEN.borrow_mut.| Alternativa | Use quando | Não use quando |
|---|---|---|
| bytemuck / zero-copy | Structs fixas grandes | Strings ou vectors variáveis |
Anchor Account<T> | Checagens automáticas de layout | Controle raw ou CU mínimo |
| Empacotamento manual de bytes | Layouts ultra-apertados | Manutenibilidade |
Anchor 0.32.1 usa Borsh para dados de conta por padrão.
Little-endian para primitivos.
Tag de 1 byte (0/1) mais valor interno quando Some.
Deserializer para no fim da struct; valide comprimento total por segurança.
Cap de 10 MB por conta - ainda paga aluguel e CUs.
Serialize struct default no host ou use constante space.
Permitido mas aumenta aluguel; prefira arrays de capacidade fixa para games/order books.
32 bytes raw - igual no wire.
Borsh é canônico para Solana; bincode não é estável cross-language aqui.
Sempre verifique owner, discriminador e comprimento primeiro.
Suportado - 16 bytes little-endian.
Use try_to_vec depois deserialize em testes unitários no host.
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