ملخص
إجمالي الرسوم = الرسوم الأساسية (5,000 lamport/توقيع، يُحرق 50%) + رسوم الأولوية (CU_price * CU_limit / 1M lamport، 100% للـ validator). تُخصم سواء نجحت المعاملة أم فشلت.
خوارزمية احتساب الرسوم
يتم احتساب إجمالي رسوم المعاملة بواسطة
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 lamport.
توزيع الرسوم
تُوزَّع الرسوم الأساسية ورسوم الأولوية بطريقة مختلفة. تحسب الدالة
calculate_reward_and_burn_fee_details
في وقت التشغيل ما يلي:
burn_amount = transaction_fee * 50 / 100validator_share = (transaction_fee - burn_amount) + priority_fee
- الرسوم الأساسية (transaction_fee): يُحرق 50%
burned
(يُزال من العرض المتداول) ويذهب 50% إلى الـ validator المنتج للكتلة. نسبة الحرق هي
DEFAULT_BURN_PERCENT = 50. - رسوم الأولوية: تذهب 100% إلى الـ validator (لا شيء يُحرق)، وفقاً لـ SIMD-0096.
إجمالي مكافأة الـ validator عن المعاملة هو:
validator_reward = (base_fee / 2) + prioritization_fee
رسوم الأولوية
رسوم الأولوية هي رسوم اختيارية تزيد من أولوية جدولة المعاملة. وحدة الحوسبة (CU) هي وحدة قياس الحساب التي يستخدمها وقت التشغيل أثناء تنفيذ المعاملة. كل عملية (حسابية، أو وصول للذاكرة، أو استدعاء نظام) تكلف عدداً ثابتاً من وحدات CU. يمكنك تحديد رسوم الأولوية بتضمين تعليمات الميزانية الحسابية في معاملتك. (راجع دليل كيفية استخدام رسوم الأولوية للتفاصيل.)
صيغة رسوم الأولوية
تحسب الدالة
get_prioritization_fee
ما يلي:
micro_lamport_fee = compute_unit_price * compute_unit_limitprioritization_fee = ceil(micro_lamport_fee / 1,000,000)
| المتغير | الوصف | الافتراضي |
|---|---|---|
compute_unit_price | ميكرو-lamport لكل CU، يُحدد عبر SetComputeUnitPrice | 0 ميكرو-lamport |
compute_unit_limit | الحد الأقصى لوحدات CU التي قد تستهلكها المعاملة، يُحدد عبر SetComputeUnitLimit | مجموع القيم الافتراضية لكل تعليمة |
1,000,000 | معامل التحويل من ميكرو-lamport إلى lamport (MICRO_LAMPORTS_PER_LAMPORT) | -- |
معاملات v1 تحدد الرسوم مباشرةً
تنطبق صيغة السعر مضروباً في الحد على المعاملات القديمة ومعاملات v0. في تنسيق v1، تكون رسوم الأولوية عبارة عن إجمالي مطلق بالـ lamport يُحدد مباشرةً في إعداد الرسالة — بدون سعر لكل CU، ولا ضرب، ولا تقريب.
حد وحدات الحوسبة
حد وحدات الحوسبة هو الحد الأقصى لعدد وحدات CU التي يمكن للمعاملة استهلاكها.
إذا لم تُضمَّن تعليمة
SetComputeUnitLimit،
يُحسب الافتراضي بناءً على عدد التعليمات ونوعها (200,000 وحدة CU لكل تعليمة غير مدمجة، و3,000 لكل تعليمة مدمجة). راجع
الميزانية الحسابية للتفاصيل حول الحساب الافتراضي.
تستند رسوم الأولوية إلى حد وحدات CU المطلوب، لا إلى الاستخدام الفعلي. تحديد حد أعلى مما هو مطلوب يعني الدفع مقابل وحدات حوسبة غير مستخدمة.
سعر وحدة الحوسبة
سعر وحدة الحوسبة هو مبلغ اختياري بالميكرو-lamport يُدفع عن كل وحدة CU مطلوبة. يحدد سعر CU مباشرةً رسوم الأولوية. لتحديد سعر CU، أضف تعليمة
SetComputeUnitPrice
إلى معاملتك.
سعر CU الافتراضي هو 0، مما يعني أن رسوم الأولوية الافتراضية هي أيضاً 0.
للاطلاع على تقديرات سعر CU في الوقت الفعلي، راجع مزودي واجهة برمجة رسوم الأولوية أدناه.
أولوية جدولة المعاملات
يرتب المجدول المعاملات باستخدام الدالة
calculate_priority_and_cost:
Priority = reward * 1,000,000 / (cost + 1)
- المكافأة (reward): دخل الـ validator من الرسوم = رسوم الأولوية + الجزء غير المحروق
من الرسوم الأساسية. يُحسب بواسطة
calculate_reward_for_transaction. - التكلفة (cost): التكلفة التقديرية بوحدات CU للمجدول (تكاليف التوقيع + تكاليف قفل الكتابة + تكاليف instruction data + تكاليف تنفيذ البرنامج + تكلفة حجم بيانات الحسابات المحملة). راجع الميزانية الحسابية للتفاصيل.
- 1,000,000: معامل ضرب للحفاظ على الدقة، إذ كثيراً ما تتجاوز التكلفة المكافأة بالـ lamport الخام.
- +1: يمنع القسمة على صفر.
تحدد الأولوية الترتيب الذي تُسحب به المعاملات من قائمة انتظار المجدول للتنفيذ.
مثال: تحديد حد CU وسعر CU
توضح الأمثلة أدناه كيفية تحديد حد CU وسعر CU في معاملة باستخدام حزم تطوير سولانا.
| حزمة التطوير (SDK) | مرجع الكود المصدري |
|---|---|
@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?