Ringkasan
Total biaya = biaya dasar (5.000 lamports/tanda tangan, 50% dibakar) + biaya prioritas (CU_price * CU_limit / 1 juta lamports, 100% ke validator). Dikenakan baik transaksi berhasil maupun gagal.
Algoritma perhitungan biaya
Total biaya untuk sebuah transaksi dihitung oleh
calculate_fee_details:
total_fee = base_fee + prioritization_fee
Inputnya adalah pesan transaksi, lamports_per_signature saat ini
(saat ini 5.000), dan biaya prioritas yang berasal dari instruksi compute budget. Total biaya dipotong dari pembayar biaya sebelum eksekusi
dimulai. Jika transaksi gagal, biaya tetap dikenakan.
Biaya dasar
Biaya dasar menanggung 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 lamports.
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 beredar) dan 50% diberikan kepada validator yang memproduksi blok. Persentase pembakaran adalah
DEFAULT_BURN_PERCENT = 50. - Biaya prioritas: 100% diberikan kepada validator (tidak ada yang dibakar), sesuai SIMD-0096.
Total hadiah 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. Compute unit (CU) adalah satuan komputasi yang diukur oleh runtime selama eksekusi transaksi. Setiap operasi (aritmetika, akses memori, syscall) memerlukan sejumlah CU tetap. Anda dapat menetapkan biaya prioritas dengan menyertakan instruksi compute budget dalam transaksi Anda. (Lihat panduan Cara Menggunakan Priority Fees untuk detailnya.)
Rumus 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-lamports per CU, ditetapkan melalui SetComputeUnitPrice | 0 micro-lamports |
compute_unit_limit | CU maksimum yang dapat dikonsumsi transaksi, ditetapkan melalui SetComputeUnitLimit | Jumlah default per instruksi |
1.000.000 | Faktor konversi dari micro-lamports ke lamports (MICRO_LAMPORTS_PER_LAMPORT) | -- |
Transaksi v1 menetapkan biaya secara langsung
Rumus harga-kali-batas ini berlaku untuk transaksi legacy dan v0. Dalam format v1, biaya prioritas adalah total absolut dalam lamports yang ditetapkan langsung dalam konfigurasi pesan — tidak ada harga per CU, tidak ada perkalian, tidak ada pembulatan.
Batas compute unit
Batas compute unit adalah jumlah maksimum CU yang dapat dikonsumsi oleh sebuah transaksi.
Jika tidak ada instruksi
SetComputeUnitLimit
yang disertakan, nilai default dihitung berdasarkan 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 compute unit yang tidak terpakai.
Harga compute unit
Harga compute unit adalah jumlah opsional micro-lamports yang dibayarkan untuk setiap
CU yang diminta. Harga CU secara langsung menentukan biaya prioritas. Untuk menetapkan
harga CU, sertakan instruksi
SetComputeUnitPrice
dalam transaksi Anda.
Harga CU default adalah 0, artinya 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 + bagian yang tidak dibakar
dari biaya dasar. Dihitung oleh
calculate_reward_for_transaction. - cost: estimasi biaya CU dari penjadwal (biaya tanda tangan + biaya write lock + biaya instruction data + biaya eksekusi program + biaya ukuran data akun yang dimuat). Lihat Compute Budget untuk detailnya.
- 1.000.000: pengali untuk menjaga presisi, karena biaya sering melebihi hadiah dalam lamports mentah.
- +1: mencegah pembagian dengan nol.
Prioritas menentukan urutan transaksi yang dikeluarkan dari antrean buffer penjadwal untuk dieksekusi.
Contoh: Menetapkan batas CU dan harga CU
Contoh di bawah ini menunjukkan cara menetapkan batas CU dan harga CU pada sebuah transaksi menggunakan Solana SDK.
| 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?