[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"article-deep-evm-16-tajmie-hall-taarudat-huzam-muamilat-murbiha":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},"d9000000-0000-0000-0000-000000000116","a0000000-0000-0000-0000-000000000092","Deep EVM #16: التجميع وحل التعارضات — حزم المعاملات المربحة","deep-evm-16-tajmie-hall-taarudat-huzam-muamilat-murbiha","كيفية تجميع معاملات MEV المتعددة في حزم متماسكة: اكتشاف تعارضات الحالة، ترتيب المعاملات الأمثل، وتقديم الحزم لبناة الكتل.","## ما هو التجميع؟\n\nعندما يجد روبوت MEV عدة فرص في نفس الكتلة، يجب تجميعها في \"حزمة\" (bundle) واحدة. الحزمة هي مجموعة مرتبة من المعاملات تُنفذ بشكل ذري — إما تنجح جميعها أو تفشل جميعها.\n\nالتحدي: بعض الفرص تتعارض — تلمس نفس فتحات التخزين أو تعتمد على نفس الحالة.\n\n## اكتشاف تعارضات الحالة\n\nمعاملتان تتعارضان إذا:\n1. كلتاهما تكتبان إلى نفس فتحة التخزين\n2. إحداهما تقرأ فتحة تكتبها الأخرى\n\n```rust\nstruct StateAccess {\n    reads: HashSet\u003C(Address, U256)>,   \u002F\u002F (عقد، فتحة)\n    writes: HashSet\u003C(Address, U256)>,\n}\n\nfn has_conflict(a: &StateAccess, b: &StateAccess) -> bool {\n    \u002F\u002F تعارض كتابة-كتابة\n    if !a.writes.is_disjoint(&b.writes) {\n        return true;\n    }\n    \u002F\u002F تعارض قراءة-كتابة\n    if !a.reads.is_disjoint(&b.writes) || !b.reads.is_disjoint(&a.writes) {\n        return true;\n    }\n    false\n}\n```\n\n## جمع الوصولات من المحاكاة\n\nrevm يمكنه تتبع كل عملية تخزين أثناء المحاكاة:\n\n```rust\nfn collect_state_access(\n    db: &mut InMemoryDB,\n    tx: &Transaction,\n) -> Result\u003CStateAccess> {\n    let mut inspector = AccessInspector::new();\n    let mut evm = Evm::builder()\n        .with_db(db)\n        .with_external_context(&mut inspector)\n        .build();\n    \n    evm.transact()?;\n    \n    Ok(StateAccess {\n        reads: inspector.reads,\n        writes: inspector.writes,\n    })\n}\n```\n\n## رسم بياني للتعارضات\n\nنبني رسماً بيانياً حيث كل فرصة هي عقدة وكل تعارض هو حافة:\n\n```rust\nstruct ConflictGraph {\n    opportunities: Vec\u003COpportunity>,\n    conflicts: Vec\u003C(usize, usize)>,  \u002F\u002F أزواج المتعارضين\n}\n\nimpl ConflictGraph {\n    fn find_max_independent_set(&self) -> Vec\u003Cusize> {\n        \u002F\u002F NP-hard بشكل عام، لكن عادة الرسم البياني صغير\n        \u002F\u002F نستخدم خوارزمية جشعة: اختر الأعلى ربحاً أولاً\n        let mut selected = Vec::new();\n        let mut excluded = HashSet::new();\n        \n        let mut sorted: Vec\u003Cusize> = (0..self.opportunities.len()).collect();\n        sorted.sort_by(|a, b| {\n            self.opportunities[*b].profit\n                .cmp(&self.opportunities[*a].profit)\n        });\n        \n        for idx in sorted {\n            if excluded.contains(&idx) {\n                continue;\n            }\n            selected.push(idx);\n            \u002F\u002F استبعاد جميع المتعارضين\n            for &(a, b) in &self.conflicts {\n                if a == idx { excluded.insert(b); }\n                if b == idx { excluded.insert(a); }\n            }\n        }\n        selected\n    }\n}\n```\n\n## ترتيب المعاملات داخل الحزمة\n\nحتى الفرص غير المتعارضة قد يكون لها ترتيب أمثل. القواعد:\n\n1. **المعاملات التي تؤثر على السعر أولاً** — إذا كانت معاملة تغير سعراً يعتمد عليه أخرى\n2. **الأقل غازاً أولاً** — لتقليل تأثير فشل معاملة لاحقة\n3. **ترتيب طوبولوجي** — حسب تبعيات البيانات\n\n```rust\nfn order_bundle(opportunities: &[Opportunity]) -> Vec\u003COpportunity> {\n    \u002F\u002F بناء رسم بياني موجه للتبعيات\n    let mut deps = HashMap::new();\n    for (i, opp_a) in opportunities.iter().enumerate() {\n        for (j, opp_b) in opportunities.iter().enumerate() {\n            if i != j && depends_on(opp_b, opp_a) {\n                deps.entry(j).or_insert_with(Vec::new).push(i);\n            }\n        }\n    }\n    \n    \u002F\u002F ترتيب طوبولوجي\n    topological_sort(&deps, opportunities.len())\n}\n```\n\n## تقديم الحزمة لبناة الكتل\n\n```rust\nasync fn submit_bundle(\n    bundle: &[Transaction],\n    block_number: u64,\n) -> Result\u003CBundleHash> {\n    let flashbots = FlashbotsClient::new(signer);\n    \n    let response = flashbots\n        .send_bundle(BundleRequest {\n            txs: bundle.to_vec(),\n            block_number: block_number + 1,\n            min_timestamp: None,\n            max_timestamp: None,\n            reverting_tx_hashes: vec![],  \u002F\u002F لا نسمح بأي معاملة فاشلة\n        })\n        .await?;\n    \n    Ok(response.bundle_hash)\n}\n```\n\n## مقاييس الإنتاج\n\n| المقياس | القيمة النموذجية |\n|---------|----------------|\n| الفرص المكتشفة لكل كتلة | 50-200 |\n| التعارضات المكتشفة | 20-40% |\n| الفرص في الحزمة النهائية | 5-15 |\n| الربح الإجمالي | 0.01-0.5 ETH\u002Fكتلة |\n| معدل الإدراج | 15-30% |\n\n## الخلاصة\n\nالتجميع وحل التعارضات هما المرحلة الأخيرة في خط أنابيب MEV. اكتشاف التعارضات عبر تتبع الوصولات، اختيار المجموعة المثلى عبر المجموعة المستقلة القصوى، والترتيب الأمثل عبر الترتيب الطوبولوجي — هذه هي المكونات التي تحول فرصاً فردية إلى حزمة مربحة.","\u003Ch2 id=\"\">ما هو التجميع؟\u003C\u002Fh2>\n\u003Cp>عندما يجد روبوت MEV عدة فرص في نفس الكتلة، يجب تجميعها في “حزمة” (bundle) واحدة. الحزمة هي مجموعة مرتبة من المعاملات تُنفذ بشكل ذري — إما تنجح جميعها أو تفشل جميعها.\u003C\u002Fp>\n\u003Cp>التحدي: بعض الفرص تتعارض — تلمس نفس فتحات التخزين أو تعتمد على نفس الحالة.\u003C\u002Fp>\n\u003Ch2 id=\"\">اكتشاف تعارضات الحالة\u003C\u002Fh2>\n\u003Cp>معاملتان تتعارضان إذا:\u003C\u002Fp>\n\u003Col>\n\u003Cli>كلتاهما تكتبان إلى نفس فتحة التخزين\u003C\u002Fli>\n\u003Cli>إحداهما تقرأ فتحة تكتبها الأخرى\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cpre>\u003Ccode class=\"language-rust\">struct StateAccess {\n    reads: HashSet&lt;(Address, U256)&gt;,   \u002F\u002F (عقد، فتحة)\n    writes: HashSet&lt;(Address, U256)&gt;,\n}\n\nfn has_conflict(a: &amp;StateAccess, b: &amp;StateAccess) -&gt; bool {\n    \u002F\u002F تعارض كتابة-كتابة\n    if !a.writes.is_disjoint(&amp;b.writes) {\n        return true;\n    }\n    \u002F\u002F تعارض قراءة-كتابة\n    if !a.reads.is_disjoint(&amp;b.writes) || !b.reads.is_disjoint(&amp;a.writes) {\n        return true;\n    }\n    false\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"\">جمع الوصولات من المحاكاة\u003C\u002Fh2>\n\u003Cp>revm يمكنه تتبع كل عملية تخزين أثناء المحاكاة:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-rust\">fn collect_state_access(\n    db: &amp;mut InMemoryDB,\n    tx: &amp;Transaction,\n) -&gt; Result&lt;StateAccess&gt; {\n    let mut inspector = AccessInspector::new();\n    let mut evm = Evm::builder()\n        .with_db(db)\n        .with_external_context(&amp;mut inspector)\n        .build();\n    \n    evm.transact()?;\n    \n    Ok(StateAccess {\n        reads: inspector.reads,\n        writes: inspector.writes,\n    })\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"\">رسم بياني للتعارضات\u003C\u002Fh2>\n\u003Cp>نبني رسماً بيانياً حيث كل فرصة هي عقدة وكل تعارض هو حافة:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-rust\">struct ConflictGraph {\n    opportunities: Vec&lt;Opportunity&gt;,\n    conflicts: Vec&lt;(usize, usize)&gt;,  \u002F\u002F أزواج المتعارضين\n}\n\nimpl ConflictGraph {\n    fn find_max_independent_set(&amp;self) -&gt; Vec&lt;usize&gt; {\n        \u002F\u002F NP-hard بشكل عام، لكن عادة الرسم البياني صغير\n        \u002F\u002F نستخدم خوارزمية جشعة: اختر الأعلى ربحاً أولاً\n        let mut selected = Vec::new();\n        let mut excluded = HashSet::new();\n        \n        let mut sorted: Vec&lt;usize&gt; = (0..self.opportunities.len()).collect();\n        sorted.sort_by(|a, b| {\n            self.opportunities[*b].profit\n                .cmp(&amp;self.opportunities[*a].profit)\n        });\n        \n        for idx in sorted {\n            if excluded.contains(&amp;idx) {\n                continue;\n            }\n            selected.push(idx);\n            \u002F\u002F استبعاد جميع المتعارضين\n            for &amp;(a, b) in &amp;self.conflicts {\n                if a == idx { excluded.insert(b); }\n                if b == idx { excluded.insert(a); }\n            }\n        }\n        selected\n    }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"\">ترتيب المعاملات داخل الحزمة\u003C\u002Fh2>\n\u003Cp>حتى الفرص غير المتعارضة قد يكون لها ترتيب أمثل. القواعد:\u003C\u002Fp>\n\u003Col>\n\u003Cli>\u003Cstrong>المعاملات التي تؤثر على السعر أولاً\u003C\u002Fstrong> — إذا كانت معاملة تغير سعراً يعتمد عليه أخرى\u003C\u002Fli>\n\u003Cli>\u003Cstrong>الأقل غازاً أولاً\u003C\u002Fstrong> — لتقليل تأثير فشل معاملة لاحقة\u003C\u002Fli>\n\u003Cli>\u003Cstrong>ترتيب طوبولوجي\u003C\u002Fstrong> — حسب تبعيات البيانات\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cpre>\u003Ccode class=\"language-rust\">fn order_bundle(opportunities: &amp;[Opportunity]) -&gt; Vec&lt;Opportunity&gt; {\n    \u002F\u002F بناء رسم بياني موجه للتبعيات\n    let mut deps = HashMap::new();\n    for (i, opp_a) in opportunities.iter().enumerate() {\n        for (j, opp_b) in opportunities.iter().enumerate() {\n            if i != j &amp;&amp; depends_on(opp_b, opp_a) {\n                deps.entry(j).or_insert_with(Vec::new).push(i);\n            }\n        }\n    }\n    \n    \u002F\u002F ترتيب طوبولوجي\n    topological_sort(&amp;deps, opportunities.len())\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"\">تقديم الحزمة لبناة الكتل\u003C\u002Fh2>\n\u003Cpre>\u003Ccode class=\"language-rust\">async fn submit_bundle(\n    bundle: &amp;[Transaction],\n    block_number: u64,\n) -&gt; Result&lt;BundleHash&gt; {\n    let flashbots = FlashbotsClient::new(signer);\n    \n    let response = flashbots\n        .send_bundle(BundleRequest {\n            txs: bundle.to_vec(),\n            block_number: block_number + 1,\n            min_timestamp: None,\n            max_timestamp: None,\n            reverting_tx_hashes: vec![],  \u002F\u002F لا نسمح بأي معاملة فاشلة\n        })\n        .await?;\n    \n    Ok(response.bundle_hash)\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"\">مقاييس الإنتاج\u003C\u002Fh2>\n\u003Ctable>\u003Cthead>\u003Ctr>\u003Cth>المقياس\u003C\u002Fth>\u003Cth>القيمة النموذجية\u003C\u002Fth>\u003C\u002Ftr>\u003C\u002Fthead>\u003Ctbody>\n\u003Ctr>\u003Ctd>الفرص المكتشفة لكل كتلة\u003C\u002Ftd>\u003Ctd>50-200\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>التعارضات المكتشفة\u003C\u002Ftd>\u003Ctd>20-40%\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>الفرص في الحزمة النهائية\u003C\u002Ftd>\u003Ctd>5-15\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>الربح الإجمالي\u003C\u002Ftd>\u003Ctd>0.01-0.5 ETH\u002Fكتلة\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>معدل الإدراج\u003C\u002Ftd>\u003Ctd>15-30%\u003C\u002Ftd>\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\n\u003Ch2 id=\"\">الخلاصة\u003C\u002Fh2>\n\u003Cp>التجميع وحل التعارضات هما المرحلة الأخيرة في خط أنابيب MEV. اكتشاف التعارضات عبر تتبع الوصولات، اختيار المجموعة المثلى عبر المجموعة المستقلة القصوى، والترتيب الأمثل عبر الترتيب الطوبولوجي — هذه هي المكونات التي تحول فرصاً فردية إلى حزمة مربحة.\u003C\u002Fp>\n","ar","b0000000-0000-0000-0000-000000000001",true,"2026-03-28T10:44:32.510036Z","Deep EVM #16: التجميع وحل التعارضات — حزم معاملات MEV المربحة","تجميع معاملات MEV: اكتشاف تعارضات الحالة، المجموعة المستقلة القصوى، الترتيب الطوبولوجي، وتقديم الحزم.","MEV تجميع Rust",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","بلوكتشين",[41,48,54],{"id":42,"title":43,"slug":44,"excerpt":45,"locale":12,"category_name":46,"published_at":47},"d0000000-0000-0000-0000-000000000686","لماذا Bali تتحول إلى مركز تكنولوجيا التأثير في جنوب شرق آسيا 2026","limadha-bali-tatahawwal-markaz-tiknulujia-attathir-janub-sharq-asia-2026","تحتل Bali المرتبة 16 بين أنظمة الشركات الناشئة في جنوب شرق آسيا. مع تركيز متزايد لبناة Web3 وشركات AI المستدامة الناشئة وشركات تكنولوجيا السفر البيئي، تنحت الجزيرة مكانتها كعاصمة تكنولوجيا التأثير في المنطقة.","الهندسة","2026-03-28T10:44:50.120618Z",{"id":49,"title":50,"slug":51,"excerpt":52,"locale":12,"category_name":46,"published_at":53},"d0000000-0000-0000-0000-000000000685","فسيفساء حماية البيانات في ASEAN: قائمة امتثال للمطورين","fusayfisa-himayat-albayanat-asean-qaimat-imtithal-lilmutawwirin","تمتلك سبع دول في ASEAN الآن قوانين شاملة لحماية البيانات، لكل منها نماذج موافقة ومتطلبات توطين وهياكل عقوبات مختلفة. إليك قائمة امتثال عملية للمطورين الذين يبنون تطبيقات متعددة البلدان.","2026-03-28T10:44:50.114369Z",{"id":55,"title":56,"slug":57,"excerpt":58,"locale":12,"category_name":46,"published_at":59},"d0000000-0000-0000-0000-000000000684","التحول الرقمي في Indonesia بقيمة 29 مليار دولار: فرص لشركات البرمجيات","attahawwul-arraqami-indonesia-29-milyar-dular-furas-sharikat-albarmajiyat","من المتوقع أن يصل سوق خدمات تكنولوجيا المعلومات في Indonesia إلى 29.03 مليار دولار في 2026، ارتفاعاً من 24.37 مليار دولار في 2025. البنية التحتية السحابية والذكاء الاصطناعي والتجارة الإلكترونية ومراكز البيانات تقود أسرع نمو في جنوب شرق آسيا.","2026-03-28T10:44:50.092728Z",{"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"]