Zum Hauptinhalt springen

WebSockets verwenden

Alchemy
websockets
abfragen
JavaScript
Anfänger
Elan Halpern
1. Dezember 2020
6 Minuten Lesezeit

Dies ist ein Einstiegsleitfaden zur Verwendung von WebSockets und Alchemy, um Anfragen an die Ethereum-Blockchain zu stellen.

 (opens in a new tab)WebSockets vs. HTTP

Im Gegensatz zu HTTP müssen Sie bei WebSockets nicht ständig Anfragen stellen, wenn Sie bestimmte Informationen benötigen. WebSockets halten eine Netzwerkverbindung für Sie aufrecht (wenn sie richtig implementiert sind) und lauschen auf Änderungen.

Wie bei jeder Netzwerkverbindung sollten Sie nicht davon ausgehen, dass ein WebSocket für immer ohne Unterbrechung geöffnet bleibt. Das korrekte manuelle Behandeln von abgebrochenen Verbindungen und Wiederverbindungen kann jedoch eine Herausforderung sein. Ein weiterer Nachteil von WebSockets ist, dass Sie in der Antwort keine HTTP-Statuscodes erhalten, sondern nur die Fehlermeldung.

Alchemy Web3 (opens in a new tab) fügt automatisch eine Behandlung für WebSocket-Fehler und Wiederholungsversuche hinzu, ohne dass eine Konfiguration erforderlich ist.

Probieren Sie es aus

Der einfachste Weg, WebSockets zu testen, ist die Installation eines Befehlszeilentools für WebSocket-Anfragen wie wscat (opens in a new tab). Mit wscat können Sie Anfragen wie folgt senden:

Hinweis: Wenn Sie ein Alchemy-Konto haben, können Sie demo durch Ihren eigenen API-Schlüssel ersetzen. Melden Sie sich hier für ein kostenloses Alchemy-Konto an! (opens in a new tab)

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

Wie man WebSockets verwendet

Öffnen Sie zunächst einen WebSocket über die WebSocket-URL für Ihre App. Sie finden die WebSocket-URL Ihrer App, indem Sie die Seite der App in Ihrem Dashboard (opens in a new tab) öffnen und auf „View Key“ klicken. Beachten Sie, dass sich die URL Ihrer App für WebSockets von der URL für HTTP-Anfragen unterscheidet, aber beide können durch Klicken auf „View Key“ gefunden werden.

Wo Sie Ihre WebSocket-URL in Ihrem Alchemy-Dashboard finden

Jede der in der Alchemy-API-Referenz (opens in a new tab) aufgeführten APIs kann über WebSocket verwendet werden. Verwenden Sie dazu dieselbe Payload, die als Body einer HTTP-POST-Anfrage gesendet werden würde, senden Sie diese Payload jedoch stattdessen über den WebSocket.

Mit Web3

Der Wechsel zu WebSockets bei der Verwendung einer Client-Bibliothek wie Web3 ist einfach. Übergeben Sie bei der Instanziierung Ihrer Web3-Anwendung einfach die WebSocket-URL anstelle der HTTP-URL. Zum Beispiel:

1const web3 = new Web3("wss://eth-mainnet.ws.alchemyapi.io/ws/your-api-key")
2
3web3.eth.getBlockNumber().then(console.log) // -> 7946893

Abonnement-API

Wenn Sie über einen WebSocket verbunden sind, können Sie zwei zusätzliche Methoden verwenden: eth_subscribe und eth_unsubscribe. Diese Methoden ermöglichen es Ihnen, auf bestimmte Ereignisse zu lauschen und sofort benachrichtigt zu werden.

eth_subscribe

Erstellt ein neues Abonnement für angegebene Ereignisse. Erfahren Sie mehr über eth_subscribe (opens in a new tab).

Parameter

  1. Abonnementtypen
  2. Optionale Parameter

Das erste Argument gibt die Art des Ereignisses an, auf das gelauscht werden soll. Das zweite Argument enthält zusätzliche Optionen, die vom ersten Argument abhängen. Die verschiedenen Beschreibungstypen, ihre Optionen und ihre Ereignis-Payloads werden unten beschrieben.

Rückgabewerte

Die Abonnement-ID: Diese ID wird an alle empfangenen Ereignisse angehängt und kann auch verwendet werden, um das Abonnement mit eth_unsubscribe zu kündigen.

