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 tapahtuman ajoitusprioriteettiä. Laskentayksikkö (CU) on laskentaoperaation mittayksikkö, jota ajonaikainen ympäristö mittaa tapahtuman suorituksen aikana. Jokainen operaatio (aritmetiikka, muistinkäyttö, järjestelmäkutsu) maksaa kiinteän määrän laskentayksiköitä. Voit asettaa priorisointimaksun sisällyttämällä laskentabudjetin ohjeet tapahtumaasi. (Katso lisätietoja oppaasta Prioriteettimaksujen käyttö.)
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?