Noções Básicas de PDA
10 exemplos para você começar com PDAs - 7 básicos e 3 intermediários.
Busque em todas as páginas da documentação
10 exemplos para você começar com PDAs - 7 básicos e 3 intermediários.
solana address off-chain.Clientes encontram PDA + bump antes de montar transações.
use solana_program::pubkey::Pubkey;
let program_id = Pubkey::new_unique();
let (pda, bump) = Pubkey::find_program_address(&[b"vault"], &program_id);find_program_address tenta bumps de 255 a 0.Transações referenciam o pubkey da PDA como qualquer conta.
// AccountMeta::new(pda, false) - PDA não é signatário de carteirainvoke_signed do programa.Seeds são strings de bytes - pubkeys, strings, números.
let seeds: &[&[u8]] = &[b"escrow", buyer.as_ref(), seller.as_ref()];Mudar o program id muda o endereço da PDA.
Pubkey::find_program_address(seeds, program_id);Usuários finais nunca possuem chaves privadas de PDA.
// Apenas o programa proprietário pode assinar pela PDA via invoke_signedPDAs são intencionalmente off da curva ed25519.
// Off-chain: Pubkey::create_program_address valida o bumpcreate_program_address falha se on-curve.find_program_address busca o bump válido.Apenas o programa que derivou pode assinar pela PDA.
invoke_signed(&ix, accounts, &[&[b"vault", &[bump]]])?;Salve o bump no init para evitar busca on-chain.
pub struct Vault { pub bump: u8, pub total: u64 }seeds[bump] == stored_bump em cada ix.Relacionado: Bumps Canônicos - armazenamento de bump
Contas de token podem usar PDA como autoridade.
// seeds: [b"token", mint.key.as_ref(), owner.as_ref()]invoke_signed.Relacionado: PDAs como Autoridades - vaults
Conjuntos de seeds diferentes não devem colidir semanticamente.
const PREFIX_VAULT: &[u8] = b"vault";
const PREFIX_ESCROW: &[u8] = b"escrow";Relacionado: Design de Seeds e Colisões - regras de design
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