工程Mar 28, 2026
Deep EVM #16:打包和冲突解决——组装盈利交易
OS
Open Soft Team
Engineering Team
从单笔交易到Bundle
在发现多个套利机会并模拟确认盈利后,下一步是将它们打包成一个Bundle。挑战在于:多笔交易可能访问相同的池,导致冲突。
冲突检测
两笔交易冲突当且仅当它们访问相同的存储槽(池状态)。使用位掩码可以高效检测冲突:
struct TxCandidate {
profit: U256,
gas_cost: U256,
pool_mask: u128, // 每个池一个bit
}
fn conflicts(a: &TxCandidate, b: &TxCandidate) -> bool {
(a.pool_mask & b.pool_mask) != 0
}
贪心打包
将无冲突的交易打包成利润最大化的Bundle是一个加权最大独立集问题(NP-hard)。在实践中,按利润/gas比排序的贪心算法表现良好:
fn greedy_pack(candidates: &mut Vec<TxCandidate>) -> Vec<TxCandidate> {
candidates.sort_by(|a, b| {
let ratio_a = a.profit * 1000 / a.gas_cost;
let ratio_b = b.profit * 1000 / b.gas_cost;
ratio_b.cmp(&ratio_a)
});
let mut bundle = Vec::new();
let mut used_pools: u128 = 0;
for tx in candidates.iter() {
if (used_pools & tx.pool_mask) == 0 {
used_pools |= tx.pool_mask;
bundle.push(tx.clone());
}
}
bundle
}
通过Flashbots提交
Bundle通过Flashbots MEV-Share或直接到区块构建者提交。提交包括:
- 交易列表(有序)
- 目标区块号
- 可选的退款地址和百分比
总结
打包是MEV机器人从单个机会到整体盈利能力的关键步骤。通过位掩码冲突检测、贪心打包算法和高效的Bundle提交,你可以最大化每个区块的总提取价值。