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.

1 000 000 mikro-lamportów = 1 lamport

Skorzystaj z tych zasobów, aby uzyskać rekomendacje w czasie rzeczywistym dotyczące aktualnej ceny jednostki obliczeniowej:

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:

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.

SDKOdniesienie 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 instructions
const 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 transaction
const transaction = new Transaction()
.add(limitInstruction)
.add(priceInstruction)
.add(transferInstruction);
const signature = await sendAndConfirmTransaction(connection, transaction, [
sender
]);
console.log("Transaction Signature:", signature);
Click to execute the code.

Is this page helpful?

Spis treści

Edytuj stronę