ميزانية الحوسبة

ملخص

الافتراضي 200 ألف وحدة حوسبة لكل تعليمة، بحد أقصى 1.4 مليون لكل معاملة. استخدم تعليمات SetComputeUnitLimit و SetComputeUnitPrice للتحسين. تعتمد رسوم الأولوية على وحدات الحوسبة المطلوبة، وليس الاستخدام الفعلي.

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

يتم تخصيص افتراضي 200,000 وحدة حوسبة لكل تعليمة، ويتم تحديد كل معاملة بحد أقصى 1,400,000 وحدة حوسبة. عندما لا تكون هناك تعليمة SetComputeUnitLimit صريحة، يتم حساب الافتراضي بناءً على نوع التعليمة:

Default CU limit calculation
default_cu_limit = (num_non_migratable_builtin_instructions * 3,000)
+ (num_not_migrated_builtin_instructions * 3,000)
+ (num_non_builtin_instructions * 200,000)
+ (num_migrated_builtin_instructions * 200,000)
  • التعليمات المدمجة (System Program، Stake، Vote، إلخ. التي لم يتم ترحيلها إلى SBF): يتم تخصيص MAX_BUILTIN_ALLOCATION_COMPUTE_UNIT_LIMIT = 3,000 وحدة حوسبة لكل منها (وفقًا لـ SIMD-0170).
  • التعليمات غير المدمجة (برامج SBF المنشورة من قبل المستخدم): يتم تخصيص DEFAULT_INSTRUCTION_COMPUTE_UNIT_LIMIT = 200,000 وحدة حوسبة لكل منها.
  • البرامج المدمجة قيد الترحيل التي أكملت الترحيل إلى SBF (محكومة بميزة): تُعامل كبرامج غير مدمجة (200,000 وحدة حوسبة لكل منها).

يتم تقييد النتيجة إلى MAX_COMPUTE_UNIT_LIMIT (1,400,000).

يمكنك تجاوز هذا الافتراضي من خلال تضمين تعليمة SetComputeUnitLimit في معاملتك.

لتحديد حد وحدات الحوسبة المناسب:

  1. محاكاة المعاملة لقياس استهلاك وحدات الحوسبة.
  2. إضافة هامش أمان بنسبة 10% إلى القيمة المحاكاة.

يتم تحديد رسوم الأولوية بناءً على حد وحدات الحوسبة المطلوب في المعاملة، وليس عدد وحدات الحوسبة المستخدمة فعليًا. إذا قمت بتعيين حد وحدات حوسبة مرتفع جدًا أو استخدمت المقدار الافتراضي، فإنك تدفع مقابل وحدات الحوسبة غير المستخدمة.

تعليمات ميزانية الحوسبة

يحتوي برنامج ميزانية الحوسبة (ComputeBudget111111111111111111111111111111) على أربع تعليمات.

المتغيرالمميزالمعاملالنوعالوصف
RequestHeapFrame1bytesu32حجم الذاكرة المطلوب بالبايتات لكل برنامج في المعاملة
SetComputeUnitLimit2unitsu32الحد الأقصى لوحدات الحوسبة التي قد تستهلكها المعاملة
SetComputeUnitPrice3micro_lamportsu64سعر وحدة الحوسبة بالميكرو لامبورت
SetLoadedAccountsDataSizeLimit4bytesu32الحد الأقصى لإجمالي بايتات بيانات الحساب التي قد تحملها المعاملة

المصدر: ComputeBudgetInstruction enum

القيود وشروط الخطأ

تنطبق القواعد التالية عند معالجة تعليمات ميزانية الحوسبة:

  • واحد لكل نوع: يُسمح بمتغير واحد فقط من كل تعليمة لكل معاملة. يؤدي تضمين نسخ مكررة إلى خطأ DuplicateInstruction (تفشل المعاملة بأكملها).
  • RequestHeapFrame: يجب أن تكون القيمة بين MIN_HEAP_FRAME_BYTES (32 كيلوبايت) و MAX_HEAP_FRAME_BYTES (256 كيلوبايت)، ويجب أن تكون مضاعفاً للعدد 1,024. وإلا تفشل المعاملة مع InvalidInstructionData. ينطبق حجم الذاكرة على كل برنامج يتم استدعاؤه في المعاملة (بما في ذلك CPIs).
  • SetComputeUnitLimit: يتم قبول أي قيمة u32. يتم تقييد الحد الفعلي إلى MAX_COMPUTE_UNIT_LIMIT (1,400,000).
  • SetComputeUnitPrice: يتم قبول أي قيمة u64 (من 0 إلى u64::MAX).
  • SetLoadedAccountsDataSizeLimit: يجب أن تكون القيمة أكبر من 0 (NonZeroU32). تتسبب القيمة 0 في InvalidLoadedAccountsDataSizeLimit. يتم تقييد الحد الفعلي إلى MAX_LOADED_ACCOUNTS_DATA_SIZE_BYTES (64 ميجابايت).
  • بيانات غير معروفة: أي تعليمة يتم إرسالها إلى برنامج ميزانية الحوسبة ولا يمكن إلغاء تسلسلها إلى متغير معروف تفشل مع InvalidInstructionData.

