Opłaty transakcyjne
Każda transakcja w sieci Solana wymaga opłaty transakcyjnej, płatnej w SOL. Opłaty transakcyjne są podzielone na dwie części: opłatę podstawową i opłatę priorytetową. Opłata podstawowa rekompensuje validatorom przetwarzanie transakcji. Opłata priorytetowa jest opcjonalna i zwiększa szansę, że obecny lider przetworzy Twoją transakcję.
Opłata podstawowa
Każda transakcja kosztuje 5000 lamportów za każdy dołączony podpis. Opłatę tę ponosi pierwszy sygnatariusz transakcji. Tylko konta należące do System Program mogą pokrywać opłaty transakcyjne. Podstawowa opłata dzieli się 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 priorytetowa
Opłata priorytetowa jest opcjonalną opłatą, która zwiększa szansę, że obecny lider (validator) przetworzy Twoją transakcję. Validator otrzymuje 100% opłaty priorytetowej. Opłaty priorytetowe można ustawić, dostosowując cenę jednostki obliczeniowej computation unit (CU) oraz limit CU. (Zobacz przewodnik dotyczący korzystania z opłat priorytetowych po więcej szczegółów na temat opłat priorytetowych.)
Opłata priorytetowa jest obliczana w następujący sposób:
Prioritization fee formula
Prioritization fee = CU limit * CU price
Opłata priorytetowa jest używana do określenia priorytetu transakcji względem innych transakcji. Jest obliczana za pomocą następującego wzoru:
Transaction priority formula
Priority = (Prioritization fee + Base fee) / (1 + CU limit + Signature CUs + Write lock CUs)
Limit jednostek obliczeniowych
Domyślnie
default,
każda instrukcja ma przydzielone
200 000 CU,
a każda transakcja ma przydzielone
1,4 miliona CU.
Możesz zmienić te wartości domyślne, dołączając instrukcję
SetComputeUnitLimit
do swojej transakcji.
Aby obliczyć odpowiedni limit jednostek obliczeniowych (CU) dla swojej transakcji, zalecamy wykonanie następujących kroków:
- Oszacuj wymagane jednostki CU poprzez symulację transakcji
- Dodaj 10% marginesu bezpieczeństwa do tego oszacowania
Opłata priorytetowa jest określana na podstawie żądanego limitu jednostek obliczeniowych transakcji, a nie rzeczywistej liczby użytych jednostek obliczeniowych. Jeśli ustawisz zbyt wysoki limit jednostek obliczeniowych 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ę jednostki CU jako napiwek, który
zachęca validatora do priorytetyzacji Twojej transakcji. Aby ustawić cenę
jednostki CU, dołącz instrukcję
SetComputeUnitPrice
do swojej transakcji.
Domyślna cena jednostki CU wynosi 0, co oznacza, że domyślna opłata priorytetowa również wynosi 0.
Aby uzyskać pomoc w określeniu najlepszej ceny jednostki CU dla swojej transakcji, zapoznaj się z rekomendacją ceny jednostki CU w czasie rzeczywistym podaną 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 jednostek CU i cenę jednostki CU w transakcji za pomocą SDK Solana.
| SDK | Odniesienie 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);
Console
Click to execute the code.
Is this page helpful?