هيكل الرسوم

ملخص

إجمالي الرسوم = الرسوم الأساسية (5,000 lamport/توقيع، يُحرق 50%) + رسوم الأولوية (CU_price * CU_limit / 1M lamport، 100% للـ validator). تُخصم سواء نجحت المعاملة أم فشلت.

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

يتم احتساب إجمالي رسوم المعاملة بواسطة 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 lamport.

توزيع الرسوم

تُوزَّع الرسوم الأساسية ورسوم الأولوية بطريقة مختلفة. تحسب الدالة 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% burned (يُزال من العرض المتداول) ويذهب 50% إلى الـ validator المنتج للكتلة. نسبة الحرق هي DEFAULT_BURN_PERCENT = 50.
  • رسوم الأولوية: تذهب 100% إلى الـ validator (لا شيء يُحرق)، وفقاً لـ SIMD-0096.

إجمالي مكافأة الـ validator عن المعاملة هو:

validator_reward = (base_fee / 2) + prioritization_fee

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

رسوم الأولوية هي رسوم اختيارية تزيد من أولوية جدولة المعاملة. وحدة الحوسبة (CU) هي وحدة قياس الحساب التي يستخدمها وقت التشغيل أثناء تنفيذ المعاملة. كل عملية (حسابية، أو وصول للذاكرة، أو استدعاء نظام) تكلف عدداً ثابتاً من وحدات 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ميكرو-lamport لكل CU، يُحدد عبر SetComputeUnitPrice0 ميكرو-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 في الوقت الفعلي، راجع مزودي واجهة برمجة رسوم الأولوية أدناه.

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

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

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

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