Struktur biaya

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

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 lamport.

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

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-lamport per CU, diatur melalui SetComputeUnitPrice0 micro-lamport
compute_unit_limitCU maksimum yang dapat dikonsumsi transaksi, diatur melalui SetComputeUnitLimitJumlah default per instruksi
1,000,000Faktor 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.

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 + 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.

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

Dikelola oleh

© 2026 Yayasan Solana.
Semua hak dilindungi.
Terhubung