Ringkasan
Total biaya = biaya dasar (5.000 lamport/tanda tangan, 50% dibakar) + biaya prioritas (harga_CU * batas_CU / 1 juta lamport, 100% ke validator). Dikenakan biaya baik transaksi berhasil maupun gagal.
Algoritma perhitungan biaya
Total biaya untuk sebuah transaksi dihitung oleh
calculate_fee_details:
total_fee = base_fee + prioritization_fee
Input-nya adalah pesan transaksi, lamports_per_signature saat ini (saat ini
5.000), dan biaya prioritas yang diturunkan dari instruksi compute budget. Total
biaya dikurangkan dari pembayar biaya sebelum eksekusi dimulai. Jika transaksi
gagal, biaya tetap dikenakan.
Biaya dasar
Biaya dasar mencakup biaya verifikasi tanda tangan Ed25519 ditambah verifikasi tanda tangan precompile apa pun. Setiap tanda tangan dalam transaksi dikenakan biaya, termasuk tanda tangan yang diverifikasi oleh program precompile Ed25519, Secp256k1, dan Secp256r1.
Fungsi
calculate_signature_fee
menghitung:
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: jumlah tanda tangan Ed25519 pada transaksi (biasanya satu per penandatangan).num_ed25519_signatures,num_secp256k1_signatures,num_secp256r1_signatures: tanda tangan yang diverifikasi oleh program precompile yang sesuai.lamports_per_signature: saat ini 5.000 lamport.
Distribusi biaya
Biaya dasar dan biaya prioritas didistribusikan secara berbeda. Fungsi
calculate_reward_and_burn_fee_details
dalam runtime menghitung:
burn_amount = transaction_fee * 50 / 100validator_share = (transaction_fee - burn_amount) + priority_fee
- Biaya dasar (transaction_fee): 50%
dibakar
(dihapus dari pasokan yang beredar) dan 50% masuk ke validator penghasil blok.
Persentase pembakaran adalah
DEFAULT_BURN_PERCENT = 50. - Biaya prioritas: 100% masuk ke validator (tidak ada yang dibakar), sesuai SIMD-0096.
Total reward validator untuk sebuah transaksi adalah:
validator_reward = (base_fee / 2) + prioritization_fee
Biaya prioritas
Biaya prioritas adalah biaya opsional yang meningkatkan prioritas penjadwalan sebuah transaksi. Unit komputasi (CU) adalah unit perhitungan yang diukur oleh runtime selama eksekusi transaksi. Setiap operasi (aritmatika, akses memori, syscall) memerlukan sejumlah CU tetap. Anda dapat mengatur biaya prioritas dengan menyertakan instruksi compute budget dalam transaksi Anda. (Lihat panduan Cara Menggunakan Priority Fees untuk detail lebih lanjut.)
Formula biaya prioritas
Fungsi
get_prioritization_fee
menghitung:
micro_lamport_fee = compute_unit_price * compute_unit_limitprioritization_fee = ceil(micro_lamport_fee / 1,000,000)
| Variabel | Deskripsi | Default |
|---|---|---|
compute_unit_price | Micro-lamport per CU, diatur melalui SetComputeUnitPrice | 0 micro-lamport |
compute_unit_limit | CU maksimum yang dapat dikonsumsi transaksi, diatur melalui SetComputeUnitLimit | Jumlah default per instruksi |
1,000,000 | Faktor konversi dari micro-lamport ke lamport (MICRO_LAMPORTS_PER_LAMPORT) | -- |
Batas unit komputasi
Batas unit komputasi adalah jumlah maksimum CU yang dapat dikonsumsi oleh sebuah
transaksi. Jika tidak ada instruksi
SetComputeUnitLimit
yang disertakan, default dihitung dari jumlah dan jenis instruksi (200.000 CU
per instruksi non-builtin, 3.000 per builtin). Lihat
Compute Budget untuk detail tentang
perhitungan default.
Biaya prioritas didasarkan pada batas CU yang diminta, bukan penggunaan CU aktual. Menetapkan batas lebih tinggi dari yang diperlukan berarti membayar untuk unit komputasi yang tidak digunakan.
Harga unit komputasi
Harga unit komputasi adalah jumlah opsional micro-lamport yang dibayarkan untuk
setiap CU yang diminta. Harga CU secara langsung menentukan biaya prioritas.
Untuk mengatur harga CU, sertakan instruksi
SetComputeUnitPrice
dalam transaksi Anda.
Harga CU default adalah 0, yang berarti biaya prioritas default juga 0.
Untuk estimasi harga CU secara real-time, lihat penyedia API biaya prioritas di bawah ini.
| Penyedia | API biaya prioritas |
|---|---|
| Helius | Dokumentasi |
| QuickNode | Dokumentasi |
| Triton | Dokumentasi |
Prioritas penjadwalan transaksi
Penjadwal mengurutkan transaksi menggunakan fungsi
calculate_priority_and_cost:
Priority = reward * 1,000,000 / (cost + 1)
- reward: pendapatan biaya validator = biaya prioritas + porsi biaya dasar
yang tidak dibakar. Dihitung oleh
calculate_reward_for_transaction. - cost: estimasi biaya CU penjadwal (biaya tanda tangan + biaya write lock + biaya data instruksi + biaya eksekusi program + biaya ukuran data akun yang dimuat). Lihat Compute Budget untuk detail.
- 1.000.000: pengali untuk mempertahankan presisi, karena biaya sering melebihi reward dalam lamport mentah.
- +1: mencegah pembagian dengan nol.
Prioritas menentukan urutan transaksi dikeluarkan dari buffer penjadwal untuk dieksekusi.
Contoh: mengatur batas CU dan harga CU
Contoh di bawah ini menunjukkan cara mengatur batas CU dan harga CU pada transaksi menggunakan SDK Solana.
| SDK | Referensi kode sumber |
|---|---|
@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?