Du brauchst eine einfache Blockchain Erklärung?
Dieser Beitrag gibt Dir einen Einblick in die Zusammenhänge einer Blockchain, ohne dass Du dazu Vorwissen brauchst!
Statt nur bei der Theorie zu bleiben, zeige ich Dir auch echte Code-Beispiele …
Auf geht’s!
Was ist eine Blockchain? – Blockchain Erklärung
Eine Blockchain ist eine Datenbank, welche Dateien in Blocken beinhaltet. Die Datenblöcke sind über kryptografische Hash-Funktionen verknüpft, sodass bei Änderung eines Blockteils die ganze Blockchain invalide wird. Diese Funktion verhindert Manipulation. Die Teilnehmer, welche Kopien der Blockchain speichern, einigen sich mit einer Abstimmung über den nächsten Block und dessen Inhalt.
Einige Journalisten verwechseln Bitcoin oder Ether mit der Blockchain ist. Bitcoins, Alt-Coins und Smart Contracts basieren auf der Blockchain-Technologie, die als Grundlage für alle Anwendung dient. Der Bitcoin ist eine Anwendung (Implementierungen) des theoretischen Konzepts einer Blockchain.
Was bringt die Blockchain?
Datenbanken haben wir vor der Blockchain wie Sand am Meer gehabt. Die Blockchain ist nicht besonders effizient oder schnell im Vergleich zu anderen Datenbanken.
Trotzdem löste die Blockchain ein praktisches Problem: Misstrauen und Abhängigkeit zum Mittelsmanns.
Banken als Vertrauensinstanz haben in den letzten Jahren Transaktionen für die Bevölkerung durchgeführt und sich damit reich geworden. Jetzt können die Teilenehmer Transaktion über eine Blockchain laufen lassen. Wenn 1 Person behauptet, die den Kauf eines Produktes nie gemacht zu haben, können die 100.000+ anderen Teilnehmer diese Aussage als Lüge abstempeln (dank kryptografischer Hashes).
Was sind die Vorteile? Die Blockchain ermöglicht eine sichere Speicherung von Transaktionen und Ereignissen. Die Blockchain streicht den Mittelsmann heraus.
Banken müssen sich für die Zukunft eine andere Beschäftigung suchen.
Die Blockchain verhindert Korruption, Betrug und Manipulation effektiver als alle physischen Verträge. Manipulation ist nur möglich, wenn Du die Technologie hackst. Vertraue lieber einer 1000-fach überprüfter Software statt einem korrupten, fehleranfälligen und profitgierigen Mittelsmann.
Steffen Lippke
Was sind die Nachteile? Fehlbuchungen müssen aufwendig in dem nächsten Block zurückgebucht werden. Alle Abweichungen, die auf „menschliche Ausnahmen und Freundlichkeit“ beruhen sind nicht mehr möglich.
Was sind Smart Contracts?
Ein Smart Contract ist ein Vertrag zwischen zwei Parteien, bei dem eine Blockchain alle Transaktionen und Ereignisse bezüglich des Vertrags speichert. Ein am Anfang festgelegter Programmiercode ermöglicht einen „interaktiven“ Vertrag, der auf Ereignisse automatisch reagiert.
- Kauft ein Kunde ein Auto auf Raten und versäumt zwei Raten, öffnet sich das Auto nicht mehr.
- Zahlt ein Arbeitnehmer in den Rententopf ein Jahr nicht ein, dann bekommt er X % weniger Rente mit 67.
- Zahlt ein Versicherungsnehmer jedes Jahr seine Police, schüttet die Blockchain den festgelegten Betrag aus ohne zu diskutieren.
Wenn ein Schuldner seine Rate nicht mehr zahlt, dann bekommt der Schuldner eine Strafe. Der Smart-Contract kann auch einmalige Ausnahmen berücksichtigen, wenn die Parteien sich darauf einigen z. B. die Blockchain bestraft nicht, wenn der Schuldner zweimal nicht gezahlt hat.
Was ist ein kryptografischer Hash?
Ein kryptografischer Hash ist ein Programm, welches aus einer Datei eine Zeichenkette berechnet. Der gleicht einen Fingerabdruck und beweist die Integrität der Datei. Eine kleine Änderung in der Datei führt zu einer auffälligen Änderung der Hash-Berechnung.
Für mein Beispiel nutze ich den sicheren Hash-Algorithmus (SHA) mit 256 Bit. Die JavaScript-Bibliothek stellt eine entsprechende NPM-Bibliothek crypto-js
zur Verfügung.
const SHA256 = require('crypto-js/sha256');
Praxis Tutorial – Blockchain Erklärung mit TypeScript
Dieser Abschnitt soll Dir anhand von Code erklären, wie eine Blockchain im Detail funktioniert. Wir brauchen die Klassen Transaction
, Block
und Blockchain
, um ein eigens Projekt auf die Beine zu stellen.
Klasse Blockchain Erklärung
Erstellen wir eine neue Blockchain mit
let steffenCoin = new Blockchain();
Wenn er Computer die Blockchain erstellt, erstellt der Computer zugleich das erste Kettenglied (den Ursprungsblock). Die Schwierigkeit setzen wir auf die Stufe 3 (Die Erklärung zu Schwierigkeiten kommt in Abschnitt Mining). Wir erstellen einen Array für alle wartenden Transaktionen und eine Summe X, die der Miner als Belohnung erhält.
class Blockchain {
constructor() {
this.chain = [this.createGenisisBlock()];
this.difficulty = 3;
this.pendingTransaction = [];
this.miningReward = 100;
}
Der Ursprungsblock initialisiert die Funktion createGenisisBlock()
, von der die Blockchain ausgeht. Dieser ist notwendig, um einen ersten Hash zu berechnen.
createGenisisBlock() {
return new Block("22/12/2018", "Genesis Block", "0");
}
Klasse Block zur Blockchain Erklärung
Die Klasse Block braucht einen Zeitstempel, die Transaktionen (hier „Genisis Block“) und einem vorherigen Hash. Weil der erste Block keinen vorherigen Block hat, nutze ich als einen Lückenfüller die 0
.
class Block {
constructor(timestamp, transactions, previousHash = '') {
this.timestamp = timestamp;
this.transactions = transactions;
this.previousHash = previousHash;
this.hash = this.calculateHash();
this.nonce = 0;
}
Das Herzstück – Die Hash-Funktion
Eine Hash-Funktion erstellt aus allen Komponenten des Blocks einen Hash innerhalb der Klasse Block. Der Hash beschreibt den gesamten Inhalt. Der Hash macht die Blockchain überprüfbar und Fälschungen sind deshalb nur schwer anzufertigen.
calculateHash() {
return SHA256(this.index + this.previousHash + this.timestamp + JSON.stringify(this.transactions) + this.nonce).toString();
}
Die Mining-Funktion ist die zweite Funktion der Klasse Block. Die Difficulty
legt die Anzahl der Nullen fest, mit der der Hash beginnen muss.
Difficulty
1 ungültiger Hash:c234ad234….
Difficulty
1 gültiger Hash:0234ad234….
Difficulty
2 ungültiger Hash:0234ad234….
Difficulty
2 gültiger Hash:0034ad234….
Mining Blockchain Erklärung
Um bei jeder Berechnung einen neuen Hash zu generieren, braucht der Block einen Lückenfüller nonce
. Die Änderung des nonce
führt zu der Änderung des Hashs. Mit etwas Glück berechnet der Algorithmus beim 2. oder 3. Durchlauf ein Hash mit dem gewünschten Präfix.
Je höher die Anforderungen an dem Präfix sind, desto mehr Durchläufe sind notwendig.
mineBlock(difficulty) {
while (this.hash.substring(0, difficulty) !== Array(difficulty + 1).join("0")) {
this.nonce++;
this.hash = this.calculateHash();
}
console.log("Block mined: " + this.hash);
}
Der Block ist „ge-minet“, wenn Dein Computer den ersten gültigen Hash mit dem richtigen Präfix gefunden hat.
Exemplarischer Ablauf einer Blockchain
Schalten wir die Blockchain ein!
Um die Blockchain zu starten und den Mining-Vorgang zu beginnen, erstellen wir zwei Transaktionen.
steffenCoin.createTransaction(new Transaction("address1", "address2", 100));
steffenCoin.createTransaction(new Transaction("address2", "address1", 50));
console.log("Start mining");
steffenCoin.minePendingTransactions("steffen");
Die Funktion minePendingTransactions()
arbeitet die neuen Transaktionen ab. Die Funktion erstellt einen neuen Block und berechnet den Hash. Der Blockchain SteffenCoin
fügt den fertigen Block an sich selbst an this.chain.push()
.
Mining-Behohnung
Weil der Minier Strom- und Hardwarekosten vorgestreckt hat und einen neuen gültigen Block erstellt hat, erhält dieser eine Belohnung über eine neue Transaktion), die Blockchain dem Nutzer (steffen) in der nächsten Runde anrechnet.
minePendingTransactions(miningRewardAddress) {
let block = new Block(Date.now(), this.pendingTransaction);
block.mineBlock(this.difficulty);
console.log("Block successfully mined!");
this.chain.push(block);
this.pendingTransaction = [
new Transaction(null, miningRewardAddress, this.miningReward)
];
}
Kontostand bestimmen
Die Blockchain speichert akribisch alle Transaktionen ab. Jeder Nutzer kann aus der Summe aller Transaktionen seinen / ihren aktuellen Kontostand berechnen.
Die Blockchain zieht alle negativen Transaktionen von allen positiven Transaktionen der Wallets ab:
getBalanceOfAddress(address) {
let balance = 0;
for (const block of this.chain) {
for (const trans of block.transactions) {
if (trans.fromAddress === address) {
balance -= trans.amount;
}
if (trans.toAddress === address) {
balance += trans.amount;
}
}
}
return balance;
}
Blockchain auf Echtheit prüfen
Wenn ein Nutzer den Transaktionen keinen Glauben schenkt, kann der Nutzer die Blockchain validieren. Um die Korrektheit zu prüfen, berechnet der Nutzer von jedem Block einen Hash und überprüft, ob die Neuberechnung mit dem gespeicherten Hash im nächsten Block übereinstimmt.
isChainValid() {
for (let i = 1; i < this.chain.length; i++) {
const currentBlock = this.chain[i];
const previousBlock = this.chain[i - 1];
if (currentBlock.hash !== currentBlock.calculateHash()) {
return false;
}
if (currentBlock.previousHash !== previousBlock.hash) {
return false;
}
}
return true;
}