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 ни при каком написании. Обратите внимание на ветку. Оба репозитория master по-прежнему закреплены на anchor-lang 0.32.1, поэтому интеграция Anchor 1.0 требует chore/upgrade-anchor на каждом. С обоими крейтами на этой ветке они используют =1.0.2 и могут жить в одном крейте. Смешивание крейта master с крейтом ветки обновления не собирается. Функция cpi предоставляет структуры аккаунтов cpi::accounts::<Ix> и вызывающие функции cpi::<ix>() — готовые к использованию обёртки CPI. См. sdk-api/rust-cpi для примеров использования. Если вы предпочитаете генерировать свежие привязки:

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

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

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

Raydium следует этим правилам для стабильности IDL:
  1. Дискриминаторы инструкций никогда не меняются. Добавление новых инструкций расширяет перечисление в конце; существующие дискриминаторы остаются стабильными.
  2. Размеры аккаунтов стабильны; новые поля выходят из зарезервированного заполнения. Каждая структура состояния Raydium содержит конечную область заполнения, размер которой определён при создании, и новое поле вырезается из этого заполнения, а не добавляется — поэтому длина аккаунта в байтах и смещения всех существующих ранее полей остаются фиксированными. Следствие состоит в том, что байты, которые вы ранее читали как заполнение, могут стать значимыми, и поле может быть отправлено обратно в заполнение (как PlatformConfig.curve_params в выпуске от 2026-08-31). Перечитайте определение структуры после обновления; не предполагайте, что заполнение остаётся нулевым.
  3. Коды перечисления ошибок только добавляются. Существующий код ошибки всегда означает одно и то же.
  4. Критические изменения поставляются в новых программах. Когда требуется переделка, команда развёртывает новый program 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.

Ссылки

Источники: