Перейти к основному контенту

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

alchemy
websockets
запросы
javascript
Для начинающих
Элан Халперн
1 декабря 2020 г.
5 минут на чтение

Это руководство начального уровня по использованию 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 для вашего приложения. Вы можете найти URL-адрес WebSocket вашего приложения, открыв страницу приложения в вашей панели управления (opens in a new tab) и нажав «View Key» (Просмотреть ключ). Обратите внимание, что URL-адрес вашего приложения для WebSockets отличается от его URL-адреса для HTTP-запросов, но оба можно найти, нажав «View Key».

Where to find your WebSocket URL in your Alchemy dashboard

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

С Web3

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

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

Параметры

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

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

Возвращает

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

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

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

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

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

  1. alchemy_newFullPendingTransactions

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

Пример:

  1. newHeads

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

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

Пример:

  1. 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) на второй позиции (и что угодно после).

Пример:

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"]}'

Результат

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

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