メインコンテンツへスキップ

Documentation Index

Fetch the complete documentation index at: https://docs.raydium.io/llms.txt

Use this file to discover all available pages before exploring further.

このページは AI による自動翻訳です。すべての内容は英語版を正とします。英語版を表示 →
Solana上の「MEV」は、Ethereumのメモリプール駆動型MEVと同一ではありません。ブロックリーダーはトランザクションパケットを到着順に見ており、順序付けされたメモリプールではありません。フロントランは、リーダー側の並べ替えまたは同じ場所にいるサーチャーによって発生し、サンドイッチ攻撃はプール状態を監視し、より高い手数料でトランザクションをレースするボットによって実行されます。緩和策はそれに応じて異なります。

スプリットルーティング入門

「スプリットルーティング」とは、1つの論理的なスワップを複数のプール全体で分割し、限界価格が等化するようにすることです。各スライスを独自のプール価格で取引した場合と同じ出力が得られます。単一のプールが取引規模に対して浅い場合、有効な価格影響が軽減されます。 問題設定:プール P_1, ..., P_n の関数 f_i(x) が入力 x を出力にマップする場合、スプリット x_1 + ... + x_n = X を見つけて Σ f_i(x_i) を最大化します。各 f_i が凹関数であるため、最適値は f'_1(x_1) = f'_2(x_2) = ... = f'_n(x_n)(限界価格が等しい)を満たします。

貪欲法による実装

実際には最適値の1%以内に収まる単純なアプローチ:
remaining = X
routes    = []
step      = X / 1000     // スライスサイズ
while remaining > 0:
    best_pool = argmax over i of f'_i(current_x_i + step)
    x_i += step
    routes.append((best_pool, step))
    remaining -= step
より細かい step → 最適値に近い、より多くの反復。実際には100~500スライスが合理的なスイートスポットです。

凸最適化による実装

本番級アグリゲータの場合、最適化を直接解きます。各プールには閉じた形式の f'_i(x) があります:
  • 定数乗積(CPMM / AMM v4)f'(x) = y * R_y / (R_x + x)^2 ここで R_x, R_y はリザーブであり y = R_x * R_y / (R_x + x) - R_y …(より単純な導出:限界価格は R_y / (R_x + x) なので、限界価格を等化するようにスプリットすることは1次元の探索です)。
  • CLMM:区分的に滑らか — 1つのティック内では、f'(x)sqrt_price の有理関数です;ティック全体では、それは離散的にステップします。小さなステップソルバーでスプリットするか、各連続ティックを独自の「プール」として扱います。
スプリットルーティングの出力は、トランザクション組立ステップがスワップ命令のシーケンスに変換するベクトル [(pool_1, x_1), (pool_2, x_2), ...] です。

スプリットルーティングが有効な場合

取引規模対TVLスプリットは有効ですか?
<0.1%いいえ — 単一プールが支配的
0.1–1%限定的
1–5%はい、10~50 bps改善
>5%はい、大幅な改善
ユーザーが深いプールで <$10k を行うウォレットのインUI スワップを実行している場合、スプリットする必要はありません。ガスオーバーヘッドが改善を上回ります。アグリゲータが機関投資家フローを引用している場合は、常にスプリットしてください。

マルチホップルート

直接プールが存在しない場合、またはダイレクトプールの影響が大きい場合は、中間を経由してホップします:
tokenA → tokenHub → tokenB
共通ハブ:USDC、SOL、RAY。各ホップには:
  • 独自のスリッページ境界(直接ホップでは低い;マルチホップでホップあたり)。
  • 独自の手数料支払い。
  • 独自の価格影響。
総合的な影響は複合します:(1 - impact_1) * (1 - impact_2)。1%の影響ホップを2回は、1.99%の合計であり、2%ではありません。 同じプール経由で2回ホップしないでください。 同じCLMM経由で A → B → A → B に移動すると、手数料とスリッページが燃やされるだけです。アグリゲータはそのようなルートを生成時にフィルタする必要があります。(注:これは同じペアのサイクリングであり、一般的なマルチホップではありません — 異なるプール経由で A → USDC → B をルーティングすることは、上記で推奨される標準的で有用なパターンです。) ホップあたり対エンドツーエンド最小。 CPI合成(integration-guides/cpi-integration)を使用すると、各ホップの minimum_amount_out を0に設定し、プロキシで単一のエンドツーエンド最小値を適用できます。CPIなしでは、各ホップが独自の最小値を適用し、合理的な中間境界を計算する必要があります — 一般的にはホップあたり quote_i * (1 - slippage_bps/10000) です。

サンドイッチ攻撃

メカニズム

ボットはトランザクションゴシップストリームを監視します。スワップを見ると:
  1. フロントラン:ボットはあなたの前に同じトークンを購入し、プール価格を上げます。
  2. 被害トランザクション:より悪い価格でスワップします。
  3. バックラン:ボットは上昇した価格で売却し、スプレッドを獲得します。
ボットは両方のトランザクションに優先手数料を支払います;利益はサンドイッチデルタから2倍の優先手数料を引いたものです。プール価格がトランザクション規模で大きく変動する場合にのみ利益があります。

緩和策

厳しいスリッページ。 最小出力が見積もりから0.5%下にある場合、価格を0.5%以上移動するサンドイッチはあなたを戻しますが、ボットの事前取引は依然として古い価格で実行されます。彼らはお金を失います。サンドイッチボットは広いスリッページ(≥1–2%)を対象とします;0.3%未満のスリッページはほぼ免疫があります。 プライベートメモリプール送信(Jito)。 トランザクションをJitoバンドルの一部として送信します。バンドルはパブリックゴシップストリームに表示されません;ボットは飛行中の取引を見ることができず、フロントランできません。トレードオフ:バンドルはバリデータ側のチップが必要であり、すべてのリーダーがJito対応ではありません(ほとんどはそうです)。 より小さい取引規模。 トランザクションを複数に分割して、単一のトランザクションが価格を動かして利益のあるサンドイッチターゲットになることがないようにします。総ガスコストが増加します。 時間のランダム化。 可能であれば低ボリュームの時間帯に送信してください。インタラクティブユーザースワップでは利用できませんが、スケジュール設定されたボットフローに実行可能です。 Raydiumの CLMM プールは、単一ティックリクイディティ構造が小さな取引がまったく価格を動かさない(ティック内にとどまる)ため、一般的に CPMM よりもサンドイッチアクティビティが少なくなります。深い CLMM プールは、有機的に最良のサンドイッチ耐性会場です。

Jitoバンドル

Jitoは、修正されたSolanaバリデータクライアントで、バンドル — 原子的に着地したトランザクションの順序付けされたグループを受け入れます。ボットは MEV 抽出に Jito を使用します;通常のユーザーは同じボットからの保護に Jito を使用します。

