Tutorial Hyperledger Fabric : créer sa blockchain privée sur la solution dédiée aux entreprises

0

Hyperledger Fabric, qu’est ce que c’est ?

Lorsqu’on s’intéresse à la blockchain, on se rend rapidement compte qu’Hyperledger Fabric est un des indispensables à connaitre. Fabric fait partie du projet Hyperledger, une constellation d’applications Open Source lancé par la fondation Linux en 2015, et s’est rapidement imposé comme une des solutions les plus utilisées par les entreprises de toute taille pour leurs projets blockchain, dans divers secteurs d’activités, aussi bien la finance que la supply chain.

L’approche est ici une blockchain totalement privée, en anglais « permissioned blockchains », qu’on pourrait traduire maladroitement par « Blockchain à autorisation », l’idée étant qu’il est nécessaire d’être autorisé pour participer au réseau et interagir sur le registre distribué (DLT).

Contrairement aux blockchain publiques, les cryptomonnaies y jouent un rôle très secondaire, voir souvent inexistant, même si les dernières versions tendent à simplifier l’utilisation des tokens.

Les smart contracts jouent par contre ici un rôle central, on les appelle des ‘chaincode’, qui peuvent, et c’est un des points forts de d’Hyperledger Fabric, être développés dans plusieurs langages, aussi bien Go, que Javascript, TypeScript et même Java.

Dans ce tutoriel, nous allons installer le réseau de test, créer un channel pour faire communiquer 2 organisations, et executer un chaincode pour transférer des données d’un membre vers un autre.

Etape 1 : Installer les pré requis

Pour ce tutorial, nous utiliserons une machine virtuelle VirtualBox sur Ubuntu.

Pour commencer, il faut installer GIT et Curl avec les commandes suivantes :

sudo apt-get install git
sudo apt-get install curl

Il faut ensuite installer Docker, la procédure détaillée est expliquée ici.

Assurez vous ensuite que le Daemon est lancé :

sudo systemctl start docker

Puis configurez votre utilisateur pour éviter les problèmes de droit (remplacez username par le nom de votre session) :

sudo usermod -a -G docker <username>

Vérifiez que votre installation de Docker fonctionne bien :

docker-compose --version

Etape 2 : Installer Hyperledger Fabric et le réseau de test Fabric

Commencez par créer un répertoire pour installer les fichiers :

mkdir fabric
cd fabric

Nous allons maintenant exécuter une commande Curl qui se chargera de télécharger et installer tous les fichiers nécessaires :

curl -sSL https://bit.ly/2ysbOFE | bash -s

Si tout se passe bien, les images Docker vont se télécharger et s’installer :

On configure ensuite les variables d’environnement pour faciliter l’execution des scripts :

export PATH=<path to download location>/bin:$PATH

Etape 3 : démarrage du réseau de test

Maintenant que tout est installé, on se rend dans le répertoire du test network :

cd fabric-samples/test-network

Le script d’aide est désormais visible avec ./network.sh -h :

On lance la création du réseau :

./network.sh up
Les lignes ‘Creating orderer.example.com … done’ sont particulièrement importantes et indiquent que tout s’est bien passé

Vous venez d’installer 2 peer nodes (org1 et org2) et un ‘ordering node’, basé sur le consensus Raft. Dans Hyperledger Fabric, point de minage ni de proof of work, ce sont des nœuds désignés en tant que tels qui valident les transactions.

Le Peer node est un concept central dans l’écosystème d’Hyperledger Fabric, ce sont eux qui hébergent les registres (concrètement la blockchain elle même) et les contrats intelligents, et ils sont en général rattachés à une organisation. Ils peuvent valider des transactions et les inscrire au registre, mais ne décident pas de l’ordre des transactions et ne les ajoutent pas dans de nouveaux blocs, ce qui est fait par les ‘Ordering node‘, qui parviennent à un consensus sur l’ordre des transactions et les ajoutent aux nouveaux blocs.

Vous pouvez vérifier que vos noeuds sont fonctionnels avec la commande docker suivante qui liste les conteneurs lancés :

docker ps -a

Vous devriez alors voir ceci :

