invoke vs invoke_signed
invoke encaminha apenas assinaturas de transação. invoke_signed adiciona assinaturas de PDA derivadas de fatias de sementes (seeds), permitindo que programas movam fundos que eles custodiam.
Receita
invoke(&ix, accounts)?; // apenas signers da carteira
invoke_signed(&ix, accounts, seeds)?; // + signers de PDAQuando usar isso:
- Debitar um PDA de cofre (vault).
- Mintar com autoridade de mint de PDA.
- Criar contas pertencentes ao seu programa.
Exemplo Funcional
pub fn move_from_vault(bump: u8, amount: u64, from: &AccountInfo, to: &AccountInfo, sys: &AccountInfo) -> ProgramResult {
let ix = system_instruction::transfer(from.key, to.key, amount);
invoke_signed(&ix, &[from.clone(), to.clone(), sys.clone()], &[&[b"vault", &[bump]]])
}O que isso demonstra:
- O PDA do cofre assina a transferência do sistema.
- Grupo de sementes único com byte de bump.
- Sem invoke_signed, o CPI falha por falta de assinatura.
Análise Detalhada
Comparação
| invoke | invoke_signed | |
|---|---|---|
| Assinatura de PDA | Não | Sim |
| CU | Menor | Ligeiramente maior |
| Risco | Menor se não houver custódia | Bugs em seeds são críticos |
Notas de Rust
// seeds: &[&[u8]] - array de fatias de sementesArmadilhas
- invoke para autoridade de PDA - MissingRequiredSignature. Correção: Use invoke_signed.
- Seeds erradas - Falha silenciosa ou erro. Correção: Centralizar construtor de seeds.
- Carteira pode assinar PDA? - Não existe chave privada. Correção: Apenas programa.
- Confusão de delegado - O delegado de token não é um signatário de programa PDA. Correção: Ler regras de token.
- Múltiplos grupos de seeds - A ordem importa para CPIs de múltiplos PDAs. Correção: Testar cada caminho.
Alternativas
| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
| Co-assinatura do cliente | Usuário paga diretamente | Cofre autônomo |
| Padrão de conta nonce | Chaves duráveis | Custódia de PDA |
FAQs
invoke_signed pode adicionar assinatura de carteira?
Não - apenas assinaturas de programa PDA.
Limite de profundidade?
4, incluindo CPIs aninhados.
CPI de mint de token?
Frequentemente invoke_signed.
Criar conta do sistema?
invoke_signed para pagador PDA.
Simular?
Mesmas regras no LiteSVM.
Anchor CpiContext
Envolve invoke_signed com seeds.
Erro de seed falho?
InvalidSeeds ou assinatura ausente.
PDA entre programas?
O programa proprietário deve fazer CPI.
Auditoria?
Cada linha de invoke_signed.
Tempo de vida das seeds?
O borrow checker impõe.
Meta de signer opcional?
PDA meta signer true.
invoke do Anchor?
Macro seleciona com base nas seeds.
Relacionado
- Assinando com PDAs - Assinatura de PDA
- CPI para o Programa do Sistema - Transferências de SOL
- Passando Contas para CPIs - Metas de conta
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.