Estructuras Borsh
Las estructuras Borsh son el caballo de batalla para los cuerpos de cuentas de Solana. Diseñalas para un orden de campos estable, tamaño explícito y versionado compatible con versiones anteriores.
Receta
#[derive(BorshSerialize, BorshDeserialize)]
pub struct User { pub authority: Pubkey, pub points: u64 }Cuándo usar esto:
- Definir nuevos tipos de cuenta.
- Calcular el espacio de alquiler.
- Planificar actualizaciones de esquemas.
Ejemplo de Trabajo
#[derive(BorshSerialize, BorshDeserialize)]
pub struct User {
pub authority: Pubkey,
pub points: u64,
pub bump: u8,
}
impl User {
pub const LEN: usize = 32 + 8 + 1;
}Lo que esto demuestra:
- El orden de los campos es el orden de serialización.
- LEN coincide con la suma de los campos.
- Bump almacenado para la firma de PDA.
Análisis Profundo
Tamaño
Pubkey 32 + u64 8 + u8 1 = 41 bytes de cuerpo.
Versionado
Añadir campos; migrar cuentas antiguas.
Notas de Rust
// Option<Pubkey>: 1 + 32 bytesTrampas Comunes
- Reordenar campos - Rompe todas las cuentas. Solución: Solo añadir nuevos campos.
- String sin máximo - Alquiler ilimitado. Solución: Limitar la longitud o usar un array fijo.
- Enum en cuenta - Cambios de variante arriesgados. Solución: Preferir etiqueta u8 + struct.
- LEN incorrecto - Fallos en tiempo de ejecución. Solución: Probar la longitud de serialización.
- Falta de conciencia del relleno - Raro en Borsh - a diferencia de los layouts de C. Solución: Borsh se empaqueta secuencialmente.
Alternativas
| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
| cabecera bytemuck + cola Borsh | Híbrido | Cero copia pura |
| Múltiples cuentas pequeñas | Menos reasignación | Más alquiler total |
| Compresión de cuentas | Fuera de la cadena | Bytes crudos en la cadena |
Preguntas Frecuentes
¿Pubkey en la estructura?
32 bytes Borsh.
¿Tamaño de Vec?
Longitud de 4 bytes + elementos - alquiler variable.
¿Tamaño de bool?
1 byte.
¿i64?
8 bytes LE.
¿Estructura anidada?
Soportado - suma tamaños.
¿Trait Default?
Ayuda a inicializar en el host.
¿Cuenta MAX?
10 MB teóricos.
¿Anchor InitSpace?
Deriva macro de espacio.
¿Hash del esquema?
Documentar en las actualizaciones.
¿Aplanar?
Se prefiere un solo nivel por claridad.
¿align?
Borsh ignora el align de Rust.
¿Fuzz deserializar?
Recomendado.
Relacionado
- Serialización Borsh - Formato
- Cálculo de Espacio - Alquiler
- Versionado y Migración de Datos - Actualizaciones
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.