Utiliser des nœuds de blockchain Ethereum

Cette page explique comment appeler l'API du nœud Ethereum. Avant de pouvoir 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. Pour obtenir la spécification JSON-RPC générique, consultez la spécification de l'API Ethereum ou la documentation RPC 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 est 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 la section 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 de balise

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 ci-dessous 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 supplémentaire:

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 plutôt que d'interroger les données, vous pouvez utiliser l'API WebSocket du client d'exécution du nœud de blockchain.

Par exemple, pour vous abonner à de nouveaux titres 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 de l'abonnement, par exemple:

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

Par la suite, le client enverra les détails de chaque nouveau bloc de tête de chaîne à mesure qu'il se produit. 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 consommées par un outil tel que Prometheus ou Grafana.

Pour récupérer les métriques exposées par un client de balise, 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 s'affiche:

# 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 de balise. 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:

Guide de référence des ports Private Service Connect

Les nœuds compatibles avec Private Service Connect utilisent une adresse IP statique générée par l'utilisateur ainsi que le port désigné pour générer un point de terminaison. Utilisez le mappage approprié dans le tableau suivant.

Type de port Numéro de port
Point de terminaison de l'API JSON-RPC 8545
Point de terminaison de l'API Websocket Geth 8546
Point de terminaison de l'API Websocket Erigon 8545
Point de terminaison de l'API Beacon 5052
Point de terminaison de l'API Prometheus Metrics Beacon 5054
Point de terminaison de l'API Prometheus Metrics du client d'exécution 8647