Transaktiomaksut
Jokaisesta Solana-transaktiosta veloitetaan transaktiomaksu, joka maksetaan SOL:lla. Transaktiomaksut jaetaan kahteen osaan: perusmaksuun ja priorisointimaksuun. Perusmaksu korvaa validaattoreille transaktion käsittelyn. Priorisointimaksu on valinnainen maksu, joka lisää mahdollisuutta, että nykyinen johtaja käsittelee transaktiosi.
Perusmaksu
Jokainen transaktio maksaa 5000 lamportia per sisällytetty allekirjoitus. Tämän maksun maksaa transaktion ensimmäinen allekirjoittaja. Vain System Program -ohjelman omistamat tilit voivat maksaa transaktiomaksuja. Perusmaksu jaetaan seuraavasti:
- 50% poltetaan: Puolet poltetaan (poistetaan liikkeellä olevasta SOL-tarjonnasta).
- 50% jaetaan: Puolet maksetaan validaattorille, joka käsitteli transaktion.
Priorisointimaksu
Priorisointimaksu on valinnainen maksu, jota käytetään lisäämään mahdollisuutta, että nykyinen johtaja (validaattori) käsittelee transaktiosi. Validaattori saa 100% priorisointimaksusta. Priorisointimaksuja voidaan asettaa säätämällä transaktion laskentayksikön (CU) hintaa ja CU-rajaa. (Katso lisätietoja priorisointimaksuista Priorisointimaksujen käyttöoppaasta).
Priorisointimaksu lasketaan seuraavasti:
Priorisointimaksu = Laskentayksikön hinta × Laskentayksikön raja
Priorisointimaksua käytetään määrittämään transaktiosi prioriteetti suhteessa muihin transaktioihin. Se lasketaan seuraavalla kaavalla:
Laskentayksikön raja = Priorisointimaksu ÷ Laskentayksikön hinta
Laskentayksikön raja
Oletusarvoisesti
jokaiselle ohjeelle on varattu
200 000 CU:ta
ja jokaiselle transaktiolle on varattu
1,4 miljoonaa CU:ta.
Voit muuttaa näitä oletusarvoja sisällyttämällä
ComputeBudgetInstruction::set_compute_unit_limit
-ohjeen transaktioosi.
Laskeaksesi sopivan laskentayksikön rajan transaktiolle, suosittelemme seuraavia vaiheita:
- Arvioi tarvittavien laskentayksiköiden määrä simuloimalla transaktio
- Lisää 10% turvamarginaali tähän arvioon
Priorisointimaksu määräytyy pyydetyn laskentayksikön rajan perusteella, ei todellisen käytettyjen laskentayksiköiden määrän mukaan. Jos asetat laskentayksikön rajan liian korkeaksi tai käytät oletusarvoa, saatat maksaa käyttämättömistä laskentayksiköistä.
Laskentayksikön hinta
Laskentayksikön hinta on valinnainen määrä mikro-lamporteja, joka maksetaan jokaisesta pyydetystä laskentayksiköstä. Voit ajatella laskentayksikön hintaa tippinä, joka kannustaa validatoria priorisoimaan transaktiosi. Asettaaksesi laskentayksikön hinnan, sisällytä ComputeBudgetInstruction::SetComputeUnitPrice ohje transaktioosi.
Laskentayksikön oletushinta on 0, mikä tarkoittaa että myös oletusarvoinen priorisointimaksu on 0.
Saadaksesi apua parhaan laskentayksikön hinnan määrittämiseen transaktiollesi, katso reaaliaikainen laskentayksikön hintasuositus alla olevasta taulukosta.
| Palveluntarjoaja | Priorisointimaksu API |
|---|---|
| Helius | Dokumentaatio |
| QuickNode | Dokumentaatio |
| Triton | Dokumentaatio |
Esimerkki
Alla olevat esimerkit näyttävät, miten laskentayksikön raja ja hinta asetetaan transaktiossa käyttäen Solana SDK:ta.
| SDK | Lähdekoodin viite |
|---|---|
| @solana/web3.js (Typescript) | ComputeBudgetProgram.setComputeUnitLimit |
| solana-sdk (Rust) | ComputeBudgetInstruction::set_compute_unit_limit |
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);
Console
Click to execute the code.
Is this page helpful?