تحدثنا في المقال السابق عن كيفية التعامل مع البلوك تشين برمجياً
سنتحدث اليوم عن كيفية كتابة العقود الذكية على شبكة نِير. عند الانتهاء من هذه المقالة ستكون قادراً على مايلي:
- شرح معنى العقود الذكية (Smart Contracts).
- كتابة عقد ذكي – سمارت كونتراكت- اعتماداً على بنية برمجية معدّة سابقاً تسمى (Starter Code) وهي عبارة عن مجموعه من الإعدادات المسبقة التي تستخدمها للبدء بكتابة برنامجك.
- كيفية نشر العقد الذكي على شبكة البلوك تشين (Blockchain) وكيفية نداء التوابع الموجودة ضمنه من أجل الحصول على نتائج.
هذا المقال متاح أيضاً فى صورة فيديو يمكنك مشاهدته من خلال الرابط
لنبدأ معاً :
ما هو العقد الذكي (Smart Contract)
كأبسط تعريف يمكننا القول بأنه برنامج أو كود يعمل على البلوك تشين وهو مخزن على البلوك تشين أيضاَ. هذا الكود يمكننك التعامل معه إما من خلال عمل واجهة للتطبيق(frontend) تتخاطب مع هذا العقد وتقوم بعمل استدعاءات للتوابع الموجودة فيه. أو من خلال برمجة أحداث معينة خارجياً تقوم بتنفيذ الاستدعاءات المطلوبة من هذا العقد الذكي.
ذكرنا سابقاً بأن العقود الذكية تعتبر القلب الأساسي للبلوك تشين.
في الصورة التالية التي تحدثنا عنها سابقاً
ذكرنا بأنه عند بناء تطبيق لامركزي (dApp) فإن الواجهة الأمامية للتطبيق ستتحدث مباشرة مع العقد الذكي والذي يمثل الباك إيند (Back end ) الخاص بتطبيقك مع طبقة البيانات. يمكنك الرجوع إلى المقالة التالية من أجل معلومات أكثر.
العقود الذكية على شبكة نِير (NEAR) :
ذكرنا سابقاً أننا سنتعلم كتابة العقود الذكية على شبكة نِير (NEAR).
- هذه الشبكة تتيح لنا كتابة العقود الذكية باستخدام لغتي البرمجة : أسيمبلي سكريبت (Assembly Script) وراست (Rust) . من الممكن أن تدعم لغات أخرى مستقبلاً ولكن هذا هو المذكور حتى تاريخ اليوم.
- هذا العقد سيتم تحويل (Compile) التعليمات فيه إلى ملف بلغة الويب أسيمبلي (wasm). وهي عبارة عن شكل محدد يتم تحويل الكود البرمجي إليه ليتم التعامل معه على الآلة الافتراضية (virtual machine) الخاصة بهذه البلوك تشين.
- سنتحدث عن كتابة العقود باستخدام لغة أسيمبلي سكريبت (Assembly Script على اعتبار أنها أبسط ولأسهل للتعلم وأقرب للغة الجافا سكريبت (Java Script) و التايب سكريبت (Type Script).
كتابة العقد الذكي Hello World على شبكة نِير:
المثال الذي سنعمل عليه هو Hello World وهو المثال التقليدي الذي نبدأ به عندما نتعلم أي لغة برمجية جديدة. سيحتوي هذا المثال على تابع وحيد عند استدعائه فإنه يعطي النتيجة الموضحة بالصورة التالية:
لنبدأ معاً:
المتطلبات الأساسية:
قبل البدء بكتابة أي كود دعنا نتأكد من وجود الأدوات التالية على جهازك.
- Node js
- Near-cli
- Yarn نظام إدارة الحزم
- نظام إدارة الإصدارات GIT الذي سيستخدم لنسخ الأكواد منه والتحديث عليها
- محرر أكود برمجية مثل Vs code
للتحقق من وجود هذه الأدوات في الجهاز نفتج واجهة سطر الأوامر command line interface لدينا ونكتب التعليمات التالية
➜ ~ node --version
v14.17.6
➜ ~ yarn --version
1.22.17
➜ ~ near --version
3.1.0
➜ ~ git --version
git version 2.25.1
في حال عدم وجود نظام إدارة الحزم (Yarn) يمكنك تنصيبه باستخدام التعليمة التالية:
npm install -g yarn
البدء بالتطبيق:
نقوم بعمل نسخ (Clone) للمشروع الخاص بنا من (Git) على الرابط التالي ونختار خيار (Copy Url) :
بعدذلك نختار مكان فارغ على جهاز الحاسب لدينا وبالضغط على الزر الأيمن للفأرة نختار (Git bash) تفتح لنا واجهة أوامر جديدة خاصة ب(Git bash) وهذه الواجهة لها استخدامات مفيدة في أوقات عديدة. ضمن هذه الواجهة نقوم بتنفيذ النسخ للرابط الذي حفظناه سابقاً باستخام الأمر التالي:
Git clone https://github.com/nearinarabic/near-hello-world-as.git
بعد تنفيذ الأمر السابق ننتقل إلى المجلد الخاص به باستخدام الأمر التالي:
Cd near-hello-world-as
ولفتح هذا المجلد ضمن محرر الكود فيجوال استديو ننفذ الأمر التالي:
Code .
الصورة التالية توضح بنية المجلد بعد فتحه باستخدام فيجول استديو :
لنتحدث قليلاً عن محتويات هذا المجلد:
-
- يحتوي المجلد على مجلد أخر يسمى assembly والذي يحتوي بدوره على ملفات الكود الذي سنكتبه بلغة الأسمبلي سكريبت وله لاحقة (TS) في الصورة التالية نستعرض محتويات هذا الملف المسمى (index.ts)
- كما يوجد مجلد آخر اسمه (tests) وهو سيحتوي على الملفات الخاص بفحص صحة الأكواد المكتوبة ضمن مجلد ال assembly
- كما يوجد ضمن مجلد المشروع ملف اسمه (package.json) والذي يحتوي على جميع المعلومات الخاصة بحزم (NPM) المستخدمة في المشروع كما يمكن كتابة سكريبت scripts لتنفيذ الأوامر بسرعة ضمن البرنامج.
هذه هي أهم المعلومات عن المجلد الاساسي للمشروع الذي قمنا بنسخة من الGit إلى جهازنا.
شرح العقد الذكي (Smart Contract) المكتوب لدينا:
كما ذكرنا سابقاً فإن مجلد ال assembly يحتوي على ملف (index.ts) الذي
بدوره يمثل محتويات العقد الذكي. لنلقي نظرة متمعنة بمحتوياته :
//"
تقوم
هذه الفنكشن بإرجاع القيمة "مرحبا من عالم البلوك تشين sayhello export function sayHello(): string { return "hello from the blockchain world!"; }
يحتوي الكود على تابع واحد اسمه sayHello وهذا التابع لا يأخد أي متغير كدخل له ويعيد جملة (hello from the blockchain world!) عند تنفيذه. هذا هو أبسط سمارت كونتراكت ممكن أن تصادفه فهو لا يتعامل مع الذاكرة ولا يطلب أي دخل ولا يقوم بأي عمليات داخله. بما أننا لا نقوم هنا بشرح كل الخصائص الممكنة للعقد الذكي وإنما نكتفي بأبسط مثال لنتابع مراحل كتابة عقد ذكي حتى نشره ومشاهدة النتائج على البلوك تشين.
بناء Build ونشر deploy العقد الذكي:
حتى نتمكن من نشر deploy العقد على الشبكة نحتاج لبناءه Build أولا لعمل ذلك من خيارات محرر الأكواد نختار طرفية جديدة new terminal ونبدأ بتنفيذ الخطوات التالية:
-
- ننفد الأمر yarn والذي يقوم بتنزيل جميع الحزم المذكورة ضمن ملف (package.json) في حال حصلت على الخطأ التالي :
- إن هذا الخطأ متعلق بتنفيذ هذا الأمر للمرةالأولى على هذا الجهاز ولحل هذا الخطأ نقوم بقتح برنامج windows PowerShell كمسؤول ثم تنفذ الأمر التالي:
Set-ExecutionPolicy Unrestricted
.
بعد تنفيذه يعطيك خيار تختار all ثم نعود إلى الترمينال في فيجوال استديو و ننفذ الأمر السابق Yarn فنلاحظ أن الخطأ قد انتهى وبدأ بتنزيل الحزم الموجود في ملف (package.json). يمكننا ملاحظة أنه قد قام بتنزيل حزمة near-sdk-as وهي اأداة الخاصة من NEAR لكتابة أكواد بلغة الأسيمبلي. كما نلاحظ أنه قام بتنزيل حزمة الاسيمبلي كود و حزمة as-pect الخاصة بفحص الأكواد. يمكن ملاحظة أنه تمت إضافة مجلد آخر إلى بنية المشروع اسمه node_modules ويحتوي على معلومات تفصيلية عن الحزم المستخدمة
- بناء المشروع build بتنفيذ الأمر التالي:
yarn build
بعد تنفيذ الأمر السابق نلاحظ أنه تمت إضافة مجلد جديد اسمه build إلى المجلد الأصلي هذا المجلد يحتوي على ملف المشروع المحول إلى لغة الويب أسيمبلي (WASM) وهو الملف الذينقوم بنشره على البلوك تشين.
3.نشر الكود deploy على البلوك تشين (Blockchain) باستخدام الأمر التالي :
near dev-deploy .\build\debug\helloworld.wasm
عند نجاح هذا الأمر نحصل على النتيجة التالية في التيرمنال ويكون الكود تم نشره على البلوك تشين:
Transaction Id HJn4EygzvWMjHw8tHUrrhVjFp29fbWyR7aQB6s1jCogV
To see the transaction in the transaction explorer, please open this url in your browser
https://explorer.testnet.near.org/transactions/HJn4EygzvWMjHw8tHUrrhVjFp29fbWyR7aQB6s1jCogV
Done deploying to dev-1645708202723-84672080649588
هذا الأمر قام بعدة عمليات فأولا قام بإنشاء حساب مطور (dev-1645708202723-84672080649588) على شبكة testnet لنِير NEAR. ذكرنا سابقاً عندما تكلمنا عن أنواع الحسابات على نِير NEAR أنه يوجد حسابات يتم إنشاءها بأهداف محددة هذا الحساب هو أحد هذه الحسابات. ثانياً قام بنشر الكود الخاص بالعقد الذكي على هذا الحساب أيضاً.
يمكنك التحقق من حالة هذا الحساب باستخدام الأمر التالي:
near state dev-1645708202723-84672080649588
وسنحصل على النتيجة التالية:
{
amount: '199999921801101228600000000',
block_hash: '51BSVtAkx4UCF9r8GLUPjMdgpLEYccpCHkA8UvzUsf3U',
block_height: 83591502,
code_hash: 'CbK851PrWypS7CfosLb9BwBrHhNHMD4HZA9ENYWyoFHQ',
locked: '0',
storage_paid_at: 0,
storage_usage: 15325,
formattedAmount: '199.9999218011012286'
}
يمكننا ملاحظة أن الكود هاش code_hash يحتوي على أرقام مختلفة عن سلسلة من الواحدات 11111111 وهذا يعني أنه تم نشر عقد ذكي على هذا الحساب.
متابعة العقد الذكي على البلوك تشين
من نتيجة الأمر المنفذ سابقاً
نلاحظ أنه يوجد رابط للمعاملة transaction التي تمت عند نشر العقد الذكي لو ضغطنا على الرابط الموجود في التيرمنال
https://explorer.testnet.near.org/transactions/HJn4EygzvWMjHw8tHUrrhVjFp29fbWyR7aQB6s1jCogV
لأمكننا رؤية النتييجة على مستعرض شبكة نِير NEAR explorer يمكنك الضغط على الرابط الموجود أيضاً هذه هي النتيجة على المستعلاض كما هو موضح في الصورة التالية:
يمكن ملاحظة من الصورة السابقة تحت كلمة Actions أن الفعل الممثل بهذه العملية هو نشر العقد الذكي (Smart contract deployemnet). كما أن الموقع لهذا العقد هو الحساب المنشأ عند تنفيذ أمر النشر يوجد الموقع للعقد في أعلى المستعرض تحت كلمة Signed By. لو ضغطنا على هذا الحساب لانتقلنا إلى الصفحة الخاصة بالحساب التي ستستعرض كل المعاملات التي تمت على هذا الحساب في الصورة التالية نستطيع مشاهدة تاريخ إنشاء هذا الحساب
وأنه تمت إضافة 200 نِير توكين لهذاالحساب عند إنشاء على testnet

تنفيذ العمليات الموجودة على العقد الذكي Smart contract
للتأكد من صحة العمليات الموجودة على العقد الذكي سنقوم من التيرمنال terminal الخاصة بفيجوال استديو باستدعاد التابع (method) الموجود فيه وهي sayHello لاستدعاء هذا التابع ننفذ الأمر التالي:
near view dev-1645708202723-84672080649588 sayHello
وسنحصل على النتيجة التالية والتي تحوي الرسالة التي يعيدها ذلك التابع.
Doing account.functionCall()
Transaction Id BU35qjTCmg7B2hXHaDtv5UN5r8Qbtq2hmr2R5ZV4tM5s
To see the transaction in the transaction explorer, please open this url in your browser
https://explorer.testnet.near.org/transactions/BU35qjTCmg7B2hXHaDtv5UN5r8Qbtq2hmr2R5ZV4tM5s
'hello from the blockchain world!'
تهانينا تمكنا من كتابة وتنفيذ ونشر أول عقد ذكي لنا smart contract على البلوك تشين.
خطوات إضافية:
تمكنا من نسخ كود من GitHub Repository واكتشفنا بنية(Structure) المجلد الأساسية الضرورية لكتابة عقد ذكي smart contract بلغة الأسيمبلي سكريب كذلك قمنا ببناء ونشر هذا العقد والتأكد من حصولنا على الرسالة الصحيحة.
كخطوة إضافية يمكنك التعديل على الرسالة التي يعيدها التابع وإعادة بناء ونشر العقد الذكي والتأكد من صحة تنفيذك للخطوات.
الملخص:
تعرفنا في هذه المقالة على معنى العقد الذكي Smart Contract. كما نعرفنا على اللغات المتاحة حالياً لكتابة هذه العقود على شبكة نِير NEAR إما أسيمبلي سكريب أو راست (Rust). ثم انتقلنا إلى كيفية تنفيذ عقد ذكي انطلاقاً من كود موجود سابقاً هذه الطريقة حالياً متبعة كثيراً حيث يعطيك المطور كود مبدأي يحتوي على البينية الرئيسية التي تحتاجها للكتابة ثم تقوم بالتعديل عليها حسب الحاجة. ممكن تعديل هذه البنية من حيث الترتيب حسب رغبة الشخص ولكننا قمنا باختيار أبسط طريقة ممكنة. وأخيراً تعلمنا كيف نبني وننشر العقد الذكي على البلوك تشين حيث بدأنا بتنفيذ yarn لتنزيل الحزم الضرورية ثم قمنا ببناء العقد الذكي باستخدام yarn build والذي يقوم بانشاء مجلد ال build الذي يحتوي بدوره على الملف المحول للغلة الويب اسميبلي والذي سيستخدم لنشر العقد الذكي على الشبكة.
بعد هذه الخطوات يمكنك تصفح المزيد من المشاريع أو يمكنك التعديل على الكود الموجود لديك بإضافة توابع تحتاج للمتغيرات (Variables) كدخل وتغيير الرسالة. ومن ثم إعادة تنفيذ الدورة لبناء العقد الجديد. من المؤكد ستواجه تساؤلات عديدة لا تنسى بكتابتها لنا لنجيبك عليها.
يمكنك الآن التسجيل في أول كورس للحصول على شهادة مطور نير معتمد باللغة العربية من خلال هذا الرابط