DEX 聚合路由算法:从 500 万流动性池到最优交易路径
TL;DR: DEX 聚合路由算法分两个阶段:首先从 500 万流动性池中筛选出约 1000 条可行路径,然后通过价格平衡算法将交易金额智能分配到多条路由,使所有路由的最终价格趋于一致,从而最大化总收益。对于 100 ETH 的大额交易,拆单优化可以比单一路由多获得 1500+ USDT。
前置知识:本文假设读者熟悉 AMM 的基本原理和滑点概念。如果不熟悉,建议先阅读 DEX 交易机制。
问题的本质:在海量可能性中寻找最优解
当用户想用 ETH 换 USDT 时,面临的不是一个简单的查询问题,而是一个组合优化问题。
市场上有约 500 万个流动性池,每个池的价格、深度、手续费都不同。理论上,从 ETH 到 USDT 的路径可以是直接兑换,也可以经过一个或多个中间代币。如果考虑所有可能的组合,路径数量是天文数字——单是三跳路由就有数十亿种可能。
更复杂的是,大额交易会显著改变池子的状态。在一个池子里交易 100 ETH,滑点可能高达 5%;但如果把这 100 ETH 分散到 10 个池子,每个池子只承受 10 ETH 的冲击,总滑点可能降到 1% 以下。这意味着最优解不仅要找到好的路径,还要决定每条路径分配多少资金。
这就是 DEX 聚合路由算法要解决的核心问题:在海量的路径空间中,找到收益最大化的交易方案。
算法架构:两阶段优化
整个算法分为两个阶段,每个阶段解决一个子问题。
第一阶段:多跳路由生成。从 500 万个池子中,生成所有可行的交易路径,并筛选出约 1000 条优质候选路由。这个阶段的目标是「不遗漏好路径」,同时「过滤掉明显差的路径」。
第二阶段:拆单与价格优化。在候选路由中,决定每条路由分配多少资金,使总收益最大化。这个阶段的目标是「让所有被选中路由的最终价格趋于一致」——这是数学上可证明的最优条件。

两个阶段的分离是有意为之的。路由生成是一个离散的组合问题,适合用过滤和剪枝来处理;价格优化是一个连续的数值问题,适合用二分搜索来逼近。把它们分开,可以让每个阶段使用最适合的算法。
第一阶段:多跳路由生成
数据预处理:从 500 万到 50 万
原始数据中充斥着无效池子。有些是「貔貅币」——只能买入不能卖出的诈骗代币;有些是钓鱼池,用虚假的高收益吸引用户;还有大量流动性极低的池子,交易手续费都无法覆盖。
第一步是清洗数据。过滤规则包括:
- 移除已知的诈骗代币和钓鱼池(基于黑名单)
- 移除流动性低于 1 美元的池子(无法覆盖 Gas 费)
- 移除长期无交易的死池
经过过滤,500 万个池子减少到约 50 万个有效池子。这一步将数据量减少了 90%,为后续计算奠定基础。
智能分组:按交易对特征分类
50 万个池子仍然太多,不能暴力枚举所有组合。关键洞察是:大多数组合是无效的。
以 ETH → USDT 交易为例,有效的路径必须满足「代币连续性」——前一跳的输出必须是后一跳的输入。这意味着我们可以按交易对特征将池子分组:
| 分组 | 描述 | 数量 |
|---|---|---|
| ETH-USDT 池 | 直达路由 | ~200 |
| ETH-TokenA 池 | 二跳路由起点 | ~1,500 |
| TokenB-USDT 池 | 二跳路由终点 | ~5,000 |
| TokenB-TokenC 池 | 三跳路由中间段 | ~300,000 |
分组之后,路由生成变成了在分组之间做笛卡尔积。单跳路由直接从 ETH-USDT 池中选取;二跳路由是 ETH-TokenA 池和 TokenA-USDT 池的组合;三跳路由则需要三个分组的组合。
路径生成与筛选
即使分组后,组合数量仍然庞大。二跳路由有 1,500 × 5,000 = 750 万种可能;三跳路由更是达到数十亿级别。
筛选策略是多层过滤,逐步收紧条件:
第一层:流动性深度过滤。计算每条路由的理论最大交易量(受限于路径中流动性最小的池子),移除低于阈值(如 100 美元)的路由。
第二层:代币匹配验证。确保路径的连贯性——前一跳输出的代币必须与后一跳输入的代币完全匹配。这听起来显而易见,但在实际数据中,同名代币可能有不同的合约地址。
第三层:路由去重。移除在同一条路由中重复使用同一个池子的情况。这种路由在数学上是无效的——你不能在同一个池子里同时买入和卖出同一种代币。
第四层:成本估算。对每条路由进行粗略的成本估算,包括预期滑点和 Gas 费用。移除成本明显过高的路由。
第五层:数量限制。为了保证后续计算的性能,最终保留约 1000 条优质路由。如果筛选后数量仍然过多,递归地收紧筛选条件,直到满足限制。
经过五层筛选,从数十亿条理论路径收敛到 1000 条实用路由。
第二阶段:拆单与价格优化
为什么要拆单
先看一个具体的对比。
不拆单:100 ETH 全部走 Uniswap V3 的 ETH-USDT 池。由于交易量大,滑点达到 5%,最终获得 199,500 USDT。
拆单:将 100 ETH 分配到多条路由。
| 路由 | 分配 | 滑点 | 获得 |
|---|---|---|---|
| Uniswap V3 | 35 ETH | 2% | 71,540 USDT |
| SushiSwap | 30 ETH | 1.5% | 61,710 USDT |
| Curve | 20 ETH | 1% | 41,580 USDT |
| Balancer | 15 ETH | 0.8% | 31,248 USDT |
| 合计 | 100 ETH | — | 206,078 USDT |
拆单后多获得 6,578 USDT,收益提升 3.3%。对于大额交易,这个差异非常可观。
拆单有效的原因是 AMM 的滑点是非线性的。在恒定乘积公式下,滑点与交易量的平方成正比。把一笔大交易拆成多笔小交易,总滑点会显著降低。
最优分配的数学原理
什么样的分配是最优的?答案是:让所有被选中路由的最终价格趋于一致。
这个结论可以用反证法证明。假设最优分配下,路由 A 的最终价格是 2,100 USDT/ETH,路由 B 的最终价格是 2,000 USDT/ETH。那么我们可以从路由 A 移一点资金到路由 B——路由 A 的价格会上升(因为交易量减少),路由 B 的价格会下降(因为交易量增加)。只要两者价格不相等,这种调整就能增加总收益。因此,最优解必然是所有路由价格相等。
这个原理类似于连通器中的水位平衡。每条路由就像一个水池,初始水位(价格)不同。我们要往这些水池里注水(分配资金),使最终水位趋于一致。

