SQL-এর সাহায্যে ইথেরিয়ামের মৌলিক বিষয়গুলো শিখুন
অনেক ইথেরিয়াম টিউটোরিয়াল ডেভেলপারদের লক্ষ্য করে তৈরি করা হয়, কিন্তু ডেটা অ্যানালিস্টদের জন্য বা যারা ক্লায়েন্ট বা নোড না চালিয়ে অনচেইন ডেটা দেখতে চান তাদের জন্য শিক্ষামূলক রিসোর্সের অভাব রয়েছে।
এই টিউটোরিয়ালটি পাঠকদের 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 দিয়ে কোয়েরি করা যায় না।
তাই, এই টিউটোরিয়ালটি সাধারণ ট্রানজ্যাকশনের ওপর ফোকাস করবে। এটি এভাবে কোয়েরি করা যেতে পারে:
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-এ EF-এর কন্ট্রাক্ট পেজ। (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 কলামের মধ্যে দেখানো হয়েছে (সোর্স):
এখানে Dune Analytics-এ কোয়েরিটি (opens in a new tab) দেওয়া হলো:
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))।
এই টিউটোরিয়ালের জন্য, আমরা অনচেইন ডেটার ওপর ফোকাস করব যা Dune Analytics-এর মাধ্যমে SQL দিয়ে কোয়েরি করা যেতে পারে।
উপরে যেমন বলা হয়েছে, প্রতিটি ব্লক-এ ট্রানজ্যাকশনের একটি তালিকা থাকে, আমরা একটি নির্দিষ্ট ব্লক-এর জন্য ফিল্টার করে এটি কোয়েরি করতে পারি। আমরা সবচেয়ে সাম্প্রতিক ব্লক, 12396854 চেষ্টা করব:
SELECT * FROM ethereum."transactions"
WHERE block_number = 12396854
ORDER BY block_time DESC`
এখানে Dune-এ SQL আউটপুট দেওয়া হলো:
চেইন-এ যুক্ত হওয়া এই একক ব্লক-টি ইথেরিয়াম ভার্চুয়াল মেশিনের (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 সেকেন্ডে একটি ব্লক তৈরি হয় তা দেখতে, আমরা প্রতিদিনের আনুমানিক গড় ব্লক সংখ্যা (~ 5760) পেতে এক দিনের সেকেন্ডের সংখ্যাকে (86400) 15 দিয়ে ভাগ করতে পারি।
প্রতিদিন তৈরি হওয়া ইথেরিয়াম ব্লক-গুলোর (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
এরপর রয়েছে ইথেরিয়াম চেইন-এ করা কম্পিউটিংয়ের (যেমন, ট্রানজ্যাকশন পাঠানো, একটি স্মার্ট কন্ট্রাক্ট কল করা, একটি NFT মিন্টিং করা) জন্য প্রতিদিন ব্যবহৃত প্রকৃত গ্যাস। এটি হলো উপলব্ধ ইথেরিয়াম ব্লক স্পেসের চাহিদা:
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)।










