Σύνοψη
Συνολικό τέλος = βασικό τέλος (5.000 lamports/υπογραφή, 50% καίγεται) + τέλος προτεραιοποίησης (CU_price * CU_limit / 1M lamports, 100% στον validator). Χρεώνεται είτε η συναλλαγή επιτύχει είτε αποτύχει.
Αλγόριθμος υπολογισμού τελών
Το συνολικό τέλος μιας συναλλαγής υπολογίζεται από τη
calculate_fee_details:
total_fee = base_fee + prioritization_fee
Τα δεδομένα εισόδου είναι το μήνυμα συναλλαγής, το τρέχον lamports_per_signature
(αυτή τη στιγμή 5.000) και το τέλος προτεραιοποίησης που προκύπτει από οδηγίες compute budget. Το συνολικό τέλος αφαιρείται από τον πληρωτή τελών πριν ξεκινήσει η εκτέλεση.
Αν η συναλλαγή αποτύχει, το τέλος εξακολουθεί να χρεώνεται.
Βασικό τέλος
Το βασικό τέλος καλύπτει το κόστος επαλήθευσης υπογραφής Ed25519 καθώς και τυχόν επαληθεύσεις υπογραφών precompile. Κάθε υπογραφή στη συναλλαγή χρεώνεται, συμπεριλαμβανομένων υπογραφών που επαληθεύονται από τα precompile προγράμματα Ed25519, Secp256k1 και Secp256r1.
Η συνάρτηση
calculate_signature_fee
υπολογίζει:
signature_count = num_transaction_signatures+ num_ed25519_signatures+ num_secp256k1_signatures+ num_secp256r1_signatures (if feature enabled)base_fee = signature_count * lamports_per_signature
num_transaction_signatures: ο αριθμός υπογραφών Ed25519 στη συναλλαγή (συνήθως μία ανά υπογράφοντα).num_ed25519_signatures,num_secp256k1_signatures,num_secp256r1_signatures: υπογραφές που επαληθεύονται από τα αντίστοιχα precompile προγράμματα.lamports_per_signature: αυτή τη στιγμή 5.000 lamports.
Διανομή τελών
Το βασικό τέλος και το τέλος προτεραιοποίησης διανέμονται με διαφορετικό τρόπο. Η συνάρτηση
calculate_reward_and_burn_fee_details
στο runtime υπολογίζει:
burn_amount = transaction_fee * 50 / 100validator_share = (transaction_fee - burn_amount) + priority_fee
- Βασικό τέλος (transaction_fee): το 50% καίγεται
(αφαιρείται από την κυκλοφορία) και το 50% πηγαίνει στον validator που παράγει το block. Το ποσοστό καύσης είναι
DEFAULT_BURN_PERCENT = 50. - Τέλος προτεραιοποίησης: το 100% πηγαίνει στον validator (δεν καίγεται τίποτα), σύμφωνα με το SIMD-0096.
Η συνολική αμοιβή του validator για μια συναλλαγή είναι:
validator_reward = (base_fee / 2) + prioritization_fee
Τέλος προτεραιοποίησης
Το τέλος προτεραιοποίησης είναι ένα προαιρετικό τέλος που αυξάνει την προτεραιότητα χρονοπρογραμματισμού μιας συναλλαγής. Μια μονάδα υπολογισμού (CU) είναι μονάδα υπολογιστικής εργασίας που μετρά το runtime κατά την εκτέλεση της συναλλαγής. Κάθε λειτουργία (αριθμητική, πρόσβαση στη μνήμη, syscall) κοστίζει έναν σταθερό αριθμό CU. Μπορείτε να ορίσετε το τέλος προτεραιοποίησης συμπεριλαμβάνοντας οδηγίες compute budget στη συναλλαγή σας. (Ανατρέξτε στον οδηγό Χρήσης Τελών Προτεραιοποίησης για λεπτομέρειες.)
Τύπος τέλους προτεραιοποίησης
Η συνάρτηση
get_prioritization_fee
υπολογίζει:
micro_lamport_fee = compute_unit_price * compute_unit_limitprioritization_fee = ceil(micro_lamport_fee / 1,000,000)
| Μεταβλητή | Περιγραφή | Προεπιλογή |
|---|---|---|
compute_unit_price | Micro-lamports ανά CU, ορίζεται μέσω SetComputeUnitPrice | 0 micro-lamports |
compute_unit_limit | Μέγιστα CU που μπορεί να καταναλώσει η συναλλαγή, ορίζεται μέσω SetComputeUnitLimit | Άθροισμα προεπιλογών ανά οδηγία |
1.000.000 | Συντελεστής μετατροπής από micro-lamports σε lamports (MICRO_LAMPORTS_PER_LAMPORT) | -- |
Οι συναλλαγές v1 ορίζουν το τέλος απευθείας
Αυτός ο τύπος τιμή-επί-όριο ισχύει για legacy και v0 συναλλαγές. Στη μορφή v1, το τέλος προτεραιοποίησης είναι ένα απόλυτο σύνολο σε lamports που ορίζεται απευθείας στη ρύθμιση μηνύματος — χωρίς τιμή ανά CU, χωρίς πολλαπλασιασμό, χωρίς στρογγυλοποίηση.
Όριο μονάδων υπολογισμού
Το όριο μονάδων υπολογισμού είναι ο μέγιστος αριθμός CU που μπορεί να καταναλώσει μια συναλλαγή.
Αν δεν συμπεριληφθεί οδηγία
SetComputeUnitLimit,
η προεπιλογή υπολογίζεται από τον αριθμό και τον τύπο των οδηγιών (200.000 CU ανά οδηγία που δεν είναι builtin, 3.000 ανά builtin). Δείτε
Compute Budget για λεπτομέρειες σχετικά με τον υπολογισμό της προεπιλογής.
Το τέλος προτεραιοποίησης βασίζεται στο ζητούμενο όριο CU, όχι στην πραγματική χρήση CU. Ο ορισμός υψηλότερου ορίου από το απαραίτητο σημαίνει πληρωμή για αχρησιμοποίητες μονάδες υπολογισμού.
Τιμή μονάδας υπολογισμού
Η τιμή μονάδας υπολογισμού είναι ένα προαιρετικό ποσό micro-lamports που καταβάλλεται για κάθε ζητούμενο CU. Η τιμή CU καθορίζει άμεσα το τέλος προτεραιοποίησης. Για να ορίσετε την τιμή CU, συμπεριλάβετε μια οδηγία
SetComputeUnitPrice
στη συναλλαγή σας.
Η προεπιλεγμένη τιμή CU είναι 0, που σημαίνει ότι το προεπιλεγμένο τέλος προτεραιοποίησης είναι επίσης 0.
Για εκτιμήσεις τιμής CU σε πραγματικό χρόνο, δείτε τους παρόχους API τελών προτεραιοποίησης παρακάτω.
| Πάροχος | API Τελών Προτεραιοποίησης |
|---|---|
| Helius | Τεκμηρίωση |
| QuickNode | Τεκμηρίωση |
| Triton | Τεκμηρίωση |
Προτεραιότητα χρονοπρογραμματισμού συναλλαγών
Ο χρονοπρογραμματιστής κατατάσσει τις συναλλαγές χρησιμοποιώντας τη συνάρτηση
calculate_priority_and_cost:
Priority = reward * 1,000,000 / (cost + 1)
- reward: το εισόδημα τελών του validator = τέλος προτεραιοποίησης + μέρος του βασικού τέλους που δεν καίγεται. Υπολογίζεται από τη
calculate_reward_for_transaction. - cost: το εκτιμώμενο κόστος CU του χρονοπρογραμματιστή (κόστη υπογραφών + κόστη κλειδώματος εγγραφής + κόστη instruction data + κόστη εκτέλεσης προγράμματος + κόστος μεγέθους δεδομένων φορτωμένων λογαριασμών). Δείτε Compute Budget για λεπτομέρειες.
- 1.000.000: ένας πολλαπλασιαστής για τη διατήρηση της ακρίβειας, καθώς το κόστος συχνά υπερβαίνει την αμοιβή σε ακατέργαστα lamports.
- +1: αποτρέπει τη διαίρεση με το μηδέν.
Η προτεραιότητα καθορίζει τη σειρά με την οποία οι συναλλαγές αποθηκεύονται από την ουρά του χρονοπρογραμματιστή για εκτέλεση.
Παράδειγμα: Ορισμός ορίου CU και τιμής CU
Τα παρακάτω παραδείγματα δείχνουν πώς να ορίσετε το όριο CU και την τιμή CU σε μια συναλλαγή χρησιμοποιώντας Solana SDKs.
| SDK | Αναφορά Πηγαίου Κώδικα |
|---|---|
@solana/web3.js (Typescript) | ComputeBudgetProgram |
solana-sdk (Rust) | ComputeBudgetInstruction |
const limitInstruction = ComputeBudgetProgram.setComputeUnitLimit({units: 300_000});const priceInstruction = ComputeBudgetProgram.setComputeUnitPrice({microLamports: 1});
import {LAMPORTS_PER_SOL,SystemProgram,Transaction,Keypair,Connection,ComputeBudgetProgram,sendAndConfirmTransaction} from "@solana/web3.js";const connection = new Connection("http://localhost:8899", "confirmed");const sender = Keypair.generate();const recipient = new Keypair();const airdropSignature = await connection.requestAirdrop(sender.publicKey,LAMPORTS_PER_SOL);await connection.confirmTransaction(airdropSignature, "confirmed");// Create compute budget instructionsconst limitInstruction = ComputeBudgetProgram.setComputeUnitLimit({units: 300_000});const priceInstruction = ComputeBudgetProgram.setComputeUnitPrice({microLamports: 1});const transferInstruction = SystemProgram.transfer({fromPubkey: sender.publicKey,toPubkey: recipient.publicKey,lamports: 0.01 * LAMPORTS_PER_SOL});// Add the compute budget and transfer instructions to a new transactionconst transaction = new Transaction().add(limitInstruction).add(priceInstruction).add(transferInstruction);const signature = await sendAndConfirmTransaction(connection, transaction, [sender]);console.log("Transaction Signature:", signature);
Is this page helpful?