跳轉到主要內容

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」與以太坊的記憶池驅動型 MEV 並不相同。區塊領導者看到的是交易包到達時的順序,而非有序的記憶池;搶先交易發生在領導者端重新排序或共置搜索器的方式,三明治攻擊由監視池狀態並用更高費用競速你交易的機器人執行。相應地,緩解措施也不同。

分路由入門

「分路由」是指將一次邏輯交換拆分到多個池中,使邊際價格均衡——與在各自池的價格下交易每一片的輸出相同。當任何單個池相對於交易規模都很淺時,它可以減少有效價格影響。 問題陳述:給定池 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     // slice size
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),所以分配以均衡邊際價格是一次 1D 搜索)。
  • CLMM:分段光滑——在一個 tick 內,f'(x)sqrt_price 的有理函數;跨 tick,它離散步進。使用小步求解器進行分配,或將每個連續 tick 視為其自身的「池」。
分路由的輸出是一個向量 [(pool_1, x_1), (pool_2, x_2), ...],你的交易組裝步驟將其轉換為一系列交換指令。

分路由何時有幫助

交易規模與 TVL分路由有幫助?
<0.1%否——單池主導
0.1–1%邊際有幫助
1–5%是,10–50 bps 改進
>5%是,大幅改進
如果你在錢包的 UI 交換中為零售用戶進行 <$10k 的深度池交換,不要費力分割——gas 開銷會超過改進。對於聚合器報價機構流動,始終分割。

多跳路由

當不存在直接池時,或直接池的影響巨大時,通過中介進行中繼:
tokenA → tokenHub → tokenB
常見中樞:USDC、SOL、RAY。每次中繼有:
  • 其自身的滑點界限(直接中繼上較低;多跳上按中繼)。
  • 其自身支付的費用。
  • 其自身的價格影響。
總影響複合:(1 - impact_1) * (1 - impact_2)。1% 影響中繼兩次是 1.99% 總計,而非 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. 逆向交易:機器人以升高的價格賣出,捕捉差價。
機器人為其兩次交易都支付優先費;利潤是三明治差減去兩倍的優先費。僅在你的交易有意義地移動價格的池上有利可圖。

緩解措施

緊滑點。 如果你的最小輸出比報價低 0.5%,移動價格超過 0.5% 的三明治會撤銷你但機器人的前交易仍以你的舊價格執行。他們虧錢。三明治機器人針對寬滑點(≥1–2%);sub-0.3% 滑點在很大程度上是免疫的。 私有記憶池提交(Jito)。 將你的交易作為 Jito 組合的一部分提交。組合不會出現在公開八卦流中;機器人在飛行中看不到交易並搶先交易。權衡:組合需要驗證者端小費,並非每個領導者都啟用 Jito(雖然大多數都是)。 較小的交易規模。 跨多個交易分割交易,使沒有單個交易移動足夠的價格成為有利可圖的三明治目標。增加總 gas 成本。 時間隨機化。 如果可能,在低交易量時提交。不適用於互動用戶交換但適用於計劃的機器人流量。 Raydium 的 CLMM 池通常比 CPMM 看到的三明治活動少,因為單 tick 流動性結構意味著小型交易根本不移動價格(它們保持在 tick 內)。深 CLMM 池是最好的三明治抵抗場所。

Jito 組合

Jito 是一個修改的 Solana 驗證者客戶端,接受組合——原子級登錄的有序交易組。機器人使用 Jito 進行 MEV 提取;普通用戶使用 Jito 保護自己免受相同機器人的侵害。

組合如何工作

  • 連接到 Jito 區塊引擎端點(例如 https://mainnet.block-engine.jito.wtf)。
  • 將 1–5 個交易的組合加上小費提交到 Jito 的小費帳戶之一。
  • 如果當前領導者運行 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 }

// 普通日子的面向用戶的交換——50th 百分位很好。
const tipSol = tips.ema_landed_tips_50th_percentile_lamports / 1e9;

// 擁塞期間時間敏感的機器人交易——75–95th 百分位。
典型範圍:非緊急用戶交換 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 tip accts
  lamports:   tipLamports,
});

const tx1 = new VersionedTransaction(...);  // the swap
tx1.sign([user]);

