Installer une blockchain de développement sur Hyperledger Fabric

3

[Note  : ce tutoriel fait suite aux parties 12, 3, 4 et 5 que vous devriez avoir complétées pour bien assimiler celui-ci]

Après avoir appris à créer un Smart Contract (chaincode) dans la partie 5, on se rend vite compte qu’on consomme beaucoup de temps à compiler le contrat, l’exécuter, le valider sur les peer nodes, le déployer sur les channels etc.. et cela à chaque modification du code. Ce n’est pas viable pour débugger des smart contrats un peu complexes.

Il existe heureusement un package node qui nous permet de faciliter ces étapes en exécutant directement un chaincode (j’utilise aléatoirement les termes chaincode ou smart contract puisque c’est la même chose sur Hyperledger Fabric) sur un channel après l’avoir approuvé… une seule fois !

Pour commencer on va partir d’une installation indépendante.

Etape 1 : Préparation de l’environnement

Depuis notre VM Ubuntu, on commence par créer un répertoire espacedev

mkdir espacedev
cd espacedev

On va ensuite cloner le dépot Github HLF :

git clone https://github.com/hyperledger/fabric

Etape 2 :Configuration du nœud de commande

On va ensuite créer les fichiers binaires pour qui nous permettrons de lancer juste un peer node, un orderer node, et configtxgen pour gérer le channel et le block genesis de la blockchain (le tout premier block pour la démarrer):

make orderer peer configtxgen

Si tout se passe bien :

On définit ensuite les variables pour lancer les binaires et accéder aux fichiers de configuration des nodes :

export PATH=$(pwd)/build/bin:$PATH
export FABRIC_CFG_PATH=$(pwd)/sampleconfig

On peut alors générer le block genesis de notre blockchain pour que l’ordering node puisse faire son travail à l’étape suivante :

configtxgen -profile SampleDevModeSolo -channelID syschannel -outputBlock genesisblock -configPath $FABRIC_CFG_PATH -outputBlock "$(pwd)/sampleconfig/genesisblock"

Ce qui donnera :

On peut lancer le nœud de commande :

ORDERER_GENERAL_GENESISPROFILE=SampleDevModeSolo orderer

Qui est alors prêt à recevoir les requêtes des peer node :

Vous pouvez alors laisser tourner cette fenêtre dans son coin.

Etape 3 : Configuration du peer node

Dans une nouvelle fenêtre , on commence par définir les variables :

export PATH=$(pwd)/build/bin:$PATH
export FABRIC_CFG_PATH=$(pwd)/sampleconfig

Avant de lancer notre peer node, il faut modifier le fichier fabric/sampleconfig/core.yaml pour changer le port du listenAddress dans la partie operations car il est déjà pris par le nœud de commande. On modifie le port 9443 par 9444 :

operations:
listenAddress: 127.0.0.1:9444

On peut alors démarrer le peer node avec la directive --peer-chaincodedev=true pour le configurer en mode développement:

FABRIC_LOGGING_SPEC=chaincode=debug CORE_PEER_CHAINCODELISTENADDRESS=0.0.0.0:7052 peer node start --peer-chaincodedev=true

Comme à l’étape précédente, on peut laisser cette fenêtre dans son coin.

Etape 4 : Créer et rejoindre un channel

Il nous manque plus qu’un channel pour se connecter et déployer notre chaincode.

On ouvre une nouvelle fenêtre et on définit encore les variables :

export PATH=$(pwd)/build/bin:$PATH
export FABRIC_CFG_PATH=$(pwd)/sampleconfig

Puis on créer un channel grâce à configtxgen qu’on va appeler simplement monchannel :

configtxgen -channelID monchannel -outputCreateChannelTx monchannel.tx -profile SampleSingleMSPChannel -configPath $FABRIC_CFG_PATH
peer channel create -o 127.0.0.1:7050 -c monchannel -f monchannel.tx

Et on se connecte dessus :

peer channel join -b monchannel.block

Vous devriez alors voir :

[channelCmd] executeJoin -> Successfully submitted proposal to join channel

Etape 5 : Déploiement du smart contract sur la blockchain Fabric de développement

Pour nos tests, nous allons réutiliser le chaincode de messagerie créé à l’étape précédente. On commence par cloner le dépot github :

git clone https://github.com/Renaud404/Hyperleger-Fabric-Tutorial

On se rend ensuite dans le nouveau répertoire :

cd Hyperleger-Fabric-Tutorial/

Puis on installe les dépendances nodeJs :

npm install

On peut aussi vérifier avec la commande ls la création du répertoire node_modules avec ls

On peut ensuite lancer le déploiement :

CORE_CHAINCODE_LOGLEVEL=debug CORE_PEER_ADDRESS=127.0.0.1:7052 CORE_PEER_TLS_ENABLED=false CORE_CHAINCODE_ID_NAME=messagerie:1.0 ./node_modules/.bin/fabric-chaincode-node start --peer.address 127.0.0.1:7052

On voit alors que le contrat est prêt :

Il faut laisser cette fenêtre ouverte (c’est la troisième).

Etape 6 : Approuver le chaincode

Il faut ensuite approuver le contrat et le commit dans le channel avec les 3 commandes suivantes :

peer lifecycle chaincode approveformyorg  -o 127.0.0.1:7050 --channelID monchannel --name messagerie --version 1.0 --sequence 1 --init-required --signature-policy "OR ('SampleOrg.member')" --package-id messagerie:1.0
peer lifecycle chaincode checkcommitreadiness -o 127.0.0.1:7050 --channelID monchannel --name messagerie --version 1.0 --sequence 1 --init-required --signature-policy "OR ('SampleOrg.member')"
peer lifecycle chaincode commit -o 127.0.0.1:7050 --channelID monchannel --name messagerie --version 1.0 --sequence 1 --init-required --signature-policy "OR ('SampleOrg.member')" --peerAddresses 127.0.0.1:7051


Etape 7 : Utiliser le chaincode

On peut commencer à utiliser notre contrat comme le fait habituellement.

On peut l’initialiser :

CORE_PEER_ADDRESS=127.0.0.1:7051 peer chaincode invoke -o 127.0.0.1:7050 -C monchannel -n messagerie -c '{"Args":["InitialiserMessagerie"]}' --isInit

Ce qui devrait afficher :

CET 0001 INFO [chaincodeCmd] chaincodeInvokeOrQuery -> Chaincode invoke successful. result: status:200

On peut modifier la blockchain :

CORE_PEER_ADDRESS=127.0.0.1:7051 peer chaincode invoke -o 127.0.0.1:7050 -C monchannel -n messagerie -c '{"Args":["EnregistrerMessage", "Hello"]}'

Mais aussi lire la blockchain :

CORE_PEER_ADDRESS=127.0.0.1:7051 peer chaincode invoke -o 127.0.0.1:7050 -C monchannel -n messagerie -c '{"Args":["LireMessagerie"]}'

Ce qui devrait afficher :

CET 0001 INFO [chaincodeCmd] chaincodeInvokeOrQuery -> Chaincode invoke successful. result: status:200 payload:"[{\"Key\":\"1\",\"Record\":\"Dernier message : Hello\"}]"

En cas de modification du code, il suffit d’ouvrir la fenêtre de la commande ./node_modules/.bin/fabric-chaincode-node start (la troisième fenêtre) et de couper le contrat en appuyant sur CTRL+C. Puis de le relancer dans cette même fenêtre après modification du code ! C’est très pratique car il suffit de quelques secondes pour modifier et tester un contrat, et surtout c’est la seule étape à refaire. Après avoir relancé un contrat modifié, vous pouvez retourner dans la fenêtre.

Etape 8 : Débuguer un smart contract sur Hyperledger Fabric

L’autre avantage est qu’il devient très simple de débuguer du code car l’erreur s’affiche immédiatement dans la console.
Nous allons tester cela en créant volontairement un bug dans le chaincode.
Ouvrez le fichier lib/messagerie.js

A la ligne 23, on voit cette ligne chargée d’enregistrer un message dans la blockchain :

await ctx.stub.putState('1', 'Dernier message : ' + message);

On voit la modifier pour créer une erreur sur l’ID qui doit normalement être un string (une chaine de caractère). Nous allons simplement retirer les guillemets autour du 1, la ligne 23 devient alors :

await ctx.stub.putState(1, 'Dernier message : ' + message);

Si vous retournez dans la fenêtre 3 pour couper le smart contrat (avec CTRL+C) puis le relancer (il suffit d’appuyer sur la flèche vers le haut pour retrouvée la commande de lancement utilisée avant).

En retournant dans la fenêtre 4 pour exécuter la fonction EnregistrerMessagerie, on peut voir le message d’erreur détaillé qui donne une erreur 500 et la description du problème d’argument ERR_INVALID_ARG_TYPE avec une précision pour dire qu’il faut mettre un STRING en paramètre :

C’est terminé ! Ce que vous venez de faire à l’étape 8 est la seule opération à répéter lorsque vous modifiez le code d’un contrat intelligent. Les étapes précédentes de configuration ne sont à faire qu’une fois.

Il faudra par contre lors du lancement d’une session de développement lancer le nœud de commande et le peer node avec les commandes dédiées vu précédemment.

Article précédentCréer un smart contract sur Hyperledger Fabric
PARTAGER

3 Commentaires

  1. Bonjour !
    J’ai un problème lors de la commande « make orderer peer configtxgen » j’ai le message d’erreur suivant :

    :~/espacedev/fabric# make orderer peer configtxgen
    Building build/bin/orderer
    GOBIN=/root/espacedev/fabric/build/bin go install -tags «  » -ldflags « -X github.com/hyperledger/fabric/common/metadata.Version=2.4.0 -X github.com/hyperledger/fabric/common/metadata.CommitSHA=ef59964c1 -X github.com/hyperledger/fabric/common/metadata.BaseDockerLabel=org.hyperledger.fabric -X github.com/hyperledger/fabric/common/metadata.DockerNamespace=hyperledger » github.com/hyperledger/fabric/cmd/orderer
    can’t load package: package github.com/hyperledger/fabric/cmd/orderer: cannot find package « github.com/hyperledger/fabric/cmd/orderer » in any of:
    /usr/lib/go-1.10/src/github.com/hyperledger/fabric/cmd/orderer (from $GOROOT)
    /root/go/src/github.com/hyperledger/fabric/cmd/orderer (from $GOPATH)
    Makefile:226: recipe for target ‘build/bin/orderer’ failed
    make: *** [build/bin/orderer] Error 1

    Merci d’avance si tu as une solution !

  2. Bonjour !
    J’ai réussi à avancer sur mon problème précédent mais la j’ai un nouveau problème au niveau de l’étape 6 pour approuver le chaincode.
    Les commandes peer ne sont pas reconnu dans le nouveau terminal créer et je ne vois pas pourquoi
    Merci d’avance !

    • Bonjour,
      Habituellement la commande PEER non reconnues provient simplement des variables d’environnement qui ne sont pas à jour, il faut les réinitialiser depuis le bon répertoire :
      export PATH=$(pwd)/build/bin:$PATH
      export FABRIC_CFG_PATH=$(pwd)/sampleconfig

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.