Προστασία MEV με το Jito DontFront
Το Maximal Extractable Value (MEV) αναφέρεται στην αξία που μπορεί να αποσπαστεί με αναδιάταξη, συμπερίληψη ή αποκλεισμό συναλλαγών εντός ενός block. Το MEV δεν είναι αποκλειστικό χαρακτηριστικό μιας αλυσίδας· αποτελεί θεμελιώδη ιδιότητα κάθε blockchain όπου οι παραγωγοί block ελέγχουν τη σειρά των συναλλαγών. Ορισμένες μορφές MEV, όπως το arbitrage, βοηθούν στη διατήρηση της αποδοτικότητας των αγορών διορθώνοντας αποκλίσεις τιμών μεταξύ DEX. Άλλες, όπως οι επιθέσεις sandwich, αποσπούν αξία απευθείας από τους χρήστες. Για τους προγραμματιστές που δημιουργούν εφαρμογές DeFi, αυτό μπορεί να σημαίνει χειρότερη εκτέλεση συναλλαγών και απώλεια κερδών.
Αυτός ο οδηγός εστιάζει στις επιθέσεις sandwich, μια συνηθισμένη μορφή επιβλαβούς MEV, και στον
τρόπο αντιμετώπισής τους χρησιμοποιώντας το χαρακτηριστικό dontfront του Jito.
Προτεινόμενη προαπαιτούμενη ανάγνωση: Jito Bundles
MEV στο Solana
Η αρχιτεκτονική του Solana μειώνει ήδη την επιφάνεια MEV σε σχέση με αλυσίδες με δημόσια mempool. Οι συναλλαγές προωθούνται απευθείας στον επόμενο leader του block αντί να αναμένουν σε κοινό mempool, και οι ανεπεξέργαστες συναλλαγές λήγουν μετά από περίπου 150 block (~1 λεπτό). Αυτό περιορίζει σημαντικά το παράθυρο για τους searchers να παρατηρούν και να ενεργούν επί εκκρεμών συναλλαγών.
Παρόλα αυτά, η εξαγωγή MEV εξακολουθεί να πραγματοποιείται. Οι searchers με βελτιστοποιημένη υποδομή και άμεσες συνδέσεις validator μπορούν να παρατηρούν τη ροή συναλλαγών και να ανταποκρίνονται σε αυτήν. Μεγάλο μέρος της δραστηριότητας MEV στο Solana είναι ατομικό arbitrage: bots που διορθώνουν διαφορές τιμών μεταξύ DEX σε μία μόνο συναλλαγή. Αυτός ο τύπος MEV είναι γενικά ωφέλιμος, καθώς βελτιώνει τη συνέπεια τιμών μεταξύ αγορών.
Η επιβλαβής ποικιλία, οι επιθέσεις sandwich, είναι αυτή από την οποία οι προγραμματιστές πρέπει ενεργά να προστατεύονται.
Τι είναι η Επίθεση Sandwich;
Μια επίθεση sandwich συμβαίνει όταν ένας searcher εντοπίζει την εκκρεμή ανταλλαγή σας και εκμεταλλεύεται τη σειρά των συναλλαγών:
- Front-run: ο searcher αγοράζει το token πριν από τη συναλλαγή σας, ωθώντας την τιμή προς τα πάνω
- Η συναλλαγή σας εκτελείται σε χειρότερη τιμή από την αναμενόμενη
- Back-run: ο searcher πουλά το token μετά τη συναλλαγή σας, κερδίζοντας τη διαφορά
Στο Solana, αυτό μπορεί να συμβεί μέσω
Jito bundles. Ένας
searcher υποβάλλει ένα bundle συναλλαγών όπως:
[frontrun_tx, your_tx, backrun_tx], και το block engine τις εκτελεί
ατομικά με τη σειρά. Το θύμα λαμβάνει χειρότερη τιμή εκτέλεσης ενώ ο searcher
κερδίζει από τη διαφορά.
Πώς Λειτουργεί το DontFront
Το DontFront είναι ένα χαρακτηριστικό του Jito block engine που αποτρέπει τους searchers από το να τοποθετούν συναλλαγές πριν από τη δική σας σε ένα bundle.
Ο μηχανισμός: προσθέστε οποιοδήποτε έγκυρο δημόσιο κλειδί Solana που ξεκινά με jitodontfront
σε οποιαδήποτε εντολή της συναλλαγής σας. Το block engine αναγνωρίζει αυτό το πρόθεμα
και επιβάλλει έναν κανόνα: οποιοδήποτε bundle που περιέχει τη συναλλαγή σας πρέπει να την τοποθετεί στο
index 0.
Without dontfront: [frontrun_tx, your_tx, backrun_tx] ← sandwich possibleWith dontfront: [your_tx, ...] ← your tx must be first
Βήμα προς Βήμα
-
Επιλέξτε μια έγκυρη διεύθυνση που ξεκινά με
jitodontfront(π.χ.,jitodontfront111111111111111111111111111111). Ο λογαριασμός δεν χρειάζεται να υπάρχει onchain· δεν διαβάζεται ή γράφεται ποτέ. Μπορείτε να επαληθεύσετε ότι μια συμβολοσειρά είναι έγκυρη διεύθυνση χρησιμοποιώντας τηassertIsAddressσυνάρτηση από το @solana/kit ή μπορείτε να εισαγάγετε τη διεύθυνση στο Solana Explorer για να δείτε αν επιλύεται. Εδώ είναι ένα παράδειγμα μη έγκυρης διεύθυνσης. -
Προσθέστε τον ως λογαριασμό μόνο-ανάγνωσης, χωρίς υπογραφή σε οποιαδήποτε εντολή της συναλλαγής σας. Σημειώστε τον ως μόνο-ανάγνωσης για βέλτιστη ταχύτητα προσγείωσης. Τα περισσότερα προγράμματα (συμπεριλαμβανομένου του System Program) αγνοούν επιπλέον λογαριασμούς πέρα από αυτούς που αναμένουν.
-
Υποβάλλετε μέσω του Jito block engine:
sendTransaction:https://mainnet.block-engine.jito.wtf/api/v1/transactionssendBundle:https://mainnet.block-engine.jito.wtf/api/v1/bundles
Έγγραφα: sendTransaction και sendBundle
-
Το block engine εντοπίζει το πρόθεμα
jitodontfrontκαι επιβάλλει τους κανόνες ταξινόμησης.
Τι Συμβαίνει στο Block Engine
Όταν το block engine εντοπίζει μια συναλλαγή που περιέχει λογαριασμό jitodontfront:
- Μέσω
sendTransaction: η συναλλαγή προστατεύεται. Κανένα bundle δεν μπορεί να τοποθετήσει άλλη συναλλαγή πριν από αυτήν - Μέσω
sendBundle: η συναλλαγή πρέπει να εμφανίζεται στο index 0, διαφορετικά το bundle απορρίπτεται ολόκληρο
Οι συναλλαγές και τα bundles που δεν περιέχουν λογαριασμό jitodontfront δεν
επηρεάζονται.
Κανόνες Ταξινόμησης Bundle
Αυτοί οι κανόνες ισχύουν όταν μια συναλλαγή jitodontfront εμφανίζεται σε ένα bundle.
Επιτρεπόμενα Μοτίβα
[tx_with_dontfront, tip][tx_with_dontfront, arbitrage, tip][tx_with_dontfront_signer1, tx_with_dontfront_signer1_and_signer2, tip]
Πολλαπλές Συναλλαγές DontFront σε Ένα Bundle
Πολλαπλές συναλλαγές dontfront σε ένα μόνο bundle επιτρέπονται όταν πληρούνται και οι δύο προϋποθέσεις:
- Όλες οι συναλλαγές dontfront είναι συνεχόμενες στην αρχή του bundle
- Κάθε συναλλαγή dontfront μοιράζεται τουλάχιστον έναν υπογράφοντα με την πρώτη συναλλαγή dontfront
✅ [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)
Απορριπτόμενα Μοτίβα
❌ [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
Παραδείγματα Ενσωμάτωσης
Για μια γρήγορη συνταγή κώδικα, δείτε την καταχώρηση cookbook για Προστασία MEV.
TypeScript (@solana/kit)
Η βασική ιδέα είναι ένα βοηθητικό στοιχείο που προσαρτά τον λογαριασμό dontfront σε οποιαδήποτε εντολή:
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 }]};}
Στη συνέχεια, υποβάλλετε την υπογεγραμμένη συναλλαγή στο Jito block engine αντί για ένα τυπικό κόμβο RPC. Χρησιμοποιείτε πάντα κωδικοποίηση base64. Το Base58 είναι απαρχαιωμένο στο 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" }]})});
Βέλτιστες Πρακτικές
Το DontFront είναι ένα επίπεδο προστασίας. Μια ισχυρή στρατηγική μετριασμού MEV συνδυάζει πολλαπλές προσεγγίσεις:
Προστασία σε Επίπεδο Συναλλαγής
-
Ορίστε στενές ανοχές slippage. Η πιο αποτελεσματική άμυνα ενάντια στις επιθέσεις sandwich είναι ο περιορισμός του αποδεκτού slippage στις ανταλλαγές. Ένα μικρότερο παράθυρο slippage μειώνει το περιθώριο κέρδους που είναι διαθέσιμο στους επιτιθέμενους, καθιστώντας τη συναλλαγή σας λιγότερο ελκυστική για sandwich.
-
Ορίστε κατάλληλα tips και τέλη προτεραιότητας. Κατά τη διάρκεια συμφόρησης, υψηλότερα tips και τέλη προτεραιότητας αυξάνουν την πιθανότητα γρήγορης προσγείωσης της συναλλαγής/bundle σας, μειώνοντας το παράθυρο δράσης για τους searchers. Δείτε την τεκμηρίωση του Jito για Ποσά Tip για περισσότερες λεπτομέρειες σχετικά με τον τρόπο ορισμού κατάλληλων tips.
-
Βελτιστοποιήστε τη χρήση compute unit. Κάθε block έχει περιορισμένο αριθμό compute unit διαθέσιμων (και οι λογαριασμοί έχουν περιορισμένο αριθμό compute unit διαθέσιμων ανά block). Για να διασφαλίσετε ότι μεγιστοποιείται η πιθανότητα συμπερίληψης της συναλλαγής/bundle σας σε ένα block, πρέπει να βελτιστοποιήσετε τη χρήση compute unit. Δείτε τον οδηγό Πώς να Βελτιστοποιήσετε τη Χρήση Compute στο Solana για λεπτομέρειες.
Ειδικά για DontFront
-
Σημειώστε τον λογαριασμό dontfront ως μόνο-ανάγνωσης. Η σήμανση εγγραφής λειτουργεί αλλά η μόνο-ανάγνωσης βελτιστοποιεί την ταχύτητα προσγείωσης.
-
Χρησιμοποιήστε μοναδικό pubkey dontfront ανά εφαρμογή. Οποιοδήποτε pubkey που ξεκινά με
jitodontfrontλειτουργεί. Η χρήση μιας μοναδικής παραλλαγής (π.χ.,jitodontfront111111111111111111111111111123) σας επιτρέπει να διακρίνετε τη χρήση ανά εφαρμογή κατά την επιθεώρηση δεδομένων onchain. -
Το DontFront υποστηρίζει Address Lookup Tables. Ο λογαριασμός dontfront μπορεί να συμπεριληφθεί μέσω ALT. Μην χρησιμοποιείτε όμως ALT για λογαριασμούς tip.
Περιορισμοί
-
Μόνο block engine. Το DontFront επιβάλλεται από το Jito block engine. Οι συναλλαγές που υποβάλλονται απευθείας σε validators (παρακάμπτοντας το Jito) δεν προστατεύονται.
-
Δεν αποτελεί εγγύηση. Από την τεκμηρίωση του Jito: "Αυτό το χαρακτηριστικό μπορεί να βοηθήσει στη μείωση των επιθέσεων sandwich αλλά δεν εγγυάται κάτι τέτοιο και δεν αποτελεί λύση για όλες τις παραλλαγές στη σειρά των συναλλαγών, συμπεριλαμβανομένης οποιασδήποτε ταξινόμησης που πραγματοποιείται από τρίτους."
-
Μόνο Mainnet/Testnet. Αυτό είναι χαρακτηριστικό του Jito block engine. Δεν λειτουργεί στο devnet ή σε localhost.
Αναφορές
Is this page helpful?