Визначення

Anchor — це фреймворк для розробки програм на Solana, написаний мовою Rust. Він абстрагує низькорівневу роботу з байткодом, серіалізацією та валідацією облікових записів, надаючи розробнику зручні макроси та готові патерни. Головна мета Anchor — зробити написання безпечних смарт-контрактів на Solana швидшим і менш схильним до помилок.

Як працює

Anchor додає поверх базового Solana SDK шар автоматизації, який бере на себе найбільш повторювані та небезпечні завдання:

  • Валідація облікових записів. Макрос #[derive(Accounts)] автоматично перевіряє власників, права на запис, відповідність PDA (Program Derived Address) та інші обмеження до того, як виконається бізнес-логіка.
  • Серіалізація та десеріалізація. Замість ручної роботи з байтовими масивами Anchor використовує власні трейти AnchorSerialize та AnchorDeserialize, які узгоджені з форматом Borsh.
  • Обробка помилок. Єдина система кодів помилок через error! макрос замість ручного формування ProgramError.
  • IDL — Interface Definition Language. Anchor автоматично генерує опис інтерфейсу програми у форматі JSON. Клієнтські бібліотеки (TypeScript, Python) використовують цей IDL для створення типізованих викликів, що замінює ручне конструювання транзакцій.
  • Тестування. Вбудований тестовий клієнт anchor test підіймає локальний валідатор, розгортає програму та запускає тести на TypeScript без додаткових налаштувань.

Важливо розуміти: Anchor не замінює Solana SDK і не змінює модель виконання. Програма, написана на Anchor, компілюється у той самий BPF-байткод, що й «чистий» Rust. Фреймворк лише генерує boilerplate-код на етапі компіляції через процедурні макроси.

Приклад

Створення програми, яка зберігає число в обліковому записі. Без Anchor розробник вручну ініціалізує рахунок, серіалізує дані, перевіряє підписи та формує відповідь. З Anchor достатньо описати структуру даних та обмеження:

  • Структура MyAccount з полями та макросом #[account] визначає, як дані зберігаються в рахунку.
  • Структура контексту з #[derive(Accounts)] вказує, що рахунок має бути ініціалізованим, платник — підписантом, а система — системною програмою.
  • Функція-інструкція отримує готовий контекст із уже перевіреними обліковими записами і просто записує значення у поле.

Після компіляції Anchor генерує IDL, за яким клієнт на TypeScript викликає інструкцію як звичайну функцію з аргументами, не конструюючи транзакцію вручну.

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

Найпоширеніша помилка — спроба використовувати Anchor як чорну скриньку, не розуміючи базових концепцій Solana. Розробник додає обмеження mut до облікового запису, не усвідомлюючи, що це лише перевірка підпису та прав на запис у самій інструкції, але не гарантує захист від модифікації через CPI (Cross-Program Invocation) з іншої програми. Для повного захисту потрібно розуміти, як працюють seeds у PDA та які права дає has_one. Інша часта помилка — ігнорування того, що макроси Anchor розгортаються у звичайний Rust-код, і коли компілятор видає помилку всередині згенерованого макросу, розробник не знає, куди дивитися, бо не бачить проміжного коду.

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

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

  • SDK — базовий набір інструментів Solana, поверх якого працює Anchor. Розуміння SDK допомагає усвідомити, що саме фреймворк автоматизує.
  • Sealevel — паралельна середа виконання Solana, яка визначає, чому програми на Anchor компілюються у BPF-байткод і виконуються паралельно.

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

Офіційна документація Anchor (anchor-lang) містить актуальні приклади, довідник макросів та гайди з міграції між версіями. Оскільки фреймворк активно оновлюється, перед початком проєкту варто перевірити сумісність версії Anchor з поточною версією Solana CLI на офіційному репозиторії.

Джерела