const bundleUuid = await client.sendBundle([tx1], tipLamports);
// Optionally: await confirmation via client.getBundleStatuses([bundleUuid])
陷阱:
  • 小費必須在組合內。SystemProgram.transfer 包含到 Jito 小費帳戶作為組合的一個交易內的指令(通常是最後一個)。不是組合一部分的單獨小費交易被忽略。
  • 領導者未啟用 Jito。 ~75% 的領導者運行 Jito;~25% 不運行。當非 Jito 領導者持有插槽時提交的組合被丟棄。客戶端將自動重試。
  • 過期。 組合使用與常規交易相同的區塊哈希過期模型。快速組裝和發送;~60s 窗口。

組合與優先費

優先費賄賂領導者更快地包含你的交易。Jito 組合還從公開記憶池中隱藏交易。使用優先費以確保緊急性;使用組合以防止三明治。雙重保險:在高價值用戶交換上同時使用兩者。 參見 integration-guides/priority-fee-tuning 以調整優先費大小。

MEV 共享 / 撤銷保護 RPC

某些 RPC 提供商提供「MEV 共享」或「撤銷保護」端點,內部通過 Jito 組合或等效私有路徑路由你的交易:
  • Helius —— 質押連接,組合支持。
  • QuickNode —— 「Revert Protect」端點;自動在提交的交易周圍形成組合。
  • Triton —— 私有流層。
使用其中之一是對於不想自己管理組合邏輯的項目的最簡單路徑。權衡:不透明的內部機制;你信任提供商的組合構建。

擁塞處理

在高交易量窗口期間(主網啟動、主要上市、持續上漲),領導者包隊列填滿。症狀:
  • 交易保持未確認 60+ 秒,然後以「blockhash not found」過期。
  • 昨天有效的優先費今天不足。
  • 模擬成功但執行從未登錄。
策略:
  1. 過期時的激進重試。TransactionExpiredBlockheightExceeded 上,以新區塊哈希重建並重新提交。不要在撤銷上重試——撤銷是確定性的。
  2. 多 RPC 廣播。 同時向多個 RPC 提交相同交易;先到達領導者的獲勝。
  3. 優先費提升。 從 50th 百分位開始;如果第一次嘗試過期,在 75th 重試,然後 95th。
  4. Jito 組合作為後備。 Jito 領導者往往不那麼擁塞,因為區塊引擎按每 CU 小費排序組合;高小費組合獲得優先級。
  5. 模擬較少。 在擁塞下,模擬一次前期;不要在重試上重新模擬,因為池狀態無論如何都會轉變。在擁塞期間重新模擬經常會虛假失敗。

按產品 MEV 考慮

CPMM。 在低 TVL 池上高度可被三明治化。恆積曲線放大甚至小型機器人前交易。建議對任何 CPMM 交易 >0.5% 池 TVL 使用 Jito 組合。 CLMM。 在深池上不那麼可被三明治化,因為 tick 內交易不移動價格。但跨 tick 交易絕對可以;針對 tick 交叉的三明治攻擊是已知模式。緊滑點(<0.3%)是最好的防禦。 AMM v4 + OpenBook。 OpenBook 訂單簿填充通過同一交易運行,所以不知道訂單簿狀態的三明治機器人低估價格影響並經常失敗。因此有機低 MEV 場地。 LaunchLab。 在早期結合曲線階段,搶先交易在炒作的啟動中猖獗。曲線移動快速,滑點寬。強烈建議使用 Jito 組合。畢業後,生成的 CPMM 遵循正常 CPMM 動態。 Farms。 收穫和質押操作不是交換,不可被三明治化。無需特殊處理。

檢查清單

對於生產聚合器 / 錢包交換 UI:
  • 滑點默認值在正常對上 ≤0.5%;用戶可以覆蓋。
  • Jito 組合提交對 >$1k USD 價值的交換默認啟用。
  • 優先費來自實時估計(不硬編碼)。
  • 重試邏輯區分撤銷(不重試)與過期(使用新區塊哈希重試)。
  • 多跳路由設置按中繼最小值,而非端到端。
  • 分路由對 >1% 任何單個池 TVL 的交易有效。
  • 池新鮮度:在提交前立即重新獲取狀態;如果陳舊重新報價。
  • 在淺池上對三明治有抵抗:要麼僅 Jito,要麼如果滑點 >1% 則拒絕。

指標

來源: