Визначення
PDA (Program Derived Address) — це адреса облікового запису в мережі Solana, яка визначається детерміновано з ідентифікатора програми та набору сидів (seed), але не має відповідного приватного ключа. Така адреса належить програмі, і лише ця програма може підписувати транзакції від її імені.
Як працює
У Solana кожен обліковий запис має пару ключів: відкритий і закритий. PDA відрізняється тим, що його відкритий ключ генерується за допомогою криптографічної функції SHA-256 з аргументів program_id та одного або кількох сидів. Результат навмисно вибирається поза еліптичною кривою Ed25519, що гарантує відсутність приватного ключа.
Процес створення PDA виглядає так:
- Розробник визначає програму (program_id) та унікальні сиди — наприклад, ім'я користувача, ідентифікатор токена чи будь-які інші дані.
- Функція find_program_address обчислює хеш і, якщо точка потрапляє на криву, додає bump seed (зазвичай число від 255 до 0), поки не знайде точку поза кривою.
- Отримана адреса фіксується: ті самі program_id і сиди завжди дають той самий PDA.
Коли програмі потрібно підписати транзакцію від імені PDA, вона використовує механізм invoke_signed, передаючи bump seed як доказ права на підпис. Це дозволяє PDA виконувати роль автономного «смарт-контракту з власним гаманцем» — зберігати токени, змінювати стан, взаємодіяти з іншими програмами.
Приклад
Уявіть децентралізовану біржу на Solana, де кожна торговельна пара має свій обліковий запис із ліквідністю. Замість того, щоб користувач створював цей обліковий запис своїм ключем, програма біржі генерує PDA із сидами "liquidity_pool" та "SOL-USDC". Тепер лише програма біржі може керувати цими коштами: додавати ліквідність, проводити свопи, стягувати комісію. Користувач не може вивести токени з цього PDA безпосередньо, бо у нього немає приватного ключа — безпека забезпечена архітектурно.
Типова помилка
Найпоширеніша помилка — спроба імпортувати PDA у гаманець (Phantom, Solflare тощо) і підписати транзакцію вручну. Оскільки PDA не має приватного ключа, жоден гаманець не зможе його відкрити. Інша часта помилка — використання нестабільних сидів, наприклад поточного часу або випадкового числа. Це призводить до того, що програма не зможе відновити той самий PDA пізніше, і доступ до даних буде втрачено назавжди.
Пов'язані матеріали
Внутрішні переходи
- Instruction — дізнайтеся, як інструкції передають PDA як облікові записи під час виклику програми.
- CPI (Cross-Program Invocation) — розберіться, як програма підписує транзакції від імені PDA під час виклику іншої програми.
Додаткові ресурси
- Офіційна документація Solana: розділ про Program Derived Addresses та механізм invoke_signed.
- Документація фреймворку Anchor: розділ про макрос seeds та обмеження constraint для перевірки PDA під час виклику.