Etape 4 : Configuration d’une couche privée (un channel) entre les organisations

Sur Fabric, la possibilité de créer des transactions privées est très flexible, il est par exemple possible de créer des channels dont on choisit les membres, et le channel dispose de sa propre blockchain privée que seuls les membres peuvent consulter.

Nous allons maintenant créer un channel nommé ‘mychannel’ entre org1 et org2 :

./network.sh createChannel

Vous verrez alors que vos organisations ont rejoint le channel :

Etape 5 : Démarrer un chaincode (smart contract)

Notre test network dispose d’un chaincode (les contrats intelligents sur Hyperledger Fabric), dont le code est visible dans le répertoire fabric-samples/asset-transfer-basic. Vous verrez qu’il est disponible dans 4 langages (Go, Java, Javascript, TypeScript)

Le script d’aide vu au début nous présentait la commande DeployCC, que nous allons utiliser pour initialiser le chaincode sur le channel. Nous allons utiliser la version javascript, mais si vous préférez utiliser un autre langage, n’hésitez pas à adapter la ligne de commande suivante en remplaçant ‘javascript’ par votre langage favori :

./network.sh deployCC -ccn basic -ccp ../asset-transfer-basic/chaincode-javascript -ccl javascript

Vous verrez ainsi le chaincode se déployer sur mychannel sur vos 2 noeuds :

Etape 6 : Exécuter des fonctions du chaincode

Avant de continuer, configurons les variables d’environnement suivante qui nous seront utiles pour la suite :

export PATH=${PWD}/../bin:$PATH
export FABRIC_CFG_PATH=$PWD/../config/

export CORE_PEER_TLS_ENABLED=true
export CORE_PEER_LOCALMSPID="Org1MSP"
export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
export CORE_PEER_ADDRESS=localhost:7051

Si vous ouvrez le répertoire fabric-samples/asset-transfer-basic/chaincode-javascript/lib , vous pouvez ouvrir le fichier assetTransfer.js pour voir les fonctions du contrat, par exemple la fonction InitLedger qui initalise des données (ici des actifs) :

Ou la fonction GetAllAssets pour afficher les données de la blockchain :

Nous allons executer la commande InitLedger de notre chaincode :

peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile "${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem" -C mychannel -n basic --peerAddresses localhost:7051 --tlsRootCertFiles "${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt" --peerAddresses localhost:9051 --tlsRootCertFiles "${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt" -c '{"function":"InitLedger","Args":[]}'

Si tout a bien fonctionné vous devriez voir : INFO 001 Chaincode invoke successful. result: status:200 :

Vous pouvez également afficher les données de la blockchain en executant GetAllAssets :

peer chaincode query -C mychannel -n basic -c '{"Args":["GetAllAssets"]}'

Ce qui donnera :

Ou demander à voir à qui appartient un asset en particulier :

peer chaincode query -C mychannel -n basic -c '{"Args":["ReadAsset","asset5"]}'

On voit alors que l’asset5 appartient à Adriana, ce que nous avions reperé dans le code du fichier js de notre chaincode.

Nous allons transférer l’asset5 à Brad avec la commande suivante (il faut regarder la fin de la ligne de commande, le début n’est que la gestion des certificats pour valider les transactions, et le test network n’installe pas toutes les fonctionnalités à ce sujet, d’où ces commandes à rallonge) :

peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile "${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem" -C mychannel -n basic --peerAddresses localhost:7051 --tlsRootCertFiles "${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt" --peerAddresses localhost:9051 --tlsRootCertFiles "${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt" -c '{"function":"TransferAsset","Args":["asset5","Brad"]}'

Si on relance la même commande pour voir à qui appartient l’asset5, vous devriez alors voir s’afficher qu’il appartient désormais à Brad :

Etape 7 : Supprimer sa blockchain privée

Lorsque vous avez terminé, il est possible de supprimer toutes les informations pour ne pas polluer notre VM avec la commande suivante :

./network.sh down

Attention, vous perdez les chaincode et toutes les informations, cette commande n’est à lancer que lorsque vous terminez d’utiliser le test network.

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.