Визначення

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 для інструкцій.

Джерела