يصف نموذج تكلفة المجدول أدناه تقدير التكلفة الداخلي للمدقق قبل التنفيذ. معظم المطورين يحتاجون فقط إلى تعليمات ميزانية الحوسبة أعلاه.

نموذج تكلفة المجدول

يستخدم المجدول الخاص بالمدقق نموذج تكلفة لتقدير استخدام موارد المعاملة قبل التنفيذ. تحدد تقديرات التكلفة هذه قبل التنفيذ ما إذا كانت المعاملة تتناسب مع السعة المتبقية للكتلة. وهي منفصلة عن قياس وحدات الحوسبة الذي يحدث أثناء التنفيذ.

إجمالي تكلفة المجدول هو مجموع خمسة مكونات (UsageCostDetails::sum):

Scheduler cost formula
total_cost = signature_cost
+ write_lock_cost
+ data_bytes_cost
+ programs_execution_cost
+ loaded_accounts_data_size_cost

مكونات التكلفة

المكونالوصف
تكلفة التوقيعالتكلفة لكل توقيع حسب نوع التوقيع
تكلفة قفل الكتابةلكل حساب قابل للكتابة
تكلفة بيانات التعليماتبناءً على إجمالي بايتات بيانات التعليمات
تكلفة تنفيذ البرامجحد وحدات الحوسبة من ميزانية الحوسبة أو الافتراضي
تكلفة بيانات الحسابات المحملةبناءً على إجمالي حجم بيانات الحسابات المحملة

جميع القيم بوحدات الحوسبة.

ثوابت تكلفة المجدول

الثابتالقيمة
COMPUTE_UNIT_TO_US_RATIO30
SIGNATURE_COST720 وحدة حوسبة
SECP256K1_VERIFY_COST6,690 وحدة حوسبة
ED25519_VERIFY_COST2,280 وحدة حوسبة
ED25519_VERIFY_STRICT_COST2,400 وحدة حوسبة
SECP256R1_VERIFY_COST4,800 وحدة حوسبة
WRITE_LOCK_UNITS300 وحدة حوسبة
INSTRUCTION_DATA_BYTES_COST4

تكلفة معاملة التصويت

تستخدم معاملات التصويت تكلفة ثابتة قدرها 3,428 وحدة حوسبة بغض النظر عن محتواها الفعلي.

حدود الكتلة

يفرض المجدول حدودًا لكل كتلة. إذا كانت إضافة معاملة ستتجاوز أي حد، فلن يتم تضمينها في الكتلة.

الحدالقيمة
MAX_BLOCK_UNITS60,000,000
MAX_WRITABLE_ACCOUNT_UNITS12,000,000
MAX_VOTE_UNITS36,000,000
MAX_BLOCK_ACCOUNTS_DATA_SIZE_DELTA100 ميجابايت

SIMD-0286 يقترح زيادة MAX_BLOCK_UNITS إلى 100,000,000.

ثوابت ميزانية التنفيذ

الثوابت التالية من execution_budget.rs تحدد حدود وقت التشغيل أثناء تنفيذ المعاملة:

الثابتالقيمةالوصف
MAX_COMPUTE_UNIT_LIMIT1,400,000الحد الأقصى لوحدات الحساب لكل معاملة
DEFAULT_INSTRUCTION_COMPUTE_UNIT_LIMIT200,000وحدات الحساب الافتراضية لكل تعليمة غير مدمجة
MAX_BUILTIN_ALLOCATION_COMPUTE_UNIT_LIMIT3,000وحدات الحساب الافتراضية لكل تعليمة مدمجة (SIMD-0170)
DEFAULT_HEAP_COST8 وحدات حسابالتكلفة لكل صفحة ذاكرة مؤقتة بحجم 32 كيلوبايت
DEFAULT_INVOCATION_COST1,000 وحدة حسابتكلفة استدعاء CPI واحد
INVOKE_UNITS_COST_SIMD_0339946 وحدة حسابتكلفة استدعاء CPI مع SIMD-0339
MIN_HEAP_FRAME_BYTES32,768الحد الأدنى لحجم الذاكرة المؤقتة (32 كيلوبايت)
MAX_HEAP_FRAME_BYTES262,144الحد الأقصى لحجم الذاكرة المؤقتة (256 كيلوبايت)
MAX_LOADED_ACCOUNTS_DATA_SIZE_BYTES67,108,864الحد الأقصى لبيانات الحساب المحملة لكل معاملة (64 ميجابايت)
MAX_INSTRUCTION_STACK_DEPTH5الحد الأقصى لعمق مكدس التعليمات (المستوى الأعلى + CPIs)
MAX_INSTRUCTION_STACK_DEPTH_SIMD_02689الحد الأقصى لعمق مكدس التعليمات (المستوى الأعلى + CPIs) مع SIMD-0268
MAX_CALL_DEPTH64الحد الأقصى لعمق استدعاء SBF-to-SBF داخل البرنامج
STACK_FRAME_SIZE4,096 بايتحجم إطار مكدس SBF واحد

Is this page helpful?

تدار بواسطة

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