تخطٍ إلى المحتوى الرئيسي

تعلم مواضيع إيثريوم التأسيسية باستخدام SQL

SQL
الاستعلام
المعاملات
المستوى المبتدئ
بول أبيفات
11 مايو 2021
7 دقيقة قراءة

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

يساعد هذا البرنامج التعليمي القراء على فهم مفاهيم إيثريوم الأساسية بما في ذلك المعاملات والكتل والغاز عن طريق الاستعلام عن البيانات الموجودة على السلسلة باستخدام لغة الاستعلام المهيكلة (SQL) من خلال واجهة مقدمة من ديون أناليتكس (opens in a new tab).

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

المعاملات

تبدأ رحلة المستخدم على إيثريوم بتهيئة حساب يتحكم فيه المستخدم أو كيان برصيد ETH. هناك نوعان من الحسابات - يتحكم فيها المستخدم أو عقد ذكي (انظر ethereum.org).

يمكن عرض أي حساب على مستكشف الكتل مثل إيثرسكان (opens in a new tab) أو بلوك سكوت (opens in a new tab). مستكشفات الكتل هي بوابة لبيانات إيثريوم. يعرضون، في الوقت الفعلي، بيانات عن الكتل والمعاملات والمعدنين والحسابات وغيرها من الأنشطة على السلسلة (انظر هنا).

ومع ذلك، قد يرغب المستخدم في الاستعلام عن البيانات مباشرة للتوفيق بين المعلومات التي توفرها مستكشفات الكتل الخارجية. توفر ديون أناليتكس (opens in a new tab) هذه الإمكانية لأي شخص لديه بعض المعرفة بلغة SQL.

كمرجع، يمكن عرض حساب العقد الذكي لمؤسسة إيثريوم (EF) على بلوك سكوت (opens in a new tab).

شيء واحد يجب ملاحظته هو أن جميع الحسابات، بما في ذلك حسابات مؤسسة إيثريوم (EF)، لها عنوان عام يمكن استخدامه لإرسال واستلام المعاملات.

يتكون رصيد الحساب على إيثرسكان من معاملات عادية ومعاملات داخلية. المعاملات الداخلية، على الرغم من الاسم، ليست معاملات فعلية تغير حالة السلسلة. إنها عمليات تحويل قيمة يتم بدؤها عن طريق تنفيذ عقد (المصدر (opens in a new tab)). نظرًا لأن المعاملات الداخلية لا تحتوي على توقيع، فهي غير مدرجة في البلوكتشين ولا يمكن الاستعلام عنها باستخدام ديون أناليتكس.

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

1WITH temp_table AS (
2SELECT
3 hash,
4 block_number,
5 block_time,
6 "from",
7 "to",
8 value / 1e18 AS ether,
9 gas_used,
10 gas_price / 1e9 AS gas_price_gwei
11FROM ethereum."transactions"
12WHERE "to" = '\xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe'
13ORDER BY block_time DESC
14)
15SELECT
16 hash,
17 block_number,
18 block_time,
19 "from",
20 "to",
21 ether,
22 (gas_used * gas_price_gwei) / 1e9 AS txn_fee
23FROM temp_table
إظهار الكل

سيؤدي هذا إلى الحصول على نفس المعلومات المتوفرة في صفحة معاملات إيثرسكان. للمقارنة، إليك المصدران:

إيثرسكان

صفحة عقد EF على بلوك سكوت. (opens in a new tab)

ديون أناليتكس

يمكنك العثور على لوحة المعلومات هنا (opens in a new tab). انقر فوق الجدول لرؤية الاستعلام (انظر أعلاه أيضًا).

تحليل المعاملات

تتضمن المعاملة المقدمة عدة أجزاء من المعلومات بما في ذلك (المصدر):

  • المستلم: عنوان الاستلام (يتم الاستعلام عنه كـ "to")
  • التوقيع: بينما تقوم المفاتيح الخاصة للمرسل بتوقيع معاملة، ما يمكننا الاستعلام عنه باستخدام SQL هو العنوان العام للمرسل ("from").
  • القيمة: هذا هو مقدار ETH المحول (انظر عمود ether).
  • البيانات: هذه بيانات عشوائية تم تجزئتها (انظر عمود data)
  • gasLimit - الحد الأقصى لوحدات الغاز التي يمكن أن تستهلكها المعاملة. تمثل وحدات الغاز خطوات حسابية
  • maxPriorityFeePerGas - الحد الأقصى لمقدار الغاز الذي سيتم تضمينه كإكرامية للمعدِّن
  • maxFeePerGas - الحد الأقصى لمقدار الغاز الذي يرغب المستخدم في دفعه مقابل المعاملة (بما في ذلك baseFeePerGas و maxPriorityFeePerGas)

يمكننا الاستعلام عن هذه الأجزاء المحددة من المعلومات للمعاملات إلى العنوان العام لمؤسسة إيثريوم:

1SELECT
2 "to",
3 "from",
4 value / 1e18 AS ether,
5 data,
6 gas_limit,
7 gas_price / 1e9 AS gas_price_gwei,
8 gas_used,
9 ROUND(((gas_used / gas_limit) * 100),2) AS gas_used_pct
10FROM ethereum."transactions"
11WHERE "to" = '\xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe'
12ORDER BY block_time DESC
إظهار الكل

الكتل

ستغير كل معاملة حالة آلة إيثريوم الافتراضية (EVM) (المصدر). يتم بث المعاملات إلى الشبكة للتحقق منها وإدراجها في كتلة. ترتبط كل معاملة برقم كتلة. لرؤية البيانات، يمكننا الاستعلام عن رقم كتلة معين: 12396854 (أحدث كتلة بين معاملات مؤسسة إيثريوم وقت كتابة هذا التقرير، 11/5/21).

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

تحتوي كل كتلة على مرجع للكتلة الأصلية الخاصة بها. يظهر هذا أدناه بين عمودي hash وparent_hash (المصدر):

parent_hash

إليك الاستعلام (opens in a new tab) على ديون أناليتكس:

1SELECT
2 time,
3 number,
4 hash,
5 parent_hash,
6 nonce
7FROM ethereum."blocks"
8WHERE "number" = 12396854 OR "number" = 12396855 OR "number" = 12396856
9LIMIT 10
إظهار الكل

يمكننا فحص كتلة عن طريق الاستعلام عن الوقت ورقم الكتلة والصعوبة والتجزئة والتجزئة الأصلية والنانس.

الشيء الوحيد الذي لا يغطيه هذا الاستعلام هو قائمة المعاملات التي تتطلب استعلامًا منفصلاً أدناه و_جذر الحالة_. ستقوم العقدة الكاملة أو الأرشيفية بتخزين جميع المعاملات وانتقالات الحالة، مما يسمح للعملاء بالاستعلام عن حالة السلسلة في أي وقت. نظرًا لأن هذا يتطلب مساحة تخزين كبيرة، يمكننا فصل بيانات السلسلة عن بيانات الحالة:

  • بيانات السلسلة (قائمة الكتل والمعاملات)
  • بيانات الحالة (نتيجة انتقال حالة كل معاملة)

يقع جذر الحالة في الفئة الأخيرة وهو بيانات ضمنية (غير مخزنة على السلسلة)، في حين أن بيانات السلسلة صريحة ومخزنة على السلسلة نفسها (المصدر (opens in a new tab)).

بالنسبة لهذا البرنامج التعليمي، سنركز على البيانات الموجودة على السلسلة والتي يمكن الاستعلام عنها باستخدام SQL عبر ديون أناليتكس.

كما هو مذكور أعلاه، تحتوي كل كتلة على قائمة بالمعاملات، ويمكننا الاستعلام عن ذلك عن طريق التصفية لكتلة معينة. سنجرب أحدث كتلة، 12396854:

1SELECT * FROM ethereum."transactions"
2WHERE block_number = 12396854
3ORDER BY block_time DESC`

إليك مخرجات SQL على Dune:

تؤدي إضافة هذه الكتلة الواحدة إلى السلسلة إلى تغيير حالة آلة إيثريوم الافتراضية (EVM). يتم التحقق من عشرات، وأحيانًا مئات، من المعاملات دفعة واحدة. في هذه الحالة المحددة، تم تضمين 222 معاملة.

لمعرفة عدد المعاملات التي نجحت بالفعل، سنضيف عامل تصفية آخر لحساب المعاملات الناجحة:

1WITH temp_table AS (
2 SELECT * FROM ethereum."transactions"
3 WHERE block_number = 12396854 AND success = true
4 ORDER BY block_time DESC
5)
6SELECT
7 COUNT(success) AS num_successful_txn
8FROM temp_table

بالنسبة للكتلة 12396854، من إجمالي 222 معاملة، تم التحقق بنجاح من 204 معاملة:

تحدث طلبات المعاملات عشرات المرات في الثانية، ولكن يتم الالتزام بالكتل مرة واحدة كل 15 ثانية تقريبًا (المصدر).

للتأكد من إنتاج كتلة واحدة كل 15 ثانية تقريبًا، يمكننا أخذ عدد الثواني في اليوم (86400) وقسمته على 15 للحصول على متوسط عدد الكتل المقدر يوميًا (حوالي 5760).

الرسم البياني لكتل إيثريوم المنتجة يوميًا (2016 - حتى الآن) هو:

متوسط عدد الكتل المنتجة يوميًا خلال هذه الفترة الزمنية هو ~5,874:

الاستعلامات هي:

1# استعلام لتصوير عدد الكتل المنتجة يوميًا منذ 2016
2
3SELECT
4 DATE_TRUNC('day', time) AS dt,
5 COUNT(*) AS block_count
6FROM ethereum."blocks"
7GROUP BY dt
8OFFSET 1
9
10# متوسط عدد الكتل المنتجة يوميًا
11
12WITH temp_table AS (
13SELECT
14 DATE_TRUNC('day', time) AS dt,
15 COUNT(*) AS block_count
16FROM ethereum."blocks"
17GROUP BY dt
18OFFSET 1
19)
20SELECT
21 AVG(block_count) AS avg_block_count
22FROM temp_table
إظهار الكل

متوسط عدد الكتل المنتجة يوميًا منذ عام 2016 أعلى قليلاً من هذا الرقم عند 5,874. بدلاً من ذلك، فإن قسمة 86400 ثانية على 5874 متوسط كتل ينتج عنها 14.7 ثانية أو كتلة واحدة تقريبًا كل 15 ثانية.

الغاز

الكتل محدودة الحجم. الحد الأقصى لحجم الكتلة ديناميكي ويختلف وفقًا لطلب الشبكة بين 12,500,000 و 25,000,000 وحدة. الحدود مطلوبة لمنع أحجام الكتل الكبيرة بشكل عشوائي من وضع ضغط على العقد الكاملة من حيث مساحة القرص ومتطلبات السرعة (المصدر).

إحدى طرق تصور حد غاز الكتلة هي التفكير فيه على أنه العرض لمساحة الكتلة المتاحة لتجميع المعاملات. يمكن الاستعلام عن حد غاز الكتلة وتصويره من عام 2016 حتى يومنا هذا:

1SELECT
2 DATE_TRUNC('day', time) AS dt,
3 AVG(gas_limit) AS avg_block_gas_limit
4FROM ethereum."blocks"
5GROUP BY dt
6OFFSET 1

ثم هناك الغاز الفعلي المستخدم يوميًا للدفع مقابل الحوسبة التي تتم على سلسلة إيثريوم (أي إرسال معاملة، أو استدعاء عقد ذكي، أو سك رمز غير قابل للاستبدال). هذا هو الطلب على مساحة كتل إيثريوم المتاحة:

1SELECT
2 DATE_TRUNC('day', time) AS dt,
3 AVG(gas_used) AS avg_block_gas_used
4FROM ethereum."blocks"
5GROUP BY dt
6OFFSET 1

يمكننا أيضًا وضع هذين المخططين معًا لمعرفة كيفية توافق الطلب والعرض:

gas_demand_supply

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

أخيرًا، قد نرغب في الاستعلام عن متوسط أسعار الغاز اليومية لسلسلة إيثريوم، ومع ذلك، سيؤدي القيام بذلك إلى وقت استعلام طويل بشكل خاص، لذلك سنقوم بتصفية استعلامنا إلى متوسط كمية الغاز المدفوعة لكل معاملة من قبل مؤسسة إيثريوم.

يمكننا أن نرى أسعار الغاز المدفوعة لجميع المعاملات التي تمت على عنوان مؤسسة إيثريوم على مر السنين. إليك الاستعلام:

1SELECT
2 block_time,
3 gas_price / 1e9 AS gas_price_gwei,
4 value / 1e18 AS eth_sent
5FROM ethereum."transactions"
6WHERE "to" = '\xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe'
7ORDER BY block_time DESC

ملخص

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

يمكن العثور على لوحة المعلومات التي تحتوي على كل التعليمات البرمجية المستخدمة في هذا البرنامج التعليمي هنا (opens in a new tab).

لمزيد من استخدام البيانات لاستكشاف ويب3 ابحث عني على تويتر (opens in a new tab).

آخر تحديث للصفحة: 26 فبراير 2026

هل كانت تعليمات الاستخدام هذه مفيدة؟