Přejít na hlavní obsah

Používání WebSocketů

Alchemy
websockets
dotazování
JavaScript
Začátečník
Elan Halpern
1. prosince 2020
6 minut čtení

Toto je úvodní průvodce používáním WebSocketů k odesílání požadavků na blockchain Etherea. Příklady používají standardní metody JSON-RPC, takže fungují s jakýmkoli uzlem nebo poskytovatelem uzlů, který nabízí koncový bod WebSocket, včetně Alchemy.

 (otevře se v nové záložce)WebSockets vs. HTTP

Na rozdíl od HTTP u WebSocketů nemusíte neustále odesílat požadavky, když chcete konkrétní informace. WebSockety pro vás udržují síťové připojení (pokud jsou správně implementovány) a naslouchají změnám.

Stejně jako u jakéhokoli síťového připojení byste neměli předpokládat, že WebSocket zůstane otevřený navždy bez přerušení, ale správné ruční zpracování přerušených připojení a opětovného připojení může být náročné. Další nevýhodou WebSocketů je, že v odpovědi nedostáváte stavové kódy HTTP, ale pouze chybovou zprávu.

Klientské knihovny to mohou vyřešit za vás. Například WebSocket transport knihovny Viem (otevře se v nové záložce) se ve výchozím nastavení při selhání socketu znovu připojí a odesílá udržovací (keep-alive) pingy.

Vyzkoušejte si to

Potřebujete WebSocket URL pro uzel Etherea. Poskytovatelé uzlů vám ho dají, když si vytvoříte klíč rozhraní pro programování aplikací (API), obvykle ve formátu wss://<provider-host>/<your-api-key>. Například URL pro Ethereum Mainnet od Alchemy vypadá jako wss://eth-mainnet.g.alchemy.com/v2/<your-api-key> (zaregistrujte si bezplatný účet Alchemy (otevře se v nové záložce)). Podívejte se na uzly jako službu pro další poskytovatele, nebo použijte koncový bod WebSocket vašeho vlastního uzlu. Veřejné koncové body jako wss://ethereum-rpc.publicnode.com také fungují pro rychlé experimenty, ale mají omezenou rychlost (rate-limited) a nemusí podporovat každý typ odběru.

Nejjednodušší způsob, jak otestovat WebSockety, je nainstalovat nástroj příkazového řádku pro odesílání WebSocket požadavků, jako je wscat (otevře se v nové záložce). Pomocí wscat můžete odesílat požadavky následovně:

npx wscat -c wss://<provider-host>/<your-api-key>

> {"jsonrpc": "2.0", "id": 0, "method": "eth_gasPrice"}

< {"jsonrpc": "2.0", "result": "0x41f9de2", "id": 0}

Řádky začínající > jsou to, co píšete, a řádky začínající < jsou to, co uzel posílá zpět.

Jak používat WebSockety

