Hyperledger Fabric Tutorial: Comprehensive Guide-Part 1

Hyperledger Fabric Tutorial: How to test your NodeJS chaincode using Mockstub- Part 1

Die folgende Hyperledger Fabric-Tutorialreihe besteht aus drei Artikeln, die Ihnen verschiedene Aspekte zur Entwicklung von Hyperledger Fabric-Kettencodes vermitteln, die von CRUD-Operationen, Datenschutz und Chaincode-Tests reichen.

Teil 1

Teil 2

Teil 3

Hyperledger Fabric Tutorial: How to test your NodeJS chaincode using Mockstub- Part 1

Von Michiel Mulders

Eine Übersicht über die Serie:

Artikel 1: Grundlegende Entwicklung von Kettencodes und Speicherung privater Daten in Sammlungen

Artikel 2: Erweiterte Chaincode-Abfragen und die CouchDB GUI

Artikel 3: Ein Tutorial zum Testen Ihres Kettencodes mit MockStub

Anforderungen

4 GB RAM (mehr wird bevorzugt)

Docker, Docker-Compose, Code-Editor (z. B. Visual Studio Code), Git

NodeJS Version 8.9 + (Bevorzugt ist 8.9.4 - ändern Sie Ihre Version mit einem Versionsmanager wie „n“)

Grundlegende JavaScript-Kenntnisse

Ziele

Erstellen Sie grundlegende Chaincode-Funktionen wie das Lesen und Anhängen von Daten an das Ledger.

Überprüfen Sie die erstellte Funktionalität über das Docker exec Kommando.

Konfigurieren Sie private Datensammlungen.

Fügen Sie Daten zu privaten Datensammlungen hinzu und rufen Sie ein aggregiertes Objekt aus dem Buch ab.

Einführung: Hyperledger Fabric tutorial

In diesem ersten Artikel werden wir an die Hyperledger Fabric Boilerplate für NodeJS Kettencode gewöhnen, die wir in dieser Tutorial-Serie verwenden werden. Die Boilerplate wird von einem belgischen Blockchain-Beratungsunternehmen namens TheLedger.be entwickelt, vielen Dank für Open Sourcing dieses Boilerplate.

Warum verwenden wir diese Boilerplate? Es macht Ihr Leben einfacher! Beispielsweise wird die Boilerplate die Antwort automatisch mit shim.success () und shim.error () umbrechen und serialisieren. Sie können einfach das JavaScript-Objekt zurückgeben und es wird den Rest erledigen.

In diesem Tutorial werden wir auf die Entwicklung grundlegender CRUD-Operationen mit und ohne private Datensammlungen konzentrieren, die wir danach testen werden. Darüber hinaus geben wir Ihnen eine kurze Einführung in die Funktionsweise von Privatsammlungen.

Den Code abrufen

Der Code kann auf Github michielmulders/hyperledger -fabric-blockgeeks gefunden werden. Es wird empfohlen, die

git Klon

, um einen lokalen Klon des Repositorys auf Ihrem Computer zu erstellen und den ersten Teil des Tutorials mit git checkout tutorial-1

Boilerplate Setup

Ok, Hyperledger Fabric startet also nicht aus dem Blau... Zuerst müssen wir die erforderlichen Docker-Images abrufen, die für Fabric benötigt werden, um die benötigten Container zu erstellen (Certificate Authority, Orderer, Peer, Membership Service).

Der Skript-Ordner enthält ein Skript namens bootstrap.sh, das standardmäßig die Version 1.2.0 von Hyperledger Fabric ziehen wird, die die privaten Sammlungen Funktionalität unterstützt, die wir später verwenden werden. Stellen Sie sicher, dass genügend Speicherplatz auf Ihrer Festplatte und eine ordnungsgemäße Internetverbindung vorhanden ist, da die Bilder insgesamt größer als 1 GB sind. Führen Sie das Skript wie folgt aus. /scripts/bootstrap.sh

Wenn wir alle erforderlichen Bilder heruntergeladen haben, können wir weiter zum Testen unserer Boilerplate bewegen, indem wir sicherstellen, dass es fehlerfrei startet. Lassen Sie uns das Skript StartFabric.sh mit ausführen. /scripts/StartFabric.sh

Ein erfolgreicher Abschluss - ein ausgeführtes Hyperledger Fabric-Netzwerk - sollte den Status 200 zurückgeben.

Hyperledger Fabric Tutorial: How to test your NodeJS chaincode using Mockstub- Part 1

Tipp: Wenn Sie das Bash-Skript (.sh) nicht ausführen können, versuchen Sie, ihm ausführbare Rechte zu geben mit:

chmod + x bootstrap.sh

Über Private Collections

Hyperledger Fabric hat dieses Konzept von SideDBs entwickelt, die private Daten enthalten, die nur für den Knoten sichtbar sind, der die SideDB besitzt. Grundsätzlich sind dies Informationen, die nicht öffentlich unter dem privaten Netzwerk geteilt wurden. In letzter Zeit hat Hyperledger dies als private Sammlungen umbenannt, die sie als integrierte „DSGVO-konforme“ Lösung betrachten.

