Использование WebSockets
Это руководство начального уровня по использованию 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/demo23> {"jsonrpc": "2.0", "id": 0, "method": "eth_gasPrice"}45< {"jsonrpc": "2.0", "result": "0xb2d05e00", "id": 0}6Как использовать WebSockets
Для начала откройте WebSocket, используя URL-адрес WebSocket для вашего приложения. Вы можете найти URL-адрес WebSocket вашего приложения, открыв страницу приложения на вашей панели управления (opens in a new tab) и нажав "Просмотреть ключ". Обратите внимание, что URL-адрес вашего приложения для WebSockets отличается от URL-адреса для HTTP-запросов, но и то, и другое можно найти, нажав «Просмотреть ключ».
Любой из 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")23web3.eth.getBlockNumber().then(console.log) // -> 7946893API подписок
При подключении через WebSocket можно использовать два дополнительных метода: eth_subscribe и eth_unsubscribe. Эти методы позволяют прослушивать определенные события и немедленно получать уведомления.
eth_subscribe
Создает новую подписку на указанные события. Узнайте больше о eth_subscribe (opens in a new tab).
Параметры
- Типы подписок
- Необязательные параметры
Первый аргумент указывает тип события для прослушивания. Второй аргумент содержит дополнительные параметры, которые зависят от первого аргумента. Различные типы описаний, их параметры и полезные данные событий описаны ниже.
Возвращаемые значения
Идентификатор подписки: этот идентификатор будет прикреплен ко всем полученным событиям, а также может использоваться для отмены подписки с помощью eth_unsubscribe.
События подписки
Пока подписка активна, вы будете получать события, которые представляют собой объекты со следующими полями:
jsonrpc: всегда "2.0"method: всегда "eth_subscription"params: объект со следующими полями:subscription: идентификатор подписки, возвращенный вызовомeth_subscribe, который создал эту подписку.result: объект, содержимое которого зависит от типа подписки.
Типы подписок
alchemy_newFullPendingTransactions
Возвращает информацию обо всех транзакциях, которые добавляются в состояние ожидания. Этот тип подписки подписывается на ожидающие транзакции, подобно стандартному вызову Web3 web3.eth.subscribe("pendingTransactions"), но отличается тем, что выдает полную информацию о транзакции, а не просто хэши транзакций.
Пример:
1> {"jsonrpc": "2.0", "id": 1, "method": "eth_subscribe", "params": ["alchemy_newFullPendingTransactions"]}23< {"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Показать всеnewHeads
Выдает событие каждый раз, когда в цепочку добавляется новый заголовок, в том числе во время реорганизации цепочки.
Когда происходит реорганизация цепочки, эта подписка выдает событие, содержащее все новые заголовки для новой цепочки. В частности, это означает, что вы можете увидеть несколько заголовков, выпущенных с одинаковой высотой, и когда это происходит, более поздний заголовок следует считать правильным после реорганизации.
Пример:
1> {"jsonrpc": "2.0", "id": 1, "method": "eth_subscribe", "params": ["newHeads"]}23< {"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Показать всеlogs
Выдает журналы, которые являются частью вновь добавленных блоков, соответствующих указанным критериям фильтра.
Когда происходит реорганизация цепочки, журналы, которые являются частью блоков в старой цепочке, будут снова выданы со свойством removed, для которого установлено значение true. Кроме того, выдаются журналы, которые являются частью блоков в новой цепочке. Это означает, что в случае реорганизации можно увидеть журналы одной и той же транзакции несколько раз.
Параметры
- Объект со следующими полями:
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"]}]}23< {"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
Отменяет существующую подписку, чтобы дальнейшие события не отправлялись.
Параметры
- Идентификатор подписки, ранее возвращенный вызовом
eth_subscribe.
Возвраты
true, если подписка была успешно отменена, или false, если подписки с указанным идентификатором не существует.
Пример:
Запрос
1curl https://eth-mainnet.alchemyapi.io/v2/your-api-key2-X POST3-H "Content-Type: application/json"4-d '{"id": 1, "method": "eth_unsubscribe", "params": ["0x9cef478923ff08bf67fde6c64013158d"]}'56Результат
1{2 "jsonrpc": "2.0",3 "id": 1,4 "result": true5}Зарегистрируйтесь в Alchemy (opens in a new tab) бесплатно, ознакомьтесь с нашей документацией (opens in a new tab) и, чтобы быть в курсе последних новостей, подписывайтесь на нас в Twitter (opens in a new tab).
Последнее обновление страницы: 1 октября 2025 г.
