Utiliser des nœuds de blockchain Ethereum

Cette page explique comment appeler l'API de nœud Ethereum. Pour accéder au nœud de la blockchain Ethereum, vous devez connaître la clé API et l'URL du point de terminaison du nœud. Si vous ne l'avez pas déjà fait, suivez le guide Utiliser des nœuds de blockchain pour les déterminer.

JSON-RPC

Cette section décrit l'interrogation de l'API JSON-RPC d'un nœud de blockchain Ethereum.

Exemple de RPC de client d'exécution

Vous pouvez interroger le client d'exécution (Geth pour les nœuds complets ou Erigon pour les nœuds d'archive) via JSON-RPC. Consultez la spécification de l'API Ethereum pour la spécification JSON-RPC générique ou la documentation RPC de Geth pour la documentation spécifique à Geth.

Par exemple, pour appeler la méthode eth_getBlockByNumber() :

curl -H POST \
  -H "X-goog-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "id":1,
    "jsonrpc":"2.0",
    "method": "eth_getBlockByNumber",
    "params": ["0x1", true]
  }' \
  http://YOUR_NODES_URL

Où :

  • id est un identifiant défini par le client, à l'origine de la requête. Exemple : 1.
  • jsonrpc correspond à la version JSON-RPC. Exemple :2.0
  • method est le nom de la méthode. Exemple :eth_getBlockByNumber
  • params sont des valeurs à utiliser avec method.
  • YOUR_NODES_URL correspond à l'adresse renvoyée dans Obtenir les URL des nœuds de la blockchain. Par exemple, json-rpc.ejp4j0b1rdiq06p8lxksd5z25.blockchainnodeengine.com.
  • YOUR_API_KEY est la clé que vous avez créée dans Créer une clé API.

Pour en savoir plus sur le format de l'objet Request, consultez la spécification JSON-RPC2.0.

Voici un exemple de réponse à la commande ci-dessus :

{
   "id" : 1,
   "jsonrpc" : "2.0",
   "result" : {
      "difficulty" : "0x3ff800000",
      "extraData" : "0x476574682f76312e302e302f6c696e75782f676f312e342e32",
      "gasLimit" : "0x1388",
      "gasUsed" : "0x0",
      "hash" : "0x88e96d4537bea4d9c05d12549907b32561d3bf31f45aae734cdc119f13406cb6",
      "logsBloom": "0x0000000000000000000000000000000000000",
      "miner" : "0x05a56e2d52c817161883f50c441c3228cfe54d9f",
      "mixHash" : "0x969b900de27b6ac6a67742365dd65f55a0526c41fd18e1b16f1a1215c2e66f59",
      "nonce" : "0x539bd4979fef1ec4",
      "number" : "0x1",
      "parentHash" : "0xd4e56740f876aef8c010b86a40d5f56745a118d0906a34e69aec8c0db1cb8fa3",
      "receiptsRoot" : "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
      "sha3Uncles" : "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
      "size" : "0x219",
      "stateRoot" : "0xd67e4d450343046425ae4271474353857ab860dbc0a1dde64b41b5cd3a532bf3",
      "timestamp" : "0x55ba4224",
      "totalDifficulty" : "0x7ff800000",
      "transactions" : [],
      "transactionsRoot" : "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
      "uncles" : []
   }
}

RPC du nœud Beacon

Blockchain Node Engine expose également le point de terminaison du client de consensus Ethereum. Par exemple, pour demander l'état du validateur à l'emplacement 1 :

curl \
-H "X-goog-api-key: YOUR_API_KEY" "Content-Type: application/json" \
'http://beacon.YOUR_NODES_URL/eth/v1/beacon/states/head/validators/1'

Vous pouvez également fournir votre clé API en tant qu'en-tête HTTP au lieu d'un paramètre de requête. La requête suivante est équivalente :

curl \
-H "Content-Type: application/json" \
'http://beacon.YOUR_NODES_URL/eth/v1/beacon/states/head/validators/1?key=YOUR_API_KEY'

Explication :

Voici un exemple de réponse à la commande ci-dessus :

{
  "execution_optimistic": false,
  "data": {
    "index": "1",
    "balance": "36835614902",
    "status": "active_ongoing",
    "validator": {
      "pubkey": "0x1234abcd",
      "withdrawal_credentials": "0x1234abcd",
      "effective_balance": "32000000000",
      "slashed": false,
      "activation_eligibility_epoch": "0",
      "activation_epoch": "0",
      "exit_epoch": "18446744073709551615",
      "withdrawable_epoch": "18446744073709551615"
    }
  }
}

