Estruturas Borsh
As estruturas Borsh são a base para os corpos de contas do Solana. Projete-as para ter ordem de campos estável, dimensionamento explícito e versionamento compatível com versões futuras.
Receita
#[derive(BorshSerialize, BorshDeserialize)]
pub struct User { pub authority: Pubkey, pub points: u64 }Quando usar isso:
- Definindo novos tipos de conta.
- Calculando espaço de aluguel.
- Planejando atualizações de esquema.
Exemplo de Trabalho
#[derive(BorshSerialize, BorshDeserialize)]
pub struct User {
pub authority: Pubkey,
pub points: u64,
pub bump: u8,
}
impl User {
pub const LEN: usize = 32 + 8 + 1;
}O que isso demonstra:
- A ordem dos campos é a ordem de serialização.
LENcorresponde à soma dos campos.bumparmazenado para assinatura de PDA.
Análise Detalhada
Dimensionamento
Pubkey 32 + u64 8 + u8 1 = 41 bytes de corpo.
Versionamento
Anexe campos; migre contas antigas.
Notas de Rust
// Option<Pubkey>: 1 + 32 bytesArmadilhas
- Reordenar campos - Quebra todas as contas. Correção: Apenas anexe novos campos.
- String sem limite máximo - Aluguel ilimitado. Correção: Limite o comprimento ou use um array fixo.
- Enum na conta - Mudanças de variante são arriscadas. Correção: Prefira tag
u8+ struct. LENincorreto - Falhas em tempo de execução. Correção: Teste olende serialização.- Falta de consciência de preenchimento - Raro em Borsh - diferente de layouts C. Correção: Borsh é empacotado sequencialmente.
Alternativas
| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
Cabeçalho bytemuck + cauda Borsh | Híbrido | Puro zero-copy |
| Múltiplas contas pequenas | Menos realloc | Mais aluguel total |
| Compressão de conta | Fora da cadeia | Bytes brutos na cadeia |
FAQs
Pubkey na struct?
32 bytes Borsh.
Tamanho de `Vec`?
4 bytes de comprimento + elementos - aluguel variável.
Tamanho de `bool`?
1 byte.
i64?
8 bytes LE.
Struct aninhada?
Suportado - soma os tamanhos.
Trait `Default`?
Ajuda a inicializar no host.
Conta MAX?
10 MB teóricos.
Anchor `InitSpace`?
Deriva a macro space.
Hash do esquema?
Documentar em atualizações.
Flatten?
Nível único preferido para clareza.
`align`?
Borsh ignora o align do Rust.
Fuzz `deserialize`?
Recomendado.
Relacionado
- Serialização Borsh - Formato
- Cálculo de Espaço - Aluguel
- Versionamento e Migração de Dados - Atualizações
Versões da Pilha: 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.