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 = 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:
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:
burn_amount = transaction_fee * 50 / 100validator_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:
micro_lamport_fee = compute_unit_price * compute_unit_limitprioritization_fee = ceil(micro_lamport_fee / 1,000,000)
| Muuttuja | Kuvaus | Oletusarvo |
|---|---|---|
compute_unit_price | Mikrolamporttia per CU, asetetaan komennolla SetComputeUnitPrice | 0 mikrolamporttia |
compute_unit_limit | Maksimimäärä CU:ita, jonka transaktio voi kuluttaa, asetetaan komennolla SetComputeUnitLimit | Ohjekohtaisten oletusarvojen summa |
1,000,000 | Muuntokerroin 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.
| Tarjoaja | Priorisointimaksu-API |
|---|---|
| Helius | Dokumentaatio |
| QuickNode | Dokumentaatio |
| Triton | Dokumentaatio |
Transaktioiden ajoitusprioriteetti
Ajastin järjestää transaktiot käyttäen
calculate_priority_and_cost
-funktiota:
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.
| SDK | Lä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 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?