Los Programas del Sistema y Token
Incluye Program<'info, System>, Program<'info, Token>, y cuentas de programa relacionadas en cada instrucción que realiza CPIs a ellos. Anchor fija los IDs para prevenir la sustitución de programas.
Receta
pub system_program: Program<'info, System>,
pub token_program: Program<'info, Token>,
pub associated_token_program: Program<'info, AssociatedToken>,Cuándo usar esto: Las instrucciones crean cuentas, transfieren SOL o mueven tokens SPL.
Ejemplo de Trabajo
#[derive(Accounts)]
pub struct CreateAta<'info> {
#[account(mut)]
pub payer: Signer<'info>,
pub mint: Account<'info, Mint>,
#[account(
init,
payer = payer,
associated_token::mint = mint,
associated_token::authority = owner,
)]
pub ata: Account<'info, TokenAccount>,
pub owner: SystemAccount<'info>,
pub system_program: Program<'info, System>,
pub token_program: Program<'info, Token>,
pub associated_token_program: Program<'info, AssociatedToken>,
}Lo que esto demuestra:
- Program<T> valida el ID del programa ejecutable
- El programa del sistema es necesario para la asignación de cuentas
- El programa de token es requerido para las CPIs de SPL
- El programa de token asociado para la creación de ATA
Análisis Profundo
Cuentas de Programa Comunes
| Programa | Tipo de Anchor |
|---|---|
| Sistema | Program<'info, System> |
| SPL Token | Program<'info, Token> |
| Token Asociado | Program<'info, AssociatedToken> |
| Token-2022 | Interface<'info, TokenInterface> |
Importa desde anchor_lang::system_program y anchor_spl::token.
Errores Comunes
- Omitir system_program en init - La restricción de init falla. Solución: Empareja siempre init con System.
- Sustitución del programa de token - Sin Program<Token>, un atacante pasa un programa falso. Solución: Usa cuentas Program tipadas.
- Desajuste entre Token y Token-2022 - La CPI falla. Solución: Usa Interface cuando soportes ambos.
- Programa incorrecto en las cuentas restantes del cliente - Errores de orden de IDL. Solución: Sigue exactamente el orden de cuentas de la IDL.
- Usar CPI del sistema sin payer mut - El débito de lamports falla. Solución: Marca payer como mut.
Alternativas
| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
| CpiContext con cuenta de programa | Mismo requisito | AccountInfo de programa sin verificar |
| Invoke nativo con IDs codificados | No-Anchor | Seguridad de Anchor Program<T> |
Preguntas Frecuentes
¿Qué versión de Anchor se asume?
0.32.1 en toda esta sección.
¿Puede un PDA ser un Signer en la estructura de cuentas?
No. Usa restricciones de semillas y firma de CPI.
¿Dónde se almacena el bump?
En el campo de la estructura de tu cuenta, establecido en la inicialización.
¿Cómo derivan los clientes los PDAs?
Usa @solana/kit 7.0.0 con bytes de semilla coincidentes.
¿Qué ID de programa se usa para los PDAs?
La dirección declare_id de tu programa Anchor.
¿Incluyen las semillas el bump?
No en el array de semillas; el bump es un parámetro separado para find_program_address.
¿Cómo depurar fallos de PDA?
Compara las claves registradas; verifica las semillas y el ID del programa en el lado del cliente.
¿Son los PDAs exentos de alquiler?
Sí, cuando contienen datos; fináncialos con el pagador en init.
¿Puede un PDA firmar múltiples CPIs en una ix?
Sí, con las mismas semillas de firmante para cada CPI.
¿Qué leer a continuación?
Consulta los enlaces relacionados para temas más profundos sobre tokens del sistema.
Relacionados
- CPIs de SPL Token - CPIs de token
- Restricciones de Token y Token Asociado - validación
- Creación de Cuentas mediante CPI - CPI del sistema
Versiones de Stack: 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.