Περίληψη
Συνολικό τέλος = βασικό τέλος (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) και το τέλος προτεραιότητας που προκύπτει από τις οδηγίες
προϋπολογισμού υπολογισμού. Το συνολικό τέλος αφαιρείται από τον πληρωτή τελών
πριν ξεκινήσει η εκτέλεση. Αν η συναλλαγή αποτύχει, το τέλος εξακολουθεί να
χρεώνεται.
Βασικό τέλος
Το βασικό τέλος καλύπτει το κόστος επαλήθευσης υπογραφής 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 στη συναλλαγή σας. (Δείτε τον οδηγό How to Use Priority Fees για λεπτομέρειες.)
Τύπος τέλους προτεραιότητας
Η συνάρτηση
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) | -- |
Όριο μονάδων υπολογισμού
Το όριο μονάδων υπολογισμού είναι ο μέγιστος αριθμός 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 του προγραμματιστή (κόστη υπογραφών + κόστη κλειδωμάτων εγγραφής + κόστη δεδομένων εντολών + κόστη εκτέλεσης προγράμματος + κόστος μεγέθους δεδομένων φορτωμένων λογαριασμών). Δείτε Compute Budget για λεπτομέρειες.
- 1.000.000: πολλαπλασιαστής για διατήρηση ακρίβειας, καθώς το κόστος συχνά υπερβαίνει την ανταμοιβή σε ακατέργαστα lamports.
- +1: αποτρέπει τη διαίρεση με το μηδέν.
Η προτεραιότητα καθορίζει τη σειρά με την οποία οι συναλλαγές αφαιρούνται από τη μνήμη buffer του προγραμματιστή για εκτέλεση.
Παράδειγμα: ορισμός του ορίου 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?