Blockchain: que devons-nous construire PoC?

Les yeux ont peur et les mains démangent!

Dans les articles précédents, nous avons déterminé les technologies sur lesquelles les chaînes de blocs sont construites (pour quoi devrions-nous construire une chaîne de blocs? ) Et les cas qui peuvent être mis en œuvre avec leur aide ( Que devrions-nous construire un cas? ) Il est temps de travailler avec vos mains! Pour la mise en place de pilotes et PoC (Proof of Concept), je préfère utiliser des clouds, car ils sont accessibles de n'importe où dans le monde et, souvent, vous n'avez pas à consacrer de temps à une installation fastidieuse de l'environnement, car Il existe des configurations prédéfinies. Alors, faisons quelque chose de simple, par exemple, un réseau pour transférer des pièces entre les participants et appelons-le modestement Citcoin. Pour cela, nous utiliserons le cloud IBM et la blockchain universelle Hyperledger Fabric. Tout d'abord, voyons pourquoi Hyperledger Fabric est appelé une blockchain universelle.

image

Hyperledger Fabric - une blockchain universelle


D'une manière générale, le système d'information universel est:

  • Un ensemble de serveurs et un noyau logiciel qui exécute la logique métier;
  • Interfaces pour interagir avec le système;
  • Moyens d'enregistrement, d'authentification et d'autorisation des appareils / personnes;
  • Base de données stockant les données opérationnelles et d'archivage:

image

La version officielle de ce qu'est Hyperledger Fabric peut être lue sur le site , et en bref, Hyperledger Fabric est une plate-forme open source qui vous permet de créer des chaînes de blocs fermées et d'exécuter des contrats intelligents arbitraires écrits dans les langages de programmation JS et Go. Jetons un coup d'œil à l'architecture de Hyperledger Fabric en détail et assurons qu'il s'agit d'un système universel qui n'a que les spécificités de stockage et d'enregistrement de données. La spécificité est que les données, comme dans toutes les blockchains, sont stockées dans des blocs qui sont placés sur la blockchain uniquement si les participants sont parvenus à un consensus et après l'enregistrement des données ne peuvent pas être discrètement corrigées ou supprimées.

Architecture de tissu Hyperledger


Le diagramme montre l'architecture du tissu Hyperledger:

image

Organisations - les organisations contiennent des pairs, c.-à-d. la blockchain existe grâce au soutien des organisations. Différentes organisations peuvent être membres du même canal.

Canal - une structure logique qui unit les pairs en groupes, c'est-à-dire La blockchain est définie. Hyperledger Fabric peut traiter simultanément plusieurs chaînes de blocs avec une logique métier différente.

Le fournisseur de services aux membres (MSP) est une autorité de certification (autorité de certification) qui délivre une identité et attribue des rôles. Pour créer un nœud, vous devez interagir avec MSP.

Noeuds homologues - vérifiez les transactions, stockez la blockchain, exécutez des contrats intelligents et interagissez avec les applications. Les pairs ont une identité (certificat numérique) qui émet un MSP. Contrairement au réseau Bitcoin ou Etherium, où tous les nœuds sont égaux, dans les nœuds Hyperledger Fabric jouent des rôles différents:

  • Le pair peut approuver le pair (PE) et exécuter des contrats intelligents.
  • Committing peer (CP) - enregistrez uniquement les données sur la blockchain et mettez à jour «l'état du monde».
  • Anchor Peer (AP) - si plusieurs organisations participent à la blockchain, les pairs d'ancrage sont utilisés pour communiquer entre elles. Chaque organisation doit avoir un ou plusieurs pairs d'ancrage. Avec l'aide d'AP, tout pair de l'organisation peut obtenir des informations sur tous les pairs d'autres organisations. Le protocole Gossip est utilisé pour synchroniser les informations entre les points d'accès.
  • Homologue leader - si l'organisation a plusieurs homologues, seul l'homologue leader recevra les blocs du service de commande et les remettra aux autres homologues. Un leader peut être défini statiquement ou sélectionné dynamiquement par des pairs dans une organisation. Le protocole Gossip est également utilisé pour synchroniser les informations de leader.

Les actifs sont des entités de valeur qui sont stockées sur la blockchain. Plus précisément, il s'agit de données de valeur-clé au format JSON. Ce sont ces données qui sont enregistrées dans la Blockchain. Ils ont une histoire qui est stockée sur la blockchain et l'état actuel, qui est stocké dans la base de données d'état mondial. Les structures de données sont remplies de manière aléatoire en fonction des tâches métier. Il n'y a pas de champs obligatoires, la seule recommandation est que les actifs doivent avoir un propriétaire et être précieux.

Ledger - se compose de la blockchain "Blockchain" et de la base de données "Word state", qui stocke l'état actuel des actifs. L'état mondial utilise LevelDB ou CouchDB.

Contrat intelligent - à l'aide de contrats intelligents, la logique métier du système est mise en œuvre. Dans Hyperledger Fabric, les contrats intelligents sont appelés chaincode. À l'aide du code de chaîne, les actifs et les transactions sur eux sont définis. S'exprimant en langage technique, les contrats intelligents sont des modules logiciels implémentés dans les langages de programmation JS ou Go.

Politique d'approbation - pour chaque code de chaîne, vous pouvez spécifier le nombre de politiques et de qui vous voulez attendre des confirmations pour la transaction. Si la politique n'est pas définie, elle est utilisée par défaut: «la transaction doit être confirmée par n'importe quel membre d'une organisation du canal». Exemples de politiques:

  • Tout administrateur de l'organisation doit confirmer la transaction;
  • Tout membre ou client de l'organisation doit confirmer;
  • Doit confirmer toute organisation homologue.

Service de commande - regroupe les transactions en blocs et envoie des pairs au canal. Garantit la livraison des messages à tous les pairs du réseau. Pour les systèmes industriels, le courtier de messages Kafka est utilisé pour développer et tester Solo .

Flux d'appel


image

  • L'application interagit avec Hyperledger Fabric à l'aide du SDK Go, Node.js ou Java;
  • Le client crée une transaction tx et l'envoie à ses homologues endosseurs;
  • Le pair vérifie la signature du client, termine la transaction et renvoie la signature d'approbation au client. Chaincode est exécuté uniquement sur le pair endosseur et le résultat de son exécution est envoyé à tous les pairs. Cet algorithme de travail est appelé consensus PBFT (Practical Byzantine Fault Tolerant). Il diffère du BFT classique en ce que le message est envoyé et aucune confirmation n'est attendue de tous les participants, mais uniquement d'un ensemble spécifique;
  • Une fois que le client a reçu le nombre de réponses correspondant à la politique d'endossement, il envoie la transaction au service Commande;
  • Le service de commande forme un bloc et l'envoie à tous les pairs qui s'engagent. Le service de commande fournit une écriture séquentielle des blocs, ce qui exclut la fourchette dite du grand livre ( voir la section "Fourches" );
  • Les pairs reçoivent un bloc, vérifient à nouveau la politique d'approbation, écrivent le bloc dans la blockchain et changent l'état dans la base de données «World state».

C'est-à-dire il s'avère que la séparation des rôles entre les nœuds. Cela offre une évolutivité et une sécurité blockchain:

  • Les contrats intelligents (chaincode) effectuent l'approbation des pairs. Cela garantit la confidentialité des contrats intelligents, comme il n'est pas stocké par tous les participants, mais uniquement sur les pairs qui approuvent.
  • La commande devrait fonctionner rapidement. Ceci est assuré par le fait que Ordering ne forme qu'un bloc et l'envoie à un ensemble fixe de pairs leaders.
  • Les pairs engagés ne stockent que la blockchain - il peut y en avoir beaucoup et ils ne nécessitent pas beaucoup de puissance et de travail instantané.

Pour plus d'informations sur les solutions architecturales d'Hyperledger Fabric et pourquoi cela fonctionne de cette manière, voir ici: Origines de l'architecture ou ici: Hyperledger Fabric: un système d'exploitation distribué pour les blockchains autorisées .

Ainsi, Hyperledger Fabric est un système vraiment universel avec lequel vous pouvez:

  • Mettre en œuvre une logique métier arbitraire à l'aide du mécanisme de contrat intelligent;
  • Écrire et recevoir des données à partir d'une base de données blockchain au format JSON;
  • Fournissez et vérifiez l'accès à l'API à l'aide de l'autorité de certification.

Maintenant que nous avons compris les spécificités du tissu Hyperledger, faisons enfin quelque chose d'utile!

Développer la chaîne de blocs


Énoncé du problème


La tâche consiste à implémenter le réseau Citcoin avec les fonctions suivantes: créer un compte, obtenir un solde, reconstituer le compte, transférer des pièces d'un compte à un autre. Dessinons un modèle d'objet, que nous allons implémenter dans un contrat intelligent. Ainsi, nous aurons des comptes qui sont identifiés par des noms et contiennent un solde et une liste de comptes. Les comptes et une liste de comptes sont en termes d'actifs Hyperledger Fabric. En conséquence, ils ont une histoire et un statut actuel. Je vais essayer de le dessiner clairement:

image

Les chiffres supérieurs sont l'état actuel, qui est stocké dans la base de données de l'État mondial. En dessous d'eux se trouvent des figures montrant l'histoire qui est stockée sur la blockchain. L'état actuel des actifs est modifié par les transactions. L'actif change uniquement dans son intégralité. Par conséquent, à la suite de la transaction, un nouvel objet est créé et la valeur actuelle de l'actif entre dans l'historique.

IBM Cloud


Nous créons un compte dans le cloud IBM . Pour utiliser la plateforme blockchain, vous devez la mettre à niveau vers Pay-As-You-Go. Ce processus peut ne pas être rapide, car IBM demande des informations supplémentaires et les vérifie manuellement. Du positif, je peux dire qu'IBM a de bons supports de formation qui vous permettent de déployer Hyperledger Fabric dans leur cloud. J'ai aimé la série d'articles et d'exemples suivants:


Voici des captures d'écran de la plateforme IBM Blockchain. Ce n'est pas une instruction pour créer une blockchain, mais simplement une démonstration de l'étendue de la tâche. Donc, pour nos besoins, nous faisons une seule organisation:

image

Nous y créons des nœuds: Orderer CA, Org1 CA, Orderer Peer:

image

Nous commençons les utilisateurs:

image

Créez une chaîne et appelez-la citcoin:

image

Essentiellement, Channel est une blockchain, donc il commence par un bloc zéro (bloc Genesis):

image

Rédaction d'un contrat intelligent


/* * Citcoin smart-contract v1.5 for Hyperledger Fabric * (c) Alexey Sushkov, 2019 */ 'use strict'; const { Contract } = require('fabric-contract-api'); const maxAccounts = 5; class CitcoinEvents extends Contract { async instantiate(ctx) { console.info('instantiate'); let emptyList = []; await ctx.stub.putState('accounts', Buffer.from(JSON.stringify(emptyList))); } // Get all accounts async GetAccounts(ctx) { // Get account list: let accounts = '{}' let accountsData = await ctx.stub.getState('accounts'); if (accountsData) { accounts = JSON.parse(accountsData.toString()); } else { throw new Error('accounts not found'); } return accountsData.toString() } // add a account object to the blockchain state identifited by their name async AddAccount(ctx, name, balance) { // this is account data: let account = { name: name, balance: Number(balance), type: 'account', }; // create account: await ctx.stub.putState(name, Buffer.from(JSON.stringify(account))); // Add account to list: let accountsData = await ctx.stub.getState('accounts'); if (accountsData) { let accounts = JSON.parse(accountsData.toString()); if (accounts.length < maxAccounts) { accounts.push(name); await ctx.stub.putState('accounts', Buffer.from(JSON.stringify(accounts))); } else { throw new Error('Max accounts number reached'); } } else { throw new Error('accounts not found'); } // return object return JSON.stringify(account); } // Sends money from Account to Account async SendFrom(ctx, fromAccount, toAccount, value) { // get Account from let fromData = await ctx.stub.getState(fromAccount); let from; if (fromData) { from = JSON.parse(fromData.toString()); if (from.type !== 'account') { throw new Error('wrong from type'); } } else { throw new Error('Accout from not found'); } // get Account to let toData = await ctx.stub.getState(toAccount); let to; if (toData) { to = JSON.parse(toData.toString()); if (to.type !== 'account') { throw new Error('wrong to type'); } } else { throw new Error('Accout to not found'); } // update the balances if ((from.balance - Number(value)) >= 0 ) { from.balance -= Number(value); to.balance += Number(value); } else { throw new Error('From Account: not enought balance'); } await ctx.stub.putState(from.name, Buffer.from(JSON.stringify(from))); await ctx.stub.putState(to.name, Buffer.from(JSON.stringify(to))); // define and set Event let Event = { type: "SendFrom", from: from.name, to: to.name, balanceFrom: from.balance, balanceTo: to.balance, value: value }; await ctx.stub.setEvent('SendFrom', Buffer.from(JSON.stringify(Event))); // return to object return JSON.stringify(from); } // get the state from key async GetState(ctx, key) { let data = await ctx.stub.getState(key); let jsonData = JSON.parse(data.toString()); return JSON.stringify(jsonData); } // GetBalance async GetBalance(ctx, accountName) { let data = await ctx.stub.getState(accountName); let jsonData = JSON.parse(data.toString()); return JSON.stringify(jsonData); } // Refill own balance async RefillBalance(ctx, toAccount, value) { // get Account to let toData = await ctx.stub.getState(toAccount); let to; if (toData) { to = JSON.parse(toData.toString()); if (to.type !== 'account') { throw new Error('wrong to type'); } } else { throw new Error('Accout to not found'); } // update the balance to.balance += Number(value); await ctx.stub.putState(to.name, Buffer.from(JSON.stringify(to))); // define and set Event let Event = { type: "RefillBalance", to: to.name, balanceTo: to.balance, value: value }; await ctx.stub.setEvent('RefillBalance', Buffer.from(JSON.stringify(Event))); // return to object return JSON.stringify(from); } } module.exports = CitcoinEvents; 

Intuitivement, tout devrait être clair ici:

  • Il existe plusieurs fonctions (AddAccount, GetAccounts, SendFrom, GetBalance, RefillBalance) que le programme de démonstration appellera à l'aide de l'API Hyperledger Fabric.
  • Les fonctions SendFrom et RefillBalance génèrent des événements (Event) que le programme de démonstration recevra.
  • Fonction instancier - est appelée une fois lors de l'instanciation d'un contrat intelligent. En fait, il n'est pas appelé une seule fois, mais à chaque fois qu'une version d'un contrat intelligent est modifiée. Par conséquent, l'initialisation de la liste avec un tableau vide est une mauvaise idée, car Maintenant, lors du changement de version d'un contrat intelligent, nous perdrons la liste actuelle. Mais rien, j'apprends juste).
  • Les comptes et une liste de comptes (comptes) sont des structures de données JSON. Pour la manipulation des données, JS est utilisé.
  • Vous pouvez obtenir la valeur actuelle d'un actif en appelant la fonction getState et la mettre à jour à l'aide de putState.
  • Lors de la création d'un compte, la fonction AddAccount est appelée, dans laquelle une comparaison est effectuée pour le nombre maximal de comptes dans la blockchain (maxAccounts = 5). Et il y a un montant (remarqué?), Ce qui entraîne une augmentation infinie du nombre de comptes. De telles erreurs doivent être évitées)

Ensuite, téléchargez le contrat intelligent sur Channel et installez-le:

image

Nous examinons la transaction pour l'installation de Smart Contract:

image

Nous regardons les détails de notre chaîne:

image

En conséquence, nous obtenons le diagramme de réseau de blockchain suivant dans le cloud IBM. Il existe également un programme de démonstration exécuté dans le cloud Amazon sur un serveur virtuel (voir la section suivante pour plus de détails):

image

Création d'une interface graphique pour les appels d'API Hyperledger Fabric


Hyperledger Fabric possède une API qui peut être utilisée pour:

  • Chaîne de créations;
  • Connexions homologues au canal;
  • Installation et instanciation de contrats intelligents dans le canal;
  • Appel de transaction;
  • Demander des informations sur la blockchain.

Développement d'applications


Dans notre programme de démonstration, nous n'utiliserons l'API que pour appeler des transactions et demander des informations, car Nous avons déjà pris les mesures restantes à l'aide de la plateforme de blockchain IBM. Nous écrivons une interface graphique en utilisant une pile technologique standard: Express.js + Vue.js + Node.js. Vous pouvez écrire un article séparé sur la façon de commencer à créer des applications Web modernes. Ici, je vais laisser un lien vers la série de conférences que j'ai le plus appréciée: Full Stack Web App utilisant Vue.js & Express.js . Le résultat est une application client-serveur avec une interface graphique familière dans le style de Material Design de Google. L'API REST entre le client et le serveur se compose de plusieurs appels:

  • HyperledgerDemo / v1 / init - initialise la blockchain;
  • HyperledgerDemo / v1 / accounts / list - obtenir une liste de tous les comptes
  • HyperledgerDemo / v1 / account? Name = Bob & balance = 100 - créer un compte Bob;
  • HyperledgerDemo / v1 / info? Account = Bob - obtenir des informations sur le compte Bob;
  • HyperledgerDemo / v1 / transaction? De = Bob & à = Alice & volume = 2 - transférez deux pièces de Bob à Alice;
  • HyperledgerDemo / v1 / déconnect - ferme la connexion à la blockchain.

J'ai mis la description de l'API avec des exemples sur le site Web de Postman , un programme bien connu pour tester l'API HTTP.

Application de démonstration d'Amazon Cloud


L'application a été téléchargée sur Amazon, car IBM n'a jusqu'à présent pas réussi à mettre à niveau mon compte et à autoriser la création de serveurs virtuels. Comment la cerise a attaché le domaine: www.citcoin.info . Je vais garder le serveur allumé un peu, puis je l'éteindrai, car les centimes de loyer dégoulinent, et les pièces de citcoin ne sont pas encore cotées en bourse) J'ai mis des captures d'écran de la démo dans l'article pour que la logique du travail soit claire. L'application de démonstration peut:

  • Initialisez la blockchain;
  • Créez un compte (mais maintenant ne créez pas de nouveau compte, car le nombre maximal de comptes prescrit dans le contrat intelligent a été atteint dans la blockchain);
  • Obtenez une liste de comptes;
  • Transférer des pièces de citcoin entre Alice, Bob et Alex;
  • Recevoir des événements (mais maintenant il n'y a aucun moyen d'afficher les événements, par conséquent, pour plus de simplicité, l'interface indique que les événements ne sont pas pris en charge);
  • Consigner les actions.

Tout d'abord, initialisez la blockchain:

image

Ensuite, démarrez votre compte, ne vous souciez pas de l'équilibre:

image

Nous obtenons une liste de tous les comptes disponibles:

image

Nous sélectionnons l'expéditeur et le destinataire, nous obtenons leurs soldes. Si l'expéditeur et le destinataire sont identiques, leur compte sera réapprovisionné:

image

Dans le journal, nous surveillons l'exécution des transactions:

image

En fait, avec un programme de démonstration, c'est tout. Ensuite, vous pouvez voir notre transaction dans la blockchain:

image

Et la liste générale des transactions:

image

Avec cela, nous avons terminé avec succès la mise en œuvre de PoC pour créer le réseau Citcoin. Que faut-il faire d'autre pour que Citcoin devienne un réseau de transfert de pièces à part entière? Juste un peu:

  • Au stade de la création d'un compte, implémentez la génération d'une clé privée / publique. La clé privée doit être stockée dans l'utilisateur du compte, publique dans la blockchain.
  • Effectuez un transfert de pièces dans lequel une clé publique est utilisée pour identifier l'utilisateur, pas un nom.
  • Cryptez les transactions allant de l'utilisateur au serveur avec sa clé privée.

Conclusion


Nous avons mis en place le réseau Citcoin avec des fonctions: ajouter un compte, obtenir un solde, réapprovisionner votre compte, transférer des pièces d'un compte à un autre. Alors, combien nous a-t-il coûté pour créer un PoC?

  • Nous devons étudier la blockchain en général et Hyperledger Fabric en particulier;
  • Apprenez à utiliser les clouds IBM ou Amazon;
  • Apprenez le langage de programmation JS et un cadre Web;
  • Si certaines données doivent être stockées non pas dans la blockchain, mais dans une base de données distincte, alors apprenez à vous intégrer, par exemple, avec PostgreSQL;
  • Et enfin et surtout - sans connaissance de Linux dans le monde moderne, nulle part!)

Bien sûr, pas sorcier, mais il faut transpirer!

Sources GitHub


Il a mis le code source sur GitHub . Une brève description du référentiel:
Répertoire " serveur " - serveur Node.js
Répertoire " client " - Client Node.js
Le répertoire " blockchain " (les valeurs des paramètres et les clés, bien sûr, ne fonctionnent pas et ne sont données qu'à titre d'exemple):

  • contrat - source du contrat intelligent
  • portefeuille - clés d'utilisateur pour utiliser l'API Hyperledger Fabric.
  • * .cds - versions compilées de contrats intelligents
  • * Fichiers .json - exemples de fichiers de configuration pour l'utilisation de l'API Hyperledger Fabric

Ce n'est qu'un début!

Source: https://habr.com/ru/post/fr466157/


All Articles