Fabric Chaincode in Javascript programmieren

Mit dem Erscheinen von Fabric 1.1 kann man nun Chaincode in Javascript schreiben. Lass uns mal schauen, wie das geht.
Voraussetzungen
- cURL
- Docker & Docker Compose
- git
Setup
Richte dir ein Fabric Netzwerk ein, bspw. unsere minimale Fabric Entwicklungsumgebung.
Chaincode programmieren
Fabric chaincode besteht immer mindestens aus den folgenden beiden Methoden:
- Init(): Wird aufgerufen, wenn der Chaincode im Blockchain netzwerk instantiert wird
- Invoke(): Invoke behandelt alle Zugriffe auf deine Applikation
Version 0.0.1 – Grundlegendes Beispiel
Diese Klasse enthält die Basismethoden init und invoke sowie einfache Methoden um die Daten zu initalizieren und abzufragen. Hier den Quellcode herunterladen.
let Example = class { async Init(stub) { ..... } async Invoke(stub) { .... } async initLedger(stub, args) { ..... } async queryAll(stub, args) { ..... } }; shim.start(new Example());
Chaincode deployen
Wenn Du unsere minimale Entwicklungsumgebung nutzt, dann führst Du die Befehle direkt auf dem einen Knoten aus. Wenn Du mehrere Knoten nutzt, führe die Befehle bitte im cli-container aus, damit es auf allen Knoten entsprechend funktioniert. (Hier kannst Du den Quellcode herunterladen)
1. Installation deines Chaincodes im Netzwerk
docker exec peer0.org1.fabric.basic.network.com peer chaincode install -n example -v 0.0.1 -l node -p /chaincode/node/examples/0.0.1
Erwartete Ausgabe:
DEBU 00d Installed remotely response:<status:200 payload:"OK" >
2. Instanzieren deines Chaincodes
docker exec peer0.org1.fabric.basic.network.com peer chaincode instantiate -l node -n example -v 0.0.1 -C fabricchannel -c '{"Args":["init"]}'
«Instantiate» generiert eine Laufzeitumgebung in Form eines Docker Containers. Folgendes sollte im Log dieses Laufzeitcontainer stehen:
=========== Instantiated example chaincode ===========
Chaincode ausführen
Beispiel: Daten initalisieren
docker exec peer0.org1.fabric.basic.network.com peer chaincode invoke -C fabricchannel -n example -c '{"function":"initLedger","Args":[""]}'
Erwartete Ausgabe im Terminal:
Chaincode invoke successful. result: status:200
Erwartete Ausgabe im Laufzeitcontainer (schau in den Logs nach oder nutze bspw. Kitemagic):
============= START : Initialize Ledger =========== Added <--> { name: 'Example 0', value: '101', docType: 'example' } Added <--> { name: 'Example 1', value: '202', docType: 'example' } Added <--> { name: 'Example 2', value: '303', docType: 'example' } ============= END : Initialize Ledger ===========
Beispiel: Daten abfragen
docker exec peer0.org1.fabric.basic.network.com peer chaincode query -C fabricchannel -n example -c '{"function":"queryAll","Args":[""]}'
Erwartete Ausgabe im Laufzeitcontainer (schau in den Logs nach):
[ { Key: 'EXAMPLE0', Record: { name: 'Example 0', value: '101', docType: 'example' } }, { Key: 'EXAMPLE1', Record: { name: 'Example 1', value: '202', docType: 'example' } }, { Key: 'EXAMPLE2', Record: { name: 'Example 2', value: '303', docType: 'example' } } ]
Chaincode aktualisieren
Version 0.0.2 – Erweitertes Beispiel
Wir erweitern unser Beispiel um eine Methode um einzelne Datensätze abzufragen. Hier den Quelltext herunterladen.
async queryExample(stub, args) { .... }
Chaincode aktualisieren
1.Installieren den neuen Version
docker exec peer0.org1.fabric.basic.network.com peer chaincode install -n example -v 0.0.2 -l node -p /chaincode/node/examples/0.0.2
2. Aktualisieren auf die neue Version
docker exec peer0.org1.fabric.basic.network.com peer chaincode upgrade -n example -v 0.0.2 -C fabricchannel -l node -c '{"Args":[""]}'
Aktualisiereten Chaincode ausführen
docker exec peer0.org1.fabric.basic.network.com peer chaincode query -C fabricchannel -n example -c '{"function":"queryExample","Args":["EXAMPLE1"]}'
Erwartete Ausgabe im Laufzeitcontainer (schau in den Logs nach):
{ fcn: 'queryExample', params: [ 'EXAMPLE1' ] } Example {} queryExample {"name":"Example 1","value":"202","docType":"example"}
Dieses Beispiel basiert auf den Hyperledger fabric-samples