---
title: "WebSockets ব্যবহার করা"
description: "JSON-RPC রিকোয়েস্ট করতে এবং ইভেন্ট সাবস্ক্রাইব করতে WebSockets এবং Alchemy ব্যবহারের গাইড।"
author: "এলান হ্যালপার্ন"
lang: bn
tags: ["Alchemy", "websockets", "কোয়েরি করা", "JavaScript"]
skill: beginner
breadcrumb: WebSockets
source: Alchemy docs
sourceUrl: https://www.alchemy.com/docs/reference/best-practices-for-using-websockets-in-web3
published: 2020-12-01
---

এটি ইথেরিয়াম ব্লকচেইনে রিকোয়েস্ট করার জন্য WebSockets এবং Alchemy ব্যবহারের একটি প্রাথমিক স্তরের গাইড।

## WebSockets বনাম HTTP {#websockets-vs-http}

HTTP-এর বিপরীতে, WebSockets-এর মাধ্যমে নির্দিষ্ট তথ্যের প্রয়োজন হলে আপনাকে বারবার রিকোয়েস্ট করতে হয় না। WebSockets আপনার জন্য একটি নেটওয়ার্ক সংযোগ বজায় রাখে (যদি সঠিকভাবে করা হয়) এবং পরিবর্তনের জন্য অপেক্ষা করে।

যেকোনো নেটওয়ার্ক সংযোগের মতোই, আপনার এমনটা ধরে নেওয়া উচিত নয় যে একটি WebSocket কোনো বাধা ছাড়াই চিরকাল খোলা থাকবে, তবে ড্রপ হওয়া সংযোগগুলো এবং ম্যানুয়ালি পুনরায় সংযোগ করার বিষয়টি সঠিকভাবে পরিচালনা করা বেশ চ্যালেঞ্জিং হতে পারে। WebSockets-এর আরেকটি অসুবিধা হলো আপনি রেসপন্সে কোনো HTTP স্ট্যাটাস কোড পান না, বরং শুধুমাত্র এরর মেসেজ পান।

