رسوم المعاملات
تتطلب كل معاملة على سولانا رسومًا أساسية (SOL) لتعويض المدققين عن معالجة المعاملة. يمكنك أيضًا دفع رسوم أولوية اختيارية لزيادة فرصة معالجة القائد الحالي (المدقق) لمعاملتك.
النقاط الرئيسية
- الرسوم الأساسية للمعاملة هي 5000 لامبورت لكل توقيع على المعاملة.
- رسوم الأولوية (اختيارية) هي رسوم إضافية تدفعها للمدقق لزيادة فرصة معالجة القائد الحالي لمعاملتك.
- رسوم الأولوية تساوي: (حد وحدة الحوسبة × سعر وحدة الحوسبة).
- حد وحدة الحوسبة هو الحد الأقصى لوحدات الحوسبة التي يمكن أن تستخدمها معاملتك.
- سعر وحدة الحوسبة هو السعر لكل وحدة حوسبة، بالميكرو لامبورت.
- 1,000,000 ميكرو لامبورت = 1 لامبورت
- يجب أن يكون دافع رسوم المعاملة حسابًا مملوكًا من قبل System Program.
رسوم المعاملة الأساسية
الرسوم الأساسية هي تكلفة إرسال معاملة. التكلفة هي 5000 لامبورت لكل توقيع مضمن في المعاملة.
تخرج الرسوم الأساسية من حساب دافع رسوم المعاملة، وهو أول موقع على المعاملة. يجب أن يكون دافع الرسوم حسابًا مملوكًا من قبل System Program.
- 50% يتم حرقها: نصف الرسوم الأساسية يتم حرقها.
- 50% توزيع: النصف يدفع للمدقق الذي عالج المعاملة.
رسوم الأولوية
رسوم الأولوية
- SIMD-0096: يحصل validator الذي يعالج المعاملة على 100% من رسوم الأولوية.
وحدات الحوسبة والحدود
عند معالجة المعاملة، فإنها تستخدم موارد حسابية تُقاس بوحدات الحوسبة (CU). كل تعليمة تخصم من ميزانية وحدات الحوسبة المخصصة للمعاملة.
- الحد الأقصى: يمكن للمعاملة استخدام ما يصل إلى 1.4 مليون وحدة حوسبة.
- الحد الافتراضي: بشكل افتراضي، يمكن لكل تعليمة استخدام ما يصل إلى 200,000 وحدة حوسبة.
- الحد المخصص: يمكنك طلب حد معين لوحدات الحوسبة عن طريق تضمين تعليمة
SetComputeUnitLimit
في معاملتك.
لمزيد من التفاصيل حول استخدام وحدات الحوسبة:
راجع دليل كيفية طلب الحوسبة المثلى لمزيد من التفاصيل حول استخدام وحدات الحوسبة.
سعر وحدة الحوسبة
سعر وحدة الحوسبة هو مبلغ اختياري، محدد بالميكرو lamport، تدفعه مقابل كل وحدة حوسبة تطلبها. يُستخدم هذا السعر لحساب رسوم الأولوية لمعاملتك.
استخدم هذه الموارد للحصول على توصيات في الوقت الفعلي حول سعر وحدة الحوسبة الحالي:
راجع دليل كيفية استخدام رسوم الأولوية لمزيد من التفاصيل حول رسوم الأولوية.
حساب رسوم الأولوية
يتم حساب رسوم الأولوية كما يلي:
رسوم الأولوية = حد وحدات الحوسبة × سعر وحدة الحوسبة
النهج الموصى به لتحديد رسوم الأولوية هو أولاً
محاكاة المعاملة
لتقدير وحدات الحوسبة المطلوبة. ثم، أضف هامش أمان بنسبة 10% إلى هذا التقدير
واستخدم القيمة الناتجة كـ Compute Unit Limit
.
يتم حساب أولوية المعاملة، التي تحدد كيفية إعطائها الأولوية بالنسبة للمعاملات الأخرى، باستخدام الصيغة التالية:
الأولوية = ((حد وحدة الحوسبة × سعر وحدة الحوسبة) + الرسوم الأساسية) / (1 + حد وحدة الحوسبة + وحدات حوسبة التوقيع + وحدات حوسبة قفل الكتابة)
استخدم هذه التعليمات لتعيين حد وحدة الحوسبة والسعر على المعاملة:
SetComputeUnitLimit
لتعيين حد وحدة محدد.SetComputeUnitPrice
لتحديد السعر لكل وحدة حوسبة.
إذا لم تقدم هذه التعليمات، فستستخدم المعاملة حد وحدة الحوسبة الافتراضي مع سعر وحدة حوسبة يساوي 0 (بدون رسوم أولوية).
تعتمد رسوم الأولوية على حد وحدة الحوسبة الذي تطلبه للمعاملة، وليس على وحدات الحوسبة المستخدمة فعليًا. إذا قمت بتعيين حد وحدة حوسبة مرتفع جدًا أو استخدمت المقدار الافتراضي، فقد تدفع مقابل وحدات حوسبة غير مستخدمة.
أمثلة
توضح الأمثلة التالية كيفية تعيين حد وحدة الحوسبة والسعر للمعاملة.
SDK | مرجع الكود المصدري |
---|---|
solana-sdk (Rust) | ComputeBudgetInstruction |
@solana/web3.js (Typescript) | ComputeBudgetProgram |
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?