README.md 13,2 ko
Newer Older
# TPE. Blockchain - HyperLedger Fabric | 2020 - 2021

## Auteur(s)

| Nom | Prénom | Email |
|-|-|-|
| *Bourgeaux* | *Maxence* | *maxence.bourgeaux@etu.univ-lehavre.fr* |
| *Guyomar* | *Robin* | *robin.guyomar@etu.univ-lehavre.fr* |
| *Kacimi* | *Souhail* | *souhail.kacimi@etu.univ-lehavre.fr* |

Maxence Bourgeaux's avatar
Maxence Bourgeaux a validé
Ce TPE reprend le travail effectué par Amine Boussoualim l'année précédente (2019 - 2020).
Maxence Bourgeaux's avatar
Maxence Bourgeaux a validé
Son rapport est disponible
sous format pdf et son travail est disponible à l'adresse suivante : https://www-apps.univ-lehavre.fr/forge/ba160129/tpeblockchain

Maxence Bourgeaux's avatar
Maxence Bourgeaux a validé
Lien vers le rapport Overleaf : https://www.overleaf.com/read/cgghnfrkvrmq 
Robin Guyomar's avatar
Robin Guyomar a validé
# I. Installer les différents logiciels

**Prérequis**

La version actuelle du projet utilise HyperLedger fabric version 2.3.1.
Il est nécessaire d'avoir une version de Node <= 14 et de Docker compose <= 1.25 pour utiliser cette version d'HyperLedger
Maxence Bourgeaux's avatar
Maxence Bourgeaux a validé
Fabric.

Nos tests ont été effectués avec ces
versions :

![LogicielsVersions](Images/Tuto_Logiciels_Versions.PNG)

La suite du tutoriel proposera d'installer soit la version la plus récente, soit une version précise du logiciel.

**Se mettre à jour**

    sudo apt update
    sudo apt upgrade
Robin Guyomar's avatar
Robin Guyomar a validé

**Installer git**

    sudo apt-get install git
Robin Guyomar's avatar
Robin Guyomar a validé
**Installer cURL**    

    sudo apt install curl
**Installer la dernière version de Node.js et npm**    
Robin Guyomar's avatar
Robin Guyomar a validé

    sudo apt install nodejs
    sudo apt install npm

**Installer une version précise de Node.js (en utilisant NVM)**
    curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install.sh | bash

Maxence Bourgeaux's avatar
Maxence Bourgeaux a validé
Il faut ensuite copier la commande présente dans le terminal, puis le fermer et le réouvrir. Vérifiez que
l'installation s'est bien effectuée :

    nvm --version

Puis regardez les différentes versions existantes et installez celle désirée (ici 14.15.4) :

    nvm ls-remote
    nvm install 14.15.4

Robin Guyomar's avatar
Robin Guyomar a validé
**Docker et Docker Compose**

Installer la version la plus récente de Docker :
Robin Guyomar's avatar
Robin Guyomar a validé

    sudo apt install docker-ce

Installer une version précise de Docker (pour une autre version, il suffit de changer 1.25.0 par la version désirée) :

    sudo curl -L "https://github.com/docker/compose/releases/download/1.25.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

Maxence Bourgeaux's avatar
Maxence Bourgeaux a validé
Changez les permissions :

    sudo chmod +x /usr/local/bin/docker-compose
Robin Guyomar's avatar
Robin Guyomar a validé
Assurez-vous que le démon docker est en cours d'exécution :    
Robin Guyomar's avatar
Robin Guyomar a validé

    sudo systemctl start docker

Robin Guyomar's avatar
Robin Guyomar a validé
Facultatif : si vous souhaitez que le démon docker démarre au démarrage du système, exécutez la commande suivante :
Robin Guyomar's avatar
Robin Guyomar a validé

    sudo systemctl enable docker
Robin Guyomar's avatar
Robin Guyomar a validé
Ajoutez votre utilisateur au groupe Docker :   
Robin Guyomar's avatar
Robin Guyomar a validé

    sudo usermod -a -G docker <username>
Robin Guyomar's avatar
Robin Guyomar a validé
**Hyperledger Fabric**

Robin Guyomar's avatar
Robin Guyomar a validé
Placez-vous dans le répertoire de votre choix et installer Hyperledger Fabric :
Robin Guyomar's avatar
Robin Guyomar a validé

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

Robin Guyomar's avatar
Robin Guyomar a validé
Ajoutez au fichier .bashrc la ligne suivante pour ajouter les variables d'environnement :
Robin Guyomar's avatar
Robin Guyomar a validé

    export PATH=${PWD}/../bin:$PATH
