Struktur Biaya

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 formula
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:

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: 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:

Fee distribution
burn_amount = transaction_fee * 50 / 100
validator_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:

Prioritization fee formula
micro_lamport_fee = compute_unit_price * compute_unit_limit
prioritization_fee = ceil(micro_lamport_fee / 1,000,000)
VariabelDeskripsiDefault
compute_unit_priceMicro-lamports per CU, ditetapkan melalui SetComputeUnitPrice0 micro-lamports
compute_unit_limitCU maksimum yang dapat dikonsumsi transaksi, ditetapkan melalui SetComputeUnitLimitJumlah default per instruksi
1.000.000Faktor 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.

Prioritas penjadwalan transaksi

Penjadwal mengurutkan transaksi menggunakan fungsi calculate_priority_and_cost:

Transaction priority formula
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.

SDKReferensi 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 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?

Daftar Isi

Edit Halaman
© 2026 Yayasan Solana. Semua hak dilindungi.