Opłaty transakcyjne
Każda transakcja w sieci Solana wymaga podstawowej opłaty (SOL) jako wynagrodzenia dla walidatorów za przetwarzanie transakcji. Możesz również uiścić opcjonalną opłatę priorytetową, aby zwiększyć szansę, że obecny lider (walidator) 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 walidatorowi, aby zwiększyć szansę, że obecny lider przetworzy Twoją transakcję.
- Opłata priorytetowa jest obliczana jako: (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 zarządzanym przez 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órym jest pierwszy sygnatariusz transakcji. Płatnik opłaty musi być kontem zarządzanym przez System Program.
- 50% Spalane: Połowa podstawowej opłaty jest spalana.
- 50% Dystrybucja: Połowa jest wypłacana walidatorowi, który przetworzył transakcję.
Opłata priorytetowa
Opłata priorytetowa to opcjonalna opłata, którą można uiścić, aby zwiększyć szansę, że obecny lider przetworzy Twoją transakcję.
- SIMD-0096: Walidator 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ń po 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 po więcej szczegółów na temat opłat priorytetowych.
Obliczanie opłaty priorytetowej
Opłata priorytetowa jest obliczana w następujący sposób:
Opłata priorytetowa = Limit jednostek obliczeniowych × Cena jednostki obliczeniowej
Zalecanym podejściem do ustalania opłat priorytetowych jest najpierw
zasymulowanie
transakcji w celu oszacowania wymaganej liczby jednostek obliczeniowych.
Następnie należy dodać 10% marginesu bezpieczeństwa do tego oszacowania i użyć
wynikowej wartości jako Compute Unit Limit
.
Priorytet transakcji, który określa, jak jest ona priorytetyzowana w stosunku do 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 zdefiniować 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 ustawisz dla transakcji, a nie od 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.
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?