মূল কন্টেন্টে যান

এসকিউএল (SQL) দিয়ে ইথিরিয়ামের মৌলিক বিষয়গুলো শিখুন

SQL
কোয়েরিং
লেনদেন
ডাটা এবং এনালাইটিক্স
শিক্ষানবিস
পল এপিভ্যাট
১১ মে, ২০২১
8 মিনিট পড়া

অনেক ইথিরিয়াম টিউটোরিয়াল ডেভেলপারদের লক্ষ্য করে তৈরি করা হয়, কিন্তু ডাটা অ্যানালিস্টদের জন্য বা যারা কোনো ক্লায়েন্ট বা নোড না চালিয়ে অনচেইন ডাটা দেখতে চান তাদের জন্য শিক্ষামূলক রিসোর্সের অভাব রয়েছে।

এই টিউটোরিয়ালটি পাঠকদের Dune Analytics (opens in a new tab)-এর দেওয়া একটি ইন্টারফেসের মাধ্যমে স্ট্রাকচার্ড কোয়েরি ল্যাঙ্গুয়েজ (SQL) দিয়ে অনচেইন ডাটা কোয়েরি করে লেনদেন, ব্লকস এবং গ্যাস সহ ইথিরিয়ামের মৌলিক ধারণাগুলো বুঝতে সাহায্য করে।

অনচেইন ডাটা আমাদের ইথিরিয়াম, নেটওয়ার্ক এবং কম্পিউটিং পাওয়ারের একটি অর্থনীতি হিসেবে বুঝতে সাহায্য করতে পারে। এটি বর্তমানে ইথিরিয়ামের সম্মুখীন হওয়া চ্যালেঞ্জগুলো (যেমন, ক্রমবর্ধমান গ্যাস প্রাইস) এবং আরও গুরুত্বপূর্ণভাবে, স্কেলিং সমাধানগুলোর আলোচনা বোঝার ভিত্তি হিসেবে কাজ করা উচিত।

লেনদেন

ইথিরিয়ামে একজন ব্যবহারকারীর যাত্রা শুরু হয় একটি ব্যবহারকারী-নিয়ন্ত্রিত একাউন্ট বা 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)-এ দেখা যেতে পারে।

একটি বিষয় লক্ষণীয় যে, EF-এর একাউন্ট সহ সব একাউন্টেরই একটি পাবলিক এডড্রেস থাকে যা লেনদেন পাঠাতে এবং গ্রহণ করতে ব্যবহার করা যেতে পারে।

Etherscan-এ একাউন্ট ব্যালেন্সে সাধারণ লেনদেন এবং ইন্টারনাল লেনদেন অন্তর্ভুক্ত থাকে। ইন্টারনাল লেনদেন, নাম সত্ত্বেও, প্রকৃত লেনদেন নয় যা চেইনের স্টেট পরিবর্তন করে। এগুলো হলো একটি কন্ট্রাক্ট এক্সিকিউট করার মাধ্যমে শুরু হওয়া ভ্যালু ট্রান্সফার (সোর্স (opens 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

Etherscan ট্রানজেকশন এক্সপ্লোরার ভিউয়ের স্ক্রিনশট

Blockscout-এ EF-এর কন্ট্রাক্ট পেজ। (opens in a new tab)

Dune Analytics

Dune Analytics কোয়েরি ড্যাশবোর্ডের স্ক্রিনশট

আপনি ড্যাশবোর্ডটি এখানে (opens in a new tab) খুঁজে পেতে পারেন। কোয়েরি দেখতে টেবিলটিতে ক্লিক করুন (উপরেও দেখুন)।

লেনদেন বিশ্লেষণ করা

একটি সাবমিট করা লেনদেনে বেশ কিছু তথ্য অন্তর্ভুক্ত থাকে, যার মধ্যে রয়েছে (সোর্স):

  • প্রাপক (Recipient): গ্রহণকারী এডড্রেস ("to" হিসেবে কোয়েরি করা হয়)
  • সিগনেচার (Signature): যদিও একজন প্রেরকের প্রাইভেট কি একটি লেনদেনে সাইন করে, আমরা এসকিউএল (SQL) দিয়ে যা কোয়েরি করতে পারি তা হলো প্রেরকের পাবলিক এডড্রেস ("from")।
  • ভ্যালু (Value): এটি হলো ট্রান্সফার করা ETH-এর পরিমাণ (ether কলাম দেখুন)।
  • ডাটা (Data): এটি হলো আরবিট্রারি ডাটা যা হ্যাস করা হয়েছে (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

এখানে Dune Analytics-এ কোয়েরিটি (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))।

এই টিউটোরিয়ালের জন্য, আমরা অনচেইন ডাটার ওপর ফোকাস করব যা Dune Analytics-এর মাধ্যমে এসকিউএল (SQL) দিয়ে কোয়েরি করা যেতে পারে

উপরে যেমন বলা হয়েছে, প্রতিটি ব্লকে লেনদেনের একটি তালিকা থাকে, আমরা একটি নির্দিষ্ট ব্লকের জন্য ফিল্টার করে এটি কোয়েরি করতে পারি। আমরা সবচেয়ে সাম্প্রতিক ব্লক, 12396854 চেষ্টা করব:

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

এখানে Dune-এ এসকিউএল (SQL) আউটপুট দেওয়া হলো:

ইথিরিয়াম লেনদেনের তালিকার স্ক্রিনশট

চেইনে যুক্ত হওয়া এই একক ব্লকটি ইথিরিয়াম ভার্চুয়াল মেশিন (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 সেকেন্ডে একটি ব্লক তৈরি হয় তা দেখতে, আমরা প্রতিদিনের আনুমানিক গড় ব্লকের সংখ্যা (~ 5760) পেতে এক দিনের সেকেন্ডের সংখ্যাকে (86400) 15 দিয়ে ভাগ করতে পারি।

প্রতিদিন তৈরি হওয়া ইথিরিয়াম ব্লকের চার্ট (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 ইউনিটের মধ্যে পরিবর্তিত হয়। ডিস্ক স্পেস এবং গতির প্রয়োজনীয়তার দিক থেকে ফুল নোড-গুলোর ওপর চাপ সৃষ্টি করা থেকে ইচ্ছামতো বড় ব্লকের আকার রোধ করতে লিমিট প্রয়োজন (সোর্স)।

ব্লক গ্যাস লিমিট-কে ধারণা করার একটি উপায় হলো এটিকে লেনদেন ব্যাচ করার জন্য উপলব্ধ ব্লক স্পেসের সাপ্লাই হিসেবে চিন্তা করা। ব্লক গ্যাস লিমিট 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

এরপর রয়েছে ইথিরিয়াম চেইনে করা কম্পিউটিংয়ের (যেমন, লেনদেন পাঠানো, একটি স্মার্ট কন্ট্রাক্ট কল করা, একটি NFT মিন্ট করা) জন্য প্রতিদিন ব্যবহৃত প্রকৃত গ্যাস। এটি হলো উপলব্ধ ইথিরিয়াম ব্লক স্পেসের চাহিদা:

দৈনিক ব্যবহৃত ইথিরিয়াম গ্যাস দেখানো চার্ট

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)

পেজ সর্বশেষ আপডেট: ২৬ ফেব্রুয়ারী, ২০২৬

এই টিউটোরিয়ালটি কি সহায়ক ছিল?