ملخص
إجمالي الرسوم = الرسوم الأساسية (5,000 لامبورت/توقيع، يتم حرق 50%) + رسوم الأولوية (سعر_وحدة_الحوسبة * حد_وحدة_الحوسبة / 1 مليون لامبورت، 100% للمدقق). يتم فرض الرسوم سواء نجحت المعاملة أو فشلت.
خوارزمية حساب الرسوم
يتم حساب إجمالي الرسوم للمعاملة بواسطة
calculate_fee_details:
total_fee = base_fee + prioritization_fee
المدخلات هي رسالة المعاملة، وقيمة lamports_per_signature الحالية (حالياً
5,000)، ورسوم الأولوية المستمدة من تعليمات ميزانية الحوسبة. يتم خصم إجمالي
الرسوم من دافع الرسوم قبل بدء التنفيذ. إذا فشلت المعاملة، يتم فرض الرسوم على أي
حال.
الرسوم الأساسية
تغطي الرسوم الأساسية تكلفة التحقق من توقيع Ed25519 بالإضافة إلى أي عمليات تحقق من توقيعات البرامج المجمعة مسبقاً. يتم فرض رسوم على كل توقيع في المعاملة، بما في ذلك التوقيعات التي يتم التحقق منها بواسطة برامج Ed25519 وSecp256k1 وSecp256r1 المجمعة مسبقاً.
تقوم دالة
calculate_signature_fee
بحساب:
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
في وقت التشغيل بحساب:
burn_amount = transaction_fee * 50 / 100validator_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
ما يلي:
micro_lamport_fee = compute_unit_price * compute_unit_limitprioritization_fee = ceil(micro_lamport_fee / 1,000,000)
| المتغير | الوصف | الافتراضي |
|---|---|---|
compute_unit_price | ميكرو-لامبورت لكل وحدة حوسبة، يتم تعيينها عبر SetComputeUnitPrice | 0 ميكرو-لامبورت |
compute_unit_limit | الحد الأقصى لوحدات الحوسبة التي قد تستهلكها المعاملة، يتم تعيينها عبر SetComputeUnitLimit | مجموع الافتراضيات لكل تعليمة |
1,000,000 | معامل التحويل من ميكرو-لامبورت إلى لامبورت (MICRO_LAMPORTS_PER_LAMPORT) | -- |
حد وحدة الحوسبة
حد وحدة الحوسبة هو الحد الأقصى لعدد وحدات الحوسبة التي قد تستهلكها المعاملة. إذا
لم يتم تضمين تعليمة
SetComputeUnitLimit،
يتم حساب الافتراضي من عدد ونوع التعليمات (200,000 وحدة حوسبة لكل تعليمة غير
مدمجة، 3,000 لكل تعليمة مدمجة). راجع
ميزانية الحوسبة للحصول على تفاصيل حول الحساب
الافتراضي.
تعتمد رسوم الأولوية على حد وحدات الحوسبة المطلوب، وليس على الاستخدام الفعلي لوحدات الحوسبة. تعيين حد أعلى من اللازم يعني الدفع مقابل وحدات حوسبة غير مستخدمة.
سعر وحدة الحوسبة
سعر وحدة الحوسبة هو مبلغ اختياري من الميكرو-لامبورت يُدفع مقابل كل وحدة حوسبة
مطلوبة. يحدد سعر وحدة الحوسبة رسوم الأولوية بشكل مباشر. لتعيين سعر وحدة الحوسبة،
قم بتضمين تعليمة
SetComputeUnitPrice
في معاملتك.
سعر CU الافتراضي هو 0، مما يعني أن رسوم الأولوية الافتراضية هي أيضاً 0.
للحصول على تقديرات سعر CU في الوقت الفعلي، راجع مزودي واجهة برمجة تطبيقات رسوم الأولوية أدناه.
أولوية جدولة المعاملات
يقوم المجدول بترتيب المعاملات باستخدام دالة
calculate_priority_and_cost:
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 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?