Использование WebSockets
Это руководство начального уровня по использованию 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».
Любой из 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).
Параметры
- Типы подписок
- Необязательные параметры
Первый аргумент указывает тип события для прослушивания. Второй аргумент содержит дополнительные параметры, которые зависят от первого аргумента. Различные типы описаний, их параметры и полезные нагрузки событий описаны ниже.
Возвращает
ID подписки: этот идентификатор будет прикреплен к любым полученным событиям, а также может быть использован для отмены подписки с помощью eth_unsubscribe.
События подписки
Пока подписка активна, вы будете получать события, которые представляют собой объекты со следующими полями:
jsonrpc: всегда «2.0»method: всегда «eth_subscription»params: объект со следующими полями:subscription: ID подписки, возвращенный вызовомeth_subscribe, который создал эту подписку.result: объект, содержимое которого зависит от типа подписки.
Типы подписок
alchemy_newFullPendingTransactions
Возвращает информацию о транзакции для всех транзакций, которые добавляются в состояние ожидания. Этот тип подписки подписывается на ожидающие транзакции, аналогично стандартному вызову Web3 web3.eth.subscribe("pendingTransactions"), но отличается тем, что он выдает полную информацию о транзакции, а не только хеши транзакций.
Пример:
> {"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"
}
}
newHeads
Выдает событие каждый раз, когда в цепь добавляется новый заголовок, в том числе во время реорганизации цепи.
Когда происходит реорганизация цепи, эта подписка выдаст событие, содержащее все новые заголовки для новой цепи. В частности, это означает, что вы можете увидеть несколько заголовков, выданных с одинаковой высотой, и когда это происходит, более поздний заголовок следует считать правильным после реорганизации.
Пример:
> {"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"
}
}
logs
Выдает журналы, которые являются частью недавно добавленных блоков, соответствующих указанным критериям фильтрации.
Когда происходит реорганизация цепи, журналы, которые являются частью блоков в старой цепи, будут выданы снова со свойством removed, установленным в true. Кроме того, выдаются журналы, которые являются частью блоков в новой цепи, что означает, что в случае реорганизации можно увидеть журналы для одной и той же транзакции несколько раз.
Параметры
- Объект со следующими полями:
address(необязательно): либо строка, представляющая адрес, либо массив таких строк.- Будут выдаваться только журналы, созданные с одного из этих адресов.
topics: массив спецификаторов тем.- Каждый спецификатор темы — это либо
null, либо строка, представляющая тему, либо массив строк. - Каждая позиция в массиве, которая не является
null, ограничивает выдаваемые журналы только теми, у которых есть одна из заданных тем в этой позиции.
- Каждый спецификатор темы — это либо
Некоторые примеры спецификаций тем:
[]: разрешены любые темы.[A]: A на первой позиции (и что угодно после).[null, B]: что угодно на первой позиции и B на второй позиции (и что угодно после).[A, B]: A на первой позиции и B на второй позиции (и что угодно после).[[A, B], [A, B]]: (A или B) на первой позиции и (A или B) на второй позиции (и что угодно после).
Пример:
> {"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
Отменяет существующую подписку, чтобы больше не отправлялись события.
Параметры
- 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).
