Samenvatting
Totale vergoeding = basisvergoeding (5.000 lamports/handtekening, 50% verbrand) + prioriteringsvergoeding (CU_prijs * CU_limiet / 1M lamports, 100% naar validator). In rekening gebracht ongeacht of de transactie slaagt of mislukt.
Algoritme voor vergoedingsberekening
De totale vergoeding voor een transactie wordt berekend door
calculate_fee_details:
total_fee = base_fee + prioritization_fee
De invoer bestaat uit het transactiebericht, de huidige lamports_per_signature
(momenteel 5.000) en de prioriteringsvergoeding afgeleid uit compute budget-instructies. De totale vergoeding wordt vóór de uitvoering van de fee payer afgetrokken. Als de transactie mislukt, wordt de vergoeding toch in rekening gebracht.
Basisvergoeding
De basisvergoeding dekt de kosten van Ed25519-handtekeningverificatie plus eventuele precompile-handtekeningverificaties. Elke handtekening in de transactie wordt in rekening gebracht, inclusief handtekeningen geverifieerd door de Ed25519-, Secp256k1- en Secp256r1-precompileprogramma's.
De functie
calculate_signature_fee
berekent:
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: het aantal Ed25519-handtekeningen op de transactie (doorgaans één per ondertekenaar).num_ed25519_signatures,num_secp256k1_signatures,num_secp256r1_signatures: handtekeningen geverifieerd door de bijbehorende precompileprogramma's.lamports_per_signature: momenteel 5.000 lamports.
Verdeling van vergoedingen
De basisvergoeding en de prioriteringsvergoeding worden op verschillende manieren verdeeld. De functie
calculate_reward_and_burn_fee_details
in de runtime berekent:
burn_amount = transaction_fee * 50 / 100validator_share = (transaction_fee - burn_amount) + priority_fee
- Basisvergoeding (transaction_fee): 50% wordt
verbrand
(verwijderd uit de circulerende voorraad) en 50% gaat naar de blokproducerende
validator. Het verbrandingspercentage is
DEFAULT_BURN_PERCENT = 50. - Prioriteringsvergoeding: 100% gaat naar de validator (niets wordt verbrand), conform SIMD-0096.
De totale beloning van de validator voor een transactie is:
validator_reward = (base_fee / 2) + prioritization_fee
Prioriteringsvergoeding
De prioriteringsvergoeding is een optionele vergoeding die de planningsprioriteit van een transactie verhoogt. Een compute unit (CU) is een rekeneenheid die de runtime meet tijdens transactie-uitvoering. Elke bewerking (rekenkunde, geheugentoegang, syscall) kost een vast aantal CU's. U kunt de prioriteringsvergoeding instellen door compute budget-instructies in uw transactie op te nemen. (Zie de handleiding Prioriteitsvergoedingen gebruiken voor meer informatie.)
Formule voor prioriteringsvergoeding
De functie
get_prioritization_fee
berekent:
micro_lamport_fee = compute_unit_price * compute_unit_limitprioritization_fee = ceil(micro_lamport_fee / 1,000,000)
| Variabele | Beschrijving | Standaard |
|---|---|---|
compute_unit_price | Micro-lamports per CU, ingesteld via SetComputeUnitPrice | 0 micro-lamports |
compute_unit_limit | Maximale CU's die de transactie mag verbruiken, ingesteld via SetComputeUnitLimit | Som van standaardwaarden per instructie |
1.000.000 | Conversiefactor van micro-lamports naar lamports (MICRO_LAMPORTS_PER_LAMPORT) | -- |
v1-transacties stellen de vergoeding rechtstreeks in
Deze prijs-maal-limiet-formule geldt voor legacy- en v0-transacties. In het v1-formaat is de prioriteringsvergoeding een absoluut totaal in lamports dat rechtstreeks in de berichtconfiguratie wordt ingesteld — geen prijs per CU, geen vermenigvuldiging, geen afronding.
Compute unit-limiet
De compute unit-limiet is het maximale aantal CU's dat een transactie mag verbruiken.
Als er geen
SetComputeUnitLimit-instructie
is opgenomen, wordt de standaardwaarde berekend op basis van het aantal en type instructies (200.000 CU's per niet-ingebouwde instructie, 3.000 per ingebouwde instructie). Zie
Compute Budget voor meer informatie over de standaardberekening.
De prioriteringsvergoeding is gebaseerd op de aangevraagde CU-limiet, niet op het werkelijke CU-gebruik. Het instellen van een hogere limiet dan nodig betekent betalen voor ongebruikte compute units.
Compute unit-prijs
De compute unit-prijs is een optioneel bedrag in micro-lamports dat wordt betaald voor elke aangevraagde CU. De CU-prijs bepaalt rechtstreeks de prioriteringsvergoeding. Om de CU-prijs in te stellen, neemt u een
SetComputeUnitPrice-instructie
op in uw transactie.
De standaard CU-prijs is 0, wat betekent dat de standaard prioriteringsvergoeding ook 0 is.
Voor realtime CU-prijsschattingen raadpleegt u de onderstaande aanbieders van prioriteitsvergoeding-API's.
| Aanbieder | Prioriteitsvergoeding-API |
|---|---|
| Helius | Documentatie |
| QuickNode | Documentatie |
| Triton | Documentatie |
Planningsprioriteit van transacties
De planner rangschikt transacties met behulp van de functie
calculate_priority_and_cost:
Priority = reward * 1,000,000 / (cost + 1)
- beloning: de vergoedingsinkomsten van de validator = prioriteringsvergoeding + niet-verbrand
deel van de basisvergoeding. Berekend door
calculate_reward_for_transaction. - kosten: de geschatte CU-kosten van de planner (handtekeningkosten + schrijfvergrendelingskosten + instruction data-kosten + programma-uitvoeringskosten + kosten voor geladen accountdatagrootte). Zie Compute Budget voor meer informatie.
- 1.000.000: een vermenigvuldiger om precisie te behouden, omdat de kosten in ruwe lamports vaak de beloning overschrijden.
- +1: voorkomt deling door nul.
De prioriteit bepaalt de volgorde waarin transacties uit de buffer van de planner worden verwijderd voor uitvoering.
Voorbeeld: De CU-limiet en CU-prijs instellen
De onderstaande voorbeelden laten zien hoe u de CU-limiet en CU-prijs op een transactie kunt instellen met behulp van Solana SDK's.
| SDK | Broncodewijzer |
|---|---|
@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?