Solana 上新狙击:首块那几个 slot 的问题

要在 Solana 上新的头几个区块里买到,实际需要什么;大多数机器人为什么都晚了;以及怎么分清是执行问题还是策略问题。

BoltTx Team··15 min read
solana上新狙击机器人交易上链首块交易机器人

每次上新都有那么几个区块,价格还贴着起点。过了之后,买入就只是普通交易了 —— 你付的是别人已经推上去的价格。

这两种情况之间隔着几个 slot。落在里面还是外面,就是全部输赢。

"首块"到底指什么

有个常见误解值得先澄清。"首块买入"并不是说你的交易和代币创建在同一个区块里 —— 通常做不到,因为你是通过观察那个区块才知道代币存在的,最早也只能在下一个区块动手。

★现实中你竞争的是第二到第四个区块。★ 所有知道这次上新的人都在往这个窄窗口里挤,所以这也是这个代币一生中最拥堵的时刻。

所以真正的问题不是"我能不能第一个",而是**"我能不能在价格跑过我的利润空间之前落块"**。

时间花在哪了

① 代币创建落在区块 N
② 你观察到               (区块 N,加上解析耗时)
③ 判断并构造             (你的代码,亚毫秒)
④ 提交                   (一次网络跳)
⑤ 你的买单落块           (手快的话是区块 N+2)

第 2、3 步是你的,而且很快。★第 4、5 步是网络,slot 就花在那里。★

陷阱在于:只有第 2 步有明显可优化的地方 —— 更快的 WebSocket、更好的解析器、专用数据流 —— 所以它吸走了全部注意力,而它的贡献最小。

如果检测已经跑通、问题在第 5 步,免费领个 BoltTx key 改一行就行。这篇剩下的讲的是你能控制的那些。

预热这一招

在你自己的代码里,唯一真正有效的延迟优化,是在上新触发之前就把一切准备好

// 后台缓存并定时刷新,绝不在用时才取。
let cachedBlockhash = await connection.getLatestBlockhash("confirmed");
setInterval(async () => {
  cachedBlockhash = await connection.getLatestBlockhash("confirmed");
}, 5_000);

// 把连接预热,让热路径上不发生 TLS 握手。
await connection.getSlot();

★在"我看到上新"和"我提交"之间的任何一次网络调用,都会让你损失一个再也追不回来的 slot。★ 用时才调 getLatestBlockhash、解析 DNS、建立 TLS 连接 —— 每一个都是一次往返,而它们都可以提前做掉。

无法预签的是交易本身,因为 mint 地址在上新之前并不存在。但其它一切都可以就位:连接热着、blockhash 新鲜、费用逻辑算好、指令模板搭好。

上新时的费用

上新是那个账户上竞争最激烈的时刻。平时够用的费用在这里什么都不是。

import { ComputeBudgetProgram } from "@solana/web3.js";

// 费用按账户竞争。上新时,每个狙击者都在写
// 和你相同的那些账户。
const recent = await connection.getRecentPrioritizationFees({
  lockedWritableAccounts: [curveAccount, yourTokenAccount],
});
const fees = recent.map((r) => r.prioritizationFee).sort((a, b) => a - b);
const median = fees[Math.floor(fees.length / 2)] ?? 0;

instructions.unshift(
  ComputeBudgetProgram.setComputeUnitPrice({
    // 近期中位数反映的是平常状况,不是上新。
    // 把它当下限,然后往上乘。
    microLamports: Math.max(median * 3, 10_000),
  }),
  ComputeBudgetProgram.setComputeUnitLimit({ units: 120_000 }),
);

★注意那条 setComputeUnitLimit 指令。★ 不设的话会按一个远高于真实用量的默认值计费,而这恰好浪费在费用最高的时刻。

浅流动性下的仓位大小

头几个区块里,池子很浅。你自己这一笔就会明显推动价格,别人的也一样。

于是有个反直觉的结果:★买得多,每个代币的成本可能反而更高★,而且这个效应在你最想抢的那几个区块里最强。

发出去之前,先用刚读到的曲线或池子状态算一下你这个仓位会把价格推多少。如果光你这一笔就推 8%,那你得判断对超过 8% 这笔交易才划算 —— 这还没算别人的买单。

滑点不是你以为的那个旋钮

大家常掉进的循环:

容忍度设紧  → 交易失败,基础费照付
容忍度放松  → 成交在一个把利润抹掉的价格上

两边都是亏。★真正起作用的变量是你花了几个 slot★ —— 因为容忍度吸收的,正是从检测到收录之间的价格移动。

如果你稳定晚四五个 slot,任何容忍度设置都救不回来。先把 slot 数压下去,再把容忍度设成剩下那点波动所需要的值。

上链应该是什么水平

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

检测后两个 slot 落块,你还在"价格朝有利方向动"的窗口里。五个 slot,你就进入普通交易了 —— 拼的是价格而不是速度。

★上新时那个数字会拉长★ —— 大部分交易不受影响,少数明显变慢。而狙击按定义就活在这少数里,因为上新本身就是那个拥堵事件

分清执行问题和策略问题

你能做的最有价值的一件事,是把两个在盈亏表上看起来一样的问题分开。

