跳到主要内容
工程Mar 28, 2026

Deep EVM #15:MEV模拟——二分搜索、状态分叉和12秒截止时间

OS
Open Soft Team

Engineering Team

MEV模拟流水线

MEV模拟是从发现套利机会到提交盈利交易的关键步骤。流水线包括:

  1. 状态分叉 — 从最新区块克隆EVM状态
  2. 模拟执行 — 在分叉状态上运行套利交易
  3. 优化输入 — 二分搜索找到最优借入金额
  4. 利润计算 — 扣除gas成本后的净利润
  5. 截止时间检查 — 确保在12秒出块时间内完成

使用Revm的状态分叉

Revm是一个Rust EVM实现,支持高效的状态分叉:

use revm::{EVM, Database};

fn simulate_arb(
    db: &mut CacheDB<EmptyDB>,
    path: &ArbPath,
    amount_in: U256,
) -> Result<U256, SimError> {
    let mut evm = EVM::new();
    evm.database(db);
    
    // 设置交易参数
    evm.env.tx.caller = bot_address;
    evm.env.tx.transact_to = TransactTo::Call(arb_contract);
    evm.env.tx.data = encode_arb_calldata(path, amount_in);
    
    let result = evm.transact_commit()?;
    // 计算利润...
    Ok(profit)
}

二分搜索最优输入

利润是输入金额的凸函数——太少利润低,太多则滑点过大。二分搜索高效找到最优点:

fn binary_search_optimal(
    db: &CacheDB<EmptyDB>,
    path: &ArbPath,
    min: U256,
    max: U256,
) -> U256 {
    let mut lo = min;
    let mut hi = max;
    
    for _ in 0..40 {  // 40次迭代足以达到wei精度
        let mid = (lo + hi) / 2;
        let profit_mid = simulate_arb(db, path, mid);
        let profit_next = simulate_arb(db, path, mid + 1);
        
        if profit_next > profit_mid {
            lo = mid;
        } else {
            hi = mid;
        }
    }
    
    lo
}

12秒截止时间

以太坊每12秒出一个区块。你的模拟必须在新区块到达之前完成并提交交易。实际上,你只有约200-500毫秒的窗口。

总结

MEV模拟是盈利机器人的心脏。通过Revm状态分叉、二分搜索优化和截止时间感知的调度,你可以在紧迫的时间窗口内最大化套利利润。