Zuvor wurde im Hyperledger-Netzwerk über die Verwendung von Kanälen Vertraulichkeit geschaffen. Das häufigste Beispiel ist die Verhandlung über einen Preis pro Kilo für einen bestimmten Fisch. Fisher A möchte Restaurant A einen Sonderpreis anbieten, weil sie enge Freunde sind. Fisher A möchte jedoch nicht, dass Restaurant B dieses günstigere Angebot mit Restaurant A sieht. Um eine sichere Kommunikation zu schaffen, werden zwei Kanäle von Fisher A zu Restaurant A und von Fisher A zu Restaurant B erstellt.

Der Prozess der Erstellung von Kanälen kann jedoch in einer Fintech-Situation ziemlich komplex werden, in der wir über Tausende von Kunden sprechen, die jeweils mehrere Kanäle haben. Das ist der Grund, warum Hyperledger Fabric eine übermäßige Nutzung von Kanälen abscheut, da dies das Netzwerk drastisch verlangsamt und die Leistung beeinträchtigt.

Jonas Snellinckx von TheLedger erklärt, wie private Daten im Hyperledger-Netzwerk besser verwaltet werden können,

„Private Daten ermöglichen es Ihnen, Datensammlungen mithilfe von Richtlinien zu erstellen, um festzulegen, welche Parteien im Kanal auf die Daten zugreifen können. Dieser Zugriff kann einfach durch Hinzufügen von Richtlinien zu den Sammlungen verwaltet werden. Dies ermöglicht es, dass einige Daten öffentlich und einige privat für einige Parteien sind.“

Hyperledger Fabric Tutorial: How to test your NodeJS chaincode using Mockstub- Part 1

Bild 1: Vom Slidedeck „Privacy Enabled Ledger“

Für dieses Tutorial definieren wir Autos, die innerhalb des Fabric-Netzwerks gespeichert werden. Daten über den Eigentümer sind privat und werden daher zu einer privaten Sammlung hinzugefügt. Lassen Sie uns codieren!

Hyperledger Fabric Kettencode

Werfen wir einen Blick auf den aktuellen Kettencode, den Sie unter Chaincode/node/src/mychaincode .ts finden können. Die Datei enthält eine Funktion, InitLedger wird verwendet, um das Buch mit einigen Autos vorauszufüllen. Ein Autoobjekt besteht aus Marke, Modell, Farbe und Besitzer. Beim Hinzufügen der Autoobjekte zum Ledger geben wir ihnen alle einen eindeutigen Schlüssel und einen Doctype, damit sie leichter abgerufen werden können.

für (let i = 0; i cars.length; i + +) {

const car: any = cars [i];

car.docType = 'auto';

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

warten StubHelper.putState ('CAR' + i, Auto);

this.logger.info ('Hinzugefügt —', Auto);

}

1. Neues Auto erstellen

