تحدثنا في المقال السابق عن الفرق بين طريقتى استدعاء الدوال view vs call فى البلوك تشين
تحدثنا سابقاً عن تطبيق ال hello world وقمنا بكتابة وظيفة واحدة عندما نقوم باستدعائها فإنها تعيد لك سلسلة من الأحرف string ممثلة بعبارة helloworld .
من خلال ذلك المثال تعرفنا على الدورة الخاصة لتطوير وكتابة العقد الذكي حتى الوصول إلى نشره واستخدامه. والتي تمر أولاً بمرحلة بناء تطوير ملف AssemblyScript ثم نقوم بعمل compilation لهذا الملف فينتج عنه ملف WASM بعد ذلك نقوم ببناء هذا الملف الناتج باستخدام Build وبعد ذلك ننشر التطبيق باستخدام تعليمة ال deploy
هذا المقال متاح أيضاً فى صورة فيديو يمكنك مشاهدته من خلال الرابط
الآن سنقوم بتطبيق ما سبق على خصائص جديدة ومختلفة في SDK منها التالي:
- تعريف وبناء الصنف class على العقد الذكي smart contract
- الهوية identity لمعرفة من قام باستدعاء ال methods الخاصة بنا.
- معرفة الرصيد الموجود على الحساب.
وهي بعض الأساسيات في تطوير العقود الذكية بلغة الأسمبلي سكريبت AssemblyScript على بروتوكول نِير NEAR protocol.
طريقة عمل class بسيط
نقوم بكتابة class واسم ال class الخاص بي لا يشترط أن يكون اسمه contract فمن الممكن تسميته بأي اسم آخر ونقوم بكتابة المتغيرات state variables ثم الدوال methods كما في أي لغة برمجية تستخدمها كما في المثال الآتي:
هذا المثال وغيره من الأمثلة الكثيرة جداً يمكنك العثور عليها في موقع near-by-example.com وهو موقع ممتاز جداً للحصول على كل ال API المتاحة لك في SDK الخاصة ب NEAR فيمكنك الاحتفاظ به كأداة أثناء عمل ال development في حال لم تكن متمكناً بعد من لغة ال AssemblyScript أو كتابة الكود باستخدام NEAR SDK
المثال السابق هو عبارة عن helloworld example من الموقع المذكور والآن سنقوم بعمل نسخ للكود ومن ثم نذهب إلى ال basic code لدينا في محرر الأكواد وضمن بنية المجلد لدينا folder structure نختار ال assembly code ثم index file ونقوم بعمل لصق للكود الذي قمنا بنسخه من الموقع.
والذي يحتوي على class Contract ثم ال state variables وبعدها ال methods كما في الشكل التالى
لابد من عمل decoration لل classes في ال NEAR عن طريق ال nearBindgen decorator لكي تستطيع ال NEAR SDK أن تجعل ال class الخاص بك متعرفاً عليه وصحيح في NEAR SDK ثم نقوم بعمل حفظ وبعدها نقوم ببناء build لهذا المشروع.
- نكتب yarn لكي نقوم بعمل تنصيب install لكل التبعيات dependencies في حال كانت مرة تقوم فيها بعمل yarn لهذا المشروع .
- بعدها نقوم بتنفيذ yarn build لبناء build هذا المشروع. نجد أنه في مجلدات المشروع قد ظهر مجلد جديد اسمه build ويحتوي هذا المجلد على مجلد آخر اسمه debug والذي يحتوي بدوره على ملف helloworld.wasm هذا الملف يحوي نفس الكود الذي قمنا باستخدامه في ال helloworld لذا فقد تم تسميته ب helloworld
إذا أردنا تغيير الاسم من package.json نقوم بتغيير الاسم name على سبيل المثال إلى explore
بعدها نقوم بعمل yarn build ليقوم بعمل build مرة أخرى لينتج file آخر باسم ال project الحالي والذي هو explore.wasm وهو نتيجة ال compilation لل build.
- لعمل نشر deploy لهذا الملف على البلوك تشين نقوم بكتابة near dev-deploy وبعدها تقوم بكتابة اسم الملف الخاص بك ليكون الشكل النهائي كالتالي
near dev-deploy .\build \debug\explore.wasm
وكما نعلم فإن هذا الأمر near dev-deploy يسهل عملية البناء والتطوير حيث يقوم بعمل عقد contract يبدأ ب dev ويعمل بعدها حساب باسم عشوائي ويقوم بعمل deploy للكود الخاص بك عليه فتستطيع بعدها استخدام هذا الاسم في عمل call لل contract
مثال:
لعمل استدعاء ما نكتب near call بعدها اسم ال contract وهو الموجود في الصورة السابقة ومن ثم نكتب اسم الدالة method التي أريد عمل استدعاء لها، فعلى سبيل المثال فإن اسم ال method هو helloworld فنكتب helloworld
near call dev-1645420538745-21369721306688 helloworld
لنجد أنه قام بإعادة كلمة ال helloworld وهي النتيجة المطلوبة.
- لتغيير قيمة ال variable في الكود
نقوم بعمل دالة method أخرى نسميها update على سبيل المثال ونجعلها تأخذ parameter من نوع string نغيره إلى massage ونوعها string فيكون شكل ال AssemblyScript كالتالي:
Update(massage:string): string
الرسالة التي ستتلقاها ستقوم بعمل تحديث للرسالة الموجودة ضمن ال class عن طريق تمريرها عبر parameter لهذه ال method وبعد ذلك تعيد method updated
ثم نقوم بعمل بناء build ونشر deploy لهذا العقد.
بعد نشر العقد نقوم بعمل استدعاء للدالة التي قمنا بكتابتها وهي update ولأن هذه الدالة تطلب تمرير معامل فسنترك فراغ ونكتب المعطيات كما بالشكل التالي
Update '{" ":" "}'
ملاحظة:
يجب أن نضع بالاعتبار أن هذا الجزء ممكن أن يسبب بعض المشكلات بحسب نوع ال SHELL الذي تستخدمه فغالباً ما يسبب POWER SHELL مشاكل فنقوم بتغييرها إلى GIT SHELL إذا كنت قد نصبت git كما ذكرنا من قبل فيمكننا اختيار Git Bash أي أنني أعمل الآن على command line interface الذي يسمى Git Bash وهو أفضل من POWER SHELL الخاص بالويندوز بداية من هذا الجزء الذي نعمل عليه لأن passing the parameter يجب فيه وضع quotations و spaces و backslashes وما إلى ذلك فدائماً ما تسبب مشاكل عند استخدام POWER SHELL معها
نستكمل ما سبق فنكتب أن الرسالة التي أريد إرسالها والتي هي not hello على سبيل المثال كالتالي
Update '{"massage":"not hello"}'
ونقوم بتجربة الكود لنرى هل يستطيع أن يتم تنفيذه أم لا و نجد أن ال method بالفعل قد تم استدعائها.
بعدها نقوم باستدعاء helloworld بدون parameters من المفترض أن يعيد لي ال massage التي هي updated سنلاحظ أن الرسالة لم تتغير والسبب في ذلك أن method التي ستغير ال state هذا ال state is variable فإذا أردت تغييره لابد من كتابة ال decorator التالي { }mutatestate@ ليعرف ال NEAR SDK أن هذه ال method هي change method
( ال method التي لا تقوم بأي تغيير تدعى view method أما التي تقوم بعمل change فهي change method )
بعدها نقوم بعمل build و deploy و run مرة أخرى
الآن سنقوم باستدعاء ال change method و ال view method أو update و helloworld
فنقوم بعمل نسخ لل contract فنقوم بكتابة near call dev – ونلصق ال contract ID وهذا كان ال call الأول الذي أعاد helloworld
لعمل call لل change method والتي هي update سنقوم بكتابة نفس الكود السابق باستبدال helloworld إلى update ونكتب ال parameters في شكل json ولابد أن يكون اسم ال parameter هنا هو نفس اسم ال parameter الذي تستقبله ال method، في حال قمت بكتابته بطريقة خاطئة سيرسل لك error massage واضحة بما يجب أن تفعله
وننفذ هذا ال call من المفترض أن يقوم ال call بعمل update لل massage لكلمة new massage فعندما أقوم بعد ذلك بعمل hello فيجب ان تعود ال massage لي بالشكل الجديد
فننادى على hello مرة أخرى نلاحظ أنه قد تم عمل update بالفعل لل state
وهذا كان مثال بسيط لكيفية تغيير data على البلوك تشين . هذا المتغير(variable) يكون مخزن على البلوك تشين وقد تابعنا كيفية تغير هذا المتغير وعرضه وكيفية عمل class واستدعاء توابع منه
أنواع البيانات Data Types
في الصورة التالية نجد كل أنواع البيانات المتاحة في AssemblyScript ولدينا فيها كل ال numbers بداية من 32bit إلى 128
Standard Library:
لدينا في ال Standard Library مجموعة من ال classes مثل Array, date, map, error, string, set, number, math إلى آخره
يمكنك زيارة موقع assemblyscript.org/types للاطلاع على ال types المتاحة في ال AssemblyScript
Context :
هي عبارة عن api مهمة جداً، ففي بعض الأحيان ستحتاج إلى معرفة معلومات من ال SDK او من البلوك تشين نفسه كمعرفة المساحة التي يشغلها ال contract من البلوك تشين وذلك من خلال استدعاء context.storageUsage
إذا أردت معرفة ما إذا كان قد قام أحدهم بعمل call ل method وقام بعمل attach money فإذا أردت أن أجعل الشخص الذي قام باستدعاء هذه ال method يدفع 1 نير فستقوم بكتابة ذلك في ال documentation وإذا أردت معرفة كيف سيقوم ذلك الشخص بإرسال المال وكيف سأتمكن من معرفة أنه أرسله
معرفة إذا ما قام الشخص بإرسال المال مع ال call أم لا
يمكنك معرفة إذا ما قام الشخص بإرسال المال مع ال call أم لا من خلال ال context فنكتب context.attachedDeposit
كذلك يمكنك معرفة ال account balance من خلال context.accountBalance
فعلى سبيل المثال إذا قمنا بفتح موقع NEAR-by-example وبحثنا عن Context Api ستجد الكثير من الأشياء المفيدة التي يمكنك التعرف عليها والتي ستحتاج إليها عند كتابة ال smart contract
كيف يمكنك ارسال المال مع ال call (Attach money to call) ؟
إذا كنت تقوم بعمل near call ل appl معين helloworld نستخدم نفس الكود مع زيادة amount=1—مع كتابة القيمة المراد دفعها مكان الواحد كما بالشكل التالي:
near call appl.msaudi.testnet helloworld --amount=1
عند تنفيذ هذا ال call سيتم خصم 1 نير من الحساب msaudi.testnet ويتم تحويلها إلى الاكونت الذي قمنا بعمل call له وهو appl.msaudi.testnet
فهذه خاصية مهمة ستحتاج إليها لأنك بالطبع لن تجعل كل ال methods الخاصة بك available للناس بدون مقابل
لديك أيضا موقع ال documentation الخاص بال SDK نفسها من NEAR
ويمكنك الاطلاع على الأشياء المتاحة في ال SDK تقدر تستخدمها كذلك هناك العديد من الأمثلة يمكنك الإطلاع عليها وتتعلم وتعدل بالاكواد الموجودة بها وهناك موقعين مهمين لمساعدتك على ذلك وهما ال examples الموجودة في ال Git و NEAR by example
يمكنك الآن التسجيل في أول كورس للحصول على شهادة مطور نير معتمد باللغة العربية من خلال هذا الرابط