Robin Guyomar's avatar
Robin Guyomar a validé
Vous devez également définir le FABRIC_CFG_PATH :
Robin Guyomar's avatar
Robin Guyomar a validé
    export FABRIC_CFG_PATH=$PWD/../config/
Robin Guyomar's avatar
Robin Guyomar a validé
# II. Test du réseau Fabric
Robin Guyomar's avatar
Robin Guyomar a validé

Robin Guyomar's avatar
Robin Guyomar a validé
Accédez au répertoire réseau de test :
Robin Guyomar's avatar
Robin Guyomar a validé

    cd fabric-samples/test-network
Robin Guyomar's avatar
Robin Guyomar a validé
Supprimez tous les conteneurs ou artefacts de toutes les exécutions précédentes :
Robin Guyomar's avatar
Robin Guyomar a validé

    ./network.sh down    
Robin Guyomar's avatar
Robin Guyomar a validé
Activez le réseau :
Robin Guyomar's avatar
Robin Guyomar a validé

    ./network.sh up

Cela va créer un réseau de deux nœuds pairs (peer nodes) et d'un nœud commandeur (ordering node). Les nœuds pairs sont
les composants essentiels d'un réseau Fabric. Ce sont ces nœuds qui stockent le registre de la blockchain et valident
Maxence Bourgeaux's avatar
Maxence Bourgeaux a validé
les transactions avant que le registre ne soit modifié.

Vous allez pouvoir voir ces nœuds avec la prochaine commande.

Robin Guyomar's avatar
Robin Guyomar a validé
**Les composants du réseau de test**

Robin Guyomar's avatar
Robin Guyomar a validé
Affichez tous les conteneurs Docker qui s'exécutent sur votre ordinateur :
Robin Guyomar's avatar
Robin Guyomar a validé

    docker ps -a

Vous devriez avoir un résultat similaire à :

![Tuto_DockerPsA](Images/Tuto_TestNetwork_DockerPS.PNG)

Chaque nœud pair qui intéragit avec le réseau doit appartenir à une organisation différente (org1, org2 ...). Le nœud
commandeur est celui qui va maintenir et diriger l'ordre des transactions du réseau.
Ce réseau de test créé ne dispose cependant d'aucune chaîne entre les différents nœuds.
Robin Guyomar's avatar
Robin Guyomar a validé
# III. Fonctionnement du TPE 2020 - Vente d'un véhicule
Robin Guyomar's avatar
Robin Guyomar a validé

**Créer le réseau**

Robin Guyomar's avatar
Robin Guyomar a validé
Déplacez le répertoire VenteVoiture vers fabric-samples, puis ouvrez-le :
Robin Guyomar's avatar
Robin Guyomar a validé

    cd fabric-samples/VenteVoiture

Exécutez le script pour démarrer le réseau de tests :
Robin Guyomar's avatar
Robin Guyomar a validé

    ./network-starter.sh

Network-starter va d'abord exécuter la commande ./network.sh down afin de supprimer tout ce qui serait resté des exécutions
précédentes, puis va lancer la commande ./network.sh up createChannel -ca -s couchdb afin de créer un réseau de deux nœuds
pairs réliés entre eux et gérés par couchdb (Apache CouchDB est un système de gestion de base de données). L'option "-ca"
signifie "Certificate Authorities" et permet à chaque nœud d'avoir sa propre certification et ils partagent la même racine
de confiance. Le CA nous permet aussi de créer un certificat et une clé privée pour nos applications.
Robin Guyomar's avatar
Robin Guyomar a validé
Lorsque le script est terminé, vous pouvez voir les nœuds Fabric s'exécutant sur votre machine :
Robin Guyomar's avatar
Robin Guyomar a validé

    docker ps

![Tuto_DockerPs](Images/Tuto_NetworkStarter_DockerPS.PNG)
Robin Guyomar's avatar
Robin Guyomar a validé
**Installer et approuver le contrat intelligent**

Robin Guyomar's avatar
Robin Guyomar a validé
**(Alice)** Ouvrez un premier terminal et accédez au répertoire de la 1ère personne Alice :
Robin Guyomar's avatar
Robin Guyomar a validé

    cd fabric-samples/VenteVoiture/organization/Alice
