6. Jito Bundles: 穿越黑暗森林的隐形斗篷

为什么你的交易总是被"夹"?

在学习 Jito 之前,我们必须先看清 Solana 网络中阴暗的一面:MEV (最大可提取价值)

什么是三明治攻击 (Sandwich Attack)?

想象你在麦当劳排队买汉堡,大喊一声:"我要买这个汉堡,我愿意出 10 块钱!" 旁边的一个坏蛋(MEV 机器人)听到了,他利用极快的手速:

  1. 抢先买入 (Front-run):他在你之前以 10 块钱买走了汉堡。
  2. 抬价出售:现在汉堡缺货了,价格涨到了 12 块。你的买单生效了,被迫以 12 块买入。
  3. 获利离场 (Back-run):坏蛋把你刚买入推高的价格,反手卖出,赚取差价。

在链上,这就是公共内存池 (Mempool) 的代价。只要你通过公共 RPC 发送交易,你的意图就暴露了。


6.1 Jito:Solana 的私人保镖

Jito 是 Solana 上的 Flashbots。它不仅仅是一个工具,它改变了交易的路由方式。

传统路由 vs Jito 路由

  • 传统 (HTTP/UDP):你 -> RPC -> Gossip 广播 -> 全网可见 -> 验证者打包。(裸奔)
  • Jito (Block Engine):你 -> Jito Block Engine (加密通道) -> Jito 验证者。(隐形)

Jito 的核心承诺: 通过 Jito 发送的交易,在被正式打包进区块并上链之前,不会被任何人看到。既然看不到,MEV 机器人就无法夹你。


6.2 核心机制:Bundle (原子交易包)

Jito 不仅仅是隐藏交易,它引入了 Bundle 的概念。 Bundle 是一个"交易数组",它具有原子性 (Atomicity)

Bundle = [交易 A, 交易 B, 交易 C]

规则

  • 要么 A、B、C 全部成功上链,且顺序严格锁定。
  • 要么 A、B、C 全部失败(不上链)。
  • 绝不会出现"A 成功了,但 B 失败了"的情况。

为什么这对狙击至关重要?

在狙击中,最怕的是:买入失败了,但手续费被扣了。 或者:买入成功了,但滑点太高被夹了

使用 Bundle,我们将"买入交易"和"给验证者的小费"绑在一起: [ Buy_Token_Tx, Tip_Validator_Tx ]

如果 Buy_Token_Tx 因为滑点过高或被抢跑而执行失败,整个 Bundle 就会被丢弃。这意味着 Tip_Validator_Tx 也不会执行结论:你不需要为失败的尝试支付昂贵的小费。这是白嫖党的最爱。


6.3 如何支付"保护费" (Tipping)

在 Jito 模式下,我们不再依赖 Solana 原生的 Priority Fee (Compute Budget),而是通过直接转账的方式给验证者小费。

Jito 官方维护了 8 个特殊的小费账户 (Tip Accounts),你需要随机选择一个,向其转账 SOL。

Jito Tip Accounts (部分):

  • 96gYZGLnJYVFmbjzopPSU6QiEV5fGqZNyN9nmNhvrZU5
  • HFqU5x63VTqvQss8hp11i4bVmkdzGTT4RCgLvtBPvuGZ
  • Cw8CFyM9FkoPhlbnF5k2E9g2oKjv7q2f8e9x2k5R2i4
  • ... (详见 Jito 文档)

这也是一种拍卖机制。在一个区块空间内,谁给的小费高,Jito 验证者就优先打包谁的 Bundle。


6.4 实战代码:构建你的第一个 Bundle

以下是使用 TypeScript 构建 Jito Bundle 的伪代码逻辑:

typescript
import { SystemProgram, PublicKey, TransactionMessage, VersionedTransaction } from "@solana/web3.js"; // 1. 准备你的核心业务交易 (比如买入 PEPE) const buyIx = await createSwapInstruction(...); // 2. 准备小费交易 (贿赂验证者) // 随机选一个 Jito Tip 账户,防止热点争夺 const jitoTipAccounts = ["96gYZ...", "HFqU5..."]; const selectedTipAccount = new PublicKey(jitoTipAccounts[Math.floor(Math.random() * jitoTipAccounts.length)]); const tipIx = SystemProgram.transfer({ fromPubkey: myWallet.publicKey, toPubkey: selectedTipAccount, lamports: 1000000 // 0.001 SOL 的小费 }); // 3. 将两个指令打包进同一个 Versioned Transaction (推荐) // 或者也可以打包成两个独立的 Tx 放入 Bundle 数组 const messageV0 = new TransactionMessage({ payerKey: myWallet.publicKey, recentBlockhash: latestBlockhash, instructions: [ buyIx, // 先执行买入 tipIx // 后执行给钱 (如果买入失败,这步就不会发生) ], }).compileToV0Message(); const transaction = new VersionedTransaction(messageV0); transaction.sign([myWallet]); // 4. 发送给 Jito Block Engine const jitoClient = searcherClient(blockEngineUrl, authKeypair); const bundleId = await jitoClient.sendBundle(new Bundle([transaction], 5)); // 5 是过期时间

6.5 常见误区

  1. "用了 Jito 就一定能买到":错。Jito 只是让你不被夹,并且有机会插队。但如果别人出的小费比你高(比如出 1 SOL),验证者还是会先打包他的。
  2. "所有验证者都支持 Jito":错。目前 Solana 主网约 80%+ 的验证者运行 Jito 客户端。如果当前的 Leader 刚好是不支持 Jito 的节点,你的 Bundle 会被丢弃(或者等到下一个支持 Jito 的 Leader)。
  3. "小费越高越好":不一定。要看利润空间。通常小费是动态计算的,比如 利润 * 50%

右侧实验说明

  • Public RPC 模式:模拟普通交易,你会看到它进入红色的"公开内存池",被红色的骷髅头(MEV 机器人)夹击。
  • Jito Bundle 模式:模拟 Bundle 交易,它绕过内存池,通过橙色通道直达验证者。你会发现,即使买入失败,你也毫发无损(除了基础网费)。
JSPlayground
EDITOR ACTIVE
Initializing JS Environment...

MEV Protection Lab

Your Tx
Public MempoolMEV Bots Watching...
BLOCK
Validator
Status
Waiting to send...