Mettre en ligne un smart contrat sur un channel Hyperledger Fabric

0

Ce tutorial fait suite au premier tutorial Hyperledger Fabric, vous devriez avoir suivi le premier avant de démarrer celui-ci. De nombreux termes utilisés ici (ordering node, peer node, channel…) doivent être compris avant de démarrer.

Lorsqu’on utilise une blockchain Hyperledger Fabric, la mise en ligne d’un contrat intelligent (chaincode) demande plusieurs étapes :

  • Créer le package du chaincode
  • L’installation du chaincode sur les différentes organisations qui participent au réseau (les peer nodes)
  • Le chaincode doit ensuite être approuvé par les peer nodes.
  • Il doit ensuite être validé par un Ordering node
  • Il peut alors être utilisé par les participants à la blockchain (les peer nodes)

Nous allons voir ces différentes étapes en réutilisant le réseau installé lors du premier tutorial.

Placez vous dans le répertoire précédemment créé puis dans test-network

Pour repartir sur une base ‘propre’, nous allons supprimer les données précédantes avec la commande suivante :

./network.sh down

On va ensuite redémarrer la blockchain et créé au lancement le channel mychannel :

./network.sh up createChannel

Créer le package du chaincode

Pour créer le package du chaincode, on se rend dans le répertoire de celui-ci :

cd fabric-samples/asset-transfer-basic/chaincode-javascript

J’utilise ici la version NodeJS, libre à vous d’utiliser la version Go/Java/Typescript si vous êtes plus à l’aise sur ces langages.

Comme vous pouvez le vérifier dans le fichier package.json, le code du contrat utilise la librairie fabric-contract-api , nous allons donc installer cette librairie et ses dépendances (vérifiez ensuite que le répertoire node_modules s’est bien créé) :

npm install

Retournez ensuite dans le répertoire test-network puis définissez les variables d’environnement pour accéder au binaire peer de Fabric, et au fichier core.yaml situé dans config (qui contient la configuration des nodes) :

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

Pour vérifier que tout est bien configuré, vous pouvez utiliser la commande peer version qui devrait afficher ceci :

On peut alors créer notre package avec la commande lifecyle chaincode package (on lui donne le nom basic_1.0 pour l’identifier ensuite) :

peer lifecycle chaincode package basic.tar.gz --path ../asset-transfer-basic/chaincode-javascript/ --lang node --label basic_1.0

N’oubliez pas de remplacer node par le langage que vous utilisez après –lang si vous avez pris un autre que javascript, et de modifier au besoin le chemin défini après –path.

Installer le package du chaincode sur nos peers

Maintenant que le package est créé, il doit être installé sur chacun des différents nœuds qui participent à la blockchain (les peer nodes)

Commençons par la première organisation, pour cela on va redéfinir les variables d’environnement et les certificats sur celle-ci :

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

On peut ensuite lancer la commande lifecycle chaincode install pour installer le package sur ce nœud :

peer lifecycle chaincode install basic.tar.gz

Si tout s’est bien passé, on voit apparaitre un code 200 et surtout un identifier unique qu’il faut récupérer pour la suite pour que l’Ordering node puisse approuver ce chaincode :

Ici l’identifier est basic_1.0:d6ddacbfa8ba3fbfc3c12586e9495c73e350b1e7969520188d81c95f2208228f

On recommence la même opération pour la seconde organisation, d’abord les variables :

export CORE_PEER_LOCALMSPID="Org2MSP"
export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt
export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt
export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp
export CORE_PEER_ADDRESS=localhost:9051

Puis l’installation :

peer lifecycle chaincode install basic.tar.gz

Si tout s’est correctement déroulé, vous devriez avoir le même identifier sur les 2 noeuds !

Valider le chaincode par l’Ordering node

Pour que notre chaincode puisse être utilisé, il doit encore être validé et mise en ligne par un ordering node. Pour rappel, ceux-ci ont en quelque sorte un rôle de ‘juge et arbitre’ sur une blockchain Hyperledger Fabric, qui par définition est une blockchain privée et ne possède pas de consensus comme le proof of work, il s’agit ici du consensus RAFT, dont vous pouvez trouver le fonctionnement détaillé ici.

Si vous avez oublié de récupérer l’identifier du chaincode, vous pouvez le récupérer avec cette commande lifecycle chaincode queryinstalled :

peer lifecycle chaincode queryinstalled

Vous pouvez ensuite définir la variable CC_PACKAGE_ID que nous utiliserons juste après pour valider le chaincode (n’oubliez pas de remplacer l’identifier par le votre) :

export CC_PACKAGE_ID=basic_1.0:d6ddacbfa8ba3fbfc3c12586e9495c73e350b1e7969520188d81c95f2208228f

On peut maintenant valider le chaincode depuis l’ordering node avec la commande lifecycle chaincode approveformyorg :

peer lifecycle chaincode approveformyorg -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --channelID mychannel --name basic --version 1.0 --package-id $CC_PACKAGE_ID --sequence 1 --tls --cafile "${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem"

Comme nous étions connecté depuis l’organisation 2 à l’étape précédente pour executer la commande peer, il faut recommencer depuis l’organisation 1 :

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

Puis valider aussi depuis l’organisation 1:

peer lifecycle chaincode approveformyorg -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --channelID mychannel --name basic --version 1.0 --package-id $CC_PACKAGE_ID --sequence 1 --tls --cafile "${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem"

Mettre en ligne le chaincode sur le channel

Lorsqu’un nombre suffisant d’organisations (la majorité) a validé le chaincode, il peut être mis en ligne sur le channel par l’une d’entre elle.

Nous allons pour cela utiliser la commande lifecycle chaincode checkcommitreadiness pour vérifier si les membres ont approuvés le chaincode :

peer lifecycle chaincode checkcommitreadiness --channelID mychannel --name basic --version 1.0 --sequence 1 --tls --cafile "${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem" --output json

Ce qui donnera :

On peut constater les « approvals .. true » qui indiquent les noeuds ayant validé ce chaincode

Pour mettre en ligne le chaincode sur la blockhain, on utilise la commande lifecycle chaincode commit en ayant pour cible suffisamment de peer nodes :

peer lifecycle chaincode commit -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --channelID mychannel --name basic --version 1.0 --sequence 1 --tls --cafile "${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem" --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"

On va pouvoir constater qu’on a un retour VALID sur les deux nodes, et on peut vérifier avec querycommitted que tout est normal :

Utiliser le chaincode

Maintenant que le chaincode est dans le channel et connecté aux organisations, et approuvé par l’Ordering node, on peut commencer à utiliser notre smart contrat Hyperledger Fabric comme nous l’avions fait au précédent tutorial.

Commençons par initaliser des données sur la blockchain en invoquant des fonctions du chaincode avec la commande chaincode invoke :

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":[]}'

Puis nous affichons ces données :

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

Ce qui donnera :

On peut aussi s’amuser à créer un nouvel asset à l’utilisateur Michel, qui sera green avec 950 (vous pouvez tester avec vos propres paramètres :

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":"CreateAsset","Args":["asset8","green","19","Michel","950"]}'

Puis relancer la fonction GetAllAssets pour vérifier qu’il apparait bien :

Toutes les étapes que nous venons de voir en détail correspondent en fait à ce que fait le script que nous avions lancé à l’étape 5 du précédent tutorial sur Hyperledger Fabric , sauf que vous savez désormais que pour déployer notre smart contrat, il faut créer le package du chaincode, puis l’installer sur les nodes, peer, le faire valider par un ordering peer et enfin le déployer sur le channel.

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.