​[Alchemy Web3](https://docs.alchemy.com/reference/api-overview) কোনো কনফিগারেশন ছাড়াই স্বয়ংক্রিয়ভাবে WebSocket ফেইলিওর এবং রিট্রাই পরিচালনা করে।

## নিজে চেষ্টা করে দেখুন {#try-it-out}

WebSockets পরীক্ষা করার সবচেয়ে সহজ উপায় হলো WebSocket রিকোয়েস্ট করার জন্য একটি কমান্ড লাইন টুল ইনস্টল করা, যেমন [wscat](https://github.com/websockets/wscat)। wscat ব্যবহার করে, আপনি নিচের মতো করে রিকোয়েস্ট পাঠাতে পারেন:

_নোট: আপনার যদি একটি Alchemy অ্যাকাউন্ট থাকে তবে আপনি `demo`-কে আপনার নিজস্ব API কী দিয়ে প্রতিস্থাপন করতে পারেন। [এখানে একটি বিনামূল্যের Alchemy অ্যাকাউন্টের জন্য সাইন আপ করুন!](https://auth.alchemy.com/signup)_

```
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 কীভাবে ব্যবহার করবেন {#how-to-use-websockets}

শুরু করতে, আপনার অ্যাপের জন্য WebSocket URL ব্যবহার করে একটি WebSocket খুলুন। আপনি [আপনার ড্যাশবোর্ডে](https://dashboard.alchemy.com/) অ্যাপের পেজটি খুলে এবং "View Key"-তে ক্লিক করে আপনার অ্যাপের WebSocket URL খুঁজে পেতে পারেন। মনে রাখবেন যে WebSockets-এর জন্য আপনার অ্যাপের URL এবং HTTP রিকোয়েস্টের জন্য এর URL আলাদা, তবে "View Key"-তে ক্লিক করে উভয়ই পাওয়া যেতে পারে।

![Where to find your WebSocket URL in your Alchemy dashboard](./use-websockets.mp4#602x280)

[Alchemy API রেফারেন্সে](https://www.alchemy.com/docs/reference/api-overview) তালিকাভুক্ত যেকোনো API WebSocket-এর মাধ্যমে ব্যবহার করা যেতে পারে। এটি করার জন্য, একটি HTTP POST রিকোয়েস্টের বডি হিসেবে যে পেলোড পাঠানো হতো সেটিই ব্যবহার করুন, তবে এর পরিবর্তে সেই পেলোডটি WebSocket-এর মাধ্যমে পাঠান।

## Web3-এর সাথে {#with-web3}

Web3-এর মতো একটি ক্লায়েন্ট লাইব্রেরি ব্যবহার করার সময় WebSockets-এ ট্রানজিশন করা সহজ। আপনার Web3 ক্লায়েন্ট ইনস্ট্যানশিয়েট করার সময় কেবল HTTP-এর পরিবর্তে WebSocket URL পাস করুন। উদাহরণস্বরূপ:

```js
const web3 = new Web3("wss://eth-mainnet.ws.alchemyapi.io/ws/your-api-key")

web3.eth.getBlockNumber().then(console.log) // -> 7946893
```

## সাবস্ক্রিপশন API {#subscription-api}

একটি WebSocket-এর মাধ্যমে সংযুক্ত থাকার সময়, আপনি দুটি অতিরিক্ত মেথড ব্যবহার করতে পারেন: `eth_subscribe` এবং `eth_unsubscribe`। এই মেথডগুলো আপনাকে নির্দিষ্ট ইভেন্টগুলোর জন্য অপেক্ষা করতে এবং তাৎক্ষণিকভাবে নোটিফিকেশন পেতে সাহায্য করবে।

### `eth_subscribe` {#eth-subscribe}

নির্দিষ্ট ইভেন্টগুলোর জন্য একটি নতুন সাবস্ক্রিপশন তৈরি করে। [`eth_subscribe` সম্পর্কে আরও জানুন](https://docs.alchemy.com/reference/eth-subscribe)।

#### প্যারামিটার {#parameters}

1. সাবস্ক্রিপশনের ধরন
2. ঐচ্ছিক প্যারামিটার

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

#### রিটার্নস (Returns) {#returns}

সাবস্ক্রিপশন ID: এই ID-টি প্রাপ্ত যেকোনো ইভেন্টের সাথে যুক্ত থাকবে এবং `eth_unsubscribe` ব্যবহার করে সাবস্ক্রিপশন বাতিল করতেও ব্যবহার করা যেতে পারে।

#### সাবস্ক্রিপশন ইভেন্ট {#subscription-events}

সাবস্ক্রিপশন সক্রিয় থাকাকালীন, আপনি ইভেন্ট পাবেন যা নিচের ফিল্ডগুলোসহ অবজেক্ট হিসেবে থাকে:

- `jsonrpc`: সর্বদা "2.0"
- `method`: সর্বদা "eth_subscription"
- `params`: নিচের ফিল্ডগুলোসহ একটি অবজেক্ট:
  - `subscription`: `eth_subscribe` কলের মাধ্যমে রিটার্ন করা সাবস্ক্রিপশন ID যা এই সাবস্ক্রিপশনটি তৈরি করেছে।
  - `result`: একটি অবজেক্ট যার বিষয়বস্তু সাবস্ক্রিপশনের ধরনের ওপর নির্ভর করে পরিবর্তিত হয়।

#### সাবস্ক্রিপশনের ধরন {#subscription-types}

1. `alchemy_newFullPendingTransactions`

পেন্ডিং স্টেটে যোগ করা সমস্ত ট্রানজ্যাকশনের জন্য ট্রানজ্যাকশন তথ্য রিটার্ন করে। এই সাবস্ক্রিপশনের ধরনটি স্ট্যান্ডার্ড Web3 কল `web3.eth.subscribe("pendingTransactions")`-এর মতোই পেন্ডিং ট্রানজ্যাকশনগুলোতে সাবস্ক্রাইব করে, তবে পার্থক্য হলো এটি শুধুমাত্র ট্রানজ্যাকশন হ্যাশের পরিবর্তে _সম্পূর্ণ ট্রানজ্যাকশন তথ্য_ প্রদান করে।

উদাহরণ:

```json
>  {"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"
      }
  }

```

2. `newHeads`

চেইনে নতুন কোনো হেডার যোগ করা হলে, এমনকি চেইন রি-অর্গ চলাকালীন সময়েও এটি একটি ইভেন্ট প্রদান করে।

যখন একটি চেইন রি-অর্গ ঘটে, তখন এই সাবস্ক্রিপশনটি নতুন চেইনের জন্য সমস্ত নতুন হেডার ধারণকারী একটি ইভেন্ট প্রদান করবে। বিশেষ করে, এর মানে হলো আপনি একই উচ্চতার একাধিক হেডার দেখতে পেতে পারেন এবং যখন এমনটি ঘটে তখন রি-অর্গের পরে আসা পরবর্তী হেডারটিকে সঠিক হিসেবে ধরে নেওয়া উচিত।

উদাহরণ:

```json
>  {"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"
  }
}

```

3. `logs`

নির্দিষ্ট ফিল্টার মানদণ্ডের সাথে মিলে যাওয়া নতুন যোগ করা ব্লকগুলোর অংশ হিসেবে থাকা লগগুলো প্রদান করে।

যখন একটি চেইন রি-অর্গ ঘটে, তখন পুরানো চেইনের ব্লকগুলোর অংশ হিসেবে থাকা লগগুলো `removed` প্রপার্টি `true`-তে সেট করে পুনরায় প্রদান করা হবে। এছাড়া, নতুন চেইনের ব্লকগুলোর অংশ হিসেবে থাকা লগগুলোও প্রদান করা হয়, যার মানে হলো রি-অর্গের ক্ষেত্রে একই ট্রানজ্যাকশনের জন্য একাধিকবার লগ দেখা সম্ভব।

প্যারামিটার

1. নিচের ফিল্ডগুলোসহ একটি অবজেক্ট:
   - `address` (ঐচ্ছিক): একটি ঠিকানাকে উপস্থাপনকারী স্ট্রিং অথবা এই ধরনের স্ট্রিংগুলোর একটি অ্যারে।
     - শুধুমাত্র এই ঠিকানাগুলোর যেকোনো একটি থেকে তৈরি করা লগগুলো প্রদান করা হবে।
   - `topics`: টপিক স্পেসিফায়ারগুলোর একটি অ্যারে।
     - প্রতিটি টপিক স্পেসিফায়ার হতে পারে `null`, একটি টপিককে উপস্থাপনকারী স্ট্রিং, অথবা স্ট্রিংগুলোর একটি অ্যারে।
     - অ্যারের প্রতিটি পজিশন যা `null` নয়, তা প্রদান করা লগগুলোকে শুধুমাত্র তাদের মধ্যেই সীমাবদ্ধ করে যাদের সেই পজিশনে প্রদত্ত টপিকগুলোর মধ্যে একটি রয়েছে।

টপিক স্পেসিফিকেশনের কিছু উদাহরণ:

- `[]`: যেকোনো টপিক অনুমোদিত।
- `[A]`: প্রথম পজিশনে A (এবং এরপর যেকোনো কিছু)।
- `[null, B]`: প্রথম পজিশনে যেকোনো কিছু এবং দ্বিতীয় পজিশনে B (এবং এরপর যেকোনো কিছু)।
- `[A, B]`: প্রথম পজিশনে A এবং দ্বিতীয় পজিশনে B (এবং এরপর যেকোনো কিছু)।
- `[[A, B], [A, B]]`: প্রথম পজিশনে (A অথবা B) এবং দ্বিতীয় পজিশনে (A অথবা B) (এবং এরপর যেকোনো কিছু)।

উদাহরণ:

```json
>  {"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` {#eth-unsubscribe}

একটি বিদ্যমান সাবস্ক্রিপশন বাতিল করে যাতে আর কোনো ইভেন্ট পাঠানো না হয়।

প্যারামিটার

1. সাবস্ক্রিপশন 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"]}'
```

**ফলাফল**

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "result": true
}
```

---

বিনামূল্যে [Alchemy-তে সাইন আপ করুন](https://auth.alchemy.com), [আমাদের ডকুমেন্টেশন](https://www.alchemy.com/docs/) দেখুন এবং সর্বশেষ খবরের জন্য [টুইটার](https://x.com/AlchemyPlatform)-এ আমাদের অনুসরণ করুন।
