Перейти к основному содержанию

Использование WebSockets

Alchemy
веб-сокеты
запросы
JavaScript
Beginner
Elan Halpern
1 декабря 2020 г.
5 минута прочтения

Это руководство начального уровня по использованию WebSockets и Alchemy для создания запросов Ethereum блокчейн.

 (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)

1wscat -c wss://eth-mainnet.ws.alchemyapi.io/ws/demo
2
3> {"jsonrpc": "2.0", "id": 0, "method": "eth_gasPrice"}
4
5< {"jsonrpc": "2.0", "result": "0xb2d05e00", "id": 0}
6

Как использовать WebSockets

Для начала откройте WebSocket, используя URL-адрес WebSocket для вашего приложения. Вы можете найти URL-адрес WebSocket вашего приложения, открыв страницу приложения на вашей панели управления (opens in a new tab) и нажав "Просмотреть ключ". Обратите внимание, что URL-адрес вашего приложения для WebSockets отличается от URL-адреса для HTTP-запросов, но и то, и другое можно найти, нажав «Просмотреть ключ».

Где найти URL-адрес WebSocket на панели управления Alchemy

Любой из API, перечисленных в Справочнике по API Alchemy (opens in a new tab), может использоваться через WebSocket. Для этого используйте ту же нагрузку, которая будет отправлена как тело запроса HTTP POST, но вместо этого отправьте эту нагрузку через WebSocket.

С Web3

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

1const web3 = new Web3("wss://eth-mainnet.ws.alchemyapi.io/ws/your-api-key")
2
3web3.eth.getBlockNumber().then(console.log) // -> 7946893

API подписок

При подключении через WebSocket можно использовать два дополнительных метода: eth_subscribe и eth_unsubscribe. Эти методы позволяют прослушивать определенные события и немедленно получать уведомления.

eth_subscribe

Создает новую подписку на указанные события. Узнайте больше о eth_subscribe (opens in a new tab).

Параметры

  1. Типы подписок
  2. Необязательные параметры

Первый аргумент указывает тип события для прослушивания. Второй аргумент содержит дополнительные параметры, которые зависят от первого аргумента. Различные типы описаний, их параметры и полезные данные событий описаны ниже.

Возвращаемые значения

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

События подписки

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

  • jsonrpc: всегда "2.0"
  • method: всегда "eth_subscription"
  • params: объект со следующими полями:
    • subscription: идентификатор подписки, возвращенный вызовом eth_subscribe, который создал эту подписку.
    • result: объект, содержимое которого зависит от типа подписки.

Типы подписок

  1. alchemy_newFullPendingTransactions

Возвращает информацию обо всех транзакциях, которые добавляются в состояние ожидания. Этот тип подписки подписывается на ожидающие транзакции, подобно стандартному вызову Web3 web3.eth.subscribe("pendingTransactions"), но отличается тем, что выдает полную информацию о транзакции, а не просто хэши транзакций.

Пример:

1> {"jsonrpc": "2.0", "id": 1, "method": "eth_subscribe", "params": ["alchemy_newFullPendingTransactions"]}
2
3< {"id":1,"result":"0x9a52eeddc2b289f985c0e23a7d8427c8","jsonrpc":"2.0"}
4< {
5 "jsonrpc":"2.0",
6 "method":"eth_subscription",
7 "params":{
8 "result":{
9 "blockHash":null,
10 "blockNumber":null,
11 "from":"0xa36452fc31f6f482ad823cd1cf5515177d57667f",
12 "gas":"0x1adb0",
13 "gasPrice":"0x7735c4d40",
14 "hash":"0x50bff0736c713458c92dd1848d12f3354149be1363123dae35e94e0f2a9d56bf",
15"input":"0xa9059cbb0000000000000000000000000d0707963952f2fba59dd06f2b425ace40b492fe00000000000000000000000000000000000000000000015b1111266cfca100000",
16 "nonce":"0x0",
17 "to":"0xea38eaa3c86c8f9b751533ba2e562deb9acded40",
18 "transactionIndex":null,
19 "value":"0x0",
20 "v":"0x26",
21 "r":"0x195c2c1ed126088e12d290aa93541677d3e3b1d10f137e11f86b1b9227f01e3b",
22 "s":"0x60fc4edbf1527832a2a36dbc1e63ed6193a6eee654472fbebbf88ef1750b5344"},
23 "subscription":"0x9a52eeddc2b289f985c0e23a7d8427c8"
24 }
25 }
26
Показать все
  1. newHeads

Выдает событие каждый раз, когда в цепочку добавляется новый заголовок, в том числе во время реорганизации цепочки.

Когда происходит реорганизация цепочки, эта подписка выдает событие, содержащее все новые заголовки для новой цепочки. В частности, это означает, что вы можете увидеть несколько заголовков, выпущенных с одинаковой высотой, и когда это происходит, более поздний заголовок следует считать правильным после реорганизации.

Пример:

