Derivando PDAs
PDAs são derivadas de seeds e um ID de programa. find_program_address retorna o endereço canônico off-curve e a seed de bump necessária para invoke_signed.
Busque em todas as páginas da documentação
PDAs são derivadas de seeds e um ID de programa. find_program_address retorna o endereço canônico off-curve e a seed de bump necessária para invoke_signed.
let (pda, bump) = Pubkey::find_program_address(
&[b"metadata", mint.key.as_ref()],
program_id,
);Quando usar isto:
pub fn verify_config(config: &AccountInfo, authority: &Pubkey, program_id: &Pubkey, stored_bump: u8) -> ProgramResult {
let (expected, bump) = Pubkey::find_program_address(&[b"config", authority.as_ref()], program_id);
if expected != *config.key || bump != stored_bump {
return Err(ProgramError::InvalidSeeds);
}
Ok(())
}O que isto demonstra:
InvalidSeeds em caso de incompatibilidade.| Restrição | Valor |
|---|---|
| Contagem de seeds | <= 16 |
| Tamanho da seed | <= 32 bytes cada |
let bump_seed = [bump];
let signer_seeds: &[&[u8]] = &[b"vault", owner.as_ref(), &bump_seed];
// invoke_signed espera &[&[&[u8]]] - envolva o grupo mais uma vez:
invoke_signed(&ix, account_infos, &[signer_seeds])?;invoke_signed falha. Correção: Anexe o slice &[bump]..as_bytes() consistentemente. Correção: Documente a codificação.id.to_le_bytes(). Correção: Evite empacotamento ambíguo.| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
| create_program_address | Bump conhecido | Bump desconhecido |
Macro seeds do Anchor | Ergonômico | Nativo explícito |
| Derivação apenas off-chain | Economiza CU | Precisa verificar on-chain |
find busca o bump; create exige o bump exato.
PDAs diferentes - por design.
Desencorajado - use um prefixo constante.
Documente; mudar a ordem muda o endereço.
Não garantido - armazene o bump real.
@solana/kit getProgramDerivedAddress.
Faça snapshot do pda+bump nos testes.
Semânticas diferentes precisam de prefixos diferentes.
Não, se o ID do programa não for alterado.
Adicione bytes de desambiguação.
16 seeds por derivação.
Evite - use o bump armazenado.
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: 19 de jul. de 2026