Skip to main content
このページは AI による自動翻訳です。すべての内容は英語版を正とします。英語版を表示 →
Raydium の新しいプログラム(CPMM、CLMM、Farm v6、LaunchLab)は Anchor で書かれています。Anchor は Solana のネイティブプログラムモデルの上に構築された Rust フレームワークで、アカウント検証、エラーハンドリング、IDL(インターフェース記述)を提供します。AMM v4 と古いファームは Anchor より前のものです。両方のパラダイムを理解することで、コードを読み、IDL からクライアントを生成し、予期しないエラーをデバッグするのに役立ちます。

プログラムデプロイメントモデル

すべての Solana プログラムは Pubkey に存在します。プログラムのバイトコードは BPF Upgradable Loader(BPFLoaderUpgradeab1e11111111111111111111111)が所有する executable アカウントに保存されます。 プログラムデプロイメントは 3 つのアカウントで構成されます:
  1. Program アカウント:プログラム ID にある小さなメタデータアカウント。所有者:BPF Upgradable Loader。
  2. ProgramData アカウント:実際のバイトコードを保持します。[program_id, "programdata"] として導出されます。
  3. Buffer アカウント(一時的):アップグレード中に新しいバイトコードを保持します。アップグレード後に破棄されます。
ProgramData アカウントには upgrade authority があります。これはバイトコードを新しいバージョンに置き換えることができるキーです。Raydium のアップグレード権限は 24 時間のタイムロックの背後にあるマルチシグです。詳細は security/admin-and-multisig を参照してください。

デプロイされたプログラムの検証

オンチェーンのプログラムが監査済みのソースと一致することを確認するには:
ハッシュが一致すれば、あなたが考えているソースと対話していることが証明されます。Raydium はリリースノートで検証済みビルド手順を公開しています。

Anchor:Solana の上のフレームワーク

生の Solana プログラムは、このシグネチャを持つ Rust 関数です:
Anchor はすべてのボイラープレートをラップし、以下のように書くことができます:
Anchor は以下を行います:
  • 各命令と各アカウントタイプに対して、決定論的な 8 バイトの discriminator を自動生成します。
  • アカウント制約(所有者、シード、書き込み可能、署名者、ミント一致、トークンプログラム一致)をコード実行前に検証します。
  • クライアントがプログラムを呼び出すために使用する IDL(インターフェース記述ファイル)を生成します。
  • Rust、TypeScript、Python のクライアント側ライブラリを提供します。

8 バイト discriminator

すべての Anchor アカウントとすべての Anchor 命令は、8 バイト discriminator で始まります。これは固定文字列の SHA-256 の最初の 8 バイトです:
Anchor 命令を呼び出すとき、命令データの最初の 8 バイトはこの discriminator です。Anchor はそれらを検索することで正しいハンドラーにディスパッチします。 Anchor アカウントを読むとき、最初の 8 バイトはそのタイプを示します。これは getProgramAccounts のようなツールがタイプのすべてのアカウントを列挙するために重要です。

エラー

Anchor プログラムは #[error_code] を使用してエラーを定義します:
Anchor はこれらに 6000(0x1770)から始まる数値コードを自動割り当てします。Raydium の完全なエラーコード表は reference/error-codes にあります。

IDL

Anchor IDL(Interface Description Language)ファイルは、プログラムの JSON 記述です。命令、アカウント、タイプ、エラー、イベントが含まれます。これは Ethereum ABI と同等です。 Raydium はすべての Anchor プログラムの IDL を公開しています。オンチェーンからライブで取得します:
または SDK ソースから:src/raydium/*/idl/*.json。

IDL 構造

IDL からクライアントを生成

Anchor の anchor CLI は TypeScript と Rust タイプを生成します:
Codama のようなサードパーティツールは、IDL から Rust、Go、Python、または JavaScript のクライアントを生成できます。(Codama は Metaplex の Kinobi の後継で、Kinobi は JavaScript レンダラーのみを提供していました。)

IDL が役に立つとき

Raydium SDK を経由しないカスタム統合を構築したい場合:
  1. IDL を取得します(オンチェーンからライブ、または SDK ソースから)。
  2. 必要な命令を検索します(例:swap_base_input)。
  3. 命令データを構築します:8 バイト discriminator + エンコードされた引数。
  4. IDL が指定する順序でアカウントを渡します。
実装例は sdk-api/anchor-idl を参照してください。

Anchor 以前のプログラム:AMM v4 と Farm v3/v5

これらのプログラムは Anchor より前のものです。以下を使用します:
  • 手動命令ディスパッチ:instruction_data の u8 タグと match ステートメント。
  • 手動アカウント検証:if accounts[0].owner != &expected_program { ... }。
  • Borsh シリアライズされた命令引数:discriminator なし、単に instruction_data[1..]。
  • #[repr(C, packed)] 経由のレイアウト:C 構造体バイナリレイアウト。
Raydium SDK v2 は、Anchor 以外の AMM v4 命令用の TypeScript レイアウトを提供しているため、クライアントは Anchor なしでエンコード/デコードできます:
統合パターンは同じです。Anchor の IDL 駆動の自動生成が得られないだけです。

プログラムアップグレードメカニクス

ProgramData の upgrade_authority だけがアップグレードできます。ステップ:
  1. 新しいバイトコードをコンパイルします。
  2. バッファアカウントに書き込みます(solana program write-buffer)。
  3. アップグレード命令を送信します:BpfLoaderUpgradeable::Upgrade { buffer, program, authority }。
  4. ランタイムはプログラムのバイトコードをバッファの内容で自動的に置き換えます。
Raydium はこれを Squads マルチシグの設定に実装された 24 時間のタイムロック の背後に置きます。アップグレードトランザクションは、マルチシグ承認後、実行前に 24 時間待つ必要があります。これは急いだ/強制されたアップグレードから保護します。 詳細は security/admin-and-multisig を参照してください。

プログラムを不変にする

アップグレード権限を None に設定できます。その時点で、プログラムは永久に不変になります。Raydium はどの製品でもこれを行っていません。チームはセキュリティ修正をプッシュする能力を保持しています。トレードオフ:ユーザーはマルチシグ + タイムロックプロセスを信頼する必要があります。

プログラムとレント

プログラムをデプロイするとレント免除ラムポートを消費します:
  • 50 KB プログラム:約 0.35 SOL のレント。
  • 200 KB プログラム:約 1.4 SOL のレント。
プログラムを閉じる(solana program close 経由)とラムポートが返されます。Raydium プログラムはアクティブなままで、クローズ予定はありません。

Anchor プログラムのデバッグ

ログ出力

Anchor の msg! マクロはトランザクションのログに書き込みます。トランザクションをシミュレートしてログを表示します:
ログには以下が含まれます:
  • プログラム呼び出し(Program CPMMoo8... invoke [1])。
  • プログラムコードからの msg! 呼び出し。
  • コンピュートユニット消費(consumed 137842 of 400000 compute units)。
  • プログラムの成功またはエラー。

エラーコード

Anchor プログラムがスローすると、ログに以下が表示されます:
0x1770 = 6000 進数 = 最初の Anchor エラー(例:SlippageExceeded)。IDL の errors 配列と相互参照します。 Raydium の完全なエラー表は reference/error-codes を参照してください。

アカウントレイアウトの不一致

間違ったアカウントを間違ったスロットに渡すと、Anchor のアカウント検証マクロは以下のようなエラーを返します:
6000 未満のエラー番号は Anchor の組み込みエラーです(Anchor の ErrorCode enum を参照)。6000 以上のエラーはプログラムのカスタムコードです。

ポインタ

ソース: