工程Mar 28, 2026
Deep EVM #15:MEV模拟——二分搜索、状态分叉和12秒截止时间
OS
Open Soft Team
Engineering Team
MEV模拟流水线
MEV模拟是从发现套利机会到提交盈利交易的关键步骤。流水线包括:
- 状态分叉 — 从最新区块克隆EVM状态
- 模拟执行 — 在分叉状态上运行套利交易
- 优化输入 — 二分搜索找到最优借入金额
- 利润计算 — 扣除gas成本后的净利润
- 截止时间检查 — 确保在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状态分叉、二分搜索优化和截止时间感知的调度,你可以在紧迫的时间窗口内最大化套利利润。