跳到主要内容
工程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提交,你可以最大化每个区块的总提取价值。