اہم مواد پر جائیں

SQL کے ساتھ Ethereum کے بنیادی موضوعات سیکھیں

SQL
کوئری کرنا
ٹرانزیکشنز
ابتدائی
Paul Apivat
11 مئی، 2021
10 منٹ کی پڑھائی

بہت سے Ethereum ٹیوٹوریل ڈیولپرز کو ہدف بناتے ہیں، لیکن ڈیٹا تجزیہ کاروں یا ان لوگوں کے لیے تعلیمی وسائل کی کمی ہے جو کلائنٹ یا نوڈ چلائے بغیر آن چین ڈیٹا دیکھنا چاہتے ہیں۔

یہ ٹیوٹوریل قارئین کو Dune Analyticsopens in a new tab کے فراہم کردہ انٹرفیس کے ذریعے اسٹرکچرڈ کوئری لینگویج (SQL) کے ساتھ آن چین ڈیٹا کو کوئری کرکے ٹرانزیکشن، بلاکس اور گیس سمیت Ethereum کے بنیادی تصورات کو سمجھنے میں مدد کرتا ہے۔

آن چین ڈیٹا ہمیں Ethereum، نیٹ ورک، اور کمپیوٹنگ پاور کے لیے ایک معیشت کو سمجھنے میں مدد کر سکتا ہے اور اسے آج Ethereum کو درپیش چیلنجوں (یعنی گیس کی بڑھتی ہوئی قیمتوں) اور اس سے بھی اہم بات یہ ہے کہ اسکیلنگ کے حل کے بارے میں بات چیت کو سمجھنے کی بنیاد کے طور پر کام کرنا چاہیے۔

ٹرانزیکشنز