Lassen Sie uns eine Funktion codieren, die ein neues Autoobjekt im Weltzustand von Hyperledger erstellt. Die Funktion akzeptiert ein Array von Strings, aber nur das erste Element im Array enthält ein stringifiziertes JSON-Objekt. Wir verwenden eine Hilfsfunktion, um Argumente mit Yup leicht zu überprüfen. Neben der Überprüfung von Argumenten kann es auch Ihre Argumente von der Zeichenfolge in Ihr erforderliches Datenformat analysieren. Yup analysiert das stringifizierte JSON-Objekt gemäß dem bereitgestellten Schema, das wir mit yup.object () .shape ({my-object} definiert haben.

asynchrone CreateCar (StubHelper: StubHelper, args: string []) {

const verifiedArgs = warten helpers.checkArgs any (args [0], yup.object ()

.form ({

key: yup.string () .required (),

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

Modell: Yup.String () .required (),

Farbe: Yup.String () .required (),

Besitzer: Yup.String () .required (),

}));

...

}

Als nächstes können wir dieses formatierte Objekt (VerifiedArgs Konstante) verwenden, um ein neues Autoobjekt zu bauen. Vergessen Sie nicht, den Doctype hinzuzufügen. Das Objekt ist nun bereit, an das Buch angehängt zu werden. Lassen Sie uns den StubHelper verwenden, der alle Funktionen für die Interaktion mit dem Sachkontostatus wie das Abrufen, Hinzufügen, Aktualisieren und Löschen von Daten enthält.

asynchrone CreateCar (StubHelper: StubHelper, args: string []) {

const verifiedArgs = warten helpers.checkArgs any (args [0], yup.object ()

.form ({

key: yup.string () .required (),

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

Modell: Yup.String () .required (),

Farbe: Yup.String () .required (),

Besitzer: Yup.String () .required (),

}));

lassen Sie Auto = {

DocType: 'Auto',

Marke: VerifeDargs.Make,

Modell: VerifiedArgs.Model,

Farbe: verifieDargs.color,

Besitzer: VeriifiedArgs.eigentümer,

Schlüssel: VeriftArgs.key,

};

warten StubHelper.putState (VerifiedArgs.Key, Auto);

}

Die Funktion PutState akzeptiert einen Schlüssel und ein Objekt, das im Ledger gespeichert werden soll. Die PutState-Funktion, die wir hier verwenden, ist eine Wrapper-Funktion, da das Ledger nur Byte-Arrays und nicht JSON-Objekte speichern kann. Der StubHelper macht die Magie für uns, die ursprüngliche Implementierung finden Sie unter ChainCodeStubInterface.putState.

1.1 Validieren Zugabe von Auto

Wir werden Docker verwenden, um einen Befehl innerhalb des Containers des Peers auszuführen, da der Peer die neueste Version des Chaincodes enthält. Um dem Peer diese aktualisierte Version zu geben, starten wir das Hyperledger Fabric-Netzwerk mit neu. /scripts/StartFabric.sh. Warum dieses Skript verwenden? Es wird schneller ausgeführt, da es nur den Kettencode auf den Peers ersetzen und nicht das gesamte Netzwerk neu starten wird.

Öffnen Sie ein Terminal und führen Sie den folgenden Befehl aus: docker exec cli peer chaincode invoke -C mychannel -n fabcar -c '{„function“: „createCar“, „Args“: [„{“ key „:“ CAR100", „make“: „Peugot“, „model“: "307", „color“: ", „green“, „owner“: „:“: „:“: „:“: ", „John Doe“, „John Doe“} „}“} "'

Dieser Befehl sendet einen neuen Transaktionsvorschlag an den Peer, der in den Weltzustand des Ledgers aufgenommen werden soll. Wir nennen unsere „CreateCar“ -Funktion und wir fügen ein stringifiziertes JSON-Objekt mit Schlüssel "CAR100" als ersten Parameter in unserem Array von Strings hinzu. Wir müssen die doppelten Anführungszeichen des JSON-Objekts entkommen, um es an unseren Kettencode zu übergeben.

Beachten Sie die Verwendung des Schlüsselworts invoke. Es ist wichtig, den Unterschied zwischen Aufrufen und Abfrage zu kennen. Das Schlüsselwort invoke wird verwendet, wenn wir versuchen, Daten in das Buch zu ändern oder hinzuzufügen, während das Abfrage-Schlüsselwort nur verwendet wird, wenn Informationen aus dem Ledger abgerufen werden.

Die erfolgreiche Ausführung des Docker-Befehls sollte ein "result: status: 200" zurückgeben.

Hyperledger Fabric Tutorial: How to test your NodeJS chaincode using Mockstub- Part 1

2. Daten aus Ledger lesen

Um Daten aus dem Ledger zu lesen, können wir nach einem bestimmten Schlüssel suchen. Lassen Sie uns für das neu erstellte Auto-Objekt mit Schlüssel "CAR100" suchen. Wir beginnen erneut mit der Validierung der Argumente, die wir in unserem Kettencode erhalten, dieses Mal akzeptieren wir nur einen Schlüssel.

Als nächstes verwenden wir die GetStateAsObject -Funktion, um ein JSON-Objekt aus dem Ledger für einen angegebenen Schlüssel abzurufen. Es ist möglich, dass der Schlüssel nicht existiert. In diesem Fall können wir einen benutzerdefinierten Fehler mit NotFounderror auslösen, der Teil der Fabric-Chaincode-utils ist. Wir importieren am Anfang der Datei, wie der StubHelper.

asynchrone QueryCar (StubHelper: StubHelper, args: string []): Versprechen Sie alle {

const verifiedArgs = warten helpers.checkArgs {key: string} (args [0], yup.object ()

.form ({

key: yup.string () .required (),

}));

const car = warten StubHelper.getStateAsObject (verifiedArgs.key);

wenn (! Auto) {

werfen Sie neuen NotFoundError ('Auto existiert nicht');

}

Rückfahrwagen;

}

2.1 Validierung Abfrage Auto Funktion

Verwenden Sie den folgenden Docker Befehl, um für Auto mit Schlüssel "CAR100" abzufragen, beachten Sie die Verwendung des Schlüsselworts Abfrage in diesem Befehl.

docker exec cli peer chaincodeabfrage -C mychannel -n fabcar -c '{„function“: „queryCar“, „Args“: [„{“ key „:“ CAR100"} "]}'

Hyperledger Fabric Tutorial: How to test your NodeJS chaincode using Mockstub- Part 1

3 Privatsammlungen

Um zu beginnen, müssen wir zunächst eine Sammlungen Konfigurationsdatei collections_config.json, die die Sammlung Namen und Richtlinie enthält. Die Richtlinie ähnelt einer Billigung, dies ermöglicht es uns, die bereits bestehende Policy-Logik wie OR, AND,... Operatoren zu verwenden.

3.1 Konfiguration der privaten Sammlung

Eine private Sammlung besteht aus einem Namen und einer Richtlinie, andere Eigenschaften sind außerhalb des Geltungsbereichs dieses Lernprogramms und sind für das Hyperledger-Netzwerk optimiert. Wir verwenden eine Sammlung namens „PrivateCarCollection“ mit einer Richtlinie, bei der nur ein Mitglied einer Organisation die Transaktion validieren muss.

und nbsp

[[[[]]

{{{}}

„name“: „PrivateCarCollection“,

„policy“: „OR ('org1msp.member', 'org2msp.member')“,

„RequiredPeerCount“: 0,

„MaxPeerCount“: 3,

„BlockToLive“: 1000000

}

]

3.2 Daten zur privaten Sammlung hinzufügen

Jetzt haben wir unsere private Sammlung, lassen Sie uns dies in unserem Code verwenden. Es ist keine große Aufgabe, dem StubHelper mitzuteilen, die Daten in einer privaten Sammlung zu speichern, anstatt sie über das Netzwerk zu verteilen.

warten StubHelper.putState (

Überprüft.Schlüssel,

Auto,

{PrivateCollection: 'PrivateCarCollection'}

);

Lassen Sie uns unseren Code etwas ändern, um nur den Autobesitzer und seine Adresse in der privaten Autosammlung zu speichern. Denken Sie daran, den gleichen Schlüssel zu diesem neuen privaten Auto-Objekt hinzuzufügen, um es einfacher zu machen, das vollständige Objekt abzurufen. Außerdem werden wir den Yup-Objekt-Validator ändern, um nur einen Schlüssel, eine Adresse und Eigentümereigenschaft zu akzeptieren. Als Best Practice ändern wir den Doctype in „PrivateCar“.

asynchrone CreatePrivateCar (StubHelper: StubHelper, args: string []) {

const verifiedArgs = warten helpers.checkArgs (args [0], yup.object ()

.form ({

key: yup.string () .required (),

Adresse: Yup.String () .required (),

Besitzer: Yup.String () .required (),

}));

lassen Sie Auto = {

DocType: 'PrivateCar',

Adresse: VerifiedArgs.address,

Besitzer: VeriifiedArgs.eigentümer,

Schlüssel: VeriftArgs.key,

};

warten StubHelper.putState (

Überprüft.Schlüssel,

Auto,

{PrivateCollection: 'PrivateCarCollection'}

);

}

3.3 Query Aggregated Car

Um das aggregierte Autoobjekt zu erstellen, werden wir sowohl das Hyperledger-Netzwerk als auch die private Datenerfassung mit unserem Autobesitzer und Adresse abfragen.

Lassen Sie uns zuerst das öffentliche Auto abrufen mit:

let publicCar = warten StubHelper.getStateAsObject (verifiedArgs.key);

Als nächstes können wir die Daten des Privatwagens auf die gleiche Weise abfragen:

let privateCar = await StubHelper.getStateAsObject (verifiedArgs.key, {privateCollection: 'PrivateCarCollection'})

Lassen Sie uns endlich das aggregierte Autoobjekt zurückgeben. Wir verwenden die Objektverteilung (drei Punkte „...“), die eine ECMAScript 2018 Methode ist, die alle Eigenschaften jedes Objekts übernimmt und es zu einem neuen Objekt zusammenführt.

async QueryAggregatedCar (StubHelper: StubHelper, args: string []): Versprechen Sie alle {

const verifiedArgs = warten helpers.checkArgs {key: string} (args [0], yup.object ()

.form ({

key: yup.string () .required (),

}));

let publicCar = warten StubHelper.getStateAsObject (verifiedArgs.key);

wenn (! PublicCar) {

werfen Sie neuen NotFoundError ('Auto existiert nicht');

}

lassen Sie PrivateCar = warten StubHelper.getStateAsObject (

Überprüft.Schlüssel,

{PrivateCollection: 'PrivateCarCollection'}

);

const auto = {

... öffentlichkeit,

... PrivateCar

};

Rückfahrwagen;

}

3.4 Aggregierte Abfrage validieren

Bei bullet 1.1 in diesem Tutorial haben wir ein neues Auto mit Schlüssel "CAR100" erstellt. Lassen Sie uns diesen Schlüssel verwenden, um ein neues privates Datenobjekt über den Docker exec Befehl zu erstellen.

docker exec cli peer chaincode aufrufen -C mychannel -n fabcar -c '{„function“: „createPrivateCar“, „Args“: ["{„key“: "CAR100", „address“: „Parklane 20, Italien“, „owner“: „John Doe“} "]}'

Jetzt haben wir sowohl die Öffentlichkeit als privates Autoobjekt, lassen Sie uns den aggregierten Anruf so versuchen. Denken Sie daran, das Abfrage-Schlüsselwort zu verwenden, da wir nur Daten abrufen.

docker exec cli peer chaincodeabfrage -C mychannel -n fabcar -c '{„function“: „queryAggregatedCar“, „Args“: ["{„key“: „CAR100"}"]}'

Dies sollte zurückgeben:

{„color“: „green“, „docType“: „PrivateCar“, „key“: "CAR100", „make“: „Peugot“, „model“: "307", „owner“: „John Doe“, „address“: „Parklane 20, Italien“}

4. Was haben wir gelernt?

Der StubHelper ist das wichtigste Werkzeug für die Interaktion mit Daten im Ledger. Es ist in der Lage, Daten hinzuzufügen, zu aktualisieren und zu löschen. Aber, kann auch helfen, Objekte im Ledger zu finden und abzufragen und sie als JSON-Objekte zurückzugeben.

Code-Cheatsheet

Hyperledger Fabric Tutorial: How to test your NodeJS chaincode using Mockstub- Part 1

Möchten Sie tiefer in Hyperledger eintauchen? Schauen Sie sich unseren Hyperledger Accelerator an

Weiter zum zweiten Teil hier:

Weitere Lesungen

Hier finden Sie die vollständige Schnittstellenimplementierung des ChainCodeStubInterface, das mit Golang kodiert ist, da Hyperledger mit dieser neuen Sprache erstellt wird.

Vollständige API-Spezifikation StubHelper.

Sammlung von Hyperledger Fabric-bezogenen Ressourcen auf Github.

Von Michiel Mulders

@michiel_mulders

Die folgende Hyperledger Fabric-Tutorialreihe besteht aus drei Artikeln, die Ihnen verschiedene Aspekte zur Entwicklung von Hyperledger Fabric-Kettencodes vermitteln, die von CRUD-Operationen, Datenschutz und Chaincode-Tests reichen. Von Michiel Mulders Ein Überblick über die Serie: Artikel 1: Grundlegende Chaincode-Entwicklung und Speicherung von privaten Daten in Sammlungen Artikel 2: Erweiterte Chaincode-Abfragen und die CouchDB GUI Artikel 3: Ein Tutorial zum Testen Ihres Chaincodes mit MockStub Anforderungen 4GB RAM (mehr wird bevorzugt) Docker, Docker- Compose, Code-Editor (zB Visual Studio Code), Git NodeJS Version 8.9 + (Bevorzugt ist 8.9.4 - ändern Sie Ihre Version mit einem Versionsmanager wie „n“) Grundlegendes JavaScript-Wissen Ziele Erstellen Sie grundlegende Chaincode-Funktionen wie das Lesen und Anhängen von Daten an das Ledger. Überprüfen Sie die erstellte Funktionalität über das Docker exec Kommando. Konfigurieren Sie private Datensammlungen. Fügen Sie Daten zu privaten Datensammlungen hinzu und rufen Sie ein aggregiertes Objekt aus dem Buch ab. Einführung: Hyperledger Fabric Tutorial In diesem ersten Artikel werden wir uns an die Hyperledger Fabric Boilerplate für NodeJS Kettencode gewöhnen, die wir in dieser Tutorial-Serie verwenden werden. Die Boilerplate wird von einem belgischen Blockchain-Beratungsunternehmen namens TheLedger.be entwickelt, vielen Dank für Open Sourcing dieses Boilerplate. Warum verwenden wir diese Boilerplate? Es macht Ihr Leben einfacher! Beispielsweise wird die Boilerplate die Antwort automatisch mit shim.success () und shim.error () umbrechen und serialisieren. Sie können einfach das JavaScript-Objekt zurückgeben und es wird den Rest erledigen. In diesem Tutorial werden wir auf die Entwicklung grundlegender CRUD-Operationen mit und ohne private Datensammlungen konzentrieren, die wir danach testen werden. Darüber hinaus geben wir Ihnen eine kurze Einführung in die Funktionsweise von Privatsammlungen. Get The Code Der Code kann auf Github michielmulders/hyperledger -fabric-blockgeeks gefunden werden. Es wird empfohlen, git clone zu verwenden, um einen lokalen Klon des Repositorys auf Ihrem Computer zu erstellen und den ersten Teil des Tutorials mit git checkout tutorial-1 Boilerplate Setup Ok zu überprüfen, damit Hyperledger Fabric nicht aus dem Blau startet... Zuerst müssen wir die erforderlichen Docker-Images ziehen, die für Fabric zum Erstellen der erforderlichen Container (Certificate Authority, Orderer, Peer, Membership Service). Der Skript-Ordner enthält ein Skript namens bootstrap.sh, das standardmäßig die Version 1.2.0 von Hyperledger Fabric ziehen wird, die die privaten Sammlungen Funktionalität unterstützt, die wir später verwenden werden. Stellen Sie sicher, dass genügend Speicherplatz auf Ihrer Festplatte und eine ordnungsgemäße Internetverbindung vorhanden ist, da die Bilder insgesamt größer als 1 GB sind. Führen Sie das Skript wie folgt aus. /scripts/bootstrap.sh Wenn wir alle erforderlichen Bilder heruntergeladen haben, können wir weiter zum Testen unserer Boilerplate bewegen, indem wir sicherstellen, dass es fehlerfrei startet. Lassen Sie uns das Skript StartFabric.sh mit ausführen. /scripts/startFabric.sh Ein erfolgreicher Abschluss - ein ausgeführtes Hyperledger Fabric-Netzwerk - sollte den Status 200 zurückgeben. Tipp: Wenn Sie das Bash-Skript (.sh) nicht ausführen können, versuchen Sie, ihm ausführbare Rechte zu geben mit: chmod + x bootstrap.sh About Private Collections Hyperledger Fabric hat dieses Konzept von SideDBs entwickelt, die private Daten enthalten, die nur für den Knoten sichtbar sind, der die SideDB besitzt. Grundsätzlich sind dies Informationen, die nicht öffentlich unter dem privaten Netzwerk geteilt wurden. In letzter Zeit hat Hyperledger dies als private Sammlungen umbenannt, die sie als integrierte „DSGVO-konforme“ Lösung betrachten. Zuvor wurde im Hyperledger-Netzwerk über die Verwendung von Kanälen Vertraulichkeit geschaffen. Das häufigste Beispiel ist die Verhandlung über einen Preis pro Kilo für einen bestimmten Fisch. Fisher A möchte Restaurant A einen Sonderpreis anbieten, weil sie enge Freunde sind. Fisher A möchte jedoch nicht, dass Restaurant B dieses günstigere Angebot mit Restaurant A sieht. Um eine sichere Kommunikation zu schaffen, werden zwei Kanäle von Fisher A zu Restaurant A und von Fisher A zu Restaurant B erstellt. , kann der Prozess der Erstellung von Kanälen in einer Fintech-Situation ziemlich komplex werden, in der wir über Tausende von Kunden sprechen, die jeweils mehrere Kanäle haben. Das ist der Grund, warum Hyperledger Fabric übermäßige Nutzung von Kanälen, da dies das Netzwerk drastisch verlangsamt, was die Leistung beeinträchtigt. Jonas Snellinckx von TheLedger erklärt, wie private Daten im Hyperledger-Netzwerk besser verwaltet werden können. „Private Daten ermöglichen es Ihnen, Datensammlungen mithilfe von Richtlinien zu erstellen, um festzulegen, welche Parteien im Kanal auf die Daten zugreifen können. Dieser Zugriff kann einfach durch Hinzufügen von Richtlinien zu den Sammlungen verwaltet werden. Dies ermöglicht es, dass einige Daten öffentlich und einige privat für einige Parteien sind.“ Bild 1: Vom Slidedeck „Privacy Enabled Ledger“ Für dieses Tutorial definieren wir Autos, die innerhalb des Fabric-Netzwerks gespeichert werden. Daten über den Eigentümer sind privat und werden daher zu einer privaten Sammlung hinzugefügt. Lassen Sie uns codieren! Hyperledger Fabric Chaincode Werfen wir einen Blick auf den aktuellen Chaincode, den Sie unter Chaincode/node/src/mychaincode .ts finden können. Die Datei enthält eine Funktion, InitLedger wird verwendet, um das Buch mit einigen Autos vorauszufüllen. Ein Autoobjekt besteht aus Marke, Modell, Farbe und Besitzer. Wenn Sie die Autoobjekte zum Buch hinzufügen, geben wir ihnen allen einen eindeutigen Schlüssel und einen Doctype, so dass es einfacher ist, sie abzurufen. for (let i = 0; i cars.length; i + +) {const car: any = cars [i]; car.docType = 'car'; //car.key = `CAR ${i} `; warten StubHelper.putState ('+ i, car); is.logger.info (' Hinzugefügt — ', Auto);} 1. Neues Auto erstellen Lassen Sie uns eine Funktion codieren, die ein neues Autoobjekt im Weltzustand von Hyperledger erstellt. Die Funktion akzeptiert ein Array von Strings, aber nur das erste Element im Array enthält ein stringifiziertes JSON-Objekt. Wir verwenden eine Hilfsfunktion, um Argumente mit Yup leicht zu überprüfen. Neben der Überprüfung von Argumenten kann es auch Ihre Argumente von der Zeichenfolge in Ihr erforderliches Datenformat analysieren. Yup analysiert das stringifizierte JSON-Objekt gemäß dem bereitgestellten Schema, das wir mit yup.object () .shape ({my-object} definiert haben. async createCar (StubHelper: StubHelper, args: string []) {const verifiedArgs = await helpers.checkArgs (args [0], yup.Object () .shape ({key: yup.String) .required (), make: yup.String (). required (), model: yup.String () .required (), color: yup.String () .required (), owner: yup.String () .required (),});...} Als nächstes können wir dieses formatierte Objekt (VerifiedArgs Konstante) verwenden, um ein neues Autoobjekt zu bauen. Vergessen Sie nicht, den Doctype hinzuzufügen. Das Objekt ist nun bereit, an das Buch angehängt zu werden. Lassen Sie uns den StubHelper verwenden, der alle Funktionen für die Interaktion mit dem Sachkonto enthält, wie das Abrufen, Hinzufügen, Aktualisieren und Löschen von Daten. async createCar (StubHelper: StubHelper, args: string []) {const verifiedArgs = await helpers.checkArgs (args [0], yup.Object () .shape ({key: yup.String)) .erforderlich (), make: yup.string () .required (), model: yup.string () .required (), farbe: yup.string () .required (), besitzer: yup.string () .required (),}); let car = {docType: 'car', make: verifiedArgs.make, model: verifieDargs.model, color: verifieDargs.color, owner: VerifieDargs.color, owner: ifiedArgs.Owner, key: verifiedArgs.key,}; warten StubHelper.putState (VerifiedArgs.key, car);} Die Funktion PutState akzeptiert einen Schlüssel und ein Objekt, das im Buch gespeichert werden soll. Die PutState-Funktion, die wir hier verwenden, ist eine Wrapper-Funktion, da das Ledger nur Byte-Arrays und nicht JSON-Objekte speichern kann. Der StubHelper tut die Magie für uns, die ursprüngliche Implementierung kann unter ChainCodeStubInterface.putState gefunden werden. 1.1 Validieren Addition Of Car Wir werden Docker verwenden, um einen Befehl innerhalb des Containers des Peers auszuführen, da der Peer die neueste Version des Chaincodes enthält. Um dem Peer diese aktualisierte Version zu geben, starten wir das Hyperledger Fabric-Netzwerk mit neu. /scripts/StartFabric.sh. Warum dieses Skript verwenden? Es wird schneller ausgeführt, da es nur den Kettencode auf den Peers ersetzen und nicht das gesamte Netzwerk neu starten wird. Öffnen Sie ein Terminal und führen Sie den folgenden Befehl aus: docker exec cli peer chaincode invoke -C mychannel -n fabcar -c '{„function“: „createCar“, „Args“: [„{“ key „:“ CAR100", „make“: „Peugot“, „model“: "307", „color“: ", „green“, „owner“: „:“: „:“: „:“: ", „John Doe“, „John Doe“} „}“} "' Dieser Befehl sendet einen neuen Transaktionsvorschlag an der Peer, der in den Weltzustand des Sachbuchs aufgenommen werden soll. Wir nennen unsere „CreateCar“ -Funktion und wir fügen ein stringifiziertes JSON-Objekt mit Schlüssel "CAR100" als ersten Parameter in unserem Array von Strings hinzu. Wir müssen die doppelten Anführungszeichen des JSON-Objekts entkommen, um es an unseren Chaincode zu übergeben. Beachten Sie die Verwendung des Schlüsselworts invoke. Es ist wichtig, den Unterschied zwischen Aufrufen und Abfrage zu kennen. Das Schlüsselwort invoke wird verwendet, wenn wir versuchen, Daten in das Buch zu ändern oder hinzuzufügen, während das Abfrage-Schlüsselwort nur verwendet wird, wenn Informationen aus dem Ledger abgerufen werden. Die erfolgreiche Ausführung des Docker-Befehls sollte ein "result: status: 200" zurückgeben. 2. Daten aus Ledger lesen Um Daten aus dem Buch zu lesen, können wir nach einem bestimmten Schlüssel suchen. Lassen Sie uns für das neu erstellte Auto-Objekt mit Schlüssel "CAR100" suchen. Wir beginnen erneut mit der Validierung der Argumente, die wir in unserem Kettencode erhalten, dieses Mal akzeptieren wir nur einen Schlüssel. Als nächstes verwenden wir die GetStateAsObject -Funktion, um ein JSON-Objekt aus dem Ledger für einen angegebenen Schlüssel abzurufen. Es ist möglich, dass der Schlüssel nicht existiert. In diesem Fall können wir einen benutzerdefinierten Fehler mit NotFoundError auslösen, der Teil der Fabric-Chaincode-utils ist. Wir importieren am Anfang der Datei, wie der StubHelper. async QueryCar (StubHelper: StubHelper, args: string []): Promise {const verifiedArgs = await helpers.checkArgs {key: string}, Yup.Object (). shape ({key: yup.string () .required (),})); const car = warten StubHelper.getStateAsObject (verifiedArgs.key); if (! car) {throw new notFoundError ('Auto existiert nicht');} return car;} 2.1 Validierung Query Car Function Verwenden Sie den folgenden Docker Befehl, um nach Auto mit Schlüssel "CAR100" abzufragen, beachten Sie die Verwendung des Suchschlüsselworts in diesem Befehl. docker exec cli peer chaincode query -C mychannel -n fabcar -c '{„function“: "queryCar „,“ Args „: [“ {„key“: "CAR100"}"]} '3 Private Sammlungen Um zu beginnen, benötigen wir zunächst eine Sammlungen Konfigurationsdatei collections_config.json, die den Namen und die Richtlinie der Sammlung enthält. Die Richtlinie ist ähnlich einer Unterstützung, dies ermöglicht es uns, die bereits vorhandene Richtlinienlogik wie OR, AND,... Operatoren zu verwenden. 3.1 Private Collection Configuration Eine private Sammlung besteht aus einem Namen und einer Richtlinie, andere Eigenschaften sind außerhalb des Geltungsbereichs für dieses Tutorial und sind für das Hyperledger-Netzwerk optimiert. Wir verwenden eine Sammlung namens „PrivateCarCollection“ mit einer Richtlinie, bei der nur ein Mitglied einer Organisation die Transaktion validieren muss. und nbsp [{„name“: „privateCarCollection“, „policy“: „OR ('org1msp.member', 'org2msp.member')“, „requiredPeerCount“: 0, „MaxPeerCount“: 3, „1000ToLive“: 000}] 3.2 Hinzufügen Daten zu Privatsammlung Jetzt haben wir unsere private Sammlung, lassen Sie uns dies in unserem Code verwenden. Es ist keine große Aufgabe, dem StubHelper mitzuteilen, die Daten in einer privaten Sammlung zu speichern, anstatt sie über das Netzwerk zu verbreiten. warten StubHelper.putState (VerifiedArgs.key, car, {privateCollection: 'privateCarCollection'}); Lassen Sie uns unseren Code etwas ändern, um nur den Autobesitzer und seine Adresse im privaten Autokollektion. Denken Sie daran, den gleichen Schlüssel zu diesem neuen privaten Auto-Objekt hinzuzufügen, um es einfacher zu machen, das vollständige Objekt abzurufen. Außerdem werden wir den Yup-Objekt-Validator ändern, um nur einen Schlüssel, eine Adresse und Eigentümereigenschaft zu akzeptieren. Als Best Practice ändern wir den Doctype in „PrivateCar“. async createPrivateCar (StubHelper: StubHelper, args: string []) {const verifiedArgs = await helpers.checkArgs (args [0], yup.object () .shape ({key: yup.string () .required (), address: yup.string () .required () .string () .string () .required () .string () .required () .required () .string () .required () .required () .required () .string () .required () .required () (), Besitzer: yup.string () .required (),})); let car = { DocType: 'PrivateCar', Adresse: VerifieDargs.Address, Besitzer: VerifieDargs.Owner, Schlüssel: VerifieDargs.Key,}; warten StubHelper.putState (VerifiedArgs.Key, car, {PrivateCollection: 'PrivateCarCollection'});} 3.3 Aggregiertes Auto abfragen Um das aggregierte Autoobjekt zu erstellen, werden wir beide Hyperledger und die private Datenerhebung, die unseren Autobesitzer und die Adresse enthält. Lassen Sie uns zunächst das öffentliche Auto abrufen mit: let publicCar = await StubHelper.getStateAsObject (verifiedArgs.key); Als nächstes können wir die privaten Autodaten auf die gleiche Weise abfragen: let PrivateCar = await StubHelper.getStateAsObject (VerifiedArgs.key, {PrivateCollection: 'PrivateCarCollection'})) Lassen Sie uns endlich die aggregiertes Autoobjekt. Wir verwenden die Objektverteilung (drei Punkte „...“), die eine ECMAScript 2018 Methode ist, die alle Eigenschaften jedes Objekts und führt es zu einem neuen Objekt. async QueryAggregatedCar (StubHelper: StubHelper, args: string []): Promise {const verifiedArgs = await helpers.checkArgs {key: string} (args [0], yup.object () .shape ({key: yup.string () .required (),}),}) lassen; let Auto = warten StubHelper.getStateAsObject (verifiedArgs.key); if (! publicCar) {throw new notFounError ('Auto existiert nicht');} let privateCar = await StubHelper.getStateAsObject (verifiedArgs.key, {PrivateCollection: 'PrivateCarCollection'}); const car = {... publicCar,... PrivateCar}; return car;} 3.4 Aggregierte Abfrage validieren Bei bullet 1.1 in diesem Tutorial haben wir eine Neuwagen mit Schlüssel "CAR100". Verwenden wir diesen Schlüssel, um ein neues privates Datenobjekt über den Docker exec Befehl zu erstellen. docker exec cli peer chaincode invoke -C mychannel -n fabcar -c '{„function“: „createPrivateCar“, „Args“: ["{„key“: "CAR100", „address“: „Parklane 20, Italy“, „owner“: „John Doe“} "]' Jetzt haben wir sowohl die Öffentlichkeit als Privatautoobjekt, lassen Sie uns den aggregierten Aufruf so versuchen. Denken Sie daran, das Abfrage-Schlüsselwort zu verwenden, da wir nur Daten abrufen. docker exec cli peer chaincode query -C mychannel -n fabcar -c '{„function“: „queryAggregatedCar“, „Args“: ["{„key“: „CAR100"} „]}' Dies sollte zurückgeben: {“ color „:“ green „,“ docType „:“: „:“ PrivateCar "„CAR100“, „make“: „Peugot“, „model“: "307"," Eigentümer „:“ John Doe „,“ address „:“ Parklane 20, Italien "} 4. Was haben wir gelernt? Der StubHelper ist das wichtigste Werkzeug für die Interaktion mit Daten im Ledger. Es ist in der Lage, Daten hinzuzufügen, zu aktualisieren und zu löschen. Aber, kann auch helfen, Objekte im Ledger zu finden und abzufragen und sie als JSON-Objekte zurückzugeben. Code Cheatsheet Möchten Sie tiefer in Hyperledger eintauchen? Schauen Sie sich unseren Hyperledger Accelerator Weitere Lesungen Hier finden Sie die vollständige Schnittstellenimplementierung der ChainCodeStubInterface, die mit Golang kodiert ist, da Hyperledger mit dieser neuen Sprache erstellt wird. Vollständige API-Spezifikation StubHelper. Sammlung von Hyperledger Fabric-bezogenen Ressourcen auf Github. Von Michiel Mulders @michiel_mulders

Like what you read? Give us one like or share it to your friends and get +16

268
Hungry for knowledge?
New guides and courses each week
Looking to invest?
Market data, analysis, and reports
Just curious?
A community of blockchain experts to help

Get started today

Already have an account? Sign In