Ücret yapısı

Özet

Toplam ücret = temel ücret (5.000 lamport/imza, %50 yakılır) + öncelik ücreti (CU_fiyatı * CU_limiti / 1M lamport, %100 validator'a). İşlem başarılı veya başarısız olsa da ücretlendirilir.

Ücret hesaplama algoritması

Bir işlem için toplam ücret, calculate_fee_details tarafından hesaplanır:

Total fee formula
total_fee = base_fee + prioritization_fee

Girdiler; işlem mesajı, mevcut lamports_per_signature (şu anda 5.000) ve hesaplama bütçesi talimatlarından türetilen önceliklendirme ücretidir. Toplam ücret, yürütme başlamadan önce ücret ödeyicisinden düşülür. İşlem başarısız olursa, ücret yine de tahsil edilir.

Temel ücret

Temel ücret, Ed25519 imza doğrulamasının maliyetini ve herhangi bir ön derleme imza doğrulamasını kapsar. İşlemdeki her imza ücretlendirilir; buna Ed25519, Secp256k1 ve Secp256r1 ön derleme programları tarafından doğrulanan imzalar da dahildir.

calculate_signature_fee fonksiyonu şunu hesaplar:

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: işlemdeki Ed25519 imzalarının sayısı (genellikle imzalayan başına bir).
  • num_ed25519_signatures, num_secp256k1_signatures, num_secp256r1_signatures: ilgili ön derleme programları tarafından doğrulanan imzalar.
  • lamports_per_signature: şu anda 5.000 lamport.

Ücret dağılımı

Temel ücret ve önceliklendirme ücreti farklı şekilde dağıtılır. calculate_reward_and_burn_fee_details fonksiyonu runtime'da şunu hesaplar:

Fee distribution
burn_amount = transaction_fee * 50 / 100
validator_share = (transaction_fee - burn_amount) + priority_fee
  • Temel ücret (transaction_fee): %50'si yakılır (dolaşımdaki arzdan çıkarılır) ve %50'si blok üreten validator'a gider. Yakma yüzdesi DEFAULT_BURN_PERCENT = 50 olarak belirlenmiştir.
  • Önceliklendirme ücreti: %100'ü validator'a gider (hiçbiri yakılmaz), SIMD-0096 uyarınca.

Validator'ın bir işlem için toplam ödülü:

validator_reward = (base_fee / 2) + prioritization_fee

Önceliklendirme ücreti

Önceliklendirme ücreti, bir işlemin zamanlama önceliğini artıran isteğe bağlı bir ücrettir. Hesaplama birimi (CU), çalışma zamanının işlem yürütme sırasında ölçtüğü bir hesaplama birimidir. Her işlem (aritmetik, bellek erişimi, syscall) sabit sayıda CU'ya mal olur. İşleminize hesaplama bütçesi talimatları ekleyerek önceliklendirme ücretini belirleyebilirsiniz. (Ayrıntılar için Öncelik Ücretleri Nasıl Kullanılır kılavuzuna bakın.)

Önceliklendirme ücreti formülü

get_prioritization_fee fonksiyonu şunu hesaplar:

Prioritization fee formula
micro_lamport_fee = compute_unit_price * compute_unit_limit
prioritization_fee = ceil(micro_lamport_fee / 1,000,000)
DeğişkenAçıklamaVarsayılan
compute_unit_priceCU başına mikro-lamport, SetComputeUnitPrice ile ayarlanır0 mikro-lamport
compute_unit_limitİşlemin tüketebileceği maksimum CU, SetComputeUnitLimit ile ayarlanırTalimat başına varsayılanların toplamı
1,000,000Mikro-lamport'tan lamport'a dönüşüm faktörü (MICRO_LAMPORTS_PER_LAMPORT)--

Hesaplama birimi limiti

Hesaplama birimi limiti, bir işlemin tüketebileceği maksimum CU sayısıdır. Eğer SetComputeUnitLimit talimatı dahil edilmemişse, varsayılan değer talimatların sayısı ve türünden hesaplanır (yerleşik olmayan talimat başına 200.000 CU, yerleşik için 3.000). Varsayılan hesaplama hakkında ayrıntılar için Hesaplama Bütçesi bölümüne bakın.

Öncelik ücreti, gerçek CU kullanımına değil, talep edilen CU limitine göre belirlenir. Gerekenden daha yüksek bir limit belirlemek, kullanılmayan hesaplama birimleri için ödeme yapmak anlamına gelir.

Hesaplama birimi fiyatı

Hesaplama birimi fiyatı, talep edilen her CU için ödenen isteğe bağlı bir mikro-lamport miktarıdır. CU fiyatı, önceliklendirme ücretini doğrudan belirler. CU fiyatını ayarlamak için işleminize bir SetComputeUnitPrice talimatı ekleyin.

Varsayılan CU fiyatı 0'dır, yani varsayılan önceliklendirme ücreti de 0'dır.

Gerçek zamanlı CU fiyat tahminleri için aşağıdaki öncelik ücreti API sağlayıcılarına bakın.

İşlem zamanlama önceliği

Zamanlayıcı, işlemleri calculate_priority_and_cost fonksiyonunu kullanarak sıralar:

Transaction priority formula
Priority = reward * 1,000,000 / (cost + 1)
  • reward: doğrulayıcının ücret geliri = önceliklendirme ücreti + temel ücretin yakılmayan kısmı. calculate_reward_for_transaction tarafından hesaplanır.
  • cost: zamanlayıcının tahmini CU maliyeti (imza maliyetleri + yazma kilidi maliyetleri + instruction data maliyetleri + program yürütme maliyetleri + yüklenen hesap veri boyutu maliyeti). Ayrıntılar için Compute Budget bölümüne bakın.
  • 1,000,000: hassasiyeti korumak için bir çarpan, çünkü maliyet genellikle ham lamport cinsinden ödülü aşar.
  • +1: sıfıra bölmeyi önler.

Öncelik, işlemlerin zamanlayıcının tamponundan yürütme için sıradan çıkarılma sırasını belirler.

Örnek: CU limitini ve CU fiyatını ayarlama

Aşağıdaki örnekler, Solana SDK'larını kullanarak bir işlemde CU limitinin ve CU fiyatının nasıl ayarlanacağını gösterir.

SDKKaynak kod referansı
@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?

İçindekiler

Sayfayı Düzenle

Yönetici

© 2026 Solana Vakfı.
Tüm hakları saklıdır.
Bağlanın