Przejdź do głównej zawartości

Używanie WebSockets

alchemywebsocketszapytaniapierwsze krokisubskrypcjaJavaScript
Początkujący
Elan Halpern
Dokumentacja Alchemy(opens in a new tab)
1 grudnia 2020
5 minuta czytania minute read

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 ponawiania prób bez konieczności konfiguracji.

Wypróbuj

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

Uwaga: jeśli posiadasz konto Alchemy, możesz zastąpić demo własnym kluczem API. Sign up for a free Alchemy account here!(opens in a new tab)

1wscat -c wss://eth-mainnet.ws.alchemyapi.io/ws/demo
2> {"jsonrpc": "2.0", "id": 0, "method": "eth_gasPrice"}
3< {"jsonrpc": "2.0", "result": "0xb2d05e00", "id": 0}
4

Jak korzystać z WebSockets

Aby rozpocząć, otwórz WebSocket za pomocą adresu URL WebSocket dla swojej aplikacji. Możesz znaleźć adres URL swojej aplikacji WebSocket, otwierając stronę aplikacji w pulpicie nawigacyjnym(opens in a new tab) i klikając przycisk „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”.

Gdzie znaleźć twój adres URL WebSocket w panelu Alchemy

Każdy z API wymienionych w alchemy API(opens in a new tab) może być używany przez 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) // -> 7946893
Kopiuj

Subskrypcja API

Po połączeniu przez WebSocket, możesz 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

  1. Rodzaj subskrypcji
  2. 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.

Zwraca

ID subskrypcji: Ten identyfikator zostanie dołączony do wszystkich otrzymanych wydarzeń, i może być również używany 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: ID subskrypcji zwrócony przez połączenie eth_subscription, które utworzyło tę subskrypcję.
    • result: Obiekt, którego zawartość różni się w zależności od rodzaju subskrypcji.

Rodzaj subskrypcji

  1. alchemy_newFullPendingTransactions

Zwraca informacje o transakcji dla wszystkich transakcji, które są dodane do stanu oczekującego. Ten typ subskrypcji subskrybuje oczekujące transakcje, podobne do standardowego połączenia Web3 web3.eth. ubscribe("oczekujące transakcje"), ale różni się w tym, że emituje pełnych informacji o transakcjach zamiast tylko hashów 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
Pokaż wszystko
Kopiuj
  1. 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 "difficulty": "0x15d9223a23aa",
10 "extraData": "0xd983010305844765746887676f312e342e328777696e646f7773",
11 "gasLimit": "0x47e7c4",
12 "gasUsed": "0x38658",
13 "logsBloom":
14"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
15 "miner": "0xf8b483dba2c3b7176a3da549ad41a48bb3121069",
16 "nonce": "0x084149998194cc5f",
17 "number": "0x1348c9",
18 "parentHash": "0x7736fab79e05dc611604d22470dadad26f56fe494421b5b333de816ce1f25701",
19 "receiptRoot": "0x2fab35823ad00c7bb388595cb46652fe7886e00660a01e867824d3dceb1c8d36",
20 "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
21 "stateRoot": "0xb3346685172db67de536d8765c43c31009d0eb3bd9c501c9be3229203f15f378",
22 "timestamp": "0x56ffeff8",
23 "transactionsRoot": "0x0167ffa60e3ebc0b080cdb95f7c0087dd6c0e61413140e39d94d3468d7c9689f"
24 },
25 "subscription": "0x9ce59a13059e417087c02d3236a0b1cc"
26 }
27}
28
Pokaż wszystko
Kopiuj
  1. 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 będące częścią bloków starego łańcucha będą ponownie emitowane 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

  1. Obiekt z następującymi opcjonalnymi kluczami:
    • adddress (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 jest albo null, ciągiem reprezentującym temat, albo tablicą ciągów.
      • Każda pozycja w tablicy, która nie jest null ogranicza emitowane logi tylko do tych, którzy mają jeden z podanych tematów w tej pozycji.

Przykłady specyfikacji tematu:

  • []: Wszystkie dozwolone tematy.
  • [A]: Pierwsza pozycja (i cokolwiek po).
  • [null, B]: wszystko w pierwszej pozycji i B w drugiej pozycji (i cokolwiek po).
  • [null, B]: wszystko w pierwszej pozycji i B w drugiej pozycji (i cokolwiek po).
  • [[A, B], [A, B]]: (A lub B) w pierwszej pozycji i (A lub B) w drugiej pozycji (i cokolwiek po).

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
Pokaż wszystko
Kopiuj

eth_unsubscribe

Anuluje istniejącą subskrypcję, aby nie wysyłano żadnych kolejnych wydarzeń.

Parametry

  1. ID subskrypcji, jakie zostało wcześniej zwrócone z połączenia eth_subscribe.

Zwraca

true jeśli subskrypcja została pomyślnie anulowana lub false jeśli nie istnieje subskrypcja z podanym identyfikatorem.

Przykład:

Zapytanie

1curl https://eth-mainnet.alchemyapi.io/v2/your-api-key
2-X POST
3-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": true
5}
Kopiuj

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

Ostatnia edycja: @arturlesniewski(opens in a new tab), 31 października 2023

Czy ten samouczek był pomocny?