La Estructura de Cuentas
Cada instrucción declara una estructura de cuentas con #[derive(Accounts)]. Anchor ejecuta las restricciones antes de que se ejecute tu manejador, aplicando la propiedad, la mutabilidad y las relaciones de forma fallida y cerrada.
Receta
#[derive(Accounts)]
pub struct Transfer<'info> {
#[account(mut)]
pub from: Signer<'info>,
#[account(mut, constraint = to.owner == from.key())]
pub to: Account<'info, TokenAccount>,
pub token_program: Program<'info, Token>,
}Cuándo usar esto: Diseñas cualquier instrucción que toque cuentas en la cadena.
Ejemplo Funcional
#[derive(Accounts)]
pub struct UpdateMetadata<'info> {
#[account(
mut,
seeds = [b"meta", authority.key().as_ref()],
bump = metadata.bump,
has_one = authority,
)]
pub metadata: Account<'info, Metadata>,
pub authority: Signer<'info>,
}
#[account]
pub struct Metadata {
pub authority: Pubkey,
pub bump: u8,
pub uri: String,
}Lo que esto demuestra:
- Los tipos de campo (
Signer,Account<T>,Program<T>) implican comprobaciones básicas. - Las restricciones de atributo añaden
seeds,init,has_oney expresiones personalizadas. - El mapa
bumpsestá disponible en los manejadores para los bumps canónicos almacenados. - El orden de validación es importante para la seguridad de
inity CPI.
Análisis Profundo
Tipos de Cuentas Comunes
| Tipo | Valida |
|---|---|
Signer<'info> | Cuenta que firmó la transacción |
Account<'info, T> | El propietario es el programa, se deserializa como T |
Program<'info, T> | La dirección coincide con el ID del programa para T |
SystemAccount<'info> | Propiedad del programa del sistema |
UncheckedAccount<'info> | Sin comprobaciones automáticas (usar con cuidado) |
Categorías de Restricciones
- Mutabilidad -
mutpara cuentas escribibles. - Propiedad -
owner,has_one, restricciones de token. - Dirección -
address = expr,seeds/bumppara PDAs. - Ciclo de vida -
init,init_if_needed,close.
Errores Comunes
- UncheckedAccount sin restricciones - Cualquier cuenta pasa la validación. Solución: Añade
address,owneroconstraint. - Falta
muten cuenta escribible - Fallo en tiempo de ejecución al escribir. Solución: Marca cada cuenta escrita comomut. has_oneen campo incorrecto - La relación no se aplica. Solución: Haz coincidir el nombre del campo con el campo de la estructura en los datos de la cuenta.initsin pagador - La creación de la cuenta falla. Solución: Establecepayer = signere incluye el programa del sistema.- Confiar en PDAs proporcionados por el cliente - Semillas incorrectas agotan los fondos. Solución: Usa siempre restricciones
seeds+bump.
Alternativas
| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
| Validación manual en el manejador | Comprobaciones dinámicas difíciles de expresar | Prefiere restricciones declarativas para reglas estáticas |
remaining_accounts | Conjuntos de cuentas variables | Diseño fijo conocido en tiempo de compilación |
AccountLoader para cero-copia | Cuentas grandes | Estructuras pequeñas con Borsh |
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 junto con Anchor?
Sí. Solana CLI 3.0.10 maneja keypairs, airdrops e inspección de solana program.
¿Dónde vive el IDL después de la compilación?
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 en el manejador.
¿Cómo pruebo 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 confirmar el IDL generado?
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 enlazados en "Relacionados" para temas más profundos sobre la estructura de cuentas.
Relacionados
- Tipos de Cuentas - referencia de tipos
- Las Restricciones #[account] - catálogo de restricciones
- Orden de Validación de Cuentas - secuencia de comprobació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.