WebSocket

Pour vous abonner à des flux de données au lieu d'interroger les données, vous pouvez utiliser l'API WebSocket du client d'exécution du nœud de la blockchain.

Par exemple, pour vous abonner à de nouveaux chefs de chaîne :

wscat -c wss://ws.YOUR_NODES_URL?key=YOUR_API_KEY
Connected (press CTRL+C to quit)
> {"jsonrpc":"2.0", "id": 1, "method": "eth_subscribe", "params": ["newHeads"]}

Le client d'exécution répond avec un identifiant pour l'abonnement, par exemple :

{"jsonrpc":"2.0","id":1,"result":"0xf47df962ae9ba250ba9e9fb239b6894f"}

Le client enverra ensuite les détails de chaque nouveau bloc de tête de chaîne au fur et à mesure de leur apparition. Voici un exemple d'événement de l'abonnement ci-dessus :

{
   "jsonrpc" : "2.0",
   "method" : "eth_subscription",
   "params" : {
      "result" : {
         "baseFeePerGas" : "0x4bdc620b8",
         "difficulty" : "0x0",
         "extraData" : "0x496c6c756d696e61746520446d6f63726174697a6520447374726962757465",
         "gasLimit" : "0x1c9c380",
         "gasUsed" : "0xe24dae",
         "hash" : "0xbde840749c4d9086d17d66079d5f7d3d568ed4572329691e5b4a70f44a551816",
         "logsBloom": "0x0000000000000000000000000000000000000",
         "miner" : "0xb4c9e4617a16be36b92689b9e07e9f64757c1792",
         "mixHash" : "0xf68eb0b3ec50e1543de1cc7f09c7735ba20fa252124511756857078a3ff9a7cf",
         "nonce" : "0x0000000000000000",
         "number" : "0x109e280",
         "parentHash" : "0x54f78faba9fde0d15d7a9d6b80c4569435c7fdc5f1fef3255110373b66ce14de",
         "receiptsRoot" : "0x876bcb5772f8597fee4b063c57b7a51209eb428034efabf4cdf39a46901681b4",
         "sha3Uncles" : "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
         "stateRoot" : "0xfc5daf9608c8f2b9944bcfe0b9182148d85b1a6ad4dc52d3eb522dd02687c7e0",
         "timestamp" : "0x647fd287",
         "transactionsRoot" : "0x0acaef87e4609ea6075d88fdd404b3fbd25d796af9044522beefd3c708d37af8",
         "withdrawalsRoot" : "0x7adfc670253572678769e7d80db8c4c94b5d14d4e014274f39b679fdb5e72d98"
      },
      "subscription" : "0xf47df962ae9ba250ba9e9fb239b6894f"
   }
}

Métriques

Les nœuds Ethereum fournissent un certain nombre de métriques sur l'état opérationnel du nœud. Elles sont généralement utilisées par un outil tel que Prometheus ou Grafana.

Pour récupérer les métriques exposées par un client Beacon, vous pouvez utiliser une commande telle que :

curl https://bc-mc.YOUR_NODES_URL/metrics/prometheus?key=YOUR_API_KEY

Un résultat semblable à celui-ci doit s'afficher :

# HELP async_tasks_count Total number of async tasks spawned using spawn
# TYPE async_tasks_count gauge
async_tasks_count{async_task_count="addr_broadcast"} 0
async_tasks_count{async_task_count="beacon_node"} 0
async_tasks_count{async_task_count="beacon_processor_manager"} 1
async_tasks_count{async_task_count="beacon_processor_reprocess_queue"} 1
async_tasks_count{async_task_count="beacon_processor_worker"} 0
async_tasks_count{async_task_count="discv5"} 4
async_tasks_count{async_task_count="el_fork_choice_update"} 0
async_tasks_count{async_task_count="eth1"} 1
...

Il existe des points de terminaison de métriques distincts pour le client d'exécution et le client Beacon. Pour le client d'exécution, ils sont généralement précédés du préfixe ec-mc et pour le client de balise, ils sont généralement précédés du préfixe bc-mc (comme dans l'exemple ci-dessus).

Pour en savoir plus sur les métriques de chaque logiciel client, consultez les pages suivantes :