每次上新都有那么几个区块,价格还贴着起点。过了之后,买入就只是普通交易了 —— 你付的是别人已经推上去的价格。
这两种情况之间隔着几个 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 个区块,真的差很多吗? 活跃上新时是的 —— 那往往是好几个百分点的价格移动。冷清的上新可能完全没差。两个都记下来,你就知道自己实际在交易哪一类上新。
延伸阅读
- pump.fun 狙击机器人
- pump.fun API 实战
- Solana 交易上链完全指南
- Solana priority fee 指南
- Solana SWQoS 讲清楚