Ethereum پر صارف کا سفر صارف کے زیر کنٹرول اکاؤنٹ یا ETH بیلنس والی کسی ہستی کو شروع کرنے سے شروع ہوتا ہے۔ اکاؤنٹ کی دو قسمیں ہیں - صارف کے زیر کنٹرول یا ایک اسمارٹ کنٹریکٹ (دیکھیں ethereum.org

کسی بھی اکاؤنٹ کو Etherscanopens in a new tab یا Blockscoutopens in a new tab جیسے بلاک ایکسپلورر پر دیکھا جا سکتا ہے۔ بلاک ایکسپلورر Ethereum کے ڈیٹا کا ایک پورٹل ہیں۔ وہ حقیقی وقت میں، بلاکس، ٹرانزیکشنز، مائنرز، اکاؤنٹس اور دیگر آن چین سرگرمیوں پر ڈیٹا دکھاتے ہیں (یہاں دیکھیں here

تاہم، ایک صارف بیرونی بلاک ایکسپلوررز کے ذریعہ فراہم کردہ معلومات کو ہم آہنگ کرنے کے لیے براہ راست ڈیٹا کو کوئری کرنا چاہے گا۔ Dune Analyticsopens in a new tab SQL کے کچھ علم رکھنے والے کسی بھی شخص کو یہ صلاحیت فراہم کرتا ہے۔

حوالہ کے لیے، Ethereum فاؤنڈیشن (EF) کے لیے اسمارٹ کنٹریکٹ اکاؤنٹ کو Blockscoutopens in a new tab پر دیکھا جا سکتا ہے۔

ایک بات قابل غور ہے کہ تمام اکاؤنٹس، بشمول EF کے، کا ایک عوامی پتہ ہوتا ہے جسے ٹرانزیکشن بھیجنے اور وصول کرنے کے لیے استعمال کیا جا سکتا ہے۔

Etherscan پر اکاؤنٹ کا بیلنس باقاعدہ ٹرانزیکشنز اور اندرونی ٹرانزیکشنز پر مشتمل ہوتا ہے۔ اندرونی ٹرانزیکشنز، نام کے باوجود، اصل ٹرانزیکشنز نہیں ہیں جو چین کی حالت کو بدلتی ہیں۔ وہ ایک معاہدے کو انجام دینے کے ذریعے شروع کی گئی قدر کی منتقلی ہیں (sourceopens in a new tab)۔ چونکہ اندرونی ٹرانزیکشنز پر کوئی دستخط نہیں ہوتے ہیں، اس لیے وہ بلاک چین میں شامل نہیں ہوتے ہیں اور انہیں Dune Analytics سے کوئری نہیں کیا جا سکتا۔

لہذا، یہ ٹیوٹوریل باقاعدہ ٹرانزیکشنز پر توجہ مرکوز کرے گا۔ اسے اس طرح کوئری کیا جا سکتا ہے:

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
سب دکھائیں

اس سے وہی معلومات حاصل ہوں گی جو Etherscan کے ٹرانزیکشن پیج پر فراہم کی گئی ہیں۔ موازنہ کے لیے، یہاں دو ذرائع ہیں:

Etherscan

Blockscout پر EF کا کنٹریکٹ پیج۔opens in a new tab

ڈیون اینالیٹکس

آپ ڈیش بورڈ یہاںopens in a new tab تلاش کر سکتے ہیں۔ کوئری دیکھنے کے لیے ٹیبل پر کلک کریں (اوپر بھی دیکھیں)۔

ٹرانزیکشنز کو توڑنا

جمع کرائی گئی ٹرانزیکشن میں کئی معلومات شامل ہوتی ہیں (source):

  • وصول کنندہ: وصول کرنے والا پتہ ("to" کے طور پر کوئری کیا گیا)
  • دستخط: جبکہ بھیجنے والے کی نجی کلیدیں کسی ٹرانزیکشن پر دستخط کرتی ہیں، جو ہم SQL کے ساتھ کوئری کر سکتے ہیں وہ بھیجنے والے کا عوامی پتہ ہے ("from")۔
  • قدر: یہ منتقل شدہ ETH کی رقم ہے (ether کالم دیکھیں)۔
  • ڈیٹا: یہ صوابدیدی ڈیٹا ہے جسے ہیش کیا گیا ہے (data کالم دیکھیں)
  • gasLimit – گیس یونٹس کی زیادہ سے زیادہ مقدار جو ٹرانزیکشن کے ذریعے استعمال کی جا سکتی ہے۔ گیس کی اکائیاں کمپیوٹیشنل مراحل کی نمائندگی کرتی ہیں
  • maxPriorityFeePerGas - گیس کی زیادہ سے زیادہ مقدار جو مائنر کو ٹپ کے طور پر شامل کی جائے گی
  • maxFeePerGas - ٹرانزیکشن کے لیے ادا کی جانے والی گیس کی زیادہ سے زیادہ مقدار (بشمول baseFeePerGas اور maxPriorityFeePerGas)

ہم Ethereum فاؤنڈیشن کے عوامی پتے پر ٹرانزیکشنز کے لیے معلومات کے ان مخصوص ٹکڑوں کو کوئری کر سکتے ہیں:

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
سب دکھائیں

بلاکس

ہر ٹرانزیکشن Ethereum ورچوئل مشین (EVM) کی حالت کو بدل دے گی (source)۔ ٹرانزیکشنز کو تصدیق اور بلاک میں شامل کرنے کے لیے نیٹ ورک پر نشر کیا جاتا ہے۔ ہر ٹرانزیکشن ایک بلاک نمبر سے منسلک ہے۔ ڈیٹا دیکھنے کے لیے، ہم ایک مخصوص بلاک نمبر کو کوئری کر سکتے ہیں: 12396854 (اس تحریر کے مطابق Ethereum فاؤنڈیشن ٹرانزیکشنز میں سب سے حالیہ بلاک، 11/5/21)۔

مزید برآں، جب ہم اگلے دو بلاکس کو کوئری کرتے ہیں، تو ہم دیکھ سکتے ہیں کہ ہر بلاک میں پچھلے بلاک کا ہیش (یعنی پیرنٹ ہیش) ہوتا ہے، جو یہ ظاہر کرتا ہے کہ بلاک چین کیسے بنتا ہے۔

ہر بلاک میں اس کے پیرنٹ بلاک کا حوالہ ہوتا ہے۔ یہ نیچے hash اور parent_hash کالموں کے درمیان دکھایا گیا ہے (source):

parent_hash

Dune Analytics پر queryopens 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
سب دکھائیں

ہم وقت، بلاک نمبر، مشکل، ہیش، پیرنٹ ہیش، اور نونس کو کوئری کرکے ایک بلاک کا جائزہ لے سکتے ہیں۔

صرف ایک چیز جس کا یہ کوئری احاطہ نہیں کرتی ہے وہ ہے ٹرانزیکشن کی فہرست جس کے لیے نیچے ایک الگ کوئری اور اسٹیٹ روٹ درکار ہے۔ ایک مکمل یا آرکائیول نوڈ تمام ٹرانزیکشنز اور اسٹیٹ ٹرانزیشن کو اسٹور کرے گا، جس سے کلائنٹس کو کسی بھی وقت چین کی حالت کو کوئری کرنے کی اجازت ملے گی۔ چونکہ اس کے لیے بڑی اسٹوریج کی جگہ درکار ہے، ہم چین ڈیٹا کو اسٹیٹ ڈیٹا سے الگ کر سکتے ہیں:

  • چین ڈیٹا (بلاکس، ٹرانزیکشنز کی فہرست)
  • اسٹیٹ ڈیٹا (ہر ٹرانزیکشن کے اسٹیٹ ٹرانزیشن کا نتیجہ)

اسٹیٹ روٹ بعد میں آتا ہے اور یہ مضمر ڈیٹا ہے (آن چین ذخیرہ نہیں کیا گیا)، جبکہ چین ڈیٹا واضح ہے اور خود چین پر ذخیرہ کیا گیا ہے (sourceopens in a new tab

اس ٹیوٹوریل کے لیے، ہم آن چین ڈیٹا پر توجہ مرکوز کریں گے جسے Dune Analytics کے ذریعے SQL کے ساتھ کوئری کیا جا سکتا ہے۔

جیسا کہ اوپر بیان کیا گیا ہے، ہر بلاک میں ٹرانزیکشنز کی ایک فہرست ہوتی ہے، ہم اسے ایک مخصوص بلاک کے لیے فلٹر کرکے کوئری کر سکتے ہیں۔ ہم سب سے حالیہ بلاک، 12396854 کو آزمائیں گے:

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

Dune پر SQL آؤٹ پٹ یہ ہے:

چین میں شامل کیا جانے والا یہ واحد بلاک Ethereum ورچوئل مشین (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 سیکنڈ میں ایک بار کمٹ کیے جاتے ہیں (source

یہ دیکھنے کے لیے کہ تقریباً ہر 15 سیکنڈ میں ایک بلاک تیار ہوتا ہے، ہم ایک دن میں سیکنڈز کی تعداد (86400) کو 15 سے تقسیم کر کے روزانہ بلاکس کی تخمینی اوسط تعداد (~ 5760) حاصل کر سکتے ہیں۔

روزانہ تیار ہونے والے Ethereum بلاکس (2016 - حال) کا چارٹ یہ ہے:

اس مدت میں روزانہ تیار ہونے والے بلاکس کی اوسط تعداد ~5,874 ہے:

کوئریز یہ ہیں:

1# query to visualize number of blocks produced daily since 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# average number of blocks produced per day
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 یونٹس کے درمیان مختلف ہوتا ہے۔ ڈسک کی جگہ اور رفتار کی ضروریات کے لحاظ سے مکمل نوڈس پر دباؤ ڈالنے والے من مانے بڑے بلاک سائز کو روکنے کے لیے حدود کی ضرورت ہوتی ہے (source

بلاک گیس کی حد کا تصور کرنے کا ایک طریقہ یہ ہے کہ اسے دستیاب بلاک کی جگہ کی سپلائی کے طور پر سوچا جائے جس میں ٹرانزیکشنز کو بیچ کیا جائے۔ بلاک گیس کی حد کو 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

پھر Ethereum چین پر کیے گئے کمپیوٹنگ کی ادائیگی کے لیے روزانہ استعمال ہونے والی اصل گیس ہے (یعنی ٹرانزیکشن بھیجنا، اسمارٹ کنٹریکٹ کو کال کرنا، NFT منٹ کرنا)۔ یہ دستیاب Ethereum بلاک کی جگہ کے لیے ڈیمانڈ ہے:

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

لہذا ہم گیس کی قیمتوں کو Ethereum بلاک کی جگہ کی طلب کے ایک فنکشن کے طور پر سمجھ سکتے ہیں، دی گئی دستیاب سپلائی۔

آخر میں، ہم Ethereum چین کے لیے اوسط روزانہ گیس کی قیمتوں کو کوئری کرنا چاہیں گے، تاہم، ایسا کرنے سے خاص طور پر طویل کوئری وقت کا نتیجہ ہوگا، لہذا ہم اپنی کوئری کو Ethereum فاؤنڈیشن کی طرف سے فی ٹرانزیکشن ادا کی گئی گیس کی اوسط رقم تک فلٹر کریں گے۔

ہم سالوں کے دوران Ethereum فاؤنڈیشن کے پتے پر کی گئی تمام ٹرانزیکشنز کے لیے ادا کی گئی گیس کی قیمتیں دیکھ سکتے ہیں۔ کوئری یہ ہے:

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

خلاصہ

اس ٹیوٹوریل کے ساتھ، ہم آن چین ڈیٹا کو کوئری کرکے اور اس کا احساس حاصل کرکے Ethereum کے بنیادی تصورات اور Ethereum بلاک چین کے کام کرنے کے طریقے کو سمجھتے ہیں۔

اس ٹیوٹوریل میں استعمال ہونے والا تمام کوڈ رکھنے والا ڈیش بورڈ یہاںopens in a new tab پایا جا سکتا ہے۔

web3 کو دریافت کرنے کے لیے ڈیٹا کے مزید استعمال کے لیے مجھے ٹویٹر پر تلاش کریںopens in a new tab۔

صفحہ کی آخری تازہ کاری: 29 ستمبر، 2025

کیا یہ ٹیوٹوریل کارآمد تھا؟