Perlindungan MEV dengan Jito DontFront

Perlindungan MEV dengan Jito DontFront

Maximal Extractable Value (MEV) mengacu pada nilai yang dapat diperoleh dengan mengatur ulang urutan, memasukkan, atau mengecualikan transaksi dalam sebuah blok. MEV tidak unik pada satu chain saja; ini adalah sifat mendasar dari blockchain mana pun di mana produsen blok mengendalikan urutan transaksi. Beberapa bentuk MEV, seperti arbitrase, membantu menjaga efisiensi pasar dengan memperbaiki perbedaan harga antar DEX. Yang lain, seperti serangan sandwich, mengambil nilai langsung dari pengguna. Bagi pengembang yang membangun aplikasi DeFi, ini dapat berarti eksekusi perdagangan yang lebih buruk dan keuntungan yang hilang.

Panduan ini berfokus pada serangan sandwich, bentuk umum MEV yang merugikan, dan cara memitigasinya menggunakan fitur dontfront milik Jito.

Bacaan awal yang direkomendasikan: Jito Bundles

MEV di Solana

Arsitektur Solana sudah mengurangi area permukaan MEV dibandingkan chain dengan mempool publik. Transaksi diteruskan langsung ke pemimpin blok berikutnya alih-alih menunggu di mempool bersama, dan transaksi yang belum diproses kadaluarsa setelah sekitar 150 blok (~1 menit). Hal ini secara signifikan mempersempit celah bagi para pencari untuk mengamati dan bertindak atas transaksi yang tertunda.

Meski begitu, ekstraksi MEV tetap terjadi. Para pencari dengan infrastruktur yang dioptimalkan dan koneksi validator langsung dapat mengamati aliran transaksi dan meresponsnya. Sebagian besar aktivitas MEV di Solana adalah arbitrase atomik: bot yang memperbaiki perbedaan harga antar DEX dalam satu transaksi. Jenis MEV ini umumnya bermanfaat, karena meningkatkan konsistensi harga di seluruh pasar.

Jenis yang merugikan, serangan sandwich, adalah yang harus aktif dilindungi oleh para pengembang.

Apa itu Serangan Sandwich?

Serangan sandwich terjadi ketika seorang pencari mendeteksi swap Anda yang tertunda dan mengeksploitasi urutan transaksi:

  1. Front-run: pencari membeli token sebelum perdagangan Anda, mendorong harga naik
  2. Perdagangan Anda dieksekusi pada harga yang lebih buruk dari yang diharapkan
  3. Back-run: pencari menjual token setelah perdagangan Anda, meraup selisihnya

Di Solana, ini dapat terjadi melalui Jito bundles. Seorang pencari mengirimkan bundle transaksi seperti: [frontrun_tx, your_tx, backrun_tx], dan block engine mengeksekusinya secara atomik secara berurutan. Korban mendapatkan harga eksekusi yang lebih buruk sementara pencari mendapat keuntungan dari selisih tersebut.

Cara Kerja DontFront

DontFront adalah fitur dari Jito block engine yang mencegah para pencari menempatkan transaksi sebelum transaksi Anda dalam sebuah bundle.

Mekanismenya: tambahkan public key Solana yang valid yang dimulai dengan jitodontfront ke instruksi mana pun dalam transaksi Anda. Block engine mengenali awalan ini dan memberlakukan aturan: bundle mana pun yang berisi transaksi Anda harus menempatkannya di indeks 0.

Without dontfront: [frontrun_tx, your_tx, backrun_tx] ← sandwich possible
With dontfront: [your_tx, ...] ← your tx must be first

Langkah demi Langkah

  1. Pilih alamat yang valid yang dimulai dengan jitodontfront (misalnya, jitodontfront111111111111111111111111111111). Akun tersebut tidak perlu ada di onchain; akun ini tidak pernah dibaca atau ditulis. Anda dapat memverifikasi bahwa sebuah string adalah alamat yang valid menggunakan fungsi assertIsAddress dari @solana/kit atau Anda dapat memasukkan alamat tersebut di Solana Explorer untuk melihat apakah alamat itu dapat diselesaikan. Berikut adalah contoh alamat yang tidak valid.

  2. Tambahkan sebagai akun read-only, non-signer ke instruksi mana pun dalam transaksi Anda. Tandai sebagai read-only untuk kecepatan landing yang optimal. Sebagian besar program (termasuk System Program) mengabaikan akun tambahan di luar yang diharapkan.

  3. Kirim melalui Jito block engine:

    • sendTransaction: https://mainnet.block-engine.jito.wtf/api/v1/transactions
    • sendBundle: https://mainnet.block-engine.jito.wtf/api/v1/bundles

    Dokumentasi: sendTransaction dan sendBundle

  4. Block engine mendeteksi awalan jitodontfront dan memberlakukan aturan pengurutan.

Yang Terjadi di Block Engine

Ketika block engine melihat transaksi yang mengandung akun jitodontfront:

  • Melalui sendTransaction: transaksi dilindungi. Tidak ada bundle yang dapat menempatkan transaksi lain sebelumnya
  • Melalui sendBundle: transaksi harus muncul di indeks 0, atau seluruh bundle akan ditolak

Transaksi dan bundle yang tidak mengandung akun jitodontfront tidak terpengaruh.

Aturan Pengurutan Bundle

Aturan-aturan ini berlaku ketika transaksi jitodontfront muncul dalam sebuah bundle.

Pola yang Diizinkan

[tx_with_dontfront, tip]
[tx_with_dontfront, arbitrage, tip]
[tx_with_dontfront_signer1, tx_with_dontfront_signer1_and_signer2, tip]

Beberapa Transaksi DontFront dalam Satu Bundle

Beberapa transaksi dontfront dalam satu bundle diizinkan ketika kedua kondisi terpenuhi:

  1. Semua transaksi dontfront berurutan di bagian depan bundle
  2. Setiap transaksi dontfront berbagi setidaknya satu signer dengan transaksi dontfront pertama
✅ [txA_df, txB_df, txC_df, arbitrage, tip]
(contiguous at front, overlapping signers)
✅ [txA_df_signer1_signer2, txB_df_signer1_signer3, txC_df_signer2_signer4]
(each shares a signer with txA)

Pola yang Ditolak

❌ [tip, tx_with_dontfront]
→ dontfront tx is not at index 0
❌ [txA_df_signer1, txB_df_signer2]
→ no overlapping signer between txA and txB
❌ [trade, tx_with_dontfront, arbitrage, tip]
→ dontfront tx is not at the front

Contoh Integrasi

Untuk resep kode cepat, lihat entri cookbook Perlindungan MEV.

TypeScript (@solana/kit)

Ide utamanya adalah helper yang menambahkan akun dontfront ke instruksi mana pun:

import {
address,
AccountRole,
type Instruction,
type Address
} from "@solana/kit";
const DONT_FRONT: Address = address(
"jitodontfront111111111111111111111111111111"
);
function withDontFront(ix: Instruction): Instruction {
return {
...ix,
accounts: [
...(ix.accounts ?? []),
{ address: DONT_FRONT, role: AccountRole.READONLY }
]
};
}

Kemudian kirimkan transaksi yang telah ditandatangani ke Jito block engine alih-alih node RPC standar. Selalu gunakan enkoding base64. Base58 sudah tidak didukung di API Jito.

const response = await fetch(
"https://mainnet.block-engine.jito.wtf/api/v1/transactions",
{
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
jsonrpc: "2.0",
id: 1,
method: "sendTransaction",
params: [base64Tx, { encoding: "base64" }]
})
}
);

Praktik Terbaik

DontFront adalah satu lapisan perlindungan. Strategi mitigasi MEV yang kuat menggabungkan berbagai pendekatan:

Perlindungan di Level Transaksi

  • Tetapkan toleransi slippage yang ketat. Pertahanan paling efektif tunggal terhadap serangan sandwich adalah membatasi slippage yang dapat diterima pada swap. Rentang slippage yang lebih kecil mengurangi margin keuntungan yang tersedia bagi penyerang, membuat transaksi Anda kurang menarik untuk di-sandwich.

  • Tetapkan tip dan biaya prioritas yang sesuai. Selama kongesti, tip dan biaya prioritas yang lebih tinggi meningkatkan kemungkinan transaksi/bundle Anda mendarat dengan cepat, mempersempit celah bagi para pencari untuk bertindak. Lihat dokumentasi Jito tentang Jumlah Tip untuk detail lebih lanjut tentang cara menetapkan tip yang sesuai.

  • Optimalkan penggunaan compute unit. Setiap blok memiliki jumlah compute unit yang terbatas (dan akun memiliki jumlah compute unit yang terbatas per blok). Untuk memaksimalkan kemungkinan transaksi/bundle Anda dimasukkan dalam sebuah blok, Anda harus mengoptimalkan penggunaan compute unit Anda. Lihat panduan Cara Mengoptimalkan Penggunaan Compute di Solana untuk detailnya.

Khusus DontFront

  1. Tandai akun dontfront sebagai read-only. Penandaan writable tetap berfungsi tetapi read-only mengoptimalkan kecepatan landing.

  2. Gunakan pubkey dontfront yang unik per aplikasi. Pubkey apa pun yang dimulai dengan jitodontfront berfungsi. Menggunakan varian yang unik (misalnya, jitodontfront111111111111111111111111111123) memungkinkan Anda membedakan penggunaan per aplikasi saat memeriksa data onchain.

  3. DontFront mendukung Address Lookup Tables. Akun dontfront dapat disertakan melalui ALT. Namun jangan gunakan ALT untuk akun tip.

Keterbatasan

  • Block engine saja. DontFront diberlakukan oleh Jito block engine. Transaksi yang dikirimkan langsung ke validator (melewati Jito) tidak dilindungi.

  • Bukan jaminan. Dari dokumen Jito: "Fitur ini mungkin membantu mengurangi serangan sandwich tetapi tidak dijamin untuk melakukannya dan bukan merupakan solusi untuk semua variasi dalam pengurutan transaksi, termasuk pengurutan apa pun yang dilakukan oleh pihak ketiga."

  • Hanya Mainnet/Testnet. Ini adalah fitur Jito block engine. Tidak berfungsi di devnet atau localhost.

Referensi

Is this page helpful?

© 2026 Yayasan Solana. Semua hak dilindungi.