检测到 Solana 套利机会,是容易的那一半

发现价差只要几毫秒。它能不能扛过冲击、手续费,以及检测到落块之间的那几个 slot,才是决定赚不赚钱的问题。

BoltTx Team··14 min read
solana套利检测价格冲击原子性交易机器人

两个池子对同一个交易对报出不同的价格。检测问题就这么多,而且用你手上已经有的算术就能解。

★大多数套利机器人亏钱的原因,不是它们检测不到。而是它们检测到的那些机会,在把执行成本算进去之后从来就不赚钱。★

价差不是利润

// ★你检测到的。★
const priceA = Number(reserveB_poolA) / Number(reserveA_poolA);
const priceB = Number(reserveB_poolB) / Number(reserveA_poolB);
const spread = Math.abs(priceA - priceB) / Math.min(priceA, priceB);

那个数字描述的是一笔无穷小的交易。 ★你真实的交易在两条腿上都要付冲击,而且是在被它自己边执行边弄差的池子里。★

// ★你实际拿到的。★
const out1 = amountOut(size, poolA.reserveIn, poolA.reserveOut, poolA.feeBps);
const out2 = amountOut(out1, poolB.reserveOut, poolB.reserveIn, poolB.feeBps);

const gross  = out2 - size;
const net    = gross - baseFee - priorityFee;      // ★lamport,不是百分比★

算第二个,然后和零比。 价差百分比是一个初筛的启发式;净 lamport 数字才是决策。

★一个 2% 的价差,如果池子薄到你的规模每一边要付 1.5%,那是一笔看起来像赢家的亏损交易。★

规模是变量,不是常量

利润曲线有一个最大值,而它不在你负担得起的最大规模上:

小规模   → 冲击很小,绝对利润也很小
最优规模 → ★净利最大★
大规模   → 两条腿的冲击加起来超过价差
function optimalSize(poolA, poolB) {
  let best = { size: 0n, net: 0n };
  for (const size of candidateSizes) {
    const net = simulateRoundTrip(size, poolA, poolB);
    if (net > best.net) best = { size, net };
  }
  return best;
}

★把交易规模固定死、只挑"要不要做这个机会",是在两端都把钱留在桌上★ —— 深池里下得太小,薄池里做了赔本的单

如果你的检测是对的、交易还是会错过,免费领个 BoltTx key 改一行就能测测提交路径。

原子性不是可选项

两条腿必须在同一笔交易里。 这不是偏好 —— ★一个分两笔交易的套利不是套利,是两次方向性押注。★

const tx = new Transaction().add(
  buyOnPoolAIx,
  sellOnPoolBIx,        // ★同一笔交易 —— 要么都成,要么都不成★
);

一笔交易内的原子性,是 Solana 白给的,所以如果第二条腿会失败,整件事 revert,你保住本金、只损失基础手续费

这就是为什么 1232 字节上限和四层 CPI 嵌套天花板成了套利特有的约束。 两条池子腿加上代币程序调用,很快就把两份预算都吃掉 —— 所以:

★address lookup table 在这里比几乎任何地方都更重要★ —— 你的账户集合跨交易是稳定的,建表成本立刻摊平

直接路由胜过拆分路由。 更少账户、更少计算、更少层级。一条能落块的路由,胜过一个超出限制的、稍好一点的价格。

检测到落块之间的那几个 slot

★读到储备和执行之间的每一个 slot,都是别人拿走同一笔交易的机会。★

log({
  detectSlot,
  submitSlot,
  landSlot,
  staleness: landSlot - detectSlot,     // ★你的优势暴露了几个 slot★
});

由此推出两件事,而它们就是整个竞争图景:

你在 slot N 检测到的机会,到 slot N+3 可能已经没了 —— 被一个提交路径更快的人拿走了。

★你的最小输出检查,正是把"别人抢先了"从一次亏损变成一次 revert 的东西。★ 没有它,你会执行进一个已经不存在的价差,并为这个特权付钱。

最小值要从你算出的净利来设,不是从一个百分比。 一个"最小输出量 = 你的投入 + 手续费"的套利,要么赚钱、要么 revert —— 而那正是你想要的行为。

失败的尝试花你多少

套利机器人提交的远多于它落块的,而记账必须反映这一点:

metrics.record({ outcome, feeSpent: baseFee + priorityFee, netIfLanded });

★一次 revert 的套利,为一笔什么都没改变的交易付掉基础手续费和优先费。★ 在高频下这是一项真实的运营开支,不是可以四舍五入掉的零头。

要紧的数字是每次尝试的净利,不是每次成功的。 一个在好利润率下赢 20% 竞速的策略,可能不如一个在更小利润率下赢 60% 的 —— 而只有按尝试记账才看得出这一点。

