---
title: "⁦التحقق من العقود الذكية⁩"
description: "⁦نظرة عامة على التحقق من كود المصدر للعقود الذكية على إيثيريوم⁩"
lang: ar
---

صُممت [العقود الذكية](/developers/docs/smart-contracts/) لتكون "منزوعة الثقة"، مما يعني أنه لا ينبغي للمستخدمين أن يضطروا إلى الوثوق بأطراف ثالثة (مثل المطورين والشركات) قبل التفاعل مع أي عقد. وكشرط أساسي لانعدام الحاجة للثقة، يجب أن يكون المستخدمون والمطورون الآخرون قادرين على التحقق من كود المصدر للعقد الذكي. يضمن التحقق من كود المصدر للمستخدمين والمطورين أن كود العقد المنشور هو نفس الكود الذي يعمل على عنوان العقد على سلسلة الكتل لإيثيريوم.

من المهم التمييز بين "التحقق من كود المصدر" و"[التحقق الشكلي](/developers/docs/smart-contracts/formal-verification/)". يشير التحقق من كود المصدر، والذي سيتم شرحه بالتفصيل أدناه، إلى التحقق من أن كود المصدر المعطى لعقد ذكي بلغة عالية المستوى (مثل <span dir="ltr">Solidity</span>) يتم تصريفه إلى نفس رمز البايت الذي سيتم تنفيذه على عنوان العقد. ومع ذلك، يصف التحقق الشكلي التحقق من صحة العقد الذكي، مما يعني أن العقد يتصرف كما هو متوقع. على الرغم من أن الأمر يعتمد على السياق، إلا أن التحقق من العقد يشير عادةً إلى التحقق من كود المصدر.

## ما هو التحقق من كود المصدر؟ {#what-is-source-code-verification}

قبل نشر عقد ذكي في [آلة إيثيريوم الافتراضية (<span dir="ltr">EVM</span>)](/developers/docs/evm/)، يقوم المطورون [بتصريف](/developers/docs/smart-contracts/compiling/) كود المصدر للعقد — وهي تعليمات [مكتوبة بلغة <span dir="ltr">Solidity</span>](/developers/docs/smart-contracts/languages/) أو لغة برمجة أخرى عالية المستوى — إلى رمز البايت. نظرًا لأن آلة إيثيريوم الافتراضية (<span dir="ltr">EVM</span>) لا يمكنها تفسير التعليمات عالية المستوى، فإن تصريف كود المصدر إلى رمز البايت (أي تعليمات الآلة منخفضة المستوى) ضروري لتنفيذ منطق العقد في آلة إيثيريوم الافتراضية.

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

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

### ما هو التحقق الكامل؟ {#full-verification}

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

من الممكن تجنب ذلك عن طريق إلحاق بيانات إضافية برمز البايت لتكون بمثابة _ضمان تشفيري_ لدقة كود المصدر، وكـ _بصمة_ لمعلومات التصريف. توجد المعلومات الضرورية في [البيانات الوصفية لعقد <span dir="ltr">Solidity</span>](https://docs.soliditylang.org/en/v0.8.15/metadata.html)، ويتم إلحاق تجزئة هذا الملف برمز البايت للعقد. يمكنك رؤية ذلك عمليًا في [ساحة لعب البيانات الوصفية](https://playground.sourcify.dev)

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

يُشار إلى هذا النوع من التحقق الذي يستفيد من تجزئة البيانات الوصفية باسم **"[التحقق الكامل](https://docs.sourcify.dev/docs/full-vs-partial-match/)"** (أو "التحقق المثالي"). إذا لم تتطابق تجزئات البيانات الوصفية أو لم يتم أخذها في الاعتبار في التحقق، فسيكون ذلك "تطابقًا جزئيًا"، وهو حاليًا الطريقة الأكثر شيوعًا للتحقق من العقود. من الممكن [إدراج كود خبيث](https://samczsun.com/hiding-in-plain-sight/) لن ينعكس في كود المصدر الذي تم التحقق منه بدون التحقق الكامل. معظم المطورين ليسوا على دراية بالتحقق الكامل ولا يحتفظون بملف البيانات الوصفية لتصريفهم، ومن هنا كان التحقق الجزئي هو الطريقة الفعلية للتحقق من العقود حتى الآن.

## لماذا يعد التحقق من كود المصدر مهمًا؟ {#importance-of-source-code-verification}

### انعدام الحاجة للثقة {#trustlessness}

يمكن القول إن انعدام الحاجة للثقة هو الفرضية الأكبر للعقود الذكية و[التطبيقات اللامركزية (<span dir="ltr">dapps</span>)](/developers/docs/dapps/). العقود الذكية "غير قابلة للتغيير" ولا يمكن تعديلها؛ سينفذ العقد فقط منطق العمل المحدد في الكود وقت النشر. هذا يعني أن المطورين والشركات لا يمكنهم التلاعب بكود العقد بعد نشره على إيثيريوم.

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

تقلل المشاريع من افتراضات الثقة عن طريق نشر كود المصدر لعقودها. لكن هذا يؤدي إلى مشكلة أخرى: من الصعب التحقق من أن كود المصدر المنشور يتطابق مع رمز البايت للعقد. في هذا السيناريو، تُفقد قيمة انعدام الحاجة للثقة لأن المستخدمين يضطرون إلى الوثوق بالمطورين لعدم تغيير منطق عمل العقد (أي عن طريق تغيير رمز البايت) قبل نشره على سلسلة الكتل.

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

### سلامة المستخدم {#user-safety}

مع العقود الذكية، عادة ما يكون هناك الكثير من الأموال على المحك. وهذا يتطلب ضمانات أمنية أعلى والتحقق من منطق العقد الذكي قبل استخدامه. تكمن المشكلة في أن المطورين عديمي الضمير يمكنهم خداع المستخدمين عن طريق إدراج كود خبيث في العقد الذكي. بدون التحقق، يمكن أن تحتوي العقود الذكية الخبيثة على [أبواب خلفية](https://www.trustnodes.com/2018/11/10/concerns-rise-over-backdoored-smart-contracts)، وآليات تحكم في الوصول مثيرة للجدل، ونقاط ضعف قابلة للاستغلال، وأشياء أخرى تعرض سلامة المستخدم للخطر والتي قد تمر دون أن يلاحظها أحد.

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

## كيفية التحقق من كود المصدر للعقود الذكية على إيثيريوم {#source-code-verification-for-ethereum-smart-contracts}

يتطلب [نشر عقد ذكي على إيثيريوم](/developers/docs/smart-contracts/deploying/) إرسال معاملة مع حمولة بيانات (رمز البايت المُصرف) إلى عنوان خاص. يتم إنشاء حمولة البيانات عن طريق تصريف كود المصدر، بالإضافة إلى [وسائط المُنشئ](https://docs.soliditylang.org/en/v0.8.14/contracts.html#constructor) لنسخة العقد الملحقة بحمولة البيانات في المعاملة. التصريف حتمي، مما يعني أنه ينتج دائمًا نفس المخرجات (أي رمز البايت للعقد) إذا تم استخدام نفس ملفات المصدر، وإعدادات التصريف (مثل إصدار المُصرف، والمُحسّن).

![A diagram showing showing smart contract source code verification](./source-code-verification.png)

يتضمن التحقق من العقد الذكي بشكل أساسي الخطوات التالية:

1. إدخال ملفات المصدر وإعدادات التصريف إلى المُصرف.

2. يُخرج المُصرف رمز البايت للعقد.

3. الحصول على رمز البايت للعقد المنشور على عنوان معين.

4. مقارنة رمز البايت المنشور مع رمز البايت المُعاد تصريفه. إذا تطابقت الأكواد، يتم التحقق من العقد باستخدام كود المصدر وإعدادات التصريف المعطاة.

5. بالإضافة إلى ذلك، إذا تطابقت تجزئات البيانات الوصفية في نهاية رمز البايت، فسيكون ذلك تطابقًا كاملاً.

لاحظ أن هذا وصف مبسط للتحقق وهناك العديد من الاستثناءات التي لن تنجح مع هذا مثل وجود [متغيرات غير قابلة للتغيير](https://docs.sourcify.dev/docs/immutables/).

## أدوات التحقق من كود المصدر {#source-code-verification-tools}

يمكن أن تكون العملية التقليدية للتحقق من العقود معقدة. ولهذا السبب لدينا أدوات للتحقق من كود المصدر للعقود الذكية المنشورة على إيثيريوم. تعمل هذه الأدوات على أتمتة أجزاء كبيرة من التحقق من كود المصدر وتقوم أيضًا بتنظيم العقود التي تم التحقق منها لصالح المستخدمين.

### <span dir="ltr">Etherscan</span> {#etherscan}

على الرغم من أنه يُعرف في الغالب بأنه [مستكشف كتل إيثيريوم](/developers/docs/data-and-analytics/block-explorers/)، إلا أن <span dir="ltr">Etherscan</span> يقدم أيضًا [خدمة التحقق من كود المصدر](https://etherscan.io/verifyContract) لمطوري ومستخدمي العقود الذكية.

يتيح لك <span dir="ltr">Etherscan</span> إعادة تصريف رمز البايت للعقد من حمولة البيانات الأصلية (كود المصدر، عنوان المكتبة، إعدادات المُصرف، عنوان العقد، إلخ). إذا كان رمز البايت المُعاد تصريفه مرتبطًا برمز البايت (ومعلمات المُنشئ) للعقد على السلسلة، فسيتم [التحقق من العقد](https://info.etherscan.com/types-of-contract-verification/).

بمجرد التحقق منه، يتلقى كود المصدر لعقدك علامة "تم التحقق منه" (<span dir="ltr">Verified</span>) ويتم نشره على <span dir="ltr">Etherscan</span> ليقوم الآخرون بتدقيقه. كما تتم إضافته إلى قسم [العقود التي تم التحقق منها](https://etherscan.io/contractsVerified/) — وهو مستودع للعقود الذكية ذات أكواد المصدر التي تم التحقق منها.

يعد <span dir="ltr">Etherscan</span> الأداة الأكثر استخدامًا للتحقق من العقود. ومع ذلك، فإن التحقق من العقود في <span dir="ltr">Etherscan</span> له عيب: فهو يفشل في مقارنة **تجزئة البيانات الوصفية** لرمز البايت على السلسلة ورمز البايت المُعاد تصريفه. لذلك فإن التطابقات في <span dir="ltr">Etherscan</span> هي تطابقات جزئية.

[المزيد حول التحقق من العقود على <span dir="ltr">Etherscan</span>](https://medium.com/etherscan-blog/verifying-contracts-on-etherscan-f995ab772327).

### <span dir="ltr">Blockscout</span> {#blockscout}

[<span dir="ltr">Blockscout</span>](https://blockscout.com/) هو مستكشف كتل مفتوح المصدر يوفر أيضًا [خدمة التحقق من العقود](https://eth.blockscout.com/contract-verification) لمطوري ومستخدمي العقود الذكية. كبديل مفتوح المصدر، يوفر <span dir="ltr">Blockscout</span> الشفافية في كيفية إجراء التحقق ويتيح مساهمات المجتمع لتحسين عملية التحقق.

على غرار خدمات التحقق الأخرى، يتيح لك <span dir="ltr">Blockscout</span> التحقق من كود المصدر لعقدك عن طريق إعادة تصريف رمز البايت ومقارنته بالعقد المنشور. بمجرد التحقق منه، يتلقى عقدك حالة التحقق ويصبح كود المصدر متاحًا للجمهور للتدقيق والتفاعل. يتم أيضًا إدراج العقود التي تم التحقق منها في [مستودع العقود التي تم التحقق منها](https://eth.blockscout.com/verified-contracts) الخاص بـ <span dir="ltr">Blockscout</span> لسهولة التصفح والاكتشاف.

### <span dir="ltr">Sourcify</span> {#sourcify}

[<span dir="ltr">Sourcify</span>](https://sourcify.dev/#/verifier) هي أداة أخرى للتحقق من العقود وهي مفتوحة المصدر ولامركزية. إنها ليست مستكشف كتل وتقوم فقط بالتحقق من العقود على [شبكات مختلفة قائمة على آلة إيثيريوم الافتراضية (<span dir="ltr">EVM</span>)](https://docs.sourcify.dev/docs/chains). تعمل كبنية تحتية عامة للأدوات الأخرى للبناء عليها، وتهدف إلى تمكين تفاعلات عقود أكثر ملاءمة للبشر باستخدام [<span dir="ltr">ABI</span>](/developers/docs/smart-contracts/compiling/#web-applications) وتعليقات [<span dir="ltr">NatSpec</span>](https://docs.soliditylang.org/en/v0.8.15/natspec-format.html) الموجودة في ملف البيانات الوصفية.

على عكس <span dir="ltr">Etherscan</span>، يدعم <span dir="ltr">Sourcify</span> التطابقات الكاملة مع تجزئة البيانات الوصفية. يتم تقديم العقود التي تم التحقق منها في [مستودعها العام](https://docs.sourcify.dev/docs/repository/) على <span dir="ltr">HTTP</span> و[<span dir="ltr">IPFS</span>](https://docs.ipfs.io/concepts/what-is-ipfs/#what-is-ipfs)، وهو تخزين لامركزي [موجه بالمحتوى](https://docs.storacha.network/concepts/content-addressing/). يتيح ذلك جلب ملف البيانات الوصفية لعقد عبر <span dir="ltr">IPFS</span> نظرًا لأن تجزئة البيانات الوصفية الملحقة هي تجزئة <span dir="ltr">IPFS</span>.

بالإضافة إلى ذلك، يمكن للمرء أيضًا استرداد ملفات كود المصدر عبر <span dir="ltr">IPFS</span>، حيث توجد تجزئات <span dir="ltr">IPFS</span> لهذه الملفات أيضًا في البيانات الوصفية. يمكن التحقق من العقد من خلال توفير ملف البيانات الوصفية وملفات المصدر عبر واجهة برمجة التطبيقات (<span dir="ltr">API</span>) الخاصة به أو [واجهة المستخدم (<span dir="ltr">UI</span>)](https://sourcify.dev/#/verifier)، أو باستخدام المكونات الإضافية. تستمع أداة مراقبة <span dir="ltr">Sourcify</span> أيضًا إلى إنشاءات العقود على الكتل الجديدة وتحاول التحقق من العقود إذا تم نشر بياناتها الوصفية وملفات المصدر الخاصة بها على <span dir="ltr">IPFS</span>.

[المزيد حول التحقق من العقود على <span dir="ltr">Sourcify</span>](https://soliditylang.org/blog/2020/06/25/sourcify-faq/).

### <span dir="ltr">Tenderly</span> {#tenderly}

تُمكّن [منصة <span dir="ltr">Tenderly</span>](https://tenderly.co/) مطوري <span dir="ltr">Web3</span> من بناء واختبار ومراقبة وتشغيل العقود الذكية. من خلال الجمع بين أدوات تصحيح الأخطاء وقابلية الملاحظة ولبنات بناء البنية التحتية، تساعد <span dir="ltr">Tenderly</span> المطورين على تسريع تطوير العقود الذكية. لتمكين ميزات <span dir="ltr">Tenderly</span> بالكامل، يحتاج المطورون إلى [إجراء التحقق من كود المصدر](https://docs.tenderly.co/monitoring/contract-verification) باستخدام عدة طرق.

من الممكن التحقق من العقد بشكل خاص أو عام. إذا تم التحقق منه بشكل خاص، فسيكون العقد الذكي مرئيًا لك فقط (وللأعضاء الآخرين في مشروعك). التحقق من العقد بشكل عام يجعله مرئيًا لكل من يستخدم منصة <span dir="ltr">Tenderly</span>.

يمكنك التحقق من عقودك باستخدام [لوحة التحكم](https://docs.tenderly.co/contract-verification)، أو [المكون الإضافي <span dir="ltr">Tenderly Hardhat</span>](https://docs.tenderly.co/contract-verification/hardhat)، أو [واجهة سطر الأوامر (<span dir="ltr">CLI</span>)](https://docs.tenderly.co/monitoring/smart-contract-verification/verifying-contracts-using-cli).

عند التحقق من العقود من خلال لوحة التحكم، تحتاج إلى استيراد ملف المصدر أو ملف البيانات الوصفية الذي تم إنشاؤه بواسطة مُصرف <span dir="ltr">Solidity</span>، والعنوان/الشبكة، وإعدادات المُصرف.

يتيح استخدام المكون الإضافي <span dir="ltr">Tenderly Hardhat</span> مزيدًا من التحكم في عملية التحقق بجهد أقل، مما يتيح لك الاختيار بين التحقق التلقائي (بدون كود) واليدوي (القائم على الكود).

## قراءة إضافية {#further-reading}

- [التحقق من كود مصدر العقد](https://programtheblockchain.com/posts/2018/01/16/verifying-contract-source-code/)