Blockchain privée : configurer la preuve d’autorité (Proof of Authority) avec Clique

0

Dans ce tutorial nous allons voir comment créer et configurer une blockchain Ethereum privée ou l’on désigne manuellement les nœuds qui peuvent valider les transactions sur notre blockchain.

De plus, nous allons la paramétrer pour ne créer de nouveaux blocs que lorsqu’une transaction se présente, ce qui la rend beaucoup plus performante et beaucoup moins consommatrice d’espace disque et de ressources matériels.

L’autre avantage est la sécurité des transactions : grâce au mécanisme de consensus Clique, nous désignons au lancement de la chaine de blocs qui peut valider les transactions (par exemple l’ajout de données dans un smart contract) et créer de nouveaux blocs (ces comptes sont appelés ‘Sealer’, ou vérificateurs).

Il est ensuite possible d’ajouter d’autres comptes qui ont ce rôle de vérificateur par un mécanisme de vote : les vérificateurs existants peuvent voter pour une adresse Ethereum en tant que vérificateur, et si cette adresse obtient plus de 50% des votes par les vérificateurs existants, elle obtient à son tour le droit de valider les transactions sur la blockchain.

Pour commencer, nous allons créer une blockchain avec 2 nœuds. Je vous recommande à nouveau d’utiliser Linux (par exemple avec une machine virtuelle sur VirtalBox) pour réaliser ce tutoriel car la plus part des environnements de production sont sous Linux et nous souhaitons un résultat proche de la réalité.

Commençons par installer Geth (Le client Ethereum en langage Go) sur notre VM Ubuntu :

sudo add-apt-repository -y ppa:ethereum/ethereum
sudo apt-get update 
sudo apt-get install ethereum

Dans votre répertoire home, créez un nouveau dossier « priveth » et placer vous dedans :

mkdir priveth
cd priveth

Ensuite, nous allons créer le premier compte qui pourra valider les transactions à l’intérieur du répertoire de notre premier nœud (node1) :

geth account new --datadir node1

Attention à bien retenir le mot de passe puis à noter l’adresse publique du compte (dans mon cas 0x823744e3dE9BBac236e3660B6F6139Ba038461ad).

Puis faisons la même chose pour le deuxième compte :

geth account new --datadir node2

Pour obtenir alors une seconde adresse : 0x5C5735f38De5997B379F6fD43782887C9218e570

Pour gagner du temps au lancement des nodes, nous allons copier le password dans un fichier texte dans le répertoire de chaque node, cela permettra de déverrouiller les comptes ce qui est indispensable pour qu’ils puissent réaliser des transactions.(par défaut les comptes sont vérrouillés).

echo 'motdepassecompte1' > node1/password.txt
echo 'motdepassecompte2' > node2/password.txt

Ensuite, nous allons utiliser Puppeth, un utilitaire très pratique livré avec le client Geth qui permet de faciliter la création du fichier genesis de notre blockchain, qui doit être lancer avec chacun des nœuds utilisés, cela évite de le créer manuellement comme c’était le cas dans les anciens tutoriaux (avec tous les risques d’erreurs possibles)

Il suffit de taper la commande ‘puppeth’ pour le lancer, celui ci demandera alors un nom pour notre réseau, j’ai choisi ‘mablockchain’ :

Le menu s’affiche ensuite, suivez alors ces étapes :

  • Choisissez ‘Configure new genesis’,
  • Choisissez ‘Create new genesis from scratch’,
  • Choisissez ‘Clique – proof-of-authority’,
  • Entrez les 2 adresses crées précédemment
  • Validez avec Enter
  • Entrez à nouveau les 2 adresses
  • Tapez Yes
  • Entrez un chiffre autre que 1, dans l’exemple 8989

Vous devriez alors arriver au menu, choisissez ‘Manage existing genesis’ puis ‘Export genesis configurations’ et enfin ENTER pour exporter notre fichier genesis :

Vous devriez alors avec un fichier mablockchain.json dans votre répertoire (vous pouvez supprimer le fichier harmony).

Nous allons maintenant pouvoir initialiser nos noeuds :

geth init mablockchain.json --datadir node1/
geth init mablockchain.json --datadir node2/

Tout est prêt, nous pouvons lancer le premier noeud avec la commande suivante :

geth --datadir node1/ --syncmode full --networkid 8989 --http --http.corsdomain "*" --miner.threads=1 --unlock "0x823744e3dE9BBac236e3660B6F6139Ba038461ad" --password node1/password.txt --mine --allow-insecure-unlock 

N’oubliez pas de remplacer l’adresse ethereum ci dessus après –unlock par votre première adresse créée plus tôt.

Au lancement du nœud, il faut récupérer l’adresse enode sur la ligne ‘Started P2P networking’, celle-ci nous servira pour connecter le second nœud au premier :

Nous pouvons maintenant lancer le second noeud (il faut ouvrir une nouvelle invite de commande dans le même répertoire ‘priveth’) avec la commande suivante, en remplaçant l’enode par le votre et unlock par la seconde adresse :

geth --datadir node2/ --syncmode 'full' --networkid 8989 --unlock "0x5C5735f38De5997B379F6fD43782887C9218e570" --password node2/password.txt --mine --allow-insecure-unlock --port 30304 --bootnodes "enode://5e987ae40ee2c99ef575e43f5f512060b848a79e45c74f4708d17d1bc2ccb07735adeeb5058b09b8cc92398cd4ee1d873a77117dc26a361d7c33f13135fdb5c7@127.0.0.1:30303" --http --http.corsdomain "*" --http.port 8546

Pour vérifier que tout s’est bien passé, ouvrez une troisième invite de commande, puis entre dans le répertoire node1 :

cd node1

Puis connectez vous à la console Geth :

geth attach ./geth.ipc

Et entrez la commande suivante :

admin.peers

Vous devriez voir les propriétés de vos 2 nodes si tout s’est bien passé :

Toujours dans cette console, vous pouvez configurer votre blockchain grâce aux commandes Clique suivantes :

clique.getSigners() Affiche la ligne des comptes autorisés à ajouter les blocs sur la blockchain

clique.propose(« 0x….. », true) Voter pour ajouter un nouveau compte qui peut valider les transactions

clique.propose(« 0x….. », false) Voter pour SUPPRIMER un compte qui peut valider les transactions

clique.proposals Voir les propositions de vote en cours

Pour qu’un votre aboutisse il faut nécessairement 50% + 1 voix.

Pour aller plus loin, vous pouvez essayez de déployer un smart contract depuis Remix, ou ajouter un 3ème noeud et lui donner la possibilité de devenir un Sealer sur cette blockchain, il suffira de répéter ce qui passé pour le second noeud, puis de lancer la commande clique.propose(« 0x….. », true) sur les 2 premiers noeuds, et de lancer quelques transactions depuis le 1er ou 2ème noeud pour valider le tout. (n’hésitez pas à demander de l’aide dans l’espace commentaire en cas de problèmes).

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.