Визначення

Log (журнал транзакцій) — це послідовність текстових записів, які генерує програма під час виконання транзакції в мережі Solana. Логи не зберігаються як окремий стан у блокчейні, а додаються до метаданих транзакції та повертаються через RPC-запити. Їхня головна роль — дати розробнику зрозуміти, що саме відбулося всередині програми: які гілки коду спрацювали, які значення обчислилися і де виникла помилка.

Як працює

Коли валідатор обробляє транзакцію, він послідовно виконує інструкції. Під час виконання кожної інструкції програма може виводити повідомлення за допомогою макросу msg! у Rust або Anchor. Ці повідомлення разом із системними записами рантайму формують єдиний журнал транзакції.

Рантайм Solana автоматично додає власні записи: початок і кінець виклику програми, глибину вкладених викликів через CPI, спожиті обчислювальні одиниці та результат виконання. Усе це повертається у полі logs у відповіді на RPC-методи getTransaction або simulateTransaction.

Важливі обмеження:

  • Логи не є частиною стану блокчейну — їх не можна прочитати з іншої програми під час виконання.
  • Загальний розмір логів транзакції обмежений, тому вони непридатні для зберігання структурованих даних.
  • Логи формуються лише під час виконання; якщо транзакція не потрапила в блок, логів у стовпчику не буде.

Приклад

У програмі на Anchor розробник додає діагностичне повідомлення перед перевіркою балансу:

msg!("Transfer initiated: from {} to {}", from.key(), to.key());

Після відправки транзакції через RPC розробник отримує такий журнал:

Program 7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU invoke [1]
Program log: Instruction: Transfer
Program log: Transfer initiated: from 9WzDX... to 4NdUm...
Program 7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU success

За цими рядками видно точний порядок викликів, аргументи, які передала програма, і фінальний статус виконання.

Типова помилка

Найпоширеніша помилка — використання логів як сховища даних. Іноді розробники намагаються записати в msg! структуровану інформацію (наприклад, JSON-обʼєкти з результатами аукціону), щоб потім розібрати її клієнтом. Це працює локально, але ламається в продакшені з трьох причин: обмеження розміру логів, відсутність гарантії цілісності текстового формату при обрізанні та неможливість програмно прочитати логи іншої транзакції зсередини програми. Для зберігання даних слід використовувати акаунти, а логи — виключно для діагностики.

Пов'язані матеріали

Внутрішні переходи

  • Syscall — системні виклики, через які програма взаємодіє з рантаймом, зокрема для виведення логів.
  • SPL Token — приклад програми, що генерує детальні логи під час операцій із токенами (перекази, mint, burn).

Додаткові ресурси

  • Документація Solana: розділ про інструкції та формат відповіді getTransaction — для точного розуміння структури поля logs.
  • Офіційна документація Anchor: макрос msg! та рекомендації з діагностики.

Джерела