Jokainen Solana-transaktio vaatii transaktiomaksun, joka maksetaan SOL-tokeneina. Transaktiomaksut jakautuvat kahteen osaan: perusmaksuun ja priorisointimaksuun. Perusmaksu korvaa validaattoreille transaktion käsittelystä. Priorisointimaksu on valinnainen maksu, joka lisää todennäköisyyttä, että nykyinen johtaja käsittelee transaktiosi.
Perusmaksu
Jokainen transaktio maksaa 5000 lamportia sisällytettyä allekirjoitusta kohden. Tämän maksun maksaa transaktion ensimmäinen allekirjoittaja. Vain System Programin omistamien tilien on mahdollista maksaa transaktiomaksuja. Perusmaksu jakautuu seuraavasti:
- 50 % poltetaan: Puolet poltetaan (poistetaan liikkeessä olevasta SOL-tarjonnasta).
- 50 % jaetaan: Puolet maksetaan validaattorille, joka käsitteli transaktion.
Priorisointimaksu
Priorisointimaksu on valinnainen maksu, jota käytetään lisäämään todennäköisyyttä, että nykyinen johtaja (validaattori) käsittelee transaktiosi. Validaattori saa 100 % priorisointimaksusta. Priorisointimaksut voidaan asettaa säätämällä transaktion laskentayksikön (CU) hintaa ja CU-rajaa. (Katso lisätietoja priorisointimaksuista How to Use Priority Fees -oppaasta.)
Priorisointimaksu lasketaan seuraavasti:
Prioritization fee = CU limit * CU price
Priorisointimaksua käytetään määrittämään transaktiosi prioriteetti suhteessa muihin transaktioihin. Se lasketaan seuraavalla kaavalla:
Priority = (Prioritization fee + Base fee) / (1 + CU limit + Signature CUs + Write lock CUs)
Laskentayksikön raja
Oletusarvoisesti
jokaiselle ohjeelle allokoidaan
200 000 CU:ta
ja jokaiselle transaktiolle allokoidaan
1,4 miljoonaa CU:ta.
Voit muuttaa näitä oletusarvoja sisällyttämällä
SetComputeUnitLimit-ohjeen
transaktioosi.
Laskeaksesi sopivan CU-rajan transaktiolle suosittelemme seuraavia vaiheita:
- Arvioi tarvittavat CU-yksiköt simuloimalla transaktio
- Lisää 10 % turvamarginaali tähän arvioon
Prioriteettipalkkio määräytyy pyydetyn laskentayksikön rajan mukaan transaktiossa, ei käytettyjen laskentayksiköiden todellisen määrän mukaan. Jos asetat liian korkean laskentayksikön rajan tai käytät oletusmäärää, saatat maksaa käyttämättömistä laskentayksiköistä.
Laskentayksikön hinta
Laskentayksikön hinta on valinnainen
mikrolamporttien määrä, joka
maksetaan jokaisesta pyydetystä CU:sta. Voit ajatella CU-hintaa tipinä, joka
kannustaa validaattoria priorisoimaan transaktiosi. Asettaaksesi CU-hinnan,
liitä transaktioon
SetComputeUnitPrice-ohje.
Oletus CU-hinta on 0, mikä tarkoittaa, että myös oletuspriorisointipalkkio on 0.
Parhaan CU-hinnan määrittämiseksi transaktiollesi katso alla olevasta taulukosta reaaliaikainen CU-hintasuositus.
| Palveluntarjoaja | Prioriteettipalkkio-API |
|---|---|
| Helius | Dokumentaatio |
| QuickNode | Dokumentaatio |
| Triton | Dokumentaatio |
Esimerkki
Alla olevat esimerkit näyttävät, kuinka CU-raja ja CU-hinta asetetaan transaktiossa 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?