Program Derived Addresses (PDA) — это 32-байтные адреса аккаунтов, которые
детерминированно вычисляются из идентификатора программы и набора seed.
Гарантируется, что такие адреса не лежат на кривой Ed25519, то есть для них не
существует приватного ключа. Только программа, чей идентификатор использовался
при вычислении, может "подписывать" для PDA, делая это через
invoke_signed во время межпрограммных вызовов (CPI).
Program Derived Address
Вычисление PDA
Алгоритм вычисления, канонический bump, примеры findProgramAddress с разными типами seed.
PDA-аккаунты
Создание аккаунтов по адресам PDA, подпись через invoke_signed, паттерны Anchor.
Основные факты
- Детерминированность: Одни и те же seed и идентификатор программы всегда дают один и тот же адрес.
- Вне кривой: Полученный адрес гарантированно не является допустимым публичным ключом Ed25519. Если хэш попадает на кривую, вычисление не удаётся, и пробуется другой bump seed.
- Нет приватного ключа: Так как адрес вне кривой, никто не может создать
криптографическую подпись для него. Программа "подписывает" через механизм
invoke_signedрантайма.
Когда использовать PDA
- Детерминированные адреса: Каждый раз получать один и тот же аккаунт из одних и тех же seed.
- Подпись программой: Только владеющая программа может подписывать через
invoke_signed, что позволяет программам выступать автономными авторитетами. - Пользовательское состояние: Получать аккаунты для каждого пользователя из
его pubkey как seed (например,
["user", user_pubkey]). - Без управления keypair: Нет приватного ключа, который нужно хранить или можно потерять. Адрес вычисляется только из seed.
Ограничения
| Ограничение | Значение | Источник |
|---|---|---|
| Максимум seed | 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?