Conceptos básicos de patrones de programas
10 ejemplos para empezar con Patrones de Programas: 7 básicos y 3 intermedios.
Prerrequisitos
- Conceptos básicos de PDAs, CPIs y serialización de secciones anteriores de on-chain-rust.
Ejemplos básicos
1. Patrón de cuenta de inicialización
Crear + escribir discriminador + estado.
// 1. CPI de create_account 2. Establecer discriminador 3. Serializar Estado- Rechazar reinicialización si lamports > 0.
- El pagador firma el alquiler.
- Ver patrones de inicialización de cuentas.
2. Custodia de PDA de bóveda
El programa retiene fondos a través de la autoridad de la PDA.
// semillas [b"vault", user] + invocación_firmada de transferencias- Reglas de negocio antes de firmar.
- Semillas por usuario.
- Variantes de Token + SOL.
3. Verificación de autoridad
La clave pública almacenada debe firmar o coincidir con la PDA.
if !authority.is_signer { return Err(...); }- Separación de roles: administrador vs. usuario.
- Transferencia de propiedad en dos pasos.
- Evitar un único administrador global.
4. Enum de máquina de estados
La cuenta almacena el estado; las instrucciones validan las transiciones.
enum Status { Open, Filled, Cancelled }- La transición ilegal devuelve un error.
- Los estados terminales rechazan operaciones adicionales.
- Emitir evento en la transición.
5. Recolección de tarifas
Dividir la cantidad a la tesorería en acción.
let fee = amount.checked_mul(bps)?.checked_div(10000)?;- Matemáticas verificadas.
- PDA de tesorería o ATA.
- Documentar los bps de la tarifa de forma inmutable o mediante configuración.
6. Caducidad basada en reloj
Leer la sysvar Clock para las fechas límite.
let clock = Clock::get()?;
if clock.unix_timestamp > deadline { return Err(...); }- Slots vs. tiempo unix.
- El reloj del validador es confiable dentro de los límites.
- Períodos de gracia explícitos.
7. Cerrar cuenta
Datos cero, transferir lamports, marcar como cerrado.
// cero datos, transferir alquiler al destinatario- Prevenir ataques de reactivación.
- Solo la autoridad puede cerrar.
- Patrón de restricción
closede Anchor.
Ejemplos intermedios
8. Liberación de depósito en garantía (escrow)
Condiciones + CPI de token desde la PDA del depósito en garantía.
// verificar + invocación_firmada de transferencia de token- Orden de CEI.
- Consciente de la reentrada.
- Ver la página de bóveda y depósito en garantía.
Relacionado: Bóveda y Depósito en Garantía
9. Cuenta de configuración
Parámetros globales con rotación de administrador.
struct Config { admin: Pubkey, fee_bps: u16 }- Bloqueo de tiempo opcional.
- Límites para fee_bps.
- Diseño de diseño seguro para actualizaciones.
Relacionado: Control de Acceso y Autoridades
10. Esquema versionado
Instrucción de migración para el diseño v2.
if version == 1 { migrate_v1_to_v2()? }- Migración perezosa.
- Ventana de lectura dual.
- Ver diseño seguro para actualizaciones.
Relacionado: Diseño de Datos Seguro para Actualizaciones
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.