Przejdź do głównej treści

Korzystanie z WebSockets

Alchemy
websockets
zapytania
JavaScript
Początkujący
Elan Halpern
1 grudnia 2020
5 minut czytania

To jest przewodnik dla początkujących dotyczący korzystania z WebSockets i Alchemy do wysyłania żądań do blockchaina Ethereum.

 (opens in a new tab)WebSockets a HTTP

W przeciwieństwie do HTTP, w przypadku WebSockets nie musisz ciągle wysyłać żądań, gdy chcesz uzyskać konkretne informacje. WebSockets utrzymują dla Ciebie połączenie sieciowe (jeśli są zaimplementowane prawidłowo) i nasłuchują zmian.

Podobnie jak w przypadku każdego połączenia sieciowego, nie należy zakładać, że WebSocket pozostanie otwarty na zawsze bez przerw, ale prawidłowa ręczna obsługa zerwanych połączeń i ponownego łączenia może być trudna do poprawnego zaimplementowania. Kolejną wadą WebSockets jest to, że w odpowiedzi nie otrzymujesz kodów statusu HTTP, a jedynie wiadomość o błędzie.

Alchemy Web3 (opens in a new tab) automatycznie dodaje obsługę awarii WebSockets i ponownych prób bez konieczności konfiguracji.

Wypróbuj

Najprostszym sposobem na przetestowanie WebSockets jest zainstalowanie narzędzia wiersza poleceń do wysyłania żądań WebSocket, takiego jak wscat (opens in a new tab). Używając wscat, możesz wysyłać żądania w następujący sposób:

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)

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}

Jak korzystać z WebSockets

Aby rozpocząć, otwórz WebSocket, używając adresu URL WebSocket dla swojej aplikacji. Adres URL WebSocket swojej aplikacji znajdziesz, otwierając stronę aplikacji w swoim panelu (opens in a new tab) i klikając „View Key”. Zauważ, że adres URL Twojej aplikacji dla WebSockets różni się od adresu URL dla żądań HTTP, ale oba można znaleźć, klikając „View Key”.

Where to find your WebSocket URL in your Alchemy dashboard

Każde z API wymienionych w Dokumentacji API Alchemy (opens in a new tab) może być używane przez WebSocket. Aby to zrobić, użyj tego samego ładunku (payload), który zostałby wysłany jako treść żądania HTTP POST, ale zamiast tego wyślij ten ładunek przez WebSocket.

Z Web3

Przejście na WebSockets podczas korzystania z biblioteki klienta, takiej jak Web3, jest proste. Wystarczy przekazać adres URL WebSocket zamiast adresu HTTP podczas tworzenia instancji klienta Web3. Na przykład:

const web3 = new Web3("wss://eth-mainnet.ws.alchemyapi.io/ws/your-api-key")

web3.eth.getBlockNumber().then(console.log) // -> 7946893

API subskrypcji

Po połączeniu przez WebSocket możesz użyć dwóch dodatkowych metod: eth_subscribe oraz eth_unsubscribe. Metody te pozwolą Ci nasłuchiwać określonych zdarzeń i otrzymywać natychmiastowe powiadomienia.

eth_subscribe

Tworzy nową subskrypcję dla określonych zdarzeń. Dowiedz się więcej o eth_subscribe (opens in a new tab).

Parametry

  1. Typy subskrypcji
  2. Opcjonalne parametry

Pierwszy argument określa typ zdarzenia, którego należy nasłuchiwać. Drugi argument zawiera dodatkowe opcje, które zależą od pierwszego argumentu. Różne typy subskrypcji, ich opcje i ładunki zdarzeń opisano poniżej.

Zwraca

ID subskrypcji: To ID będzie dołączone do wszystkich odebranych zdarzeń i może być również użyte do anulowania subskrypcji za pomocą eth_unsubscribe.

Zdarzenia subskrypcji

Dopóki subskrypcja jest aktywna, będziesz otrzymywać 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: ID subskrypcji zwrócone przez wywołanie eth_subscribe, które utworzyło tę subskrypcję.
    • result: Obiekt, którego zawartość różni się w zależności od typu subskrypcji.

Typy subskrypcji

  1. alchemy_newFullPendingTransactions

Zwraca informacje o transakcji dla wszystkich transakcji, które zostały dodane do stanu oczekującego. Ten typ subskrypcji subskrybuje oczekujące transakcje, podobnie jak standardowe wywołanie Web3 web3.eth.subscribe("pendingTransactions"), ale różni się tym, że emituje pełne informacje o transakcji, a nie tylko hashe transakcji.

Przykład:

  1. newHeads

Emituje zdarzenie za każdym razem, gdy do łańcucha dodawany jest nowy nagłówek, w tym podczas reorganizacji łańcucha.

Gdy nastąpi reorganizacja łańcucha, ta subskrypcja wyemituje zdarzenie zawierające wszystkie nowe nagłówki dla nowego łańcucha. W szczególności oznacza to, że możesz zobaczyć wiele nagłówków wyemitowanych z tą samą wysokością, a gdy to nastąpi, późniejszy nagłówek powinien zostać uznany za prawidłowy po reorganizacji.

Przykład:

  1. logs

Emituje logi, które są częścią nowo dodanych bloków i pasują do określonych kryteriów filtrowania.

Gdy nastąpi reorganizacja łańcucha, logi będące częścią bloków w starym łańcuchu zostaną wyemitowane ponownie z właściwością removed ustawioną na true. Ponadto emitowane są logi będące częścią bloków w nowym łańcuchu, co oznacza, że w przypadku reorganizacji możliwe jest wielokrotne zobaczenie logów dla tej samej transakcji.

Parametry

  1. Obiekt z następującymi polami:
    • address (opcjonalnie): ciąg znaków reprezentujący adres lub tablica takich ciągów.
      • Emitowane będą tylko logi utworzone z jednego z tych adresów.
    • topics: tablica specyfikatorów tematów (topics).
      • 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.

Kilka przykładów specyfikacji tematów:

  • []: Dozwolone dowolne tematy.
  • [A]: A na pierwszej pozycji (i cokolwiek po nim).
  • [null, B]: Cokolwiek na pierwszej pozycji i B na drugiej pozycji (i cokolwiek po nim).
  • [A, B]: A na pierwszej pozycji i B na drugiej pozycji (i cokolwiek po nim).
  • [[A, B], [A, B]]: (A lub B) na pierwszej pozycji i (A lub B) na drugiej pozycji (i cokolwiek po nim).

Przykład:

eth_unsubscribe

Anuluje istniejącą subskrypcję, dzięki czemu nie są wysyłane żadne kolejne zdarzenia.

Parametry

  1. ID subskrypcji, wcześniej zwrócone 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 ID.

Przykład:

Żądanie

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"]}'

Wynik

{
  "jsonrpc": "2.0",
  "id": 1,
  "result": true
}

Zarejestruj się w Alchemy (opens in a new tab) za darmo, sprawdź naszą dokumentację (opens in a new tab), a po najnowsze wiadomości śledź nas na Twitterze (opens in a new tab).