Program Derived Addresses (PDA) — це 32-байтові адреси акаунтів, які
детерміновано виводяться з ID програми та набору seeds. Вони гарантовано не
лежать на кривій Ed25519, що означає, що для них не існує приватного ключа. Лише
програма, чий ID було використано при виведенні, може «підписувати» за PDA, і
робить це через invoke_signed під час міжпрограмних викликів
(CPI).
Program Derived Address
Виведення PDA
Алгоритм виведення, канонічний bump, приклади findProgramAddress з різними типами seeds.
Акаунти PDA
Створення акаунтів за адресами PDA, підписування invoke_signed, патерни Anchor.
Ключові факти
- Детерміновані: Однакові seeds та ID програми завжди генерують однакову адресу.
- Поза кривою: Виведена адреса перевіряється на те, що вона не є валідним публічним ключем Ed25519. Якщо хеш випадково потрапляє на криву, виведення не вдається і пробується інший bump seed.
- Без приватного ключа: Оскільки адреса поза кривою, ніхто не може створити
криптографічний підпис для неї. Програма «підписує» через механізм
invoke_signedruntime замість цього.
Коли використовувати PDA
- Детерміноване адресування: Виводьте той самий акаунт з тих самих seeds кожного разу.
- Підписування програмою: Лише програма-власник може підписувати через
invoke_signed, що дозволяє програмам діяти як автономні авторитети. - Стан з прив'язкою до користувача: Виводьте акаунти для кожного користувача
з seeds pubkey користувача (наприклад,
["user", user_pubkey]). - Без управління keypair: Немає приватного ключа для зберігання чи втрати. Адреса виводиться виключно з seeds.
Обмеження
| Обмеження | Значення | Джерело |
|---|---|---|
| Макс. кількість seeds | 16 | MAX_SEEDS |
| Макс. довжина seed | 32 байти максимум на seed | MAX_SEED_LEN |
| Діапазон bump | 0-255 (1 байт) | Додається як останній елемент seed |
Вартість create_program_address | 1 500 CU | create_program_address_units |
Найгірший випадок find_program_address | 1 500 на вхід + 1 500 × ітерації | 1 500 на вхід + 1 500 за кожен невдалий bump |
| Макс. PDA підписантів на CPI | 16 | MAX_SIGNERS |
Is this page helpful?