Skip to content
survivorff's blog
Go back

一笔 Solana 交易的一生

8 min read

开场

用户点击「买入」的那一刻,对他来说是一个动作。

对平台来说,是一条流水线的启动。这条流水线上有 10+ 个环节,每个环节都可能卡住或失败。平台的核心工程能力,就体现在怎么把这条流水线做得又快又稳。

我见过不少新手开发者上手就做交易 Bot,然后在用户投诉「交易失败」「买不到」的时候不知道问题出在哪里。因为他们只看到了”发一笔交易”这一步,没看到前后还有十几步。

这篇文章把整条流水线摊开讲一遍。


流水线全景

用户点击「买入 1 SOL 的 Token X」

  ├─ 1. 参数校验
  ├─ 2. 路由选择
  ├─ 3. 交易构建
  ├─ 4. 交易模拟
  ├─ 5. 签名
  ├─ 6. 提交(Jito Bundle 或直接 RPC)
  ├─ 7. 传播到 Leader
  ├─ 8. 排队进入区块
  ├─ 9. 执行
  ├─ 10. 确认
  └─ 11. 状态同步到用户

下面逐个拆。


步骤 1-3:交易构建阶段

1. 参数校验

平台首先要判断这笔交易是否值得提交:

成熟的平台在这一步就会拦截 80% 的问题交易,不让它们进入后续流水线,节省大量资源。

2. 路由选择

同一个 Token 可能在多个 DEX 上有流动性:

Token X 的流动性分布:
  - PumpSwap: 60%
  - Raydium:  30%
  - Meteora:  10%

买入 1 SOL 的最优路径可能不是走流动性最深的池子,而是拆单:

0.6 SOL → PumpSwap
0.3 SOL → Raydium
0.1 SOL → Meteora

这样每个池子的价格影响都更小,总滑点最低。

实现选择

大多数成熟平台的方案:狙击直连 PumpSwap / Raydium(追求速度),普通交易走 Jupiter(追求最优价格)

3. 交易构建

构建一笔 Solana 交易需要设置:

对于复杂路由(多跳、多 DEX),还要考虑:


步骤 4:交易模拟

这是最容易被新手忽视、但至关重要的一步。

const simulation = await connection.simulateTransaction(tx);
if (simulation.value.err) {
  // 模拟失败,不要提交
  return handleSimulationError(simulation);
}
// 从模拟结果获取准确的 CU 消耗
const actualCU = simulation.value.unitsConsumed;

为什么要模拟?

  1. 提前发现会失败的交易(滑点超限、流动性不足等),避免白白浪费 Gas
  2. 获取准确的 CU 消耗,精确设置 CU Limit(设太低会失败,设太高浪费钱)
  3. 检查是否触发蜜罐(买入交易如果显示返回 0 Token,就是蜜罐)

什么时候可以跳过模拟?

但要承担额外的失败率。


步骤 5-6:签名和提交

5. 签名

速度对比

这就是为什么几乎所有专业 Meme 交易平台都提供托管钱包选项 —— 速度在这个场景下比安全性优先级更高(用户自己也愿意接受这个权衡)。

6. 提交

有两种提交方式:

方式 A:直接通过 RPC 提交

const sig = await connection.sendTransaction(tx);

方式 B:通过 Jito Bundle 提交

const bundle = [tx];
await jitoClient.sendBundle(bundle, tipAmount);

实战策略

高级玩法:两种方式同时提交,哪个先成功用哪个。代价是多付一份费用,收益是最大化落链率。


步骤 7-9:链上执行阶段

7. 传播到 Leader

Solana 每个 slot 有一个指定的 Leader 验证者负责打包交易。你的交易需要传到那里。

影响传播速度的因素:

优化手段

8. 排队进入区块

Solana 每个区块的容量有限:

当交易量暴增(热门 Token 发射),你的交易会和其他交易竞争打包顺序。Priority Fee 和 Jito Tip 决定了优先级。

经验值(2025 年数据)

9. 执行

进入区块后,验证者按顺序执行每一笔交易。执行结果有三种:

这里一个微妙的点:失败和 Dropped 对用户都显示为「交易失败」,但处理方式完全不同:

平台的监控需要区分这两种情况才能给出正确反馈。


步骤 10-11:确认与同步

10. 确认

Solana 有三个确认级别:

级别含义延迟适用
processed节点已处理~400ms乐观展示
confirmed多数验证者确认~1s一般操作
finalized不可回滚~6-12s大额资金

对 Meme 交易

11. 状态同步

交易确认后,平台要做一系列后续操作:


全流程的延迟预算

一笔典型的 Meme 交易,端到端时间预算:

参数校验、路由、构建:  50ms
交易模拟:              50-100ms
签名:                  0-5ms(托管)
提交到 Jito:           50-100ms
传播到 Leader:         100-200ms
等待区块:              400ms(一个 slot)
执行 + 确认:           1-2s
状态同步、通知:        100ms
━━━━━━━━━━━━━━━━━━━
总计:                  2-3s

这就是为什么你在平台上点击「买入」,通常 2-3 秒能看到结果。 快于这个数字的是特殊优化,慢于这个数字的说明某个环节出了问题。


失败处理:比成功路径更重要

一个专业交易平台 70% 的代码在处理失败场景。

常见失败原因和处理

失败原因自动处理需要用户介入
Blockhash 过期用新 Blockhash 重试-
CU Limit 不足增加 CU 重试-
Priority Fee 不够提高 Fee 重试-
滑点超限是否自动调高?(风险决策)通常需要用户确认
余额不足-提示充值
Token 流动性枯竭-提示
RPC 错误切换 RPC 重试-
Jito Bundle 失败降级为直接提交-

好的平台把这些处理做得对用户透明,让用户感觉”交易很少失败”。差的平台把错误原样抛给用户,导致用户看到一堆看不懂的报错。


给开发者的几个建议

  1. 先模拟再提交,失败率能降低 50% 以上
  2. 动态设置 Priority Fee,不要写死
  3. 监控每一步的延迟,发现瓶颈才能优化
  4. 准备好降级策略,Jito 挂了要能退回直接提交,主 RPC 挂了要能切换备用 RPC
  5. 把失败处理做好,这直接决定了用户体验

系列文章

这是《Meme 交易平台深挖》系列第 3 篇。

后续计划:


Share this post on:

Previous Post
Pump.fun 凭空造了一个十亿美元市场
Next Post
Solana 为什么赢了 Meme 交易这一局

继续阅读

如果觉得有用

订阅更新,每次发新文章第一时间收到。不发广告、不搞推销。