介绍
去中心化交易所 (DEX) 依靠代币储备来确定交易价格,从而实现无需许可的交易,但也无意中引入了市场漏洞利用 (MEV) 的机会。由于攻击者可以重新排序、插入或删除 DEX 交易周围的交易,他们可以利用暂时的价格差异,透过套利或夹心攻击来牟利。
为什么如今MEV搜寻速度如此缓慢?
MEV 搜寻是一个最佳化问题:给定一个记忆体池和一个 DEX 环境,我们希望评估成千上万,有时甚至是数百万个可能的交易包,并选择最有利可图的交易包。
为了诊断瓶颈,我们使用两种最先进的工具重现了七个历史套利 MEV 范例(见附录):
- Foundry 是 Rust 中最快的 CPU 端 EVM。
- Lanturn,一个用 TypeScript 写的 MEV 搜寻器。
环境:
- 英特尔 i7
- RTX3090Ti 24G
- 1T固态硬碟
- Ubuntu 22.04
我们对每种工具进行了 1000 次回放,并测量了时间在三个主要阶段的分配情况:
- 从主网态分叉
- 产生输入包
- 执行智能合约
我们的研究结果与先前的研究相符:输入产生过程微不足道(<1%),但EVM执行和分支过程才是端到端延迟的主要来源。代工厂支出:
- 80.89%的时间用于分叉(27.87 毫秒)
- 执行交换操作耗时18.82% (6.49 毫秒)
Lanturn 的效能较差:尽管采用了多执行绪技术,但其 EVM 执行速度比 Foundry慢 17.8 倍,分叉速度慢 1.98 倍。
简而言之:MEV 搜寻受限于 CPU 执行速度,而 CPU 根本无法快速探索搜寻空间。
将 MEV Bot 编译为 GPU 程式码
为了突破 CPU 瓶颈,我们使用 GPU:
- 用 Solidity 编写 MEV 机器人(例如,执行多跳套利的路由器)。
- 使用mau将智能合约编译为 LLVM IR。
- 使用LLVM 后端产生 PTX 程式码(CUDA 汇编)
- 在 GPU 执行绪上原生执行
这是我们用作运行范例的 Solidity 机器人。它的备用处理程序会解析描述交换的压缩位元组格式,确定 DEX 类型,并呼叫正确的swap()函数:
// SPDX-License-Identifier: UNLICENSEDpragma solidity 0.7.6;import "./libraries/uniswapv2/UniswapV2Pair.sol";import "./libraries/uniswapv3/UniswapV3Pair.sol";import "./libraries/sushiswap/SushiswapPair.sol";import "./libraries/pancakeswap/PancakeswapPair.sol";contract MEV {fallback(bytes calldata data) external payable returns (bytes memory) {uint256 amount = abi.decode(data[:32], (uint256));uint32 swap_len = uint32(abi.decode(data[32:], (bytes4)));uint32[] memory swap_vec = new uint32[](swap_len);uint32[] memory token_vec = new uint32[](swap_len);uint32 calldata_size = uint32(data.length);uint32 swaps_buf_size = (calldata_size - 32 - 4) / 2;for (uint32 i = 0; i < swap_len; i++) {swap_vec[i] = uint32(abi.decode(data[36 + i * 4:], (bytes4)));uint256 token_word = abi.decode(data[36 + swaps_buf_size + 32 * (i / 8):], (uint256));token_vec[i] = uint32(token_word >> (256 - 32 * (i % 8 + 1)));}for (uint32 i = 0; i < swap_len; i++) {bool reversed = token_vec[i] > token_vec[(i + 1) % swap_len];uint32 swap_u32 = swap_vec[i];uint8 dex_type = uint8(swap_u32 >> 24);address dex = address(swap_u32 & 0xFFFFFF);if (dex_type == 1) {amount = UniswapV2Pair(dex).swap(reversed, amount);} else if (dex_type == 2) {amount = UniswapV3Pair(dex).swap(reversed, amount)} else if (dex_type == 3) {amount = SushiswapPair(dex).swap(reversed, amount);} else if (dex_type == 4) {amount = PancakeswapPair(dex).swap(reversed, amount);} else if (dex_type == 5) {continue;}}return abi.encodePacked(amount);}}编译成 PTX 格式后,机器人就变成了可执行的 GPU 程式码。与 CPU 一次评估一个软体包不同,我们会启动数万个线程,每个线程测试一个不同的候选软体包。
平行遗传演算法:同时搜寻数千个捆绑包
平行遗传演算法 (GA) 用于在 GPU 上搜寻捆绑包。每个 GPU 执行绪代表族群中的一个个体(即一个捆绑包)。在每一代中,演算法执行以下操作:
- 选择-选择利润最高的套餐
- 交叉-将它们重新组合成新的子代基因组
- 变异-调整去中心化交易所、代币或排序方式,以获得新的捆绑包作为不变式。
- 评估-在GPU上运行有不变束的MEV机器人
这种工作流程使我们能够以极快的速度探索广阔的搜寻空间。它可以同时评估多个种群,从而实现广泛而深入的搜寻覆盖。
绩效结果
表格:2025 年第一季确定的新 MEV 机遇
| ETH利润 | ETH收入 | ETH Gas | 美元利润 | 美元收入 | 美元天然气 | |
|---|---|---|---|---|---|---|
| 套利 | 347.75 | 348.30 | 0.54 | 916,334.25 | 917,760.85 | 1,426.60 |
| 三明治 | 102.97 | 111.04 | 8.07 | 271,316.03 | 292,586.67 | 21,270.63 |
| 全部的 | 450.72 | 459.34 | 8.61 | 1,187,650.28 | 1,210,347.52 | 22,697.23 |
在各项实验中,我们实现了每秒 330 万至 510 万笔交易的处理速度,比 Lanturn 的效能高出约 10 万倍。基于 2025 年第一季的真实数据,该系统发现了 2 至 14 笔交易的 MEV 机会,可提取利润达 110 万美元。
运转时开销:轻量级且稳定
MEVISOR 引入了两种类型的开销:冷启动开销和每次搜寻开销。
冷启动(一次性)
搜寻之前,GPU 必须载入 PTX 机器人并初始化记忆体。
这需要 7.03 秒,但只会发生一次,并且会在以后的所有搜寻中分摊。
运行时开销
主要的运行时开销是将 DEX 状态快照载入到 GPU 记忆体中。
随著我们将 DEX 池从 64 个扩展到 540 个:
- 载入延迟稳定在约 0.30 秒。
- GPU记忆体使用量线性成长(774 MB → 1.58 GB)
即使有数百个 DEX,MEVISOR 也能轻松保持在普通 GPU 的 VRAM 限制以下,并保持低、可预测的开销。
附录
动机范例
| 长度 | 堵塞 | 资本(ETH) | 收入(ETH) | DEX 链 | 资产链 |
|---|---|---|---|---|---|
| 2 | 21536202 | 0.05 | 0.0002 | 0x1DC698b3d2995aFB66F96e1B19941f990A6b2662, 0x9081B50BaD8bEefaC48CC616694C26B027c559bb | 0x4c11249814f11b9346808179Cf06e71ac328c1b5, 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 |
| 3 | 14079213 | 0.12 | 0.0009 | c926990039045611eb1de520c1e249fd0d20a8ea, 62ccb80f72cc5c975c5bc7fb4433d3c336ce5ceb, 77bd0e7ec0de000eea4ec88d51f57f1780e0dfb2 | 0x557B933a7C2c45672B610F8954A3deB39a51A8Ca, 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2, 0xe53EC727dbDEB9E2d5456c3be40cFF031AB40A55 |
| 4 | 12195667 | 0.64 | 0.0196 | 0x1f44e67eb4b8438efe62847affb5b8e528e3f465, 0x41ca2d9cf874af557b0d75fa9c78f0131c7f345c, 0x088ee5007c98a9677165d78dd2109ae4a3d04d0c, 0xa478c2975ab1ea89e8196811f51a7b7ade33eb11 | 0x6b175474e89094c44da98b954eedeac495271d0f, 0xbcda9e0658f4eecf56a0bd099e6dbc0c91f6a8c2, 0x0bc529c00c6401aef6d220be8c6ea1667f6ad93e, 0x6b175474e89094c44da98b954eedeac495271d0f |
| 5 | 13734406 | 2.04 | 0.0452 | 0x60594a405d53811d3bc4766596efd80fd545a270, 0x1d42064fc4beb5f8aaf85f4617ae8b3b5b8bd801, 0x9f178e86e42ddf2379cb3d2acf9ed67a1ed2550a, 0xfad57d2039c21811c8f2b5d5b65308aa99d31559, 0x5777d92f208679db4b9778590fa3cab3ac9e2168 | 0x6b175474e89094c44da98b954eedeac495271d0f, 0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2, 0x1f9840a85d5af5bf1d1762f925bdaddc4201f984, 0x514910771af9ca656af840dff83e8264ecf986ca, 0x6b175474e89094c44da98b954eedeac495271d0f |
| 6 | 14530401 | 0.41 | 0.0182 | 0xa478c2975ab1ea89e8196811f51a7b7ade33eb11, 0x5ab53ee1d50eef2c1dd3d5402789cd27bb52c1bb, 0x59c38b6775ded821f010dbd30ecabdcf84e04756, 0x9f178e86e42ddf2379cb3d2acf9ed67a1ed2550a, 0x153b4c29e692faf10255fe435e290e9cfb2351b5, 0x1f44e67eb4b8438efe62847affb5b8e528e3f465 | 0x6b175474e89094c44da98b954eedeac495271d0f, 0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2, 0x7fc66500c84a76ad7e9c93437bfc5ac33e2ddae9, 0x1f9840a85d5af5bf1d1762f925bdaddc4201f984, 0x514910771af9ca656af840dff83e8264ecf986ca, 0x6b175474e89094c44da98b954eedeac495271d0f |
| 7 | 13731798 | 0.24 | 0.0202 | 0x1f44e67eb4b8438efe62847affb5b8e528e3f465, 0x153b4c29e692faf10255fe435e290e9cfb2351b5, 0x14243ea6bb3d64c8d54a1f47b077e23394d6528a, 0xd75ea151a61d06868e31f8988d28dfe5e9df57b4, 0x088ee5007c98a9677165d78dd2109ae4a3d04d0c, 0x41ca2d9cf874af557b0d75fa9c78f0131c7f345c, 0x1f44e67eb4b8438efe62847affb5b8e528e3f465 | 0x6b175474e89094c44da98b954eedeac495271d0f, 0xbcda9e0658f4eecf56a0bd099e6dbc0c91f6a8c2, 0x514910771af9ca656af840dff83e8264ecf986ca, 0x7fc66500c84a76ad7e9c93437bfc5ac33e2ddae9, 0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2, 0x0bc529c00c6401aef6d220be8c6ea1667f6ad93e, 0x6b175474e89094c44da98b954eedeac495271d0f |
| 8 | 13754757 | 2.48 | 0.0680 | 0xa478c2975ab1ea89e8196811f51a7b7ade33eb11, 0x5ab53ee1d50eef2c1dd3d5402789cd27bb52c1bb, 0x59c38b6775ded821f010dbd30ecabdcf84e04756, 0x1d42064fc4beb5f8aaf85f4617ae8b3b5b8bd801, 0x11b815efb8f581194ae79006d24e0d814b7697f6, 0xfcd13ea0b906f2f87229650b8d93a51b2e839ebd, 0xc0067d751fb1172dbab1fa003efe214ee8f419b6, 0x60594a405d53811d3bc4766596efd80fd545a270 | 0x6b175474e89094c44da98b954eedeac495271d0f, 0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2, 0x7fc66500c84a76ad7e9c93437bfc5ac33e2ddae9, 0x1f9840a85d5af5bf1d1762f925bdaddc4201f984, 0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2, 0xdac17f958d2ee523a2206206994597c13d831ec7, 0x4206931337dc273a630d328da6441786bfad668f, 0x6b175474e89094c44da98b954eedeac495271d0f |







