Эта страница переведена с помощью ИИ. За эталон принимается английская версия.Открыть английскую версию →
Новые программы Raydium (CPMM, CLMM, Farm v6, LaunchLab) написаны на Anchor — фреймворке на Rust, который расширяет нативную модель программ Solana, добавляя валидацию аккаунтов, обработку ошибок и IDL (описание интерфейса). AMM v4 и более старые фермы предшествуют Anchor. Понимание обеих парадигм помогает читать код, генерировать клиентов из IDL и отлаживать неожиданные ошибки.
Модель развёртывания программ
Каждая программа Solana находится по адресуPubkey. Байт-код программы хранится в исполняемом аккаунте, владельцем которого является BPF Upgradable Loader (BPFLoaderUpgradeab1e11111111111111111111111).
Развёртывание программы состоит из трёх аккаунтов:
- Program account: небольшой аккаунт метаданных по адресу программы. Владелец: BPF Upgradable Loader.
- ProgramData account: содержит сам байт-код. Производная от
[program_id, "programdata"]. - Buffer account (временный): содержит новый байт-код во время обновления. Удаляется после обновления.
security/admin-and-multisig.
Проверка развёрнутой программы
Чтобы убедиться, что на цепи находится то же самое, что в одобренном аудитом исходном коде:Anchor: фреймворк поверх Solana
Нативные программы Solana — это функции Rust с такой сигнатурой:- Автоматически генерирует детерминированный 8-байтовый discriminator для каждой инструкции и каждого типа аккаунта.
- Валидирует ограничения аккаунтов (владелец, seeds, writable, signer, совпадение mint, совпадение token-program) перед выполнением вашего кода.
- Генерирует IDL — файл описания интерфейса, который клиенты используют для вызова программы.
- Поставляется с клиентской библиотекой на Rust, TypeScript и Python.
8-байтовый discriminator
Каждый аккаунт Anchor и каждая инструкция Anchor начинаются с 8-байтового discriminator — первых 8 байтов SHA-256 фиксированной строки:getProgramAccounts, которые перечисляют все аккаунты типа.
Ошибки
Программы Anchor определяют ошибки через#[error_code]:
reference/error-codes.
IDL
IDL (Interface Description Language) Anchor — это JSON-описание программы: её инструкции, аккаунты, типы, ошибки и события. Это эквивалент Ethereum ABI. Raydium публикует IDL для всех программ Anchor. Получите в реальном времени с цепи:src/raydium/*/idl/*.json.
Структура IDL
Генерация клиента из IDL
CLIanchor Anchor генерирует типы TypeScript и Rust:
Когда IDL — ваш помощник
Если вы хотите построить пользовательскую интеграцию, которая не проходит через SDK Raydium:- Получите IDL (в реальном времени с цепи или из исходного кода SDK).
- Найдите нужную инструкцию (например,
swap_base_input). - Сконструируйте данные инструкции: 8-байтовый discriminator + закодированные аргументы.
- Передайте аккаунты в порядке, указанном в 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-структуры.
Механика обновления программ
Толькоupgrade_authority ProgramData может обновлять. Шаги:
- Скомпилировать новый байт-код.
- Записать его в буферный аккаунт (
solana program write-buffer). - Отправить инструкцию обновления:
BpfLoaderUpgradeable::Upgrade { buffer, program, authority }. - Runtime атомарно заменяет байт-код программы содержимым буфера.
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 выбрасывает ошибку, лог показывает:SlippageExceeded). Перекрёстно проверьте с массивом errors в IDL.
См. reference/error-codes для полной таблицы ошибок Raydium.
Несоответствия layout аккаунтов
Если вы передадите неправильный аккаунт в неправильный слот, макросы валидации аккаунтов Anchor возвращают ошибки вроде:ErrorCode Anchor); ошибки ≥6000 — пользовательские коды программы.
Ссылки
solana-fundamentals/account-model— как программы владеют аккаунтами.solana-fundamentals/pdas-and-cpis— PDA как их объявляет Anchor.sdk-api/anchor-idl— получение и использование IDL Raydium.reference/program-addresses— адреса программ.reference/error-codes— справочник кодов ошибок.security/admin-and-multisig— управление upgrade-authority.
- Документация Anchor.
- Развёртывание программ Solana.
- IDL Raydium (опубликованы в SDK
src/raydium/*/idl/*.json).