バンドルの動作方法

  • Jitoブロックエンジンエンドポイント(例:https://mainnet.block-engine.jito.wtf)に接続します。
  • 1~5トランザクションとチップをJitoのチップアカウントの1つに含むバンドルを送信します。
  • 現在のリーダーが Jito を実行している場合、バンドルが検討されます。このスロットのオークション落札者(最も高いチップ対CUを持つバンドル)が着地します;その他はドロップします。

チップサイズの決定

チップサイズは最近のバンドル配布に従います。Jitoはリアルタイムパーセンタイルを公開しています:
const tipRes = await fetch("https://worker.jito.wtf/api/v1/bundles/tip_floor");
const tips   = await tipRes.json();
// { ema_landed_tips_25th_percentile, 50th, 75th, 95th, 99th }

// 通常の日のユーザー向けスワップ — 50パーセンタイルは問題ありません。
const tipSol = tips.ema_landed_tips_50th_percentile_lamports / 1e9;

// 渋滞中の時間敏感なボット取引 — 75~95パーセンタイル。
典型的な範囲:緊急でないユーザースワップの場合0.0001~0.001 SOL;渋滞中の高優先度ボットの場合0.01~0.1 SOL。

バンドルの構築

import { SearcherClient } from "jito-ts";

const client = new SearcherClient("https://mainnet.block-engine.jito.wtf");

const tipIx = SystemProgram.transfer({
  fromPubkey: user.publicKey,
  toPubkey:   JITO_TIP_ACCOUNTS[Math.floor(Math.random() * 8)],  // 8個のチップアカウント
  lamports:   tipLamports,
});

const tx1 = new VersionedTransaction(...);  // スワップ
tx1.sign([user]);

const bundleUuid = await client.sendBundle([tx1], tipLamports);
// オプション:client.getBundleStatuses([bundleUuid]) で確認を待つ
注意事項:
  • チップはバンドル内にある必要があります。 SystemProgram.transfer をJitoチップアカウントに含めて、バンドルのトランザクションの1つ(通常は最後のもの)内に命令として含めます。バンドルの一部ではない別のチップトランザクションは無視されます。
  • リーダーはJito対応ではありません。 リーダーの約75%がJitoを実行しており、約25%は実行していません。非Jitoリーダーがスロットを保持している場合に送信されるバンドルはドロップされます。クライアントは自動的に再試行されます。
  • 有効期限。 バンドルは通常のトランザクションと同じブロックハッシュ有効期限モデルを使用します。すばやく組立ておよび送信します;約60秒ウィンドウ。

バンドル対優先手数料

優先手数料は、リーダーをより早くトランザクションを含めるように賄賂します。Jitoバンドルは追加でトランザクションをパブリックメモリプールから隠します。緊急性には優先手数料を使用します;サンドイッチ保護にはバンドルを使用します。ベルト・アンド・ブレース:高値ユーザースワップで両方を使用します。 優先手数料サイズについては、integration-guides/priority-fee-tuning を参照してください。

MEV共有 / リバート保護RPC

一部のRPCプロバイダーは、「MEV共有」または「リバート保護」エンドポイントを提供し、内部的にトランザクションをJitoバンドルまたは同等のプライベートパスを通じてルーティングします:
  • Helius — バンドルサポート付きのステークされた接続。
  • QuickNode — 「Revert Protect」エンドポイント;送信されたトランザクションの周りに自動的にバンドルを形成します。
  • Triton — プライベートフロー層。
これらのいずれかを使用することは、バンドルロジックを自分で管理したくないプロジェクトにとって最も単純なパスです。トレードオフ:不透明な内部;プロバイダーのバンドル構築を信頼します。

渋滞処理

高ボリュームウィンドウ(メインネット起動、主要リスティング、継続的な上昇)中、リーダーパケットキューが満杯になります。症状:
  • トランザクションは60秒以上確認されずに残り、「ブロックハッシュが見つかりません」で期限切れになります。
  • 昨日うまくいった優先手数料は今日は不十分です。
  • シミュレーションは成功しますが、実行は着地しません。
戦略:
  1. 有効期限でのアグレッシブな再試行。 TransactionExpiredBlockheightExceeded で、新しいブロックハッシュで再構築し、再送信します。リバートで再試行しないでください — リバートは決定論的です。
  2. 複数RPC放送。 同じトランザクションを複数のRPCに並列で送信します;最初にリーダーに到達したもの勝ちです。
  3. 優先手数料ランピング。 50パーセンタイルから始めます;最初の試行が期限切れになった場合、75番目、次に95番目で再試行します。
  4. フォールバックとしてのJitoバンドル。 Jitoリーダーはチップ対CUでバンドルをソートするため、パケットキューが混雑していないことが多いです;高チップバンドルは優先度が得られます。
  5. シミュレーションを減らします。 渋滞中、前にシミュレーションを1回実行します;再試行時に再シミュレーションしないでください。プール状態は何らかの方法で変動したからです。渋滞中の再シミュレーションはしばしば異例に失敗します。

プロダクト別MEV考慮事項

CPMM。 低TVLプールでは非常にサンドイッチしやすい。定数乗積曲線は、小さなボット事前取引でさえ増幅します。プールTVLの0.5%を超えるCPMM取引にはJitoバンドルを推奨します。 CLMM。 深いプールでは、ティック内取引が価格を動かさないため、サンドイッチしにくい。しかし、クロスティック取引は確実に動きます;ティック横断をターゲットとしたサンドイッチは既知のパターンです。厳しいスリッページ(<0.3%)が最良の防御です。 AMM v4 + OpenBook。 OpenBook オーダーブック補充は同じトランザクション経由で実行されるため、オーダーブック状態を知らないサンドイッチボットは価格影響を過小評価し、しばしば失敗します。この理由により、有機的に低MEV会場です。 LaunchLab。 早期ボンディングカーブフェーズ中、ハイプされた起動でのフロントランは猖獗です。曲線は速く動き、スリッページは幅広い。Jitoバンドルは強く推奨されます。卒業後、結果としてのCPMMは通常のCPMM動力学に従います。 Farms。 収穫およびステークオペレーションはスワップではなく、サンドイッチできません。特別な処理は不要です。

チェックリスト

本番級アグリゲータ / ウォレットスワップUI の場合:
  • スリッページは通常のペアで≤0.5%にデフォルト設定;ユーザーはオーバーライドできます。
  • Jitoバンドル送信は、>$1k USD値のスワップでデフォルトで有効になっています。
  • 優先手数料はライブ推定から調達(ハードコードされていない)。
  • 再試行ロジックはリバート(再試行しない)を有効期限(新しいブロックハッシュで再試行)と区別します。
  • マルチホップルートは、エンドツーエンドではなく、ホップあたりの最小値を設定します。
  • スプリットルーティングは、任意の単一プールのTVLの>1%の取引に対してアクティブです。
  • プール新鮮度:送信直前に状態を再フェッチします;古い場合は再引用します。
  • 浅いプールでサンドイッチ耐性:Jitoのみ、またはスリッページ>1%の場合は拒否します。

ポインタ

情報源: