PDAs no Anchor
Program Derived Addresses (PDAs) não possuem chave privada; seu programa assina por elas com seeds e bump via invoke_signed ou CPI with_signer.
Busque em todas as páginas da documentação
Program Derived Addresses (PDAs) não possuem chave privada; seu programa assina por elas com seeds e bump via invoke_signed ou CPI with_signer.
#[account(
seeds = [b"escrow", maker.key().as_ref()],
bump,
)]
pub escrow: Account<'info, Escrow>,Quando usar: O programa precisa custodiar ativos ou armazenar estado canônico em um endereço determinístico.
use anchor_lang::prelude::*;
#[account]
#[derive(InitSpace)]
pub struct Escrow {
pub maker: Pubkey,
pub escrow_id: u64,
pub bump: u8,
}
// `escrow_id` é um argumento da instrução, então a struct de contas deve
// declará-lo com #[instruction(..)] antes que as seeds possam referenciá-lo.
#[derive(Accounts)]
#[instruction(escrow_id: u64)]
pub struct InitEscrow<'info> {
#[account(
init,
payer = maker,
space = 8 + Escrow::INIT_SPACE,
seeds = [b"escrow", maker.key().as_ref(), escrow_id.to_le_bytes().as_ref()],
bump,
)]
pub escrow: Account<'info, Escrow>,
#[account(mut)]
pub maker: Signer<'info>,
pub system_program: Program<'info, System>,
}
pub fn init_escrow(ctx: Context<InitEscrow>, escrow_id: u64) -> Result<()> {
let escrow = &mut ctx.accounts.escrow;
escrow.maker = ctx.accounts.maker.key();
escrow.escrow_id = escrow_id;
// O Anchor NÃO persiste o bump para você - escreva-o você mesmo.
escrow.bump = ctx.bumps.escrow;
Ok(())
}O que isso demonstra:
bump encontra o bump canônico fora da curva; ctx.bumps.escrow o expõeEscrow::INIT_SPACE só existe por causa de #[derive(InitSpace)]#[instruction(..)]Pubkey::find_program_address(seeds, program_id) retorna (endereço, bump). O Anchor encapsula isso em restrições.
Apenas o programa que possui as seeds da PDA pode assinar, a menos que você use um ID de programa externo nas seeds (avançado).
Account com uma restrição de seeds e assine apenas dentro de CPIs.| Alternativa | Use quando | Não use quando |
|---|---|---|
| Contas de propriedade de Keypair | Assinatura externa necessária | Custódia pelo programa |
seeds::program para PDAs externas | CPI para PDAs de programas estrangeiros | Estado do próprio programa |
0.32.1 em toda esta seção.
Não. Use restrições de seeds e assinatura em CPIs.
No campo da sua struct de conta, definido na inicialização.
Use @solana/kit 7.0.0 com bytes de seed correspondentes.
O endereço declare_id do seu programa Anchor.
Não no array de seeds; o bump é um parâmetro separado para find_program_address.
Compare as chaves logadas; verifique as seeds e o ID do programa no lado do cliente.
Sim, quando armazenam dados; financie com o pagador na inicialização.
Sim, com as mesmas seeds de signatário para cada CPI.
Veja os links em Relacionados para tópicos mais aprofundados sobre PDAs.
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.
Revisado por Chris St. John·Última atualização: 16 de jul. de 2026