Перейти до основного вмісту

Використання WebSockets

Alchemy
websockets
запити
JavaScript
Для початківців
Елан Гальперн
1 грудня 2020 р.
6 хвилин на читання

Це посібник початкового рівня з використання WebSockets для виконання запитів до блокчейну Етеріуму. У прикладах використовуються стандартні методи JSON-RPC, тому вони працюють з будь-яким вузлом або провайдером вузлів, який пропонує кінцеву точку WebSocket, включно з Alchemy.

 (відкривається в новій вкладці)WebSockets проти HTTP

На відміну від HTTP, з WebSockets вам не потрібно постійно робити запити, коли ви хочете отримати певну інформацію. WebSockets підтримують мережеве з'єднання для вас (якщо все зроблено правильно) і відстежують зміни.

Як і з будь-яким мережевим з'єднанням, не варто припускати, що WebSocket залишатиметься відкритим вічно без переривань, але правильна обробка розірваних з'єднань і повторне підключення вручну може бути складним завданням. Ще одним недоліком WebSockets є те, що ви не отримуєте коди стану HTTP у відповіді, а лише повідомлення про помилку.

Клієнтські бібліотеки можуть впоратися з цим за вас. Наприклад, транспорт WebSocket у Viem (відкривається в новій вкладці) за замовчуванням відновлює з'єднання у разі збою сокета та надсилає пінги для підтримки активності (keep-alive).

Спробуйте

Вам потрібна URL-адреса WebSocket для вузла Етеріуму. Провайдери вузлів надають її під час створення ключа інтерфейсу прикладного програмування (API), зазвичай у форматі wss://<provider-host>/<your-api-key>. Наприклад, URL-адреса головної мережі Ethereum від Alchemy виглядає як wss://eth-mainnet.g.alchemy.com/v2/<your-api-key> (зареєструйте безкоштовний акаунт Alchemy (відкривається в новій вкладці)). Перегляньте вузли як послугу для інших провайдерів або використовуйте кінцеву точку WebSocket власного вузла. Публічні кінцеві точки, такі як wss://ethereum-rpc.publicnode.com, також працюють для швидких експериментів, але вони мають обмеження швидкості та можуть не підтримувати всі типи підписок.

Найпростіший спосіб протестувати WebSockets — встановити інструмент командного рядка для виконання запитів WebSocket, наприклад wscat (відкривається в новій вкладці). Використовуючи wscat, ви можете надсилати запити таким чином:

npx wscat -c wss://<provider-host>/<your-api-key>

> {"jsonrpc": "2.0", "id": 0, "method": "eth_gasPrice"}

< {"jsonrpc": "2.0", "result": "0x41f9de2", "id": 0}

Рядки, що починаються з >, — це те, що ви вводите, а рядки, що починаються з <, — це те, що вузол надсилає у відповідь.

Як використовувати WebSockets

Для початку відкрийте WebSocket, використовуючи URL-адресу WebSocket вашого провайдера. В Alchemy ви можете знайти її, відкривши свій застосунок на панелі керування (відкривається в новій вкладці) та переглянувши його ключ інтерфейсу прикладного програмування (API). Зверніть увагу, що URL-адреса для WebSockets (wss://) відрізняється від URL-адреси для HTTP-запитів (https://), хоча більшість провайдерів використовують однаковий ключ API для обох.

Будь-який із методів JSON-RPC, які підтримує ваш провайдер, можна використовувати через WebSocket. Для цього використовуйте те саме корисне навантаження, яке було б надіслано як тіло HTTP-запиту POST, але замість цього надішліть це корисне навантаження через WebSocket.

З Web3

Перехід на WebSockets під час використання клієнтської бібліотеки, такої як Viem (відкривається в новій вкладці), є простим. Використовуйте транспорт webSocket з вашою URL-адресою WebSocket замість транспорту http. Наприклад, після npm install viem збережіть це як index.mjs і запустіть node index.mjs:

API підписок

Під час підключення через WebSocket ви можете використовувати два додаткові методи: eth_subscribe та eth_unsubscribe. Ці методи дозволять вам прослуховувати певні події та негайно отримувати сповіщення.

eth_subscribe

Створює нову підписку на вказані події. Дізнайтеся більше про eth_subscribe (відкривається в новій вкладці).

Параметри

  1. Типи підписок
  2. Необов'язкові параметри

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

Повертає

ID підписки: Цей ідентифікатор буде додано до будь-яких отриманих подій, і його також можна використовувати для скасування підписки за допомогою eth_unsubscribe.

Події підписки

Поки підписка активна, ви отримуватимете події, які є об'єктами з такими полями:

  • jsonrpc: Завжди "2.0"
  • method: Завжди "eth_subscription"
  • params: Об'єкт із такими полями:
    • subscription: ID підписки, повернутий викликом eth_subscribe, який створив цю підписку.
    • result: Об'єкт, вміст якого змінюється залежно від типу підписки.

Типи підписок

  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) на другій позиції (і будь-що після).

Приклад:

Цей приклад відстежує події Deposit з контракту обгорнутого ефіру (WETH) (відкривається в новій вкладці) у головній мережі Ethereum:

  1. newPendingTransactions

Генерує хеш кожної транзакції, яка додається до стану очікування вузла (його мемпулу).

Приклад:

> {"jsonrpc": "2.0", "id": 1, "method": "eth_subscribe", "params": ["newPendingTransactions"]}

< {"jsonrpc":"2.0","result":"0x1c2365b029179adf1e84b9e327315249","id":1}
< {"jsonrpc":"2.0","method":"eth_subscription","params":{"result":"0x4a62d0ad7c8868fbbfa10604e68638e637c6fc6f64fd1fb4ca042dcd0158c992","subscription":"0x1c2365b029179adf1e84b9e327315249"}}

Деякі провайдери також пропонують власні типи підписок. Наприклад, alchemy_pendingTransactions (відкривається в новій вкладці) від Alchemy генерує повні об'єкти транзакцій замість лише хешів і приймає необов'язкові фільтри fromAddress, toAddress та hashesOnly. Вони не є частиною стандартного інтерфейсу прикладного програмування (API) JSON-RPC, тому працюють лише з цим провайдером.

eth_unsubscribe

Скасовує наявну підписку, щоб більше не надсилалися події.

Параметри

  1. ID підписки, який раніше було повернуто з виклику eth_subscribe.

Повертає

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

Підписка існує лише в тому з'єднанні WebSocket, яке її створило, тому eth_unsubscribe має бути надіслано через те саме з'єднання. Його не можна надіслати як окремий HTTP-запит. Закриття з'єднання також скасовує всі його підписки.

Приклад:

> {"jsonrpc": "2.0", "id": 2, "method": "eth_unsubscribe", "params": ["0xe0d4abf5caf333fbf94c5f02182e6469"]}

< {"jsonrpc":"2.0","result":true,"id":2}

Зареєструйтеся в Alchemy (відкривається в новій вкладці) безкоштовно, перегляньте документацію Alchemy (відкривається в новій вкладці) та слідкуйте за останніми новинами Alchemy у Twitter (відкривається в новій вкладці).