[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"article-deep-evm-16-bundling-resolution-conflits-mev":3},{"article":4,"author":60},{"id":5,"category_id":6,"title":7,"slug":8,"excerpt":9,"content_md":10,"content_html":11,"locale":12,"author_id":13,"published":14,"published_at":15,"meta_title":16,"meta_description":17,"focus_keyword":18,"og_image":19,"canonical_url":19,"robots_meta":20,"created_at":15,"updated_at":15,"tags":21,"category_name":39,"related_articles":40},"d6000000-0000-0000-0000-000000000116","a0000000-0000-0000-0000-000000000062","Deep EVM #16 : Bundling et résolution de conflits — Empaqueter les transactions MEV rentables","deep-evm-16-bundling-resolution-conflits-mev","Apprenez à empaqueter plusieurs transactions MEV en bundles optimaux : détection de conflits d'état, ordonnancement, enchères pour les constructeurs de blocs et stratégies de soumission.","## Qu'est-ce qu'un bundle MEV ?\n\nUn bundle MEV est un ensemble ordonné de transactions soumis à un constructeur de blocs comme un tout atomique. Soit toutes les transactions du bundle sont incluses dans l'ordre spécifié, soit aucune ne l'est.\n\nLes bundles permettent aux chercheurs de :\n1. Garantir l'ordonnancement des transactions\n2. Inclure des transactions de backrun après les transactions d'autres utilisateurs\n3. Soumettre plusieurs opportunités atomiquement\n\n## Détection de conflits\n\nDeux opportunités MEV sont en conflit si elles modifient le même état. L'exécuter dans un ordre produit un résultat différent de l'autre ordre, ou l'une invalide l'autre.\n\n```rust\nstruct StateAccess {\n    reads: HashSet\u003C(Address, U256)>,   \u002F\u002F (contrat, slot)\n    writes: HashSet\u003C(Address, U256)>,  \u002F\u002F (contrat, slot)\n}\n\nfn conflicts(a: &StateAccess, b: &StateAccess) -> bool {\n    \u002F\u002F Conflit si A écrit ce que B lit, ou vice versa\n    !a.writes.is_disjoint(&b.reads) ||\n    !b.writes.is_disjoint(&a.reads) ||\n    !a.writes.is_disjoint(&b.writes)\n}\n```\n\nLa détection de conflits provient de la simulation — revm peut tracer tous les SLOAD\u002FSSTORE pendant l'exécution.\n\n## Ordonnancement optimal\n\nÉtant donné N opportunités non conflictuelles, l'ordonnancement optimal maximise le profit total en tenant compte de l'impact de chaque transaction sur l'état :\n\n```rust\nfn order_bundle(\n    opportunities: &mut Vec\u003COpportunity>,\n    state: &CacheDB,\n) -> Vec\u003CTransaction> {\n    \u002F\u002F Trier par profit décroissant comme heuristique initiale\n    opportunities.sort_by(|a, b| b.profit.cmp(&a.profit));\n\n    let mut bundle = Vec::new();\n    let mut current_state = state.clone();\n\n    for opp in opportunities {\n        \u002F\u002F Resimule sur l'état courant (après les transactions précédentes)\n        let result = simulate_on_state(&current_state, &opp);\n        if result.success && result.profit > result.gas_cost {\n            bundle.push(result.transaction);\n            current_state = result.new_state;\n        }\n    }\n\n    bundle\n}\n```\n\n## Enchères pour les constructeurs\n\nLes constructeurs de blocs choisissent les bundles qui leur rapportent le plus. Votre enchère doit être suffisante pour battre les concurrents, mais pas trop pour maximiser votre profit.\n\nStratégie courante : offrir 90 % du profit comme frais de priorité :\n\n```rust\nfn calculate_bid(profit: U256, gas_used: u64) -> U256 {\n    let bid_percentage = 90; \u002F\u002F 90% au constructeur, 10% de profit\n    let total_bid = profit * bid_percentage \u002F 100;\n    total_bid \u002F gas_used \u002F\u002F Convertir en prix par unité de gas\n}\n```\n\n## Soumission via Flashbots\n\nLa soumission de bundles se fait via l'API Flashbots :\n\n```rust\nasync fn submit_bundle(\n    transactions: Vec\u003CBytes>,\n    target_block: u64,\n) -> Result\u003CBundleHash> {\n    let bundle = FlashbotsBundle {\n        txs: transactions,\n        block_number: target_block,\n        min_timestamp: None,\n        max_timestamp: None,\n    };\n\n    let response = flashbots_client\n        .send_bundle(&bundle)\n        .await?;\n\n    Ok(response.bundle_hash)\n}\n```\n\n## Stratégies de soumission\n\n1. **Multi-bloc** — Soumettez le même bundle pour les 3-5 prochains blocs\n2. **Multi-constructeur** — Soumettez simultanément à plusieurs constructeurs\n3. **Escalade dynamique** — Augmentez progressivement l'enchère si le bundle n'est pas inclus\n4. **Bundle conditionnel** — Incluez une vérification d'état au début pour annuler si les conditions ont changé\n\n## Métriques de suivi\n\nSuivez les performances de vos bundles :\n\n- **Taux d'inclusion** — Pourcentage de bundles soumis qui sont inclus\n- **Profit moyen** — Profit net par bundle inclus\n- **Latence** — Temps entre détection de l'opportunité et soumission\n- **Taux de revert** — Pourcentage de bundles qui revertent on-chain\n\n## Conclusion\n\nLe bundling est l'étape finale du pipeline MEV. La détection de conflits d'état, l'ordonnancement optimal et les enchères stratégiques déterminent le profit réalisé. Combiné avec les articles précédents sur la détection d'opportunités et la simulation, vous disposez maintenant des fondements complets d'un bot MEV en Rust.","\u003Ch2 id=\"qu-est-ce-qu-un-bundle-mev\">Qu’est-ce qu’un bundle MEV ?\u003C\u002Fh2>\n\u003Cp>Un bundle MEV est un ensemble ordonné de transactions soumis à un constructeur de blocs comme un tout atomique. Soit toutes les transactions du bundle sont incluses dans l’ordre spécifié, soit aucune ne l’est.\u003C\u002Fp>\n\u003Cp>Les bundles permettent aux chercheurs de :\u003C\u002Fp>\n\u003Col>\n\u003Cli>Garantir l’ordonnancement des transactions\u003C\u002Fli>\n\u003Cli>Inclure des transactions de backrun après les transactions d’autres utilisateurs\u003C\u002Fli>\n\u003Cli>Soumettre plusieurs opportunités atomiquement\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch2 id=\"d-tection-de-conflits\">Détection de conflits\u003C\u002Fh2>\n\u003Cp>Deux opportunités MEV sont en conflit si elles modifient le même état. L’exécuter dans un ordre produit un résultat différent de l’autre ordre, ou l’une invalide l’autre.\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-rust\">struct StateAccess {\n    reads: HashSet&lt;(Address, U256)&gt;,   \u002F\u002F (contrat, slot)\n    writes: HashSet&lt;(Address, U256)&gt;,  \u002F\u002F (contrat, slot)\n}\n\nfn conflicts(a: &amp;StateAccess, b: &amp;StateAccess) -&gt; bool {\n    \u002F\u002F Conflit si A écrit ce que B lit, ou vice versa\n    !a.writes.is_disjoint(&amp;b.reads) ||\n    !b.writes.is_disjoint(&amp;a.reads) ||\n    !a.writes.is_disjoint(&amp;b.writes)\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>La détection de conflits provient de la simulation — revm peut tracer tous les SLOAD\u002FSSTORE pendant l’exécution.\u003C\u002Fp>\n\u003Ch2 id=\"ordonnancement-optimal\">Ordonnancement optimal\u003C\u002Fh2>\n\u003Cp>Étant donné N opportunités non conflictuelles, l’ordonnancement optimal maximise le profit total en tenant compte de l’impact de chaque transaction sur l’état :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-rust\">fn order_bundle(\n    opportunities: &amp;mut Vec&lt;Opportunity&gt;,\n    state: &amp;CacheDB,\n) -&gt; Vec&lt;Transaction&gt; {\n    \u002F\u002F Trier par profit décroissant comme heuristique initiale\n    opportunities.sort_by(|a, b| b.profit.cmp(&amp;a.profit));\n\n    let mut bundle = Vec::new();\n    let mut current_state = state.clone();\n\n    for opp in opportunities {\n        \u002F\u002F Resimule sur l'état courant (après les transactions précédentes)\n        let result = simulate_on_state(&amp;current_state, &amp;opp);\n        if result.success &amp;&amp; result.profit &gt; result.gas_cost {\n            bundle.push(result.transaction);\n            current_state = result.new_state;\n        }\n    }\n\n    bundle\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"ench-res-pour-les-constructeurs\">Enchères pour les constructeurs\u003C\u002Fh2>\n\u003Cp>Les constructeurs de blocs choisissent les bundles qui leur rapportent le plus. Votre enchère doit être suffisante pour battre les concurrents, mais pas trop pour maximiser votre profit.\u003C\u002Fp>\n\u003Cp>Stratégie courante : offrir 90 % du profit comme frais de priorité :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-rust\">fn calculate_bid(profit: U256, gas_used: u64) -&gt; U256 {\n    let bid_percentage = 90; \u002F\u002F 90% au constructeur, 10% de profit\n    let total_bid = profit * bid_percentage \u002F 100;\n    total_bid \u002F gas_used \u002F\u002F Convertir en prix par unité de gas\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"soumission-via-flashbots\">Soumission via Flashbots\u003C\u002Fh2>\n\u003Cp>La soumission de bundles se fait via l’API Flashbots :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-rust\">async fn submit_bundle(\n    transactions: Vec&lt;Bytes&gt;,\n    target_block: u64,\n) -&gt; Result&lt;BundleHash&gt; {\n    let bundle = FlashbotsBundle {\n        txs: transactions,\n        block_number: target_block,\n        min_timestamp: None,\n        max_timestamp: None,\n    };\n\n    let response = flashbots_client\n        .send_bundle(&amp;bundle)\n        .await?;\n\n    Ok(response.bundle_hash)\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"strat-gies-de-soumission\">Stratégies de soumission\u003C\u002Fh2>\n\u003Col>\n\u003Cli>\u003Cstrong>Multi-bloc\u003C\u002Fstrong> — Soumettez le même bundle pour les 3-5 prochains blocs\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Multi-constructeur\u003C\u002Fstrong> — Soumettez simultanément à plusieurs constructeurs\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Escalade dynamique\u003C\u002Fstrong> — Augmentez progressivement l’enchère si le bundle n’est pas inclus\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Bundle conditionnel\u003C\u002Fstrong> — Incluez une vérification d’état au début pour annuler si les conditions ont changé\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch2 id=\"m-triques-de-suivi\">Métriques de suivi\u003C\u002Fh2>\n\u003Cp>Suivez les performances de vos bundles :\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>Taux d’inclusion\u003C\u002Fstrong> — Pourcentage de bundles soumis qui sont inclus\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Profit moyen\u003C\u002Fstrong> — Profit net par bundle inclus\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Latence\u003C\u002Fstrong> — Temps entre détection de l’opportunité et soumission\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Taux de revert\u003C\u002Fstrong> — Pourcentage de bundles qui revertent on-chain\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"conclusion\">Conclusion\u003C\u002Fh2>\n\u003Cp>Le bundling est l’étape finale du pipeline MEV. La détection de conflits d’état, l’ordonnancement optimal et les enchères stratégiques déterminent le profit réalisé. Combiné avec les articles précédents sur la détection d’opportunités et la simulation, vous disposez maintenant des fondements complets d’un bot MEV en Rust.\u003C\u002Fp>\n","fr","b0000000-0000-0000-0000-000000000001",true,"2026-03-28T10:44:29.127224Z","Deep EVM #16 : Bundling et résolution de conflits — Empaqueter les transactions MEV","Empaquetez des transactions MEV en bundles optimaux : détection de conflits, ordonnancement, enchères constructeurs et soumission Flashbots.","bundling MEV conflits",null,"index, follow",[22,27,31,35],{"id":23,"name":24,"slug":25,"created_at":26},"c0000000-0000-0000-0000-000000000019","MEV","mev","2026-03-28T10:44:21.513630Z",{"id":28,"name":29,"slug":30,"created_at":26},"c0000000-0000-0000-0000-000000000001","Rust","rust",{"id":32,"name":33,"slug":34,"created_at":26},"c0000000-0000-0000-0000-000000000013","Security","security",{"id":36,"name":37,"slug":38,"created_at":26},"c0000000-0000-0000-0000-000000000009","Web3","web3","Blockchain",[41,48,54],{"id":42,"title":43,"slug":44,"excerpt":45,"locale":12,"category_name":46,"published_at":47},"d0000000-0000-0000-0000-000000000677","Pourquoi Bali devient le hub impact-tech d'Asie du Sud-Est en 2026","pourquoi-bali-devient-hub-impact-tech-asie-sud-est-2026","Bali se classe 16e parmi les écosystèmes startups d'Asie du Sud-Est. Avec une concentration croissante de bâtisseurs Web3, de startups IA durables et d'entreprises eco-travel tech, l'île se forge une identité de capitale impact-tech de la région.","Ingénierie","2026-03-28T10:44:49.517126Z",{"id":49,"title":50,"slug":51,"excerpt":52,"locale":12,"category_name":46,"published_at":53},"d0000000-0000-0000-0000-000000000676","Le patchwork de la protection des données ASEAN : checklist de conformité pour les développeurs","patchwork-protection-donnees-asean-checklist-conformite-developpeurs","Sept pays de l'ASEAN disposent désormais de lois complètes sur la protection des données, chacune avec des modèles de consentement, des exigences de localisation et des structures de sanctions différents. Voici une checklist pratique de conformité pour les développeurs.","2026-03-28T10:44:49.504560Z",{"id":55,"title":56,"slug":57,"excerpt":58,"locale":12,"category_name":46,"published_at":59},"d0000000-0000-0000-0000-000000000675","La transformation numérique de 29 milliards de dollars d'Indonesia : opportunités pour les éditeurs de logiciels","transformation-numerique-29-milliards-dollars-indonesia-opportunites-editeurs-logiciels","Le marché des services informatiques d'Indonesia devrait atteindre 29,03 milliards de dollars en 2026, contre 24,37 milliards en 2025. L'infrastructure cloud, l'IA, le e-commerce et les centres de données tirent la croissance la plus rapide d'Asie du Sud-Est.","2026-03-28T10:44:49.469231Z",{"id":13,"name":61,"slug":62,"bio":63,"photo_url":19,"linkedin":19,"role":64,"created_at":65,"updated_at":65},"Open Soft Team","open-soft-team","The engineering team at Open Soft, building premium software solutions from Bali, Indonesia.","Engineering Team","2026-03-28T08:31:22.226811Z"]