Визначення
Sysvar (System Variable) — це спеціальний тип акаунтів у Solana, які зберігають поточний стан середовища виконання (runtime). Їх створює й оновлює сама мережа, а смарт-контракти читають ці дані під час обробки транзакцій. Кожен sysvar має фіксовану адресу, обчислену через PDA, і є доступним лише для читання.
Як працює
За структурою sysvar є звичайним акаунтом, але з двома ключовими особливостями:
- Його адресу обчислює виконавче середовище на основі назви змінної — вона завжди однакова для всієї мережі.
- Вміст формує runtime, а не користувач чи стороння програма.
Щоб отримати доступ до sysvar, смарт-контракт указує відповідний акаунт у списку акаунтів інструкції. Перед виконанням runtime автоматично заповнює його актуальними даними. У фреймворку Anchor достатньо оголосити тип — наприклад, Sysvar<Clock> — і фреймворк сам визначить правильну адресу.
Серед найчастіше використовуваних sysvar:
- Clock — поточний слот, Unix-час та номер епохи
- Rent — актуальні тарифи на оренду простору в блокчейні
- RecentBlockhashes — останні хеші блоків для обробки транзакцій
- Fees — поточні комісії мережі
- EpochSchedule — розклад епох
Приклад
Уявіть смарт-контракт, який має заблокувати токени до певної дати. Контракт не отримує час від користувача — це створило б вектор для маніпуляцій. Натомість він читає sysvar Clock і порівнює збережену дату з полем unix_timestamp.
У Anchor структура акаунтів виглядала б так: у поле clock передається тип Sysvar<Clock>, фреймворк автоматично підставляє правильну адресу, а runtime гарантує актуальність даних. Контракт порівнює clock.unix_timestamp із заданим порогом і дозволяє або забороняє розблокування.
Типова помилка
Найпоширеніша помилка — спроба записати дані в sysvar-акаунт. Будь-яка інструкція, що намагається змінити вміст sysvar, відхиляється на рівні runtime. Тому при передачі sysvar у список акаунтів обовʼязково вказувати is_writable = false.
Інша помилка — вручну обчислювати адресу sysvar замість використання вбудованих інструментів SDK або Anchor. Це призводить до помилок, оскільки адреса залежить від внутрішніх параметрів, які можуть змінюватися при оновленнях мережі.
Пов'язані матеріали
Внутрішні переходи
- Clock — детальний огляд sysvar, який надає інформацію про час, слоти та епохи
- Nonce — пояснення механізму nonce-акаунтів та їхньої ролі в обробці транзакцій
- PDA — як обчислюються адреси sysvar через Program Derived Address