Cálculo de espacio
El cálculo correcto del espacio evita fallos en la inicialización y sorpresas con el alquiler. Suma discriminadores, campos Borsh o size_of::<Pod>(), luego consulta Rent para obtener los lamports.
Receta
pub const SPACE: usize = 8 + User::LEN;
let lamports = Rent::get()?.minimum_balance(SPACE);Cuándo usar esto:
- Al crear cuentas en el programa o cliente.
- Al estimar los costos de alquiler del protocolo.
- Al revisar los atributos
space =de Anchor.
Ejemplo práctico
#[derive(BorshSerialize, BorshDeserialize)]
pub struct User { pub authority: Pubkey, pub points: u64 }
impl User { pub const LEN: usize = 32 + 8; }
pub const USER_SPACE: usize = 8 + User::LEN; // disc + bodyLo que esto demuestra:
- Discriminador de 8 bytes más cuerpo.
- Constante LEN documentada.
- Alquiler de la constante SPACE.
Análisis en profundidad
Fórmula
ESPACIO = disc + suma(tamaños de campo) + límites de longitud variable.
Vec variable
4 + max_entradas * tamaño_entrada.
Notas de Rust
// Prueba de host: assert_eq!(serialized.len(), USER_SPACE - 8);Errores comunes
- Discriminador olvidado - Desfase de 8. Solución: Añadir siempre el discriminador.
- String sin límites - No se puede precalcular. Solución: Usar bytes UTF-8 máximos.
- Campos Option - 1 + tamaño interno cada uno. Solución: Incluir en la suma.
- Tamaño de Pubkey incorrecto - Debe ser 32. Solución: Usar constantes.
- Relleno en Pod - Usar
size_ofno una suposición manual. Solución: Afirmación en tiempo de compilación.
Alternativas
| Alternativa | Usar cuándo | No usar cuándo |
|---|---|---|
| Anchor InitSpace | Automático | Nativo manual |
| Medición de serialización de host | Verdad fundamental | Solo en tiempo de ejecución |
| Calculadora de alquiler de Excel | Planificación | No sustituto de código |
Preguntas frecuentes
¿Mínimo exento de alquiler?
Rent::minimum_balance.
¿Crecer más tarde?
realloc paga la diferencia.
¿Tamaño de cuenta de token?
165 bytes clásico SPL.
¿Sobrecarga de cuenta?
Solo la longitud de los datos en cadena.
¿Espacio máximo?
10 MB.
¿Espacio cero?
Solo el poseedor de lamports.
¿InitSpace anchor 0.32?
El macro se expande en tiempo de compilación.
¿Array de Pubkey?
32 * n.
¿C string?
Evitar - usar bytes fijos.
¿Probar LEN?
Prueba unitaria de host.
¿CLI de calculadora de alquiler?
solana rent.
¿Surfpool?
Verificar la creación con SPACE.
Relacionado
- Structs Borsh - Tamaños de campo
- Alquiler y Exención de Alquiler - Economía
- Creación de cuentas a través de CPI - Asignar
Versiones de Stack: 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.