ما هي تجميعات كارتيزي ؟


تمثل تجمبعات كارتيزي حلاً خاصًا بالتطبيقات المجمعة يتميز بوقت تشغيل لينكس. تقوم بتمكين المستخدمين من إنشاء حسابات يمكن التحقق منها وقابلة للتكرار وشفافة. يمكن ملاحظة كارتيزي من وجهتي نظر مختلفتين: منظور البلوك تشين (متصل بالسلسلة) ومنظور العقدة (خارج السلسلة).

ينقسم النظام البيئي لكارتيزي إلى منظورين رئيسيين: خارج السلسلة وعلى السلسلة.

ومن منظور خارج السلسلة، نجد آلة كارتيزي، التي تعمل كمحاكي RISC-V الذي يعمل ضمن نظام التشغيل لينكس، جنبًا إلى جنب مع تطبيق المشغل.

على الجانب الآخر، يشمل المنظور الموجود على السلسلة العقود الذكية للتجميعات والعقود الذكية للتطبيقات اللامركزية (DApp).


في هذا البرنامج التعليمي، سنستعرض كيفية اندماج هاتين الوجهتين معًا. سنقوم بذلك من خلال إنشاء لوحة ASCII (لوحة رسم) باستخدام لغة البرمجة بايثون. ستكون البلوك تشين هي لوحتنا.

الهدف هو أن يكون بإمكان كل مستخدم (عنوان إيثريوم) إضافة اسمه المرسوم بواسطة ASCII إلى تطبيق كارتيزي لامركزي (DApp).

لنبدأ!

المتطلبات الأساسية


قبل أن نبدأ في البرنامج التعليمي، دعونا نقوم بسرد جميع الأدوات التي سنحتاجها لإنشاء وتشغيل تطبيقنا:

1- Python >= 3.1

2- مكتبة بايثون لرسم الفن الرقمي بتقنية ASCII. يمكنك تثبيتها باستخدام الأمر التالي:

python3 -m pip install art

3- مكتبة Web3.py يمكنك تثبيتها باستخدام الأمر التالي:

python3 -m pip install web3

4- Docker. في حالة عدم تثبيتها لديك، يمكنك الرجوع إلى هذا الدليل لنظام التشغيل الخاص بك.


ملخص

كما ذكرنا سابقًا، يعد التطبيق مشروعًا بسيط يحول المدخلات المقدمة إلى فن ASCII. فيما يلي مثال لمخرجات ASCII الفنية على الوحدة الطرفية:

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

تراقب العقدة بشكل نشط تغييرات البلوك تشين وتقوم بعد ذلك بإبلاغ الواجهة الخلفية لـ تطبيقنا بهذه التغييرات. بمجرد تنفيذ منطق التطبيق اللامركزي (DApp)، يمكننا بعد ذلك نشر النتائج (المخرجات) على البلوك تشين.

تعمل الواجهة الخلفية لدينا ضمن عقدة كارتيزي، وتعمل بمثابة عقدنا الذكي. تم دمج هذه العقدة مع جهاز كارتيزي، حيث يتم تنفيذ منطق الواجهة الخلفية الفعلي.


تهيئة بيئة التطوير


أولاً، قم باستنساخ المستودع باستخدام هذا الامر

git clone https://github.com/Mberic/ascii-python.git

دعونا نقدم شرحًا للملفات التي قمتم بتنزيلها للتو:

1- docker-compose.yml: هذا الملف يحتوي على ملفات Docker الضرورية لإنشاء عقدة كارتيزي. تحتوي العقدة على مكونات متعددة، بما في ذلك خادم State-fold، ومدير الخادم، وقاعدة بيانات PostgreSQL، والمزيد. إذا كنتم مهتمين بفهم هندسة مكونات هذه العقدة، يمكنكم الرجوع إلى وثائق الشرح المرفقة.

2- docker-compose-host.yml: هذا الملف يقوم بإعداد مدير الخادم لدينا للعمل في وضع الاستضافة.

3- frontend.py: في هذا الملف، ستجدون الشيفرة المسؤولة عن إرسال اسم إلى عقدة InputBox.

4- backend.py: يتعامل هذا الملف مع الطلبات الواردة ويولِّد الردود. بالنسبة لأغراض تطبيقنا، الهدف الرئيسي هو تأكيد استلام الخادم الخلفي للاسم. وبناءً على ذلك، سنقوم بتقدم حالة تطبيق عقدة كارتيزي من خلال إرسال إشعار.


الآن، دعونا نقم بتشغيل بيئة التطوير في وضع الاستضافة:

قم بتشغيل الأمر التالي للقيام بذلك:

docker compose -f ./docker-compose.yml -f ./docker-compose-host.yml up


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

تشغيل الأمر أعلاه سيبدأ بيئة Hardhat علي الجهاز وسيقوم أيضًا بإنشاء عقدة كارتيزي. سيبدأ في تشغيل عدد من الخدمات على منافذ مختلفة، مثل 4000 و 5004 و 8545. يمكنكم الرجوع إلى ملفات Docker لفهم الخدمات التي تتوافق مع هذه المنافذ.

ستحتاجون إلى النظر في المخرجات على الواجهة الطرفية للحصول على عناوين العقود التي سنستخدمها في ملف frontend.py. هناك عقدين محددين مهمين لنا:

InputBox: 0x5a723220579C0DCb8C9253E6b4c62e572E379945
CartesiDApp: 0x142105FC8dA71191b3a13C738Ba0cF4BC33325e2

بعد مرور بعض الوقت، يجب أن تشاهدوا سجلات الكتل المستمرة كما يلي:


يرتبط كل تطبيق كارتيزي لامركزي (DApp) بعقد CartesiDApp منشور. يصبح عنوان هذا العقد ضروريًا عند نقل البيانات إلى العقود الذكية الخاصة بتجميعات كارتيزي، حيث سنستكشفها بمزيد من التفاصيل قريبًا. ينشئ هذا العنوان اتصالاً بين إدخال بيانات معين وتطبيق كارتيزي اللامركزي المميز.


هام:

لا يحتفظ Hardhat بسجل للتعديلات السابقة التي تم إجراؤها أثناء تنفيذه. وبالتالي، من الضروري التحقق من عناوين العقد في كل مرة تقوم فيها ببدء بيئة التطوير.
الواجهة الأمامية: التفاعل مع عقدة InputBox


إحدى ميزات تصميم كارتيزي البارزة هي إعادة قابلية تكرار الحوسبات. إذا اختلفت نتائج حسابية بين عقدين، فإن حل هذا الصراع يكون مستحيلاً. لضمان توافق البيانات، يجب على جميع تطبيقات كارتيزي اللامركزية (DApps) إرسال بياناتها لتقدم حالتها من خلال عقود تجميعات كارتيزي.
لتحقيق ذلك، نحتاج إلى التفاعل مع عقدة InputBox المنشأة. هذا العقد يمكنه قبول بيانات تشمل البيانات التشغيلية لعقدة CartesiDApp المتناظر. يتوفر في هذا العقد وظيفة addInput التي تستلم إدخالين: (1) عنوان CartesiDApp و (2) البيانات التي سيتم إرسالها:


solidity


function addInput(
address _dapp,
bytes calldata _input
) external override returns (bytes32)


الآن، قم بفتح نافذة طرفية الجديدة وقم بتشغيل ملف frontend.py. سيتم بذلك استدعاء وظيفة addInput لإرسال نص ASCII (الاسم) إلى عقدة CartesiDApp الخاصة بنا.
من المهم أن نلاحظ أن الاسم ASCII الذي نرسله لا يحمل التنسيق الذي يستخدمه مكتبة Python art في ملف frontend.py. نهدف إلى البساطة في هذا السياق، مع افتراض أن النص المرسل (الاسم) يستخدم التنسيق الافتراضي للمكتبة.


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


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


في نافذة الطرفية الجديدة، دعونا نقم بتشغيل ملف backend.py في بيئة بايثون افتراضية. قم باتباع هذه الخطوات:


1- إنشاء بيئة بايثون افتراضية:

python3 -m venv .env


2- تفعيل البيئة الافتراضية:

env/bin/activate


3- تثبيت التبعيات المطلوبة:

pip install -r requirements.txt


4- قم بتشغيل ملف backend.py بالأمر التالي:

ROLLUP_HTTP_SERVER_URL="http://127.0.0.1:5004" python3 backend.py


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

الحمولة (Payload) تحتوي على الاسم. إذا قمت بتحويل الحمولة الست عشرية المذكورة أعلاه (0x4a656c6c7966697368) إلى ASCII، ستحصل على الاسم "Jellyfish". لا تتردد في تجربة مزيد من الأسماء ومشاهدة النتائج المُستحصَلَة.

عندما تنتهي من العمل في بيئة مجموعة ادوات تطوير البرمجيات (SDK) الخاصة بتجميعات كارتيزي، يمكنك إيقاف الحاويات Docker بشكل لائق باستخدام الأمر التالي:

docker compose -f ./docker-compose.yml -f ./docker-compose-host.yml down -v

افكار ختامية


خلال هذا البرنامج التعليمي، تعلمت كيفية إنشاء تطبيقك الخاص باستخدام مجموعة ادوات تطوير البرمجيات (SDK) الخاصة بتجميعات كارتيزي. الآن، حان دورك لتطوير التطبيق اللامركزي الخاص بك.
نحن متحمسون لرؤية ما ستقوم ببنائه!