Skip to main content
Эта страница переведена с помощью ИИ. За эталон принимается английская версия.Открыть английскую версию →
Новые программы Raydium (CPMM, CLMM, Farm v6, LaunchLab) написаны на Anchor — фреймворке на Rust, который расширяет нативную модель программ Solana, добавляя валидацию аккаунтов, обработку ошибок и IDL (описание интерфейса). AMM v4 и более старые фермы предшествуют Anchor. Понимание обеих парадигм помогает читать код, генерировать клиентов из IDL и отлаживать неожиданные ошибки.

Модель развёртывания программ

Каждая программа Solana находится по адресу Pubkey. Байт-код программы хранится в исполняемом аккаунте, владельцем которого является BPF Upgradable Loader (BPFLoaderUpgradeab1e11111111111111111111111). Развёртывание программы состоит из трёх аккаунтов:
  1. Program account: небольшой аккаунт метаданных по адресу программы. Владелец: BPF Upgradable Loader.
  2. ProgramData account: содержит сам байт-код. Производная от [program_id, "programdata"].
  3. Buffer account (временный): содержит новый байт-код во время обновления. Удаляется после обновления.
ProgramData аккаунт имеет upgrade authority — ключ, который может заменить байт-код новой версией. Upgrade authority Raydium — это мультиподпись с 24-часовой блокировкой; см. security/admin-and-multisig.

Проверка развёрнутой программы

Чтобы убедиться, что на цепи находится то же самое, что в одобренном аудитом исходном коде:
Совпадающие хеши доказывают, что вы взаимодействуете с тем исходным кодом, который вы думаете. Raydium публикует инструкции для проверенной сборки в примечаниях к выпуску.

Anchor: фреймворк поверх Solana

Нативные программы Solana — это функции Rust с такой сигнатурой:
Anchor скрывает весь шаблонный код и позволяет писать:
Anchor:
  • Автоматически генерирует детерминированный 8-байтовый discriminator для каждой инструкции и каждого типа аккаунта.
  • Валидирует ограничения аккаунтов (владелец, seeds, writable, signer, совпадение mint, совпадение token-program) перед выполнением вашего кода.
  • Генерирует IDL — файл описания интерфейса, который клиенты используют для вызова программы.
  • Поставляется с клиентской библиотекой на Rust, TypeScript и Python.

8-байтовый discriminator

Каждый аккаунт Anchor и каждая инструкция Anchor начинаются с 8-байтового discriminator — первых 8 байтов SHA-256 фиксированной строки:
Когда вы вызываете инструкцию Anchor, первые 8 байтов данных инструкции — это этот discriminator; Anchor отправляет запрос нужному обработчику, ища их. Когда вы читаете аккаунт Anchor, первые 8 байтов говорят вам его тип — критично для инструментов вроде getProgramAccounts, которые перечисляют все аккаунты типа.

Ошибки

Программы Anchor определяют ошибки через #[error_code]:
Anchor автоматически присваивает этим кодам числовые значения, начиная с 6000 (0x1770). Полная таблица кодов ошибок Raydium находится в reference/error-codes.

IDL

IDL (Interface Description Language) Anchor — это JSON-описание программы: её инструкции, аккаунты, типы, ошибки и события. Это эквивалент Ethereum ABI. Raydium публикует IDL для всех программ Anchor. Получите в реальном времени с цепи:
Или из исходного кода SDK: src/raydium/*/idl/*.json.

Структура IDL

Генерация клиента из IDL

CLI anchor Anchor генерирует типы TypeScript и Rust:
Сторонние инструменты вроде Kinobi могут генерировать клиентов на Rust, Python, C или Go из IDL.

Когда IDL — ваш помощник

Если вы хотите построить пользовательскую интеграцию, которая не проходит через SDK Raydium:
  1. Получите IDL (в реальном времени с цепи или из исходного кода SDK).
  2. Найдите нужную инструкцию (например, swap_base_input).
  3. Сконструируйте данные инструкции: 8-байтовый discriminator + закодированные аргументы.
  4. Передайте аккаунты в порядке, указанном в IDL.
См. sdk-api/anchor-idl для рабочих примеров.

Программы до Anchor: AMM v4 и Farm v3/v5

Эти программы предшествуют Anchor. Они используют:
  • Ручную диспетчеризацию инструкций: тег u8 в instruction_data с оператором match.
  • Ручную валидацию аккаунтов: if accounts[0].owner != &expected_program { ... }.
  • Borsh-сериализованные аргументы инструкций: без discriminator, просто instruction_data[1..].
  • Layout через #[repr(C, packed)]: бинарный layout C-структуры.
SDK Raydium v2 поставляется с TypeScript layouts для инструкций AMM v4 без Anchor, чтобы клиенты могли кодировать/декодировать без Anchor:
Паттерн интеграции тот же — вы просто не получаете автоматическую генерацию, управляемую IDL Anchor.

Механика обновления программ

Только upgrade_authority ProgramData может обновлять. Шаги:
  1. Скомпилировать новый байт-код.
  2. Записать его в буферный аккаунт (solana program write-buffer).
  3. Отправить инструкцию обновления: BpfLoaderUpgradeable::Upgrade { buffer, program, authority }.
  4. Runtime атомарно заменяет байт-код программы содержимым буфера.
Raydium защищает это 24-часовой блокировкой в настройках мультиподписи Squads. Транзакция обновления должна ждать 24 часа после одобрения мультиподписью перед выполнением. Это защищает от поспешных / вынужденных обновлений. См. security/admin-and-multisig.

Сделать программу неизменяемой

Upgrade authority может быть установлена в None, после чего программа становится постоянно неизменяемой. Raydium не сделал это ни для одного продукта — команда сохраняет возможность выпускать исправления безопасности. Компромисс: пользователи должны доверять процессу мультиподписи + блокировки.

Программы и rent

Развёртывание программы потребляет rent-exempt lamports:
  • Программа 50 KB: ~0.35 SOL в rent.
  • Программа 200 KB: ~1.4 SOL в rent.
Закрытие программы (через solana program close) возвращает lamports. Программы Raydium остаются активными и не запланированы на закрытие.

Отладка программ Anchor

Вывод логов

Макрос msg! Anchor пишет в лог транзакции. Смоделируйте транзакцию, чтобы увидеть логи:
Логи включают:
  • Вызов программы (Program CPMMoo8... invoke [1]).
  • Вызовы msg! из кода программы.
  • Потребление compute unit (consumed 137842 of 400000 compute units).
  • Успех или ошибка программы.

Коды ошибок

Если программа Anchor выбрасывает ошибку, лог показывает:
0x1770 = 6000 в десятичной системе = первая ошибка Anchor (например, SlippageExceeded). Перекрёстно проверьте с массивом errors в IDL. См. reference/error-codes для полной таблицы ошибок Raydium.

Несоответствия layout аккаунтов

Если вы передадите неправильный аккаунт в неправильный слот, макросы валидации аккаунтов Anchor возвращают ошибки вроде:
Номера ошибок ниже 6000 — встроенные ошибки Anchor (см. enum ErrorCode Anchor); ошибки ≥6000 — пользовательские коды программы.

Ссылки

Источники: