Skip to main content
このページは AI による自動翻訳です。すべての内容は英語版を正とします。英語版を表示 →

IDL とは

Solana 上の Anchor プログラムは IDL(Interface Definition Language)ファイルを公開しており、そこには命令、アカウントレイアウト、エラー列挙型、構造体スキーマが記述されています。IDL はクライアントコード生成の信頼できる情報源です。TS SDK、Rust CPI クレート、サードパーティ製クライアントはすべて、それから生成されるか、または手動で記述されます。 Raydium は CPMM、CLMM、LaunchLab の IDL を公開しています。AMM v4、Stable AMM、Farm(v3 / v5 / v6)は Anchor 以前のものであるか、または Anchor で配布されていないため、アカウント構造は SDK 内で手動管理されています。

場所

IDL は専用リポジトリに保存されています:
正確なファイル: IDL ファイルはリポジトリの git 履歴でバージョン管理されています。バイト単位の再現性が必要な場合は、特定のコミットにピンしてください。 IDL は Anchor の オンチェーン IDL 機能を通じてデプロイされたプログラムから直接取得することもできます(プログラムパブリッシャーがオプトインした場合):
CPMM、CLMM、LaunchLab はすべてオンチェーン IDL を備えています。AMM v4、Stable AMM、Farm はそうではありません(Anchor 以前のプログラム)。

TypeScript クライアントの再生成

Anchor のコードジェネレータは IDL から型付きクライアントを生成します:
ほとんどのインテグレーター はこれを行いません。代わりに、より高いレベルの raydium.cpmm.swap(...) ヘルパーを使用します。これは Anchor メソッドとすべてのブックキーピング(ATA 作成、転送手数料調整、コンピュート予算、Token-2022 プログラムルーティング)をラップします。SDK の下にあるレイヤーが必要な場合のみ再生成してください。

Rust クライアント(CPI クレート)の再生成

Raydium は IDL を持つプログラムの Anchor クレートを公開しています:
cpi フィーチャーは cpi::accounts::<Ix> アカウント構造体と cpi::<ix>() インボーカーを公開します。これらは使用準備ができた CPI ラッパーです。使用パターンについては sdk-api/rust-cpi を参照してください。 新しいバインディングを生成したい場合:

Python クライアントの再生成

公式の Raydium Python SDK はありません。サードパーティジェネレータには以下が含まれます:
  • anchorpy@coral-xyz/anchor の Python ポート。IDL から型付きメソッドビルダーを生成します。
  • solders — Rust バインディングの低レベル Solana プリミティブ(トランザクション、キーペア、パブキー)。anchorpy の下で使用されます。
詳細なチュートリアルについては sdk-api/python-integration を参照してください。

IDL 変更ポリシー

Raydium は IDL の安定性について以下のルールに従います:
  1. 命令ディスクリミネータは変更されません。 新しい命令を追加すると列挙型の末尾が拡張されます。既存のディスクリミネータは安定したままです。
  2. アカウント構造体レイアウトは加算型でのみ進化します。 新しいフィールドは末尾に追加され、オンチェーンスキーマのサイズバンプが前に付けられます。既存のフィールドはオフセットを保持します。
  3. エラー列挙型コードは追加のみです。 既存のエラーコードは常に同じことを意味します。
  4. 破壊的変更は新しいプログラムで配布されます。 再設計が必要な場合、チームは新しいプログラム ID をデプロイします(例えば、AMM v4 をアップグレードするのではなく、CPMM を新しいプログラムとしてデプロイします)。古いプールは古いプログラムで実行され続けます。新しいプールは新しいプログラムにいきます。
このポリシーにより、再生成されたクライアントは下位互換性があります。2つのバージョン前の IDL に対して生成されたクライアントは、現在の状態を正しくデコードできます(追加の末尾バイトをパディングとして見ます)。

IDL が変更されたときの対応

  1. SDK を更新します。 npm update @raydium-io/raydium-sdk-v2
  2. Anchor コードジェンを直接使用する場合は クライアントコードを再生成します
  3. アカウントレイアウトを比較します。 新しいレイアウトの末尾フィールドのみが、コードが見ていないものです。それらが必要かどうかを確認してください。
  4. 古い命令ディスクリミネータが無効だと仮定しないでください。 ルール 1 により、それらはまだ機能します。
  5. devnet に対して統合テストを再実行します mainnet にロールアウトする前に。

IDL トラブルシューティング

「無効なディスクリミネータ」エラー

通常、IDL のバージョン N に対して構築されたクライアントが、プログラムのデプロイ前バージョンにのみ存在した命令を呼び出そうとしていることを意味します。ライブプログラムから IDL を再取得します:

アカウントデコード失敗

program.account.<Name>.fetch(pubkey) が「無効なアカウントディスクリミネータ」でスローされた場合、アカウントは以前のプログラムバージョンによって作成され、Anchor がその 8 バイトディスクリミネータを拒否しています。修正は SDK の生レイアウトパーサー(PoolInfoLayout.decode(accountData))を使用することです。これは Anchor ディスクリミネータを強制しません。

生成されたクライアントに命令がない

Anchor の TS コードジェンは、IDL エントリに有効な識別子として解析される name を持つ命令に対してのみメソッドを生成します。Raydium のすべての命令はこれを満たしていますが、不一致がある場合は、IDL ファイルが現在の SDK リリースからのものであるかどうかを確認してください。

ポインタ

ソース: