Perlindungan MEV dengan Jito DontFront

Perlindungan MEV dengan Jito DontFront

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

Panduan ini berfokus pada sandwich attack, salah satu bentuk MEV berbahaya yang umum, dan cara menguranginya menggunakan fitur dontfront dari Jito.

Bacaan prasyarat 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 berada di mempool bersama, dan transaksi yang belum diproses kedaluwarsa setelah sekitar 150 blok (~1 menit). Hal ini secara signifikan mempersempit celah bagi pencari untuk mengamati dan bertindak berdasarkan transaksi yang tertunda.

Meskipun demikian, ekstraksi MEV tetap terjadi. Pencari dengan infrastruktur yang teroptimasi dan koneksi validator langsung dapat mengamati aliran transaksi dan meresponsnya. Sebagian besar aktivitas MEV di Solana adalah arbitrase atomik: bot yang mengoreksi perbedaan harga antar DEX dalam satu transaksi. Jenis MEV ini umumnya bermanfaat karena meningkatkan konsistensi harga di seluruh pasar.

Jenis yang berbahaya, sandwich attack, adalah yang harus secara aktif dilindungi oleh para pengembang.

Apa Itu Sandwich Attack?

Sandwich attack 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, mengantongi selisihnya

Di Solana, hal 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 pencari menempatkan transaksi sebelum transaksi Anda dalam sebuah bundle.

Mekanismenya: tambahkan public key Solana valid apa pun 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 (mis., jitodontfront111111111111111111111111111111). Akun tidak perlu ada di onchain; akun ini tidak pernah dibaca atau ditulis. Anda dapat memverifikasi apakah sebuah string adalah alamat yang valid menggunakan fungsi assertIsAddress dari @solana/kit atau Anda dapat memasukkan alamat di Solana Explorer untuk melihat apakah alamat tersebut dapat diselesaikan. Berikut adalah contoh alamat 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 mereka harapkan.

  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 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 sebuah 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, bukan ke node RPC standar. Selalu gunakan encoding base64. Base58 sudah tidak digunakan lagi 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 Tingkat Transaksi

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

  • Tetapkan tips dan biaya prioritas yang sesuai. Saat terjadi kemacetan, tips dan biaya prioritas yang lebih tinggi meningkatkan kemungkinan transaksi/bundle Anda mendarat dengan cepat, mengurangi celah bagi pencari untuk bertindak. Lihat dokumentasi Jito tentang Jumlah Tip untuk informasi lebih lanjut tentang cara menetapkan tips yang sesuai.

  • Optimalkan penggunaan unit komputasi. Setiap blok memiliki jumlah unit komputasi yang terbatas (dan akun memiliki jumlah unit komputasi yang terbatas yang tersedia per blok). Untuk memastikan kemungkinan transaksi/bundle Anda disertakan dalam blok dimaksimalkan, Anda harus mengoptimalkan penggunaan unit komputasi Anda. Lihat panduan Cara Mengoptimalkan Penggunaan Komputasi 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 dapat digunakan. Menggunakan varian unik (mis., 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

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

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

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

Referensi

Is this page helpful?

© 2026 Yayasan Solana. Semua hak dilindungi.