大多数检测逻辑错在哪

陈旧的储备。 来自不同 slot 的价格,产出一个从未存在过的价差。★用一次 getMultipleAccountsInfo 把两个池子一起读。★

忽略费率档位。 池子费率不同;跨池比较原始储备比值,会把价差高估掉一个费率差

忘了 decimals。 两个小数位不同的代币,不做归一化会产出一个差好几个数量级的比值 —— 用 getMint 读出来,不要假设是 9。

假设是恒定乘积。 集中流动性池不遵循这个公式,所以那样算出来的价差是虚构的

用百分比思考。 ★一个薄池子上的大百分比,绝对利润小于一个深池子上的小百分比★ —— 而只有 lamport 数字能把机会排对序

上链应该是什么水平

我们投递节点上的真实交易:中位确认 336 毫秒 —— 不到一个 slot。

★对套利来说,那个数字是策略能不能成立本身,而不是一个性能指标。★ 一个能扛半个 slot、到两个 slot 就消失的优势,完全取决于你的提交到底有多快。

BoltTx 在这里的位置

我们负责提交。检测、定规模、构建路由都留在你的代码里

提交走我们自建的四区域投递节点,带 SWQoS 路由,不暴露公共 mempool —— 这对套利比对大多数策略更重要,因为一笔可被观察的交易,就是一个别人能在它落块之前拿走的机会

你在本地签名。我们不托管资金、不代签、不修改交易内容,包括你的最小输出量。tip 带在交易里、从你自己的钱包链上支付,交易失败时跟着一起 revert —— 这是 Solana 原子交易的机制决定的。只有到达链上的交易才计费。

免费领 API key,没有月费:

const connection = new Connection("https://la.bolttx.io/?api-key=YOUR_KEY");

常见问题

怎么在 Solana 上检测套利机会? 跨场所比较由池子储备推导出的价格。检测是简单算术;真正的工作是判断这个价差能不能扛过冲击、手续费和执行延迟。

我检测到的价差为什么不赚钱? 因为那个价差描述的是一笔无穷小的交易。你的规模在两条腿上都要付价格冲击,而且是在被你自己边执行边弄差的池子里。

真实的套利利润怎么算? 按你打算的规模,完整模拟穿过两个池子的来回,减去基础费和优先费,然后按 lamport 而不是百分比和零比较

多大的规模利润最高? 既不是最小也不是最大。利润在"规模带来的边际收益不再超过边际冲击"处见顶,所以要在候选规模里搜索,而不是固定一个。

两条腿必须在一笔交易里吗? 必须。没有原子性,你有的是两次方向性押注而不是套利,而第二条腿失败会让你握着一个不想要的仓位。

套利交易为什么会撞上体积上限? 两条池子腿引用很多账户、每个 32 字节。address lookup table 在这里帮助很大,因为你的账户集合稳定、跨交易复用。

CPI 深度怎么影响套利? 经聚合器的两条腿会逼近嵌套天花板。直接路由用更少层级和更少账户 —— 这就是它常常胜过稍好一点的拆分路由的原因。

怎么避免在一个已经过时的机会上执行? 从你算出的净利来设最小输出量。 如果价差在执行时已经收窄,交易会 revert,而不是以亏损成交。

一次失败的套利花多少钱? 基础手续费加优先费,为一笔什么都没改变的交易。在高频下这是一项真实的运营开支,属于按尝试记账的一部分。

该按成功还是按尝试算利润? 按尝试。 一个高胜率小利润的策略可能胜过低胜率大利润的,而只有按尝试的数字才看得出你手上是哪一种

两个池子为什么必须来自同一个 slot? 因为来自不同 slot 的价格会产出一个从未存在过的价差。用一次 getMultipleAccountsInfo 调用,让储备保持一致。

池子费率档位不同会影响检测吗? 会。跨不同费率的池子比较原始储备比值,会把价差高估掉一个费率差 —— 足以把一个真实优势变成想象出来的。

集中流动性会破坏套利检测吗? 它破坏的是恒定乘积公式。深度取决于价格相对流动性区间落在哪里,所以套用标准算术会产出一个自信但错误的价差。

decimals 怎么影响计算? 两个小数位不同的代币,不归一化会产出差好几个数量级的比值。这是一个静默错误,因为那个数字看起来仍然像一个价格

落块速度会改变套利的盈利能力吗? 直接改变。检测到执行之间的每一个 slot,都是竞争者拿走同一笔交易的机会,所以落块分布决定了你的检测里有多少能转化。

套利该用聚合器吗? 执行环节通常不该。聚合器路由增加账户、计算和 CPI 层级,而一条超出限制的路由,价值不如一条能落块的直接路由。

延伸阅读

返回博客列表