Визначення
Program — це розгорнутий на блокчейні Solana код, який виконує задану логіку у відповідь на отримані інструкції. Термін еквівалентний поняттю «смарт-контракт» в інших блокчейнах, проте в екосистемі Solana навмисно використовують саме слово program, щоб підкреслити архітектурні відмінності: програми не зберігають стан усередині себе, а працюють із зовнішними обліковими записами (accounts).
Як працює
Програма компілюється у байт-код BPF (Berkeley Packet Filter) і розгортається в спеціалізований обліковий запис — executable account. Сама програма є лише логікою без власного стану. Усі дані, з якими вона працює, зберігаються в окремих облікових записах, які передаються під час виклику.
Процес виглядає так:
- Розробник пише код мовою Rust (або C/C++) і компілює його у BPF.
- Програма розгортається на блокчейні — її байт-код записується в executable account.
- Користувач формує транзакцію, яка містить одну чи кілька інструкцій. Кожна інструкція вказує на адресу програми та передає перелік облікових записів, які програма може читати або змінювати.
- Солана-валідатор завантажує байт-код програми в BPF-віртуальну машину і виконує його.
- Програма може викликати інші програми через механізм CPI (Cross-Program Invocation), передаючи їм частину доступних облікових записів.
Оскільки стан відокремлений від коду, Solana Runtime здатен паралельно виконувати різні програми, якщо вони не звертаються до спільних облікових записів. Це ключова перевага архітектури порівняно з моделями, де код і дані нерозривно пов'язані.
Приклад
Програма децентралізованої біржі на Solana не зберігає баланси користувачів усередині себе. Натомість вона отримує під час виклику три облікові записи: токен-акаунт продавця, токен-акаунт покупця та пул ліквідності. Програма перевіряє підписи, розраховує нові баланси та оновлює дані саме в цих облікових записах. Стан біржі — розмір пулу, курси, комісії — також зберігається в окремих облікових записах, які програма читає та модифікує.
Типова помилка
Найпоширеніша помилка — проектувати програму так, ніби вона володіє станом (як у Ethereum), і намагатися «зберегти» дані всередині неї. У Solana це неможливо: програма містить лише байт-код. Якщо розробник не створить і не передасть правильні облікові записи, програма просто не матиме де зберігати й читати дані, і виклик завершиться помилкою. Тому перший крок при проєктуванні будь-якої програми — визначити, які облікові записи потрібні, хто їх підписує і як вони ініціалізуються.
Пов'язані матеріали
Внутрішні переходи
- Instruction — як саме транзакція звертається до програми і що передає під час виклику.