1> {"jsonrpc": "2.0", "id": 1, "method": "eth_subscribe", "params": ["newHeads"]}
2
3< {"jsonrpc":"2.0","id":2,"result":"0x9ce59a13059e417087c02d3236a0b1cc"}
4< {
5 "jsonrpc": "2.0",
6 "method": "eth_subscription",
7 "params": {
8 "result": {
9 "extraData": "0xd983010305844765746887676f312e342e328777696e646f7773",
10 "gasLimit": "0x47e7c4",
11 "gasUsed": "0x38658",
12 "logsBloom":
13"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
14 "nonce": "0x084149998194cc5f",
15 "number": "0x1348c9",
16 "parentHash": "0x7736fab79e05dc611604d22470dadad26f56fe494421b5b333de816ce1f25701",
17 "receiptRoot": "0x2fab35823ad00c7bb388595cb46652fe7886e00660a01e867824d3dceb1c8d36",
18 "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
19 "stateRoot": "0xb3346685172db67de536d8765c43c31009d0eb3bd9c501c9be3229203f15f378",
20 "timestamp": "0x56ffeff8",
21 "transactionsRoot": "0x0167ffa60e3ebc0b080cdb95f7c0087dd6c0e61413140e39d94d3468d7c9689f"
22 },
23 "subscription": "0x9ce59a13059e417087c02d3236a0b1cc"
24 }
25}
26
Показать все
  1. logs

Выдает журналы, которые являются частью вновь добавленных блоков, соответствующих указанным критериям фильтра.

Когда происходит реорганизация цепочки, журналы, которые являются частью блоков в старой цепочке, будут снова выданы со свойством removed, для которого установлено значение true. Кроме того, выдаются журналы, которые являются частью блоков в новой цепочке. Это означает, что в случае реорганизации можно увидеть журналы одной и той же транзакции несколько раз.

Параметры

  1. Объект со следующими полями:
    • address (необязательно): строка, представляющая адрес, или массив таких строк.
      • Будут выдаваться только журналы, созданные с одного из этих адресов.
    • topics: массив спецификаторов тем.
      • Каждый спецификатор темы — это либо null, либо строка, представляющая тему, либо массив строк.
      • Каждая позиция в массиве, которая не является null, ограничивает выдаваемые журналы только теми, у которых есть одна из заданных тем в этой позиции.

Некоторые примеры спецификаций тем:

  • []: разрешены любые темы.
  • [A]: А на первой позиции (и все, что после).
  • [null, B]: что угодно на первой позиции и B на второй позиции (и все, что после).
  • [A, B]: А на первой позиции и B на второй позиции (и все, что после).
  • [[A, B], [A, B]]: (A или B) на первой позиции и (A или B) на второй позиции (и все, что после).

Пример:

1> {"jsonrpc": "2.0", "id": 1, "method": "eth_subscribe", "params": ["logs", {"address": "0x8320fe7702b96808f7bbc0d4a888ed1468216cfd", "topics": ["0xd78a0cb8bb633d06981248b816e7bd33c2a35a6089241d099fa519e361cab902"]}]}
2
3< {"jsonrpc":"2.0","id":2,"result":"0x4a8a4c0517381924f9838102c5a4dcb7"}
4< {
5 "jsonrpc": "2.0",
6 "method": "eth_subscription",
7 "params": {
8 "subscription": "0x4a8a4c0517381924f9838102c5a4dcb7",
9 "result": {
10 "address": "0x8320fe7702b96808f7bbc0d4a888ed1468216cfd",
11 "blockHash": "0x61cdb2a09ab99abf791d474f20c2ea89bf8de2923a2d42bb49944c8c993cbf04",
12 "blockNumber": "0x29e87",
13 "data": "0x00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003",
14 "logIndex":"0x0",
15 "topics":["0xd78a0cb8bb633d06981248b816e7bd33c2a35a6089241d099fa519e361cab902"],
16 "transactionHash": "0xe044554a0a55067caafd07f8020ab9f2af60bdfe337e395ecd84b4877a3d1ab4",
17 "transactionIndex": "0x0"
18 }
19 }
20}
21
Показать все

eth_unsubscribe

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

Параметры

  1. Идентификатор подписки, ранее возвращенный вызовом eth_subscribe.

Возвраты

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

Пример:

Запрос

1curl https://eth-mainnet.alchemyapi.io/v2/your-api-key
2-X POST
3-H "Content-Type: application/json"
4-d '{"id": 1, "method": "eth_unsubscribe", "params": ["0x9cef478923ff08bf67fde6c64013158d"]}'
5
6

Результат

1{
2 "jsonrpc": "2.0",
3 "id": 1,
4 "result": true
5}

Зарегистрируйтесь в Alchemy (opens in a new tab) бесплатно, ознакомьтесь с нашей документацией (opens in a new tab) и, чтобы быть в курсе последних новостей, подписывайтесь на нас в Twitter (opens in a new tab).

Последнее обновление страницы: 1 октября 2025 г.

Было ли это руководство полезным?