Die Blockchain in 9 Schritten – Teil 1:
Die Blockchain-Idee basiert auf verketteten Listen und ist unter Java programmiertechnisch sehr einfach umzusetzen. Da der Programmcode in den nächsten Schritten deutlich umfangreicher wird, teile ich einzelne Programmteile in Klassen auf. Fangen wir mit der einfachsten Klasse namens „Block“ an. Sie enthält die Basis für alle weiteren Schritte:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
package net.bplaced.javacrypto.blockchain.step1; /* * Diese Klasse gehört zu BlockChain.java * This class belongs to BlockChain.java */ public class Block { public int number; public int previousNumber; private String data; //Block Constructor. public Block(int number, int previousNumber, String data) { this.number = number; this.previousNumber = previousNumber; this.data = data; } } |
Der Daten-„Block“ enthält nur drei Elemente: die (aktuelle) Nummer, die vorige Nummer und die gespeicherten Daten. Nun benötigen wir noch das Hauptprogramm, welches diese Klasse benutzt: BlockChain. Damit die Daten für uns besser (strukturiert) angezeigt werden benötigen wir noch eine Hilfsbibliothek, nämlich einen JSON-Viewer. Ich benutze hier das Modul von Google mit dem Namen GSON-Viewer, den Ihr unter dem folgenden Link herunterladen könnt: https://mvnrepository.com/artifact/com.google.code.gson/gson
Nun kann es losgehen mit unserer einfachen Blockchain:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
package net.bplaced.javacrypto.blockchain.step1; /* * Herkunft/Origin: http://javacrypto.bplaced.net/ * Programmierer/Programmer: Michael Fehr * Copyright/Copyright: frei verwendbares Programm (Public Domain) * Copyright: This is free and unencumbered software released into the public domain. * Lizenztext/Licence: <http://unlicense.org> * getestet mit/tested with: Java Runtime Environment 8 Update 191 x64 * getestet mit/tested with: Java Runtime Environment 11.0.1 x64 * Datum/Date (dd.mm.jjjj): 28.05.2019 * Projekt/Project: Blockchain * Funktion: Schritt 1: die einfachste Blockchain * Function: Step 1: the simplest blockchain * * Sicherheitshinweis/Security notice * Die Programmroutinen dienen nur der Darstellung und haben keinen Anspruch auf eine korrekte Funktion, * insbesondere mit Blick auf die Sicherheit ! * Prüfen Sie die Sicherheit bevor das Programm in der echten Welt eingesetzt wird. * The program routines just show the function but please be aware of the security part - * check yourself before using in the real world ! * * Das Programm benötigt die nachfolgende Bibliothek: * The programm uses this external library: * jar-Datei: https://mvnrepository.com/artifact/com.google.code.gson/gson * * Das Projekt basiert auf dem nachfolgenden Artikel: * The project is based on this article: * https://medium.com/programmers-blockchain/create-simple-blockchain-java-tutorial-from-scratch-6eeed3cb03fa */ import java.util.ArrayList; import com.google.gson.GsonBuilder; public class BlockChain { public static ArrayList<Block> blockchain = new ArrayList<Block>(); public static void main(String[] args) { System.out.println("I01 BlockChain für Anfänger Stufe 01"); int blockNumber; System.out.println("\nAnzahl Einträge in der blockchain:" + blockchain.size()); // datensatz 1 blockNumber = 1; System.out.println("\nErgänze Block " + blockNumber); addBlock(new Block(blockNumber, (blockNumber - 1), "Data " + blockNumber)); // genesis block // daten der blockchain System.out.println("Anzahl Einträge in der blockchain:" + blockchain.size()); System.out.println("Inhalt der BlockChain:\n" + getJson(blockchain)); // datensatz 2 blockNumber = 2; System.out.println("\nErgänze Block " + blockNumber); addBlock(new Block(blockNumber, (blockNumber - 1), "Data " + blockNumber)); // daten der blockchain System.out.println("Anzahl Einträge in der blockchain:" + blockchain.size()); System.out.println("Inhalt der BlockChain:\n" + getJson(blockchain)); } public static void addBlock(Block newBlock) { blockchain.add(newBlock); } public static String getJson(Object o) { return new GsonBuilder().setPrettyPrinting().create().toJson(o); } } |
Was macht dieses Programm mit unserer Klasse „Block“: im unteren Bereich ist die Methode addBlock zu sehen, welche dafür sorgt, dass der bestehenden Kette ein weiteres Glied hinzugefügt wird. Die zweite Methode dient der einfachen Anzeige der Blockchain.
Das Programm selber baut die einzelnen Einträge der Reihe nach auf – zuerst wird der Startblock (genesis block) erzeugt: Er trägt die Blocknummer 1, der vorige Datenblock ist demnach mit der Zahl „0“ belegt und das Datenfeld enthält nur den Text „Data 1“.
Nun wird der zweite Eintrag erzeugt: die Blocknummer ist „2“ und der vorige Datenblock enthält „1“ – das Datenfeld enthält nun „Data 2“.
Das war es schon für die Erzeugung unserer ersten Blockchain – seht Euch das Ergebnis in der Konsole an:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
I01 BlockChain für Anfänger Stufe 01 Anzahl Einträge in der blockchain:0 Ergänze Block 1 Anzahl Einträge in der blockchain:1 Inhalt der BlockChain: [ { "number": 1, "previousNumber": 0, "data": "Data 1" } ] Ergänze Block 2 Anzahl Einträge in der blockchain:2 Inhalt der BlockChain: [ { "number": 1, "previousNumber": 0, "data": "Data 1" }, { "number": 2, "previousNumber": 1, "data": "Data 2" } ] |
Ich hoffe das Ihr nun nicht enttäuscht seid – das ist wirklich das ganze Basiswissen zum Thema Blockchain. Leider hat diese „Standard-Verkettete Liste“ einen großen Nachteil: wir könnten einzelne Datenblöcke nach Belieben verändern ohne das es bemerkt werden kann.
Daher werden wir nun diese Basis-Blockchain nach und nach in Richtung eines eigenen Krypto-Geldes weiterentwickeln – schaut Euch den zweiten Teil an: I02 Blockchain mit Hashwerten.
Alle Quellcodes zur Blockchain findet Ihr zum Download in meinem Github-Repository, welches Ihr über diesen Link erreicht: https://github.com/java-crypto/I-Blockchain. Alle Programme sind sowohl unter Java 8 als auch unter Java 11 lauffähig.
Die Lizenz zum obigen Beispiel findet Ihr auf der eigenen Lizenz-Seite.
Letzte Aktualisierung: 28.05.2019