Leçons 1/4 · 15 min
Interroger un nœud : requête et réponse JSON-RPC
Comment un portefeuille connaît-il votre solde ?
Il ne lit aucun disque : il envoie une question à un nœud, qui répond. JSON-RPC est un protocole très simple pour cela : « RPC » veut dire appel de procédure à distance (appeler une fonction qui s'exécute ailleurs), et les messages sont du JSON. La version décrite ici est la 2.0 (spécification « JSON-RPC 2.0 »). Plusieurs familles de nœuds la parlent : les nœuds de type Ethereum, ceux construits sur Substrate, et Bitcoin Core propose lui aussi une interface JSON-RPC avec ses propres méthodes. Les noms de méthodes changent d'un écosystème à l'autre.
Dans cet atelier, le nœud d'entraînement utilise des noms inventés : chain_blockNumber, chain_getBalance, chain_getBlockByNumber. Retenez la forme, pas les noms. Autre différence avec Ethereum : ici les quantités (comme la hauteur d'un bloc) sont des nombres JSON, alors que les nœuds de type Ethereum les écrivent en chaînes hexadécimales.
Une requête a quatre champs
{"jsonrpc":"2.0","method":"chain_getBalance","params":["0xAAAA…","latest"],"id":7}jsonrpc: toujours la chaîne"2.0".method: le nom de la procédure.params: les arguments, soit une liste (par position, comme ci-dessus), soit un objet (par nom). Facultatif quand il n'y a rien à passer.id: un identifiant choisi par vous (nombre ou chaîne). Le serveur le recopie dans sa réponse, ce qui permet d'associer chaque réponse à sa question quand plusieurs sont en vol.
On l'envoie dans le corps d'une requête HTTP POST avec l'en-tête Content-Type: application/json, vers l'adresse du point de terminaison (<endpoint> ci-dessous), par exemple avec curl :
curl -s -X POST <endpoint> -H "Content-Type: application/json" -d '{"jsonrpc":"2.0","method":"chain_blockNumber","params":[],"id":7}'Une réponse a un résultat OU une erreur
{"jsonrpc":"2.0","result":"0x1f4","id":7}
{"jsonrpc":"2.0","error":{"code":-32601,"message":"Method not found"},"id":7}Une réponse contient result ou error, jamais les deux. Ici "0x1f4" est un nombre en hexadécimal : 1×256 + 15×16 + 4 = 500. Les nœuds de type Ethereum renvoient ainsi la plupart des nombres, sous forme de chaîne hexadécimale ; d'autres écosystèmes renvoient des nombres JSON. Lisez la documentation de votre nœud et convertissez explicitement : n'additionnez jamais deux chaînes hexadécimales.
Une grosse valeur (un solde en plus petite unité) dépasse souvent ce qu'un nombre JavaScript sait représenter exactement ; on la garde en chaîne ou en bigint jusqu'à l'affichage. Vous le reverrez dans l'atelier sur TypeScript.
Notifications et lots
- Une requête sans
idest une notification : le serveur ne répond rien. Utile pour prévenir, inutile pour interroger. - Un lot (batch) est un tableau de requêtes envoyé d'un coup ; la réponse est un tableau, dans un ordre qui n'est pas garanti : on associe par
id. Pratique pour économiser des allers-retours sur une connexion lente, mais certains fournisseurs limitent la taille d'un lot.
Ce que cela ne garantit PAS
- JSON-RPC ne dit rien sur l'authenticité de la réponse : un nœud peut se tromper, être en retard ou mentir. Rien ici ne prouve que le solde annoncé est celui de la chaîne.
- La spécification ne dit rien de HTTP : certains serveurs répondent « 200 » même pour une erreur JSON-RPC. Ne vous fiez pas au statut HTTP seul ; regardez le corps.
- Une méthode
chain_getBalancen'existe sur aucun nœud réel sous ce nom ; allez lire la liste des méthodes du vôtre.
À retenir : quatre champs en entrée, résultat OU erreur en sortie, id pour associer.
