Özet
Toplam ücret = temel ücret (5.000 lamports/imza, %50'si yakılır) + öncelik ücreti (CU_price * CU_limit / 1M lamports, %100'ü validator'a). İşlem başarılı olsun ya da başarısız olsun ücret tahsil edilir.
Ücret hesaplama algoritması
Bir işlemin toplam ücreti
calculate_fee_details
tarafından hesaplanır:
total_fee = base_fee + prioritization_fee
Girdiler; işlem mesajı, mevcut lamports_per_signature (şu an 5.000) ve hesaplama bütçesi talimatlarından türetilen önceliklendirme ücretidir. Toplam ücret, yürütme başlamadan önce ücret ödeyenden düşülür. İşlem başarısız olsa dahi ücret tahsil edilir.
Temel ücret
Temel ücret, Ed25519 imza doğrulamasının ve ön derleme imza doğrulamalarının maliyetini karşılar. Ed25519, Secp256k1 ve Secp256r1 ön derleme programları tarafından doğrulananlar dahil olmak üzere işlemdeki her imza için ücret alınır.
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 adet).num_ed25519_signatures,num_secp256k1_signatures,num_secp256r1_signatures: ilgili ön derleme programları tarafından doğrulanan imzalar.lamports_per_signature: şu an 5.000 lamports.
Ücret dağılımı
Temel ücret ve önceliklendirme ücreti farklı şekillerde dağıtılır.
Çalışma zamanındaki
calculate_reward_and_burn_fee_details
fonksiyonu ş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 bloğu üreten
validator'a gider. Yakma yüzdesi
DEFAULT_BURN_PERCENT = 50'dir. - Önceliklendirme ücreti: SIMD-0096 uyarınca %100'ü validator'a gider (hiçbiri yakılmaz).
Bir işlem için validator'ın toplam ödülü şudur:
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, sistem çağrısı) sabit sayıda CU tüketir. İşleminize hesaplama bütçesi talimatları ekleyerek önceliklendirme ücretini ayarlayabilirsiniz. (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 | SetComputeUnitPrice aracılığıyla ayarlanan, CU başına mikro-lamports | 0 mikro-lamports |
compute_unit_limit | SetComputeUnitLimit aracılığıyla ayarlanan, işlemin tüketebileceği maksimum CU sayısı | Talimat başına varsayılanların toplamı |
1.000.000 | Mikro-lamports'tan lamports'a dönüşüm katsayısı (MICRO_LAMPORTS_PER_LAMPORT) | -- |
v1 işlemleri ücreti doğrudan ayarlar
Bu fiyat çarpı limit formülü, eski ve v0 işlemleri için geçerlidir. v1 formatında, öncelik ücreti, mesaj yapılandırmasında doğrudan ayarlanan lamports cinsinden mutlak bir toplamdır — CU başına fiyat yok, çarpma yok, yuvarlama yok.
Hesaplama birimi limiti
Hesaplama birimi limiti, bir işlemin tüketebileceği maksimum CU sayısıdır.
SetComputeUnitLimit
talimatı dahil edilmezse, varsayılan değer talimatların sayısına ve türüne göre hesaplanır (yerleşik olmayan talimat başına 200.000 CU, yerleşik başına 3.000 CU). Varsayılan hesaplama hakkında ayrıntılar için
Hesaplama Bütçesi'ne bakın.
Öncelik ücreti, gerçek CU kullanımına değil, talep edilen CU limitine dayanır. Gerekenden daha yüksek bir limit ayarlamak, kullanılmayan hesaplama birimleri için ödeme yapılması anlamına gelir.
Hesaplama birimi fiyatı
Hesaplama birimi fiyatı, talep edilen her CU için ödenen isteğe bağlı bir mikro-lamports miktarıdır. CU fiyatı, önceliklendirme ücretini doğrudan belirler. CU fiyatını ayarlamak için işleminize
SetComputeUnitPrice
talimatı ekleyin.
Varsayılan CU fiyatı 0'dır; bu da varsayılan önceliklendirme ücretinin de 0 olduğu anlamına gelir.
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 | Belgelendirme |
| QuickNode | Belgelendirme |
| Triton | Belgelendirme |
İşlem zamanlama önceliği
Zamanlayıcı, işlemleri
calculate_priority_and_cost
fonksiyonunu kullanarak sıralar:
Priority = reward * 1,000,000 / (cost + 1)
- ödül: validator'ın ücret geliri = önceliklendirme ücreti + temel ücretin yakılmayan kısmı.
calculate_reward_for_transactiontarafından hesaplanır. - maliyet: zamanlayıcının tahmini CU maliyeti (imza maliyetleri + yazma kilidi maliyetleri + instruction data maliyetleri + program yürütme maliyetleri + yüklenen hesap verisi boyutu maliyeti). Ayrıntılar için Hesaplama Bütçesi'ne bakın.
- 1.000.000: ham lamports cinsinden maliyet çoğunlukla ödülü aştığından hassasiyeti korumaya yarayan çarpan.
- +1: sıfıra bölmeyi önler.
Öncelik, işlemlerin yürütme için zamanlayıcının arabelleğinden çıkarılma sırasını belirler.
Örnek: CU limiti ve CU fiyatının ayarlanması
Aşağıdaki örnekler, Solana SDK'ları kullanılarak bir işlemde CU limiti ve CU fiyatının nasıl ayarlanacağını göstermektedir.
| 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?