CPI para o Programa do Sistema
O Programa do Sistema lida com a criação, atribuição, alocação de contas e transferências de lamports. A maioria dos programas faz CPI para ele para pagamento de aluguel e movimentação de SOL.
Receita
invoke(
&system_instruction::transfer(from.key, to.key, amount),
&[from.clone(), to.clone()],
)?;Quando usar isso:
- Pagando aluguel para novas contas.
- Movendo SOL para tesouraria ou usuários.
- Fechando contas e retornando aluguel.
Exemplo de Trabalho
let rent = Rent::get()?;
let lamports = rent.minimum_balance(space);
invoke(
&system_instruction::create_account(payer.key, new.key, lamports, space as u64, owner),
&[payer.clone(), new.clone(), system_program.clone()],
)?;O que isso demonstra:
- Sysvar de aluguel para saldo mínimo.
create_accountdefine o programa proprietário.- O pagador assina a transferência/criação.
Mergulho Profundo
Instruções Comuns
| IX | Propósito |
|---|---|
| transfer | Mover lamports |
| create_account | Alocar + atribuir |
| allocate | Adicionar espaço |
| assign | Alterar proprietário (restrito) |
Notas de Rust
use solana_program::system_program;Armadilhas
- Transferência de PDA sem assinatura - Falha. Correção:
invoke_signed. - Criar em existente - Falha se
lamports > 0. Correção: Verificar conta vazia. - Lamports insuficientes - Transferência/criação falha. Correção: Verificações de saldo.
- Parâmetro de proprietário errado - Conta presa com proprietário errado. Correção: Passe seu ID de programa.
- Aluguel não isento - Conta desalocada. Correção: Financie
minimum_balance.
Alternativas
| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
| Cliente cria conta | Programa mais simples | Fluxos de PDA |
Anchor init | Abstrai | Nativo |
transfer_with_seed | Endereços derivados | PDA preferido |
FAQs
ID do programa do sistema?
11111111111111111111111111111111
Criar + inicializar na mesma tx?
Sim.
Fechar conta?
Transferir todos os lamports para fora.
CPI de atribuição?
Raro - sensível à segurança.
alocar vs criar?
create para novas chaves.
Criar PDA?
invoke_signed.
Sysvar de aluguel?
Rent::get() no programa.
Transferência de zero lamports?
Permitido, mas inútil.
Assinante para transferência?
Conta de origem assinante.
Transferência múltipla?
Múltiplos CPIs ok.
Agave 4.1.1?
Corresponder aos helpers system_instruction.
Surfpool?
Testar matemática de aluguel.
Relacionado
- Criando Contas via CPI - Padrões
- Cofre e Garantia - Custódia
- Padrões de Taxa e Tesouraria - Taxas
Versões do 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.