تخطٍ إلى المحتوى الرئيسي

المبادئ التوجيهية الأمنية للعقود الذكية

Solidity
العقود الذكيه
الأمن
المستوى المتوسط
Trailofbits
6 سبتمبر 2020
4 دقيقة قراءة

اتبع هذه التوصيات عالية المستوى لبناء عقود ذكية أكثر أمانًا.

إرشادات التصميم

يجب مناقشة تصميم العقد مسبقًا، قبل كتابة أي سطر من التعليمات البرمجية.

التوثيق والمواصفات

يمكن كتابة التوثيق على مستويات مختلفة، ويجب تحديثه أثناء تنفيذ العقود:

  • وصف بسيط باللغة الإنجليزية للنظام، يصف ما تفعله العقود وأي افتراضات بشأن قاعدة التعليمات البرمجية.
  • المخططات والرسوم البيانية المعمارية، بما في ذلك تفاعلات العقود وآلة الحالة للنظام. يمكن أن تساعد طابعات سليذر (opens in a new tab) في إنشاء هذه المخططات.
  • توثيق شامل للتعليمات البرمجية، يمكن استخدام تنسيق Natspec (opens in a new tab) لـ سوليديتي.

الحوسبة على السلسلة مقابل الحوسبة خارج السلسلة

  • احتفظ بأكبر قدر ممكن من التعليمات البرمجية خارج السلسلة. أبقِ الطبقة الموجودة على السلسلة صغيرة. عالج البيانات مسبقًا باستخدام التعليمات البرمجية خارج السلسلة بطريقة تجعل التحقق على السلسلة بسيطًا. هل تحتاج إلى قائمة مرتبة؟ قم بفرز القائمة خارج السلسلة، ثم تحقق فقط من الطلب الموجود عليها.

القابلية للترقية

ناقشنا حلول القابلية للترقية المختلفة في تدوينتنا (opens in a new tab). قم باختيار متعمد لدعم قابلية الترقية أو عدمها قبل كتابة أي رمز. سيؤثر القرار على كيفية هيكلة تعليماتك البرمجية. بشكل عام، نوصي بما يلي:

  • تفضيل ترحيل العقود (opens in a new tab) على القابلية للترقية. تتمتع أنظمة الترحيل بالعديد من المزايا نفسها التي تتمتع بها الأنظمة القابلة للترقية، دون عيوبها.
  • استخدام نمط فصل البيانات بدلاً من نمط delegatecallproxy. إذا كان مشروعك يتمتع بفصل تجريدي واضح، فإن القابلية للترقية باستخدام فصل البيانات ستتطلب تعديلات قليلة فقط. يتطلب وكيل Delecutcall خبرة EVM وهو عرضة للخطأ بشكل كبير.
  • وثِّق إجراء الترحيل/الترقية قبل النشر. إذا اضطررت إلى التفاعل تحت الضغط دون أي إرشادات، فسوف ترتكب أخطاء. اكتب الإجراء الذي يجب اتباعه مسبقًا. يجب أن تشمل:
    • المكالمات التي تبدأ العقود الجديدة
    • أين يتم تخزين المفاتيح وكيفية الوصول إليها
    • كيفية التحقق من النشر! تطوير واختبار البرنامج النصي بعد النشر.

إرشادات التنفيذ

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

تكوين الوظائف

يجب أن تجعل بنية قاعدة التعليمات البرمجية الخاصة بك من السهل مراجعة التعليمات البرمجية الخاصة بك. تجنب الاختيارات المعمارية التي تقلل من القدرة على التفكير في صحتها.

  • قسِّم منطق نظامك، إما من خلال عقود متعددة أو عن طريق تجميع الوظائف المتشابهة معًا (على سبيل المثال، المصادقة، الحساب،...).
  • اكتب وظائف صغيرة ذات غرض واضح. سيسهل هذا المراجعة ويسمح باختبار المكونات الفردية.

