Vergoedingsstructuur

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 formula
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:

Base fee formula
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:

Fee distribution
burn_amount = transaction_fee * 50 / 100
validator_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:

Prioritization fee formula
micro_lamport_fee = compute_unit_price * compute_unit_limit
prioritization_fee = ceil(micro_lamport_fee / 1,000,000)
VariabeleBeschrijvingStandaard
compute_unit_priceMicro-lamports per CU, ingesteld via SetComputeUnitPrice0 micro-lamports
compute_unit_limitMaximale CU's die de transactie mag verbruiken, ingesteld via SetComputeUnitLimitSom van standaardwaarden per instructie
1.000.000Conversiefactor 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.

Planningsprioriteit van transacties

De planner rangschikt transacties met behulp van de functie calculate_priority_and_cost:

Transaction priority formula
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.

SDKBroncodewijzer
@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 instructions
const 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 transaction
const transaction = new Transaction()
.add(limitInstruction)
.add(priceInstruction)
.add(transferInstruction);
const signature = await sendAndConfirmTransaction(connection, transaction, [
sender
]);
console.log("Transaction Signature:", signature);
Console
Click to execute the code.

Is this page helpful?

Inhoudsopgave

Pagina Bewerken
© 2026 Solana Foundation. Alle rechten voorbehouden.