اضغط على ESC للإغلاق

بناء بوت JIT: بنية Rust وعقود Smart Contracts الذرية

هذه هي المقالة الثالثة في سلسلتنا «المفترسون في مجمّعات السيولة: فنّ ورياضيات السيولة الفورية (JIT)». والآن ننتقل إلى الجزء الهندسي: كيف نحول الصيغ الرياضية إلى كود يعمل أسرع مما يمكن أن ترمش بعينك.

في عام 2026 لم تعد السيولة الفورية JIT منافسة أفكار، بل منافسة بنية تحتية. إذا كان البوت الخاص بك مكتوبًا بلغة Python ويتصل بعقدة عامة عبر HTTP، فلن تخسر فقط — بل قد لا تلاحظ حتى متى تم سحب أرباحك.

1. المكدس التقني: لماذا تهيمن Rust

في عالم MEV تدور المنافسة حول ميكروثوانٍ من زمن الاستجابة.

  • اللغة: Rust. أصبح استخدام مكتبة Alloy (البديل لـ ethers-rs) معيارًا صناعيًا. تتيح Alloy العمل مع أنواع بيانات Ethereum دون تخصيصات ذاكرة غير ضرورية، وتوفّر تسلسلاً/إلغاء تسلسل سريعًا للغاية لـ JSON‑RPC.
  • الاتصال: IPC / WebSockets. البوتات لا تستخدم HTTP. فهي تتصل بعقدة محلية عبر IPC (التواصل بين العمليات) لتقليل طبقة الشبكة قدر الإمكان.
  • عقدة خاصة (Geth / Reth): اللاعبون الكبار يستخدمون Reth (Rust Ethereum) لأنه يسمح بتخصيص المحرك لإجراء محاكاة متوازية للمعاملات.

2. العقد الذكي: الذرّية أو الموت

لكي يكون هجوم JIT آمنًا، يجب أن تكون عمليتا «الدخول إلى المجمّع» و«الخروج منه» مرتبطتين بمنطق غير قابل للفشل. إذا أضفت سيولة ولم تتمكن من سحبها في نفس البلوك، فقد تتعرض لخسارة كبيرة بسبب Impermanent Loss.

يستخدم البوت عقد Executor Contract. وظيفته تلقي الأوامر من سكربت خارج السلسلة (off‑chain) وتنفيذ سلسلة من الاستدعاءات إلى NonfungiblePositionManager (NFPM) الخاص بـ Uniswap v3.

مثال على بنية العقد (Solidity 0.8.x):

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
interface INonfungiblePositionManager {
    struct MintParams {
        address token0;
        address token1;
        uint24 fee;
        int24 tickLower;
        int24 tickUpper;
        uint256 amount0Desired;
        uint256 amount1Desired;
        uint256 amount0Min;
        uint256 amount1Min;
        address recipient;
        uint256 deadline;
    }
    function mint(MintParams calldata params) external returns (uint256 tokenId, uint128 liquidity, uint256 amount0, uint256 amount1);
    function decreaseLiquidity(uint256 tokenId, uint128 liquidity, uint256 amount0Min, uint256 amount1Min, uint256 deadline) external;
    function collect(uint256 tokenId, address recipient, uint128 amount0Max, uint128 amount1Max) external;
}
contract JITExecutor {
    address private immutable owner;
    INonfungiblePositionManager public immutable nftManager;
    constructor(address _nftManager) {
        owner = msg.sender;
        nftManager = INonfungiblePositionManager(_nftManager);
    }
    function performJit(
        INonfungiblePositionManager.MintParams calldata mintParams
    ) external {
        require(msg.sender == owner, "Unauthorized");
        (uint256 tokenId, uint128 liquidity, , ) = nftManager.mint(mintParams);
    }
    function withdrawJit(uint256 tokenId, uint128 liquidity) external {
        nftManager.decreaseLiquidity(tokenId, liquidity, 0, 0, block.timestamp);
        nftManager.collect(tokenId, msg.sender, type(uint128).max, type(uint128).max);
    }
}

3. حزم Flashbots: لصق الواقع

يجب أن تُحيط معاملات بوت JIT بمعاملة الضحية. ولهذا يتم استخدام آلية Bundles.

يرسل البوت مصفوفة من المعاملات إلى Flashbots (أو أي مرحّل MEV آخر مثل BeaverBuild أو Titan):

  • [Tx_Mint] — معاملة إضافة السيولة الخاصة بك.
  • [Tx_Target] — معاملة المستخدم في mempool التي اعترضتها.
  • [Tx_Burn] — معاملة سحب السيولة الخاصة بك.

تفصيل غير معروف كثيرًا: لتوفير الغاز، قد لا تقوم البوتات المتقدمة بعملية Burn في نفس البلوك إذا كانت متأكدة أن السعر لن يخرج من نطاق الـ tick في البلوك التالي. لكن هذا يصبح مخاطرة «LP سلبي». المفترس الحقيقي في JIT يغلق مركزه دائمًا في البلوك N.

4. منطق البوت خارج السلسلة (Off‑chain Engine)

يعمل بوت Rust في حلقة لا نهائية:

  • بث mempool: الاستماع إلى newPendingTransactions.
  • المحاكاة: لكل معاملة كبيرة، ينفذ البوت «تشغيلًا افتراضيًا» باستخدام eth_call أو revm (Rust EVM) للتنبؤ بكمية الرسوم التي سيحصل عليها.
  • إنشاء الحزمة: إذا كان الربح > 0 يتم تكوين الحزمة.
  • المزايدة: يضيف البوت coinbase.transfer() — رشوة للمدقق.

معلومة من الداخل: في عام 2026 قد تصل الإكرامية (tip) للمدقق إلى 99٪ من أرباح البوت. تتنافس البوتات على 1٪ فقط من الربح الصافي، لأنه في أحجام تداول بالملايين يبقى هذا المبلغ كبيرًا جدًا.

5. نصيحة عملية: استخدام multicall

لتحقيق أعلى كفاءة، استخدم منطق multicall داخل عقدك. يسمح ذلك بتنفيذ approve و mint و decreaseLiquidity و collect في معاملة واحدة إذا كنت تستخدم أموالك الخاصة وليس Flash Loans. يمكن أن يوفر ذلك حوالي 40–60 ألف وحدة غاز من الاستدعاءات المتكررة.

خلاصة المقال

إن بنية بوت JIT تمثل قمة هندسة العقود الذكية. فأنت تنشئ سيولة «مؤقتة» لا تعيش إلا لجزء من الثانية.

في المقال القادم سننتقل إلى «المدفعية الثقيلة». كيف يمكن تنفيذ هجمات JIT دون امتلاك ملايين الدولارات؟ سنستكشف Flash‑JIT واستخدام Flash Loans للسيطرة على 99.9٪ من السيولة في المجمّعات الضخمة.


إتقان سيولة JIT: الدليل الشامل لـ MEV في Uniswap: الجزء 3 من 5

Astra EXMON

Astra is the official voice of EXMON and the editorial collective dedicated to bringing you the most timely and accurate information from the crypto market. Astra represents the combined expertise of our internal analysts, product managers, and blockchain engineers.

...

شاركنا برأيك

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها *