برمجة عقد ذكي على سلسلة كتل إيثيريوم باستخدام سوليديتي Solidity

المؤلف: عمر الصنهاجي الغازي *
*مهندس في المعلوميات و الرياضيات التطبيقية، مدير مشاريع و مهتم بميدان الذكاء الاصطناعي و سلاسل الكتل
صفحة لنكد إن

آخر تحديث: Oct. 27, 2022, 5:52 p.m.

سوف نرى في هذا المقال كيفية برمجة أول عقد ذكي (Smart Contract) على شبكة إيثيريوم Ethereum باستخدام لغة البرمجة "سوليديتي" (Solidity) (سنأخذ كمثال برمجة عقد ذكي من أجل جمع تبرعات لجمعية خيرية)



الحمد لله و الصلاة و السلام على رسول الله و آله و صحبه و من والاه

سنقوم في هذا الدرس ببرمجة أول عقد ذكي و نشره على شبكة الإيثيريوم
لذلك سنقوم إن شاء الله بالخطوات التالية:
- إنشاء محفظة على "ميتاماسك"
- تزويد المحفظة بكمية من عملة الإيثير الاختبارية (من أجل القيام باختبارات فقط، لن نستخدم عملة الإيثير الحقيقية لأنها سوف تكلفنا أموالا حقيقية)
- برمجة العقد الذكي
- اختباره في بيئة الاختبار المحلية
- و بعد ذلك اختباره في شبكة الاختبار على الإنترنيت
- و بعد انتهاء هذا الاختبار الأخير، سوف يكون بإمكاننا نشر العقد الذكي على شبكة الإيثيريوم الحقيقية إن أردنا ذلك

إنشاء محفظة على ميتاماسك:
ندخل على موقع: metamask.io
قم بتحميل إضافة "ميتاماسك" على متصفح كروم:


و بعد ذلك قم بإنشاء حساب على ميتاماسك






قم بعد ذلك بالاحتفاظ في مكان أمين بلائحة الكلمات السرية المتعلقة بحسابك (إذا فقدتها فلن تستطيع أبدا أن تسترجع حسابك إذا ما فقدته، كما أنه إذا اطلع أحد غيرك على لائحة الكلمات السرية، فيستطيع أن يسرق كل ما يوجد في محفظتك من العملات الرقمية)
قم الآن بنسخ عنوان محفظتك (على شكل رمز سداسي عشري)




تزويد المحفظة بكمية من عملة الإيثير الاختبارية :
سوف نقوم باستخدام عملة إيثير اختبارية فقط على شبكة كورلي (Goerli) الاختبارية (و لن نستخدم عملة الإيثير الحقيقية التي تكلفنا أموالا حقيقية)، لذلك سوف نذهب إلى الرابط التالي من أجل تزويد محفظتنا بهذه العملة الاختبارية: goerlifaucet.com
قم الآن بإلصاق عنوان محفظتك، ليتم بتزويدك بكمية 0.1 من عملة إيثير الاختبارية على شبكة كورلي الاختبارية



نلاحظ أن محفظتك الآن أصبح مزودة ب0.1 إيثير اختباري على شبكة التدريب كورلي




تذكير بمفهوم "العقود الذكية" :


ما هي العقود الذكية ؟
العقود الذكية، هي برامج معلوماتية يتم برمجتها ثم نشرها في سلسلة الكتل
الهدف من العقود الذكية هو إنشاء نوع جديد من العقود موزع عبر سلسلة الكتل، لا يخضع لأية رقابة مركزية و لا يمكن تزويره أو تغيير محتواه بدون احترام مقتدى العقد كما هو مبرمج
العقد الذكي يحتوي على مكونين:
المكون الأول هو لائحة "السمات"، و هي متغيرات و ثابتات يتم تخزينها في سلسة الكتل
المكون الثاني هو لائحة ال"وظائف"، و هي تؤدي وظائف يحددها مبرمج العقد الذكي
سوف نأخذ مثالا لعقد ذكي بسيط، يقوم مثلا بجمع أموال للتبرعات لجمعية خيرية
لائحة السمات في هذه الحالة ستكون:
المبلغ الكلي للتبرعات
لائحة المساهمين، مع المبلغ الذي تبرع به كل مساهم
تاريخ الأجل الأقصى لاستقبال التبرعات
و لائحة الوظائف سوف تكون:
وظيفة التبرع: التي تقوم بإرسال المبلغ الذي يحدده المساهم من حسابه نحو حساب العقد الذكي
وظيفة إرسال المبلغ من حساب العقد الذكي نحو حساب الجمعية الخيرية، بعد انتهاء الأجل الأقصى لجمع التبرعات


بعد برمجة العقد الذكي، يقوم صاحب العقد بنشره عبر شبكة سلسلة الكتل، و يتم توزيعه على الحواسيب المكونة للشبكة


و بعد ذلك، عندما يقوم أي متبرع بإرسال مبلغ للعقد الذكي، عبر وظيفة التبرع، يتم تسجيل هذه العملية في سلسلة الكتل و توزيع تسجيلها على جميع الحواسيب، و يتم كذلك نقص المبلغ المتبرع به من حساب المتبرِع و إضافته لحساب العقد الذكي
و عندما تنتهي التبرعات و يقوم صاحب العقد الذكي بإرسال المبلغ المجموع إلى حساب الجمعية الخيرية عبر وظيفة "إرسال المبلغ"، يتم كذلك تسجيل هذه العملية في سلسلة الكتل و نسخها في جميع الحواسيب المكونة للشبكة


برمجة العقد الذكي :
من أجل برمجة العقد الذكي، سوف نذهب إلى بيئة البرمجة الجاهزة "رميكس" (Remix IDE)
remix.ethereum.org

البرمجة في ريميكس تتم عن طريق لغة سوليديتي (Solidity) المبنية على لغة جافاسكريبت (JavaScript)



نقوم الآن بإنشاء برنامج جديد، نسميه contract.sol
و نضيف إليه السمات التي نحتاجها:



لائحة (mapping) تسجل مفتاح و قيمة لكل متبرع:
المفتاح هو عنوان محفظة التبرع
القيمة هي قيمة التبرع
mapping(address => uint) public contributors

عنوان محفظة مدير الحملة (أنت) الذي سوف يقوم بنشر العقد الذكي على سلسلة الكتل لأول مرة
address public admin

المبلغ الكلي المتبرع به من طرف المتبرعين
uint public raisedAmount

عنوان محفظة الجمعية الخيرية التي سوف تستفيد من التبرعات
نلاحظ أننا أضفنا الكلمة المفتاحية (payable) للعنوان، من أجل إعلانه كعنوان قابل لتلقي تحويلات مالية بعملة الإثير
address payable public receiver


متغير لتسجيل حالة حملة التبرع (هل لا زالت مفتوحة، أم تم إقفالها)
bool completed

الآن سوف نقوم برمجة وظيفة الإنشاء التي يتم المناداة عليها عند نشر العقد الذكي لأول مرة

عند إنشاء العقد الذكي، يتم تحديد الأجل الأقصى لجمع التبرعات و يتم تحديد العنوان الذي يقوم بنشر العقد الذكي (msg.sender) بوصفه هو مدير هذا العقد، و كذلك يتم تحديد عنوان محفظة الجمعية الخيرية التي سوف تتلقى التبرعات عند إنتهاء الحملة
نقوم الآن بإنشاء وظيفة التبرع، التي تمكن المتبرعين من المساهمة في صندوق التبرع:

نلاحظ أننا نضع كشرط إلزامي قبل تنفيذ الوظيفة (بواسطة الكلمة المفتاحية "require") ألا نتجاوز الأجل الأقصى للتبرع
و إذا لم يحترم هذا الشرط، يتم إظهار رسالة خطأ، بدون تنفيذ التبرع

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

نقوم الآن بإضافة وظيفة عرض قيمة مجموع التبرعات التي تم التوصل بها لحد الآن، لكي يتمكن كل شخص بمعرفة المبلغ الكلي الذي تم جمعه لحد الآن


ثم في الأخير نقوم بإضافة وظيفة لإرسام المبلغ الكلي المجموع في آخر الحملة، إلى عنوان محفظة الجمعية الخيرية
و نقوم بعد ذلك بإقفال الحملة (completed = true)
نلاحظ أننا نضع أمرين إلزاميين لتنفيذ وظيفة إرسال المبلغ: أولا أن الوحيد الذي يملنه تنفيذ هذه الوظيفة هو مدير الحملة (أنت) و الثاني هو أن تكون الحملة لا زالت غير مقفلة (إذا كنا قد تبرعنا من قبل بالمبلغ للجمعية، يمنعنا هذا الاستلزام من أن نرسل المبلغ مرتين)




لقد انتهينا الآن من برمجة العقد الذكي
نقوم الآن بتجميع مصدر البرنامج


اختبار العقد الذكي في بيئة الاختبار المحلية:
سنقوم الآن بنشر العقد الذكي في بيئة الاختبار المحلية (ريميكس يوفر لنا آلة افتراضية مباشرة داخل متصفح كروم للقيام بالاختبارات الأولية للعقد الذكي)
نختار بيئة الاختبار المحلية (Remix VM London) و نختار حسابا من الحسابات المقترحة (عنوان + محفظة تحتوي على 100 إثير افتراضي و ليس حقيقي)
(GAS LIMIT) هو الكمية القصوى للعملة (بوحدة الواي ، 1 إثير = 1000000000000000000 واي (WEI)، 18 صفرا بعد الواحد !) التي يمكن استهلاكها في تنفيذ العملية و توزيعها على سلسلة الكتل
ثم نحدد بعد ذلك عنوان حساب الجمعية الخيرية، و كذلك المدة القصوى لصلاحية العقد الذكي (بالثواني)


نختار المدة القصوى تساوي 86400 ثانية (أي يوم واحد)
و نختار عنوان المحفظة الثانية المقترحة من طرف بيئة الاختبار المحلية كعنوان للجمعية الخيرية
و نقوم بنشر العقد الذكي


بعد نشر العقد الذكي في بيئة الاختبار المحلية، نلاحظ أن محفظة الإثير تناقصت ببضعة أجزاء من الإثير (ثمن تنفيذ العملية في سلسلة الكتل)


كما نلاحظ أن ريميكس يقوم بتزويدنا الآن بأزرار لعرض قيمة كل سمة من سمات العقد الذكي، و كذلك لتنفيذ الوظائف التي تم برمجتها.
الأزرار بالأزرق هي العمليات التي يتم تنفيذها بالمجان (لا تحتاج إلى كتابة بيانات على سلسلة الكتل, بل فقط عرض المعلومات المسجلة)
الأزرار بالبرتقالي هي الأزرار التي تغير بيانات سلسلة الكتل و تستنفذ كمية من العملة في حال تنفيذها
أما الأزرار بالأحمر، فهي إضافة إلى أنها تغير بيانات سلسلة الكتل و تستفذ كمية من العملة في حال تنفيذها، فإنها كذلك تستخدم في إرسال كمية من عملة الإثير من حساب إلى آخر (اللون الأحمر هو للتنبيه)


الآن سوف نقوم بالتبرع بمبلغ من أحد حسابات الاختبار في البيئة المحلية لرميكس، نحو حساب العقد الذكي:


بعد الضغط على زر التبرع، نلاحظ التغييرات التالية التي وقعت على حساب المتبرع + على حساب العقد الذكي أيضا:


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


نقوم الآن أيضا بإرسال تبرعات أخرى من لائحة حسابات رميكس المحلية، إلى أن نصل إلى كمية 50 إيثير من التبرعات في المجموع:


حساب العقد الذكي بعد التبرعات، و قف وصل إلى مبلغ 50 إيثير:


الآن سوف نحاول إرسال المبلغ المجموع إلى الجمعية الخيرية
لنستخدم حسابا غير حساب مدير الحملة الذي قام بنشر القعد الذكي، و نرى ماذا سيحدث
حساب العقد الذكي بعد التبرعات، و قف وصل إلى مبلغ 50 إيثير:


النتيجة هي أن العملية تم رفضها ! و هذا ما كنا ننتظره، لأنه للتذكير، قمنا بوضع استلزام داخل وظيفة إرسال المبلغ بأن حساب مدير الحملة (الأدمن) الذي نشر العقد الذكي، هو الوحيد الذي بإمكانه إرسال المبلغ المجموع إلى الجمعية


الآن لنقم بإرسال المبلغ للجمعية الخيرية، باستخدام حساب الأدمن الذي نشر العقد الذكي


نلاحظ أن حساب الجمعية الخيرية توصل بمبلغ 50 إيثر بنجاح، حيث أنه كان يتوفر على 100 إيثر في البداية، و الآن بعد التبرع، أصبح يتوفر على 150 إيثر


الآن تم إقفال عملية جمع التبرعات و إرسالها إلى الجمعية الخيرية بنجاح. سوف نحاول الآن بالتبرع مرة أخرى للعقد الذكي من خلال حساب ما، و سوف نواجه رسالة خطأ لأن العقد الذكي برمجناه على أساس أن يتم إقفاله (completed = true) بعد إرسال المبلغ للجمعية


انتهينا من برمجة و اختبار العقد الذكي في البيئة المحلية التي يوفرها رميكس.
نستطيع الآن أن نقوم بنشر و اختبار العقد على سلسلة الكتل الاختبارية (كورلي)، و هي كما قلنا سلسلة كتل تستعمل في الاختبار و التدريب فقط، و لا ينجم عن استخدامها تكلفة مالية حقيقية

أول شيء: سنقوم بتفعيل محفظة ميتاماسك، مع اختيار شبكة اختبار "كورلي"


و نتأكبد بعد ذلك أن الحساب متصل (لكي نتستخدمه مباشرة عبر رميكس)


الآن سوف نختار في ريمكس بيئة اختبار ميتاماسك (التي فعلنا فيها سلسة كتل "كورلي" الاختبارية)، و سوف نختار حسابنا على ميتاماسك الذي يحتوي على كمية من عملة الإثير الاختبارية على "كورلي" (تساوي 0.1 إثير قمنا بإضافتها في أول هذا الدرس)


نستطيع الآن نشر العقد الذكي على سلسلة الكتل الاختبارية "كورلي":


نلاحظ أن نافذة ميتاماسك تنفتح تلقائيا، لتطلب منا تأكيد نشر هذا العقد الذكي على سلسلة كتل "كورلي" الاختبارية، و تعطينا تقديرا لكمية الغاز (كمية العملة) التي سيتم استهلاكها من حسابنا على ميتاماسك في عملية نشر العقد الذكي و تسجيله على سلسلة الكتل


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


ندخل الآن على رابط موقع إيثيرسكان المسجل على رميكس في الأسفل على اليمين. موقع إيثيرسكان هو موقع يمكنك من تتبع جميع العمليات المسجلة على سلسلات كتل الإيثيريوم العمومية


الآن يمكننا الرجوع إلى رميكس، و اختبار وظائف العقد الذكي على سلسلة كتل "كورلي" بنفس الطريقة التي قمنا بها باختبار الوظائف على بيئة اختبار رميكس المحلية


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

نرجو منكم التوقف في هذا الدرس على الاختبار في سلسلة الكتل الاختبارية (Goerli)، و عدم نشر العقد الذكي على سلسلة الكتل الحقيقية (Ethereum Mainnet) و شكرا


حمل مصدر برنامج هذا العقد الذكي بلغة سوليديتي (Solidity)

نتمنى أن يكون هذا الدرس نال إعجابكم و ساعدكم على الإلمام بكيفية برمجة العقود الذكية و نشرها على سلسلة كتل الإيثيريوم، و على أمل لقياكم في مقال آخر بإذن الله

الرجوع إلى الصفحة الرئيسية