两步搜索算法
知道了最优条件,问题变成了:如何找到那个「平衡价格」?
我们使用两步搜索法:
第一步:确定价格区间。
- 价格下限:用全部资金走单一最优路由时的成交价
- 价格上限:用极小金额(如 0.1 ETH)测试所有路由,取最高价
这一步确定了搜索范围。最优价格一定在这个区间内。
第二步:二分搜索逼近。
给定一个目标价格 P,我们可以计算每条路由需要分配多少资金才能使其最终价格等于 P。如果所有路由的分配总和大于实际交易量,说明 P 太高,需要降低;反之则需要提高。
while (price_high - price_low > 1e-7):
price_mid = (price_high + price_low) / 2
total_allocation = sum(calculate_allocation(route, price_mid) for route in routes)
if total_allocation > target_amount:
price_high = price_mid
else:
price_low = price_mid
二分搜索的收敛速度是对数级的。通常 20-30 次迭代就能达到足够的精度。
路由数量限制
实际系统中,路由数量不能无限多。每增加一条路由,就增加一次链上交易,Gas 费用会累加。通常限制在 16 条以内。
如果初步计算得到的路由数量超过限制,需要进一步筛选。策略是逐步提高最小分配金额阈值,移除分配量过小的路由,直到数量满足限制。
实际效果
在生产环境中,算法的效果与交易规模相关:
| 交易规模 | 收益提升 | 典型路由数 |
|---|---|---|
| < 1 ETH | 0.1-0.3% | 1-3 |
| 1-10 ETH | 0.3-0.8% | 3-8 |
| 10-100 ETH | 0.8-2% | 8-16 |
| > 100 ETH | 1-3% | 16 |
小额交易的优化空间有限,因为 Gas 费用占比较高。大额交易的优化空间显著,拆单带来的收益远超额外的 Gas 成本。
局限性与权衡
延迟与准确性的权衡
路由计算需要时间。筛选 500 万个池子、生成路径、优化分配,整个过程可能需要数百毫秒。在这段时间内,市场价格可能已经变化。
实际系统通常采用缓存策略:预先计算常见交易对的路由,定期更新。用户请求时直接返回缓存结果,牺牲一定的准确性换取响应速度。
MEV 风险
聚合器的交易通常是公开的。专业的 MEV 机器人可以监控内存池,在用户交易之前插入自己的交易(front-running),或者在用户交易之后套利(back-running)。
部分聚合器通过私有交易池(如 Flashbots)来规避这个问题,但这增加了系统复杂性。
Gas 费用的不确定性
路由计算时估算的 Gas 费用可能与实际执行时不同。网络拥堵时,Gas 价格可能飙升,导致原本有利可图的拆单变得不划算。
进一步阅读
- 1inch Pathfinder — 1inch 聚合协议的技术文档
- Uniswap Auto Router — Uniswap 的多跳路由实现
- CoW Protocol Solver — 批量拍卖中的求解器机制
- Convex Optimization — 凸优化理论,价格平衡算法的数学基础
"Code is poetry written for machines, but read by humans. Optimize for the latter."