Abonnement-Ereignisse

Während das Abonnement aktiv ist, erhalten Sie Ereignisse, die Objekte mit den folgenden Feldern sind:

  • jsonrpc: Immer „2.0“
  • method: Immer „eth_subscription“
  • params: Ein Objekt mit den folgenden Feldern:
    • subscription: Die Abonnement-ID, die vom eth_subscribe-Aufruf zurückgegeben wurde, der dieses Abonnement erstellt hat.
    • result: Ein Objekt, dessen Inhalt je nach Art des Abonnements variiert.

Abonnementtypen

  1. alchemy_newFullPendingTransactions

Gibt die Transaktionsinformationen für alle Transaktionen zurück, die dem ausstehenden Status hinzugefügt werden. Dieser Abonnementtyp abonniert ausstehende Transaktionen, ähnlich dem Standard-Web3-Aufruf web3.eth.subscribe("pendingTransactions"), unterscheidet sich jedoch darin, dass er vollständige Transaktionsinformationen anstelle von nur Transaktions-Hashes ausgibt.

Beispiel:

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
  1. newHeads

Gibt jedes Mal ein Ereignis aus, wenn der Chain ein neuer Header hinzugefügt wird, einschließlich während einer Chain-Reorganisation.

Wenn eine Chain-Reorganisation auftritt, gibt dieses Abonnement ein Ereignis aus, das alle neuen Header für die neue Chain enthält. Insbesondere bedeutet dies, dass Sie möglicherweise mehrere Header sehen, die mit derselben Höhe ausgegeben werden. Wenn dies geschieht, sollte der spätere Header als der korrekte nach einer Reorganisation angesehen werden.

Beispiel:

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
  1. logs

Gibt Protokolle (Logs) aus, die Teil neu hinzugefügter Blöcke sind und den angegebenen Filterkriterien entsprechen.

Wenn eine Chain-Reorganisation auftritt, werden Protokolle, die Teil von Blöcken auf der alten Chain sind, erneut ausgegeben, wobei die Eigenschaft removed auf true gesetzt ist. Darüber hinaus werden Protokolle ausgegeben, die Teil der Blöcke auf der neuen Chain sind, was bedeutet, dass es möglich ist, Protokolle für dieselbe Transaktion im Falle einer Reorganisation mehrmals zu sehen.

Parameter

  1. Ein Objekt mit den folgenden Feldern:
    • address (optional): Entweder ein String, der eine Adresse darstellt, oder ein Array solcher Strings.
      • Nur Protokolle, die von einer dieser Adressen erstellt wurden, werden ausgegeben.
    • topics: Ein Array von Topic-Spezifikatoren.
      • Jeder Topic-Spezifikator ist entweder null, ein String, der ein Topic darstellt, oder ein Array von Strings.
      • Jede Position im Array, die nicht null ist, beschränkt die ausgegebenen Protokolle auf diejenigen, die eines der angegebenen Topics an dieser Position haben.

Einige Beispiele für Topic-Spezifikationen:

  • []: Alle Topics erlaubt.
  • [A]: A an erster Position (und alles danach).
  • [null, B]: Beliebiges an erster Position und B an zweiter Position (und alles danach).
  • [A, B]: A an erster Position und B an zweiter Position (und alles danach).
  • [[A, B], [A, B]]: (A oder B) an erster Position und (A oder B) an zweiter Position (und alles danach).

Beispiel:

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

Kündigt ein bestehendes Abonnement, sodass keine weiteren Ereignisse gesendet werden.

Parameter

  1. Abonnement-ID, wie zuvor von einem eth_subscribe-Aufruf zurückgegeben.

Rückgabewerte

true, wenn ein Abonnement erfolgreich gekündigt wurde, oder false, wenn kein Abonnement mit der angegebenen ID existierte.

Beispiel:

Anfrage

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

Ergebnis

1{
2 "jsonrpc": "2.0",
3 "id": 1,
4 "result": true
5}

Melden Sie sich kostenlos bei Alchemy an (opens in a new tab), sehen Sie sich unsere Dokumentation (opens in a new tab) an und folgen Sie uns für die neuesten Nachrichten auf Twitter (opens in a new tab).

Letzte Aktualisierung der Seite: 3. März 2026

War dieses Tutorial hilfreich?