Maksurakenteen rakenne

Yhteenveto

Kokonaismaksu = perusmaksu (5 000 lamportia/allekirjoitus, 50 % poltetaan) + prioriteettimaksu (CU_price * CU_limit / 1M lamportia, 100 % validatorille). Veloitetaan riippumatta siitä, onnistuuko transaktio vai epäonnistuuko.

Maksun laskenta-algoritmi

Transaktion kokonaismaksu lasketaan calculate_fee_details-funktiolla:

Total fee formula
total_fee = base_fee + prioritization_fee

Syötteinä ovat transaktioviesti, nykyinen lamports_per_signature (tällä hetkellä 5 000) ja laskentabudjetti-ohjeista johdettu prioriteettimaksu. Kokonaismaksu vähennetään maksajalta ennen suorituksen alkamista. Jos transaktio epäonnistuu, maksu veloitetaan silti.

Perusmaksu

Perusmaksu kattaa Ed25519-allekirjoituksen vahvistuksen kustannukset sekä mahdolliset precompile-allekirjoitusten vahvistukset. Jokainen transaktion allekirjoitus veloitetaan, mukaan lukien Ed25519-, Secp256k1- ja Secp256r1-precompile-ohjelmien vahvistamat allekirjoitukset.

calculate_signature_fee-funktio 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: Ed25519-allekirjoitusten määrä transaktiossa (tyypillisesti yksi per allekirjoittaja).
  • num_ed25519_signatures, num_secp256k1_signatures, num_secp256r1_signatures: vastaavien precompile-ohjelmien vahvistamat allekirjoitukset.
  • lamports_per_signature: tällä hetkellä 5 000 lamportia.

Maksujen jakautuminen

Perusmaksu ja prioriteettimaksu jakautuvat eri tavalla. calculate_reward_and_burn_fee_details-funktio runtimessa laskee:

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

Validaattorin kokonaispalkkio transaktiosta on:

validator_reward = (base_fee / 2) + prioritization_fee

Priorisointimaksu

Priorisointimaksu on valinnainen maksu, joka nostaa tapahtuman ajoitusprioriteettiä. Laskentayksikkö (CU) on laskentaoperaation mittayksikkö, jota ajonaikainen ympäristö mittaa tapahtuman suorituksen aikana. Jokainen operaatio (aritmetiikka, muistinkäyttö, järjestelmäkutsu) maksaa kiinteän määrän laskentayksiköitä. Voit asettaa priorisointimaksun sisällyttämällä laskentabudjetin ohjeet tapahtumaasi. (Katso lisätietoja oppaasta Prioriteettimaksujen käyttö.)

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)
MuuttujaKuvausOletusarvo
compute_unit_priceMikrolamporttia per CU, asetetaan komennolla SetComputeUnitPrice0 mikrolamporttia
compute_unit_limitMaksimimäärä CU:ita, jonka transaktio voi kuluttaa, asetetaan komennolla SetComputeUnitLimitOhjekohtaisten oletusarvojen summa
1,000,000Muuntokerroin mikrolamporteista lamporteiksi (MICRO_LAMPORTS_PER_LAMPORT)--

Laskentayksikkörajoitus

Laskentayksikkörajoitus on maksimimäärä CU:ita, jonka transaktio voi kuluttaa. Jos SetComputeUnitLimit-ohjetta ei ole sisällytetty, oletusarvo lasketaan ohjeiden määrästä ja tyypistä (200 000 CU:ta per ei-sisäänrakennettu ohje, 3 000 per sisäänrakennettu). Katso lisätietoja oletusarvon laskennasta kohdasta Compute Budget.

Prioriteettimaksu perustuu pyydettyyn CU-rajoitukseen, ei todelliseen CU-käyttöön. Tarvittua korkeamman rajoituksen asettaminen tarkoittaa maksamista käyttämättömistä laskentayksiköistä.

Laskentayksikön hinta

Laskentayksikön hinta on valinnainen mikrolamporttien määrä, joka maksetaan jokaisesta pyydetystä CU:sta. CU-hinta määrittää suoraan priorisointimaksun. Asettaaksesi CU-hinnan, sisällytä SetComputeUnitPrice-ohje transaktioosi.

Oletusarvoinen CU-hinta on 0, mikä tarkoittaa, että myös oletuspriorisointimaksu on 0.

Reaaliaikaisia CU-hinta-arvioita varten katso alla olevat priorisointimaksu-API-tarjoajat.

Transaktioiden ajoitusprioriteetti

Ajastin järjestää transaktiot käyttäen calculate_priority_and_cost -funktiota:

Transaction priority formula
Priority = reward * 1,000,000 / (cost + 1)
  • reward: validatorin maksutulo = priorisointimaksu + perusmaksun polttamaton osuus. Lasketaan calculate_reward_for_transaction -funktiolla.
  • cost: ajastimen arvioitu CU-kustannus (allekirjoituskustannukset + kirjoituslukkokustannukset + instruction data -kustannukset + ohjelman suorituskustannukset + ladattujen tilien datakoon kustannus). Katso Compute Budget lisätietoja varten.
  • 1 000 000: kerroin tarkkuuden säilyttämiseksi, koska kustannus ylittää usein tuoton raa'issa lamporteissa.
  • +1: estää nollalla jakamisen.

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

Esimerkki: CU-rajan ja CU-hinnan asettaminen

Alla olevat esimerkit näyttävät, kuinka CU-raja ja CU-hinta asetetaan transaktioon käyttäen Solana SDK:ita.

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.