كيفية التفاعل مع Ethereum blockchain وإنشاء قاعدة بيانات مع Python و SQL

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

الإعداد للقاء الأول

أولاً ، ستحتاج إلى تثبيت web3py. Web3py هي مكتبة Python للتواصل مع Ethereum blockchain. ما تحتاج إلى معرفته مسبقًا هو أنه لا يوجد نظام إداري مركزي يمكن تنزيل البيانات منه. العقد المترابطة ("أقران") ، التي تشترك في الموارد فيما بينها ، تخزن نسخة تم التحقق منها من البيانات (أو جزء منها). تنفذ الشبكة بروتوكول Ethereum ، الذي يحدد قواعد تفاعل العقد مع بعضها البعض و / أو العقود الذكية عبر تلك الشبكة.

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

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

انتقل إلى Infura وقم بإنشاء حسابك المجاني للوصول إلى هذه العقدة المستضافة. عند الانتهاء من ذلك ، سترى قائمة بالشبكات التي يمكنك الاتصال بها: mainnet (سلسلة Ethereum blockchain الرئيسية) ومجموعة من testnets ، الموجودة هناك لاختبار العقود الذكية الخاصة بك بشكل أساسي ، بحيث يمكنك ارتكاب أخطاء عليها وتصحيحها قبل نشر رمز مكلف إلى mainnet.

وقت النهج الأول. استيراد كائن Web3 وتأسيس اتصال HTTP.

من web3 استيراد Web3
web3 = Web3 (Web3.HTTPProvider ("https://mainnet.infura.io/your-own-personal-number"))

وانتم جميعا مجموعة! يمكنك الآن استكشاف بنية البيانات باستخدام واجهة برمجة تطبيقات web3.

استرداد المعلومات حول كتل محددة ...

# رقم كتلة الحالي
>>> web3.eth.blockNumber
5658173
# احصل على محتوى أحدث كتلة تم استخراجها
>>> web3.eth.getBlock ('الأحدث')

يقوم هذا الأمر بإرجاع بنية بيانات AttributeDict ، والتي هي قاموس لأزواج قيمة المفتاح التي تبدو كما يلي:

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

باختصار ، تحتوي الكتلة على رأس الكتلة ، وقائمة بالمعاملات التي تم التحقق منها مكتوبة عليها وقائمة الأعمام (معرّفات الكتل من عمال المناجم الذين كانوا بطيئين قليلاً جدًا في كتلهم ليصبحوا في كتلة blockchain الرئيسية ولكن لا يزال يتم مكافأتهم بـ Ether عن جهدهم الحسابي). أدناه يمكنك قراءة معنى كل متغير ، والذي قسمته إلى فئات فرعية.

جنرال لواء

ذات الصلة التعدين

الأعمام

تقني

... المعاملات وإيصالاتها

الآن يمكننا أيضًا البحث عن المعاملات الفردية في كتلة بمعرفاتها الفريدة ، أي تجزئات المعاملات.

كما سبق ، فإن web3py يعيدنا إلى قاموس للسمات. يلخص الجدول أدناه ما يمثله كل مفتاح.

أخيرًا ، يمكننا أيضًا النظر في إيصالات المعاملات:

يحتوي إيصال المعاملة على بعض الإدخالات المتكررة والجديدة ؛ وأوضح الجديد منها أدناه.

للإشارة ، قمت بتضمين العديد من الموارد الإضافية إلى جانب الورقة الصفراء لتجميع هذه الجداول [2 ، 3 ، 4 ، 5].

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

نظام إدارة قواعد البيانات

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

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

تنمو سلسلة Ethereum blockchain بشكل مطرد بمرور الوقت ، حيث اقتربت من 1 تيرابايت اعتبارًا من يونيو 2018 ، وهو صغير ، وبالتالي فهو غير مثالي لنظام معالجة موزع مثل Hadoop. ستتم كتابة قاعدة بيانات blockchain مرة واحدة ثم يتم توسيعها فقط باستخدام إدخالات جديدة ، مع ترك الإدخالات القديمة دون تغيير. حالة الاستخدام المقصود لقاعدة البيانات هذه تتم كتابتها بواسطة قناة واحدة والوصول إليها للقراءة فقط من خلال القنوات الأخرى ، لذلك لا نحتاج إلى تشغيلها على خادم. سيؤدي الاحتفاظ بقاعدة البيانات محليًا على جهازك إلى قراءة سريعة ، وهو أمر مرغوب فيه ويمكن تحقيقه باستخدام نظام إدارة بدون خادم مثل SQLite. ويحتوي Python على مكتبة sqlite3 مدمجة ، وبالتالي لا نحتاج حتى إلى تثبيت حزم جديدة.

تصميم قاعدة البيانات

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

تتكون قاعدة البيانات التي صممتها من 3 جداول:

  • سريع: معلومات المعاملات الأكثر صلة للوصول السريع والتحليل ،
  • TX: جميع معلومات المعاملات المتبقية ،
  • كتلة: كتلة معلومات محددة.

تم تغيير اصطلاح تسمية المتغيرات قليلاً فيما يتعلق بـ web3py الأصلي للتخلص من الغموض ، مثل استدعاء كل من تجزئة الكتلة وتجزئة المعاملة "تجزئة" ، أو استخدام "من" / "إلى" كأسماء أعمدة ، والتي في SQL لها معنى مختلف وسوف تعطل البرنامج.

يجب تخزين قيم المعاملات والأرصدة والأرقام الكبيرة الأخرى في قاعدة البيانات كسلسلة. والسبب هو أن SQLite يمكنها التعامل مع الأعداد الصحيحة الموقعة فقط المخزنة في 8 بايت بحد أقصى بقيمة 2 maximum-1 = 9223372036854775807. وهذا غالبًا ما يكون أقل بكثير من قيم المعاملات في wei (على سبيل المثال ، 1 ETH = 10¹⁸ wei).

بناء قاعدة البيانات الخاصة بك مصغرة

يمكن العثور على الرمز الكامل على GitHub. سيقوم بتنظيم معلومات blockchain وفقًا للمخطط العلوي وإخراج ملف blockchain.db يحتوي على بيانات عدد محدد مسبقًا من الكتل. لاختباره ، انتقل إلى ملف database.py واختر رقمًا معقولًا لعدد الكتل المراد كتابتها ، على سبيل المثال

Nblocks = 10000

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

# أو الاتصال عبر العقدة على VM
# web3 = Web3 (Web3.IPCProvider ('/ path-to-geth.ipc /'))

وإصلاح المسار. ثم ببساطة تشغيل في سطر الأوامر الخاص بك بيثون database.py. سيقوم الرمز بتفريغ رقم ​​آخر كتلة مكتوبة في الملف lastblock.txt ، في حال احتجت إلى إعادة التشغيل من حيث توقفت.

كيفية استخدام قاعدة البيانات

بمجرد كتابة الإدخالات الأولى في قاعدة البيانات ، يمكنك البدء في التواصل معها عبر ipython shell. على سبيل المثال ، لطباعة أول 5 صفوف من الجدول "سريع" ، يمكنك تشغيل التعليمات البرمجية أدناه.

العقدة المحلية مقابل Infura

إذا كنت ترغب في إنشاء قاعدة بيانات كبيرة ، فيجب عليك تنزيل geth ومزامنة العقدة. يمكن إجراء المزامنة في 3 أوضاع أساسية:

إذا لم تكن بحاجة إلى حالات حساب سابقة ، يمكنك مزامنة العقدة الخاصة بك في الوضع السريع [6].

فيما يلي مؤامرة توضح لك السرعة التي يكتب بها هذا الرمز في قاعدة بيانات ، ويتواصل مع العقدة المتزامنة بالكامل محليًا (IPC) مقابل عنوان على Infura (Infura). كما ترون ، فإنه يؤتي ثماره لتشغيل هذا الرمز على عقدة محلية ، حيث يمكنك الحصول على زيادة سرعة تقارب 2 طلبية من الحجم (ويعرف أيضًا باسم 100x)!

الوقت المستغرق لكتابة 10 كتل من المعاملات بين الكتل 2000000 و 2000400. الوقت على مقياس لوغاريتمي (10⁰ = 1 ، 10¹ = 10 وهكذا ؛).

ملخص

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

اتصل بـ analytics@validitylabs.org إذا كنت مهتمًا بخدمات تحليلات blockchain في Validity Labs.