Tutorial Hyperledger Fabric: Guia completa: primera part

La següent sèrie de tutorials sobre tela Hyperledger consta de tres articles que us ensenyaran diversos aspectes sobre el desenvolupament del codi de codis Hyperledger Fabric que van des de les operacions CRUD, la protecció de dades i les proves de codis de cadena..

Part 1

Part 2

Part 3

Per  Michiel Mulders

Una visió general de la sèrie:

  • Article 1: desenvolupament bàsic del codi de cadena i emmagatzematge de dades privades en col·leccions
  • Article 2: Consultes avançades de codis de xinc i la GUI de CouchDB
  • Article 3: un tutorial per provar el vostre codi de xinc amb MockStub

Requisits

  • 4 GB de RAM (es prefereix més)
  • Docker, Docker-Compose, editor de codi (per exemple, Visual Studio Code), Git
  • NodeJS versió 8.9+ (la preferència és 8.9.4: canvieu la versió amb un gestor de versions com ara “n‘)
  • Coneixements bàsics de JavaScript

Objectius

  • Creeu funcions bàsiques de codi de xat com llegir i afegir dades al llibre major.
  • Valideu la funcionalitat creada mitjançant el comando executiu de Docker.
  • Configureu col·leccions de dades privades.
  • Afegiu dades a col·leccions de dades privades i recupereu un objecte agregat del llibre major.

Introducció: tutorial sobre tela Hyperledger

En aquest primer article, ens acostumarem a la caldera Hyperledger Fabric per al codi de xinc NodeJS que utilitzarem al llarg d’aquesta sèrie de tutorial. La caldera està desenvolupada per una empresa belga de consultoria blockchain anomenada TheLedger.be, moltes gràcies per l’abastiment obert d’aquesta caldera.

Per què fem servir aquesta caldera? Et facilita la vida! Per exemple, la caldera embolicarà i serialitzarà automàticament la resposta amb shim.success () i shim.error (). Només podeu retornar l’objecte javascript i la resta.


En aquest tutorial, ens centrarem en el desenvolupament d’operacions CRUD bàsiques amb i sense recopilacions de dades privades, que provarem després. A més, us farem una breu introducció sobre el funcionament de les col·leccions privades.

Obteniu el codi

El codi es pot trobar a Github michielmulders / hyperledger-fabric-blockgeeks. Es recomana utilitzar-lo

git clon https://github.com/michielmulders/hyperledger-fabric-blockgeeks.git

per crear un clon local del dipòsit al vostre equip i mireu la primera part del tutorial amb tutorial git checkout-1

Configuració de la caldera

D’acord, per tant, Hyperledger Fabric no començarà del tot … Primer, hem d’extreure les imatges necessàries de Docker que són necessàries perquè Fabric pugui crear els contenidors necessaris (Autoritat certificadora, Comandant, Peer, Servei de membres).

La carpeta scripts conté un script anomenat bootstrap.sh que, per defecte, extreurà la versió 1.2.0 de Hyperledger Fabric, que admet la funcionalitat de col·leccions privades que utilitzarem més endavant. Assegureu-vos que teniu prou espai disponible al disc i que tingueu una connexió a Internet adequada, ja que les imatges tenen una mida total superior a 1 GB. Executeu l’script així ./scripts/bootstrap.sh

Quan hàgim descarregat totes les imatges necessàries, podem continuar provant la nostra caldera assegurant-nos que comença sense errors. Executem l’script startFabric.sh amb ./scripts/startFabric.sh

Si es completa correctament (una xarxa Hyperledger Fabric en execució), hauria de retornar l’estat 200.

Tutorial Hyperledger Fabric: Com provar el vostre codi de xoc NodeJS mitjançant Mockstub - Part 1

Consell: Si no podeu executar l’script Bash (.sh), intenteu concedir-li drets executables amb:

chmod + x bootstrap.sh

Quant a les col·leccions privades

Hyperledger Fabric ha desenvolupat aquest concepte de SideDB que contenen dades privades, només visibles per al node propietari de SideDB. Bàsicament, es tracta d’informació que no s’ha compartit públicament entre la xarxa privada. Recentment, Hyperledger ha canviat aquest nom com a col·leccions privades que veuen com una solució integrada “compatible amb el RGPD”.

Abans, la confidencialitat es creava a la xarxa Hyperledger mitjançant els usos dels canals. L’exemple més comú és la negociació sobre un preu per quilo per a un determinat peix. Fisher A vol oferir un preu especial al restaurant A perquè són amics íntims, però, Fisher A no vol que el restaurant B vegi aquesta oferta més barata amb el restaurant A. Per tal de crear una comunicació segura, es creen dos canals des de Fisher A al restaurant A i del Fisher A al restaurant B.

No obstant això, el procés de creació de canals pot esdevenir força complex en una situació fintech en què parlem de milers de clients, cadascun amb diversos canals. Aquesta és la raó per la qual Hyperledger Fabric desaconsella un ús excessiu de canals, ja que això ralentitza dràsticament la xarxa i afecta el rendiment..

Jonas Snellinckx de TheLedger explica com es poden gestionar millor les dades privades a la xarxa Hyperledger,

Les dades privades us permeten crear col·leccions de dades mitjançant polítiques per definir quines parts del canal poden accedir a les dades. Aquest accés es pot gestionar simplement afegint polítiques a les col·leccions. Això permet que algunes dades siguin públiques i algunes siguin privades per a algunes parts “.

Tutorial Hyperledger Fabric: Com provar el vostre codi de xoc NodeJS mitjançant Mockstub - Part 1

Imatge 1: des del tauler inclòs “Llibre de registre habilitat per a la privadesa” https://jira.hyperledger.org/browse/FAB-1151

Per a aquest tutorial, definim els cotxes que s’emmagatzemaran a la xarxa Fabric. Les dades sobre el propietari són privades, de manera que s’afegiran a una col·lecció privada. Codifiquem!

Codi de connexió de teixit Hyperledger

Fem una ullada al codi de cadena actual que podeu trobar chaincode / node / src / MyChaincode.ts. El fitxer conté una funció, initLedger s’utilitza per omplir prèviament el llibre major amb alguns cotxes. Un objecte de cotxe consta de marca, model, color i propietari. En afegir els objectes del cotxe al llibre major, els donem a tots una clau i un tipus de document únics perquè sigui més fàcil recuperar-los.

per (permeti i = 0; i < cotxes.longitud; i ++) {

           const car: any = cars [i];

           car.docType = ‘cotxe’;

           //car.key = `CAR $ {i}`;

           wait stubHelper.putState (‘CAR’ + i, car);

           this.logger.info (‘Afegit <–> ‘, cotxe);

       }

1. Creeu un cotxe nou

Codifiquem una funció que crea un objecte de cotxe nou a l’estat mundial de Hyperledger. La funció accepta una matriu de cadenes, tot i que només el primer element de la matriu conté un objecte JSON stringificat. Utilitzem una funció d’ajuda per comprovar fàcilment els arguments mitjançant . A més de comprovar els arguments, també pot analitzar els arguments de cadena al format de dades requerit. Sí, analitzarà l’objecte JSON stringificat d’acord amb l’esquema proporcionat que hem definit Yup.object (). Shape ({my-object}.

async createCar (stubHelper: StubHelper, args: string []) {

       const VerifiedArgs = espera Helpers.checkArgs<cap>(args [0], Yup.object ()

           .forma({

               clau: Yup.string (). required (),

               make: Yup.string (). required (),

               model: Yup.string (). required (),

               color: Yup.string (). required (),

               propietari: Yup.string (). required (),

           }));

    …

}

A continuació, podem utilitzar aquest objecte formatat (VerifiedArgs constant) per construir un nou objecte de cotxe. No oblideu afegir el doctype. L’objecte ja està a punt per afegir-se al llibre major. Utilitzem el stubHelper que conté totes les funcions per interactuar amb l’estat del llibre major, com ara recuperar, afegir, actualitzar i suprimir dades.

async createCar (stubHelper: StubHelper, args: string []) {

       const VerifiedArgs = espera Helpers.checkArgs<cap>(args [0], Yup.object ()

           .forma({

               clau: Yup.string (). required (),

               make: Yup.string (). required (),

               model: Yup.string (). required (),

               color: Yup.string (). required (),

               propietari: Yup.string (). required (),

           }));

       deixar cotxe = {

           docType: ‘cotxe’,

           make: VerifiedArgs.make,

           model: VerifiedArgs.model,

           color: VerifiedArgs.color,

           propietari: VerifiedArgs.owner,

           clau: verificatArgs.key,

       };

       espera stubHelper.putState (VerifiedArgs.key, cotxe);

   }

El putState La funció accepta una clau i un objecte per emmagatzemar al llibre major. La funció putState que fem servir aquí és una funció d’embolcall, ja que el llibre major només pot emmagatzemar matrius de bytes i no objectes JSON. El stubHelper fa la màgia per a nosaltres, la implementació original es pot trobar a ChaincodeStubInterface.PutState.

1.1 Validar l’addició de cotxe

Utilitzarem Docker per executar una ordre dins del contenidor del parell, ja que el parell conté l’última versió del codi de cadena. Per proporcionar al parell aquesta versió actualitzada, reiniciem la xarxa Hyperledger Fabric amb ./scripts/startFabric.sh. Per què utilitzar aquest script? S’executa més ràpidament, ja que només substituirà el codi de cadena als companys i no reiniciarà tota la xarxa.

Obriu un terminal i executeu l’ordre següent: docker exec cli peer chaincode invoke -C mychannel -n fabcar -c ‘{“function”: ”createCar”, “Args”: [“{\” key \ ”: \” CAR100 \ ”, \” make \ ”: \ ”Peugot \”, \ ”model \”: \ ”307 \”, \ ”color \”: \ ”verd \”, \ ”propietari \”: \ ”John Doe \”} ”]} ‘

Aquesta ordre enviarà una nova proposta de transacció al parell per incloure-la a l’estat mundial del llibre major. Anomenem el nostre ‘createCar‘I afegim un objecte JSON stringificat amb la clau’ CAR100 ‘com a primer paràmetre de la nostra matriu de cadenes. Hem d’escapar de les cometes dobles de l’objecte JSON per passar-lo al nostre codi de cadena.

Fixeu-vos en l’ús del fitxer invocar paraula clau. És important conèixer la diferència entre invocar i consulta. La paraula clau d’invocació s’utilitza quan intentem alterar o afegir dades al llibre major, mentre que la paraula clau de consulta només s’utilitza quan es recupera informació del llibre major.

L’execució correcta de l’ordre Docker hauria de retornar un “resultat: estat: 200”.

Tutorial Hyperledger Fabric: Com provar el vostre codi de xoc NodeJS mitjançant Mockstub - Part 1

2. Llegiu les dades del llibre major

Per llegir les dades del llibre major, podem buscar una clau específica. Cerquem l’objecte Car recentment creat amb la clau ‘CAR100’. Comencem de nou amb la validació dels arguments que rebem al nostre codi de claus, aquesta vegada només acceptem una clau.

A continuació, fem servir el fitxer getStateAsObject funció per recuperar un objecte JSON del llibre major per a una clau especificada. És possible que la clau no existeixi. En aquest cas, podem generar un error personalitzat amb Error no trobat que forma part del fabric-chaincode-utils, importem a la part superior del fitxer, com ara stubHelper.

async queryCar (stubHelper: StubHelper, args: string []): Promesa<cap> {

       

       const VerifiedArgs = espera Helpers.checkArgs<{clau: cadena}>(args [0], Yup.object ()

           .forma({

               clau: Yup.string (). required (),

           }));

       const car = await stubHelper.getStateAsObject (VerifiedArgs.key);

       si (! cotxe) {

           llança NotFoundError nou (‘El cotxe no existeix’);

       }

       cotxe de tornada;

   }

2.1 Funció del cotxe de consulta de validació

Utilitzeu l’ordre Docker següent per consultar el cotxe amb la tecla “CAR100”. Fixeu-vos en l’ús de la paraula clau de consulta en aquesta ordre..

docker exec cli peer chaincode query -C mychannel -n fabcar -c ‘{“ function ”:” queryCar ”,” Args ”: [“ {\ ”key \”: \ ”CAR100 \”} ”]}”

Tutorial Hyperledger Fabric: Com provar el vostre codi de xoc NodeJS mitjançant Mockstub - Part 1

3 col·leccions privades

Per començar, primer necessitem un fitxer de configuració de col·leccions collections_config.json que inclou el nom i la política de la col·lecció. La política és similar a una aprovació, cosa que ens permet utilitzar la lògica de política ja existent com operadors OR, AND, ….

3.1 Configuració de col·lecció privada

Una col·lecció privada consisteix en un nom i una política; altres propietats estan fora de l’abast d’aquest tutorial i estan optimitzades per a la xarxa Hyperledger. Utilitzem una col·lecció anomenada “privateCarCollection” amb una política en què només un membre d’una organització ha de validar la transacció.

[

 {

   "nom": "privateCarCollection",

   "política": "OR (‘Org1MSP.member’, ‘Org2MSP.member’)",

   "requiredPeerCount": 0,

   "maxPeerCount": 3,

   "blockToLive": 1000000

 }

]

3.2 Afegir dades a la col·lecció privada

Ara tenim la nostra col·lecció privada. Utilitzem-la al nostre codi. No és un gran treball dir-li-ho stubHelper per desar les dades a una col·lecció privada en lloc de difondre-les per la xarxa.

espera stubHelper.putState (

           verificatArgs.key,

           cotxe,

           {privateCollection: ‘privateCarCollection’}

       );

Modifiquem lleugerament el nostre codi per emmagatzemar només el propietari del vehicle i la seva adreça a la col·lecció de vehicles privats. Recordeu afegir la mateixa clau a aquest nou objecte de cotxe privat per tal de facilitar la recuperació de l’objecte complet. A més, canviarem el validador d’objectes Yup per acceptar només una clau, una adreça i una propietat del propietari. Com a pràctica recomanada, canviem el tipus de document a “PrivateCar”.

async createPrivateCar (stubHelper: StubHelper, args: string []) {

const VerifiedArgs = await Helpers.checkArgs (args [0], Yup.object ()

.forma({

clau: Yup.string (). required (),

adreça: Yup.string (). required (),

propietari: Yup.string (). required (),

}));

deixar cotxe = {

docType: ‘privateCar’,

adreça: VerifiedArgs.address,

propietari: VerifiedArgs.owner,

clau: verificatArgs.key,

};

espera stubHelper.putState (

verificatArgs.key,

cotxe,

{privateCollection: ‘privateCarCollection’}

);

}

3.3 Consulta de cotxe agregat

Per crear l’objecte de cotxe agregat, consultarem tant la xarxa Hyperledger com la recopilació de dades privades que conté el propietari i l’adreça del nostre cotxe..

En primer lloc, recuperem el cotxe públic amb:

deixar publicCar = espera stubHelper.getStateAsObject (VerifiedArgs.key);

A continuació, podem consultar les dades del cotxe privat de la mateixa manera:

let privateCar = await stubHelper.getStateAsObject (VerifiedArgs.key, {privateCollection: ‘privateCarCollection’})

Per fi, retornem l’objecte agregat del cotxe. Estem utilitzant la distribució d’objectes (tres punts ‘…’), que és un mètode ECMAscript 2018 que pren totes les propietats de cada objecte i el combina en un objecte nou.

async queryAggregatedCar (stubHelper: StubHelper, args: string []): Promesa<cap> {

       

       const VerifiedArgs = espera Helpers.checkArgs<{clau: cadena}>(args [0], Yup.object ()

           .forma({

               clau: Yup.string (). required (),

           }));

       deixar publicCar = espera stubHelper.getStateAsObject (VerifiedArgs.key);

       if (! publicCar) {

           llança NotFoundError nou (‘El cotxe no existeix’);

       }

       deixa privateCar = espera stubHelper.getStateAsObject (

           verificatArgs.key,

           {privateCollection: ‘privateCarCollection’}

       );

       const car = {

           …publicCar,

           …privateCar

       };

       cotxe de tornada;

   }

3.4 Validar la consulta agregada

A la bala 1.1 d’aquest tutorial, hem creat un cotxe nou amb la clau ‘CAR100’. Utilitzem aquesta clau per crear un objecte de dades privat mitjançant l’ordre Docker exec.

docker exec cli peer chaincode invoke -C mychannel -n fabcar -c ‘{“function”: ”createPrivateCar”, “Args”: [“{\” key \ ”: \” CAR100 \ ”, \” address \ ”: \ ”Parklane 20, Itàlia \”, \ ”propietari \”: \ ”John Doe \”} ”]} ‘

Ara tenim tant un objecte de cotxe públic com privat, anem a provar la trucada global així. Recordeu utilitzar el fitxer consulta paraula clau ja que només recuperem dades.

docker exec cli peer chaincode query -C mychannel -n fabcar -c ‘{“ function ”:” queryAggregatedCar ”,“ Args ”: [“ {\ ”key \”: \ ”CAR100 \”} ”]}”

Això hauria de tornar:

{“Color”: “verd”, “docType”: “privateCar”, “key”: “CAR100”, “make”: “Peugot”, “model”: “307”, “propietari”: “John Doe”, ”Address”: ”Parklane 20, Itàlia”}

4. Què vam aprendre?

El stubHelper és l’eina més important per interactuar amb les dades del llibre major. És capaç d’afegir, actualitzar i suprimir dades. Però també pot ajudar a localitzar i consultar objectes al llibre major i a retornar-los com a objectes JSON.

Full de trucs de codi

Tutorial Hyperledger Fabric: Com provar el vostre codi de xoc NodeJS mitjançant Mockstub - Part 1

Voleu submergir-vos més en els hiperplats? Consulteu el nostre Hyperledger Accelerator 

Continueu també a la segona part aquí mateix: 

Lectures addicionals

  • Aquí podeu trobar la implementació completa de la interfície de ChaincodeStubInterface que es codifica amb Golang ja que es crea Hyperledger amb aquest nou llenguatge.
  • API completa espec StubHelper.
  • Col·lecció de recursos relacionats amb Hyperledger Fabric a Github.

Per Michiel Mulders

@michiel_mulders

Mike Owergreen Administrator
Sorry! The Author has not filled his profile.
follow me
Like this post? Please share to your friends:
Adblock
detector
map