Визначення
Instruction (інструкція) — це базова одиниця виконання в Solana, яка містить усе необхідне для одного виклику програми: ідентифікатор програми, список рахунків, з якими вона працює, та серіалізовані дані з параметрами виклику. Інструкція не виконується самостійно — вона завжди є частиною транзакції.
Як працює
Кожна інструкція складається з трьох обовʼязкових частин:
- program_id — адреса програми, яка має обробити інструкцію (наприклад, System Program або кастомна програма на Rust);
- accounts — масив рахунків, які інструкція може читати або записувати. Для кожного рахунка вказується, чи потрібен підпис (signer), чи він доступний лише для читання (writable/readable);
- data — байтовий масив із параметрами виклику. Формат цього масиву визначає сама програма — зазвичай це перший байт-дискримінатор, за яким ідуть аргументи.
Коли транзакція потрапляє до кластера, Solana Runtime послідовно передає кожну інструкцію відповідній програмі. Програма десеріалізує data, перевіряє рахунки та виконує логіку. Якщо хоча б одна інструкція в транзакції завершується помилкою — відкочуються всі зміни по всій транзакції.
Одна транзакція може містити кілька інструкцій, у тому числі звернення до різних програм. Це дозволяє реалізувати складні операції (наприклад, свап токенів через AMM із наступним стейкінгом) в одному атомарному пакеті.
Приклад
Користувач хоче переказати 0.5 SOL іншому гаманцю. Для цього формується транзакція з однією інструкцією:
- program_id — адреса System Program (
11111111111111111111111111111111); - accounts — два рахунки: відправник (signer, writable) та одержувач (writable);
- data — серіалізована команда
Transferз полемlamports (0.5 SOL у лампортів).
Runtime бачить program_id, маршрутизує інструкцію до System Program, та програма виконує переведення коштів між вказаними рахунками.
Типова помилка
Найчастіша плутанина — ототожнення інструкції з транзакцією або з програмою. Програма — це розгорнутий код (smart contract), який знає, як обробляти різні команди. Інструкція — це конкретний виклик однієї такої команди з певними параметрами. Транзакція — це контейнер, який обʼєднує одну або кілька інструкцій, додає до них загальні підписи та fee, і відправляється в мережу як єдине ціле.
Інша поширена помилка — передати в інструкції рахунок як writable, коли програма його не змінює. Це не призведе до помилки виконання, але збільшить розмір транзакції та підвищить комісію, оскільки writable-рахунки важчі для обробки.
Пов'язані матеріали
Внутрішні переходи
- Program — дізнайтеся, як програма в Solana отримує та обробляє інструкції, і чому одна програма може обслужити безліч різних інструкцій.
- PDA (Program Derived Address) — спеціальні адреси, які програми використовують як власні рахунки; інструкції часто звертаються саме до PDA для читання чи запису стану.
Додаткові ресурси
- Офіційна документація Solana: розділ Transactions та Instruction format — для розуміння бітової структури інструкції на рівні серіалізації.
- Репозиторій Anchor Framework: приклади того, як макроси
#[instruction(...)]автоматично генерують та парсять data для інструкцій.