© LuckyStep/Shutterstock.com
Hyperledger Fabric - smarte Programmiersprache für smarte Verträge

Smart Contracts mit .NET Core


Hyperledger Fabric, eine von der Linux Foundation unterstütze Blockchain, erlaubt das Entwickeln von Smart Contracts in Go, Node.js und Java. Mit einem experimentellen Paket lassen sich die Smart Contracts auch in .NET entwickeln. Dank .NET Core können die Smart Contracts via Docker – dem Deploymentmodell von Hyperledger Fabric – gestartet werden. In diesem Artikel wollen wir die Entwicklung von Smart Contracts mit C# genauer beleuchten.

Hyperledger Fabric [1] ist eine unter dem Dachverband Hyperledger mit Go entwickelte Open Source Blockchain [2]. Hyperledger selbst wurde Ende 2015 von der Linux Foundation gegründet. Unter dem Dachverband werden Open Source Blockchains und dazu passende Tools entwickelt. Große Unternehmen wie Intel, IBM, Cisco oder Red Hat unterstützen Hyperledger. Dabei wird nicht nur der Ansatz einer Blockchain, sondern vielmehr verschiedener Blockchain-Plattformen verfolgt.

Genauer handelt es sich bei Hyperledger Fabric (kurz: Fabric) um eine Technologie für Permissioned Blockchains bzw. private Blockchains – also eine Blockchain, die nicht wie Ethereum oder Bitcoin für alle öffentlich, sondern nur bestimmten Teilnehmern zugänglich ist. Dadurch können wir bei diesen Arten von Netzwerken das klassische Mining (Proof of Work, PoW) vernachlässigen. Vielmehr kommt hier der Konsens über Proof of Authority (PoA) (Kasten: „Proof of Authority“) zum Tragen.

Proof of Authority (PoA)

Entgegen dem klassischen Mining (Proof of Work), das darauf beruht, dass ein Miner ein kryptografisches Rätsel in Form einer Hash-Berechnung löst, existieren bei Proof of Authority (PoA) sogenannte Validator Nodes (oder auch Authorities, als eher physische Entität), denen die Erzeugung von neuen Blöcken erlaubt ist. Wenn die Mehrzahl von Validator Nodes in einem Netzwerk der Erzeugung des neuen Blocks zustimmen, wird dieser ein permanenter Teil des Netzwerks. Vorteil hierbei ist, dass keine CPU-Zeit zur Lösung des kryptografischen Rätsels benötigt wird, eine bessere Performanz erreicht wird und dadurch eine höhere Transaktionsgeschwindigkeit erzielt werden kann. Daher eignet sich PoA für das Enterprise-Umfeld.

Anstelle einer Domänensprache bietet Fabric die Entwicklung von Smart Contracts – oder auch Chaincode, wie das im Hyperledger-Umfeld genannt wird – in den Sprachen Java, Go und JavaScript (via Node.js) an, experimentell kann auch .NET verwendet werden. Folgend werden wir einen Chaincode mit C# entwickeln, der das Standardbeispiel FabCar von Hyperledger implementiert. FabCar dient der Zuordnung von Autos zu ihrem Besitzer. Schreibend erlaubt der Chaincode sowohl das Anlegen eines neuen Eintrags (z. B.: Hat jemand ein neues Auto gekauft?) als auch den Wechsel des Besitzers. Lesend können die Informationen über ein bestimmtes Auto oder eine Liste aller Autos erlangt werden.

Vorbereitungen für das Netzwerk

Bevor wir mit der Entwicklung starten können, benötigen wir ein Hyperledger-Fabric-Netzwerk. Hierbei bietet sich das Chaincode Developer Network (Dev-Netzwerk) an. Normalerweise muss der Chaincode bei einer Änderung deployt und danach instanziiert werden. Bei diesem Vorgang wird von einem Fabric Peer ein Docker-Container mit dem Chaincode gestartet. Dieser Vorgang nimmt durchaus einige Zeit in Anspruch, was die Entwicklung sehr langsam machen würde. Durch das Dev-Netzwerk können wir diesen Vorgang deutlich verkürzen, da wir den Chaincode außerhalb der Docker-Umgebung von Fabric starten.

