Passer au contenu principal

Utiliser les WebSockets

Alchemy
websockets
requêtes
JavaScript
Débutant
Elan Halpern
1 décembre 2020
6 minutes de lecture

Ceci est un guide de niveau débutant sur l'utilisation des WebSockets et d'Alchemy pour effectuer des requêtes sur la chaîne de blocs Ethereum.

 (opens in a new tab)WebSockets vs HTTP

Contrairement à HTTP, avec les WebSockets, vous n'avez pas besoin d'effectuer continuellement des requêtes lorsque vous souhaitez obtenir des informations spécifiques. Les WebSockets maintiennent une connexion réseau pour vous (si cela est fait correctement) et écoutent les changements.

Comme pour toute connexion réseau, vous ne devez pas supposer qu'un WebSocket restera ouvert indéfiniment sans interruption, mais gérer correctement les pertes de connexion et les reconnexions manuellement peut s'avérer difficile. Un autre inconvénient des WebSockets est que vous n'obtenez pas de codes d'état HTTP dans la réponse, mais uniquement le message d'erreur.

Alchemy Web3 (opens in a new tab) ajoute automatiquement la gestion des échecs et des tentatives de reconnexion des WebSockets sans aucune configuration nécessaire.

Essayez-le

Le moyen le plus simple de tester les WebSockets est d'installer un outil en ligne de commande pour effectuer des requêtes WebSocket, tel que wscat (opens in a new tab). En utilisant wscat, vous pouvez envoyer des requêtes de la manière suivante :

Remarque : si vous avez un compte Alchemy, vous pouvez remplacer demo par votre propre clé API. Inscrivez-vous pour un compte Alchemy gratuit ici ! (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}

Comment utiliser les WebSockets

Pour commencer, ouvrez un WebSocket en utilisant l'URL WebSocket de votre application. Vous pouvez trouver l'URL WebSocket de votre application en ouvrant la page de l'application dans votre tableau de bord (opens in a new tab) et en cliquant sur « View Key » (Voir la clé). Notez que l'URL de votre application pour les WebSockets est différente de son URL pour les requêtes HTTP, mais les deux peuvent être trouvées en cliquant sur « View Key ».

Where to find your WebSocket URL in your Alchemy dashboard

N'importe laquelle des API listées dans la Référence de l'API Alchemy (opens in a new tab) peut être utilisée via WebSocket. Pour ce faire, utilisez la même charge utile qui serait envoyée dans le corps d'une requête HTTP POST, mais envoyez-la plutôt via le WebSocket.

Avec Web3

Passer aux WebSockets tout en utilisant une bibliothèque client comme Web3 est simple. Il suffit de passer l'URL WebSocket au lieu de celle HTTP lors de l'instanciation de votre client Web3. Par exemple :

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

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

API d'abonnement

Lors d'une connexion via un WebSocket, vous pouvez utiliser deux méthodes supplémentaires : eth_subscribe et eth_unsubscribe. Ces méthodes vous permettront d'écouter des événements particuliers et d'être notifié immédiatement.

eth_subscribe

Crée un nouvel abonnement pour des événements spécifiés. En savoir plus sur eth_subscribe (opens in a new tab).

Paramètres

  1. Types d'abonnement
  2. Paramètres optionnels

Le premier argument spécifie le type d'événement à écouter. Le deuxième argument contient des options supplémentaires qui dépendent du premier argument. Les différents types de description, leurs options et les charges utiles de leurs événements sont décrits ci-dessous.

Retours

L'ID d'abonnement : Cet ID sera attaché à tous les événements reçus, et peut également être utilisé pour annuler l'abonnement à l'aide de eth_unsubscribe.

Événements d'abonnement

Tant que l'abonnement est actif, vous recevrez des événements qui sont des objets avec les champs suivants :

  • jsonrpc : Toujours « 2.0 »
  • method : Toujours « eth_subscription »
  • params : Un objet avec les champs suivants :
    • subscription : L'ID d'abonnement retourné par l'appel eth_subscribe qui a créé cet abonnement.
    • result : Un objet dont le contenu varie en fonction du type d'abonnement.

Types d'abonnement

  1. alchemy_newFullPendingTransactions

Retourne les informations de transaction pour toutes les transactions qui sont ajoutées à l'état en attente. Ce type d'abonnement s'abonne aux transactions en attente, de manière similaire à l'appel Web3 standard web3.eth.subscribe("pendingTransactions"), mais diffère en ce qu'il émet des informations de transaction complètes plutôt que de simples hachages de transaction.

Exemple :

  1. newHeads

Émet un événement chaque fois qu'un nouvel en-tête est ajouté à la chaîne, y compris lors d'une réorganisation de la chaîne.

Lorsqu'une réorganisation de la chaîne se produit, cet abonnement émettra un événement contenant tous les nouveaux en-têtes pour la nouvelle chaîne. En particulier, cela signifie que vous pouvez voir plusieurs en-têtes émis avec la même hauteur, et lorsque cela se produit, le dernier en-tête doit être considéré comme le bon après une réorganisation.

Exemple :

  1. logs

Émet des journaux qui font partie des blocs nouvellement ajoutés et qui correspondent aux critères de filtre spécifiés.

Lorsqu'une réorganisation de la chaîne se produit, les journaux qui font partie des blocs de l'ancienne chaîne seront émis à nouveau avec la propriété removed définie sur true. De plus, les journaux qui font partie des blocs de la nouvelle chaîne sont émis, ce qui signifie qu'il est possible de voir les journaux pour la même transaction plusieurs fois en cas de réorganisation.

Paramètres

  1. Un objet avec les champs suivants :
    • address (optionnel) : soit une chaîne de caractères représentant une adresse, soit un tableau de telles chaînes.
      • Seuls les journaux créés à partir de l'une de ces adresses seront émis.
    • topics : un tableau de spécificateurs de sujets (topics).
      • Chaque spécificateur de sujet est soit null, soit une chaîne de caractères représentant un sujet, soit un tableau de chaînes.
      • Chaque position dans le tableau qui n'est pas null restreint les journaux émis à ceux qui ont l'un des sujets donnés à cette position.

Quelques exemples de spécifications de sujets :

  • [] : Tous les sujets sont autorisés.
  • [A] : A en première position (et n'importe quoi après).
  • [null, B] : N'importe quoi en première position et B en deuxième position (et n'importe quoi après).
  • [A, B] : A en première position et B en deuxième position (et n'importe quoi après).
  • [[A, B], [A, B]] : (A ou B) en première position et (A ou B) en deuxième position (et n'importe quoi après).

Exemple :

eth_unsubscribe

Annule un abonnement existant afin qu'aucun autre événement ne soit envoyé.

Paramètres

  1. ID d'abonnement, tel que retourné précédemment par un appel eth_subscribe.

Retours

true si un abonnement a été annulé avec succès, ou false si aucun abonnement n'existait avec l'ID donné.

Exemple :

Requête

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

Résultat

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

Inscrivez-vous gratuitement sur Alchemy (opens in a new tab), consultez notre documentation (opens in a new tab), et pour les dernières nouvelles, suivez-nous sur Twitter (opens in a new tab).