Derivação de PDA no Client
Clientes devem derivar as mesmas PDAs que as constraints seeds on-chain. Use bytes de seed, ordem e program ID idênticos.
Receita
import { getProgramDerivedAddress } from "@solana/kit";
const [pda] = await getProgramDerivedAddress({
programAddress: programId,
seeds: ["escrow", addressEncoder.encode(maker), u64ToLeBytes(escrowId)],
});Quando usar: Construir transações que passam contas PDA para instruções Anchor.
Exemplo prático
import { address, getProgramDerivedAddress, getBytesEncoder } from "@solana/kit";
const programId = address("Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS");
const [escrowPda] = await getProgramDerivedAddress({
programAddress: programId,
seeds: [
new TextEncoder().encode("escrow"),
getBytesEncoder().encode(makerAddress),
new Uint8Array(new BigUint64Array([BigInt(escrowId)]).buffer),
],
});
// Passe escrowPda no mapa de contas correspondendo ao nome "escrow" no IDLO que isso demonstra:
- Strings de seed devem corresponder aos bytes de
b"escrow" - Pubkeys codificadas como 32 bytes brutos
- Inteiros usam a mesma endianness que Rust
to_le_bytes - Program ID é o endereço do programa Anchor
Aprofundamento
@solana/kit 7.0.0
Use helpers do kit para derivação de PDA e codificação de endereços. Compartilhe seed builders entre programa (constantes Rust) e client (módulo TS) via codegen ou constantes documentadas.
Testes
Afirme que a PDA do client corresponde aos fixtures de teste do Anchor para cada variante de seed.
Erros comuns
- Mismatch UTF-8 string vs b-string - Seeds diferentes.. Correção: Use literais de seed ASCII exatos.
- Seeds inteiras big-endian - Rust usa le on-chain.. Correção: Corresponda a
to_le_bytes. - Program ID errado no client - Deriva endereço errado.. Correção: Leia dos metadados do IDL ou Anchor.toml.
- Bump opcional passado incorretamente - Geralmente omita; programa valida.. Correção: Deixe constraint on-chain verificar bump.
- Confusão base58 vs bytes - Erros de codificação.. Correção: Use tipos de endereço do kit.
Alternativas
| Alternativa | Use quando | Não use quando |
|---|---|---|
| Helpers .pda do client TS Anchor | @coral-xyz/anchor legado | Greenfield @solana/kit |
| PDAs geradas por Codama | A partir de metadados de seeds do IDL | Matemática de seed manual |
FAQs
Qual versão do Anchor é assumida?
0.32.1 em toda esta seção.
Uma PDA pode ser Signer na struct accounts?
Não. Use constraints seeds e assinatura em CPI.
Onde o bump é armazenado?
No campo da sua struct de conta, definido na inicialização.
Como os clientes derivam PDAs?
Use @solana/kit 7.0.0 com bytes de seed correspondentes.
Qual program id é usado para PDAs?
O endereço declare_id do seu programa Anchor.
As seeds incluem bump?
Não no array seeds; bump é parâmetro separado para find_program_address.
Como depurar falhas de PDA?
Compare chaves logadas; verifique seeds e program id no client.
PDAs são rent-exempt?
Sim quando mantêm dados; financie com payer no init.
Uma PDA pode assinar múltiplos CPIs em uma ix?
Sim com as mesmas signer seeds para cada CPI.
O que ler em seguida?
Veja os links em Relacionados para tópicos mais profundos sobre derivação de PDA no client.
Relacionados
- PDAs no Anchor - seeds on-chain
- Geração de clients TS - codegen de client
- Derivação de PDA - derivação nativa
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.