Używanie WebSockets
Jest to przewodnik na poziomie podstawowym do korzystania z WebSockets i Alchemy do wykonywania żądań do blockchainu Ethereum.
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/demo2> {"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”.
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")23web3.eth.getBlockNumber().then(console.log) // -> 7946893Kopiuj
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
- 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.
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łączenieeth_subscription
, które utworzyło tę subskrypcję.result
: Obiekt, którego zawartość różni się w zależności od rodzaju subskrypcji.
Rodzaj 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, 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"]}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 }26Pokaż wszystkoKopiuj
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"]}23< {"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}28Pokaż wszystkoKopiuj
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
- 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.
- Każdy specyfikator tematu jest albo
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"]}]}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}21Pokaż wszystkoKopiuj
eth_unsubscribe
Anuluje istniejącą subskrypcję, aby nie wysyłano żadnych kolejnych wydarzeń.
Parametry
- 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-key2-X POST3-H "Content-Type: application/json"4-d '{"id": 1, "method": "eth_unsubscribe", "params": ["0x9cef478923ff08bf67fde6c64013158d"]}'56
Wynik
1{2 "jsonrpc": "2.0",3 "id": 1,4 "result": true5}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: @pettinarip(opens in a new tab), 8 grudnia 2023