Cuentas del Sistema vs. Cuentas de Programa
Las cuentas propiedad del sistema son simples contenedores de lamports. Las cuentas propiedad del programa tienen datos estructurados interpretados por su propietario. Las cuentas de programa (ejecutables) contienen bytecode BPF. Cada tipo tiene reglas de mutación diferentes.
Receta
| Tipo | Propietario | Ejecutable | Uso Típico |
|---|---|---|---|
| Billetera | Programa del Sistema | falso | Mantener SOL |
| PDA de Datos | Tu programa | falso | Estado de la aplicación |
| Cuenta de Token SPL | Programa de Token | falso | Saldos de tokens |
| Programa | Cargador BPF | verdadero | Lógica en cadena |
Ejemplo de Trabajo
use anchor_lang::prelude::*;
declare_id!("Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS");
#[derive(Accounts)]
pub struct TransferSol<'info> {
#[account(mut)]
pub from: SystemAccount<'info>,
#[account(mut)]
pub to: SystemAccount<'info>,
pub system_program: Program<'info, System>,
}
#[derive(Accounts)]
pub struct MutateState<'info> {
#[account(mut, owner = crate::ID)]
pub state: Account<'info, GameState>,
}Lo que esto demuestra:
SystemAccountenvuelve cuentas que solo contienen lamports.- El estado personalizado requiere
owner = your_program_id. - El Programa del Sistema maneja las transferencias de SOL; tu programa maneja sus propias cuentas de datos.
Análisis Profundo
Reglas de Mutación
- El Programa del Sistema puede crear cuentas, asignar propietarios, transferir lamports.
- El programa propietario puede escribir
datay debitar lamports (dentro de las reglas). - Los programas no propietarios solo pueden leer a menos que el propietario delegue a través de CPI.
- Las cuentas ejecutables no se pueden escribir como datos durante invocaciones normales.
Programas Nativos
| Programa | ID (conocido) | Rol |
|---|---|---|
| Sistema | 11111...1111 | Ciclo de vida de la cuenta, transferencia de SOL |
| Token SPL | Tokenkeg... | Tokens fungibles |
| Cargador BPF | BPFLoaderUpgradeab1e... | Desplegar y actualizar programas |
Trampas Comunes
- Pasar una billetera como
Account<T>: la deserialización falla en datos vacíos. Solución: usarSystemAccountoSigner. - Escribir directamente en cuentas de token SPL: solo el Programa de Token puede hacerlo. Solución: usar CPI a las instrucciones del Programa de Token SPL.
- Tratar la cuenta del ID del programa como estado: la cuenta del programa es ejecutable, no tu PDA. Solución: almacenar el estado en PDAs propiedad de tu programa.
- Restricción de propietario incorrecta: vulnerabilidad de seguridad. Solución: siempre establecer
owner = program_ido usar la verificación automáticaAccount<T>de Anchor. - Invocar cuentas ejecutables como datos: error en tiempo de ejecución. Solución: pasar cuentas de programa solo como
Program<'info, T>oAccountInfopara CPI.
Alternativas
| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
SystemAccount | Cuentas solo de SOL | Datos estructurados |
Account<T> | Estado de programa tipado | Diseños brutos desconocidos |
InterfaceAccount | Compatibilidad con Token-2022 / MPL | Cuentas de sistema simples |
Preguntas Frecuentes
¿Quién es el propietario de una nueva cuenta de billetera?
El Programa del Sistema. Los datos están vacíos; los lamports contienen SOL.
¿Puede el Programa del Sistema escribir datos de tokens?
No. El programa de Token SPL es el propietario de las cuentas de token.
¿Qué es una cuenta ejecutable?
Un programa desplegado. executable = true, propiedad de un cargador BPF.
¿Cómo se transfiere la propiedad?
A través de la instrucción assign del Programa del Sistema, llamada por el programa propietario actual.
¿Puede una transacción mezclar cuentas del sistema y de programas?
Sí. Las transacciones comúnmente incluyen billeteras, PDAs, cuentas de token e IDs de programa.
¿Qué es el Cargador Actualizable BPF?
Es el propietario de las cuentas de programa actualizables en Agave 4.1.1. Separa el ID del programa de los datos del programa.
¿Son los PDAs propiedad del sistema?
No. Los PDAs son propiedad del programa que los derivó.
¿Pueden los usuarios ser propietarios de sus propias cuentas de datos?
La cuenta es propiedad de tu programa; los usuarios la controlan a través de la autoridad firmante almacenada en los datos o como semillas de PDA.
¿Qué sucede si el propietario es incorrecto al inicializar?
Otro programa podría escribir tus datos. Error crítico de seguridad.
¿Cómo verifico el propietario en Anchor?
Account<'info, T> verifica automáticamente que el propietario sea igual al ID del programa. Añade owner = X explícitamente para cuentas entre programas.
¿Está el Programa del Sistema especialmente tratado?
Sí. Solo él puede crear cuentas y asignar propietarios iniciales sin ser el propietario actual.
¿Pueden las cuentas de programa contener lamports?
Sí. Los programas acumulan lamports para el alquiler; los retiros requieren lógica del programa.
Relacionado
- Anatomía de la Cuenta - campos de propietario y ejecutable
- Estado Propiedad del Programa - patrón de cuenta de estado
- Propiedad y Permisos de Cuenta - reglas de escritura
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.