Cuentas Zero-Copy
Las cuentas Zero-copy utilizan el diseño de bytemuck y AccountLoader para evitar la serialización/deserialización de Borsh en structs grandes, ahorrando CU para estados grandes.
Receta
#[account(zero_copy)]
pub struct Market {
pub bids: [u64; 1024],
}
#[derive(Accounts)]
pub struct Update<'info> {
#[account(mut)]
pub market: AccountLoader<'info, Market>,
}Cuándo usar esto: Los datos de la cuenta son grandes (libros de órdenes, arrays de ticks) y Borsh cuesta demasiada CU.
Ejemplo de Trabajo
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>,
}Lo que esto demuestra:
zero_copyrequiere el diseñorepr(C)AccountLoader::load_mutpara mutación- No se necesita
INIT_SPACEpara dimensionar Borsh de la misma manera - El discriminador todavía se aplica
Análisis Profundo
Disciplina de Diseño
- Solo arrays de tamaño fijo a menos que se utilice una gestión manual cuidadosa.
- La alineación importa; sigue las reglas de
bytemuck. - Las migraciones son más difíciles que las cuentas Borsh.
Ganancia de CU
Evita la copia completa de la cuenta en cada instrucción.
Trampas Comunes
- Campos desalineados - Comportamiento indefinido. Solución: Usa
repr(C)ybytemuck Pod. - Mezclar Borsh y zero_copy - Tipo de cargador incorrecto. Solución: Elige uno por cuenta.
Vecdinámico en zero_copy - No soportado de forma nativa. Solución: Buffers fijos o cuenta Borsh.- Olvidar
muten la cuenta del cargador - No se puede persistir. Solución: Marca la cuenta comomut. - Actualizar el diseño sin migración - Corrompe la cuenta. Solución: Versiona y migra.
Alternativas
| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
Borsh Account<T> | Configuraciones pequeñas | Buffers grandes y fijos |
| Compresión de cuentas fuera de la cadena | Sin libro de órdenes en cadena | Libro de órdenes en cadena |
Preguntas Frecuentes
¿Versión de Anchor?
0.32.1 en temas avanzados.
¿Cuándo usar zero_copy?
Diseños grandes y fijos cuando la CU de Borsh es demasiado alta.
¿Es la reasignación reversible?
No fácilmente; planifica el crecimiento futuro.
¿Están las cuentas restantes en el IDL?
No; documentar por separado.
¿Qué necesita `declare_program!`?
JSON del IDL del llamado en tiempo de compilación.
¿Puede Anchor hacer CPI a Pinocchio?
Sí, con metadatos de cuenta correctos.
¿Banderas de características e IDL?
Evita diferentes IDL por característica en mainnet.
¿Cómo medir la CU?
LiteSVM, Surfpool, simulación en devnet.
¿Son comunes los tipos de cuenta personalizados?
No; último recurso.
¿Próximos pasos?
Ver enlaces relacionados para zero copy.
Relacionados
- Cuentas Zero-Copy - vista de serialización
- Optimización de CU y Tamaño - CU
- Tipos de Cuenta Personalizados - traits
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.