Використання 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, якщо підписки із заданим ідентифікатором не існувало.
Приклад:
Запит
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) та слідкуйте за останніми новинами у Twitter (opens in a new tab).
