Skip to content
On this page

L3-9: MEV Bot(MEV 机器人)

1. 问题

以太坊的区块构建过程产生了一个独特的经济现象:矿工/验证者拥有交易排序的自由裁量权。他们可以选择包含哪些交易、以什么顺序排列它们。这催生了 MEV(最大可提取价值)——从交易排序中提取额外利润的活动。MEV 搜索者通过监控内存池(mempool)中的待处理交易来寻找套利、清算和夹层攻击的机会。

从防守者角度理解 MEV 是编写安全 DeFi 合约的前提。许多合约漏洞(如闪电贷攻击)实际上是被 MEV 搜索者积极利用的。理解他们如何操作——从内存池监控到 Flashbots 捆绑提交——帮助开发者设计防 MEV 的合约。同时,MEV 机器人本身也展示了许多重要的工程技能:实时事件监听、Gas 竞价策略、交易模拟和原子化捆绑执行。

2. 原因

MEV 是以太坊经济学中最重要也最有争议的领域之一。据 Flashbots 统计,自 2020 年以来已有超过 10 亿美元的 MEV 被提取。MEV 对普通用户产生负面影响——夹层攻击导致更高的 Gas 费和更差的执行价格——但也提供了积极贡献——套利保持 DEX 价格一致,清算保持借贷协议健康。

理解 MEV 对开发者至关重要,原因有三:(1) 防御性设计——需要理解如何防止合约成为 MEV 攻击的受害者;(2) 市场效率——套利和清算机器人的逻辑与 DEX 聚合器和杠杆协议的设计直接相关;(3) PBS(提议者-构建者分离)——MEV 推动了以太坊区块构建架构的根本性变革,理解它是理解 L1 经济的核心。

3. 方案

scripts/mev-bot.js 是一个教育性质的 MEV 搜索器骨架,展示了 MEV 机器人的完整架构:

架构层次

  1. 内存池监控:通过 WebSocket 订阅 pendingTransactions,实时接收待处理交易的哈希。对每个交易,获取完整交易详情,解析其交互目标和方法签名。在生产环境中,搜索者通常运行自己的全节点以获得最低延迟。

  2. 套利检测:使用 Uniswap V2 的 x*y=k AMM 公式计算两个 DEX 之间的价格差异。

    • 从 Uniswap 和 SushiSwap 的 Pair 合约(getReserves())获取储备量
    • 计算在两个 DEX 之间循环交易(Uniswap -> SushiSwap 或反向)的收益
    • 如果收益 > Gas 成本 + 贿赂,则存在套利机会
    • 计算公式:amountOut = (amountIn * 997 * reserveOut) / (reserveIn * 1000 + amountIn * 997)
  3. 夹层攻击检测:识别 mempool 中的大额 swap 交易。原理:

    • 在前端(frontrun):在受害者交易之前买入,推高价格
    • 受害者交易:在大滑点下成交
    • 在后端(backrun):在受害者交易之后卖出,从价格差异中获利
  4. 清算检测:监控借贷协议(Aave、Compound)中接近清算阈值的仓位。当仓位健康因子低于 1 时,触发清算并获得清算奖励(通常 5-10%)。

  5. Flashbots 捆绑提交

    • 将多笔交易打包成原子化捆绑(bundle)
    • 通过 Flashbots relay 直接发送给验证者,绕过公共 mempool
    • Bundle 原子化:要么全部成功,要么全部失败(防止部分执行导致亏损)
    • 包含验证者小费(bundle tip)作为经济激励

参考源文件:scripts/mev-bot.js

4. 遭遇的陷阱

  • 延迟竞争:MEV 搜索是一个速度游戏——毫秒级的延迟差异决定胜负。依赖公共 RPC 节点的延迟通常 >100ms,而竞争对手使用专有节点延迟 <10ms
  • 模拟与执行的差异:在 eth_call 中模拟成功的捆绑,在实际执行时可能因状态变化而失败。其他搜索者的交易可能在你的捆绑之前改变了状态
  • Gas 竞价螺旋:多个搜索者针对同一机会竞价优先费,导致利润被 Gas 费用吞噬。夹层攻击中三笔交易都需要 Gas,总成本可能超出利润
  • 交易解码错误:mempool 中的交易可能是任何合约调用,解码错误的 ABI 会导致误判机会或漏判
  • 非原子化风险:如果没有使用 Flashbots 捆绑,交易在公共 mempool 中可能被抢先交易(其他人看到你的交易并复制)
  • 代币授权安全:运行 MEV 机器人的钱包需要授权多个代币和路由合约——如果钱包私钥泄露,所有资金都有风险