الوراثة

  • اجعل الوراثة قابلة للإدارة. يجب استخدام الوراثة لتقسيم المنطق، ولكن يجب أن يهدف مشروعك إلى تقليل عمق وعرض شجرة الوراثة.
  • استخدم طابعة الوراثة (opens in a new tab) الخاصة بـ سليذر للتحقق من التسلسل الهرمي للعقود. ستساعدك طابعة الوراثة في مراجعة حجم التسلسل الهرمي.

الأحداث

  • سجِّل جميع العمليات الحاسمة. ستساعد الأحداث في تصحيح أخطاء العقد أثناء التطوير، ومراقبته بعد النشر.

تجنب المزالق المعروفة

التبعيات

  • استخدم مكتبات مجرَّبة جيدًا. سيقلل استيراد التعليمات البرمجية من المكتبات المجربة جيدًا من احتمالية كتابة تعليمات برمجية معيبة. إذا كنت تريد كتابة عقد ERC20، فاستخدم أوبن زبلين (opens in a new tab).
  • استخدم مدير تبعيات؛ وتجنب نسخ ولصق التعليمات البرمجية. إذا كنت تعتمد على مصدر خارجي، فيجب عليك إبقاؤه محدثًا مع المصدر الأصلي.

الاختبار والتحقق

  • اكتب اختبارات وحدة شاملة. تعد مجموعة الاختبارات الشاملة أمرًا بالغ الأهمية لبناء برمجيات عالية الجودة.
  • اكتب عمليات فحص وخصائص مخصصة لـ سليذر (opens in a new tab) وإيكيدنا (opens in a new tab) ومانتيكور (opens in a new tab). ستساعد الأدوات الآلية في ضمان أمان عقدك. قم بمراجعة بقية هذا الدليل لمعرفة كيفية كتابة الشيكات والخصائص الفعالة.
  • استخدم crytic.io (opens in a new tab). يتكامل كريتيك مع غيت هاب، ويوفر الوصول إلى كاشفات سليذر الخاصة، ويجري عمليات فحص الخصائص المخصصة من إيكيدنا.

سوليديتي

  • فضِّل سوليديتي 0.5 على 0.4 و 0.6. في رأينا، يُعد سوليديتي 0.5 أكثر أمانًا ويتمتع بممارسات مدمجة أفضل من 0.4. لقد أثبت سوليديتي 0.6 أنه غير مستقر للغاية بالنسبة للإنتاج ويحتاج إلى وقت حتى ينضج.
  • استخدم إصدارًا مستقرًا للتجميع؛ استخدم أحدث إصدار للتحقق من التحذيرات. تحقق من أن تعليماتك البرمجية لا تحتوي على أي مشكلات مبلغ عنها في أحدث إصدار للمترجم. ومع ذلك، يتمتع سوليديتي بدورة إصدار سريعة ولديه تاريخ من أخطاء المترجم، لذلك لا نوصي بأحدث إصدار للنشر (راجع توصية إصدار solc من سليذر (opens in a new tab)).
  • لا تستخدم التجميع المضمن. يتطلب التجميع خبرة في آلة إيثريوم الافتراضية (EVM). لا تكتب تعليمات برمجية لـ EVM إذا لم تكن قد أتقنت الورقة الصفراء.

إرشادات النشر

بمجرد تطوير العقد ونشره:

  • راقب عقودك. شاهد السجلات، وكن مستعدًا للتصرف في حالة اختراق العقد أو المحفظة.
  • أضف معلومات الاتصال الخاصة بك إلى blockchain-security-contacts (opens in a new tab). تساعد هذه القائمة الأطراف الخارجية على الاتصال بك في حالة اكتشاف ثغرة أمنية.
  • أمِّن محافظ المستخدمين المميزين. اتبع أفضل ممارساتنا (opens in a new tab) إذا كنت تخزن المفاتيح في محافظ الأجهزة.
  • ضع خطة للاستجابة للحوادث. ضع في اعتبارك أن عقودك الذكية يمكن أن تتعرض للخطر. حتى لو كانت عقودك خالية من الأخطاء، فقد يتحكم أحد المهاجمين في مفاتيح مالك العقد.

آخر تحديث للصفحة: 30 سبتمبر 2025

هل كانت تعليمات الاستخدام هذه مفيدة؟