Mejores prácticas del modelo de cuentas
Diseña diseños de cuentas que escalen, se mantengan seguros y minimicen los costos de alquiler y cómputo en Agave 4.1.1.
Cómo usar esta lista
- Aplica A antes de escribir tu primera struct
#[account] - Revisa B antes de la auditoría de seguridad de lanzamiento a mainnet
- Usa C al optimizar CU y alquiler a escala
A - Diseño del layout
- Una entidad lógica por cuenta. Fragmenta el estado del usuario a través de PDAs, no una cuenta de mapa global.
- Usa
InitSpace+max_lenpara campos variables. Nunca adivines los tamaños de String/Vec en Anchor 0.32.1. - Incluye un byte
versioncuando el esquema vaya a evolucionar. Los cambios de campos anexables evitan la ruptura de la deserialización. - Dimensiona las cuentas a máximos realistas, no infinitos. El alquiler y la CU escalan con los bytes.
B - Seguridad
- Cada cuenta
muttiene verificaciones de propietario y autoridad.Account<T>,has_one,seeds, oconstraintexplícito. - Evita
UncheckedAccountsin restricciones. Trátalo como culpable hasta que se demuestre que es válido. - Valida que los firmantes coincidan con las autoridades almacenadas.
Signer+has_onejuntos, no uno solo. - Cierra las cuentas cuando finaliza su ciclo de vida. Devuelve el alquiler a los usuarios; evita sumideros de lamports huérfanos.
- Nunca aceptes cuentas de víctima solo por su pubkey. El atacante pasa las cuentas de otros si faltan las restricciones.
C - Operaciones
- Consulta
getMinimumBalanceForRentExemptionen los clientes. No codifiques en exceso los lamports de alquiler. - Usa
realloccon moderación y un plan de migración. Prefiere nuevos tipos de cuenta para cambios disruptivos. - Emite eventos al crear/cerrar. Los indexadores dependen de las señales del ciclo de vida.
- Documenta las semillas de PDA en IDL/docs. La derivación del cliente debe coincidir exactamente con las
seedsen la cadena. - Filtra
getProgramAccountspor discriminador. Reduce la carga útil de RPC y el trabajo de decodificación del cliente.
Preguntas frecuentes
¿Cuál es el peor error del modelo de cuentas?
Falta de validación de propietario/autoridad en cuentas escribibles: conduce a vulnerabilidades de drenaje.
¿Cuándo debo usar zero-copy?
Cuentas de más de unos pocos KB leídas/escritas con frecuencia. Mide la CU antes de migrar.
¿Cuántas PDAs por usuario es normal?
Una por objeto lógico (posición, orden, bóveda). Evita docenas por acción para limitar el costo de UX del alquiler.
¿Deberían los protocolos subsidiar la creación de cuentas?
Sí, para una incorporación sin fricciones cuando el alquiler excede la tolerancia del usuario: presupuesta el tesoro en consecuencia.
¿Cómo audito las restricciones de cuenta?
Mapea cada instrucción a cada cuenta mut; enumera las verificaciones en tiempo de ejecución aplicadas.
¿Es `init_if_needed` seguro?
Solo con semillas fuertes y verificaciones de autoridad; de lo contrario, los atacantes inicializan en nombre de la víctima.
¿Qué espacio debo asignar para las cadenas?
#[max_len(N)] en el campo; InitSpace incluye 4 + N en total.
¿Puedo compartir una cuenta entre programas?
Solo un programa propietario. Comparte datos a través de CPI o pasando solo lectura, no doble propiedad.
¿Cómo manejo la migración de cuentas?
Nueva PDA + instrucción de copia + desaprobar tipo antiguo. Nunca reordenes los campos Borsh existentes.
¿Debería la configuración global ser una PDA?
Sí: el singleton seeds = [b"config"] es estándar para los parámetros del protocolo.
¿Qué pasa con la compresión de cuentas?
Úsala para conjuntos de datos masivos de baja mutabilidad (cNFTs). No para estado DeFi "caliente".
¿Cómo ayuda LiteSVM 0.6.x a las pruebas de cuentas?
Pruebas locales rápidas para init/close/realloc sin la sobrecarga completa del validador.
Relacionado
- Conceptos básicos del modelo de cuentas - patrones prácticos
- Propiedad y permisos de cuentas - reglas de seguridad
- Cuentas de datos y layout - guía de dimensionamiento
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.