Espacio y Alquiler
Las cuentas de Solana deben estar exentas de alquiler. init de Anchor utiliza tu atributo space para asignar bytes, incluido el discriminador de 8 bytes.
Receta
#[account]
pub struct User {
pub authority: Pubkey,
pub points: u64,
}
// space = 8 + User::INIT_SPACE
#[account(init, payer = payer, space = 8 + User::INIT_SPACE)]
pub user: Account<'info, User>,Cuándo usar esto: Cuando añades campos al estado en la cadena o creas nuevos tipos de cuentas.
Ejemplo de Trabajo
#[account]
#[derive(InitSpace)]
pub struct Config {
pub admin: Pubkey,
#[max_len(64)]
pub name: String,
pub fee_bps: u16,
}
#[account(init, payer = payer, space = 8 + Config::INIT_SPACE)]
pub config: Account<'info, Config>,Lo que esto demuestra:
InitSpacederive calcula el tamaño en tiempo de compilación.- El discriminador de 8 bytes es obligatorio para las cuentas de Anchor.
- El pagador (
payer) suministra lamports para la exención de alquiler. max_lenen cadenas/vectores limita la asignación.
Análisis Profundo
Reglas de Dimensionamiento
- Campos fijos: suma de los tamaños de Borsh.
String/Vec: necesitanmax_lenconInitSpace.- Las cuentas de cero copia (
zero-copy) utilizan un dimensionamiento diferente (sin Borsh en la cadena).
Alquiler
El mínimo para la exención de alquiler depende del tamaño asignado. Usa Rent::get()?.minimum_balance(space) en las pruebas para afirmar la financiación.
Trampas Comunes
- Olvidar el discriminador en
space: La cuenta es demasiado pequeña; la serialización falla (panics). Solución: Añade siempre 8 aINIT_SPACE. - Cadena sin límites (
Unbounded String): Sinmax_len; tamaño desconocido. Solución: Usa#[max_len(n)]conInitSpace. - Vector infra dimensionado (
Undersized Vec): Crece más allá de la asignación. Solución: Preasigna la longitud máxima o usarealloc. INIT_SPACEincorrecto después de añadir un campo: La actualización rompe las nuevas inicializaciones. Solución: Incrementa la versión y migra.- Cerrar sin reclamar el alquiler: Los usuarios pierden SOL. Solución: Usa
close = recipient.
Alternativas
| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
Restricción realloc | Crecimiento de cuentas | Tamaños fijos conocidos de antemano |
zero_copy | Estructuras fijas grandes | Cuentas de configuración pequeñas |
Cálculo manual de space | No es Anchor | InitSpace derive |
Preguntas Frecuentes
¿Qué versión de Anchor utiliza este sitio?
0.32.1 para anchor-lang, Anchor CLI y ejemplos en esta sección.
¿Necesito Solana CLI además de Anchor?
Sí. Solana CLI 3.0.10 maneja los pares de claves, los airdrops y la inspección de solana program.
¿Dónde vive el IDL después de la compilación?
En target/idl/<program>.json en tu espacio de trabajo.
¿Puedo mezclar `UncheckedAccount` con `Signer`?
Sí, pero cada campo no verificado necesita restricciones explícitas o comprobaciones del manejador.
¿Cómo puedo probar sin devnet?
Usa anchor test con Surfpool 0.12.0 o LiteSVM 0.6.x en CI.
¿Qué es el prefijo de 8 bytes en los datos de la cuenta?
El discriminador de cuenta de Anchor; no lo elimines al dimensionar space.
¿Debo incluir el IDL generado en el control de versiones?
Sí, o publica el IDL en la cadena para que los clientes tengan una fuente canónica.
¿Cómo depuro fallos en las restricciones?
Ejecuta con logs; Anchor imprime el nombre de la restricción y el índice de la cuenta.
¿Funciona Anchor en Agave 4.1.1?
Sí. Esta pila se dirige a validadores Agave con Solana CLI 3.0.10.
¿Qué debo leer a continuación en esta sección?
Consulta los artículos hermanos en "Relacionados" para temas más profundos sobre el espacio y el alquiler.
Relacionados
- realloc en Anchor - para crecer cuentas
- Cálculo de Espacio - dimensionamiento de serialización
- init & init_if_needed - asignación
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.