Die Blockchain in 9 Schritten – Teil 3:
In Teil 2 haben wir vollmundig die Sicherung der Datensätze durch eine Hashwert-Berechnung versprochen, allerdings fehlt noch die Möglichkeit einer Überprüfung innerhalb des Programms. Dieses holen wir jetzt nach und erstellen im Hauptprogramm die Methode „blockchainIsValid“. Da die Klasse „Block“ unverändert geblieben ist findet Ihr den Sourcecode am Ende dieser Seite. Weiterhin wurden die beiden Methoden „generateSha256“ und „getJson“ nun in eine neue Klasse namens „StringUtil“ ausgelagert; der Quellcode steht ebenfalls am Ende dieser Seite.
Hier nun das erweiterte Hauptprogramm:
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 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 |
package net.bplaced.javacrypto.blockchain.step3; /* * 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 3: Validierung der Blockchain * Function: Step 3: validating the 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.io.UnsupportedEncodingException; import java.security.NoSuchAlgorithmException; import java.util.ArrayList; public class BlockChain { public static ArrayList<Block> blockchain = new ArrayList<Block>(); public static void main(String[] args) throws NoSuchAlgorithmException, UnsupportedEncodingException { System.out.println("I03 BlockChain für Anfänger Stufe 03"); 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("0", "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" + StringUtil.getJson(blockchain)); System.out.println("Ist die blockchain gültig:" + blockchainIsValid()); // datensatz 2 blockNumber = 2; System.out.println("\nErgänze Block " + blockNumber); addBlock(new Block(blockchain.get(blockchain.size() - 1).hash, "Data " + blockNumber)); // daten der blockchain System.out.println("Anzahl Einträge in der blockchain:" + blockchain.size()); System.out.println("Inhalt der BlockChain:\n" + StringUtil.getJson(blockchain)); System.out.println("Ist die blockchain gültig:" + blockchainIsValid()); // manipulation von datensatz 2 System.out.println("\nManipuliere Block " + blockNumber); Block block02 = blockchain.get(blockNumber-1); block02.data = "Daten manipuliert"; // daten der blockchain System.out.println("Anzahl Einträge in der blockchain:" + blockchain.size()); System.out.println("Inhalt der BlockChain:\n" + StringUtil.getJson(blockchain)); System.out.println("Ist die blockchain gültig:" + blockchainIsValid()); } public static void addBlock(Block newBlock) { blockchain.add(newBlock); } public static Boolean blockchainIsValid() { Block currentBlock; Block previousBlock; for (int i = 1; i < blockchain.size(); i++) { currentBlock = blockchain.get(i); previousBlock = blockchain.get(i - 1); if (!currentBlock.hash.equals(currentBlock.calculateHash())) { return false; } if (!previousBlock.hash.equals(currentBlock.previousHash)) { return false; } } return true; } } |
Ich verändere mutwillig den zweiten Datensatz und das Programm erkennt die Veränderung anhand des falschen Hashwertes.
Hier ist Ausgabe auf der Konsole:
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 |
I03 BlockChain für Anfänger Stufe 03 Anzahl Einträge in der blockchain:0 Ergänze Block 1 Anzahl Einträge in der blockchain:1 Inhalt der BlockChain: [ { "hash": "3c5ca0a5c6aca9a360b75eb35c3d4d8df08141af41cf77944392f9f18ac216ca", "previousHash": "0", "timeStamp": 1559055246639, "data": "Data 1" } ] Ist die blockchain gültig:true Ergänze Block 2 Anzahl Einträge in der blockchain:2 Inhalt der BlockChain: [ { "hash": "3c5ca0a5c6aca9a360b75eb35c3d4d8df08141af41cf77944392f9f18ac216ca", "previousHash": "0", "timeStamp": 1559055246639, "data": "Data 1" }, { "hash": "1b4b8635868d3748df974549e8644bdbc9d96787b518439a6bf245970adbef97", "previousHash": "3c5ca0a5c6aca9a360b75eb35c3d4d8df08141af41cf77944392f9f18ac216ca", "timeStamp": 1559055246758, "data": "Data 2" } ] Ist die blockchain gültig:true Manipuliere Block 2 Anzahl Einträge in der blockchain:2 Inhalt der BlockChain: [ { "hash": "3c5ca0a5c6aca9a360b75eb35c3d4d8df08141af41cf77944392f9f18ac216ca", "previousHash": "0", "timeStamp": 1559055246639, "data": "Data 1" }, { "hash": "1b4b8635868d3748df974549e8644bdbc9d96787b518439a6bf245970adbef97", "previousHash": "3c5ca0a5c6aca9a360b75eb35c3d4d8df08141af41cf77944392f9f18ac216ca", "timeStamp": 1559055246758, "data": "Daten manipuliert" } ] Ist die blockchain gültig:false |
Der Vollständigkeit halber hier die beiden ausgelagerten Klassen:
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 |
package net.bplaced.javacrypto.blockchain.step3; /* * Diese Klasse gehört zu BlockChain.java * This class belongs to BlockChain.java */ import java.util.Date; public class Block { public String hash; public String previousHash; private long timeStamp; public String data; // hier auf public zur manipulation gesetzt public Block(String previousHash, String data) { this.previousHash = previousHash; this.data = data; this.timeStamp = new Date().getTime(); this.hash = calculateHash(); } public String calculateHash() { String calculatedhash = StringUtil.generateSha256( previousHash + Long.toString(timeStamp) + data ); return calculatedhash; } } |
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 |
package net.bplaced.javacrypto.blockchain.step3; /* * Diese Klasse gehört zu BlockChain.java * This class belongs to BlockChain.java */ import java.security.MessageDigest; import com.google.gson.GsonBuilder; public class StringUtil { public static String generateSha256(String input){ try { MessageDigest digest = MessageDigest.getInstance("SHA-256"); byte[] hash = digest.digest(input.getBytes("UTF-8")); StringBuffer hexString = new StringBuffer(); for (int i = 0; i < hash.length; i++) { String hex = Integer.toHexString(0xff & hash[i]); if(hex.length() == 1) hexString.append('0'); hexString.append(hex); } return hexString.toString(); } catch(Exception e) { throw new RuntimeException(e); } } public static String getJson(Object o) { return new GsonBuilder().setPrettyPrinting().create().toJson(o); } } |
Weiter geht es mit Teil 4: I04 Hash-Schwierigkeitsstufe erhöhen.
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