Maxence Bourgeaux's avatar
Maxence Bourgeaux a validé
**(Alice)** Optionnel: Exécutez la commande suivante pour démarrer Logspout ("Logspout est un routeur de journaux open
source conçu spécifiquement pour les journaux de conteneurs Docker. Il collecte les journaux de tous les autres conteneurs
fonctionnant sur le même hôte, puis les transmet à une destination de votre choix") :
Maxence Bourgeaux's avatar
Maxence Bourgeaux a validé

**(Alice)** Ouvrez un nouveau terminal si vous avez fait l'étape optionnelle, sinon exécutez le script pour définir les
Robin Guyomar's avatar
Robin Guyomar a validé

    source alice.sh

**(Alice)** Optionnel: Pour vérifier que vous pouvez bien utiliser Fabric Command Line Interface (CLI), exécutez la commande :
    peer version

![Tuto_PeerVersion](Images/Tuto_PeerVersion.PNG)
**(Alice)** Créez le package du chaincode (Archive le contrat intelligent en chaincode et l'écrit dans un fichier) :    
Robin Guyomar's avatar
Robin Guyomar a validé

    peer lifecycle chaincode package car.tar.gz --lang node --path ./contract --label car_0

Cette commande va créer une archive nommée car.tar.gz. L'option --lang spécifie le langage de la chaincode, --path permet
Robin Guyomar's avatar
Robin Guyomar a validé
de donner le chemin vers le contrat intelligent et --label permet de créer un label servant à identifier le chaincode après
**(Alice)** Installez le chaincode au nœud:
Robin Guyomar's avatar
Robin Guyomar a validé

    peer lifecycle chaincode install car.tar.gz

![Tuto_PackageAlice](Images/Tuto_CreationInstallation_Package_Alice.PNG)

Le contrat intelligent est désormais installé !
Robin Guyomar's avatar
Robin Guyomar a validé
**(Alice)** Obtenez le packageID du chaincode pour ensuite approuver la définition du chaincode :
Robin Guyomar's avatar
Robin Guyomar a validé

    peer lifecycle chaincode queryinstalled

Robin Guyomar's avatar
Robin Guyomar a validé
**(Alice)** Enregistrez l'ID du package en tant que variable d'environnement :
Robin Guyomar's avatar
Robin Guyomar a validé

    export PACKAGE_ID=car_0:7778fe966e1cfe11982c5f9d2d1a8eb1a225e4f547df8bac40ca50569fbd076d
**(Alice)** Approuvez la définition du chaincode pour l'organisation (for my organization):
Robin Guyomar's avatar
Robin Guyomar a validé

    peer lifecycle chaincode approveformyorg --orderer localhost:7050 --ordererTLSHostnameOverride orderer.example.com --channelID mychannel --name carcontract -v 0 --package-id $PACKAGE_ID --sequence 1 --tls --cafile $ORDERER_CA

![Tuto_PackageID_Alice](Images/Tuto_PackageID_Alice.PNG)

On va maintenant faire la même chose pour Bob, c'est à dire installer et approuver le contrat de son côté.

Robin Guyomar's avatar
Robin Guyomar a validé
**(Bob)** Ouvrez un second terminal et accédez au répertoire de la 2ème personne Bob :
Robin Guyomar's avatar
Robin Guyomar a validé

    cd TPEBlockchain/VenteVoiture/organization/Bob
Robin Guyomar's avatar
Robin Guyomar a validé
**(Bob)** Exécutez le script pour définir les variables d'environnement :    
Robin Guyomar's avatar
Robin Guyomar a validé

    source bob.sh
**(Bob)** Créez le package du chaincode (Archive le contrat intelligent en chaincode et l'écrit dans un fichier) :    
Robin Guyomar's avatar
Robin Guyomar a validé

    peer lifecycle chaincode package car.tar.gz --lang node --path ./contract --label car_0
**(Bob)** Installez le chaincode au nœud :
Robin Guyomar's avatar
Robin Guyomar a validé

    peer lifecycle chaincode install car.tar.gz

![Tuto_PackageBob](Images/Tuto_CreationInstallation_Package_Bob.PNG)
Robin Guyomar's avatar
Robin Guyomar a validé
**(Bob)** Obtenez le packageID du chaincode :
Robin Guyomar's avatar
Robin Guyomar a validé

    peer lifecycle chaincode queryinstalled

Robin Guyomar's avatar
Robin Guyomar a validé
**(Bob)** Enregistrez l'ID du package en tant que variable d'environnement :
Robin Guyomar's avatar
Robin Guyomar a validé

    export PACKAGE_ID=car_0:7778fe966e1cfe11982c5f9d2d1a8eb1a225e4f547df8bac40ca50569fbd076d
**(Bob)** Approuvez la définition de la chaincode du contrat :

    peer lifecycle chaincode approveformyorg --orderer localhost:7050 --ordererTLSHostnameOverride orderer.example.com --channelID mychannel --name carcontract -v 0 --package-id $PACKAGE_ID --sequence 1 --tls --cafile $ORDERER_CA

![Tuto_PackageID_Bob](Images/Tuto_PackageID_Bob.PNG)
Robin Guyomar's avatar
Robin Guyomar a validé

Robin Guyomar's avatar
Robin Guyomar a validé
**(Alice)** Retournez sur le terminal correpondant à Alice et validez la définition du chaincode :
Robin Guyomar's avatar
Robin Guyomar a validé

    peer lifecycle chaincode commit -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --peerAddresses localhost:7051 --tlsRootCertFiles ${PEER0_ORG1_CA} --peerAddresses localhost:9051 --tlsRootCertFiles ${PEER0_ORG2_CA} --channelID mychannel --name carcontract -v 0 --sequence 1 --tls --cafile $ORDERER_CA --waitForEvent

![Tuto_ValidationChaincode](Images/Tuto_ValidationChaincode.PNG)

Vous pouvez à tout moment vérifier que tout se passe correctement grâce au terminal où la commande ./monitoring net_test
à été effectuée.

Maxence Bourgeaux's avatar
Maxence Bourgeaux a validé
**Vente de la voiture**
Robin Guyomar's avatar
Robin Guyomar a validé

Robin Guyomar's avatar
Robin Guyomar a validé
**(Alice)** Accédez au répertoire application :
Robin Guyomar's avatar
Robin Guyomar a validé

    cd application
**(Alice)** Installez les dépendances du contrat intelligent (cela va prendre un peu de temps ~ 1 min) :

    npm install

Robin Guyomar's avatar
Robin Guyomar a validé
**(Alice)** Si des vulnérabilités sont présentes :
Robin Guyomar's avatar
Robin Guyomar a validé

**(Alice)** Ajoutez des informations au portefeuilles (Wallet) :
Robin Guyomar's avatar
Robin Guyomar a validé

    node addToWallet.js
Robin Guyomar's avatar
Robin Guyomar a validé
**(Alice)** Mettez en vente la voiture :
Robin Guyomar's avatar
Robin Guyomar a validé

    node sell.js
Robin Guyomar's avatar
Robin Guyomar a validé
**(Bob)** Retournez sur le terminal correpondant à Bob et accédez au répertoire application :
Robin Guyomar's avatar
Robin Guyomar a validé

**(Bob)** Installez les dépendances du contrat intelligent (cela va prendre un peu de temps ~ 1 min) :
Robin Guyomar's avatar
Robin Guyomar a validé

Robin Guyomar's avatar
Robin Guyomar a validé
**(Bob)** Si des vulnérabilités sont présentes :
Robin Guyomar's avatar
Robin Guyomar a validé
**(Bob)** Modifiez l'état de la voiture :
Robin Guyomar's avatar
Robin Guyomar a validé

    node addToWallet.js
Robin Guyomar's avatar
Robin Guyomar a validé
**(Bob)** Achetez la voiture :
Robin Guyomar's avatar
Robin Guyomar a validé

    node buy.js

![Tuto_Buy_Bob](Images/Tuto_Buy_Bob.PNG)

Robin Guyomar's avatar
Robin Guyomar a validé
**(Bob)** Constatez que le véhicule a bien changé de propriétaire :
Robin Guyomar's avatar
Robin Guyomar a validé

    node info.js
Robin Guyomar's avatar
Robin Guyomar a validé

![Tuto_InfoTransaction](Images/Tuto_InfoTransaction.PNG)

**Sources**
Robin Guyomar's avatar
Robin Guyomar a validé

Pour plus de renseignements ou si des difficultés sont rencontrées, voici le lien vers la documentation
d'HyperLedger Fabric :
Robin Guyomar's avatar
Robin Guyomar a validé

Souhail KACIMI's avatar
Souhail KACIMI a validé
https://hyperledger-fabric.readthedocs.io/en/latest/tutorial/commercial_paper.html

Robin Guyomar's avatar
Robin Guyomar a validé
# IV. Hyperledger Explorer
Souhail KACIMI's avatar
Souhail KACIMI a validé

Hyperledger Explorer est un outil open source simple, puissant, facile à utiliser et bien entretenu pour parcourir l'activité sur le réseau blockchain.
Hyperledger Explorer fonctionne seulement sur MacOS et Ubuntu.

Robin Guyomar's avatar
Robin Guyomar a validé
**Configurer Hyperledger Explorer**
Souhail KACIMI's avatar
Souhail KACIMI a validé

Robin Guyomar's avatar
Robin Guyomar a validé
La dernière version d'Hyperledger Explorer fonctionne avec la version 2.2 d'Hyperledger Fabric, si vous utilisez une autre version d'Hyperledger Fabric vous pourrez rencontrez des problèmes.
Robin Guyomar's avatar
Robin Guyomar a validé
Vous pouvez consulter les dernières mises à jour d'Hyperledger Explorer sur le lien suivant : [Hyperledger Explorer](https://github.com/hyperledger/blockchain-explorer).
Maxence Bourgeaux's avatar
Maxence Bourgeaux a validé
Si vous voulez installer la version 2.2, utilisez la commande suivante :
Souhail KACIMI's avatar
Souhail KACIMI a validé

Maxence Bourgeaux's avatar
Maxence Bourgeaux a validé
    curl -sSL https://bit.ly/2ysbOFE | bash -s -- 2.2.2
Souhail KACIMI's avatar
Souhail KACIMI a validé

Maxence Bourgeaux's avatar
Maxence Bourgeaux a validé
Avant de continuer, il se peut qu'il y ait des problèmes de droits qui vous empêcheront d'utiliser le projet. Pour y remédier, il suffit de taper cette commande :
Souhail KACIMI's avatar
Souhail KACIMI a validé

Maxence Bourgeaux's avatar
Maxence Bourgeaux a validé
    sudo chmod -R 700 /home/<your-username>/<path-to-tpe-blockchain-hyperledger>
Souhail KACIMI's avatar
Souhail KACIMI a validé

Maxence Bourgeaux's avatar
Maxence Bourgeaux a validé
Cette commande donne tous les droits (lecture, écriture et exécution) uniquement pour le propriétaire.
Souhail KACIMI's avatar
Souhail KACIMI a validé

Robin Guyomar's avatar
Robin Guyomar a validé
Il faut ensuite déployer le réseau avant de lancer Hyperledger Explorer. Pour cela, il suffit d'exécuter les commandes ci-dessous :
Maxence Bourgeaux's avatar
Maxence Bourgeaux a validé

    cd tpe-blockchain-hyperledger/VenteVoiture/

    ./network-starter.sh

    cd ../test-network/

    ./network.sh deployCC -ccn carcontract -ccp ../VenteVoiture/organization/Alice/contract -ccl javascript

Robin Guyomar's avatar
Robin Guyomar a validé
Cette commande est un raccourci de toutes les commandes `peer` utilisées lors du tuto sur le fonctionnement du TPE (étape III). `../VenteVoiture/organization/Alice/contract` est le path du smart contract, on pourrait aussi utiliser celui de Bob par exemple.
Maxence Bourgeaux's avatar
Maxence Bourgeaux a validé

    cd ../explorer/

    docker-compose up -d

Il est essentiel de se situer dans le dossier explorer pour lancer la commande `docker-compose up -d`.

Maintenant que tout est prêt, ouvrez votre navigateur à l'adresse http://localhost:8080/

Si une page login s'ouvre :
  * User : admin
  * Password : adminpw

Robin Guyomar's avatar
Robin Guyomar a validé
Ces identifiants sont modifiables via le fichier `test-network.json` situé dans `/tpe-blockchain-hyperledger/explorer/connection-profile` aux lignes 6 et 7.
Maxence Bourgeaux's avatar
Maxence Bourgeaux a validé

![Hyperledger Explorer](Images/explorer.png)
Souhail KACIMI's avatar
Souhail KACIMI a validé

Maxence Bourgeaux's avatar
Maxence Bourgeaux a validé
Et voilà, vous avez réussi à faire fonctionner Hyperledger Explorer !
Souhail KACIMI's avatar
Souhail KACIMI a validé

Maxence Bourgeaux's avatar
Maxence Bourgeaux a validé
Enfin pour l'arrêter et fermer tout proprement, tapez :
Souhail KACIMI's avatar
Souhail KACIMI a validé

Maxence Bourgeaux's avatar
Maxence Bourgeaux a validé
    docker-compose down -v
Souhail KACIMI's avatar
Souhail KACIMI a validé

Maxence Bourgeaux's avatar
Maxence Bourgeaux a validé
    cd ../VenteVoiture/
Souhail KACIMI's avatar
Souhail KACIMI a validé

Maxence Bourgeaux's avatar
Maxence Bourgeaux a validé
    ./network-clean.sh