Ethereum : Créer une blockchain privée

6

Vous avez eu une idée d’application parfaite pour la blockchain, une application qui nécessite un grand livre distribué sans possibilité de supprimer des données et vous avez toutes les compétences sur Solidity pour développer vos contracts intelligents ? Seul problème pour vous la blockchain Ethereum est public et vous souhaitez stocker des informations confidentielles.
Il existe cependant une solution que nous allons étudier ici, à savoir la création d’une blockchain privée.

Ethereum permet de créer une blockchain privée ce qui peut présenter plusieurs avantages :

  • Vous pourrez assurer la confidentialité des données et des transactions
  • Vous pouvez choisir les nœuds et les mineurs qui valident et surveillent les transactions de votre blockchain, ce qui offre de nombreuses possibilités, par exemple dans le domaine bancaire ou chaque banque pourrait valider des chèques dans une blockchain. En France, des notaires pourraient devenir chacun un noeud du réseau pour gérer des transactions immobilières. Dans le domaine automobile, il serait possible de créer une blockchain de suivi des carnets d’entretien, les écoles pourraient stocker les diplômes de leur étudiant, etc.
  • La possibilité de créer un token ou une cryptomonnaie dont le prix ne dépend pas de l’Ether (et donc limiter les coûts de transaction à la puissance des serveurs/ordinateurs connectés)

Nous allons donc expliquer toutes les étapes indispensables, à savoir :

  • Comment installer et configurer une blockchain privée
  • Comment la paramétrer, depuis le premier block de la blockchain
  • Comment interagir avec depuis un terminal (créer des comptes, consulter le solde disponible)
  • Comment miner pour valider les transactions (et paramétrer la difficulté de minage)
  • Comment ajouter des nœuds supplémentaires à la chaîne de blocs

Les prérecquis

Avant toute chose, vous devez installer GETH, il s’agit d’une interface en ligne de commande qui nous permettra de créer et gérer notre blockchain privée. Pour information, GETH est développé avec le langage de programmation Go de Google.

Pour le télécharger, quelque soit votre OS , rendez vous sur https://geth.ethereum.org/downloads/

Sur Windows, il suffit de télécharger l’exécutable et de l’installer.

Sur Linux, il faut l’ajouter à vos PPA:

sudo add-apt-repository -y ppa:ethereum/ethereum

Puis l’installer :

sudo apt-get update
sudo apt-get install ethereum

Sur Mac, il faut avoir installé homebrow puis :

brew tap ethereum/ethereum
brew install ethereum

Pour information, vous pouvez aussi faire tourner Geth dans un conteneur Docker ou le compiler vous même depuis le code source. Si ces deux options vous intéressent, vous trouverez les instructions à cette adresse: https://ethereum.github.io/go-ethereum/install/

Paramétrage de base

Pour démarrer notre blockchain privée, nous devons créer le tout premier bloc, le bloc Genesis, le seul qui ne sera pas lié à un bloc précédent. Il contient les paramètres importants de celle-ci. Nous allons paramétrer la ‘difficulty’ très basse pour que le minage soit simple pour valider les transactions facilement pour les tests.

La valeur hexadécimale 0x20000, soit 131072, signifie qu’il y a une chance sur 131072 de miner un bloc au premier essai. Voici le fichier complet (créer un fichier genesis.json dans un répertoire ma-blockchain avec ce contenu) :

{
 "nonce": "0x0000000000000042",
 "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
 "difficulty": "0x20000",
 "alloc": {},
 "coinbase": "0x0000000000000000000000000000000000000000",
 "timestamp": "0x0",
 "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
 "extraData": "0x",
 "gasLimit": "0xffffffff",
 "config": {
    "chainId": 7789,
    "homesteadBlock": 0,
    "eip155Block": 0,
    "eip158Block": 0
 }
}

C’est suffisant pour démarrer, mais si vous souhaitez connaitre tous les détails de chacun des paramètres, vous pourrez trouver une description exacte de chacun ici.

Nous allons maintenant indiquer à Geth le fichier genesis que nous venons de créer qu’il devra utiliser pour initialiser notre blockchain et lui indiquer un répertoire pour stocker les données.
Rendez vous en ligne de commande dans le répertoire ma_blockchain puis lancer la commande suivante :