log({
  mint,
  detectSlot,
  landSlot,
  slotGap: landSlot - detectSlot,      // 执行
  priceAtDetect,
  priceAtFill,
  entryGapBps: Math.round(((priceAtFill - priceAtDetect) / priceAtDetect) * 10_000),
  exitPnlBps,                           // 策略
});

★如果 slotGap 很小、你还是在亏,问题在于你选了哪些上新,而不是怎么执行。★ 如果 slotGap 很大,选币再准也补不回来。

大多数人以为是前者,实际上是后者。测一下只要一个下午,能省几个月。

值得说实话的部分

上新狙击是个拥挤的活动。看到这篇的所有人,面对同样的上新、拥有同样的公开信息,任何单一技巧带来的优势都很小。

但有一点可靠地成立:★相当大一部分机器人在提交侧调得很差★ —— 写死的费用、只尝试一次、过期的 blockhash、拥堵时用通用端点。把这些修好能让你领先大多数参与者。但它不会让你成为第一,任何这么承诺的人都是在卖东西。

BoltTx 在这里的位置

我们做第 5 步。不做检测,不做上新 feed,不做索引。

提交走我们自建的四区域投递节点,带 SWQoS 路由,不暴露公共 mempool —— 交易在落块之前,传输途中观察不到。你在本地签名,我们不托管资金、不代签、不修改交易内容。

tip 带在交易里,从你自己的钱包链上支付。交易 revert 的话 tip 跟着一起 revert —— 这是 Solana 原子交易的机制决定的。只有到达链上的交易才计费。

免费领 API key,没有月费:

// 选离你机器人最近的区域
const connection = new Connection("https://la.bolttx.io/?api-key=YOUR_KEY");

然后拿几次真实上新记录 slotGap,和你现在用的做对比。

常见问题

真的能在 Solana 代币上新的第一个区块买到吗? 实际上买不到创建区块本身。你是通过观察那个区块才知道代币存在的,所以最早只能在下一个区块动手。竞争发生在随后的几个区块,那里价格还贴着起点。

上新之后我有几个 slot 的时间? 取决于流动性和有多少机器人在盯。活跃的上新里,明显的价格移动在头几个区块内就发生了 —— 这就是为什么落在第 2 个还是第 6 个 slot,往往决定整笔交易。

为什么我的上新狙击总是成交在很差的价格? 因为你在别人的买单已经推动价格之后才落块。把检测时和成交时的价格都记下来。如果价差很大而 slot 差很小,那说明你选的是动得太快、本来就不适合跟的上新,不是执行差。

上新前能预签交易吗? 买入交易本身不能预签,因为 mint 在上新之前不存在。但其它一切都能预热:定时刷新的 blockhash 缓存、热连接、以及准备好随时运行的费用逻辑。

上新狙击的 priority fee 该设多少? 按你会写入的账户查近期费用,然后为竞争场景往上乘。近期中位数反映的是平常状况,而上新是那个账户一生中最不平常的时刻

买得多是不是更容易先成交? 不是,而且通常更糟。仓位大小不影响排程,但在浅池子里会把价格推向对你不利的方向。买得越多,在你最想抢的那几个区块里,平均成交价越差。

为什么我的狙击机器人有些上新能成、有些不行? 流动性深度和竞争程度不同。冷清的上新给你好几个区块的余地;被重点盯的几乎不给。先看看失败是不是集中在最热闹的那些上新,再去怀疑代码。

怎么在不增加延迟的前提下保持 blockhash 新鲜? 后台短周期刷新,热路径上只读缓存。用时才取会在检测和提交之间加一次往返,而那正是唯一付不起往返的地方。

首块狙击赚钱吗? 对一部分参与者、在一部分上新上是的。优势来自执行质量和上新选择两者叠加。把提交当成事后补的一环的团队,通常是在给不这么做的人送钱。

Solana 上狙击和抢跑有什么区别? 狙击是对一个已经在链上可见的上新行动 —— 用的是公开信息。抢跑是在一笔待确认交易被收录之前、基于对它的知情去行动。Solana 没有公共 mempool,所以后者不像 mempool 链上那样可行。

用多个钱包同时狙击一次上新有用吗? 它会成倍增加你的费用成本,而不会提高任何单笔交易落块的概率。排程因素是按交易计算的,所以几笔平庸的提交加不出一笔好的。

为什么我瞬间就看到上新,却晚三个 slot 落块? 检测和提交是两个不同的问题。解析一行日志是亚毫秒级的;而在拥堵下把字节送到出块方,是一条有好几跳的网络路径 —— slot 就是在那里累积的。

怎么判断瓶颈是不是我的 RPC? 对比清闲时段和上新窗口的上链率。如果清闲时稳、高负载时掉,而 blockhash 新鲜、费用也是实时算的,那剩下的就是提交路径。

上新买入该设多少 compute unit limit? 开发阶段模拟一次拿到真实消耗,设一个略高的值。用默认值意味着按一个高得多的数字计费,而这在上新时最贵。

落在第 2 个区块和第 4 个区块,真的差很多吗? 活跃上新时是的 —— 那往往是好几个百分点的价格移动。冷清的上新可能完全没差。两个都记下来,你就知道自己实际在交易哪一类上新。

延伸阅读

返回博客列表