Każda transakcja w sieci Solana wymaga uiszczenia opłaty transakcyjnej, płatnej w SOL. Opłaty transakcyjne dzielą się na dwie części: opłatę bazową oraz opłatę za priorytet. Opłata bazowa rekompensuje validatorom przetwarzanie transakcji. Opłata za priorytet jest opcjonalna i zwiększa szansę, że obecny lider przetworzy Twoją transakcję.
Opłata bazowa
Każda transakcja kosztuje 5000 lamportów za każdy dołączony podpis. Opłatę tę ponosi pierwszy podpisujący transakcję. Tylko konta należące do System Program mogą opłacać opłaty transakcyjne. Opłata bazowa jest dzielona w następujący sposób:
- 50% spalane: Połowa jest spalana (usuwana z obiegu SOL).
- 50% dystrybuowane: Połowa jest wypłacana validatorowi, który przetworzył transakcję.
Opłata za priorytet
Opłata za priorytet to opcjonalna opłata, która zwiększa szansę, że obecny lider (validator) przetworzy Twoją transakcję. Validator otrzymuje 100% opłaty priorytetowej. Opłaty za priorytet można ustawić, dostosowując cenę jednostki obliczeniowej (CU) oraz limit CU w transakcji. (Więcej informacji znajdziesz w przewodniku Jak korzystać z opłat priorytetowych.)
Opłata za priorytet jest obliczana w następujący sposób:
Prioritization fee = CU limit * CU price
Opłata za priorytet służy do określenia priorytetu Twojej transakcji względem innych transakcji. Jest obliczana według następującego wzoru:
Priority = (Prioritization fee + Base fee) / (1 + CU limit + Signature CUs + Write lock CUs)
Limit jednostek obliczeniowych
Domyślnie
(źródło),
każda instrukcja otrzymuje
200 000 CU,
a każda transakcja
1,4 miliona CU.
Możesz zmienić te wartości, dołączając instrukcję
SetComputeUnitLimit
do swojej transakcji.
Aby obliczyć odpowiedni limit CU dla swojej transakcji, zalecamy wykonanie następujących kroków:
- Oszacuj wymaganą liczbę jednostek CU, symulując transakcję
- Dodaj 10% marginesu bezpieczeństwa do tego oszacowania
Opłata priorytetowa jest ustalana na podstawie żądanego limitu jednostek obliczeniowych (compute unit) w transakcji, nie rzeczywistej liczby użytych jednostek. Jeśli ustawisz zbyt wysoki limit lub użyjesz domyślnej wartości, możesz zapłacić za niewykorzystane jednostki obliczeniowe.
Cena jednostki obliczeniowej
Cena jednostki obliczeniowej to opcjonalna kwota w
mikro-lamportach płacona za każdą
żądaną jednostkę CU. Możesz traktować cenę CU jako napiwek, który zachęca
validatora do nadania priorytetu Twojej transakcji. Aby ustawić cenę CU, dodaj
instrukcję
SetComputeUnitPrice
do swojej transakcji.
Domyślna cena CU to 0, co oznacza, że domyślna opłata za priorytet również wynosi 0.
Aby uzyskać pomoc w określeniu najlepszej ceny CU dla swojej transakcji, skorzystaj z rekomendacji ceny CU w czasie rzeczywistym podanej w tabeli poniżej.
| Dostawca | API opłaty priorytetowej |
|---|---|
| Helius | Dokumentacja |
| QuickNode | Dokumentacja |
| Triton | Dokumentacja |
Przykład
Poniższe przykłady pokazują, jak ustawić limit CU i cenę CU w transakcji przy użyciu SDK Solana.
| SDK | Odnośnik do kodu źródłowego |
|---|---|
@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?