Skip to main content
Эта страница переведена с помощью ИИ. За эталон принимается английская версия.Открыть английскую версию →

Что такое IDL

Программы Anchor на Solana публикуют файл IDL (Interface Definition Language), описывающий их инструкции, макеты аккаунтов, перечисление ошибок и схемы структур. IDL — это источник истины для генерации кода клиента: TS SDK, Rust CPI крейт и клиенты третьих сторон генерируются из него (или написаны вручную против него). Raydium публикует IDL для CPMM, CLMM и LaunchLab. AMM v4, Stable AMM и Farm (v3 / v5 / v6) предшествуют Anchor или иным образом не распространяются через Anchor — их структуры аккаунтов поддерживаются вручную в SDK.

Где их найти

IDL находятся в отдельном репозитории:
Точные файлы: Файлы IDL версионируются в истории git репозитория; закрепитесь на конкретном коммите, если вам нужна воспроизводимость до байта. Некоторые IDL также можно получить непосредственно из mainnet:
Теперь существуют два механизма IDL в цепи, и программы Raydium распределены между ними — это важно, потому что данная версия Anchor CLI может знать только об одном:
CPMM не имеет наследуемого аккаунта anchor:idl. Его IDL был перенесён в программу Program Metadata, поэтому anchor idl fetch CPMMoo8L3F4NbTegBCKVNunggL7H1ZpdTHKxQB5qKP1C не работает в любой версии Anchor CLI, которая проверяет только наследуемый PDA. Используйте IDL, поставляемый с SDK, или прочитайте аккаунт метаданных выше, пока ваш CLI не поддерживает программу метаданных.
Все три наследуемых аккаунта IDL доступны для записи органом IDL 2XVnob28A5Qnpcy95UVeHWNT6G8Poy3tpA3AFyAMoZDt, который отделён от органа обновления BPF программ — поэтому IDL можно обновить без переразвёртывания, и он также может отставать от переразвёртывания. Рассматривайте IDL в цепи как удобство, а не как доказательство формы развёрнутого байт-кода.

Регенерация TypeScript клиента

Codegen Anchor создаёт типизированный клиент из IDL:
Большинство интеграторов не делают этого — они используют более высокоуровневый помощник raydium.cpmm.swap(...), который оборачивает методы Anchor плюс всю бухгалтерию (создание ATA, корректировка комиссии за передачу, бюджет вычислений, маршрутизация программы Token-2022). Регенерируйте только когда вам нужен слой ниже SDK.

Регенерация Rust клиента (CPI крейт)

Raydium публикует Anchor крейты для программ, которые имеют IDL:
В коде ссылайтесь на них по их lib именам, raydium_cp_swap и raydium_clmm. Нет крейта под названием raydium_amm_v3 ни при каком написании. Обратите внимание, что ветки отличаются: raydium-cp-swap на master всё ещё закреплён на anchor-lang 0.32.1, поэтому интеграция Anchor-1.0 нуждается в chore/upgrade-anchor; CLMM на 0.32.1 в любом случае, поэтому эти два не могут использовать один крейт. Функция cpi предоставляет структуры аккаунтов cpi::accounts::<Ix> и вызывающие функции cpi::<ix>() — готовые к использованию обёртки CPI. См. sdk-api/rust-cpi для примеров использования. Если вы предпочитаете генерировать свежие привязки:

Регенерация Python клиента

Нет официального Raydium Python SDK. Генераторы третьих сторон включают:
  • anchorpy — Python порт TypeScript клиента Anchor. Генерирует типизированные построители методов из IDL.
  • solders — низкоуровневые примитивы Solana (транзакции, пары ключей, публичные ключи) в привязках Rust; используется под anchorpy.
См. sdk-api/python-integration для более полного пошагового руководства.

Политика изменения IDL

Raydium следует этим правилам для стабильности IDL:
  1. Дискриминаторы инструкций никогда не меняются. Добавление новых инструкций расширяет перечисление в конце; существующие дискриминаторы остаются стабильными.
  2. Размеры аккаунтов стабильны; новые поля выходят из зарезервированного заполнения. Каждая структура состояния Raydium несёт конечную область заполнения, размер которой определён при создании, и новое поле вырезается из этого заполнения, а не добавляется — поэтому длина аккаунта в байтах и смещения всех существующих ранее полей остаются фиксированными. Следствие состоит в том, что байты, которые вы ранее читали как заполнение, могут стать значимыми, и поле может быть отправлено обратно в заполнение (как PlatformConfig.curve_params в выпуске 2026-08-31). Перечитайте определение структуры после обновления; не предполагайте, что заполнение остаётся нулевым.
  3. Коды ошибок перечисления только добавляются. Существующий код ошибки всегда означает одно и то же.
  4. Критические изменения поставляются в новых программах. Когда требуется переделка, команда развёртывает новый ID программы (например, CPMM как свежую программу вместо обновления AMM v4). Старые пулы продолжают работать на старой программе; новые пулы переходят на новую.
Эта политика сохраняет регенерируемые клиенты в основном обратно совместимыми: клиент, сгенерированный против более старого IDL, продолжает декодировать поля, которые он знает, со смещениями, которые он знает. Чего он не увидит, так это поле, вырезанное из того, что он всё ещё рассматривает как заполнение — и в редком случае отставки поле, которое он декодирует, может больше не быть написано. Он не видит «дополнительные конечные байты»: длина аккаунта не меняется.

Что делать при изменении IDL

  1. Обновите SDK. npm update @raydium-io/raydium-sdk-v2.
  2. Регенерируйте код вашего клиента, если вы используете Anchor codegen напрямую.
  3. Сравните макет аккаунта. Конечные поля нового макета — это единственное, что ваш код не видел; подтвердите, нужны ли они вам.
  4. Не предполагайте, что старые дискриминаторы инструкций недействительны. По правилу 1 они всё ещё работают.
  5. Повторно запустите интеграционные тесты на devnet перед развёртыванием на mainnet.

Устранение неполадок IDL

Ошибки “Invalid discriminator”

Обычно означает, что клиент, построенный против версии N IDL, пытается вызвать инструкцию, которая существовала только в версии программы до развёртывания. Повторно получите IDL из живой программы:
Для CPMM это не будет работать — см. таблицу расположения IDL выше; вместо этого получите IDL, поставляемый с SDK.

Ошибки декодирования аккаунта

Если program.account.<Name>.fetch(pubkey) выбрасывает ошибку с “Invalid account discriminator”, аккаунт был создан предыдущей версией программы и Anchor отклоняет его 8-байтовый дискриминатор. Решение — использовать парсер сырого макета из SDK (PoolInfoLayout.decode(accountData)), который не применяет дискриминаторы Anchor.

Отсутствующие инструкции в сгенерированном клиенте

Codegen TS Anchor генерирует методы только для инструкций, чья запись IDL имеет name, который парсится как действительный идентификатор. Инструкции Raydium все это удовлетворяют, но если вы видите несоответствие, проверьте, является ли файл IDL из текущего выпуска SDK.

Указатели

Источники: