تعلم موضوعات إيثيريوم الأساسية باستخدام SQL
تستهدف العديد من البرامج التعليمية الخاصة بإيثيريوم المطورين، ولكن هناك نقص في الموارد التعليمية لمحللي البيانات أو للأشخاص الذين يرغبون في رؤية البيانات على السلسلة دون تشغيل عميل أو عقدة.
يساعد هذا البرنامج التعليمي القراء على فهم مفاهيم إيثيريوم الأساسية بما في ذلك المعاملات والكتل والغاز من خلال الاستعلام عن البيانات على السلسلة باستخدام لغة الاستعلام المهيكلة (SQL) من خلال واجهة توفرها Dune Analytics (opens in a new tab).
يمكن أن تساعدنا البيانات على السلسلة في فهم إيثيريوم، والشبكة، وكاقتصاد لقوة الحوسبة، ويجب أن تكون بمثابة أساس لفهم التحديات التي تواجه إيثيريوم اليوم (أي ارتفاع أسعار الغاز)، والأهم من ذلك، المناقشات حول حلول التوسع.
المعاملات
تبدأ رحلة المستخدم على إيثيريوم بتهيئة حساب يتحكم فيه المستخدم أو كيان برصيد ETH. هناك نوعان من الحسابات - حساب يتحكم فيه المستخدم أو عقد ذكي (انظر ethereum.org).
يمكن عرض أي حساب على مستكشف الكتل مثل Etherscan (opens in a new tab) أو Blockscout (opens in a new tab). مستكشفات الكتل هي بوابة لبيانات إيثيريوم. فهي تعرض، في الوقت الفعلي، بيانات حول الكتل والمعاملات والمُعَدِّنين والحسابات والأنشطة الأخرى على السلسلة (انظر هنا).
ومع ذلك، قد يرغب المستخدم في الاستعلام عن البيانات مباشرة لمطابقة المعلومات التي توفرها مستكشفات الكتل الخارجية. توفر Dune Analytics (opens in a new tab) هذه الإمكانية لأي شخص لديه بعض المعرفة بلغة SQL.
كمرجع، يمكن عرض حساب العقد الذكي الخاص بمؤسسة إيثيريوم (EF) على Blockscout (opens in a new tab).
الشيء الوحيد الذي يجب ملاحظته هو أن جميع الحسابات، بما في ذلك حساب مؤسسة إيثيريوم، لها عنوان عام يمكن استخدامه لإرسال واستقبال المعاملات.
يتكون رصيد الحساب على Etherscan من المعاملات العادية والمعاملات الداخلية. المعاملات الداخلية، على الرغم من اسمها، ليست معاملات فعلية تغير حالة السلسلة. إنها تحويلات قيمة يتم إجراؤها عن طريق تنفيذ عقد (المصدر (opens in a new tab)). نظرًا لأن المعاملات الداخلية ليس لها توقيع، فهي غير مدرجة في سلسلة الكتل ولا يمكن الاستعلام عنها باستخدام Dune Analytics.
لذلك، سيركز هذا البرنامج التعليمي على المعاملات العادية. يمكن الاستعلام عن ذلك على النحو التالي:
WITH temp_table AS (
SELECT
hash,
block_number,
block_time,
"from",
"to",
value / 1e18 AS ether,
gas_used,
gas_price / 1e9 AS gas_price_gwei
FROM ethereum."transactions"
WHERE "to" = '\xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe'
ORDER BY block_time DESC
)
SELECT
hash,
block_number,
block_time,
"from",
"to",
ether,
(gas_used * gas_price_gwei) / 1e9 AS txn_fee
FROM temp_table
سينتج عن ذلك نفس المعلومات المقدمة في صفحة المعاملات الخاصة بـ Etherscan. للمقارنة، إليك المصدرين:
Etherscan
صفحة عقد مؤسسة إيثيريوم على Blockscout. (opens in a new tab)
Dune Analytics
يمكنك العثور على لوحة المعلومات هنا (opens in a new tab). انقر على الجدول لرؤية الاستعلام (انظر أيضًا أعلاه).
تفصيل المعاملات
تتضمن المعاملة المُقدمة عدة أجزاء من المعلومات بما في ذلك (المصدر):
- المستلم: عنوان الاستلام (يُستعلم عنه كـ "to")
- التوقيع: بينما تقوم المفاتيح الخاصة للمرسل بتوقيع معاملة، فإن ما يمكننا الاستعلام عنه باستخدام SQL هو العنوان العام للمرسل ("from").
- القيمة: هذا هو مقدار ETH المحول (انظر عمود
ether). - البيانات: هذه بيانات عشوائية تم إجراء تجزئة لها (انظر عمود
data) - حد الغاز (gasLimit) – الحد الأقصى لعدد وحدات الغاز التي يمكن أن تستهلكها المعاملة. تمثل وحدات الغاز خطوات حسابية
- الحد الأقصى لرسوم الأولوية لكل غاز (maxPriorityFeePerGas) - الحد الأقصى لمقدار الغاز الذي سيتم تضمينه كإكرامية للمُعَدِّن
- الحد الأقصى للرسوم لكل غاز (maxFeePerGas) - الحد الأقصى لمقدار الغاز الذي يُرغب في دفعه مقابل المعاملة (شاملاً baseFeePerGas و maxPriorityFeePerGas)
يمكننا الاستعلام عن هذه الأجزاء المحددة من المعلومات للمعاملات المرسلة إلى العنوان العام لمؤسسة إيثيريوم:
SELECT
"to",
"from",
value / 1e18 AS ether,
data,
gas_limit,
gas_price / 1e9 AS gas_price_gwei,
gas_used,
ROUND(((gas_used / gas_limit) * 100),2) AS gas_used_pct
FROM ethereum."transactions"
WHERE "to" = '\xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe'
ORDER BY block_time DESC
الكتل
ستغير كل معاملة حالة آلة إيثيريوم الافتراضية (EVM) (المصدر). يتم بث المعاملات إلى الشبكة ليتم التحقق منها وتضمينها في كتلة. ترتبط كل معاملة برقم كتلة. لرؤية البيانات، يمكننا الاستعلام عن رقم كتلة محدد: 12396854 (أحدث كتلة بين معاملات مؤسسة إيثيريوم حتى وقت كتابة هذا التقرير، 11/5/21).
علاوة على ذلك، عندما نستعلم عن الكتلتين التاليتين، يمكننا أن نرى أن كل كتلة تحتوي على تجزئة الكتلة السابقة (أي تجزئة الأصل)، مما يوضح كيف تتشكل سلسلة الكتل.
تحتوي كل كتلة على إشارة إلى كتلتها الأصلية. يظهر هذا أدناه بين عمودي hash و parent_hash (المصدر):
إليك الاستعلام (opens in a new tab) على Dune Analytics:
SELECT
time,
number,
hash,
parent_hash,
nonce
FROM ethereum."blocks"
WHERE "number" = 12396854 OR "number" = 12396855 OR "number" = 12396856
LIMIT 10
يمكننا فحص كتلة من خلال الاستعلام عن الوقت ورقم الكتلة والصعوبة والتجزئة وتجزئة الأصل والرقم الفريد.
الشيء الوحيد الذي لا يغطيه هذا الاستعلام هو قائمة المعاملات والتي تتطلب استعلامًا منفصلاً أدناه و جذر الحالة. ستقوم العقدة الكاملة أو الأرشيفية بتخزين جميع المعاملات وانتقالات الحالة، مما يسمح للعملاء بالاستعلام عن حالة السلسلة في أي وقت. نظرًا لأن هذا يتطلب مساحة تخزين كبيرة، يمكننا فصل بيانات السلسلة عن بيانات الحالة:
- بيانات السلسلة (قائمة الكتل والمعاملات)
- بيانات الحالة (نتيجة انتقال حالة كل معاملة)
يقع جذر الحالة في الفئة الأخيرة وهو بيانات ضمنية (غير مخزنة على السلسلة)، بينما بيانات السلسلة صريحة ومخزنة على السلسلة نفسها (المصدر (opens in a new tab)).
في هذا البرنامج التعليمي، سنركز على البيانات على السلسلة التي يمكن الاستعلام عنها باستخدام SQL عبر Dune Analytics.
كما ذكرنا أعلاه، تحتوي كل كتلة على قائمة بالمعاملات، ويمكننا الاستعلام عن ذلك عن طريق التصفية لكتلة معينة. سنجرب أحدث كتلة، 12396854:
SELECT * FROM ethereum."transactions"
WHERE block_number = 12396854
ORDER BY block_time DESC`
إليك مخرجات SQL على Dune:
تؤدي إضافة هذه الكتلة الواحدة إلى السلسلة إلى تغيير حالة آلة إيثيريوم الافتراضية (EVM). يتم التحقق من العشرات وأحيانًا المئات من المعاملات في وقت واحد. في هذه الحالة المحددة، تم تضمين 222 معاملة.
لمعرفة عدد المعاملات الناجحة فعليًا، سنضيف عامل تصفية آخر لحساب المعاملات الناجحة:
WITH temp_table AS (
SELECT * FROM ethereum."transactions"
WHERE block_number = 12396854 AND success = true
ORDER BY block_time DESC
)
SELECT
COUNT(success) AS num_successful_txn
FROM temp_table
بالنسبة للكتلة 12396854، من إجمالي 222 معاملة، تم التحقق بنجاح من 204 معاملة:
تحدث طلبات المعاملات عشرات المرات في الثانية، ولكن يتم الالتزام بالكتل مرة واحدة تقريبًا كل 15 ثانية (المصدر).
لمعرفة أنه يتم إنتاج كتلة واحدة تقريبًا كل 15 ثانية، يمكننا أخذ عدد الثواني في اليوم (86400) مقسومًا على 15 للحصول على متوسط تقديري لعدد الكتل في اليوم (حوالي ~ 5760).
المخطط البياني لكتل إيثيريوم المنتجة يوميًا (2016 - الحاضر) هو:
متوسط عدد الكتل المنتجة يوميًا خلال هذه الفترة الزمنية هو ~5,874:
الاستعلامات هي:
# query to visualize number of blocks produced daily since 2016
SELECT
DATE_TRUNC('day', time) AS dt,
COUNT(*) AS block_count
FROM ethereum."blocks"
GROUP BY dt
OFFSET 1
# average number of blocks produced per day
WITH temp_table AS (
SELECT
DATE_TRUNC('day', time) AS dt,
COUNT(*) AS block_count
FROM ethereum."blocks"
GROUP BY dt
OFFSET 1
)
SELECT
AVG(block_count) AS avg_block_count
FROM temp_table
متوسط عدد الكتل المنتجة يوميًا منذ عام 2016 أعلى قليلاً من هذا الرقم عند 5,874. بدلاً من ذلك، فإن قسمة 86400 ثانية على 5874 متوسط الكتل ينتج عنه 14.7 ثانية أو ما يقرب من كتلة واحدة كل 15 ثانية.
الغاز
الكتل محدودة الحجم. الحد الأقصى لحجم الكتلة ديناميكي ويختلف وفقًا لطلب الشبكة بين 12,500,000 و 25,000,000 وحدة. الحدود مطلوبة لمنع أحجام الكتل الكبيرة بشكل عشوائي من الضغط على العقد الكاملة من حيث مساحة القرص ومتطلبات السرعة (المصدر).
تتمثل إحدى طرق تصور حد الغاز للكتلة في التفكير فيه على أنه المعروض من مساحة الكتلة المتاحة لتجميع المعاملات. يمكن الاستعلام عن حد الغاز للكتلة وتصوره من عام 2016 حتى يومنا هذا:
SELECT
DATE_TRUNC('day', time) AS dt,
AVG(gas_limit) AS avg_block_gas_limit
FROM ethereum."blocks"
GROUP BY dt
OFFSET 1
ثم هناك الغاز الفعلي المستخدم يوميًا لدفع تكاليف الحوسبة التي تتم على سلسلة إيثيريوم (أي إرسال معاملة، أو استدعاء عقد ذكي، أو سك رمز غير قابل للاستبدال). هذا هو الطلب على مساحة كتلة إيثيريوم المتاحة:
SELECT
DATE_TRUNC('day', time) AS dt,
AVG(gas_used) AS avg_block_gas_used
FROM ethereum."blocks"
GROUP BY dt
OFFSET 1
يمكننا أيضًا وضع هذين المخططين معًا لمعرفة كيف يتوافق الطلب والعرض:
لذلك يمكننا فهم أسعار الغاز كدالة للطلب على مساحة كتلة إيثيريوم، بالنظر إلى العرض المتاح.
أخيرًا، قد نرغب في الاستعلام عن متوسط أسعار الغاز اليومية لسلسلة إيثيريوم، ومع ذلك، فإن القيام بذلك سيؤدي إلى وقت استعلام طويل بشكل خاص، لذلك سنقوم بتصفية استعلامنا إلى متوسط كمية الغاز المدفوعة لكل معاملة بواسطة مؤسسة إيثيريوم.
يمكننا أن نرى أسعار الغاز المدفوعة لجميع المعاملات التي تمت إلى عنوان مؤسسة إيثيريوم على مر السنين. إليك الاستعلام:
SELECT
block_time,
gas_price / 1e9 AS gas_price_gwei,
value / 1e18 AS eth_sent
FROM ethereum."transactions"
WHERE "to" = '\xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe'
ORDER BY block_time DESC
الخلاصة
من خلال هذا البرنامج التعليمي، نفهم مفاهيم إيثيريوم الأساسية وكيف تعمل سلسلة كتل إيثيريوم من خلال الاستعلام والتعرف على البيانات على السلسلة.
يمكن العثور على لوحة المعلومات التي تحتوي على جميع التعليمات البرمجية المستخدمة في هذا البرنامج التعليمي هنا (opens in a new tab).
لمزيد من استخدام البيانات لاستكشاف Web3 تواصل معي على تويتر (opens in a new tab).










