WebSockets ব্যবহার করা
এটি ইথেরিয়াম ব্লকচেইনে রিকোয়েস্ট করার জন্য WebSockets এবং Alchemy ব্যবহারের একটি প্রাথমিক স্তরের গাইড।
(opens in a new tab)WebSockets বনাম HTTP
HTTP-এর বিপরীতে, WebSockets-এর মাধ্যমে নির্দিষ্ট তথ্যের প্রয়োজন হলে আপনাকে বারবার রিকোয়েস্ট করতে হয় না। WebSockets আপনার জন্য একটি নেটওয়ার্ক সংযোগ বজায় রাখে (যদি সঠিকভাবে করা হয়) এবং পরিবর্তনের জন্য অপেক্ষা করে।
যেকোনো নেটওয়ার্ক সংযোগের মতোই, আপনার এমনটা ধরে নেওয়া উচিত নয় যে একটি WebSocket কোনো বাধা ছাড়াই চিরকাল খোলা থাকবে, তবে ড্রপ হওয়া সংযোগগুলো এবং ম্যানুয়ালি পুনরায় সংযোগ করার বিষয়টি সঠিকভাবে পরিচালনা করা বেশ চ্যালেঞ্জিং হতে পারে। WebSockets-এর আরেকটি অসুবিধা হলো আপনি রেসপন্সে কোনো HTTP স্ট্যাটাস কোড পান না, বরং শুধুমাত্র এরর মেসেজ পান।
Alchemy Web3 (opens in a new tab) কোনো কনফিগারেশন ছাড়াই স্বয়ংক্রিয়ভাবে WebSocket ফেইলিওর এবং রিট্রাই পরিচালনা করে।
নিজে চেষ্টা করে দেখুন
WebSockets পরীক্ষা করার সবচেয়ে সহজ উপায় হলো WebSocket রিকোয়েস্ট করার জন্য একটি কমান্ড লাইন টুল ইনস্টল করা, যেমন wscat (opens in a new tab)। wscat ব্যবহার করে, আপনি নিচের মতো করে রিকোয়েস্ট পাঠাতে পারেন:
নোট: আপনার যদি একটি Alchemy অ্যাকাউন্ট থাকে তবে আপনি demo-কে আপনার নিজস্ব API কী দিয়ে প্রতিস্থাপন করতে পারেন। এখানে একটি বিনামূল্যের Alchemy অ্যাকাউন্টের জন্য সাইন আপ করুন! (opens in a new tab)
wscat -c wss://eth-mainnet.ws.alchemyapi.io/ws/demo
> {"jsonrpc": "2.0", "id": 0, "method": "eth_gasPrice"}
< {"jsonrpc": "2.0", "result": "0xb2d05e00", "id": 0}
WebSockets কীভাবে ব্যবহার করবেন
শুরু করতে, আপনার অ্যাপের জন্য WebSocket URL ব্যবহার করে একটি WebSocket খুলুন। আপনি আপনার ড্যাশবোর্ডে (opens in a new tab) অ্যাপের পেজটি খুলে এবং "View Key"-তে ক্লিক করে আপনার অ্যাপের WebSocket URL খুঁজে পেতে পারেন। মনে রাখবেন যে WebSockets-এর জন্য আপনার অ্যাপের URL এবং HTTP রিকোয়েস্টের জন্য এর URL আলাদা, তবে "View Key"-তে ক্লিক করে উভয়ই পাওয়া যেতে পারে।
Alchemy API রেফারেন্সে (opens in a new tab) তালিকাভুক্ত যেকোনো API WebSocket-এর মাধ্যমে ব্যবহার করা যেতে পারে। এটি করার জন্য, একটি HTTP POST রিকোয়েস্টের বডি হিসেবে যে পেলোড পাঠানো হতো সেটিই ব্যবহার করুন, তবে এর পরিবর্তে সেই পেলোডটি WebSocket-এর মাধ্যমে পাঠান।
Web3-এর সাথে
Web3-এর মতো একটি ক্লায়েন্ট লাইব্রেরি ব্যবহার করার সময় WebSockets-এ ট্রানজিশন করা সহজ। আপনার Web3 ক্লায়েন্ট ইনস্ট্যানশিয়েট করার সময় কেবল HTTP-এর পরিবর্তে WebSocket URL পাস করুন। উদাহরণস্বরূপ:
const web3 = new Web3("wss://eth-mainnet.ws.alchemyapi.io/ws/your-api-key")
web3.eth.getBlockNumber().then(console.log) // -> 7946893
সাবস্ক্রিপশন API
একটি WebSocket-এর মাধ্যমে সংযুক্ত থাকার সময়, আপনি দুটি অতিরিক্ত মেথড ব্যবহার করতে পারেন: eth_subscribe এবং eth_unsubscribe। এই মেথডগুলো আপনাকে নির্দিষ্ট ইভেন্টগুলোর জন্য অপেক্ষা করতে এবং তাৎক্ষণিকভাবে নোটিফিকেশন পেতে সাহায্য করবে।
eth_subscribe
নির্দিষ্ট ইভেন্টগুলোর জন্য একটি নতুন সাবস্ক্রিপশন তৈরি করে। eth_subscribe সম্পর্কে আরও জানুন (opens in a new tab)।
প্যারামিটার
- সাবস্ক্রিপশনের ধরন
- ঐচ্ছিক প্যারামিটার
প্রথম আর্গুমেন্টটি নির্দিষ্ট করে যে কোন ধরনের ইভেন্টের জন্য অপেক্ষা করতে হবে। দ্বিতীয় আর্গুমেন্টে অতিরিক্ত অপশন থাকে যা প্রথম আর্গুমেন্টের ওপর নির্ভর করে। বিভিন্ন সাবস্ক্রিপশনের ধরন, তাদের অপশন এবং তাদের ইভেন্ট পেলোডগুলো নিচে বর্ণনা করা হলো।
রিটার্নস (Returns)
সাবস্ক্রিপশন ID: এই ID-টি প্রাপ্ত যেকোনো ইভেন্টের সাথে যুক্ত থাকবে এবং eth_unsubscribe ব্যবহার করে সাবস্ক্রিপশন বাতিল করতেও ব্যবহার করা যেতে পারে।
সাবস্ক্রিপশন ইভেন্ট
সাবস্ক্রিপশন সক্রিয় থাকাকালীন, আপনি ইভেন্ট পাবেন যা নিচের ফিল্ডগুলোসহ অবজেক্ট হিসেবে থাকে:
jsonrpc: সর্বদা "2.0"method: সর্বদা "eth_subscription"params: নিচের ফিল্ডগুলোসহ একটি অবজেক্ট:subscription:eth_subscribeকলের মাধ্যমে রিটার্ন করা সাবস্ক্রিপশন ID যা এই সাবস্ক্রিপশনটি তৈরি করেছে।result: একটি অবজেক্ট যার বিষয়বস্তু সাবস্ক্রিপশনের ধরনের ওপর নির্ভর করে পরিবর্তিত হয়।
সাবস্ক্রিপশনের ধরন
alchemy_newFullPendingTransactions
পেন্ডিং স্টেটে যোগ করা সমস্ত ট্রানজ্যাকশনের জন্য ট্রানজ্যাকশন তথ্য রিটার্ন করে। এই সাবস্ক্রিপশনের ধরনটি স্ট্যান্ডার্ড Web3 কল web3.eth.subscribe("pendingTransactions")-এর মতোই পেন্ডিং ট্রানজ্যাকশনগুলোতে সাবস্ক্রাইব করে, তবে পার্থক্য হলো এটি শুধুমাত্র ট্রানজ্যাকশন হ্যাশের পরিবর্তে সম্পূর্ণ ট্রানজ্যাকশন তথ্য প্রদান করে।
উদাহরণ:
> {"jsonrpc": "2.0", "id": 1, "method": "eth_subscribe", "params": ["alchemy_newFullPendingTransactions"]}
< {"id":1,"result":"0x9a52eeddc2b289f985c0e23a7d8427c8","jsonrpc":"2.0"}
< {
"jsonrpc":"2.0",
"method":"eth_subscription",
"params":{
"result":{
"blockHash":null,
"blockNumber":null,
"from":"0xa36452fc31f6f482ad823cd1cf5515177d57667f",
"gas":"0x1adb0",
"gasPrice":"0x7735c4d40",
"hash":"0x50bff0736c713458c92dd1848d12f3354149be1363123dae35e94e0f2a9d56bf",
"input":"0xa9059cbb0000000000000000000000000d0707963952f2fba59dd06f2b425ace40b492fe0000000000000000000000000000000000000000000015b1111266cfca100000",
"nonce":"0x0",
"to":"0xea38eaa3c86c8f9b751533ba2e562deb9acded40",
"transactionIndex":null,
"value":"0x0",
"v":"0x26",
"r":"0x195c2c1ed126088e12d290aa93541677d3e3b1d10f137e11f86b1b9227f01e3b",
"s":"0x60fc4edbf1527832a2a36dbc1e63ed6193a6eee654472fbebbf88ef1750b5344"},
"subscription":"0x9a52eeddc2b289f985c0e23a7d8427c8"
}
}
newHeads
চেইনে নতুন কোনো হেডার যোগ করা হলে, এমনকি চেইন রি-অর্গ চলাকালীন সময়েও এটি একটি ইভেন্ট প্রদান করে।
যখন একটি চেইন রি-অর্গ ঘটে, তখন এই সাবস্ক্রিপশনটি নতুন চেইনের জন্য সমস্ত নতুন হেডার ধারণকারী একটি ইভেন্ট প্রদান করবে। বিশেষ করে, এর মানে হলো আপনি একই উচ্চতার একাধিক হেডার দেখতে পেতে পারেন এবং যখন এমনটি ঘটে তখন রি-অর্গের পরে আসা পরবর্তী হেডারটিকে সঠিক হিসেবে ধরে নেওয়া উচিত।
উদাহরণ:
> {"jsonrpc": "2.0", "id": 1, "method": "eth_subscribe", "params": ["newHeads"]}
< {"jsonrpc":"2.0","id":2,"result":"0x9ce59a13059e417087c02d3236a0b1cc"}
< {
"jsonrpc": "2.0",
"method": "eth_subscription",
"params": {
"result": {
"extraData": "0xd983010305844765746887676f312e342e328777696e646f7773",
"gasLimit": "0x47e7c4",
"gasUsed": "0x38658",
"logsBloom":
"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
"nonce": "0x084149998194cc5f",
"number": "0x1348c9",
"parentHash": "0x7736fab79e05dc611604d22470dadad26f56fe494421b5b333de816ce1f25701",
"receiptRoot": "0x2fab35823ad00c7bb388595cb46652fe7886e00660a01e867824d3dceb1c8d36",
"sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
"stateRoot": "0xb3346685172db67de536d8765c43c31009d0eb3bd9c501c9be3229203f15f378",
"timestamp": "0x56ffeff8",
"transactionsRoot": "0x0167ffa60e3ebc0b080cdb95f7c0087dd6c0e61413140e39d94d3468d7c9689f"
},
"subscription": "0x9ce59a13059e417087c02d3236a0b1cc"
}
}
logs
নির্দিষ্ট ফিল্টার মানদণ্ডের সাথে মিলে যাওয়া নতুন যোগ করা ব্লকগুলোর অংশ হিসেবে থাকা লগগুলো প্রদান করে।
যখন একটি চেইন রি-অর্গ ঘটে, তখন পুরানো চেইনের ব্লকগুলোর অংশ হিসেবে থাকা লগগুলো removed প্রপার্টি true-তে সেট করে পুনরায় প্রদান করা হবে। এছাড়া, নতুন চেইনের ব্লকগুলোর অংশ হিসেবে থাকা লগগুলোও প্রদান করা হয়, যার মানে হলো রি-অর্গের ক্ষেত্রে একই ট্রানজ্যাকশনের জন্য একাধিকবার লগ দেখা সম্ভব।
প্যারামিটার
- নিচের ফিল্ডগুলোসহ একটি অবজেক্ট:
address(ঐচ্ছিক): একটি ঠিকানাকে উপস্থাপনকারী স্ট্রিং অথবা এই ধরনের স্ট্রিংগুলোর একটি অ্যারে।- শুধুমাত্র এই ঠিকানাগুলোর যেকোনো একটি থেকে তৈরি করা লগগুলো প্রদান করা হবে।
topics: টপিক স্পেসিফায়ারগুলোর একটি অ্যারে।- প্রতিটি টপিক স্পেসিফায়ার হতে পারে
null, একটি টপিককে উপস্থাপনকারী স্ট্রিং, অথবা স্ট্রিংগুলোর একটি অ্যারে। - অ্যারের প্রতিটি পজিশন যা
nullনয়, তা প্রদান করা লগগুলোকে শুধুমাত্র তাদের মধ্যেই সীমাবদ্ধ করে যাদের সেই পজিশনে প্রদত্ত টপিকগুলোর মধ্যে একটি রয়েছে।
- প্রতিটি টপিক স্পেসিফায়ার হতে পারে
টপিক স্পেসিফিকেশনের কিছু উদাহরণ:
[]: যেকোনো টপিক অনুমোদিত।[A]: প্রথম পজিশনে A (এবং এরপর যেকোনো কিছু)।[null, B]: প্রথম পজিশনে যেকোনো কিছু এবং দ্বিতীয় পজিশনে B (এবং এরপর যেকোনো কিছু)।[A, B]: প্রথম পজিশনে A এবং দ্বিতীয় পজিশনে B (এবং এরপর যেকোনো কিছু)।[[A, B], [A, B]]: প্রথম পজিশনে (A অথবা B) এবং দ্বিতীয় পজিশনে (A অথবা B) (এবং এরপর যেকোনো কিছু)।
উদাহরণ:
> {"jsonrpc": "2.0", "id": 1, "method": "eth_subscribe", "params": ["logs", {"address": "0x8320fe7702b96808f7bbc0d4a888ed1468216cfd", "topics": ["0xd78a0cb8bb633d06981248b816e7bd33c2a35a6089241d099fa519e361cab902"]}]}
< {"jsonrpc":"2.0","id":2,"result":"0x4a8a4c0517381924f9838102c5a4dcb7"}
< {
"jsonrpc": "2.0",
"method": "eth_subscription",
"params": {
"subscription": "0x4a8a4c0517381924f9838102c5a4dcb7",
"result": {
"address": "0x8320fe7702b96808f7bbc0d4a888ed1468216cfd",
"blockHash": "0x61cdb2a09ab99abf791d474f20c2ea89bf8de2923a2d42bb49944c8c993cbf04",
"blockNumber": "0x29e87",
"data": "0x00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003",
"logIndex":"0x0",
"topics":["0xd78a0cb8bb633d06981248b816e7bd33c2a35a6089241d099fa519e361cab902"],
"transactionHash": "0xe044554a0a55067caafd07f8020ab9f2af60bdfe337e395ecd84b4877a3d1ab4",
"transactionIndex": "0x0"
}
}
}
eth_unsubscribe
একটি বিদ্যমান সাবস্ক্রিপশন বাতিল করে যাতে আর কোনো ইভেন্ট পাঠানো না হয়।
প্যারামিটার
- সাবস্ক্রিপশন ID, যা পূর্বে একটি
eth_subscribeকল থেকে রিটার্ন করা হয়েছিল।
রিটার্নস (Returns)
সাবস্ক্রিপশন সফলভাবে বাতিল হলে true, অথবা প্রদত্ত ID-এর সাথে কোনো সাবস্ক্রিপশন না থাকলে false।
উদাহরণ:
রিকোয়েস্ট
curl https://eth-mainnet.alchemyapi.io/v2/your-api-key
-X POST
-H "Content-Type: application/json"
-d '{"id": 1, "method": "eth_unsubscribe", "params": ["0x9cef478923ff08bf67fde6c64013158d"]}'
ফলাফল
{
"jsonrpc": "2.0",
"id": 1,
"result": true
}
বিনামূল্যে Alchemy-তে সাইন আপ করুন (opens in a new tab), আমাদের ডকুমেন্টেশন (opens in a new tab) দেখুন এবং সর্বশেষ খবরের জন্য টুইটার (opens in a new tab)-এ আমাদের অনুসরণ করুন।
