Drücken Sie ESC, um zu schließen

JIT-Bot bauen: Rust-Stack und atomare Smart Contracts

Dies ist der dritte Artikel unserer Serie „Raubtiere in Pools: Die Kunst und Mathematik der JIT-Liquidität“. Nun kommen wir zum technischen Teil: Wie man mathematische Formeln in Programmcode umsetzt, der schneller ausgeführt wird, als man blinzeln kann.

Im Jahr 2026 ist JIT-Liquidität kein Wettstreit der Ideen mehr, sondern der Infrastruktur. Wenn Ihr Bot in Python geschrieben ist und über HTTP mit einem öffentlichen Node kommuniziert, verlieren Sie nicht nur – Sie werden nicht einmal merken, wann Ihr Gewinn abgegriffen wird.

1. Technologiestack: Warum Rust dominiert

In der MEV-Welt entscheidet sich der Wettkampf auf Mikrosekundenebene.

  • Sprache: Rust. Die Nutzung der Alloy-Bibliothek (Nachfolger von ethers-rs) ist zum Industriestandard geworden. Alloy ermöglicht die Arbeit mit Ethereum-Datentypen ohne unnötige Speicherallokationen und bietet ultraschnelle Serialisierung/Deserialisierung von JSON-RPC-Anfragen.
  • Verbindung: IPC/WebSockets. Bots verwenden kein HTTP. Sie verbinden sich über IPC (Inter-Process Communication) mit einem lokalen Node, um den Netzwerk-Stack zu minimieren.
  • Eigener Node (Geth/Reth): Spitzenakteure nutzen Reth (Rust Ethereum), da es die Anpassung der Engine für parallele Transaktionssimulation ermöglicht.

2. Smart Contract: Atomarität oder Tod

Damit ein JIT-Angriff sicher ist, müssen die Operationen „Pool betreten“ und „Pool verlassen“ durch eine eiserne Logik verbunden sein. Wenn Sie Liquidität hinzufügen, sie aber im gleichen Block nicht wieder abziehen können, riskieren Sie einen hohen Impermanent Loss.

Der Bot verwendet einen Executor Contract. Seine Aufgabe ist es, Befehle von einem Off-Chain-Skript zu empfangen und eine Serie von Aufrufen an den NonfungiblePositionManager (NFPM) von Uniswap v3 auszuführen.

Beispiel für die Vertragsarchitektur (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);
    }
    // Hauptfunktion: vom Bot aufgerufen, um JIT in einem Durchgang auszuführen
    function performJit(
        INonfungiblePositionManager.MintParams calldata mintParams
    ) external {
        require(msg.sender == owner, "Unauthorized");
        // 1. Den Vertrag mit Tokens versorgen (normalerweise bereits vorhanden oder via Flash Loan)
        
        // 2. Liquidität hinzufügen (Mint)
        (uint256 tokenId, uint128 liquidity, , ) = nftManager.mint(mintParams);
        // ACHTUNG: In einem klassischen Flashbots-Bundle
        // wird dieser Vertrag hier die Ausführung beenden und die Auszahlung erfolgt in einer zweiten Transaktion.
        // Alternativ, bei Verwendung eines spezifischen Routers, alles in einem Schritt.
    }
    
    // Funktion, um den Gewinn sofort abzuziehen
    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 Bundles: Realität zusammenfügen

Die Transaktionen des JIT-Bots müssen die Transaktion des Opfers umgeben. Dazu wird der Bundles-Mechanismus verwendet.

Der Bot sendet ein Array von Transaktionen an Flashbots (oder andere MEV-Relays wie BeaverBuild oder Titan):

  • [Tx_Mint] — Ihre Transaktion zum Hinzufügen von Liquidität.
  • [Tx_Target] — Die Nutzertransaktion aus dem Mempool (die Sie abgefangen haben).
  • [Tx_Burn] — Ihre Auszahlungstransaktion.

Wenig bekannte Tatsache: Um Gas zu sparen, führen fortgeschrittene Bots den Burn manchmal nicht im gleichen Block aus, wenn sie sicher sind, dass der Preis im nächsten Block nicht aus dem Tick geht. Aber dies ist ein Risiko eines „passiven LP“. Ein echter JIT-Raubtier schließt die Position immer im Block $N$.

4. Off-Chain Bot-Logik (Off-chain Engine)

Ein Rust-Bot läuft in einer Endlosschleife:

  • Mempool-Streaming: hört auf newPendingTransactions.
  • Simulation: Für jede große Transaktion führt der Bot eine „virtuelle Ausführung“ über eth_call oder revm (Rust EVM) durch, um zu sehen, welche Gebühren er erhält.
  • Bundle-Generierung: Wenn Profit > 0, wird ein Paket erstellt.
  • Bidding: Der Bot fügt coinbase.transfer() hinzu — ein Trinkgeld für den Validator.

Insider-Info: 2026 kann das Tip für Validatoren bis zu 99 % des Bot-Profits betragen. Bots kämpfen um die restlichen 1 % Nettoprofit, denn bei Millionen-Dollar-Volumen ist selbst 1 % viel Geld.

5. Praktischer Tipp: multicall verwenden

Für maximale Effizienz sollten Sie die multicall-Logik in Ihrem Vertrag verwenden. Damit können approve, mint, decreaseLiquidity und collect in einer einzigen Transaktion ausgeführt werden, wenn Sie eigenes Kapital verwenden und keine Flash Loans. Spart etwa 40–60k Gas bei wiederholten Aufrufen.

 

Fazit des Artikels

Die Architektur eines JIT-Bots ist die Spitze der Smart-Contract-Engineering. Sie erstellen „Einmal-Liquidität“, die nur für Bruchteile einer Sekunde existiert.

Im nächsten Artikel: Wir gehen zur „schweren Artillerie“. Wie führt man JIT-Angriffe durch, ohne eigene Millionen? Wir analysieren Flash-JIT und den Einsatz von Flash Loans, um 99,9 % der Liquidität in riesigen Pools zu erobern.


JIT-Liquiditäts-Meisterschaft: Der komplette Leitfaden zu MEV in Uniswap: Teil 3 von 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.

...

Diskussion beitreten

Ihre E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *