Maksurakenteen rakenne

Yhteenveto

Kokonaismaksu = perusmaksu (5 000 lamportia/allekirjoitus, 50 % poltetaan) + prioriteettimaksu (CU_price * CU_limit / 1M lamportia, 100 % validatorille). Veloitetaan riippumatta siitä, onnistuuko transaktio vai epäonnistuuko.

Maksun laskenta-algoritmi

Transaktion kokonaismaksu lasketaan calculate_fee_details-funktiolla:

Total fee formula
total_fee = base_fee + prioritization_fee

Syötteinä ovat transaktioviesti, nykyinen lamports_per_signature (tällä hetkellä 5 000) ja laskentabudjetti-ohjeista johdettu prioriteettimaksu. Kokonaismaksu vähennetään maksajalta ennen suorituksen alkamista. Jos transaktio epäonnistuu, maksu veloitetaan silti.

Perusmaksu

Perusmaksu kattaa Ed25519-allekirjoituksen vahvistuksen kustannukset sekä mahdolliset precompile-allekirjoitusten vahvistukset. Jokainen transaktion allekirjoitus veloitetaan, mukaan lukien Ed25519-, Secp256k1- ja Secp256r1-precompile-ohjelmien vahvistamat allekirjoitukset.

calculate_signature_fee-funktio laskee:

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: Ed25519-allekirjoitusten määrä transaktiossa (tyypillisesti yksi per allekirjoittaja).
  • num_ed25519_signatures, num_secp256k1_signatures, num_secp256r1_signatures: vastaavien precompile-ohjelmien vahvistamat allekirjoitukset.
  • lamports_per_signature: tällä hetkellä 5 000 lamportia.

Maksujen jakautuminen

Perusmaksu ja prioriteettimaksu jakautuvat eri tavalla. calculate_reward_and_burn_fee_details-funktio runtimessa laskee:

Fee distribution
burn_amount = transaction_fee * 50 / 100
validator_share = (transaction_fee - burn_amount) + priority_fee
  • Perusmaksu (transaction_fee): 50 % poltetaan (poistetaan liikkeessä olevasta tarjonnasta) ja 50 % menee lohkon tuottavalle validatorille. Polttoprosentti on DEFAULT_BURN_PERCENT = 50.
  • Prioriteettimaksu: 100 % menee validatorille (mitään ei polteta), SIMD-0096:n mukaisesti.

Validaattorin kokonaispalkkio transaktiosta on:

validator_reward = (base_fee / 2) + prioritization_fee

Priorisointimaksu

Priorisointimaksu on valinnainen maksu, joka nostaa transaktion ajoitusprioriteettia. Laskentayksikkö (CU) on laskentayksikkö, jota ajonaikaympäristö mittaa transaktion suorituksen aikana. Jokainen operaatio (aritmetiikka, muistin käyttö, järjestelmäkutsu) maksaa kiinteän määrän CU:ita. Voit asettaa priorisointimaksun sisällyttämällä laskentabudjettiohjeita transaktioosi. (Katso lisätietoja How to Use Priority Fees -oppaasta.)

Priorisointimaksun kaava

Funktio get_prioritization_fee laskee:

Prioritization fee formula
micro_lamport_fee = compute_unit_price * compute_unit_limit
prioritization_fee = ceil(micro_lamport_fee / 1,000,000)
MuuttujaKuvausOletusarvo
compute_unit_priceMikrolamporttia per CU, asetetaan komennolla SetComputeUnitPrice0 mikrolamporttia
compute_unit_limitMaksimimäärä CU:ita, jonka transaktio voi kuluttaa, asetetaan komennolla SetComputeUnitLimitOhjekohtaisten oletusarvojen summa
1,000,000Muuntokerroin mikrolamporteista lamporteiksi (MICRO_LAMPORTS_PER_LAMPORT)--

Laskentayksikkörajoitus

Laskentayksikkörajoitus on maksimimäärä CU:ita, jonka transaktio voi kuluttaa. Jos SetComputeUnitLimit-ohjetta ei ole sisällytetty, oletusarvo lasketaan ohjeiden määrästä ja tyypistä (200 000 CU:ta per ei-sisäänrakennettu ohje, 3 000 per sisäänrakennettu). Katso lisätietoja oletusarvon laskennasta kohdasta Compute Budget.

Prioriteettimaksu perustuu pyydettyyn CU-rajoitukseen, ei todelliseen CU-käyttöön. Tarvittua korkeamman rajoituksen asettaminen tarkoittaa maksamista käyttämättömistä laskentayksiköistä.

Laskentayksikön hinta

Laskentayksikön hinta on valinnainen mikrolamporttien määrä, joka maksetaan jokaisesta pyydetystä CU:sta. CU-hinta määrittää suoraan priorisointimaksun. Asettaaksesi CU-hinnan, sisällytä SetComputeUnitPrice-ohje transaktioosi.

Oletusarvoinen CU-hinta on 0, mikä tarkoittaa, että myös oletuspriorisointimaksu on 0.

Reaaliaikaisia CU-hinta-arvioita varten katso alla olevat priorisointimaksu-API-tarjoajat.

Transaktioiden ajoitusprioriteetti

Ajastin järjestää transaktiot käyttäen calculate_priority_and_cost -funktiota:

Transaction priority formula
Priority = reward * 1,000,000 / (cost + 1)
  • reward: validatorin maksutulo = priorisointimaksu + perusmaksun polttamaton osuus. Lasketaan calculate_reward_for_transaction -funktiolla.
  • cost: ajastimen arvioitu CU-kustannus (allekirjoituskustannukset + kirjoituslukkokustannukset + instruction data -kustannukset + ohjelman suorituskustannukset + ladattujen tilien datakoon kustannus). Katso Compute Budget lisätietoja varten.
  • 1 000 000: kerroin tarkkuuden säilyttämiseksi, koska kustannus ylittää usein tuoton raa'issa lamporteissa.
  • +1: estää nollalla jakamisen.

Prioriteetti määrittää järjestyksen, jossa transaktiot poistetaan ajastimen puskurista suoritettavaksi.

Esimerkki: CU-rajan ja CU-hinnan asettaminen

Alla olevat esimerkit näyttävät, kuinka CU-raja ja CU-hinta asetetaan transaktioon käyttäen Solana SDK:ita.

SDKLähdekoodiviite
@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?

Sisällysluettelo

Muokkaa sivua

Hallinnoi

© 2026 Solana Foundation.
Kaikki oikeudet pidätetään.
Yhdistä