Розробка на Solana — це процес створення смарт-контрактів (програм), клієнтських додатків та інфраструктурних рішень, які працюють у межах архітектури цієї блокчейн-мережі. Нижче наведено ключові терміни, які потрібні для розуміння того, як пишуться, розгортаються та виконуються програми на Solana.
Program
Визначення
Program — це смарт-контракт на Solana, скомпільований у байт-код BPF (Berkeley Packet Filter). На відміну від EVM-контрактів, програма Solana не зберігає стан усередині себе.
Як працює
Програма розгортається в окремий акаунт. Під час виконання вона читає та записує дані в інші акаунти, які передані в інструкції. Сама програма залишається незмінною (stateless), а весь стан живе в акаунтах даних.
Приклад
Програма токен-свіпу отримує два акаунти токенів та акаунт користувача, зчитує баланси, обчислює курс і оновлює дані в акаунтах — але сама не зберігає жодного стану.
Типова помилка
Проєктувати програму так, ніби вона тримає стан (як у Solidity). На Solana стан завжди зберігається в акаунтах, а програма лише визначає правила його зміни.
Пов'язані матеріали
Account data, BPF Loader, Runtime
Instruction
Визначення
Instruction — це базова одиниця дії в транзакції Solana. Кожна транзакція містить одну або кілька інструкцій, які виконуються послідовно.
Як працює
Інструкція складається з трьох частин: ідентифікатор програми (program_id), масив акаунтів, які потрібні для виконання, та байтові дані (data), що описують саму дію. Runtime перевіряє підписи та права доступу до акаунтів перед передачею управління програмі.
Приклад
Інструкція переказу SOL містить program_id (System Program), акаунти відправника й одержувача та дані з сумою переказу в форматі, який очікує System Program.
Типова помилка
Забути передати акаунт, який потрібен програмі лише для читання, але без якого вона завершується помилкою. Кожен акаунт, до якого програма звертається, має бути в масиві інструкції.
Пов'язані матеріали
Program, CPI
PDA (Program Derived Address)
Визначення
PDA — це детерміновано згенерована адреса акаунта, яка не має відповідного приватного ключа (не лежить на кривій ed25519). Такий акаунт контролюється програмою.
Як працює
PDA обчислюється як хеш від program_id та набору сидів (seed). Оскільки результат може потрапити на криву, Solana додає bump-значення (від 255 до 0), поки не знайде точку поза кривою. Програма може підписувати від імені PDA за допомогою bump-значення.
Приклад
У стейкінг-програмі кожен користувач має власний акаунт-сховище (vault), адреса якого — PDA, похідна від pubkey користувача та сиду "vault". Тільки програма може витрачати кошти з цього сховища.
Типова помилка
Обчислювати bump вручну замість використання findProgramAddressSync, який автоматично знаходить правильне значення. Збережений bump треба перевіряти при кожному зверненні до PDA.
Пов'язані матеріали
Program, Account data, CPI
CPI (Cross-Program Invocation)
Визначення
CPI — це механізм, за якого одна програма викликає іншу програму під час виконання транзакції.
Як працює
Програма формує нову інструкцію та передає її runtime через invoke або invoke_signed. У другому випадку програма підписує від імені PDA, що дозволяє цільовій програмі перевірити авторизацію. Глибина вкладених викликів обмежена (зазвичай до 4 рівнів).
Приклад
Кастомна програма дексу через CPI викликає Token Program для mint-токенів на акаунт користувача після успішного свопу.
Типова помилка
Не передати правильні сиди та bump у invoke_signed, коли цільова програма очікує підпис PDA. Це призводить до помилки авторизації, яку важко відладити без логів.
Пов'язані матеріали
Program, PDA, Instruction
IDL (Interface Definition Language)
Визначення
IDL — це файл опису інтерфейсу програми Solana, аналогічний ABI в Ethereum. Містить інформацію про методи, акаунти, типи та структури даних.
Як працює
IDL генерується автоматично при розгортанні програми, написаної на Anchor. Клієнтські бібліотеки використовують IDL для створення типізованих викликів методів та серіалізації даних без ручного конструювання байтових буферів.
Приклад
IDL вказує, що метод create_account приймає параметри owner: PublicKey та lamports: u64. Фронтенд на TypeScript використовує цей опис для автодоповнення та перевірки типів.
Типова помилка
Використовувати старий IDL після оновлення програми. Зміна структури акаунтів або методів без оновлення IDL на клієнті призводить до невідповідності серіалізації та збоїв транзакцій.
Пов'язані матеріали
Anchor, SDK
Compute units
Визначення
Compute units — це одиниця виміру обчислювальних ресурсів на Solana. Кожна інструкція в програмі споживає певну кількість compute units.
Як працює
Транзакція має ліміт compute units (за замовчуванням 200 000, максимум 1 400 000 з додатковою комісією за пріоритет). Runtime рахує спожиті одиниці під час виконання та перериває транзакцію, якщо ліміт вичерпано.
Приклад
Простий переказ SOL споживає приблизно 150 compute units. Транзакція складного DeFi-свопу з кількома CPI може потребувати 300 000 і більше.
Типова помилка
Встановлювати ліміт занадто низьким (транзакція падає) або занадто високим (переплата). Визначайте реальне споживання в devnet і встановлюйте ліміт із невеликим запасом.
Пов'язані матеріали
Runtime, RPC
RPC (Remote Procedure Call)
Визначення
RPC — це інтерфейс взаємодії клієнта з вузлами Solana мережі за протоколом JSON-RPC.
Як працює
Клієнт надсилає HTTP-запит із методом (наприклад, getBalance, sendTransaction, getAccountInfo) та параметрами. Вузол виконує запит і повертає відповідь у форматі JSON. Існують публічні та приватні (платні) RPC-ендпоінти з різними лімітами та затримками.
Приклад
Фронтенд викликає getAccountInfo через RPC, щоб прочитати стан програми та відобразити баланс користувача без підписування транзакції.
Типова помилка
Використовувати публічний RPC для продакшену. Rate limits (обмеження частоти запитів) та висока затримка призводять до помилок та повільного завантаження даних у користувачів.
Пов'язані матеріали
SDK, Compute units
SDK
Визначення
SDK (Software Development Kit) — це набір бібліотек та інструментів для створення клієнтських додатків, що взаємодіють із Solana.
Як працює
SDK інкапсулює роботу з RPC, побудову транзакцій, серіалізацію даних та управління ключами у типізовані функції. Основний SDK для JavaScript/TypeScript — @solana/web3.js, для Rust — solana-sdk.
Приклад
Клас Connection з @solana/web3.js автоматично обробляє всі RPC-виклики: від отримання балансу акаунта до відправки підписаної транзакції та перевірки її статусу.
Типова помилка
Не вказувати рівень коміту (commitment) при створенні Connection. За замовчуванням використовується "finalized", але для багатьох операцій достатньо "confirmed" — це значно прискорює відповіді.
Пов'язані матеріали
RPC, IDL
Anchor
Визначення
Anchor — це фреймворк для розробки програм на Solana, який зменшує кількість шаблонного коду та підвищує безпеку через автоматичну перевірку акаунтів.
Як працює
Anchor використовує атрибути (макроси) для опису структур акаунтів та методів. Фреймворк автоматично перевіряє власника акаунта, права на запис, наявність підписів та генерує IDL. Це різко скорочує обсяг ручних перевірок у порівнянні з чистим Rust.
Приклад
Атрибут #[account(mut, seeds = [b"vault", user.key().as_ref()], bump = vault.bump)] автоматично перевіряє, що акаунт належить поточній програмі, є PDA з правильними сидами та дозволяє запис.
Типова помилка
Довіряти Anchor "на сліпо" без розуміння, які саме перевірки виконують атрибути. Неправильна конфігурація constraints може залишити вразливість, яку фреймворк не покриває.
Пов'язані матеріали
IDL, Program, Account data
Sealevel
Визначення
Sealevel — це рушій виконання (execution engine) Solana, який забезпечує паралельне виконання транзакцій на рівні інструкцій.
Як працює
Sealevel аналізує, до яких акаунтів звертається кожна транзакція (читання чи запис). Транзакції, що не перетинаються за акаунтами для запису, виконуються паралельно. Це фундаментальна причина високої пропускної здатності мережі.
Приклад
Два користувачі одночасно свопають різні пари токенів. Оскільки вони записують у різні акаунти пулів ліквідності, Sealevel виконує ці транзакції паралельно на різних ядрах процесора.
Типова помилка
Проєктувати програму так, щоб вона записувала в спільний акаунт (наприклад, глобальний лічильник) при кожній операції. Це створює вузьке місце і блокує паралелізм Sealevel.
Пов'язані матеріали
Runtime, Compute units
Runtime
Визначення
Runtime — це середовище виконання Solana, яке керує життєвим циклом транзакції: від валідації до завершення.
Як працює
Runtime перевіряє підписи, рахує compute units, забезпечує ізоляцію програм, керує доступом до акаунтів та викликає BPF Loader для запуску байт-коду. Він також відкочує всі зміни в акаунтах, якщо транзакція завершується помилкою на будь-якому етапі.
Приклад
Якщо інструкція намагається записати в акаунт, який не позначений як writable, Runtime негайно відхиляє транзакцію ще до передачі управління програмі.
Типова помилка
Припускати, що поведінка Runtime на devnet повністю збігається з mainnet. Деякі ліміти та конфігурації відрізняються, тому критичні сценарії треба перевіряти на testnet або mainnet-beta.
Пов'язані матеріали
Sealevel, Compute units, Syscall
Account data
Визначення
Account data — це байтове сховище, прикріплене до акаунта Solana, де зберігається стан програми. Максимальний розмір — 10 МБ.
Як працює
Кожен акаунт має поле data, яке програма читає та десеріалізує під час виконання. Формат даних визначає сама програма: це може бути Borsh, BINCODE або кастомна серіалізація. При закритті акаунта дані треба обнулити заради безпеки.
Приклад
Акаунт пулу ліквідності зберігає баланси двох токенів, комісію, загальну кількість LP-токенів та адресу адміністратора — все це серіалізовано в байтовий масив.
Типова помилка
Не обнуляти дані при закритті акаунта (встановлювати data_len у 0 та передати lamports на адресу системної програми). Залишені дані можуть бути прочитані іншими програмами, що створює ризик витоку інформації.
Пов'язані матеріали
Program, PDA, Anchor
BPF Loader
Визначення
BPF Loader — це програма Solana, яка відповідає за завантаження, верифікацію та виконання байт-коду BPF.
Як працює
Коли транзакція звертається до програми, Runtime передає управління BPF Loader. Той перевіряє цілісність байт-коду, завантажує його в ізольоване середовище та починає виконання. Існує кілька версій: BPF Loader v2 — основна для розгортання програм, BPF Loader Upgradeable — для оновлюваних програм.
Приклад
Під час команди solana program deploy інструмент CLI компілює Rust-код у .so файл та відправляє транзакцію, яка записує байт-код у акаунт програми через BPF Loader v2.
Типова помилка
Використовувати BPF Loader v1 для нових програм. Ця версія застаріла та має обмеження. Завжди перевіряйте, що program_id вашої програми належить BPFLoader2111111111111111111111111111111111 (v2) або відповідному upgradeable loader.
Пов'язані матеріали
Program, Runtime, Syscall
Syscall
Визначення
Syscall (системний виклик) — це інтерфейс, через який програма Solana звертається до послуг Runtime.
Як працює
Програма викликає predefined syscall за номером. Доступні syscalls: sol_log (запис у лог), sol_memcpy (копіювання пам'яті), sol_clock_get (отримання часу), криптографічні операції та інші. Список syscalls фіксований і обмежений з міркувань безпеки та детермінованості.
Приклад
msg!("Hello") у Rust розгортається в виклик sol_log_64, який записує рядок у журнал транзакції для налагодження.
Типова помилка
П намагатися виконати мережеві запити, читати файлову систему або викликати зовнішні API через syscalls. Solana syscalls строго обмежені — програма не має доступу до зовнішнього світу під час виконання.
Пов'язані матеріали
Runtime, BPF Loader, Log (журнал транзакцій)
Log (журнал транзакцій)
Визначення
Log — це записаний вивід програми під час виконання транзакції, який можна переглянути після її завершення через RPC або блок-експлорер.
Як працює
Програма записує повідомлення в лог через syscall sol_log. Runtime збирає всі записи та повертає їх разом із метаданими транзакції. Логи не впливають на виконання і не зберігаються в стані мережі — вони існують лише в контексті конкретної транзакції.
Приклад
Рядок "Program 7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU log: Instruction: Initialize" показує, що програма зазначеним адресою обробила інструкцію Initialize.
Типова помилка
Покладатися на логи як на частину бізнес-логіки програми. Логи призначені виключно для налагодження. Вони не доступні самій програмі під час виконання і не є надійним джерелом даних для клієнта.
Пов'язані матеріали
Syscall, RPC, Runtime