geth --datadir "./data" init genesis.json

Celle-ci indiquera à Geth d’utiliser le répertoire data pour stocker la database de la blockchain et le fichier keystore, avec les paramètres du genesis.json.

Nous allons donc lancer Geth, que nous avons au préalable installé dans le répertoire ma_blockchain du disque du F:

F:\ma_blockchain\geth --datadir "./data" --networkid 7789 --rpc --rpcport "8545" --rpccorsdomain "*" --nodiscover --rpcapi=”admin,db,eth,net,web3,personal,txpool,miner”

Sur windows, pour utiliser directement la commande geth au lieu de F:\ma_blockchain\geth , il faut ajouter le répertoire « F:\ma_blockchain\ » dans les variables d’environnement de votre session.

Si vous regardez en détail la commande ci dessus, vous verrez qu’elle contient le lancement de plusieurs API (rpcapi=..) que nous allons utiliser ensuite, avec principalement:

  • admin : qui va nous permettre de gérer notre noeud de blockchain
  • personal : pour créer nos premiers utilisateurs donc nos premières adresse ethereum de notre blockchain privée
  • eth : pour récupérer des informations sur les utilisateurs, par exemple le nombre d’ether sur un compte, ce que nous pourrons aussi faire avec web3 qui fait aussi partie des api.
  • miner : pour démarrer le minage des blocs
  • txpool : pour vérifier si des transactions sont en attente de validation

Il ne s’agit que des principales que nous allons utiliser dans ce tutorial, mais vous pourrez retrouver le détail de toutes les API et leurs possibilités à cette adresse : https://github.com/ethereum/go-ethereum/wiki/Management-APIs

Utilisation de la console Javascript de Geth

Maintenant que notre blockchain privée est lancée, nous allons commencer à utiliser la console Javascript de Geth pour intéragir avec. Lancer une nouvelle invite de commande puis tapez ceci :

geth attach http://127.0.0.1:8545

Un message « welcome to the javascript console » devrait s’afficher.

Vous pouvez retrouver tous les paramètres de votre blockchain privée avec cette commande :

admin.nodeInfo

Nous allons créer notre première adresse ethereum:

personal.newAccount()

La console vous demandera le mot de passe puis sa confirmation, puis affichera l’adresse nouvellement créée.

Vous pouvez aussi créer un compte plus rapidement en donnant le mot de passe en paramètre, par exemple :

personal.newAccount("password")

Pour afficher tous les comptes de la blockchain, vous pouvez utiliser :

eth.accounts

Il s’agit d’un tableau que vous pouvez interroger par son index, par exemple en demandant le premier compte :

eth.accounts[0]

On peut aussi demander le solde d’un compte :

eth.getBalance(eth.accounts[0])

Ce qui est aussi possible par web3:

web3.fromWei(eth.getBalance(eth.accounts[0]),"ether")

Le minage

Pour commencer à miner, il faut définir le compte par défaut qui recevra les ether avec le plugin ‘miner’ :

miner.setEtherbase(web3.eth.accounts[0])

Le solde du compte par défaut est encore à 0 :

eth.getBalance(eth.coinbase)

Démarrons donc le minage :

miner.start()

Au tout premier lancement de nombreuses informations s’afficheront dans la console, laissez faire quelques minutes.

Vous pouvez ensuite couper le mineur :

miner.stop()

Puis redemander le solde du compte par défaut qui doit maintenant être bien supérieur à 0 :

eth.getBalance(eth.coinbase)

L’autre moyen de vérifier que votre mineur tourne bien est de lancer la commande eth.hashrate qui affichera le hashrate de votre blockchain privée.

Transférer des ether et vérifier les transactions de votre blockchain privée

Avant de transférer des ether depuis un compte de la blockchain vers un autre, il faut le dévérouiller :

personal.unlockAccount("eth.accounts[0]")

Vous pourrez ensuite procéder au transfert grâce à .sendtransaction :

