Pump.fun 狙击机器人是一种自动化 Solana 客户端,它监视 Pump.fun 程序以发现新代币创建,解码发行账户,并在竞争钱包之前或同时提交买入交易。难点不在于买入指令本身,而在于检测延迟、交易上链概率以及对成交质量的诚实测量。本文端到端解释其机制,提供可运行的检测和交易构建代码,并描述一套由你自己运行的测量流程,而不是轻信供应商的速度宣传。具体的端点和提供商选择留给 RPC Assistant,以保持方法论的可移植性。
范围与直接答案
Pump.fun 狙击机器人是一种程序,它订阅 Solana 上围绕 Pump.fun 发行程序的活动,识别新创建的代币铸造,并以配置好的优先费和滑点在其它买家之前填充联合曲线。它不是一次 API 调用:而是一条由检测、解码、交易构建、费用选择、提交和确认跟踪组成的流水线。
本文面向已经拥有 Solana 密钥对且对交易有基本了解的读者,介绍该流水线的工程实现。它不推荐特定机器人产品,也不声称任何实测速度。你关心的每个数字——检测延迟、上链率、成交价格——都必须在你自己的基础设施上测量,因为这些值取决于你的地区、RPC 路径、费用设置以及发行本身。
如果你只需要针对 Solana 交易工作负载的具体 RPC 端点或提供商建议,请使用 RPC Assistant 关于最佳 Solana RPC 提供商的指南,而不要将本页视为提供商列表。
- 假设:一个已注资的 Solana 密钥对、Node.js 或 Python,以及对你控制或租用的 Solana RPC 端点的访问权限。
- 不在范围内:法律、税务或市场建议;保证盈利的策略;任何关于胜率的声明。
- 交付物:一个检测循环、一个交易构建器,以及一个可重复运行的测量工具。
编写代码前的先决条件和假设
你需要一个支持机器人所用订阅和查询方法的 Solana RPC 端点。公共端点有速率限制,不适合狙击,因此请计划使用专用或高吞吐量端点;容量规划请参阅节点托管概述和 RPC 定价页面。你还需要 Pump.fun 程序 ID 及其 Anchor IDL,因为解码发行账户依赖于程序的账户布局,而不是公共 REST API。
假设发行程序可能发生变化。Anchor 判别符和账户顺序是程序接口的一部分,因此请固定你构建时所针对的 IDL 版本,并在任何程序升级后重新验证。还要假设你的交易将在同一槽位与许多其他交易竞争;设计必须容忍失败并重试,而不是假设一次提交就能上链。
- 密钥对存储在源代码管理之外,从环境变量(如 PRIVATE_KEY)加载。
- 一个 RPC_URL 占位符,替换为你自己的端点。
- Pump.fun 程序 ID 和用于解码的固定 IDL 文件。
- 一个日志接收器,以便每次检测和提交都带有时间戳,供后续分析。
发行检测的实际工作原理
有三种实用的检测路径,它们在延迟和运营成本上有所不同。第一种是日志订阅:订阅提及 Pump.fun 程序的日志,并过滤创建指令。第二种是账户订阅:监视程序关联账户或每个铸造派生的联合曲线账户。第三种是区块或 shred 级流式传输,你在传播路径中更早收到交易数据,代价是更多基础设施和解析工作。
日志订阅运营最简单,足以构建正确的机器人。它也是对 RPC 节点看到交易的速度以及转发通知的速度最敏感的路径。Shred 级或 Geyser 风格的流可以减少该延迟,但需要暴露它们的提供商以及处理未最终化数据的解析器。从日志开始,进行测量,然后决定更早的数据是否值得增加复杂性。
- 对发行程序使用提及过滤的 logsSubscribe:运营开销最低。
- 账户或程序订阅:当你需要账户状态而不仅仅是事件时有用。
- 区块或 shred 流式传输:最早的数据,最高的解析和基础设施负担。
JavaScript 中可运行的检测循环
以下脚本订阅 Pump.fun 程序的日志,并打印任何日志行包含创建判别符的签名。它刻意保持最小化:证明你的端点能传递通知,并给你一个可与区块时间比较的时间戳。将 RPC_URL 和程序 ID 替换为你自己的值,并在依赖判别符之前对照你固定的 IDL 进行确认。
在活跃发行期间运行几分钟。如果你完全没有看到通知,问题在于连接性或过滤器,而不是你的交易逻辑。如果你看到通知,但它们在代币已有交易之后才到达,说明你的检测路径太慢,应测试不同的订阅或端点。
import { Connection, PublicKey } from '@solana/web3.js';
const RPC_URL = process.env.RPC_URL;
const PUMP_PROGRAM_ID = new PublicKey(process.env.PUMP_PROGRAM_ID);
const CREATE_DISCRIMINATOR = process.env.CREATE_DISCRIMINATOR; // from pinned IDL
const connection = new Connection(RPC_URL, { wsEndpoint: process.env.WS_URL });
connection.onLogs(PUMP_PROGRAM_ID, (logInfo) => {
const hit = logInfo.logs.some((line) => line.includes(CREATE_DISCRIMINATOR));
if (!hit) return;
console.log(JSON.stringify({
detectedAt: Date.now(),
signature: logInfo.signature,
err: logInfo.err
}));
}, 'confirmed');
console.log('listening for Pump.fun create events');解码发行并构建买入交易
一旦获得签名,使用 getTransaction 以 jsonParsed 或 base64 编码获取交易,然后用 Pump.fun IDL 解码指令数据。你需要铸造地址、联合曲线账户以及买入指令期望的关联代币账户。不要猜测账户顺序:从 IDL 和获取交易的账户键中推导。
买入交易本身是一个普通的 Solana 交易,包含计算预算指令、优先费和程序的买入指令。通过模拟设置计算单元限制,而不是固定猜测,并根据近期网络状况设置优先费。滑点容忍度应放在程序支持的指令参数中;否则在你自己的交易前检查中根据联合曲线状态强制执行。
- 先用 simulateTransaction 模拟,在花费费用前捕获账户或滑点错误。
- 显式添加 ComputeBudgetProgram.setComputeUnitLimit 和 setComputeUnitPrice。
- 本地签名;切勿将私钥发送给 RPC 提供商。
- 使用区分 processed、confirmed 和 finalized 的确认策略跟踪签名。
带优先费的可运行交易提交
这个 Python 草图展示了提交路径的形态:构建交易、模拟、设置计算单元价格、签名,并使用重试循环发送。它使用程序指令的占位符,因为确切的账户来自你解码的发行。重要的工程细节是发送路径对每次发行是幂等的,并为每次尝试记录时间戳。
保持重试有界。重新广播相同的已签名交易在其区块哈希过期前是安全的;使用新区块哈希和更高费用重建是另一个决策,应单独记录,以保持测量数据干净。
import os, time, json
from solana.rpc.api import Client
from solana.rpc.commitment import Confirmed
from solana.transaction import Transaction
from solders.keypair import Keypair
from solders.compute_budget import set_compute_unit_limit, set_compute_unit_price
RPC_URL = os.environ['RPC_URL']
client = Client(RPC_URL)
payer = Keypair.from_base58_string(os.environ['PRIVATE_KEY'])
def submit(build_ix, cu_limit=200_000, micro_lamports=50_000, attempts=3):
for attempt in range(attempts):
tx = Transaction()
tx.add(set_compute_unit_limit(cu_limit))
tx.add(set_compute_unit_price(micro_lamports))
tx.add(build_ix())
tx.recent_blockhash = client.get_latest_blockhash(Confirmed).value.blockhash
tx.sign(payer)
sim = client.simulate_transaction(tx)
if sim.value.err:
print(json.dumps({'attempt': attempt, 'simErr': str(sim.value.err)}))
return None
sent = client.send_raw_transaction(tx.serialize())
print(json.dumps({'attempt': attempt, 'sentAt': time.time(), 'sig': str(sent.value)}))
time.sleep(0.2)
return None自行测量检测和上链延迟
供应商页面引用毫秒级执行时间,但这些数字在不同机器人、地区或网络条件下不可比较。相反,构建你自己的测量工具。对于你检测到的每次发行,记录四个时间戳:发行交易的区块时间、检测回调触发的时间、提交的时间以及买入确认的时间。区块时间与检测之间的差值是检测延迟;提交与确认之间的差值是上链延迟。
在不同时段运行至少几十次发行,并将结果记录在下表中。在有真实数据之前将单元格留空;不要用估计值填充。聚合中位数和第 90 百分位数而不是平均值,因为延迟分布受异常值影响而偏斜。
| 发行签名 | 区块时间 | 检测时间 | 提交时间 | 确认时间 | 检测延迟 (ms) | 上链延迟 (ms) | 成交价 vs. 首笔交易 |
|---|---|---|---|---|---|---|---|
| (你的运行) |
- 所有时间戳使用相同的时钟源;仅使用 NTP 同步的主机。
- 将失败和丢弃的提交记录为单独的行,而不是缺失数据。
- 将成交价格与同一槽位的首笔交易比较,以判断你是早还是晚。
预期的验证结果
正确接线的检测循环在活跃期间会产生稳定的创建事件流,每个事件都有一个你可以在 Solana 浏览器上查找的签名。正确构建的交易模拟无错误,并在提交时返回签名。正确测量的运行会生成一个包含非空时间戳以及成功和失败尝试混合的表格,这在竞争激烈的发行中是正常的。
如果你的检测循环静默,请将 WebSocket 端点与 HTTP 端点分开检查;许多提供商将它们暴露在不同的主机上。如果模拟因账户错误失败,你的 IDL 或账户推导已过时。如果提交返回签名但从未确认,你的优先费可能低于当前市场,并且你的区块哈希可能在纳入之前过期。
常见故障模式的故障排除
大多数狙击机器人故障分为四类:检测、解码、上链和记账。检测故障表现为静默或延迟事件。解码故障表现为模拟期间的账户未找到或无效指令错误。上链故障表现为已发送但未确认的签名。记账故障表现为已上链但未记录的交易,这会破坏你的测量数据。
按此顺序处理。确认订阅至少能传递任何内容,然后确认 IDL 与链上程序匹配,然后调整费用和重试行为,最后将日志与链上历史对账。在检测损坏时跳到费用调整会导致关于端点性能的误导性结论。
- 订阅静默:验证 WS_URL、程序 ID,以及端点是否允许订阅。
- 模拟账户错误:刷新 IDL 并重新推导联合曲线和代币账户。
- 已发送但未确认:提高计算单元价格、刷新区块哈希,并检查槽位状态。
- 记录缺失:将签名与你的钱包的 getSignaturesForAddress 对账。
限制、权衡和风险控制
狙击在边际上是一场负和竞赛:每个参与者的速度优势都是相对的,检测或费用的改进很快会被匹配。可靠上链的机器人仍然面临逆向选择,因为你赢得的发行往往是其他机器人拒绝的。将任何策略视为实验性的,并在代码中而非纪律中限制每次发行和每日的风险敞口。
在运营上,更早的数据成本更高且更频繁地中断。Shred 级流需要自定义解析并容忍未最终化数据,因此你的机器人必须处理回滚。日志订阅更简单但更慢。根据你工作负载的实测检测延迟来选择,而不是营销宣传。关于容量和端点选择,专用节点概述和 RPC 端点指南解释了共享与专用基础设施之间的权衡。
- 在签名路径中强制执行头寸大小和每日支出的硬性上限。
- 当错误率超过阈值时停止提交的终止开关。
- 用于实验和用于你关心的资本的钱包分开。
- 升级后定期重新验证程序 IDL。
后续步骤
一旦检测和提交稳定,最高杠杆的改进是测量纪律和基础设施布局。每周运行延迟测量工具,保留结果表,并一次更改一个变量:端点、地区、订阅类型或费用政策。这将调优从猜测变为实验。
对于具体的端点决策,交给 RPC Assistant,而不是从列表文章中复制提供商名称。如果你仍在选择网络或规划容量,请查看支持的网络和 RPC 定价层级,如果你的测量显示共享端点是瓶颈,考虑专用节点。
- 阅读最佳 Solana RPC 提供商指南以选择端点。
- 在主网外测试策略前查看 Solana devnet 指南。
- 在定价页面上比较共享和专用容量。
- 将测量表与机器人配置一起进行版本控制。