ملخص
الافتراضي 200 ألف وحدة حوسبة لكل تعليمة، بحد أقصى 1.4 مليون لكل معاملة. استخدم
تعليمات SetComputeUnitLimit و SetComputeUnitPrice للتحسين. تعتمد رسوم
الأولوية على وحدات الحوسبة المطلوبة، وليس الاستخدام الفعلي.
حد وحدات الحوسبة
يتم تخصيص
افتراضي 200,000 وحدة حوسبة
لكل تعليمة، ويتم تحديد كل معاملة بحد أقصى
1,400,000 وحدة حوسبة.
عندما لا تكون هناك تعليمة SetComputeUnitLimit صريحة،
يتم حساب الافتراضي
بناءً على نوع التعليمة:
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
في معاملتك.
لتحديد حد وحدات الحوسبة المناسب:
- محاكاة المعاملة لقياس استهلاك وحدات الحوسبة.
- إضافة هامش أمان بنسبة 10% إلى القيمة المحاكاة.
يتم تحديد رسوم الأولوية بناءً على حد وحدات الحوسبة المطلوب في المعاملة، وليس عدد وحدات الحوسبة المستخدمة فعليًا. إذا قمت بتعيين حد وحدات حوسبة مرتفع جدًا أو استخدمت المقدار الافتراضي، فإنك تدفع مقابل وحدات الحوسبة غير المستخدمة.
تعليمات ميزانية الحوسبة
يحتوي
برنامج ميزانية الحوسبة
(ComputeBudget111111111111111111111111111111) على أربع تعليمات.
| المتغير | المميز | المعامل | النوع | الوصف |
|---|---|---|---|---|
RequestHeapFrame | 1 | bytes | u32 | حجم الذاكرة المطلوب بالبايتات لكل برنامج في المعاملة |
SetComputeUnitLimit | 2 | units | u32 | الحد الأقصى لوحدات الحوسبة التي قد تستهلكها المعاملة |
SetComputeUnitPrice | 3 | micro_lamports | u64 | سعر وحدة الحوسبة بالميكرو لامبورت |
SetLoadedAccountsDataSizeLimit | 4 | bytes | u32 | الحد الأقصى لإجمالي بايتات بيانات الحساب التي قد تحملها المعاملة |
المصدر: 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):
total_cost = signature_cost+ write_lock_cost+ data_bytes_cost+ programs_execution_cost+ loaded_accounts_data_size_cost
مكونات التكلفة
| المكون | الوصف |
|---|---|
| تكلفة التوقيع | التكلفة لكل توقيع حسب نوع التوقيع |
| تكلفة قفل الكتابة | لكل حساب قابل للكتابة |
| تكلفة بيانات التعليمات | بناءً على إجمالي بايتات بيانات التعليمات |
| تكلفة تنفيذ البرامج | حد وحدات الحوسبة من ميزانية الحوسبة أو الافتراضي |
| تكلفة بيانات الحسابات المحملة | بناءً على إجمالي حجم بيانات الحسابات المحملة |
جميع القيم بوحدات الحوسبة.
ثوابت تكلفة المجدول
| الثابت | القيمة |
|---|---|
COMPUTE_UNIT_TO_US_RATIO | 30 |
SIGNATURE_COST | 720 وحدة حوسبة |
SECP256K1_VERIFY_COST | 6,690 وحدة حوسبة |
ED25519_VERIFY_COST | 2,280 وحدة حوسبة |
ED25519_VERIFY_STRICT_COST | 2,400 وحدة حوسبة |
SECP256R1_VERIFY_COST | 4,800 وحدة حوسبة |
WRITE_LOCK_UNITS | 300 وحدة حوسبة |
INSTRUCTION_DATA_BYTES_COST | 4 |
تكلفة معاملة التصويت
تستخدم معاملات التصويت تكلفة ثابتة قدرها 3,428 وحدة حوسبة بغض النظر عن محتواها الفعلي.
حدود الكتلة
يفرض المجدول حدودًا لكل كتلة. إذا كانت إضافة معاملة ستتجاوز أي حد، فلن يتم تضمينها في الكتلة.
| الحد | القيمة |
|---|---|
MAX_BLOCK_UNITS | 60,000,000 |
MAX_WRITABLE_ACCOUNT_UNITS | 12,000,000 |
MAX_VOTE_UNITS | 36,000,000 |
MAX_BLOCK_ACCOUNTS_DATA_SIZE_DELTA | 100 ميجابايت |
SIMD-0286
يقترح زيادة MAX_BLOCK_UNITS إلى 100,000,000.
ثوابت ميزانية التنفيذ
الثوابت التالية من
execution_budget.rs
تحدد حدود وقت التشغيل أثناء تنفيذ المعاملة:
| الثابت | القيمة | الوصف |
|---|---|---|
MAX_COMPUTE_UNIT_LIMIT | 1,400,000 | الحد الأقصى لوحدات الحساب لكل معاملة |
DEFAULT_INSTRUCTION_COMPUTE_UNIT_LIMIT | 200,000 | وحدات الحساب الافتراضية لكل تعليمة غير مدمجة |
MAX_BUILTIN_ALLOCATION_COMPUTE_UNIT_LIMIT | 3,000 | وحدات الحساب الافتراضية لكل تعليمة مدمجة (SIMD-0170) |
DEFAULT_HEAP_COST | 8 وحدات حساب | التكلفة لكل صفحة ذاكرة مؤقتة بحجم 32 كيلوبايت |
DEFAULT_INVOCATION_COST | 1,000 وحدة حساب | تكلفة استدعاء CPI واحد |
INVOKE_UNITS_COST_SIMD_0339 | 946 وحدة حساب | تكلفة استدعاء CPI مع SIMD-0339 |
MIN_HEAP_FRAME_BYTES | 32,768 | الحد الأدنى لحجم الذاكرة المؤقتة (32 كيلوبايت) |
MAX_HEAP_FRAME_BYTES | 262,144 | الحد الأقصى لحجم الذاكرة المؤقتة (256 كيلوبايت) |
MAX_LOADED_ACCOUNTS_DATA_SIZE_BYTES | 67,108,864 | الحد الأقصى لبيانات الحساب المحملة لكل معاملة (64 ميجابايت) |
MAX_INSTRUCTION_STACK_DEPTH | 5 | الحد الأقصى لعمق مكدس التعليمات (المستوى الأعلى + CPIs) |
MAX_INSTRUCTION_STACK_DEPTH_SIMD_0268 | 9 | الحد الأقصى لعمق مكدس التعليمات (المستوى الأعلى + CPIs) مع SIMD-0268 |
MAX_CALL_DEPTH | 64 | الحد الأقصى لعمق استدعاء SBF-to-SBF داخل البرنامج |
STACK_FRAME_SIZE | 4,096 بايت | حجم إطار مكدس SBF واحد |
Is this page helpful?