I Program Derived Address (PDA) sono indirizzi di account a 32 byte derivati in
modo deterministico da un ID programma e un insieme di seed. Sono garantiti per
non trovarsi sulla curva Ed25519, il che significa che non esiste alcuna chiave
privata per essi. Solo il programma il cui ID è stato utilizzato nella
derivazione può "firmare" per un PDA, e lo fa attraverso
invoke_signed durante le invocazioni cross-program (CPI).
Program Derived Address
Derivazione PDA
Algoritmo di derivazione, bump canonico, esempi di findProgramAddress con diversi tipi di seed.
Account PDA
Creazione di account agli indirizzi PDA, firma invoke_signed, pattern Anchor.
Concetti chiave
- Deterministico: gli stessi seed e ID programma producono sempre lo stesso indirizzo.
- Fuori curva: l'indirizzo derivato è verificato per non essere una chiave pubblica Ed25519 valida. Se l'hash capita di trovarsi sulla curva, la derivazione fallisce e viene provato un bump seed diverso.
- Nessuna chiave privata: poiché l'indirizzo è fuori curva, nessuno può
produrre una firma crittografica per esso. Il programma "firma" tramite il
meccanismo
invoke_signeddel runtime.
Quando utilizzare i PDA
- Indirizzamento deterministico: deriva lo stesso account dagli stessi seed ogni volta.
- Firma del programma: solo il programma proprietario può firmare tramite
invoke_signed, consentendo ai programmi di agire come autorità autonome. - Stato per utente: deriva account per utente dai seed pubkey dell'utente
(ad es.,
["user", user_pubkey]). - Nessuna gestione di keypair: nessuna chiave privata da memorizzare o perdere. L'indirizzo è derivato puramente dai seed.
Limiti
| Limite | Valore | Fonte |
|---|---|---|
| Seed massimi | 16 | MAX_SEEDS |
| Lunghezza massima seed | 32 byte massimo per seed | MAX_SEED_LEN |
| Range bump | 0-255 (1 byte) | Aggiunto come elemento seed finale |
Costo create_program_address | 1.500 CU | create_program_address_units |
Costo worst-case find_program_address | 1.500 iniziali + 1.500 x iterazioni | 1.500 all'ingresso + 1.500 per ogni bump fallito |
| Firmatari PDA massimi per CPI | 16 | MAX_SIGNERS |
Is this page helpful?