5. 陷阱的原因

延迟竞争是 MEV 最根本的挑战。在区块时间 12 秒的以太坊上,每个区块只有一次机会。搜索者网络(如 bloXroute、Eden Network)提供比公共节点更快的内存池数据,专业的搜索者还与验证者建立了直接连接(PBS 管道)。mev-bot.js 中的 WebSocket 监控只是一个起点——真正的竞争发生在亚毫秒级别。

Gas 竞价螺旋源于 MEV 的零和性质:对于每个套利机会,只有一个搜索者能获胜。如果机会价值 0.1 ETH,搜索者们愿意出价高达 0.099 ETH 的优先费(或验证者贿赂)。随着更多搜索者进入市场,利润率趋近于零——完美竞争的经济学原理在链上实时上演。mev-bot.js 中的 minProfitEth = 0.01 是一个合理的下限,但在实际竞争激烈的交易对(如 WETH-USDC)中,可能需要设定更高的阈值。

模拟与执行的差异("revert risk")是 MEV 独有的技术挑战。eth_call 模拟时使用的状态是当前块的状态,但当捆绑实际执行时,它可能被包含在下一个或更远的区块中——期间其他交易已经改变了 DEX 储备、借贷仓位等状态。Flashbots 的 eth_callBundle 尝试通过在特定的区块号上模拟来缓解这个问题,但仍无法消除。

6. 如何解决陷阱

延迟优化

  • 使用专用节点(而非共享 RPC)获取最低延迟
  • 使用 WebSocket 而非轮询来接收实时 mempool 数据
  • 将节点部署在与验证者相同的区域(如 AWS us-east-1)
  • 预计算和缓存 DEX 的储备数据以减少 RPC 调用

Gas 策略

  • 使用 eth_maxPriorityFeePerGas 查询当前优先费市场价
  • 设定最大可支付 Gas 预算,超出则放弃机会
  • 在捆绑中包含验证者小费交易直接支付给 block.coinbase
  • 使用历史 Gas 数据分析来优化出价策略

模拟安全

  • eth_callBundle 模拟后立即提交捆绑,缩短模拟-提交窗口
  • 设置缓冲区(如要求利润 > GasCost * 1.5)
  • 同时向多个 relay(Flashbots + bloXroute + Eden)提交相同捆绑
  • 在捆绑中包含多区块的相同交易(Flashbots 允许指定多区块范围)

安全实践(来自 mev-bot.js 的风险清单)

  • 使用独立的低余额钱包,不要在 MEV 机器人钱包中存放大量资金
  • 每次交易前用 eth_call 模拟确认利润
  • 设置滑点保护(如 0.5% slippage)
  • 监控所有交易的执行结果,记录日志用于审计
  • 不在代码中硬编码私钥(使用环境变量或安全密钥管理)

7. 技术要点

技术点说明
内存池监控WebSocket 订阅 pendingTransactions,实时发现机会
AMM 套利x*y=k 公式计算 DEX 间价差
夹层攻击frontrun 买入 + victim trade + backrun 卖出
清算检测监控借贷协议的健康因子,低于阈值触发清算
Flashbots Bundle原子化捆绑,绕过公共 mempool,直接提交给验证者
交易模拟eth_call/eth_callBundle 在提交前验证利润
PBS 管道提议者-构建者分离,搜索者通过构建者提交捆绑
Gas 竞价优先费 + 贿赂验证者,决定捆绑是否被包含
零和竞争对每个机会只有一个搜索者能获胜
安全边界独立钱包、模拟验证、滑点保护、私钥管理

Built with AiAda