---
title: "Использование WebSockets"
description: "Руководство по использованию WebSockets и Alchemy для выполнения JSON-RPC запросов и подписки на события."
author: "Элан Халперн"
lang: ru
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 для вашего приложения. Вы можете найти URL-адрес WebSocket вашего приложения, открыв страницу приложения в [вашей панели управления](https://dashboard.alchemy.com/) и нажав «View Key» (Просмотреть ключ). Обратите внимание, что URL-адрес вашего приложения для WebSockets отличается от его URL-адреса для HTTP-запросов, но оба можно найти, нажав «View Key».

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

Любой из API, перечисленных в [справочнике по API Alchemy](https://www.alchemy.com/docs/reference/api-overview), можно использовать через WebSocket. Для этого используйте ту же полезную нагрузку, которая была бы отправлена в теле HTTP-запроса POST, но вместо этого отправьте эту полезную нагрузку через WebSocket.

## С Web3 {#with-web3}

Переход на WebSockets при использовании клиентской библиотеки, такой как Web3, прост. Просто передайте URL-адрес WebSocket вместо HTTP при создании экземпляра вашего клиента Web3. Например:

```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}

ID подписки: этот идентификатор будет прикреплен к любым полученным событиям, а также может быть использован для отмены подписки с помощью `eth_unsubscribe`.

#### События подписки {#subscription-events}

Пока подписка активна, вы будете получать события, которые представляют собой объекты со следующими полями:

- `jsonrpc`: всегда «2.0»
- `method`: всегда «eth_subscription»
- `params`: объект со следующими полями:
  - `subscription`: ID подписки, возвращенный вызовом `eth_subscribe`, который создал эту подписку.
  - `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`.

Возвращает

`true`, если подписка была успешно отменена, или `false`, если подписки с заданным ID не существовало.

Пример:

**Запрос**

```
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).