eth.sendTransaction({from: eth.accounts[0], to: eth.accounts[1], value: web3.toWei(1, "ether")})

Nous avons stopper le mineur, ce qui veut dire que la transaction est en attente de validation, ce qui peut être vérifié grâce à txpool :

txpool.status

le plugin eth permet aussi de voir cette information :

eth.getBlock("pending", true).transactions

Vous devriez voir dans les deux cas une transaction en attente, celle du transfert demandé juste au dessus. Il vous suffit de relancer le mineur comme déjà fait auparavant pour faire fonctionner votre blockchain et miner un nouveau bloc.

Ajouter un nouveau nœud dans notre blockchain privée

Nous allons ajouter un nouveau nœud à notre blockchain pour sécuriser un peu plus celle-ci.
Celui ci sera stocker dans le répertoire data2 avec les mêmes paramètres que le précédent :

geth --datadir "./data2" init genesis.json

Ensuite, notre nouveau nœud sera lancé sur le port 8546 (au lieu de 8545 le port par défaut du premier noeud)

geth --datadir "./data2" --networkid 7789 --rpc --rpcport "8546"  --rpccorsdomain "*"  --port 30304 --nodiscover --rpcapi="admin,db,eth,debug,miner,net,shh,txpool,personal,web3" --ipcdisable console

Vous pouvez ensuite vous connecter à la console Javascript de ce nœud comme tout à l’heure en changeant le port :

geth attach http://127.0.0.1:8546

Pour connecter ce nouveau noeud à notre blockchain vous devez récupérer l’information enode de celui-ci :

admin.nodeInfo.enode

Vous aller ensuite copier ce que la console affiche, qui est sous la forme :

enode://13fd72a5e27728..

Ensuite, vous aller pouvoir revenir dans la console de votre premier nœud grâce à la commande addPeer qui aura la valeur enode comme paramètre, cela devrait alors ressembler à :

admin.addPeer("enode://99872de5dc52ed1df19de1a89c0f043bcf64a4739fc26c4c5bb7adfaded85aa959951f7e202d314e78dd8b7ff64a9e37f0b6ff32aa914e4158d5790ab1776242@127.0.0.1:30304?discport=0")

Pour vérifier que la connexion fonctionne bien, il suffit dans les consoles javascript la commande suivante :

admin.peers

Dans la partie Network, vous verrez s’afficher les adresses IP avec les ports de vos 2 nœuds qui constituent votre blockchain.

C’est terminé !

L’autre avantage de faire tourner un nœud local est pour le test de vos smart contract dans des conditions réelles. Il vous suffit pour cela de lancer Remix puis dans l’onglet run de sélectionner dans la liste déroulante ‘environement’ web3provider, et d’entrer l’ip du noeud auquel vous souhaitez vous connecter.

6 Commentaires

  1. Attention …
    Ethereum est un Blockchain ‘Publique’, et non pas ‘Privée’. Elle ne permet pas de réaliser des transactions privée. Vous confondez avec Quorum (version Privée d’Ethereum)

    • Il existe une blockchain publique Ethereum, basé sur le logiciel du même nom, mais ce logiciel peut être utilisé pour créer une blockchain privée, comme indiqué dans le tutoriel ci dessus.
      Concernant les transactions privées, un nouveau tutoriel en ligne sur Quorum pour les expliquer, mais Blockchain privée et transaction privée sont bien deux concepts différents.

  2. A savoir qu’il s’agit ici d’une dépendance liée à une crypto existante (ETH). Donc en utilisant cette solution, le cours de de cette dernière (ETH) impactera votre devise finale, votre pool, vos noeuds…

  3. Pour ma part, il m’est impossible de faire fonctionner la commande unlockAccount. J’ai systématiquement un message suivant:
    GoError: Error: invalid address at inputAddressFormatter (web3.js:3940:11(47))
    at github.com/ethereum/go-ethereum/internal/jsre.MakeCallback.func1 (native)
    at :1:49(5)

    J’ai pourtant lancé le noeud avec le paramètre –allow-insecure-unlock

    Savez-vous pourquoi ?

LAISSER UN COMMENTAIRE

Please enter your comment!
Please enter your name here

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.