Contas do Sistema vs. Contas de Programa
Contas possuídas pelo sistema são simples detentoras de lamports. Contas possuídas por programa têm dados estruturados interpretados por seu proprietário. Contas de Programa (executáveis) contêm bytecode BPF. Cada tipo tem regras de mutação diferentes.
Receita
| Tipo | Proprietário | Executável | Uso Típico |
|---|---|---|---|
| Carteira | Programa do Sistema | false | Guardar SOL |
| PDA de Dados | Seu programa | false | Estado do App |
| Conta de Token SPL | Programa de Token | false | Saldos de Token |
| Programa | Carregador BPF | true | Lógica on-chain |
Exemplo de Trabalho
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>,
}O que isso demonstra:
SystemAccountenvolve contas que detêm lamports simples- Estado personalizado requer
owner = seu_id_de_programa - O Programa do Sistema lida com transferências de SOL; seu programa lida com suas próprias contas de dados
Análise Profunda
Regras de Mutação
- Programa do Sistema pode criar contas, atribuir proprietários, transferir lamports
- Programa proprietário pode escrever
datae debitar lamports (dentro das regras) - Programas não proprietários só podem ler a menos que o proprietário delegue via CPI
- Contas executáveis não podem ser escritas como dados durante invocações normais
Programas Nativos
| Programa | ID (bem conhecido) | Papel |
|---|---|---|
| Sistema | 11111...1111 | Ciclo de vida da conta, transferência de SOL |
| Token SPL | Tokenkeg... | Tokens fungíveis |
| Carregador BPF | BPFLoaderUpgradeab1e... | Implantar e atualizar programas |
Armadilhas
- Passar carteira como
Account<T>- a desserialização falha em dados vazios. Correção: useSystemAccountouSigner. - Escrever diretamente em contas de token SPL - apenas o Programa de Token pode. Correção: CPI para instruções do Programa de Token SPL.
- Tratar a conta de ID do programa como estado - a conta do programa é executável, não seu PDA. Correção: armazene o estado em PDAs pertencentes ao seu programa.
- Restrição de proprietário incorreta - vulnerabilidade de segurança. Correção: sempre defina
owner = program_idou use a verificação automáticaAccount<T>do Anchor. - Invocar contas executáveis como dados - erro de tempo de execução. Correção: passe contas de programa apenas como
Program<'info, T>ouAccountInfopara CPI.
Alternativas
| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
SystemAccount | Contas apenas de SOL | Dados estruturados |
Account<T> | Estado de programa tipado | Layouts brutos desconhecidos |
InterfaceAccount | Compatibilidade Token-2022 / MPL | Contas de sistema simples |
FAQs
O que possui uma nova conta de carteira?
O Programa do Sistema. Os dados estão vazios; lamports detêm SOL.
O Programa do Sistema pode escrever dados de token?
Não. O programa de Token SPL possui as contas de token.
O que é uma conta executável?
Um programa implantado. executable = true, pertencente a um carregador BPF.
Como a propriedade é transferida?
Via instrução assign do Programa do Sistema, chamada pelo programa proprietário atual.
Uma transação pode misturar contas do sistema e de programa?
Sim. Transações comumente incluem carteiras, PDAs, contas de token e IDs de programa.
O que é o Carregador Atualizável BPF?
Possui contas de programa atualizáveis no Agave 4.1.1. Separa o ID do programa dos dados do programa.
PDAs são possuídos pelo sistema?
Não. PDAs são possuídos pelo programa que os derivou.
Usuários podem possuir suas próprias contas de dados?
A conta é possuída pelo seu programa; usuários controlam via autoridade signatária armazenada nos dados ou como seeds de PDA.
O que acontece se o proprietário estiver errado na inicialização?
Outro programa poderia escrever seus dados. Bug crítico de segurança.
Como verifico o proprietário no Anchor?
Account<'info, T> verifica automaticamente owner == program ID. Adicione owner = X explícito para contas entre programas.
O Programa do Sistema tem tratamento especial?
Sim. Ele sozinho pode criar contas e atribuir proprietários iniciais sem ser o proprietário atual.
Contas de programa podem conter lamports?
Sim. Programas acumulam lamports para aluguel; saques exigem lógica de programa.
Relacionado
- Anatomia da Conta - campos de proprietário e executável
- Estado Possuído por Programa - padrão de conta de estado
- Propriedade e Permissões de Conta - regras de escrita
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.