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.

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 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:

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.

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);
Console
Click to execute the code.

Is this page helpful?

Spis treści

Edytuj stronę