وثائق سولاناتطوير البرامج

القيود

تطوير البرامج على بلوكتشين سولانا يحتوي على بعض القيود المتأصلة المرتبطة بها. فيما يلي قائمة بالقيود الشائعة التي قد تواجهها.

مكتبات Rust

نظرًا لأن برامج Rust التي تعمل على السلسلة يجب أن تكون حتمية أثناء تشغيلها في بيئة محدودة الموارد وأحادية المسار، فإنها تواجه بعض القيود على مختلف المكتبات.

تدعم برامج Rust التي تعمل على السلسلة معظم مكتبات Rust مثل libstd وlibcore وliballoc، بالإضافة إلى العديد من المكتبات الخارجية.

هناك بعض القيود لأن هذه البرامج تعمل في بيئة محدودة الموارد وأحادية المسار، بالإضافة إلى كونها حتمية:

  • لا يمكن الوصول إلى
    • rand
    • std::fs
    • std::net
    • std::future
    • std::process
    • std::sync
    • std::task
    • std::thread
    • std::time
  • وصول محدود إلى:
    • std::hash
    • std::os
  • Bincode مكلف للغاية من حيث الدورات وعمق الاستدعاء ويجب تجنبه
  • يجب تجنب تنسيق السلاسل النصية لأنه أيضًا مكلف من الناحية الحسابية.
  • لا يوجد دعم لـ println! وprint!، استخدم msg! بدلاً من ذلك.
  • تفرض بيئة التشغيل حدًا على عدد التعليمات التي يمكن للبرنامج تنفيذها أثناء معالجة تعليمة واحدة. انظر ميزانية الحوسبة لمزيد من المعلومات.

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

لمنع إساءة استخدام موارد الحوسبة في البلوكتشين، يتم تخصيص ميزانية حوسبة لكل معاملة. تجاوز ميزانية الحوسبة هذه سيؤدي إلى فشل المعاملة.

راجع وثائق قيود الحوسبة لمزيد من التفاصيل المحددة.

عمق مكدس الاستدعاء - خطأ CallDepthExceeded

برامج سولانا مقيدة بالتشغيل السريع، ولتسهيل ذلك، يتم تقييد عمق مكدس استدعاء البرنامج إلى 64 إطارًا كحد أقصى.

عندما يتجاوز البرنامج حد عمق مكدس الاستدعاء المسموح به، سيتلقى خطأ CallDepthExceeded

عمق استدعاء CPI - خطأ CallDepth

تسمح الاستدعاءات بين البرامج (Cross-program invocations) للبرامج باستدعاء برامج أخرى مباشرة، ولكن العمق مقيد حاليًا بـ 4

عندما يتجاوز البرنامج عمق استدعاء بين البرامج المسموح به، سيتلقى خطأ CallDepth

دعم أنواع Float في Rust

تدعم البرامج مجموعة فرعية محدودة من عمليات الفاصلة العائمة (float) في Rust. إذا حاول البرنامج استخدام عملية فاصلة عائمة غير مدعومة، فسيبلغ وقت التشغيل عن خطأ رمز غير محلول.

يتم تنفيذ عمليات الفاصلة العائمة عبر مكتبات برمجية، وتحديداً الوظائف المدمجة للفاصلة العائمة في LLVM. نظرًا لأنها تُنفذ برمجيًا، فإنها تستهلك وحدات حوسبة أكثر من عمليات الأعداد الصحيحة. بشكل عام، يوصى باستخدام عمليات النقطة الثابتة حيثما أمكن ذلك.

ستقوم اختبارات مكتبة الرياضيات في Solana Program Library بالإبلاغ عن أداء بعض العمليات الرياضية. لتشغيل الاختبار، قم بمزامنة المستودع وتشغيل:

cargo test-sbf -- --nocapture --test-threads=1

تظهر النتائج الحديثة أن عمليات الفاصلة العائمة تستغرق تعليمات أكثر مقارنة بمكافئاتها من الأعداد الصحيحة. قد تختلف تطبيقات النقطة الثابتة ولكنها ستكون أيضًا أقل من مكافئات الفاصلة العائمة:

u64 f32
Multiply 8 176
Divide 9 219

البيانات القابلة للكتابة الثابتة

لا تدعم الكائنات المشتركة للبرنامج البيانات المشتركة القابلة للكتابة. تتم مشاركة البرامج بين عمليات تنفيذ متوازية متعددة باستخدام نفس الشفرة والبيانات المشتركة للقراءة فقط. هذا يعني أنه لا ينبغي للمطورين تضمين أي متغيرات ثابتة قابلة للكتابة أو متغيرات عامة في البرامج. في المستقبل، يمكن إضافة آلية النسخ عند الكتابة لدعم البيانات القابلة للكتابة.

القسمة الموقعة

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

Is this page helpful?

جدول المحتويات

تعديل الصفحة