Maksurakenne

Yhteenveto

Kokonaismaksu = perusmaksu (5 000 lamports/allekirjoitus, 50 % poltetaan) + priorisointimaksu (CU_price * CU_limit / 1M lamports, 100 % validatorille). Veloitetaan riippumatta siitä, onnistuuko tapahtuma vai ei.

Maksunlaskenta-algoritmi

Tapahtuman kokonaismaksu lasketaan funktiolla calculate_fee_details:

Total fee formula
total_fee = base_fee + prioritization_fee

Syötteinä ovat tapahtumaviesti, nykyinen lamports_per_signature (tällä hetkellä 5 000) ja compute budget -ohjeista johdettu priorisointimaksu. Kokonaismaksu vähennetään maksajalta ennen suorituksen alkamista. Jos tapahtuma epäonnistuu, maksu veloitetaan silti.

Perusmaksu

Perusmaksu kattaa Ed25519-allekirjoitusten varmentamisen sekä mahdolliset esikäännösohjelmakohtaiset allekirjoitusten varmentamiset. Kaikista tapahtuman allekirjoituksista veloitetaan maksu, mukaan lukien Ed25519-, Secp256k1- ja Secp256r1-esikäännösohjelmien varmentamat allekirjoitukset.

Funktio calculate_signature_fee laskee:

Base fee formula
signature_count = num_transaction_signatures
+ num_ed25519_signatures
+ num_secp256k1_signatures
+ num_secp256r1_signatures (if feature enabled)
base_fee = signature_count * lamports_per_signature
  • num_transaction_signatures: tapahtuman Ed25519-allekirjoitusten määrä (yleensä yksi allekirjoittajaa kohti).
  • num_ed25519_signatures, num_secp256k1_signatures, num_secp256r1_signatures: vastaavien esikäännösohjelmien varmentamat allekirjoitukset.
  • lamports_per_signature: tällä hetkellä 5 000 lamports.

Maksujen jakautuminen

Perusmaksu ja priorisointimaksu jakautuvat eri tavoin. Funktion calculate_reward_and_burn_fee_details laskelmat ajonaikaisessa ympäristössä:

Fee distribution
burn_amount = transaction_fee * 50 / 100
validator_share = (transaction_fee - burn_amount) + priority_fee
  • Perusmaksu (transaction_fee): 50 % poltetaan (poistetaan kierrosta) ja 50 % menee lohkon tuottavalle validatorille. Poltettava osuus on DEFAULT_BURN_PERCENT = 50.
  • Priorisointimaksu: 100 % menee validatorille (mitään ei polteta), SIMD-0096:n mukaisesti.

Validatorin kokonaispalkkio tapahtumasta on:

validator_reward = (base_fee / 2) + prioritization_fee

Priorisointimaksu

Priorisointimaksu on valinnainen maksu, joka nostaa tapahtuman ajoitusprioriteettia. Laskentayksikkö (CU) on laskentayksikkö, jota ajoympäristö mittaa tapahtuman suorituksen aikana. Jokainen operaatio (aritmetiikka, muistin käyttö, syscall) maksaa kiinteän määrän CU:ja. Voit asettaa priorisointimaksun sisällyttämällä compute budget -ohjeita tapahtumaasi. (Katso Prioriteettimaksujen käyttöopas lisätietoja varten.)

Priorisointimaksun kaava

Funktio get_prioritization_fee laskee:

Prioritization fee formula
micro_lamport_fee = compute_unit_price * compute_unit_limit
prioritization_fee = ceil(micro_lamport_fee / 1,000,000)
MuuttujaKuvausOletus
compute_unit_priceMikro-lamports per CU, asetetaan SetComputeUnitPrice-ohjeella0 mikro-lamports
compute_unit_limitCU:jen enimmäismäärä, jonka tapahtuma voi kuluttaa, asetetaan SetComputeUnitLimit-ohjeellaOhjauskohtaisten oletusarvojen summa
1 000 000Muunnoskerroin mikro-lamportsista lamportsiin (MICRO_LAMPORTS_PER_LAMPORT)--

v1-tapahtumat asettavat maksun suoraan

Tämä hinta kertaa raja -kaava koskee legacy- ja v0-tapahtumia. v1-formaatissa priorisointimaksu on absoluuttinen kokonaissumma lamportsina, joka asetetaan suoraan viestikonfiguraatiossa — ei CU-kohtaista hintaa, ei kertolaskua, ei pyöristystä.

Laskentayksiköiden raja

Laskentayksiköiden raja on CU:jen enimmäismäärä, jonka tapahtuma voi kuluttaa. Jos SetComputeUnitLimit-ohjetta ei sisällytetä, oletusarvo lasketaan ohjeiden määrän ja tyypin perusteella (200 000 CU:ta ei-sisäänrakennettua ohjetta kohti, 3 000 sisäänrakennettua kohti). Katso Compute Budget lisätietoja oletusarvon laskennasta.

Priorisointimaksu perustuu pyydettyyn CU-rajaan, ei todelliseen CU-kulutukseen. Korkeamman rajan asettaminen kuin tarvitaan tarkoittaa maksamista käyttämättömistä laskentayksiköistä.

Laskentayksikön hinta

Laskentayksikön hinta on valinnainen mikro-lamports-määrä, joka maksetaan jokaisesta pyydetystä CU:sta. CU-hinta määrää suoraan priorisointimaksun suuruuden. Aseta CU-hinta sisällyttämällä SetComputeUnitPrice-ohje tapahtumaasi.

CU-hinnan oletusarvo on 0, eli priorisointimaksun oletusarvo on myös 0.

Reaaliaikaisia CU-hinta-arvioita varten katso alla olevat prioriteettimaksujen API-palveluntarjoajat.

Tapahtumien ajoitusprioriteetti

Ajastin järjestää tapahtumat funktiolla calculate_priority_and_cost:

Transaction priority formula
Priority = reward * 1,000,000 / (cost + 1)
  • reward: validatorin maksutuotto = priorisointimaksu + perusmaksun polttamaton osuus. Lasketaan funktiolla calculate_reward_for_transaction.
  • cost: ajastimen arvioitu CU-kustannus (allekirjoituskustannukset + kirjoituslukituskustannukset + instruction data -kustannukset + ohjelman suorituskustannukset + ladattujen tilien datakokokustannus). Katso Compute Budget lisätietoja varten.
  • 1 000 000: tarkkuuden säilyttämiseksi käytetty kerroin, koska kustannus ylittää usein palkkion raakoina lamportsina.
  • +1: estää nollalla jakamisen.

Prioriteetti määrittää järjestyksen, jossa tapahtumat poistetaan ajastimen puskurista suoritettavaksi.

Esimerkki: CU-rajan ja CU-hinnan asettaminen

Alla olevat esimerkit näyttävät, miten CU-raja ja CU-hinta asetetaan tapahtumalle Solana SDK:iden avulla.

SDKLähdekoodiviite
@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 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?

Sisällysluettelo

Muokkaa sivua
© 2026 Solana Foundation. Kaikki oikeudet pidätetään.