Auf der Fabric-Website Prerequisites [3] ist beschrieben, welche Software benötigt wird. Windows-Nutzer sollten auf jeden Fall einen Blick auf die Seite werfen, da noch einige zusätzliche Software installiert werden muss. Linux- und Mac-User benötigen nur Folgendes:

  • Docker (>= 17.06.2)

  • .NET Core SDK

  • IDE nach Wahl für .NET Core (bspw. VS Code oder JetBrains Rider)

Ist die Software installiert, muss das Repository fabric-samples [4] geklont werden. Mit einer Kommandozeile innerhalb von fabric_samples muss folgender Befehl [5] ausgeführt werden:

curl -sSL http://bit.ly/2ysbOFE | bash -s 1.2.0

Er lädt alle benötigten Docker-Images und Binaries für die Zielplattform mit der (zum Zeitpunkt des Schreibens) aktuellen Hyperleder-Fabric-Version 1.2.0 herunter.

Wurde der Befehl erfolgreich ausgeführt, wechseln wir in das Verzeichnis chaincode-docker-devmode und öffnen die Datei docker-compose-simple.yaml. Dort finden wir den Eintrag peer: auf Root-Ebene und fügen unter ports: eine weitere Zeile mit dem Inhalt 7052:7052 hinzu. Hierbei bitte auf die Einrückung achten, sodass sie genau wie die anderen Ports aussieht. Die fertige Eintragung sollte daher wie in Listing 1 aussehen.

Listing 1

peer: # Zur besseren Lesbarkeit wurden die anderen Attribute entfernt ports: - 7051:7051 - 7052:7052 - 7053:7053

Dieser Port öffnet die Schnittstelle für unseren Chaincode, sodass er außerhalb der Docker-Umgebung gestartet und verbunden werden kann. Mit folgendem Befehl auf der Kommandozeile können wir das Netzwerk starten:

docker-compose -f docker-compose-simple.yaml up

Nach einer kurzen Initialisierungsphase sollte das Fabric-Dev-Netzwerk fehlerfrei (sprich ohne Fehlermeldungen in der Logausgabe) gestartet sein. Jetzt können wir mit der Entwicklung unseres Chaincodes beginnen.

Entwicklungsmodelle

Die aktuelle Version der Bibliothek zur Entwicklung von Chaincode bietet zwei Entwicklungsmodelle an. Zum einen ein Low-Level-Modell (Chaincode API), das dem Entwickler die maximale Freiheit zur Entwicklung bietet, aber auch die größte Verantwortung zur fehlerfreien Umsetzung. Zum anderen ein High-Level-Modell (Contract API), das dem Entwickler erlaubt, sich auf die Umsetzung seines Business-Use-Case zu konzentrieren und etwas Verantwortung an das Framework abzugeben. Innerhalb des Artikels werden wir nur mit dem Contract API – also dem High-Level-Modell – arbeiten.

Zunächst erstellen wir ein neues .NET-Core-Konsolenprojekt, entweder über die Templates in JetBrains Rider oder via dotnet new console in einer Kommandozeile. Danach öffnen wir die dazugehörige *.csproj-Datei, finden die erste <PropertyGroup> und fügen dort den Eintrag <LanguageLevel>7.3</LanguageLevel> hinzu. Falls dieser Eintrag bereits existiert, können wir ihn einfach überschreiben. Mit dem Eintrag stellen wir unser Projekt auf die aktuellste Sprachversion von C# um, damit wir später eine asynchrone Main()-Methode verwenden können.

Wieder auf der Kommandozeile führen wir folgenden Befehl zur Installation der Bibliothek zur Chaincode-Entwi...

Neugierig geworden?

Angebote für Teams

Für Firmen haben wir individuelle Teamlizenzen. Wir erstellen Ihnen gerne ein passendes Angebot.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang