Contas Zero-Copy
Contas zero-copy usam layout bytemuck e AccountLoader para evitar serializar/desserializar Borsh em structs grandes, economizando CU para estados grandes.
Receita
#[account(zero_copy)]
pub struct Market {
pub bids: [u64; 1024],
}
#[derive(Accounts)]
pub struct Update<'info> {
#[account(mut)]
pub market: AccountLoader<'info, Market>,
}Quando usar isso: Os dados da conta são grandes (livros de ofertas, arrays de ticks) e o custo de Borsh em CU é muito alto.
Exemplo de Trabalho
use anchor_lang::prelude::*;
#[account(zero_copy)]
#[repr(C)]
pub struct LargeState {
pub head: u64,
pub data: [u8; 10_000],
}
pub fn touch(ctx: Context<Touch>) -> Result<()> {
let mut market = ctx.accounts.state.load_mut()?;
market.head += 1;
Ok(())
}
#[derive(Accounts)]
pub struct Touch<'info> {
#[account(mut)]
pub state: AccountLoader<'info, LargeState>,
}O que isso demonstra:
zero_copyrequer layoutrepr(C)AccountLoader::load_mutpara mutação- Sem
INIT_SPACEpara dimensionamento Borsh da mesma forma - O discriminador ainda se aplica
Mergulho Profundo
Disciplina de Layout
- Apenas arrays de tamanho fixo, a menos que se use gerenciamento manual cuidadoso.
- O alinhamento é importante; siga as regras do
bytemuck. - Migrações são mais difíceis do que contas Borsh.
Vitória em CU
Evita a cópia completa da conta (memcpy) em cada instrução.
Armadilhas
- Campos desalinhados - Comportamento indefinido. Correção: Use
repr(C)ebytemuck Pod. - Misturar Borsh e
zero_copy- Tipo de carregador errado. Correção: Escolha um por conta. Vecdinâmico emzero_copy- Não suportado nativamente. Correção: Buffers fixos ou conta Borsh.- Esqueceu
mutna conta do carregador - Não é possível persistir. Correção: Marque a conta comomut. - Atualizar layout sem migração - Corrompe a conta. Correção: Versionar e migrar.
Alternativas
| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
Borsh Account<T> | Configurações pequenas | Grandes buffers fixos |
| Compressão de conta off-chain | Sem livro de ofertas on-chain | Livro de ofertas on-chain |
FAQs
Versão do Anchor?
0.32.1 em tópicos avançados.
Quando usar `zero_copy`?
Layouts fixos grandes quando o custo de CU do Borsh é muito alto.
Realloc é reversível?
Não facilmente; planeje o crescimento futuro.
As contas restantes estão no IDL?
Não; documente separadamente.
`declare_program!` precisa de quê?
IDL JSON do chamador em tempo de compilação.
O Anchor pode fazer CPI para Pinocchio?
Sim, com metadados de conta corretos.
Flags de recursos e IDL?
Evite IDLs diferentes por recurso no mainnet.
Como medir CU?
LiteSVM, Surfpool, simulação em devnet.
Tipos de conta personalizados são comuns?
Não; último recurso.
Próximos passos?
Veja os links relacionados para zero copy.
Relacionado
- Contas Zero-Copy - visão de serialização
- Otimização de CU e Tamanho - CU
- Tipos de Conta Personalizados - traits
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.