Używanie WebSockets
Jest to przewodnik na poziomie podstawowym do korzystania z WebSockets i Alchemy do wykonywania żądań do blockchainu Ethereum.
(opens in a new tab)WebSockets vs. HTTP
W odróżnieniu od HTTP, z WebSockets, nie musisz ciągle wysyłać żądań, gdy chcesz uzyskać konkretne informacje. WebSockets utrzymuje dla Ciebie połączenie sieciowe (jeżeli zostało nawiązane) i nasłuchuje zmian.
Podobnie jak w przypadku jakiegokolwiek połączenia sieciowego, nie należy zakładać, że WebSocket pozostanie otwarty na zawsze bez przerwy, ale właściwa obsługa zerwanego połączenia i ponowne nawiązanie połączenie może zapewnić ciągłość jego prawidłowego działania. Następną niedogodnością WebSocketów jest to, że nie otrzymujesz kodów statusu HTTP w odpowiedzi, ale tylko komunikat o błędzie.
Alchemy Web3 (opens in a new tab) automatycznie dodaje obsługę awarii WebSocket i ponownych prób bez konieczności konfiguracji.
Wypróbuj
Najprostszym sposobem na przetestowanie WebSockets jest zainstalowanie narzędzia wiersza poleceń do tworzenia żądań WebSocket, takiego jak wscat (opens in a new tab). Używając wscat, możesz wysyłać następujące żądania:
Uwaga: jeśli masz konto Alchemy, możesz zastąpić demo własnym kluczem API. Zarejestruj darmowe konto Alchemy tutaj! (opens in a new tab)
1wscat -c wss://eth-mainnet.ws.alchemyapi.io/ws/demo2
3> {"jsonrpc": "2.0", "id": 0, "method": "eth_gasPrice"}4
5< {"jsonrpc": "2.0", "result": "0xb2d05e00", "id": 0}6
Jak używać WebSockets
Aby rozpocząć, otwórz WebSocket za pomocą adresu URL WebSocket dla swojej aplikacji. Możesz znaleźć adres URL WebSocket swojej aplikacji, otwierając stronę aplikacji w swoim pulpicie nawigacyjnym (opens in a new tab) i klikając „Wyświetl klucz”. Pamiętaj, że adres URL Twojej aplikacji dla WebSocketów różni się od adresu URL dla żądań HTTP, ale oba można znaleźć klikając „Wyświetl klucz”.
Dowolne z interfejsów API wymienionych w Dokumentacji Alchemy API (opens in a new tab) można używać za pośrednictwem WebSocket. Aby to zrobić, użyj tego samego ładunku, który zostałby wysłany jako treść żądania HTTP POST, ale zamiast tego wyślij ten ładunek za pośrednictwem protokołu WebSocket.
Z Web3
Przejście na WebSockets podczas korzystania z biblioteki klienckiej, takiej jak Web3, jest proste. Po prostu przekaż adres URL WebSocket zamiast HTTP podczas tworzenia instancji klienta Web3. Na przykład:
1const web3 = new Web3("wss://eth-mainnet.ws.alchemyapi.io/ws/your-api-key")2
3web3.eth.getBlockNumber().then(console.log) // -> 7946893API subskrypcji
Po połączeniu przez WebSocket można użyć dwóch dodatkowych metod: eth_subscribe i eth_unsubscribe. Te metody pozwolą Ci na wysłuchanie konkretnych wydarzeń i natychmiastowe powiadomienie.
eth_subscribe
Tworzy nową subskrypcję dla określonych zdarzeń. Dowiedz się więcej o eth_subscribe (opens in a new tab).
Parametry
- Rodzaj subskrypcji
- Parametry opcjonalne
Pierwszy argument określa rodzaj wydarzenia, którego należy nasłuchiwać. Drugi argument zawiera dodatkowe opcje, które zależą od pierwszego argumentu. Poniżej opisano różne rodzaje opisów, ich opcje i obciążenia zdarzeniami.
Wartości zwracane
Identyfikator subskrypcji: Ten identyfikator zostanie dołączony do wszystkich odebranych zdarzeń i może być również użyty do anulowania subskrypcji za pomocą eth_unsubscribe.
Zdarzenia subskrypcji
Podczas gdy subskrypcja jest aktywna, otrzymasz zdarzenia, które są obiektami z następującymi polami:
jsonrpc: Zawsze "2.0"method: Zawsze "eth_subscription"params: Obiekt z następującymi polami:subscription: Identyfikator subskrypcji zwrócony przez wywołanieeth_subscribe, które utworzyło tę subskrypcję.result: Obiekt, którego zawartość różni się w zależności od typu subskrypcji.
Typy subskrypcji
alchemy_newFullPendingTransactions
Zwraca informacje o transakcji dla wszystkich transakcji, które są dodane do stanu oczekującego. Ten typ subskrypcji subskrybuje oczekujące transakcje, podobnie do standardowego wywołania Web3 web3.eth.subscribe("pendingTransactions"), ale różni się tym, że emituje pełne informacje o transakcji, a nie tylko hasze transakcji.
Przykład:
1> {"jsonrpc": "2.0", "id": 1, "method": "eth_subscribe", "params": ["alchemy_newFullPendingTransactions"]}2
3< {"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
Emituje wydarzenie w dowolnym momencie, gdy nowy nagłówek zostanie dodany do łańcucha, w tym podczas reorganizacji łańcucha.
Gdy nastąpi reorganizacja łańcucha, ta subskrypcja będzie emitować wydarzenie zawierające wszystkie nowe nagłówki dla nowego łańcucha. Oznacza to w szczególności, że można widzieć wiele emitowanych nagłówków z tą samą wysokością, i kiedy to nastąpi, późniejszy nagłówek powinien być uznany za prawidłowy po reorganizacji.
Przykład:
1> {"jsonrpc": "2.0", "id": 1, "method": "eth_subscribe", "params": ["newHeads"]}2
3< {"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
Emituje logi będące częścią nowo dodanych bloków, które spełniają określone kryteria filtrów.
Gdy nastąpi reorganizacja łańcucha, logi, które są częścią bloków w starym łańcuchu, zostaną ponownie wyemitowane z właściwością removed ustawioną na true. Ponadto emitowane są dzienniki będące częścią bloków w nowym łańcuchu, co oznacza, że w przypadku reorganizacji możliwe jest wielokrotne wyświetlanie dzienników dla tej samej transakcji.
Parametry
- Obiekt z następującymi opcjonalnymi kluczami:
address(opcjonalnie): ciąg znaków reprezentujący adres lub tablica takich ciągów.- Tylko logi utworzone z jednego z tych adresów zostaną wysłane.
topics: tablica specyfikatorów tematów.- Każdy specyfikator tematu to
null, ciąg znaków reprezentujący temat lub tablica ciągów znaków. - Każda pozycja w tablicy, która nie jest
null, ogranicza emitowane logi tylko do tych, które mają jeden z podanych tematów na tej pozycji.
- Każdy specyfikator tematu to
Przykłady specyfikacji tematu:
[]: Dowolne tematy dozwolone.[A]: A na pierwszej pozycji (i wszystko, co dalej).[null, B]: Cokolwiek na pierwszej pozycji i B na drugiej pozycji (i wszystko, co dalej).[A, B]: A na pierwszej pozycji i B na drugiej pozycji (i wszystko, co dalej).[[A, B], [A, B]]: (A lub B) na pierwszej pozycji i (A lub B) na drugiej pozycji (i wszystko, co dalej).
Przykład:
1> {"jsonrpc": "2.0", "id": 1, "method": "eth_subscribe", "params": ["logs", {"address": "0x8320fe7702b96808f7bbc0d4a888ed1468216cfd", "topics": ["0xd78a0cb8bb633d06981248b816e7bd33c2a35a6089241d099fa519e361cab902"]}]}2
3< {"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
Anuluje istniejącą subskrypcję, aby nie wysyłano żadnych kolejnych wydarzeń.
Parametry
- Identyfikator subskrypcji, zwrócony wcześniej z wywołania
eth_subscribe.
Zwraca
true, jeśli subskrypcja została pomyślnie anulowana, lub false, jeśli nie istniała subskrypcja o podanym identyfikatorze.
Przykład:
Zapytanie
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"]}'5
6
Wynik
1{2 "jsonrpc": "2.0",3 "id": 1,4 "result": true5}Zarejestruj się za darmo w Alchemy (opens in a new tab), sprawdź naszą dokumentację (opens in a new tab), a żeby być na bieżąco z najnowszymi wiadomościami, obserwuj nas na Twitterze (opens in a new tab).
Strona ostatnio zaktualizowana: 3 marca 2026
