هيكل الرسوم

ملخص

إجمالي الرسوم = الرسوم الأساسية (5,000 لامبورت/توقيع، يتم حرق 50%) + رسوم الأولوية (سعر_وحدة_الحوسبة * حد_وحدة_الحوسبة / 1 مليون لامبورت، 100% للمدقق). يتم فرض الرسوم سواء نجحت المعاملة أو فشلت.

خوارزمية حساب الرسوم

يتم حساب إجمالي الرسوم للمعاملة بواسطة calculate_fee_details:

Total fee formula
total_fee = base_fee + prioritization_fee

المدخلات هي رسالة المعاملة، وقيمة lamports_per_signature الحالية (حالياً 5,000)، ورسوم الأولوية المستمدة من تعليمات ميزانية الحوسبة. يتم خصم إجمالي الرسوم من دافع الرسوم قبل بدء التنفيذ. إذا فشلت المعاملة، يتم فرض الرسوم على أي حال.

الرسوم الأساسية

تغطي الرسوم الأساسية تكلفة التحقق من توقيع Ed25519 بالإضافة إلى أي عمليات تحقق من توقيعات البرامج المجمعة مسبقاً. يتم فرض رسوم على كل توقيع في المعاملة، بما في ذلك التوقيعات التي يتم التحقق منها بواسطة برامج Ed25519 وSecp256k1 وSecp256r1 المجمعة مسبقاً.

تقوم دالة calculate_signature_fee بحساب:

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: عدد توقيعات Ed25519 على المعاملة (عادةً واحد لكل موقّع).
  • num_ed25519_signatures، num_secp256k1_signatures، num_secp256r1_signatures: التوقيعات التي يتم التحقق منها بواسطة البرامج المجمعة مسبقاً المقابلة.
  • lamports_per_signature: حالياً 5,000 لامبورت.

توزيع الرسوم

يتم توزيع الرسوم الأساسية ورسوم الأولوية بشكل مختلف. تقوم دالة calculate_reward_and_burn_fee_details في وقت التشغيل بحساب:

Fee distribution
burn_amount = transaction_fee * 50 / 100
validator_share = (transaction_fee - burn_amount) + priority_fee
  • الرسوم الأساسية (transaction_fee): يتم حرق 50% (إزالتها من العرض المتداول) وتذهب 50% إلى المدقق المنتج للكتلة. نسبة الحرق هي DEFAULT_BURN_PERCENT = 50.
  • رسوم الأولوية: تذهب 100% إلى المدقق (لا يتم حرق أي شيء)، وفقاً لـ SIMD-0096.

إجمالي مكافأة المدقق للمعاملة هو:

validator_reward = (base_fee / 2) + prioritization_fee

رسوم الأولوية

رسوم الأولوية هي رسوم اختيارية تزيد من أولوية جدولة المعاملة. وحدة الحوسبة (CU) هي وحدة حسابية يقيسها وقت التشغيل أثناء تنفيذ المعاملة. كل عملية (حسابية، الوصول إلى الذاكرة، استدعاء النظام) تكلف عدداً ثابتاً من وحدات الحوسبة. يمكنك تعيين رسوم الأولوية من خلال تضمين تعليمات ميزانية الحوسبة في معاملتك. (راجع دليل كيفية استخدام رسوم الأولوية للحصول على التفاصيل.)

صيغة رسوم الأولوية

تحسب دالة get_prioritization_fee ما يلي:

Prioritization fee formula
micro_lamport_fee = compute_unit_price * compute_unit_limit
prioritization_fee = ceil(micro_lamport_fee / 1,000,000)
المتغيرالوصفالافتراضي
compute_unit_priceميكرو-لامبورت لكل وحدة حوسبة، يتم تعيينها عبر SetComputeUnitPrice0 ميكرو-لامبورت
compute_unit_limitالحد الأقصى لوحدات الحوسبة التي قد تستهلكها المعاملة، يتم تعيينها عبر SetComputeUnitLimitمجموع الافتراضيات لكل تعليمة
1,000,000معامل التحويل من ميكرو-لامبورت إلى لامبورت (MICRO_LAMPORTS_PER_LAMPORT)--

حد وحدة الحوسبة

حد وحدة الحوسبة هو الحد الأقصى لعدد وحدات الحوسبة التي قد تستهلكها المعاملة. إذا لم يتم تضمين تعليمة SetComputeUnitLimit، يتم حساب الافتراضي من عدد ونوع التعليمات (200,000 وحدة حوسبة لكل تعليمة غير مدمجة، 3,000 لكل تعليمة مدمجة). راجع ميزانية الحوسبة للحصول على تفاصيل حول الحساب الافتراضي.

تعتمد رسوم الأولوية على حد وحدات الحوسبة المطلوب، وليس على الاستخدام الفعلي لوحدات الحوسبة. تعيين حد أعلى من اللازم يعني الدفع مقابل وحدات حوسبة غير مستخدمة.

سعر وحدة الحوسبة

سعر وحدة الحوسبة هو مبلغ اختياري من الميكرو-لامبورت يُدفع مقابل كل وحدة حوسبة مطلوبة. يحدد سعر وحدة الحوسبة رسوم الأولوية بشكل مباشر. لتعيين سعر وحدة الحوسبة، قم بتضمين تعليمة SetComputeUnitPrice في معاملتك.

سعر CU الافتراضي هو 0، مما يعني أن رسوم الأولوية الافتراضية هي أيضاً 0.

للحصول على تقديرات سعر CU في الوقت الفعلي، راجع مزودي واجهة برمجة تطبيقات رسوم الأولوية أدناه.

المزودواجهة برمجة تطبيقات رسوم الأولوية
Heliusالتوثيق
QuickNodeالتوثيق
Tritonالتوثيق

أولوية جدولة المعاملات

يقوم المجدول بترتيب المعاملات باستخدام دالة calculate_priority_and_cost:

Transaction priority formula
Priority = reward * 1,000,000 / (cost + 1)
  • المكافأة: دخل المدقق من الرسوم = رسوم الأولوية + الجزء غير المحروق من الرسوم الأساسية. يتم حسابها بواسطة calculate_reward_for_transaction.
  • التكلفة: تكلفة CU المقدرة للمجدول (تكاليف التوقيع + تكاليف قفل الكتابة + تكاليف بيانات التعليمات + تكاليف تنفيذ البرنامج + تكلفة حجم بيانات الحسابات المحملة). راجع ميزانية الحوسبة للحصول على التفاصيل.
  • 1,000,000: مضاعف للحفاظ على الدقة، حيث غالباً ما تتجاوز التكلفة المكافأة بوحدات lamports الخام.
  • +1: يمنع القسمة على صفر.

تحدد الأولوية الترتيب الذي يتم به إزالة المعاملات من قائمة انتظار المجدول للتنفيذ.

مثال: تعيين حد CU وسعر CU

توضح الأمثلة أدناه كيفية تعيين حد CU وسعر CU على معاملة باستخدام مجموعات تطوير برمجيات سولانا.

مجموعة التطوير البرمجيةمرجع الكود المصدري
@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?

تدار بواسطة

© 2026 مؤسسة سولانا.
جميع الحقوق محفوظة.
تواصل معنا