The System & Token Programs
Inclua Program<'info, System>, Program<'info, Token> e contas de programa relacionadas em toda instrução que faz CPI para eles. O Anchor fixa IDs para impedir substituição de programa.
Receita
pub system_program: Program<'info, System>,
pub token_program: Program<'info, Token>,
pub associated_token_program: Program<'info, AssociatedToken>,Quando usar: Instruções criam contas, transferem SOL ou movem tokens SPL.
Exemplo Prático
#[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>,
}O que isso demonstra:
- Program<T> valida o ID do programa executável
- System program necessário para alocar conta
- Token program obrigatório para CPIs SPL
- Associated token program para criação de ATA
Aprofundamento
Contas de programa comuns
| Programa | Tipo Anchor |
|---|---|
| System | Program<'info, System> |
| SPL Token | Program<'info, Token> |
| Associated Token | Program<'info, AssociatedToken> |
| Token-2022 | Interface<'info, TokenInterface> |
Importe de anchor_lang::system_program e anchor_spl::token.
Erros comuns
- Omitir system_program no init - Constraint init falha.. Correção: Sempre combine init com System.
- Substituição do token program - Sem Program<Token>, atacante passa programa falso.. Correção: Use contas Program tipadas.
- Incompatibilidade Token vs Token-2022 - CPI falha.. Correção: Use Interface ao suportar ambos.
- Programa errado em remaining accounts do cliente - Erros de ordem de meta.. Correção: Siga exatamente a ordem de contas do IDL.
- CPI system sem payer mut - Débito de lamports falha.. Correção: Marque payer como mut.
Alternativas
| Alternativa | Use quando | Não use quando |
|---|---|---|
| CpiContext com conta de programa | Mesmo requisito | AccountInfo de programa não verificado |
| invoke nativo com IDs fixos | Sem Anchor | Segurança de Program<T> do Anchor |
FAQs
Qual versão do Anchor é assumida?
0.32.1 em toda esta seção.
Uma PDA pode ser Signer na struct de contas?
Não. Use constraints de seeds e assinatura em CPI.
Onde o bump é armazenado?
No campo da struct de conta, definido na inicialização.
Como os clientes derivam PDAs?
Use @solana/kit 7.0.0 com os mesmos bytes de seed.
Qual program id é usado para PDAs?
O endereço declare_id do seu programa Anchor.
Seeds incluem bump?
Não no array de seeds; bump é parâmetro separado em find_program_address.
Como depurar falhas de PDA?
Compare chaves logadas; verifique seeds e program id no client-side.
PDAs são rent-exempt?
Sim quando mantêm dados; financie com payer no init.
Uma PDA pode assinar múltiplos CPIs em uma ix?
Sim, com as mesmas signer seeds em cada CPI.
O que ler em seguida?
Veja os links em Relacionados para tópicos mais profundos sobre system e token.
Relacionados
- SPL Token CPIs - CPIs de token
- Token & Associated Token Constraints - validação
- Creating Accounts via CPI - CPI system
Versões da stack: Esta página foi 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 e LiteSVM 0.6.x.