Chcete-li začít, otevřete WebSocket pomocí WebSocket URL vašeho poskytovatele. U Alchemy ho najdete tak, že otevřete svou aplikaci v řídicím panelu (otevře se v nové záložce) a zobrazíte její klíč rozhraní pro programování aplikací (API). Všimněte si, že URL pro WebSockety (wss://) se liší od URL pro HTTP požadavky (https://), ačkoli většina poskytovatelů používá stejný API klíč pro obojí.

Jakákoli z metod JSON-RPC, kterou váš poskytovatel podporuje, může být použita přes WebSocket. K tomu použijte stejná data (payload), která by byla odeslána jako tělo HTTP POST požadavku, ale místo toho je odešlete přes WebSocket.

S Web3

Přechod na WebSockety při používání klientské knihovny, jako je Viem (otevře se v nové záložce), je jednoduchý. Použijte transport webSocket s vaším WebSocket URL místo transportu http. Například po npm install viem uložte toto jako index.mjs a spusťte node index.mjs:

API pro odběry (Subscription API)

Při připojení přes WebSocket můžete použít dvě další metody: eth_subscribe a eth_unsubscribe. Tyto metody vám umožní naslouchat konkrétním událostem a být okamžitě upozorněni.

eth_subscribe

Vytvoří nový odběr pro zadané události. Zjistěte více o eth_subscribe (otevře se v nové záložce).

Parametry

  1. Typy odběrů (Subscription types)
  2. Volitelné parametry (Optional params)

První argument určuje typ události, které se má naslouchat. Druhý argument obsahuje další možnosti, které závisí na prvním argumentu. Různé typy odběrů, jejich možnosti a data událostí (payloads) jsou popsány níže.

Návratové hodnoty

ID odběru: Toto ID bude připojeno ke všem přijatým událostem a lze jej také použít ke zrušení odběru pomocí eth_unsubscribe.

Události odběru

Zatímco je odběr aktivní, budete dostávat události, což jsou objekty s následujícími poli:

  • jsonrpc: Vždy "2.0"
  • method: Vždy "eth_subscription"
  • params: Objekt s následujícími poli:
    • subscription: ID odběru vrácené voláním eth_subscribe, které tento odběr vytvořilo.
    • result: Objekt, jehož obsah se liší v závislosti na typu odběru.

Typy odběrů

  1. newHeads

Vyvolá událost pokaždé, když je do řetězce přidána nová hlavička, a to i během reorganizace řetězce.

Když dojde k reorganizaci řetězce, tento odběr vyvolá událost obsahující všechny nové hlavičky pro nový řetězec. Konkrétně to znamená, že můžete vidět více hlaviček vyvolaných se stejnou výškou, a když k tomu dojde, pozdější hlavička by měla být po reorganizaci považována za tu správnou.

Příklad:

  1. logs

Vyvolává logy, které jsou součástí nově přidaných bloků a odpovídají zadaným kritériím filtru.

Když dojde k reorganizaci řetězce, logy, které jsou součástí bloků ve starém řetězci, budou znovu vyvolány s vlastností removed nastavenou na true. Dále jsou vyvolány logy, které jsou součástí bloků v novém řetězci, což znamená, že v případě reorganizace je možné vidět logy pro stejnou transakci vícekrát.

Parametry

  1. Objekt s následujícími poli:
    • address (volitelné): buď řetězec představující adresu, nebo pole takových řetězců.
      • Budou vyvolány pouze logy vytvořené z jedné z těchto adres.
    • topics: pole specifikátorů témat.
      • Každý specifikátor tématu je buď null, řetězec představující téma, nebo pole řetězců.
      • Každá pozice v poli, která není null, omezuje vyvolané logy pouze na ty, které mají na dané pozici jedno z uvedených témat.

Několik příkladů specifikací témat:

  • []: Povolena jakákoli témata.
  • [A]: A na první pozici (a cokoli za ním).
  • [null, B]: Cokoli na první pozici a B na druhé pozici (a cokoli za ním).
  • [A, B]: A na první pozici a B na druhé pozici (a cokoli za ním).
  • [[A, B], [A, B]]: (A nebo B) na první pozici a (A nebo B) na druhé pozici (a cokoli za ním).

Příklad:

Tento příklad naslouchá událostem Deposit z kontraktu zabaleného etheru (WETH) (otevře se v nové záložce) na síti Ethereum Mainnet:

  1. newPendingTransactions

Vyvolá hash každé transakce, která je přidána do čekajícího stavu uzlu (jeho mempoolu).

Příklad:

> {"jsonrpc": "2.0", "id": 1, "method": "eth_subscribe", "params": ["newPendingTransactions"]}

< {"jsonrpc":"2.0","result":"0x1c2365b029179adf1e84b9e327315249","id":1}
< {"jsonrpc":"2.0","method":"eth_subscription","params":{"result":"0x4a62d0ad7c8868fbbfa10604e68638e637c6fc6f64fd1fb4ca042dcd0158c992","subscription":"0x1c2365b029179adf1e84b9e327315249"}}

Někteří poskytovatelé nabízejí také své vlastní typy odběrů. Například alchemy_pendingTransactions (otevře se v nové záložce) od Alchemy vyvolává celé objekty transakcí místo pouhých hashů a přijímá volitelné filtry fromAddress, toAddress a hashesOnly. Ty nejsou součástí standardního JSON-RPC rozhraní pro programování aplikací (API), takže fungují pouze s tímto poskytovatelem.

eth_unsubscribe

Zruší existující odběr, takže již nebudou odesílány žádné další události.

Parametry

  1. ID odběru, jak bylo dříve vráceno z volání eth_subscribe.

Návratové hodnoty

true, pokud byl odběr úspěšně zrušen, nebo false, pokud neexistoval žádný odběr s daným ID.

Odběr existuje pouze na WebSocket připojení, které jej vytvořilo, takže eth_unsubscribe musí být odesláno přes stejné připojení. Nelze jej odeslat jako samostatný HTTP požadavek. Uzavření připojení také zruší všechny jeho odběry.

Příklad:

> {"jsonrpc": "2.0", "id": 2, "method": "eth_unsubscribe", "params": ["0xe0d4abf5caf333fbf94c5f02182e6469"]}

< {"jsonrpc":"2.0","result":true,"id":2}

Zaregistrujte se u Alchemy (otevře se v nové záložce) zdarma, podívejte se na dokumentaci Alchemy (otevře se v nové záložce) a pro nejnovější zprávy sledujte Alchemy na Twitteru (otevře se v nové záložce).