Que vous soyez développeur chevronné ou débutant, une chose est sûre : vous devez tester votre code.
Et c'est d'autant plus important quand il y a de l'argent en jeu, comme sur les blockchains.

Voyons comment mettre en place un nœud Ethereum local avec Go Ethereum. Il sera réellement local, c'est-à-dire qu'il ne s'agira pas d'un fork qui se synchronisera avec le réseau Ethereum.

Installation

Il vous faudra un système d'exploitation sous GNU/Linux, puis :

$ curl 'https://gethstore.blob.core.windows.net/builds/geth-linux-amd64-1.10.17-25c9b49f.tar.gz' -o 'geth.tar.gz'
$ tar xfz 'geth.tar.gz' --transform 's/-linux-amd64-.*//'
$ mv 'geth' ~/.local/bin/
$ rm 'geth.tar.gz'
$ mkdir -p 'dev/node'
$ hash

Comptes

Pour créer un compte, utlisez cette commande (sans mot de passe):

$ geth --datadir 'dev/node' account new
# Or to import an existing key:
# $ geth --datadir 'dev/node' account import 'UTC--…'

Un fichier UTC--… sera créé dans le dossier dev/node/keystore.
À partir de celui-ci, vous pouvez utiliser ce script Python pour récupérer la clef privée :

# file: dev/get-private-key.py
"""Tool to get the private key of a keystore file."""
import sys
from binascii import b2a_hex
from pathlib import Path

from web3.auto import w3


path = Path(__file__).parent / "node" / "keystore" / sys.argv[1]
encrypted_key = path.read_text()
password = ""  # Adapt accordingly to what was set at the account creation
private_key = w3.eth.account.decrypt(encrypted_key, password)
print(b2a_hex(private_key).decode())

À lancer tel que :

$ python dev/get-private-key.py FILE

FILE est un des fichiers UTC--… du dossier dev/node/keystore.

Pour la suite, admettons que nous ayons créé le compte ayant l'adresse 0x8db97C7cEcE249c2b98bDC0226Cc4C2A57BF52FC et la clef privée 56289e99c94b6912bfc12adc093c9b51124f0dc54ac7a766b2bc5ccf558d8027.

Initialisation

Créez le fichier dev/genesis.json, qui servira à définir le bloc genesis, avec ce contenu :

{
    "config": {
        "chainId": 1234,
        "homesteadBlock": 0,
        "eip150Block": 0,
        "eip155Block": 0,
        "eip158Block": 0,
        "eip1559block": 0,
        "byzantiumBlock": 0,
        "constantinopleBlock": 0,
        "petersburgBlock": 0,
        "istanbulBlock": 0,
        "muirGlacierBlock": 0,
        "berlinBlock": 0,
        "londonBlock": 0
    },
    "difficulty": "0x1",
    "gasLimit": "0xffffffffffff",
    "alloc": {
        "8db97C7cEcE249c2b98bDC0226Cc4C2A57BF52FC": { "balance": "1000000000000000000000000" }
    }
}

La balance des comptes est à définir dans la section alloc. Notez que l'adresse ne doit pas être précédée de "0x".
Dans notre cas, le compte aura 1 000 000 $ETH, je suis généreux ☻

Ensuite, lancez cette commande pour (ré)initialiser le nœud :

$ rm -rf 'dev/node/geth'
$ geth --datadir 'dev/node' init 'dev/genesis.json'

Démarrage

Démarrez le nœud aussi simplement que :

$ geth \
    --datadir 'dev/node' \
    --ipcdisable \
    --http \
    --http.api 'eth,net,web3' \
    --http.corsdomain '*' \
    --ws \
    --ws.api='eth,web3' \
    --ws.origins='*' \
    --nodiscover \
    --allow-insecure-unlock \
    --unlock '0x8db97C7cEcE249c2b98bDC0226Cc4C2A57BF52FC' \
    --password 'dev/account-pwd.txt' \
    --mine \
    --miner.threads '1' \
    --miner.noverify

Notes :

  • dev/account-pwd.txt est un fichier vide, étant donné que je n'ai pas défini de mot de passe à la création du compte. Sinon, il devrait contenir le mot de passe.
  • --httpi.api : j'ai ajouté net pour faire plaisir à Metamask, mais sinon eth,web3 suffit.
  • --mine*: requis pour la validation des transactions.

Détails de notre blockchain locale :

- RPC HTTP URL: http://127.0.0.1:8545/
- RPC WSS URL: ws://127.0.0.1:8546
- ChainID: 1234 (0x4d2)
- Symbol: ETH

Et voilà !


Historique

  • 2022-04-21 : activation du RPC WebSocket.
  • 2022-04-14 : mise à jour de Geth (1.10.16-20356e57 → 1.10.17-25c9b49f).