Tipos de Cuenta
Los tipos de envoltorio de cuenta de Anchor codifican reglas de validación comunes. Elige el tipo más estricto que coincida con tu modelo de amenazas, luego añade restricciones de atributos para las relaciones.
Receta
#[derive(Accounts)]
pub struct Example<'info> {
pub payer: Signer<'info>,
pub data: Account<'info, MyState>,
pub sys: SystemAccount<'info>,
pub token_prog: Program<'info, Token>,
/// CHECK: validado en el manejador
pub oracle: UncheckedAccount<'info>,
}Cuándo usar esto: Eliges tipos para un nuevo campo de estructura de cuenta.
Ejemplo de Trabajo
#[derive(Accounts)]
pub struct Deposit<'info> {
#[account(mut)]
pub user: Signer<'info>,
#[account(
mut,
associated_token::mint = mint,
associated_token::authority = user,
)]
pub user_ata: Account<'info, TokenAccount>,
pub mint: Account<'info, Mint>,
pub token_program: Program<'info, Token>,
pub associated_token_program: Program<'info, AssociatedToken>,
}Lo que esto demuestra:
Signerrequiere una firma de transacciónAccount<T>comprueba el propietario y deserializa con discriminadorProgram<T>fija los IDs de programa para objetivos CPIUncheckedAccountomite las comprobaciones de seguridad automáticas
Análisis Profundo
Referencia de Tipos
| Tipo | Comprobaciones automáticas |
|---|---|
Signer<'info> | is_signer |
Account<'info, T> | Propietario, discriminador, deserializa T |
InterfaceAccount<'info, T> | Propietarios de Token-2022 / interfaz |
Program<'info, T> | ID de programa para T |
SystemAccount<'info> | Propietario del programa del sistema |
UncheckedAccount<'info> | Ninguna |
Notas de Rust
Usa AccountLoader<'info, T> para cuentas de cero copia y Interface<'info, T> para interfaces de token en 0.32.
Errores Comunes
- Cuenta sin
muten datos escribibles - La serialización falla al final de la instrucción. Solución: Añademutal persistir cambios. - Campo
Programomitido - La CPI falla con un ID de programa incorrecto. Solución: IncluyeProgram<Token>explícito, etc. UncheckedAccountpara fondos de usuario - El atacante sustituye cuentas. Solución: Usa cuentas tipadas o restricciones estrictas.Account<T>incorrecto para token-2022 - La comprobación del propietario falla. Solución: UsaInterfaceAccountcon TokenInterface.Signerpara autoridad de PDA - Las PDAs no pueden firmar comoSigner. Solución: Usaseeds+invoke_signedo CPIwith_signer.
Alternativas
| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
AccountLoader | Estado grande de cero copia | Estructuras Borsh pequeñas |
InterfaceAccount | Mints/ATAs de Token-2022 | Solo SPL heredado |
remaining_accounts | Conjuntos dinámicos | Diseño de instrucción fijo |
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 reside 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 comprobado necesita restricciones explícitas o comprobaciones en el manejador.
¿Cómo depuro fallos de 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 tipos de cuenta.
Relacionados
- Las Restricciones #[account] - atributos
- Restricciones de Token y Token Asociado - ayudantes SPL
- Tipos de Cuenta Personalizados - traits manuales
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.