Ö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 = 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:
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:
burn_amount = transaction_fee * 50 / 100validator_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 = 50olarak 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:
micro_lamport_fee = compute_unit_price * compute_unit_limitprioritization_fee = ceil(micro_lamport_fee / 1,000,000)
| Değişken | Açıklama | Varsayılan |
|---|---|---|
compute_unit_price | CU başına mikro-lamport, SetComputeUnitPrice ile ayarlanır | 0 mikro-lamport |
compute_unit_limit | İşlemin tüketebileceği maksimum CU, SetComputeUnitLimit ile ayarlanır | Talimat başına varsayılanların toplamı |
1,000,000 | Mikro-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.
| Sağlayıcı | Öncelik ücreti API'si |
|---|---|
| Helius | Dokümantasyon |
| QuickNode | Dokümantasyon |
| Triton | Dokümantasyon |
İşlem zamanlama önceliği
Zamanlayıcı, işlemleri
calculate_priority_and_cost
fonksiyonunu kullanarak sıralar:
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_transactiontarafı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.
| SDK | Kaynak 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 instructionsconst 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 transactionconst transaction = new Transaction().add(limitInstruction).add(priceInstruction).add(transferInstruction);const signature = await sendAndConfirmTransaction(connection, transaction, [sender]);console.log("Transaction Signature:", signature);
Is this page helpful?