التحقق من العقود الذكية
صُممت العقود الذكية لتكون "منزوعة الثقة"، مما يعني أنه لا ينبغي للمستخدمين أن يضطروا إلى الوثوق بأطراف ثالثة (مثل المطورين والشركات) قبل التفاعل مع أي عقد. وكشرط أساسي لانعدام الحاجة للثقة، يجب أن يكون المستخدمون والمطورون الآخرون قادرين على التحقق من كود المصدر للعقد الذكي. يضمن التحقق من كود المصدر للمستخدمين والمطورين أن كود العقد المنشور هو نفس الكود الذي يعمل على عنوان العقد على سلسلة الكتل لإيثيريوم.
من المهم التمييز بين "التحقق من كود المصدر" و"التحقق الشكلي". يشير التحقق من كود المصدر، والذي سيتم شرحه بالتفصيل أدناه، إلى التحقق من أن كود المصدر المعطى لعقد ذكي بلغة عالية المستوى (مثل Solidity) يتم تصريفه إلى نفس رمز البايت الذي سيتم تنفيذه على عنوان العقد. ومع ذلك، يصف التحقق الشكلي التحقق من صحة العقد الذكي، مما يعني أن العقد يتصرف كما هو متوقع. على الرغم من أن الأمر يعتمد على السياق، إلا أن التحقق من العقد يشير عادةً إلى التحقق من كود المصدر.
ما هو التحقق من كود المصدر؟
قبل نشر عقد ذكي في آلة إيثيريوم الافتراضية (EVM)، يقوم المطورون بتصريف كود المصدر للعقد — وهي تعليمات مكتوبة بلغة Solidity أو لغة برمجة أخرى عالية المستوى — إلى رمز البايت. نظرًا لأن آلة إيثيريوم الافتراضية (EVM) لا يمكنها تفسير التعليمات عالية المستوى، فإن تصريف كود المصدر إلى رمز البايت (أي تعليمات الآلة منخفضة المستوى) ضروري لتنفيذ منطق العقد في آلة إيثيريوم الافتراضية.
التحقق من كود المصدر هو مقارنة كود المصدر للعقد الذكي ورمز البايت المُصرف المستخدم أثناء إنشاء العقد لاكتشاف أي اختلافات. التحقق من العقود الذكية مهم لأن كود العقد المُعلن عنه قد يكون مختلفًا عما يعمل على سلسلة الكتل.
يتيح التحقق من العقد الذكي التحقيق في ما يفعله العقد من خلال اللغة عالية المستوى المكتوب بها، دون الحاجة إلى قراءة كود الآلة. تظل الدوال والقيم، وعادةً أسماء المتغيرات والتعليقات، كما هي مع كود المصدر الأصلي الذي يتم تصريفه ونشره. هذا يجعل قراءة الكود أسهل بكثير. يوفر التحقق من المصدر أيضًا إمكانية توثيق الكود، بحيث يعرف المستخدمون النهائيون ما صُمم العقد الذكي للقيام به.
ما هو التحقق الكامل؟
هناك بعض الأجزاء من كود المصدر التي لا تؤثر على رمز البايت المُصرف مثل التعليقات أو أسماء المتغيرات. هذا يعني أن كودي مصدر بأسماء متغيرات مختلفة وتعليقات مختلفة سيكونان قادرين على التحقق من نفس العقد. وبناءً على ذلك، يمكن لجهة خبيثة إضافة تعليقات خادعة أو إعطاء أسماء متغيرات مضللة داخل كود المصدر والحصول على عقد تم التحقق منه بكود مصدر مختلف عن كود المصدر الأصلي.
من الممكن تجنب ذلك عن طريق إلحاق بيانات إضافية برمز البايت لتكون بمثابة ضمان تشفيري لدقة كود المصدر، وكـ بصمة لمعلومات التصريف. توجد المعلومات الضرورية في البيانات الوصفية لعقد Solidity (opens in a new tab)، ويتم إلحاق تجزئة هذا الملف برمز البايت للعقد. يمكنك رؤية ذلك عمليًا في ساحة لعب البيانات الوصفية (opens in a new tab)
يحتوي ملف البيانات الوصفية على معلومات حول تصريف العقد بما في ذلك ملفات المصدر وتجزئاتها. بمعنى، إذا تغيرت أي من إعدادات التصريف أو حتى بايت واحد في أحد ملفات المصدر، فإن ملف البيانات الوصفية يتغير. وبالتالي تتغير أيضًا تجزئة ملف البيانات الوصفية، والتي يتم إلحاقها برمز البايت. هذا يعني أنه إذا تطابق رمز البايت للعقد + تجزئة البيانات الوصفية الملحقة مع كود المصدر وإعدادات التصريف المعطاة، فيمكننا التأكد من أن هذا هو بالضبط نفس كود المصدر المستخدم في التصريف الأصلي، ولا يختلف حتى بايت واحد.
يُشار إلى هذا النوع من التحقق الذي يستفيد من تجزئة البيانات الوصفية باسم "التحقق الكامل (opens in a new tab)" (أو "التحقق المثالي"). إذا لم تتطابق تجزئات البيانات الوصفية أو لم يتم أخذها في الاعتبار في التحقق، فسيكون ذلك "تطابقًا جزئيًا"، وهو حاليًا الطريقة الأكثر شيوعًا للتحقق من العقود. من الممكن إدراج كود خبيث (opens in a new tab) لن ينعكس في كود المصدر الذي تم التحقق منه بدون التحقق الكامل. معظم المطورين ليسوا على دراية بالتحقق الكامل ولا يحتفظون بملف البيانات الوصفية لتصريفهم، ومن هنا كان التحقق الجزئي هو الطريقة الفعلية للتحقق من العقود حتى الآن.
لماذا يعد التحقق من كود المصدر مهمًا؟
انعدام الحاجة للثقة
يمكن القول إن انعدام الحاجة للثقة هو الفرضية الأكبر للعقود الذكية والتطبيقات اللامركزية (dapps). العقود الذكية "غير قابلة للتغيير" ولا يمكن تعديلها؛ سينفذ العقد فقط منطق العمل المحدد في الكود وقت النشر. هذا يعني أن المطورين والشركات لا يمكنهم التلاعب بكود العقد بعد نشره على إيثيريوم.
لكي يكون العقد الذكي منزوع الثقة، يجب أن يكون كود العقد متاحًا للتحقق المستقل. في حين أن رمز البايت المُصرف لكل عقد ذكي متاح للجمهور على سلسلة الكتل، إلا أن اللغة منخفضة المستوى يصعب فهمها — لكل من المطورين والمستخدمين.
تقلل المشاريع من افتراضات الثقة عن طريق نشر كود المصدر لعقودها. لكن هذا يؤدي إلى مشكلة أخرى: من الصعب التحقق من أن كود المصدر المنشور يتطابق مع رمز البايت للعقد. في هذا السيناريو، تُفقد قيمة انعدام الحاجة للثقة لأن المستخدمين يضطرون إلى الوثوق بالمطورين لعدم تغيير منطق عمل العقد (أي عن طريق تغيير رمز البايت) قبل نشره على سلسلة الكتل.
توفر أدوات التحقق من كود المصدر ضمانات بأن ملفات كود المصدر للعقد الذكي تتطابق مع كود التجميع. والنتيجة هي نظام بيئي منزوع الثقة، حيث لا يثق المستخدمون ثقة عمياء بأطراف ثالثة وبدلاً من ذلك يتحققون من الكود قبل إيداع الأموال في العقد.
سلامة المستخدم
مع العقود الذكية، عادة ما يكون هناك الكثير من الأموال على المحك. وهذا يتطلب ضمانات أمنية أعلى والتحقق من منطق العقد الذكي قبل استخدامه. تكمن المشكلة في أن المطورين عديمي الضمير يمكنهم خداع المستخدمين عن طريق إدراج كود خبيث في العقد الذكي. بدون التحقق، يمكن أن تحتوي العقود الذكية الخبيثة على أبواب خلفية (opens in a new tab)، وآليات تحكم في الوصول مثيرة للجدل، ونقاط ضعف قابلة للاستغلال، وأشياء أخرى تعرض سلامة المستخدم للخطر والتي قد تمر دون أن يلاحظها أحد.
نشر ملفات كود المصدر للعقد الذكي يسهل على المهتمين، مثل المدققين، تقييم العقد بحثًا عن نواقل الهجوم المحتملة. مع قيام أطراف متعددة بالتحقق بشكل مستقل من العقد الذكي، يحصل المستخدمون على ضمانات أقوى لأمانه.
كيفية التحقق من كود المصدر للعقود الذكية على إيثيريوم
يتطلب نشر عقد ذكي على إيثيريوم إرسال معاملة مع حمولة بيانات (رمز البايت المُصرف) إلى عنوان خاص. يتم إنشاء حمولة البيانات عن طريق تصريف كود المصدر، بالإضافة إلى وسائط المُنشئ (opens in a new tab) لنسخة العقد الملحقة بحمولة البيانات في المعاملة. التصريف حتمي، مما يعني أنه ينتج دائمًا نفس المخرجات (أي رمز البايت للعقد) إذا تم استخدام نفس ملفات المصدر، وإعدادات التصريف (مثل إصدار المُصرف، والمُحسّن).
يتضمن التحقق من العقد الذكي بشكل أساسي الخطوات التالية:
-
إدخال ملفات المصدر وإعدادات التصريف إلى المُصرف.
-
يُخرج المُصرف رمز البايت للعقد.
-
الحصول على رمز البايت للعقد المنشور على عنوان معين.
-
مقارنة رمز البايت المنشور مع رمز البايت المُعاد تصريفه. إذا تطابقت الأكواد، يتم التحقق من العقد باستخدام كود المصدر وإعدادات التصريف المعطاة.
-
بالإضافة إلى ذلك، إذا تطابقت تجزئات البيانات الوصفية في نهاية رمز البايت، فسيكون ذلك تطابقًا كاملاً.
لاحظ أن هذا وصف مبسط للتحقق وهناك العديد من الاستثناءات التي لن تنجح مع هذا مثل وجود متغيرات غير قابلة للتغيير (opens in a new tab).
أدوات التحقق من كود المصدر
يمكن أن تكون العملية التقليدية للتحقق من العقود معقدة. ولهذا السبب لدينا أدوات للتحقق من كود المصدر للعقود الذكية المنشورة على إيثيريوم. تعمل هذه الأدوات على أتمتة أجزاء كبيرة من التحقق من كود المصدر وتقوم أيضًا بتنظيم العقود التي تم التحقق منها لصالح المستخدمين.
Etherscan
على الرغم من أنه يُعرف في الغالب بأنه مستكشف كتل إيثيريوم، إلا أن Etherscan يقدم أيضًا خدمة التحقق من كود المصدر (opens in a new tab) لمطوري ومستخدمي العقود الذكية.
يتيح لك Etherscan إعادة تصريف رمز البايت للعقد من حمولة البيانات الأصلية (كود المصدر، عنوان المكتبة، إعدادات المُصرف، عنوان العقد، إلخ). إذا كان رمز البايت المُعاد تصريفه مرتبطًا برمز البايت (ومعلمات المُنشئ) للعقد على السلسلة، فسيتم التحقق من العقد (opens in a new tab).
بمجرد التحقق منه، يتلقى كود المصدر لعقدك علامة "تم التحقق منه" (Verified) ويتم نشره على Etherscan ليقوم الآخرون بتدقيقه. كما تتم إضافته إلى قسم العقود التي تم التحقق منها (opens in a new tab) — وهو مستودع للعقود الذكية ذات أكواد المصدر التي تم التحقق منها.
يعد Etherscan الأداة الأكثر استخدامًا للتحقق من العقود. ومع ذلك، فإن التحقق من العقود في Etherscan له عيب: فهو يفشل في مقارنة تجزئة البيانات الوصفية لرمز البايت على السلسلة ورمز البايت المُعاد تصريفه. لذلك فإن التطابقات في Etherscan هي تطابقات جزئية.
المزيد حول التحقق من العقود على Etherscan (opens in a new tab).
Blockscout
Blockscout (opens in a new tab) هو مستكشف كتل مفتوح المصدر يوفر أيضًا خدمة التحقق من العقود (opens in a new tab) لمطوري ومستخدمي العقود الذكية. كبديل مفتوح المصدر، يوفر Blockscout الشفافية في كيفية إجراء التحقق ويتيح مساهمات المجتمع لتحسين عملية التحقق.
على غرار خدمات التحقق الأخرى، يتيح لك Blockscout التحقق من كود المصدر لعقدك عن طريق إعادة تصريف رمز البايت ومقارنته بالعقد المنشور. بمجرد التحقق منه، يتلقى عقدك حالة التحقق ويصبح كود المصدر متاحًا للجمهور للتدقيق والتفاعل. يتم أيضًا إدراج العقود التي تم التحقق منها في مستودع العقود التي تم التحقق منها (opens in a new tab) الخاص بـ Blockscout لسهولة التصفح والاكتشاف.
Sourcify
Sourcify (opens in a new tab) هي أداة أخرى للتحقق من العقود وهي مفتوحة المصدر ولامركزية. إنها ليست مستكشف كتل وتقوم فقط بالتحقق من العقود على شبكات مختلفة قائمة على آلة إيثيريوم الافتراضية (EVM) (opens in a new tab). تعمل كبنية تحتية عامة للأدوات الأخرى للبناء عليها، وتهدف إلى تمكين تفاعلات عقود أكثر ملاءمة للبشر باستخدام ABI وتعليقات NatSpec (opens in a new tab) الموجودة في ملف البيانات الوصفية.
على عكس Etherscan، يدعم Sourcify التطابقات الكاملة مع تجزئة البيانات الوصفية. يتم تقديم العقود التي تم التحقق منها في مستودعها العام (opens in a new tab) على HTTP وIPFS (opens in a new tab)، وهو تخزين لامركزي موجه بالمحتوى (opens in a new tab). يتيح ذلك جلب ملف البيانات الوصفية لعقد عبر IPFS نظرًا لأن تجزئة البيانات الوصفية الملحقة هي تجزئة IPFS.
بالإضافة إلى ذلك، يمكن للمرء أيضًا استرداد ملفات كود المصدر عبر IPFS، حيث توجد تجزئات IPFS لهذه الملفات أيضًا في البيانات الوصفية. يمكن التحقق من العقد من خلال توفير ملف البيانات الوصفية وملفات المصدر عبر واجهة برمجة التطبيقات (API) الخاصة به أو واجهة المستخدم (UI) (opens in a new tab)، أو باستخدام المكونات الإضافية. تستمع أداة مراقبة Sourcify أيضًا إلى إنشاءات العقود على الكتل الجديدة وتحاول التحقق من العقود إذا تم نشر بياناتها الوصفية وملفات المصدر الخاصة بها على IPFS.
المزيد حول التحقق من العقود على Sourcify (opens in a new tab).
Tenderly
تُمكّن منصة Tenderly (opens in a new tab) مطوري Web3 من بناء واختبار ومراقبة وتشغيل العقود الذكية. من خلال الجمع بين أدوات تصحيح الأخطاء وقابلية الملاحظة ولبنات بناء البنية التحتية، تساعد Tenderly المطورين على تسريع تطوير العقود الذكية. لتمكين ميزات Tenderly بالكامل، يحتاج المطورون إلى إجراء التحقق من كود المصدر (opens in a new tab) باستخدام عدة طرق.
من الممكن التحقق من العقد بشكل خاص أو عام. إذا تم التحقق منه بشكل خاص، فسيكون العقد الذكي مرئيًا لك فقط (وللأعضاء الآخرين في مشروعك). التحقق من العقد بشكل عام يجعله مرئيًا لكل من يستخدم منصة Tenderly.
يمكنك التحقق من عقودك باستخدام لوحة التحكم (opens in a new tab)، أو المكون الإضافي Tenderly Hardhat (opens in a new tab)، أو واجهة سطر الأوامر (CLI) (opens in a new tab).
عند التحقق من العقود من خلال لوحة التحكم، تحتاج إلى استيراد ملف المصدر أو ملف البيانات الوصفية الذي تم إنشاؤه بواسطة مُصرف Solidity، والعنوان/الشبكة، وإعدادات المُصرف.
يتيح استخدام المكون الإضافي Tenderly Hardhat مزيدًا من التحكم في عملية التحقق بجهد أقل، مما يتيح لك الاختيار بين التحقق التلقائي (بدون كود) واليدوي (القائم على الكود).
