Créer un smart contract sur Hyperledger Fabric

0

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

Pour ce 5ème tutorial sur HyperLedger Fabric (HLF), nous allons créer un smart contract de zéro, car nous avons surtout pris en main des contrats existants jusqu’à présent.

Nous allons donc créer à partir de rien un chaincode (les smart contrat sur HLF) en NodeJS pour comprendre comment fonctionne le SDK afin d’écrire des données sur une blockchain Fabric.

Notre objectif est ici de créer un programme de messagerie qui est capable d’écrire un message sur la blockchain que chacun peut consulter. On peut imaginer ici une utilisation de la blockchain comme une messagerie sécurisée et cryptée, dont il important de conserver un historique fiable et immuable (par exemple entre 2 filiales ou même entre 2 pays).

Pour rappel, HLF permet de créer des contrats intelligents en langage Go, Java, TypeScript et Javascript. C’est cette dernière possibilité qui nous intéresse car grâce à NodeJs il sera possible de créer un chaincode grâce au SDK nodejs pour HLF.

Avant toute chose, commencez par installer la dernière version de Nodejs que vous trouverez sur le site officiel.

Placez vous ensuite dans un répertoire vide, puis lancez l’installation d’un nouveau projet node :

npm init

Puis complétez les informations à votre convenance, il n’est pas gênant de tout laisser par défaut à part le nom du projet, ce qui aboutira sur la création du fichier package.json :

Nous allons ensuite avoir besoin des packages fabric-contract-api et fabric-shim pour disposer du SDK et des outils de déploiement :

npm install fabric-contract-api fabric-shim

On va ensuite créer le fichier index.js qui sera le point d’entrée de l’application :

'use strict';

const Messagerie = require('./lib/messagerie.js');

module.exports.Messagerie = Messagerie;
module.exports.contracts = [Messagerie];

Créez ensuite le répertoire lib et mettez dedans un fichier messagerie.js qui contiendra le fichier du chaincode.

Maintenant que la structure est prête, nous allons démarrer la création du contrat intelligent. Ouvrez le fichier lib/messagerie.js dans lequel nous allons déclarer l’utilisation du SDK et créer la classe du contrat :

'use strict';

const { Contract } = require('fabric-contract-api');

class Messagerie extends Contract {

}

A l’intérieur de cette classe, on va pouvoir ajouter un constructeur :

  constructor(){
    super('Messagerie');
  }

Puis une fonction qui nous servira à initialiser le contrat :

  async InitialiserMessagerie(ctx){
    try {
      await ctx.stub.putState('1', 'Bienvenue sur la messagerie sécurisée');
    }catch(e){
      throw new Error('erreur' + e);
    }
  }

On constate l’utilisation du mot clé async, puisque la nature même des transactions sur Hyperledger Fabric impose un fonctionnement asynchone, celle-ci se déroule (hors configuration particulière) de cette façon :

  • Le chaincode par l’intermédiaire du SDK envoi la demande de transaction aux peer nodes
  • Les peer nodes génèrent une proposition de transaction signée
  • Ces propositions sont ensuite traitées par les ordering nodes qui vont créer les nouveaux blocs pour la chaine de blocs
  • L’application se charge ensuite de diffuser aux peer nodes les nouvelles transactions, alimentant ainsi la blockchain

On note aussi dans le code ci dessus la présence d’un paramètre ctx, qui est le contexte de la blockchain, c’est lui qui va nous permettre d’interagir avec elle par l’intermédiaire du SDK.
Celui-ci va écrire dans la blockchain grâce à l’instruction ctx.stub.putState qui prend en paramètre une clé et une valeur (puisque par défaut HLF utilise leveldb qui est base noSql avec un fonctionnement classique clé/valeur)

On va ensuite créer un fonction pour créer un nouveau message sur la blockchain. Pour simplifier l’exemple on va utiliser la clé du premier message (1), puisque de toute façon l’historique des messages est dans l’historique des blocs. On imagine ici l’équivalent d’un répondeur on l’on consulte l’état actuel qui est toujours le dernier message reçu.

Cette fonction donc ressemble donc beaucoup à la précédente à ceci près qu’elle prend un paramètre message pour modifier la blockchain avec ce paramètre :

  async EnregistrerMessage(ctx, message){
    try {
      await ctx.stub.putState('1', 'Dernier message : ' + message);
    }catch(e){
      throw new Error('erreur' + e);
    }
  }

Enfin pour être sur que tout fonctionne bien, on va ajouter une fonction de lecture de la blockchain. Pour faire simple, on reprend ici celle disponible dans les samples d’installation en la renommant :

async LireMessagerie(ctx) {
      const allResults = [];
      const iterator = await ctx.stub.getStateByRange('', '');
      let result = await iterator.next();
      while (!result.done) {
          const strValue = Buffer.from(result.value.value.toString()).toString('utf8');
          let record;
          try {
              record = JSON.parse(strValue);
          } catch (err) {
              console.log(err);
              record = strValue;
          }
          allResults.push({ Key: result.value.key, Record: record });
          result = await iterator.next();
      }
      return JSON.stringify(allResults);
  }

Notre chaincode est prêt, il reste plus qu’à le déployer sur un channel comme nous l’avons déjà fait à l’étape 2.

Le code complet de ce projet est aussi disponible sur Github.

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.