Passer au contenu principal

Utiliser WebSockets

alchemywebsocketsrequêtesjavascript
Débutant
Elan Halpern
Documentation Alchemy(opens in a new tab)
1 décembre 2020
6 minutes de lecture minute read

Il s'agit d'un guide pour débuter avec l'utilisation de WebSockets et d'Alchemy pour effectuer des requêtes sur la blockchain Ethereum.

(opens in a new tab)WebSockets vs. HTTP

Contrairement à HTTP, avec les WebSockets, il n'est pas nécessaire d'émettre continuellement des demandes lorsque vous souhaitez obtenir des informations spécifiques. WebSockets maintient une connexion réseau pour vous (si cela est fait correctement) et écoute les modifications.

Comme pour toute connexion réseau, vous ne devez pas supposer qu'un WebSocket restera ouvert pour toujours sans interruption, mais gérer correctement les connexions interompues et la reconnexion manuelle peut être un défi à réaliser. Un autre inconvénient de WebSockets est que vous n'obtenez pas de codes d'état HTTP dans la réponse, mais seulement le message d'erreur.

Alchemy Web3(opens in a new tab) ajoute automatiquement la gestion des erreurs WebSocket et les retente sans configuration nécessaire.

Essayez le

Le moyen le plus simple de tester WebSockets est d'installer un outil de lignes de commandes pour créer des requêtes WebSocket telles que wscat(opens in a new tab). En utilisant wscat, vous pouvez envoyer des requêtes comme suit :

Note : Si vous disposez d'un compte Alchemy, vous pouvez remplacer demo par votre propre clé API. Créez votre compte Alchemy gratuitement ici !(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

Comment utiliser WebSockets

Pour commencer, ouvrez un WebSocket en utilisant le lien Websocket pour votre app. 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 « Afficher la clé ». Notez que l'URL de votre application pour WebSockets est différente de son URL pour les demandes HTTP, mais les deux peuvent être trouvées en cliquant sur « Voir la clé ».

Où trouver votre URL WebSocket dans votre tableau de bord Alchemy

Chacune 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 le même bloc que le corps d'une requête HTTP POST, mais envoyez ce payload à travers le WebSocket.

Avec Web3

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

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

API d'abonnement

Lorsque vous êtes connecté avec WebSocket, vous avez accès à deux méthodes supplémentaires : eth_subscribe et eth_unsubscribe. Ces méthodes vous permettront d'écouter des événements spécifiques et d'être immédiatement averti lorsqu'ils se produisent.

eth_subscribe

Crée un nouvel abonnement pour les é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 facultatifs

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 leurs blocs d'événement sont décrits ci-dessous.

Valeur de retour

L'identifiant de l'abonnement : cet identifiant sera attaché à chaque événements reçu, et peut également être utilisé pour résilier l'abonnement associé en utilisant eth_unsubscribe.

Événements d'abonnement

Tant que l'abonnement est actif, vous recevrez des événements sous la forme d'objets avec les propriétés suivantes :

  • jsonrpc : Toujours « 2.0 »
  • method : Toujours « eth_subscription »
  • params : Un objet comportant les propriétés suivantes :
    • subscription : L'identifiant de l'abonnement retourné par l'appel de la méthode eth_subscription 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 concerne les transactions en attente, de manière similaire à l'appel Web3 standard web3.eth.subscribe(« pendingTransactions »), mais à la différence qu'il émet des informations complètes sur les transactions plutôt que simplement les empreintes numériques.

Exemple :

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
Afficher tout
Copier
  1. newHeads

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

Lorsqu'une réorganisation de chaîne se produit, cet abonnement émet un événement contenant tous les nouveaux en-têtes de la nouvelle chaîne. Plus particulièrement, 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 de cette hauteur doit être considéré comme le bon après une réorganisation.

Exemple :

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
Afficher tout
Copier
  1. logs

Émet des journaux concernant les blocs récemment ajoutés qui correspondent aux critères de filtre spécifiés.

Lorsqu'une réorganisation de la chaîne se produit, les logs qui font partie des blocs de l'ancienne chaîne seront à nouveau émis avec la propriété removed réglée sur true. De plus, les logs 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 dans le cas d'une réorganisation.

Paramètres

  1. Un objet avec les propriétés suivantes :
    • address (optionnelle) : soit une chaîne de caractères représentant une adresse soit un tableau de ces chaînes de caractères.
      • Seuls les journaux créés par une de ces adresses seront émis.
    • topics : un tableau de spécificateurs de sujet.
      • 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 de caractères.
      • Chaque position dans le tableau qui n'est pas null limite les logs émis à ceux qui ont un des sujets donnés dans cette position.

Quelques exemples de spécifications du sujet :

  • [] : 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 :

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
Afficher tout
Copier

eth_unsubscribe

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

Paramètres

  1. ID de l'abonnement, comme précédemment retourné de l'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

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

Résultat

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

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).

Dernière modification: @MATsxm(opens in a new tab), 15 août 2023

Ce tutoriel vous a été utile ?