Opłaty transakcyjne
Każda transakcja w Solana wymaga podstawowej opłaty (SOL), która rekompensuje validatorom przetwarzanie transakcji. Możesz również uiścić opcjonalną opłatę priorytetową, aby zwiększyć szansę, że obecny lider (validator) przetworzy Twoją transakcję.
Kluczowe informacje
- Podstawowa opłata za transakcję wynosi 5000 lamportów za każdy podpis w transakcji.
- Opłata priorytetowa (opcjonalna) to dodatkowa opłata, którą płacisz validatorowi, aby zwiększyć szansę, że obecny lider przetworzy Twoją transakcję.
- Opłata priorytetowa jest równa: (limit jednostek obliczeniowych * cena jednostki obliczeniowej).
- Limit jednostek obliczeniowych to maksymalna liczba jednostek obliczeniowych, które może wykorzystać Twoja transakcja.
- Cena jednostki obliczeniowej to koszt jednej jednostki obliczeniowej, wyrażony w mikro-lamportach.
- 1 000 000 mikro-lamportów = 1 lamport
- Płatnik opłaty transakcyjnej musi być kontem należącym do System Program.
Podstawowa opłata transakcyjna
Podstawowa opłata to koszt wysłania transakcji. Wynosi ona 5000 lamportów za każdy podpis zawarty w transakcji.
Podstawowa opłata jest pobierana z konta płatnika opłaty transakcyjnej, które jest pierwszym podpisującym w transakcji. Płatnik opłaty musi być kontem należącym do System Program.
- 50% spalane: Połowa podstawowej opłaty jest spalana.
- 50% dystrybucji: Połowa jest wypłacana validatorowi, który przetworzył transakcję.
Opłata priorytetowa
Opłata priorytetowa to opcjonalna opłata, która zwiększa szansę, że obecny lider przetworzy Twoją transakcję.
- SIMD-0096: Validator przetwarzający transakcję otrzymuje 100% opłaty priorytetowej.
Jednostki obliczeniowe i limity
Podczas przetwarzania transakcji wykorzystywane są zasoby obliczeniowe mierzone w jednostkach obliczeniowych (CU). Każda instrukcja zmniejsza budżet jednostek obliczeniowych transakcji.
- Maksymalny limit: Transakcja może wykorzystać do 1,4 miliona jednostek obliczeniowych.
- Domyślny limit: Domyślnie każda instrukcja może wykorzystać do 200 000 jednostek obliczeniowych.
- Niestandardowy limit: Możesz zażądać określonego limitu jednostek
obliczeniowych, dodając
SetComputeUnitLimit
instrukcję do swojej transakcji.
Więcej szczegółów na temat wykorzystania jednostek obliczeniowych:
Zobacz przewodnik Jak zażądać optymalnych obliczeń aby uzyskać więcej szczegółów na temat wykorzystania jednostek obliczeniowych.
Cena jednostki obliczeniowej
Cena jednostki obliczeniowej to opcjonalna kwota, określona w mikro-lamportach, którą płacisz za każdą żądaną jednostkę obliczeniową. Cena ta jest używana do obliczenia opłaty priorytetowej dla Twojej transakcji.
Skorzystaj z tych zasobów, aby uzyskać rekomendacje w czasie rzeczywistym dotyczące aktualnej ceny jednostki obliczeniowej:
Dostawca | API opłat priorytetowych |
---|---|
Helius | Dokumentacja |
QuickNode | Dokumentacja |
Triton | Dokumentacja |
Zobacz przewodnik Jak korzystać z opłat priorytetowych aby uzyskać więcej szczegółów na temat opłat priorytetowych.
Obliczanie opłaty priorytetowej
Opłata priorytetowa jest obliczana jako:
Opłata priorytetowa = Limit jednostek obliczeniowych × Cena jednostki obliczeniowej
Zalecanym podejściem do ustalania opłat priorytetowych jest najpierw
zasymulowanie
transakcji w celu oszacowania wymaganych jednostek obliczeniowych. Następnie
dodaj 10% marginesu bezpieczeństwa do tego oszacowania i użyj uzyskanej wartości
jako Compute Unit Limit
.
Priorytet transakcji, który określa, jak jest ona priorytetyzowana względem innych transakcji, jest obliczany za pomocą następującego wzoru:
Priorytet = ((Limit jednostek obliczeniowych * Cena jednostki obliczeniowej) + Opłata bazowa) / (1 + Limit jednostek obliczeniowych + Podpisy CUs + Blokady zapisu CUs)
Skorzystaj z tych instrukcji, aby ustawić limit jednostek obliczeniowych i cenę dla transakcji:
SetComputeUnitLimit
aby ustawić konkretny limit jednostek.SetComputeUnitPrice
aby określić cenę za jednostkę obliczeniową.
Jeśli nie podasz tych instrukcji, transakcja użyje domyślnego limitu jednostek obliczeniowych z ceną jednostki obliczeniowej równą 0 (bez opłaty priorytetowej).
Opłata priorytetowa zależy od limitu jednostek obliczeniowych, który określisz dla transakcji, a nie od rzeczywiście 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.
Przykłady
Poniższe przykłady pokazują, jak ustawić limit jednostek obliczeniowych i cenę dla transakcji.
SDK | Odniesienie do kodu źródłowego |
---|---|
solana-sdk (Rust) | ComputeBudgetInstruction |
@solana/web3.js (Typescript) | ComputeBudgetProgram |
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?