[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"article-deep-evm-15-simulasi-mev-binary-search-state-fork-deadline":3},{"article":4,"author":62},{"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},"d2000000-0000-0000-0000-000000000115","a0000000-0000-0000-0000-000000000026","Deep EVM #15: Simulasi MEV — Binary Search, State Fork, dan Deadline 12 Detik","deep-evm-15-simulasi-mev-binary-search-state-fork-deadline","Cara mensimulasikan transaksi MEV sebelum eksekusi: fork state blockchain, jalankan simulasi dengan revm, optimasi jumlah input dengan binary search, semua dalam deadline 12 detik.","## Mengapa Simulasi Diperlukan\n\nMenemukan peluang arbitrase di graf pool tidak cukup — Anda harus memverifikasi bahwa transaksi benar-benar akan berhasil dan menguntungkan pada state blockchain saat ini. Simulasi adalah jembatan antara analisis off-chain dan eksekusi on-chain.\n\nTanpa simulasi, Anda akan:\n- Mengirim transaksi yang revert (membuang gas)\n- Salah menghitung profitabilitas (reserves sudah berubah)\n- Gagal memperhitungkan efek samping (reentrancy guard, pause mechanism)\n\n## revm: Simulator EVM di Rust\n\nrevm adalah implementasi EVM di Rust yang cepat dan modular. Digunakan oleh Foundry, Reth, dan sebagian besar bot MEV di produksi.\n\n```rust\nuse revm::{\n    db::CacheDB,\n    primitives::{ExecutionResult, Output, TransactTo, U256},\n    Evm,\n};\n\nfn simulate_swap(\n    db: &mut CacheDB\u003Cimpl DatabaseRef>,\n    from: Address,\n    to: Address,\n    calldata: Bytes,\n    value: U256,\n) -> Result\u003CBytes, SimError> {\n    let mut evm = Evm::builder()\n        .with_db(db)\n        .modify_tx_env(|tx| {\n            tx.caller = from;\n            tx.transact_to = TransactTo::Call(to);\n            tx.data = calldata;\n            tx.value = value;\n            tx.gas_limit = 500_000;\n        })\n        .build();\n    \n    let result = evm.transact_commit()?;\n    \n    match result {\n        ExecutionResult::Success { output, gas_used, .. } => {\n            match output {\n                Output::Call(data) => Ok(data),\n                _ => Err(SimError::UnexpectedOutput),\n            }\n        }\n        ExecutionResult::Revert { output, .. } => {\n            Err(SimError::Revert(output))\n        }\n        ExecutionResult::Halt { reason, .. } => {\n            Err(SimError::Halt(reason))\n        }\n    }\n}\n```\n\n## Fork State dari Node\n\nUntuk simulasi akurat, Anda perlu state blockchain terbaru:\n\n```rust\nuse alloy::providers::Provider;\nuse revm::db::AlloyDB;\n\nasync fn create_fork_db(provider: &impl Provider) -> CacheDB\u003CAlloyDB> {\n    let block = provider.get_block_number().await.unwrap();\n    let alloy_db = AlloyDB::new(provider.clone(), block);\n    CacheDB::new(alloy_db)\n}\n```\n\nCacheDB meng-cache hasil query sehingga pembacaan berulang dari slot storage yang sama tidak memerlukan RPC call tambahan.\n\n## Binary Search untuk Jumlah Optimal\n\nAlih-alih menghitung secara analitis, gunakan simulasi aktual untuk menemukan jumlah input optimal:\n\n```rust\nasync fn find_optimal_amount(\n    db: &CacheDB\u003Cimpl DatabaseRef>,\n    cycle: &ArbitrageCycle,\n) -> (U256, U256) {\n    let mut lo = U256::from(1_000_000_000_000_000u64); \u002F\u002F 0.001 ETH\n    let mut hi = U256::from(50_000_000_000_000_000_000u128); \u002F\u002F 50 ETH\n    \n    for _ in 0..40 {\n        let mid = (lo + hi) \u002F 2;\n        \n        \u002F\u002F Clone DB untuk simulasi non-destruktif\n        let mut sim_db = db.clone();\n        \n        let profit = simulate_cycle(&mut sim_db, cycle, mid);\n        let profit_higher = simulate_cycle(&mut db.clone(), cycle, mid + mid \u002F 100);\n        \n        if profit_higher > profit {\n            lo = mid;\n        } else {\n            hi = mid;\n        }\n    }\n    \n    let optimal = (lo + hi) \u002F 2;\n    let profit = simulate_cycle(&mut db.clone(), cycle, optimal);\n    (optimal, profit)\n}\n```\n\n## Deadline 12 Detik\n\nEthereum menghasilkan block setiap 12 detik. Pencari MEV harus:\n\n1. **Deteksi peluang** — Memantau mempool dan event (1-2 detik)\n2. **Simulasikan dan optimasi** — Jalankan simulasi revm (1-3 detik)\n3. **Bangun bundle** — Buat dan tandatangani transaksi (\u003C 1 detik)\n4. **Kirim ke pembangun** — Melalui Flashbots atau relay (1-2 detik)\n5. **Margin keamanan** — Waktu buffer (2-3 detik)\n\nTotal budget: ~12 detik. Jika simulasi memakan waktu terlalu lama, peluang sudah lewat.\n\n### Strategi Optimasi Waktu\n\n```rust\nuse tokio::time::{timeout, Duration};\n\nasync fn search_with_deadline(\n    opportunities: Vec\u003CArbitrageCycle>,\n    db: &CacheDB\u003Cimpl DatabaseRef>,\n    deadline: Duration,\n) -> Option\u003C(ArbitrageCycle, U256, U256)> {\n    let start = std::time::Instant::now();\n    let mut best: Option\u003C(ArbitrageCycle, U256, U256)> = None;\n    \n    for opp in opportunities {\n        \u002F\u002F Periksa deadline\n        if start.elapsed() > deadline {\n            break;\n        }\n        \n        let remaining = deadline - start.elapsed();\n        \n        \u002F\u002F Simulasi dengan timeout\n        match timeout(remaining \u002F 2, find_optimal_amount(db, &opp)).await {\n            Ok((amount, profit)) => {\n                if let Some((_, _, best_profit)) = &best {\n                    if profit > *best_profit {\n                        best = Some((opp, amount, profit));\n                    }\n                } else {\n                    best = Some((opp, amount, profit));\n                }\n            }\n            Err(_) => break, \u002F\u002F Timeout\n        }\n    }\n    \n    best\n}\n```\n\n## Memperhitungkan Gas\n\nProfitabilitas bersih = output - input - biaya gas:\n\n```rust\nfn net_profit(\n    gross_profit: U256,\n    gas_used: u64,\n    base_fee: U256,\n    priority_fee: U256,\n) -> I256 {\n    let gas_cost = U256::from(gas_used) * (base_fee + priority_fee);\n    I256::from_raw(gross_profit) - I256::from_raw(gas_cost)\n}\n```\n\nBot MEV juga harus menawar sebagian profit ke pembangun block sebagai \"tip\" agar bundle mereka disertakan.\n\n## Simulasi Multi-Transaksi (Bundle)\n\nBundle MEV sering berisi beberapa transaksi:\n\n```rust\nfn simulate_bundle(\n    db: &mut CacheDB\u003Cimpl DatabaseRef>,\n    transactions: &[Transaction],\n) -> Result\u003CBundleResult, SimError> {\n    let mut total_gas = 0u64;\n    let mut results = Vec::new();\n    \n    for tx in transactions {\n        let result = simulate_swap(\n            db,\n            tx.from,\n            tx.to,\n            tx.calldata.clone(),\n            tx.value,\n        )?;\n        total_gas += result.gas_used;\n        results.push(result);\n    }\n    \n    Ok(BundleResult {\n        total_gas,\n        results,\n    })\n}\n```\n\nPENTING: Simulasi bundle harus dijalankan secara sekuensial pada DB yang sama karena setiap transaksi mengubah state yang memengaruhi transaksi berikutnya.\n\n## Kesimpulan\n\nSimulasi adalah komponen kritis infrastruktur MEV. revm memberikan simulasi cepat di Rust, fork state memastikan akurasi, binary search mengoptimalkan jumlah input, dan manajemen deadline memastikan Anda tidak melewatkan peluang. Kemampuan mensimulasikan dengan cepat dan akurat adalah keunggulan kompetitif utama bagi pencari MEV.","\u003Ch2 id=\"mengapa-simulasi-diperlukan\">Mengapa Simulasi Diperlukan\u003C\u002Fh2>\n\u003Cp>Menemukan peluang arbitrase di graf pool tidak cukup — Anda harus memverifikasi bahwa transaksi benar-benar akan berhasil dan menguntungkan pada state blockchain saat ini. Simulasi adalah jembatan antara analisis off-chain dan eksekusi on-chain.\u003C\u002Fp>\n\u003Cp>Tanpa simulasi, Anda akan:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Mengirim transaksi yang revert (membuang gas)\u003C\u002Fli>\n\u003Cli>Salah menghitung profitabilitas (reserves sudah berubah)\u003C\u002Fli>\n\u003Cli>Gagal memperhitungkan efek samping (reentrancy guard, pause mechanism)\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"revm-simulator-evm-di-rust\">revm: Simulator EVM di Rust\u003C\u002Fh2>\n\u003Cp>revm adalah implementasi EVM di Rust yang cepat dan modular. Digunakan oleh Foundry, Reth, dan sebagian besar bot MEV di produksi.\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-rust\">use revm::{\n    db::CacheDB,\n    primitives::{ExecutionResult, Output, TransactTo, U256},\n    Evm,\n};\n\nfn simulate_swap(\n    db: &amp;mut CacheDB&lt;impl DatabaseRef&gt;,\n    from: Address,\n    to: Address,\n    calldata: Bytes,\n    value: U256,\n) -&gt; Result&lt;Bytes, SimError&gt; {\n    let mut evm = Evm::builder()\n        .with_db(db)\n        .modify_tx_env(|tx| {\n            tx.caller = from;\n            tx.transact_to = TransactTo::Call(to);\n            tx.data = calldata;\n            tx.value = value;\n            tx.gas_limit = 500_000;\n        })\n        .build();\n    \n    let result = evm.transact_commit()?;\n    \n    match result {\n        ExecutionResult::Success { output, gas_used, .. } =&gt; {\n            match output {\n                Output::Call(data) =&gt; Ok(data),\n                _ =&gt; Err(SimError::UnexpectedOutput),\n            }\n        }\n        ExecutionResult::Revert { output, .. } =&gt; {\n            Err(SimError::Revert(output))\n        }\n        ExecutionResult::Halt { reason, .. } =&gt; {\n            Err(SimError::Halt(reason))\n        }\n    }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"fork-state-dari-node\">Fork State dari Node\u003C\u002Fh2>\n\u003Cp>Untuk simulasi akurat, Anda perlu state blockchain terbaru:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-rust\">use alloy::providers::Provider;\nuse revm::db::AlloyDB;\n\nasync fn create_fork_db(provider: &amp;impl Provider) -&gt; CacheDB&lt;AlloyDB&gt; {\n    let block = provider.get_block_number().await.unwrap();\n    let alloy_db = AlloyDB::new(provider.clone(), block);\n    CacheDB::new(alloy_db)\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>CacheDB meng-cache hasil query sehingga pembacaan berulang dari slot storage yang sama tidak memerlukan RPC call tambahan.\u003C\u002Fp>\n\u003Ch2 id=\"binary-search-untuk-jumlah-optimal\">Binary Search untuk Jumlah Optimal\u003C\u002Fh2>\n\u003Cp>Alih-alih menghitung secara analitis, gunakan simulasi aktual untuk menemukan jumlah input optimal:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-rust\">async fn find_optimal_amount(\n    db: &amp;CacheDB&lt;impl DatabaseRef&gt;,\n    cycle: &amp;ArbitrageCycle,\n) -&gt; (U256, U256) {\n    let mut lo = U256::from(1_000_000_000_000_000u64); \u002F\u002F 0.001 ETH\n    let mut hi = U256::from(50_000_000_000_000_000_000u128); \u002F\u002F 50 ETH\n    \n    for _ in 0..40 {\n        let mid = (lo + hi) \u002F 2;\n        \n        \u002F\u002F Clone DB untuk simulasi non-destruktif\n        let mut sim_db = db.clone();\n        \n        let profit = simulate_cycle(&amp;mut sim_db, cycle, mid);\n        let profit_higher = simulate_cycle(&amp;mut db.clone(), cycle, mid + mid \u002F 100);\n        \n        if profit_higher &gt; profit {\n            lo = mid;\n        } else {\n            hi = mid;\n        }\n    }\n    \n    let optimal = (lo + hi) \u002F 2;\n    let profit = simulate_cycle(&amp;mut db.clone(), cycle, optimal);\n    (optimal, profit)\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"deadline-12-detik\">Deadline 12 Detik\u003C\u002Fh2>\n\u003Cp>Ethereum menghasilkan block setiap 12 detik. Pencari MEV harus:\u003C\u002Fp>\n\u003Col>\n\u003Cli>\u003Cstrong>Deteksi peluang\u003C\u002Fstrong> — Memantau mempool dan event (1-2 detik)\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Simulasikan dan optimasi\u003C\u002Fstrong> — Jalankan simulasi revm (1-3 detik)\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Bangun bundle\u003C\u002Fstrong> — Buat dan tandatangani transaksi (&lt; 1 detik)\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Kirim ke pembangun\u003C\u002Fstrong> — Melalui Flashbots atau relay (1-2 detik)\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Margin keamanan\u003C\u002Fstrong> — Waktu buffer (2-3 detik)\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>Total budget: ~12 detik. Jika simulasi memakan waktu terlalu lama, peluang sudah lewat.\u003C\u002Fp>\n\u003Ch3>Strategi Optimasi Waktu\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-rust\">use tokio::time::{timeout, Duration};\n\nasync fn search_with_deadline(\n    opportunities: Vec&lt;ArbitrageCycle&gt;,\n    db: &amp;CacheDB&lt;impl DatabaseRef&gt;,\n    deadline: Duration,\n) -&gt; Option&lt;(ArbitrageCycle, U256, U256)&gt; {\n    let start = std::time::Instant::now();\n    let mut best: Option&lt;(ArbitrageCycle, U256, U256)&gt; = None;\n    \n    for opp in opportunities {\n        \u002F\u002F Periksa deadline\n        if start.elapsed() &gt; deadline {\n            break;\n        }\n        \n        let remaining = deadline - start.elapsed();\n        \n        \u002F\u002F Simulasi dengan timeout\n        match timeout(remaining \u002F 2, find_optimal_amount(db, &amp;opp)).await {\n            Ok((amount, profit)) =&gt; {\n                if let Some((_, _, best_profit)) = &amp;best {\n                    if profit &gt; *best_profit {\n                        best = Some((opp, amount, profit));\n                    }\n                } else {\n                    best = Some((opp, amount, profit));\n                }\n            }\n            Err(_) =&gt; break, \u002F\u002F Timeout\n        }\n    }\n    \n    best\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"memperhitungkan-gas\">Memperhitungkan Gas\u003C\u002Fh2>\n\u003Cp>Profitabilitas bersih = output - input - biaya gas:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-rust\">fn net_profit(\n    gross_profit: U256,\n    gas_used: u64,\n    base_fee: U256,\n    priority_fee: U256,\n) -&gt; I256 {\n    let gas_cost = U256::from(gas_used) * (base_fee + priority_fee);\n    I256::from_raw(gross_profit) - I256::from_raw(gas_cost)\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Bot MEV juga harus menawar sebagian profit ke pembangun block sebagai “tip” agar bundle mereka disertakan.\u003C\u002Fp>\n\u003Ch2 id=\"simulasi-multi-transaksi-bundle\">Simulasi Multi-Transaksi (Bundle)\u003C\u002Fh2>\n\u003Cp>Bundle MEV sering berisi beberapa transaksi:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-rust\">fn simulate_bundle(\n    db: &amp;mut CacheDB&lt;impl DatabaseRef&gt;,\n    transactions: &amp;[Transaction],\n) -&gt; Result&lt;BundleResult, SimError&gt; {\n    let mut total_gas = 0u64;\n    let mut results = Vec::new();\n    \n    for tx in transactions {\n        let result = simulate_swap(\n            db,\n            tx.from,\n            tx.to,\n            tx.calldata.clone(),\n            tx.value,\n        )?;\n        total_gas += result.gas_used;\n        results.push(result);\n    }\n    \n    Ok(BundleResult {\n        total_gas,\n        results,\n    })\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>PENTING: Simulasi bundle harus dijalankan secara sekuensial pada DB yang sama karena setiap transaksi mengubah state yang memengaruhi transaksi berikutnya.\u003C\u002Fp>\n\u003Ch2 id=\"kesimpulan\">Kesimpulan\u003C\u002Fh2>\n\u003Cp>Simulasi adalah komponen kritis infrastruktur MEV. revm memberikan simulasi cepat di Rust, fork state memastikan akurasi, binary search mengoptimalkan jumlah input, dan manajemen deadline memastikan Anda tidak melewatkan peluang. Kemampuan mensimulasikan dengan cepat dan akurat adalah keunggulan kompetitif utama bagi pencari MEV.\u003C\u002Fp>\n","id","b0000000-0000-0000-0000-000000000001",true,"2026-03-28T10:44:24.904028Z","Deep EVM #15: Simulasi MEV — Binary Search, State Fork, dan Deadline","Simulasi transaksi MEV: fork state dengan revm, optimasi binary search, dan manajemen deadline 12 detik untuk pencari.","simulasi MEV revm",null,"index, follow",[22,27,31,35],{"id":23,"name":24,"slug":25,"created_at":26},"c0000000-0000-0000-0000-000000000016","EVM","evm","2026-03-28T10:44:21.513630Z",{"id":28,"name":29,"slug":30,"created_at":26},"c0000000-0000-0000-0000-000000000020","Gas Optimization","gas-optimization",{"id":32,"name":33,"slug":34,"created_at":26},"c0000000-0000-0000-0000-000000000019","MEV","mev",{"id":36,"name":37,"slug":38,"created_at":26},"c0000000-0000-0000-0000-000000000001","Rust","rust","Rekayasa",[41,48,55],{"id":42,"title":43,"slug":44,"excerpt":45,"locale":12,"category_name":46,"published_at":47},"d0000000-0000-0000-0000-000000000642","WASI 0.3 dan Kematian Cold Start: Wasm Sisi Server di Produksi","wasi-0-3-kematian-cold-start-wasm-sisi-server-di-produksi","WASI 0.3 dirilis pada Februari 2026 dengan async I\u002FO native, tipe stream, dan dukungan socket penuh. WebAssembly sisi server kini menghadirkan cold start dalam hitungan mikrodetik, dan setiap penyedia cloud besar menawarkan Wasm serverless.","DevOps","2026-03-28T10:44:47.445780Z",{"id":49,"title":50,"slug":51,"excerpt":52,"locale":12,"category_name":53,"published_at":54},"d0000000-0000-0000-0000-000000000620","Stack Backend Modern 2026: Rust + PostgreSQL 18 + Wasm + eBPF","stack-backend-modern-2026-rust-postgresql-wasm-ebpf","Empat teknologi konvergen untuk mendefinisikan ulang infrastruktur backend di 2026: Rust menghilangkan overhead garbage collection dan mengurangi jumlah container hingga 3x, PostgreSQL 18 menggantikan database khusus, WASI 0.3 memberikan cold start mikrodetik untuk fungsi serverless, dan eBPF memungkinkan observabilitas tanpa instrumentasi dengan biaya yang jauh lebih rendah dari monitoring tradisional.","Engineering","2026-03-28T10:44:45.804120Z",{"id":56,"title":57,"slug":58,"excerpt":59,"locale":12,"category_name":60,"published_at":61},"d0000000-0000-0000-0000-000000000571","Peta Jalan Skalabilitas Ethereum 2026: Glamsterdam, PeerDAS, dan 10.000 TPS","peta-jalan-skalabilitas-ethereum-2026-glamsterdam-peerdas-10000-tps","Ethereum menargetkan 10.000 transaksi per detik di seluruh ekosistem L1 dan L2 pada 2026. Dengan upgrade Glamsterdam dan Hegota di depan mata, ditambah PeerDAS untuk ketersediaan data, berikut peta jalan teknis lengkapnya.","Blockchain","2026-03-28T10:44:42.809066Z",{"id":13,"name":63,"slug":64,"bio":65,"photo_url":19,"linkedin":19,"role":66,"created_at":67,"updated_at":67},"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"]