jblockchain

Einfache Blockchain-Implementierung für Demonstrationszwecke

license

jblockchain ist ein minimalistisches System um die Prinzipien einer verteilten Blockchain im Detail zu erläutern. Die Implementierung ist keinewegs auf optimale Performanz ausgelegt und verfolgt auch nur einen naiven Ansatz eines verteilten Systems. Im Vordergrund steht ein übersichtlicher Code und nicht alle Randfälle, Raceconditions und Sicherheit abzudecken.

Starten

Da es sich um eine Spring Boot-Applikation handelt, genügt es das Projekt zu klonen und mit maven zu bauen.

cd jblockchain
./mvnw package

Anschließend werden drei Module gebaut:

Der Node wird einfach durch Ausführung der jar-Datei gestartet und kontaktiert anschließend den konfigurierten Master-Node um alle erforderlichrn Daten herunterzuladen.

java -jar node/target/node-0.0.1-SNAPSHOT.jar

Interagieren

Nun können einfach die entsprechenden REST-Aufrufe getätigt werden um Aktionen auszulösen. Damit die JSON-Struktur nicht von Hand aufgebaut werden muss, kann sich mit dem Kommandozeilen-Client beholfen werden.

Zu Beginn kann eine eigene Adresse angelegt werden. Dafür wird ein Private-Public-Keypair benötigt.

cd client/target
java -jar client-0.0.1-SNAPSHOT.jar --keypair

Daraufhin werden die Dateien key.priv und key.pub erstellt. Mit dem öffentlichen Schlüssel kann nun die Adresse für Max Mustermann werden. Der kontaktierte Node auf localhost wird die neue Adresse an alle bekannten Nodes übermitteln.

java -jar client-0.0.1-SNAPSHOT.jar --address --node "http://localhost:8080" --name "Max Mustermann" --publickey key.pub

Unter der Resource http://localhost:8080/address kann kontrolliert werden, dass die Adresse im System angekommen ist. Für den nächsten Schritt wird dort der Hash der erzeugten Adresse entnommen. Denn um eine Transaktion zu erstellen, muss die Sender-Adresse über den Hash identifiziert werden.

java -jar client-0.0.1-SNAPSHOT.jar --transaction --node "http://localhost:8080" --sender "Tdz0bKDfca3QjFAe5Ccuj9Noy6ah8n+R8DnZznvjic4=" --message "Hallo Welt" --privatekey key.priv 

Die Resource http://localhost:8080/transaction listet nun die neue Transaktion mit der Nachricht "Hallo Welt", welche mit dem privaten Schlüssel signiert wurde, im Transaktions-Pool.

Mining

Damit die Transaktionen im Pool ein Teil der Blockchain werden können, müssen diese in einem Block eingebunden werden. Diese Aufgaube wird kontinuierlich durch die Miner verfolgt.

Um das Mining auf dem lokalen Node anzustoßen, genügt ein Aufruf von http://localhost:8080/block/start-miner. Sobald ein valider Block gefunden wird, werden die im Block eingebetteten Transaktionen aus dem Pool entfernt und der Block an die Blockchain angehängt: http://localhost:8080/block.