Yhteenveto
Kokonaismaksu = perusmaksu (5 000 lamports/allekirjoitus, 50 % poltetaan) + priorisointimaksu (CU_price * CU_limit / 1M lamports, 100 % validatorille). Veloitetaan riippumatta siitä, onnistuuko tapahtuma vai ei.
Maksunlaskenta-algoritmi
Tapahtuman kokonaismaksu lasketaan funktiolla
calculate_fee_details:
total_fee = base_fee + prioritization_fee
Syötteinä ovat tapahtumaviesti, nykyinen lamports_per_signature
(tällä hetkellä 5 000) ja compute budget -ohjeista johdettu priorisointimaksu. Kokonaismaksu
vähennetään maksajalta ennen suorituksen alkamista. Jos tapahtuma epäonnistuu, maksu
veloitetaan silti.
Perusmaksu
Perusmaksu kattaa Ed25519-allekirjoitusten varmentamisen sekä mahdolliset esikäännösohjelmakohtaiset allekirjoitusten varmentamiset. Kaikista tapahtuman allekirjoituksista veloitetaan maksu, mukaan lukien Ed25519-, Secp256k1- ja Secp256r1-esikäännösohjelmien varmentamat allekirjoitukset.
Funktio
calculate_signature_fee
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: tapahtuman Ed25519-allekirjoitusten määrä (yleensä yksi allekirjoittajaa kohti).num_ed25519_signatures,num_secp256k1_signatures,num_secp256r1_signatures: vastaavien esikäännösohjelmien varmentamat allekirjoitukset.lamports_per_signature: tällä hetkellä 5 000 lamports.
Maksujen jakautuminen
Perusmaksu ja priorisointimaksu jakautuvat eri tavoin. Funktion
calculate_reward_and_burn_fee_details
laskelmat ajonaikaisessa ympäristössä:
burn_amount = transaction_fee * 50 / 100validator_share = (transaction_fee - burn_amount) + priority_fee
- Perusmaksu (transaction_fee): 50 % poltetaan
(poistetaan kierrosta) ja 50 % menee lohkon tuottavalle validatorille. Poltettava osuus on
DEFAULT_BURN_PERCENT = 50. - Priorisointimaksu: 100 % menee validatorille (mitään ei polteta), SIMD-0096:n mukaisesti.
Validatorin kokonaispalkkio tapahtumasta on:
validator_reward = (base_fee / 2) + prioritization_fee
Priorisointimaksu
Priorisointimaksu on valinnainen maksu, joka nostaa tapahtuman ajoitusprioriteettia. Laskentayksikkö (CU) on laskentayksikkö, jota ajoympäristö mittaa tapahtuman suorituksen aikana. Jokainen operaatio (aritmetiikka, muistin käyttö, syscall) maksaa kiinteän määrän CU:ja. Voit asettaa priorisointimaksun sisällyttämällä compute budget -ohjeita tapahtumaasi. (Katso Prioriteettimaksujen käyttöopas lisätietoja varten.)
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 | Oletus |
|---|---|---|
compute_unit_price | Mikro-lamports per CU, asetetaan SetComputeUnitPrice-ohjeella | 0 mikro-lamports |
compute_unit_limit | CU:jen enimmäismäärä, jonka tapahtuma voi kuluttaa, asetetaan SetComputeUnitLimit-ohjeella | Ohjauskohtaisten oletusarvojen summa |
1 000 000 | Muunnoskerroin mikro-lamportsista lamportsiin (MICRO_LAMPORTS_PER_LAMPORT) | -- |
v1-tapahtumat asettavat maksun suoraan
Tämä hinta kertaa raja -kaava koskee legacy- ja v0-tapahtumia. v1-formaatissa priorisointimaksu on absoluuttinen kokonaissumma lamportsina, joka asetetaan suoraan viestikonfiguraatiossa — ei CU-kohtaista hintaa, ei kertolaskua, ei pyöristystä.
Laskentayksiköiden raja
Laskentayksiköiden raja on CU:jen enimmäismäärä, jonka tapahtuma voi kuluttaa.
Jos
SetComputeUnitLimit-ohjetta
ei sisällytetä, oletusarvo lasketaan ohjeiden määrän ja tyypin perusteella
(200 000 CU:ta ei-sisäänrakennettua ohjetta kohti, 3 000 sisäänrakennettua kohti). Katso
Compute Budget lisätietoja oletusarvon laskennasta.
Priorisointimaksu perustuu pyydettyyn CU-rajaan, ei todelliseen CU-kulutukseen. Korkeamman rajan asettaminen kuin tarvitaan tarkoittaa maksamista käyttämättömistä laskentayksiköistä.
Laskentayksikön hinta
Laskentayksikön hinta on valinnainen mikro-lamports-määrä, joka maksetaan jokaisesta
pyydetystä CU:sta. CU-hinta määrää suoraan priorisointimaksun suuruuden. Aseta CU-hinta
sisällyttämällä
SetComputeUnitPrice-ohje
tapahtumaasi.
CU-hinnan oletusarvo on 0, eli priorisointimaksun oletusarvo on myös 0.
Reaaliaikaisia CU-hinta-arvioita varten katso alla olevat prioriteettimaksujen API-palveluntarjoajat.
| Palveluntarjoaja | Prioriteettimaksun API |
|---|---|
| Helius | Dokumentaatio |
| QuickNode | Dokumentaatio |
| Triton | Dokumentaatio |
Tapahtumien ajoitusprioriteetti
Ajastin järjestää tapahtumat funktiolla
calculate_priority_and_cost:
Priority = reward * 1,000,000 / (cost + 1)
- reward: validatorin maksutuotto = priorisointimaksu + perusmaksun polttamaton osuus.
Lasketaan funktiolla
calculate_reward_for_transaction. - cost: ajastimen arvioitu CU-kustannus (allekirjoituskustannukset + kirjoituslukituskustannukset + instruction data -kustannukset + ohjelman suorituskustannukset + ladattujen tilien datakokokustannus). Katso Compute Budget lisätietoja varten.
- 1 000 000: tarkkuuden säilyttämiseksi käytetty kerroin, koska kustannus ylittää usein palkkion raakoina lamportsina.
- +1: estää nollalla jakamisen.
Prioriteetti määrittää järjestyksen, jossa tapahtumat poistetaan ajastimen puskurista suoritettavaksi.
Esimerkki: CU-rajan ja CU-hinnan asettaminen
Alla olevat esimerkit näyttävät, miten CU-raja ja CU-hinta asetetaan tapahtumalle Solana SDK:iden avulla.
| 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?