Використання 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 замість URL -адреси 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":"0xa9059cbb0000000000000000000000000d0707963952f2fba59dd06f2b425ace40b492fe0000000000000000000000000000000000000000000015b1111266cfca100000",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]: A на першій позиції (і будь-що після).[null, B]: Будь-що на першій позиції та B на другій позиції (і будь-що після).[A, B]: A на першій позиції та 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 р.
