Blöcke, BlockChain und Kryptowährung

Ein kleines Tutorial über Kryptowährung und die BlockChain-Technologie

WALLETS, BITCOINS, TRANSAKTIONEN, BLÖCKE, MINING UND BLOCKCHAIN

Ich glaube, jeder hat inzwischen von den sogenannten Kryptowährungen wie z.B. Bitcoin oder Ethereum gehört. Insbesondere der BitCoin hat sich zu einem Hype entwickelt. Aber kaum einer versteht, was eigentlich wirklich hinter diesen digitalen Währungen steckt. Ich möchte hier versuchen sehr allgemein einen vereinfachten Überblick über die Technologie dahinter zu geben.

2008 erschien in einem unter dem Pseudonym Satoshi Nakamoto veröffentlichten Dokument die erste Beschreibung des Bitcoin-Zahlungssystems. In diesem wird das erste dezentrale digitale Buchungssystem beschrieben, in denen Teilnehmer weltweit ihre Transaktionen direkt mit anderen Teilnehmern ohne zentrale Abwicklungsstelle wie einer Bank oder z.B. PayPal abwickeln können. Das entspricht im realen Leben einer persönlichen Zahlung an eine Person aus der eigenen Brieftasche - nur eben global.
Als erstes benötigt man also zur Teilnahme am digitalem Zahlungssystem eine digitale Brieftasche.

Wallet

Eine solche digitale Brieftasche wird als Wallet bezeichnet. Ein solches Wallet besteht aus einer langen einzigartigen Zeichenkette (öffentlicher Schlüssel) und ist geschützt durch ein Passwort (privater Schlüssel). Wenn ein Dritter die erste Zeichenkette kennt, so kann er zwar in der digitale Brieftasche nachschauen, welchen Inhalt die digitale Brieftasche besitzt, aber ohne das Passwort keine Transaktionen tätigen. Außerdem ist ein solches Wallet anonymisiert. Das ist ähnlich, als wenn man in einer realen Brieftasche nur Bargeld aber keine Personaldokumente oder Kreditkarten mit sich führt. Verliert man sein Wallet ist auch ausschließlich nur das darin befindliche digitale Geld verloren und Dritte haben so keinen Zugriff wie z.B. im realen Leben auf Kreditkarten etc..
Diese digitale Brieftasche, also das Wallet, muss man für Zahlungen im Internet zunächst mit digitalem Geld füllen. Hier gibt es verschiedenen Kryptowährungen und die Erfolgreichste ist zur Zeit der BitCoin. BitCoins kann man sich über Handelsplattformen mit Hilfe normaler Zahlungssysteme erwerben und sie werden dann in der BlockChain unter der Kennung des Wallet gespeichert. Das Guthaben, das sich in der eigenen Wallet befindet, kann dann über die Kennung aus der BlockChain ausgelesen werden.

BitCoin und Co.

Bei einer digitalen Währung wie BitCoin handelt es sich um Fiatgeld, also ein Zahlungsmittel, das keinen eigenen inneren Wert besitzt und seinen Wert alleine aus dem Vertrauen der Nutzer zieht. Dies ist bei realen Währungen wie dem Euro nicht anders, denn seit der Aufhebung der Goldbindung des US-Dollars in den 1970ern besitzt man mit dem Besitz eines Geldscheines kein Anrecht mehr auf die Auszahlung des Wertes in Gold oder Silber. Alleine das Vertrauen in die Aktiva eines Staates machen den Wert seiner Währung aus. Weiterhin ist digitale Währung nicht gegenständlich, man kann sich also seine Token - so werden die Einheiten von digitalen Währungen bezeichnet - nicht auszahlen lassen und ihn in die reale Brieftasche stecken, sondern er existiert nur als digitale Daten, also 0-en und 1-en.

Die Menge an Token der jeweiligen Kryptowährung ist für die Zukunft gedeckelt. Es gibt also eine maximale Anzahl an Token, die niemals überschritten werden wird. Dadurch unterliegt Kryptowährung keiner Manipulation, wie reale Währungen, bei denen die Notenbanken durch Neudruck oder Prägung von Geld den Wert desselben beeinflussen. Mit dieser Eigenschaft besitzt Kryptowährung einen ähnlichen Charakter wie Gold oder andere Bodenschätze, deren Vorkommen begrenzt sind und deren Wert rein ideell ist - allerdings eben auch keinen inneren Wert wie Gold besitzt.
Damit erfüllen Kryptowährungen alle Bedingungen, um sie auch für Spekulationen interessant zu machen.
Möchte man jetzt mit einer digitalen Währung etwas an eine dritte Person zahlen, wird eine Transaktion ausgeführt.

Transaktionen

Eine Transaktion besteht aus mehreren Datenteilen, nämlich der Daten, von wem man das digitale Geld im eigenen Wallet erhalten hat, zu welchem Zeitpunkt die Transaktion ausgeführt wurde, welche Anzahl an Token man an den Empfänger zahlt und schließlich die Adresse, also das Wallet des Empfängers. Diese Informationen werden dann an das jeweilige Netzwerk geschickt. Das Netzwerk besteht aus allen Teilnehmern des Zahlungssystems und jeder davon bildet einen Knoten innerhalb des Netzwerkes.
Der Empfänger der Zahlung kann nach kurzer Zeit den Eingang der Zahlung sehen, aber die Zahlung ist noch nicht abgeschlossen, weil sie noch nicht bestätigt wurde. Bestätigt wird eine solche Transaktion durch sogenanntes Mining.

Blöcke und Mining

Während die Erstellung einer Transaktion nur sehr geringen Rechenaufwand bedeutet, ist die Verifizierung einer Transaktion und das erstellen eines Transaktionsblockes, der dann an die BlockChain (Erklärung folgt folgt) angehängt wird, enorm rechenaufwändig. Deshalb stellen sogenannte Miner ihre Rechnerleistung dem Netzwerk zur Verfügung, um diese Arbeiten zu übernehmen. Konnte man zu Beginn des Zahlungssystemes BitCoin noch mit seinem eigenen Rechner solche Leistungen anbieten, ist durch den enormen Wachstum der BlockChain (z.Z. über 200 Gigabyte Speicherbedarf) und der steigenden Anzahl der Transaktionen heutzutage ein Mining-Pool notwendig, um diese Arbeiten auszuführen. Ein Mining-Pool kann sowohl aus einem großen Netzwerk einzelner Rechner, die zusammen diese Aufgaben abarbeiten, oder aus einem großen Rechenzentrum bestehen.
Der Anbieter solcher Rechnerleistungen wird dafür in Kryptowährung entlohnt, die eigens dafür generiert wird. Und so entstehen dann neue Token der Kryptowährung. Allerdings besteht in der Realität ein Block nicht nur aus einer Transaktion, sondern aus einem ganzem Paket an geschürften Transaktionen.

Aber der Begriff Mining kommt nicht etwa daher, dass der Miner durch seine Dienstleistung neues Kryptogeld generiert, sondern daher, dass er aus der Tiefe des Netzwerkes die Transaktionen "schürft", sie dann darufhin prüft, ob sie Gültigkeit besitzen, sie schon durch einen anderen Miner an die Blockchain angehängt wurden oder falls dies nicht der Fall ist, die Transaktion verifizieren, sie diese zu einem Block zusammen fassen und an die Blockchain hängen. Daraus erklärt sich auch der hohe Rechenaufwand, denn die Wahrscheinlichkeit, dass eine Transaktion, die man aus dem Netzwerk "geschürft" hat, Gültigkeit besitzt und noch nicht von einem anderen Miner verarbeitet wurde, ist sehr gering. Die Rechenleistung eines einzelnen Rechners ist unzureichend, als dass man dadurch einen Gewinn generieren könnte, in dem man diese dem Netz zur Verfügung stellen würde. Es besteht kaum eine Chance dadurch eine gültige Transaktion zu "schürfen" und die Kosten des Stromverbrauches des Rechners läge weitaus höher, als die Einnahmen.

Das Anhängen eines Blockes soll von einem Miner nur alle zehn Minuten möglich sein, damit die Generierung von BitCoin Token durch Zeitvorgabe beschränkt ist. Um dies zu gewährleisten, werden dem jeweiligen Mining-Pool zusätzlich noch Rechenaufgaben - also sozusagen Hausaufgaben - übermittelt, deren Lösung bei entsprechender Rechnerleistung des Pools in etwa 10 Minuten benötigt. Ohne die Lösung dieser Aufgabe kann der erzeugte Block nicht an die BlockChain gehängt werden und so ist es gewährleistet, dass der Miner wirklich nur alle zehn Minuten neue BitCoin Token generieren kann. Diesen Vorgang nennt man Proof-of-Work.

Dieses Stellen einer Rechenaufgabe gewährleistet die Sicherheit der BlockChain. Da die Hash-Verschlüsselung für die Daten mit einem immer neu generierten anhängendem Wert immer anders aussieht, lautet die Aufgabe in etwa "finde einen Hash, der mit einer bestimmten Anzahl, die von der Rechenleistung des Rechnerpools abhängig ist, von Nullen beginnt!"
Müsste man diese Rechenaufgabe nicht lösen, dann könnte man bei heutigen Rechenleistungen in ganz kurzer Zeit die BlockChain ab einem bestimmten Block fälschen und neu berechnen lassen. Mit der "Verzögerung" benötigt man aber, um bei aktuell etwa 300.000 Transaktionen am Tag, nur den letzten Tag zu fälschen, mehr als 5 Jahre. Da die BlockChain in dieser Zeit längst eine sehr viel größere Länge besitzt und die Verifizierung immer die längste BlockChain im Netzwerk bevorzugt behandelt, ist damit eine Manipulation nachträglich einfach nicht mehr möglich.


Aber was genau ist denn nun die Blockchain?

BlockChain

Bisher wissen wir also, welche Informationen in einem Block gespeichert sind und wo diese Blöcke dann an die BlockChain gehängt werden. Die BlockChain an sich ist eigentlich in der Informatik nichts Neues. Es handelt sich dabei um eine verkettet Liste, in der die einzelnen Elemente immer auf das Vorgängerelement verweisen. In diesem Verweis stecken verschlüsselt immer alle Informationen des Vorgängers. Also auch der Verweis auf dessen Vorgänger usw.. Im Grunde genommen besitzt man so eine Kette, deren letztes Element immer auch ein Teil der Informationen des ersten Elementes, dem Genesis Element, beinhaltet. Ähnlich eines genetischen Codes. Man kann sich das in etwa so vorstellen, als nähme man einen Gas-Ballon, welcher das erste Element darstellen soll, das man auch Genesis-Element nennt, auf den man eine Null schreibt. Damit ist eine neue BlockChain geboren. Jetzt folgt ein zweiter Gas-Ballon mit einer Schnur daran. Der Ballon selbst symbolisiert dabei die Informationen einer Transaktion und die Schnur die Referenz mit allen Informationen auf die vorherigen Transaktion. Die Schnur wird also an den Ballon mit der Null gehängt und der neue Ballon mit einer Eins beschriftet. Diesen Schritt kann man immer weiter wiederholen und so entsteht allmählich eine lange Kette mit Ballons, die eine fortlaufende Beschriftung (Indizes oder Indexe) und eine Verbindung (Referenz) zum Vorgänger besitzen.

Eine BlockChain ist genau eine solche Verkettung von Blöcken mit jeweiligem Verweis auf den Vorgängerblock. Der Verweis auf den Vorgänger enthält verschlüsselt auch alle Dateninhalte des vorherigen Blockes, so dass eine Manipulation eines einzelnen Blockes sofort zu einer ungültigen BlockChain führen würde. Im Beispiel der Ballonkette wäre eine solche Manipulation das Durchschneiden einer Schnur. Bis zu dem Ballon, dessen Schnur zerschnitten wurde, ist zwar die Ballonkette noch vorhanden, aber dessen Schnur hängt ins entweder ins Leere, obwohl die Beschriftung (Index) des Ballons sagt, dass das nicht sein kann, weil es nicht der Ballon mit der Null ist, oder es wurde eine "gefälschtes" Gas-Ballon-Kettensequenz eingefügt, deren Schnur nicht zum Original passt. Eine Manipulation an einer BlockChain lässt sich also einfach erkennen, wenn man dann immer alle Blöcke bis zum Genesis-Block überprüft. Je mehr Daten in der BlockChain gespeichert werden, um so rechenaufwendiger wird dieser Prozess.

Eine BlockChain ist also eine sehr manipulationssichere Angelegenheit. Allerdings wäre ja durch eine nachgewiesene Manipulation die BlockChain dennoch zerstört. Sie würde also nichts mehr nutzen. Hier ist nun der dezentrale Charakter der BlockChain-Technologie entscheidend. Da jeder Teilnehmer des Netzwerkes immer auch eine exakte Kopie der BlockChain bei sich lokal gespeichert hat und die Daten nicht wie im Bankensystem auf irgend welchen Zentralrechnern liegen, stellt eine zerstörte BlockChain an einem der Millionen Knoten des Netzwerkes überhaupt kein Problem dar. Der Knoten holt sich einfach die BlockChain von einem anderen Knoten wieder, prüft diese erneut auf Korrektheit und arbeitet bei positiver Prüfung mit dieser dann weiter. Bei einer zentralen Verwaltung in einem Rechenzentrum einer Bank hätte eine solche Manipulation zu einer Katastrophe geführt.

Die BlockChain-Technologie ist also ein sehr sicheres dezentrales System, Daten unveränderbar zu speichern. Sie kann nicht nur für Buchungssysteme, sondern im ganzen alltäglichem Leben angewandt werden. Ob Patientendaten, Steuerdaten, Personendaten usw. - es handelt sich hier um eine sehr innovative Technologie, die auch außerhalb von BitCoin und Co einen sehr hohen Nutzen besitzt.

Alle Informationen zur realen BlockChain - einschließlich der Einsicht in alle Blöcke mit allen gespeicherten Informationen - des BitCoin findet man übrigens unter blockchain.info.

VORTEILE DER KRYPTOWÄHRUNG UND DER BLOCKCHAIN-TECHNOLOGIE


Der Grundgedanke der Kryptowährung ist es, eine staatsunabhängige Weltwährung zur Verfügung zu stellen, die nicht durch Notenbanken manipuliert werden kann und inflationssicher ist. Weiterhin sollte eine Zahlung einer Person an einen Dritten direkt und nicht über zentrale Organisationen abgewicklet werden können, wodurch diese auch schneller und "eigentlich" ohne Gebühren durchgeführt werden können.

Die Daten solcher Transaktionen werden in einer sicheren und nicht manipulierbaren Datenstruktur gespeichert die in einem abgewandelten Peer-to-Peer Netzwerk jedem Teilnehmer des Zahlungsystems zur Verfügung gestellt werden und für jeden einsehbar und transparent sind. Die Personen sind dabei anonymisiert und können nicht nachverfolgt werden, aber die einzelnen Transaktionen kann jeder einsehen und nachvollziehen.

All diese Grundgedanken verfolgen eine sehr liberale menschenfreundliche Vision und die technische Umsetzung über eine dezentrale BlockChain ist äußerst innovativ. Würde sich eine solche Kryptowährung durchsetzen können, wäre ich mir sicher, dass die Idee dahinter durchaus nobelpreiswürdig ist, weil sie der Menschheit ein staaten- und organisationsunabhängiges Zahlungsmittel zur Verfügung stellt, dass kaum einer Manipulation von Außen ausgesetzt sein würde und eine ungeheure Transparenz für Jeden besitzt.

Außerdem ist die BlockChain-Technologie, die sich dahinter verbirgt, unglaublich sinnvoll für alle Systeme, die Daten schnell transferieren und diese für jeden Teilnehmer transparent und nachvollziehbar zur Verfügung stellen wollen.
Nähme man Patientendaten als Beispiel, so würde jedem Arzt weltweit fachübergreifend die Möglichkeit gegeben, die kompletten medizinisch relevanten Daten (Anamnese) eines Patienten ad hoc zur Verfügung gestellt zu bekommen. Dadurch könnten Fehlmedikation und Behandlungsfehler vermieden werden.

Und dies war nur ein kleines Beispiel dafür, welche technischen Möglichkeiten die BlockChain-Technologie noch alles bieten könnte. Es könnte eine völlig neue Datenwelt entstehen, in der die Daten jedem Menschen zur Einsicht zu Verfügung stehen und so eine so häufig geforderte Transparenz entsteht, die aber eben keine Manipulation dieser Daten zulässt. Die BlockChain-Technologie ist definitiv eine Innovation die unsere digitale Welt verbessern könnte.

               

RISIKEN DER KRYPTOWÄHRUNG


Wo es Licht gibt, da gibt es leider auch immer Schatten. Die Grundidee einer Währung ist und bleibt der Tauschhandel, also der Kauf und Verkauf von Waren, Produkten und Dienstleistungen durch Zahlung in dieser Währung. Dies ist nur Möglich, wenn sowohl der Käufer als auch der Verkäufer einer Ware, eines Produktes oder einer Dienstleistung dieser Währung gleichermaßen Vertrauen schenken. Eine staatliche Währung im realen Leben erreicht dieses Vertrauen auf beiden Seiten durch die Aktiva dieses Staates oder besser durch positive Bilanzen aus seiner Wirtschaft. Nur dadurch ist auch die Stabilität der Währung gewährleistet.
Der wahre Wert einer Währung sollte sich also immer an der Anzahl der Transaktionen zwischen Anbietern und Käufern von Waren, Produkten und Dienstleistungen messen lassen.

Hiervon ist die Kryptowährung noch weit entfernt, da zur Zeit nur sehr wenige Akzeptanzstellen für die Zahlung mit BitCoin und Co existieren. Stattdessen ist die Kryptowährung in ihrem jetzigem Hype fast ausschließlich zu einem Spekulationsobjekt mutiert. Dies war sicherlich nie im Interesse ihres Erfinders, aber durch die Eigenschaften und dem Charakter, den Kryptowährung besitzt, eignet sie sich hervorragend zur Spekulation. Alleine die Eigenschaft der Deckelung, also der strikten Begrenzung der Menge an in Zukunft erzeugten Token dieser Währungen, lassen sie zu einem sehr attraktivem Spekulationsobjekt werden.

Transaktionen beschränken sich derzeitig fast nur auf Kauf oder Verkauf der Token selbst. Das heißt, der wirtschaftliche Nutzen eines Umlaufgeldes ist überhaupt nicht gegeben. Lediglich die steigende Anzahl an spekulativen Transaktionen mit Kryptowährung lässt insbesondere den reellen Wert, also den Tauschkurs der Kryptowährung in reale Währung, in die Höhe schießen. Dabei ist dieser Wert aufgrund der Handlungen der einzelnen Spekulanten sehr hohen Schwankungen ausgesetzt. Ein Problem dabei ist, dass sich immer mehr Laien diesem Spekulationsmodell anschließen, denen dann oft die Nerven fehlen, wenn der Kurs dann mal nach unten geht und ihre Token dann wieder in den Markt werfen. Dieser Markt funktioniert nunmal nach dem Prinzip des Angebotes und der Nachfrage. Die frei gegebenen Token sorgen also dafür, dass der Kurs zeitweilig auch noch extremer nach unten gehen kann.

Was für den risikofreudigen Spekulanten ein Himmelreich zu sein scheint, ist allerdings für die Grundidee hinter einer solchen Währung eher kontraproduktiv. Denn welcher Anbieter einer Wahre, eines Produktes oder einer Dienstleistung würde einer Währung, die so enorme Kursschwankungen besitzt, das Vertrauen schenken, dass er einer stabilen Währung schenken würde, um sich damit bezahlen zu lassen. Wenn er also nicht selbst an der Spekulation teilnehmen möchte, würde er die Finger davon lassen und damit sind wir bei den fehlenden Akzeptanzstellen für eine solche Währung. Und damit die Verfehlung ihrer Vision, als transparentes Zahlungsmittel für Jedermann zu dienen. Wie gesagt, dies lag nie im Interesse ihres Erfinders.

Ich möchte hier aber ausdrücklich meine Meinung äußern, dass es sich nicht, wie viele behaupten, um eine Blase handeln würde, weil Kryptowährung ja eigentlich nur einen ideellen Wert besäße und diese irgendwann platzen wird. Denn wer dies behauptet, der hat die technischen Hintergründe, die Vision und das unglaubliche Potential dieser digitalen Währung auf BlockChain-Technologie nicht verstanden. Das heißt nicht, dass das Risiko eines Totalverlustes bei der Spekulation mit dieser Kryptowährung nicht existiert, aber dass es eben wichtiger für die Stabilität dieser Währung wäre, sie zu einer Umlaufwährung werden zu lassen, mit denen man Handel betreiben kann und seinen Blick nicht nur auf den momentanen Tauschkurs richtet. Ich würde mir wünschen, dass sich Kryptowährung in seiner eigentlichen Vision weltweit durchsetzt, weil sie ein innovatives und transparentes Zahlungssystem gewährleistet.
Denn ansonsten wird es so kommen, dass Kryptowährung scheitern wird und viele Menschen sich in den Abgrund spekuliert haben werden. Der Wert basiert nunmal einzig auf reines Vertrauen und Glaube an diese Währungen. Wird sich dieses Vertrauen und der Glaube daran rein auf den Kurswert beschränken, wird Kryptowährung auch schnell wieder aus unserer digitalen Welt verschwinden.

Weitere nur kurz angeführte, aber nicht unwichtige Risiken

  • Der Stromverbrauch:
    Wie angesprochen benötigt das Mining der Transaktionen einen enormen Rechenaufwand und damit verbunden natürlich auch einen enormen Stromverbrauch. Bei momentan etwa 300.000 täglichen Transaktionen bei BitCoin weltweit ergibt dies einen jährlichen Stromverbrauch von 24,52 Terawattstunden. Das entspricht dem jährlichen Energiebedarf von Nigeria mit 150.000.000 Einwohnern. Bei wachsenden Transaktionszahlen wäre dies auf lange Sicht ein Umweltproblem, dass man als Erbe an die Nachfolgegenerationen übergeben wird. Das erklärt mal euren Kindern.
  • Der Speicherbedarf:
    Mit Anstieg der Anzahl an Transaktionen, die in einer BlockChain gespeichert werden, wächst auch der Speicherbedarf der BlockChain. Zur Zeit liegt sie bei etwa 200 Gigabyte, wächst aber schneller an als die Entwicklung von Speichermedien. Irgendwann wird also der Speicherbedarf so groß sein, dass immer weniger Teilnehmer den Bedarf hierfür decken könnten. Sie könnten also nicht mehr am System teilnehmen.
  • Kriminalität:
    Durch die gewährleistete Anonymität wird Kryptowährung gerne zur Geldwäsche genutzt. Deshalb werfen immer mehr Staaten einen kritischen Blick auf die Entwicklungen und fordern diesbezüglich Einblick in die Händlerlisten, denn dort sind ja reale Daten hinterlegt. Dies würde aber einen zentralen Punkt der Vision einer solchen Währung betreffen. Außerdem ist die beliebteste Währung für Geldwäsche aus Drogenkriminalität noch immer der US-Dollar.
  • 51%-Attacke:
    Die BlockChain einer Kryptowährung wird ständig verifiziert. Dies passiert in den Mining-Pools. Der Algorithmus funktioniert nach dem Mehrheitsprinzip. Wenn die Mehrzahl der in den Knoten des Netzwerkes vorliegenden BlockChains sich von dem zu prüfendem BlockChain unterscheiden, dann entscheidet der Algorithmus, dass es sich um einen gefälschten BlockChain handelt und er wird eliminiert. Besitzt jemand also die Möglichkeit einen hohen Prozentsatz (Das können auch weniger als 51% sein) von einem gefälschten BlockChain in das Netzwerk zu schleusen, dann ist die Wahrscheinlichkeit groß, dass dieser sich gegen den echten BlockChain durchsetzt. Wenn ich also einen hohen Prozentsatz an Mining-Pools steuern kann, dann ist es mir trotz nicht manipulierbarem BlockChain möglich, einen gefälschten BlockChain einzusetzen. In China sitzen zum Beispiel 81% der Mining-Pools. Hoffen wir, dass China stabil bleibt.
  • 256 Bit Hash-Verschlüsselung:
    BitCoin und andere Kryptowährungen arbeiten mit einer 256 Bit Hash-Verschlüsselung. IT-Experten warnen davor, dass sich die Entwicklung von Quantenrechnern, die ein vielfaches an Rechenleistung von herkömmlichen Rechnern aufbringen, in den nächsten zehn Jahren soweit entwickelt haben wird, dass diese Verschlüsselung nicht mehr sicher sein wird. Da die BlockChain nicht manipulierbar ist, ohne sie zu zerstören, wäre das das Ende von BitCoin und Co und es gäbe nur die Möglichkeit eines BitCoin 2.0.
  • Technikbedarf:
    Da es weltweit immer noch große Menschengruppen gibt, die noch nicht an unserer digitalen Welt teilnehmen können, sei es, weil die digitale Infrastruktur unzureichend ist, oder einfach Armut daran hindert, die erforderliche Technik zur Verfügung zu haben, kann die Vision einer fairen Währung für alle Menschen zur Zeit nicht umgesetzt werden. Das heißt große Gruppen der Menschheit wären ausgeschlossen an den positiven Eigenschaften einer Kryptowährung teil zu haben. Das widerspricht jedem demokratischem Verständnis.

All diese Risiken und Probleme sind aber lösbar. Kryptowährung steckt noch in den Kinderschuhen und die Idee dahinter wird noch reifen müssen. Aber es sollte im Interesse und Nutzen aller Menschen dahingehend weiter entwickelt werden.

EIGENER BLOCKCHAIN IN JAVASCRIPT

Um die Technologie und die Algorithmen hinter BlockChain zu verdeutlichen, möchte ich hier in vereinfachter Form mit Hilfe von JavaScript ein solches Projekt umsetzen. Natürlich kann ich hier kein Peer-to-Peer Netzwerk erstellen, aber eben die BlockChain und deren Funktionen simulieren. Anwendbar wird diese neu erschaffene Kryptowährung, die ich hier mal TrautCoin nenne, dann in einer Simulation sein, in der man sich die Vorteile einer solchen Technologie anschauen kann.

Und weil der Mensch eigentlich etwas braucht, dass er anfassen kann, um dem einen Wert zuzuordnen, soll er auch ein Aussehen haben. Eben etwas, dem man "Traut". ;o)

Bitcoin, Kryptowährung, TrautCoin

Zur Umsetzung benötigt man zur Hash-Verschlüsselung zunächst einmal aus der JavaScript-Bibliothek Crypto-JS die Datei hash256.js und die Datei aes.js, die man in das Projekt implementieren muss. Dazu fügt man einfach in die HTML-Datei, auf der das ganze ablaufen soll vor </head> folgende zwei Zeilen ein:
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/rollups/aes.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/rollups/sha256.js"></script>

Wer näheres über den Algorithmus zur Hash-Verschüsselung oder AES-Verschlüsselung erfahen möchte, der kann dies bei Wikipedia machen:
Secure Hash Algorithm ( SHA )
Advanced Encryption Standard ( AES )

Erst einmal kümmern wir und um das Javascript des Projektes einer neuen Kryptowährung.
Zunächst einmal wollen wir eine Transaktion generieren. Für diejenigen, die sich nicht mit objektorientierter Programmierung auskennen, es wird zunächst die Transaktion als Objekt mit Hilfe einer Klasse implementiert. In dieser findet man in einem Constructor alle notwendigen Eigenschaften wie Index, Transaktionazeitpunkt, Wallet des Senders der Token, Anzahl der Token, Wallet des Empfängers, der Verweis auf die Vorgänger-Transaktion sowie die Funktionen, die auf eine Transaktion angewendet werden, in diesem Fall die Hash-Verschlüsselung.
Ich möchte hier keinen Programmierkurs anbieten, deshalb nur für Laien ein paar Bemerkungen:
Mit dem Prefix this. wird immer auf genau auf die Variable oder Eigenschaft der Transaktion verwiesen, die gerade verarbeitet wird, während mit var gekennzeichnete Variablen nur innerhalb der Klasse gelten und für interne Berechnungen dienen.
Durch // oder /* und */ werden Kommentare markiert, die keinen ausgeführten Quelltext darstellen.
Mit Magenta sind Klassen gekennzeichnet, mit Blau Prefixe bzw. Schlüsselworte, mit Grün Klassenvariablen, mit Orange Zeichenketten (Text) - sogenannte Strings - und in Cyan Funktionen und Funktionsaufrufe.

Erzeugen einer Transaktion über eine Objekt-Klasse Transaktion

// Erzeugen eines Objektes "Transaktion", also eine Transaktion in Kryptowährung an eine dritte Person
class Transaktion{
   // Eine Transaktion besteht aus einem Index, also einem Zähler, dem genauen Zeitpunkt der Transaktion, der digitalen
   // Brieftasche des Senders, der Menge der Token, die man an den Empfänger zahlen möchte, der digitalen Brieftasche des Empfängers
   // sowie des Hash als Referenz auf die vorherige Transaktion. Aus diesen Daten wird dann der Hash
   // für diese Transaktion erzeugt. Ich habe noch zwei weitere Werte, nämlich die Komlexitaet des Proof-of-Work    // und den dabei an den zu verschlüsselnden String angehängten Wert zur Lösung derselben mit emplementiert.

   constructor(index, zeitpunkt, senderwallet, coins, empfaengerwallet, vorherigetransaktion, komplexitaet, angehaengterwert){
      this.index = index;
      // Zeitpunkt der Transaktion lesbar machen in Lokale Zeitangaben
      var dieserzeitpunkt = zeitpunkt;
      this.zeitpunkt = dieserzeitpunkt.toLocaleString();
      // Das Datum wird für den Hash in einen Unix-Timestamp umgewandelt (Sekunden seit dem 01.01.1970)
      var timestamp = dieserzeitpunkt.getTime();
      // Die Daten der Transaktion werden in einem String zusammen gelegt.
      this.senderwallet = senderwallet;
      this.coins = coins;
      this.empfaengerwallet = empfaengerwallet;
      // Der Hash der vorherigen Transaktion wird in eine Zeichenkette umgewandelt.
      this.vorherigetransaktion = vorherigetransaktion.toString();
      var daten = "Transaktionszeitpunkt: " + timestamp + ", Von Wallet: " + this.senderwallet + ", Coins: " + this.coins + ", an Wallet: " + this.empfaengerwallet + ", Vorherige Transaktion:" + this.vorherigetransaktion;
      // Die Zusammengelegten Daten werden in einem Datenformat (hier Json) gespeichert.
      var transaktionsdaten = JSON.stringify(daten).toString();
      // Hier folgt jetzt die Vorgabe der in der Beschreibung angeführten Rechenaufgabe für das Mining. Aufgabe ist:
      // "Erzeuge ein Hash, dass mit zwei (komplexitaet) führenden Nullen beginnt. Ausgeführt wird diese Aufgabe in der Klassen-Funktion
      // hashVerschluesseln() durch Rekusiven Aufruf der Funktion. Zunächst wird eine Null (angehaengterwert) an den zu verschlüsselnden
      // String der Transaktion angehängt. Eigentlich müsste das in der Klasse BlockChain implement werden. Ich hab's so gemacht.

      this.angehaengterwert = 0;
      // Je größer die Komplexität, je höher ist der Rechenaufwand und damit die Zeitverzögerung.
      this.komplexitaet = 2;
      // Der Hash dieser Transaktion wird mit Hilfe der Klassen-Funktion hashVerschlüsseln()
      // und der geforderten Komplexität der Rechenaufgabe gebildet.
      this.diesetransaktion = this.hashVerschluesseln();
   }
   // Die Funktion, die aus den Daten der Transaktion den Hash dafür erzeugt.
   hashVerschluesseln(){
      // Aufruf der Funktion aus der Bibiothek-Datei sha256.js. Ein temporärer Hash wird erzeugt.
      var temporaererhash = CryptoJS.SHA256(this.index + this.zeitpunkt + this.transaktionsdaten + this.vorherigetransaktion + this.angehaengterwert).toString();
      // Prüfen, ob die vorgegebene Komplexitaet des Hash gegeben ist, also die vorgegebene Anzahl führender Nullen
      // vorhanden ist. Wenn dies nicht der Fall ist, ändere den angehängten Wert durch erhöhen um Eins (++) und
      // führe die Funktion erneut (rekursiv) aus, bis die Bedingung erfüllt ist.

      while (temporaererhash.substring(0, this.komplexitaet) !== Array(this.komplexitaet + 1).join("0")) {
         this.angehaengterwert++;
         temporaererhash = this.hashVerschluesseln();
      }
      // Bedingung ist erfüllt, der neu generierte Hash entspricht dem letzten temporären Hash, der jetzt ausgegeben wird.
      return temporaererhash;
   }
}

Damit können wir jetzt immer wieder neue Objekte der Klasse Transaktionen erzeugen. Dies wird später durch den Aufruf new Transaktion(...) geschehen.
Als nächstes müssen wir jetzt eine BlockChain erzeugen. Auch hier wird wieder dieses Objekt durch eine Klasse erzeugt. Zusätzlich benötigen wir ein paar Funktionen in dieser Klasse, nämlich eine, die einen Block an unsere BlockChain hängt, eine, die uns den neuen Index für den neuen Block generiert, eine, die uns den Hash des vorherigen Blockes aus der BlockChain ausliest und natürlich eine Funktion, die unsere BlockChain bei Anhängen des neuen Transaktionsblockes als "die echte" BlockChain verifiziert.

Erzeugen einer BlockChain über eine Objekt-Klasse BlockChain

// Erzeugen eines Objektes "BlockChain", also der verketteten Liste an Transaktionen.
class BlockChain{
// Zunächst wird in der BlockChain das Genesis-Element eingefügt, die Geburt der BlockChain.
   constructor(){
      // Bei einem BlockChain handelt es sich um ein Datenarray mit dem Starteintrag Genesis Block.
      this.blockchain = [this.erzeugeGenesisBlock()];
   }
   // Der allererste Block der BlockChain wird erzeugt. Das Startdatum wird auf den 20.11.2017, 00:00:00 festgelegt.
   erzeugeGenesisBlock(){
      var zeitpunkt = new Date (2017,10,20,0,0,0);
      // Der Genesis Block hat den Index 0, es werden keine Transaktionen durchgeführt und es existiert
      // kein vorheriger Block. Also werden diese Werte alle auf Null gesetzt.

      return new Transaktion(0, zeitpunkt, 0, 0, 0, 0);
   }
   // Diese Funktion liest den letzten angehängten Block der BlockChain aus, also den Block mit dem letzten Index.
   // Da der Genesis Block den Index Null besitzt, besitzt der letzte Block den Index der Anzahl der Blöcke in
   // unserer BlockChain - Eins : [this.blockchain.length - 1].

   letzterBlock(){
      return this.blockchain[this.blockchain.length - 1];
   }
   // Index des neuen Blockes, der an die BlockChain gehängt wird
   neuerIndex(){
      return this.blockchain.length;
   }
   // Dies Funktion hängt den Block für eine neue Transaktion an die Blockchain an.
   neuerBlock(senderwallet, coins, empfaengerwallet){
      // Transaktionszeitpunkt wird generiert
      var heute = new Date();
      // Der Index des neuen Blöcke
      var index = this.neuerIndex();
      // Verweis auf den vorherigen Block wird ausgelesen
      var vorherigetransaktion = this.letzterBlock().diesetransaktion;
      // Die Transaktion wird erzeugt und zu einem neuen Block zusammengestellt
      var neuerblock = new Transaktion(index, heute, senderwallet, coins, empfaengerwallet, vorherigetransaktion, komplexitaet);
      // Der neue Block wird an die BlockChain angehängt
      this.blockchain.push(neuerblock);
   }
   // Mit dieser Funktion wird die durch das Anhängen des neuen Transaktions-Blockes neu entstandene BlockChain als korrekt verifiziert
   verifieziereBlockChain() {
      // Wir durchlaufen die bisherige BlockChain von ihrem ersten bis zum letzten Block
      for (var i = 1; i < this.blockchain.length; i++){
         // Der zu verifizierende Block ist der mit dem Index i.
         var dieserblock = this.blockchain[i];
         // Der Vorgängerblock ist der mit dem Index i-1
         var vorherigerblock = this.blockchain[i - 1];
         // Wenn der Hash des zu verifizierenden Blockes nicht der Hash-Verschlüsselung der Daten des Blockes ist,
         // dann wurde an dem Block eine Manipulation vorgenommen und die BlockChain ist falsch.

         if (dieserBlock.dieseTransaktion !== dieserBlock.hashVerschluesseln()) {
            return false;
         }
         // Wenn die Referenz oder der Verweis dieses Blockes nicht dem Hash des vorherigen Blockes entspricht,
         // wurde die BlockChain manipuliert und ist falsch.

         if (dieserBlock.vorherigetransaktion !== vorherigerBlock.diesetransaktion) {
            return false;
         }
      }
      // Wenn bis hier alles in Ordnung war, ist die BlockChain validiert, also richtig.
      return true;
   }
}

Nun können wir also beliebig Objekte der Klasse BlockChain erzeugen. Das Anhängen einer Transaktion als Block in eine BlockChain ist real selbstverständlich beim Mining etwas komplexer, aber hier soll ja auch nur das Grundprinzip einer BlockChain und einer Kryptowährung erklärt werden.

Da es sich bei den Nutzern unserer neu generierten Kryptowährung eigentlich um Clients eines Peer-to-Peer Netzwerkes handelt, man dies aber hier nicht in dieser Form umsetzen kann, müssen wir in irgend einer Form ein Netzwerk simulieren.
Hier werde ich es in Form einer JSON Datestruktur anlegen. Jeder Nutzer des TrautCoin besitzt einen öffentlichen Schlüssel, der durch eine Hashverschlüsselung einer personifizierten Zeichenkette erzeugt wird, einem privaten Schlüssel, den nur der Nutzer kennen darf und eine Wallet die mit Hilfe der AES-Verschlüsselung aus dem öffentlichen Schlüssel mit dem privaten Schlüssel erzeugt wird.
Man hätte hier sicherlich das Ganze auch als Objekt-Klassen Netzwerk und Nutzer anlegen können, aber hier soll diese Lösung ausreichen.

Weil es sich nicht um die Hash-Verschlüsselung aus der Objekt-Klasse Transaktionen handelt, werden wir diese Funktion noch mal extra implementieren und genauso die AES-Verschlüsselung, um diese dann innerhalb unserer Netzwerkerzeugung zu nutzen.

Simulieren eines Netzwerkes mit Hilfe einer JSON-Datenstruktur

// Hash generieren aus den Transaktionsdaten
function hashVerschluesseln2(string){
   return CryptoJS.SHA256(string).toString();
}
// Wallet generieren aus dem öffentlichen und privaten Schlüssel eines Netzwerkteilnehmers (Hier AES Verschlüsselung)
function walletErstellen(oeffentlicherschluessel, privaterschluessel){
   return CryptoJS.AES.encrypt(oeffentlicherschluessel, privaterschluessel);
}
// Erstellen eines virtuellen Netzwerkes aus 5 Personen und einem Miner mit öffentlichem Schlüssel, privatem Schlüssel und einem Wallet.
// Der öffentliche Schlüssel wird hier aus einem Hash der jeweiligen Person generiert und die Wallet wird aus diesem Hash mit dem privaten
// Schlüssel mit AES-Verschlüsselung erstellt.

var netzwerk = '{ "TrautCoinNutzer" : [' +
            '{ "oeffentlicherSchluessel":"'
+ hashVerschluesseln2( 'Person 1' ) + '" , "privaterSchluessel":"123456", "Wallet":"' + walletErstellen( hashVerschluesseln2( 'Person 1' ), 'Person 1' ) + '" },' +
            '{ "oeffentlicherSchluessel":"' + hashVerschluesseln2( 'Person 2' ) + '" , "privaterSchluessel":"234561", "Wallet":"' + walletErstellen( hashVerschluesseln2( 'Person 2' ), 'Person 2' ) + '" },' +
            '{ "oeffentlicherSchluessel":"' + hashVerschluesseln2( 'Person 3' ) + '" , "privaterSchluessel":"345612", "Wallet":"' + walletErstellen( hashVerschluesseln2( 'Person 3' ), 'Person 3' ) + '" },' +
            '{ "oeffentlicherSchluessel":"' + hashVerschluesseln2( 'Person 4' ) + '" , "privaterSchluessel":"456123", "Wallet":"' + walletErstellen( hashVerschluesseln2( 'Person 4' ), 'Person 4' ) + '" },' +
            '{ "oeffentlicherSchluessel":"' + hashVerschluesseln2( 'Person 5' ) + '" , "privaterSchluessel":"561234", "Wallet":"' + walletErstellen( hashVerschluesseln2( 'Person 5' ), 'Person 5' ) + '" },' +
            '{ "oeffentlicherSchluessel":"' + hashVerschluesseln2( 'Miner' ) + '" , "privaterSchluessel":"612345", "Wallet":"' + walletErstellen( hashVerschluesseln2( 'Miner' ), 'Miner' ) + '" }]}';

Und damit haben wir alle Elemente zusammen, mit der man eine BlockChain aufbauen und Kryptowährung simulieren kann. Wir können Transaktionen gernerieren, wir können eine BlockChain generieren und dort Transaktionsblocks anhängen und wir haben eine Art Netzwerk aus Fünf Nutzern und einem Miner, der für das Anhängen der Blöcke and die BlockChain TrautCoins generiert.

Als nächstes werden wir ganz einfach eine neue BlockChain mit einem Genesis Block generieren und dann jedem virtuellen Nutzer unserer Kryptowährung ein wenig Startkapital zur Verfügung stellen. Das entspricht natürlich auch nicht ganz der Realität, aber wir benötigen ja einen Startpunkt für unsere Simulation. Der Miner selbst besitzt zunächst keine TrautCoins, generiert allerdings beim Mining neue Token und erhält einen kleinen Prozenssatz der Transaktion als Gebühr für seine Tätigkeit.

Erzeugen einer BlockChain für TrautCoins und Festlegung eines Startguthabens für die virtuellen Nutzer des TrautCoins

// Diese BlockChain soll eine BlockChain für Token mit dem Namen TrautCoins werden.
// Die BlockChain für TrautCoins wird mit einem Genesis Block in der Klasse BlockChain erzeugt.

var TrautCoins = new BlockChain();

// Auslesen der Netzwerkmitglieder in ein Array obj, in dem einzelne Elemente über einen Index ansprechbar sind
// Die einzelnen Nutzer spricht man dann über obj.TrautCoinNutzer[index] an

var obj = JSON.parse(netzwerk);

// Grundguthaben von 1000 Token für jedes Netzwerkmitglied des TrautCoin erzeugen,
// der Miner besitzt 0 Token. Diese Transaktionen sind real natürlich nicht so, da
// hier ja Token von einem Sender mit dem Wallet 0 einfach erzeugt werden.
// Da TrautCoin jetzt ein Objekt der Klasse BlockChain ist, kann man über die Klassen-Funktion
// neuerBlock() die einzelnen Objekte der Klasse Transaktionen erzeugen und diese dann als
// Block an die BlockChain TrautCoins anhängen.

TrautCoins.neuerBlock('0', 1000, obj.TrautCoinNutzer[0].Wallet);
TrautCoins.neuerBlock('0', 1000, obj.TrautCoinNutzer[1].Wallet);
TrautCoins.neuerBlock('0', 1000, obj.TrautCoinNutzer[2].Wallet);
TrautCoins.neuerBlock('0', 1000, obj.TrautCoinNutzer[3].Wallet);
TrautCoins.neuerBlock('0', 1000, obj.TrautCoinNutzer[4].Wallet);

Damit haben wir soeben eine BlockChain für eine Kryptowährung mit dem Namen TrautCoins generiert, die aus einem Genesis-Block und fünf weiteren Transferblocks besteht. Da eine JSON-Datenstruktur allerdings sehr kryptisch ist, wie wir es ja schon bei der Erstellung des Netzwerkes sehen konnten, wäre eine Funktion, die und die BlockChain übersichtlich lesbar macht, keine schlechte Idee.

Unsere BlockChain als JSON-Datenstruktur

Also implementieren wir jetzt eine Funktion, die uns die BlockChain in einem schönerem Bild darstellt.

Auslesen der BlockChain in lesbarem Format

// Funktion die die JSON-Daten in der BlockChain lesbar ausgibt
auslesenBlockchain(TrautCoins);

// Auslesen der BlockChain
function auslesenBlockchain(meineblockchain){
   // Zunächst einmal legen wir den Bereich auf unserer Seite fest, auf dem die BlockChain dargestellt werden soll.
   // Ich habe hier einen Div-Bereich mit der Id "myblockchain" genommen.

   var myblockchain = document.getElementById('myblockchain');
   // Die JSON Daten werden in einen String umgewandelt
   var jsonblockchain = JSON.stringify(meineblockchain).toString();
   // Der String wird in einen Array eingelesen
   var bloecke = JSON.parse(jsonblockchain);
   // Die Länge des Arrays, also die Anzahl der Blöcke wird bestimmt
   var count = bloecke.blockchain.length;
   // Zum Aufhübschen wird ein wenig HTML-Code hinzugefügt
   var meinblock = "<center>";
   // Dann werden die Blöcke durchlaufen
   for(i=0; i       // Die einzelnen Daten der Blöcke ausgelesen
      var hierindex = bloecke.blockchain[i].index;
      var hiersenderwallet = bloecke.blockchain[i].senderwallet;
      var hiercoins = bloecke.blockchain[i].coins;
      var hierempfaengerwallet = bloecke.blockchain[i].empfaengerwallet;
      var hiervorherigetransaktion = bloecke.blockchain[i].vorherigetransaktion;
      var hierdiesetransaktion = bloecke.blockchain[i].diesetransaktion;
      // Und schließlich in die HTML-Struktur eingearbeitet
      meinblock += "<table id='meinblock' class='table table-bordered'><thead id='meintitel'><tr><th id='rechts'><b>Index</b></th><th id='links'>" + hierindex + "</th><>/tr></thaed>";
      meinblock += "<tbody id='meinbody'><tr><td id='rechts'><b>Von Wallet</b></td><td id='links'>" + hiersenderwallet + "</td></tr>";
      meinblock += "<tr><td id='rechts'><b><b>TrautCoins</b></td><td id='links'>" + hiercoins + "</td></tr>";
      meinblock += "<tr><td id='rechts'><b><b>An Wallet</b></td><td id='links'>" + hierempfaengerwallet + "</td></tr></tbody>";
      meinblock += "<thead id='meintitel'><tr><th id='rechts'><b>Vorheriger BlockHash</b></th><th id='links'>" + hiervorherigetransaktion + "</th></tr></thaed>";
      meinblock += "<thead id='meintitel'><tr><th id='rechts'><b>Dieser BlockHash</b></th><th id='links'>" + hierdiesetransaktion + "</th></tr></thaed></table>";
   }    meinblock += "</center>";
   // Und letztendlich in unseren Div-Bereich geschrieben
   myblockchain.innerHTML += meinblock;
}

Der ausgelesene bisherige BlockChain für TrautCoins

Und siehe da, schon kann man den BlockChain für TrautCoins mit den bisherigen Transaktionen wunderbar anschauen. Alle Informationen zu den einzelnen Transaktionen sind in den bisherigen Blöcken enthalten. Da wir ja erst einmal ein Startguthaben aus dem Nichts gezaubert haben, um später das Zahlungssytem mit Kryptowährung zu simulieren, sind die Sender Wallets bisher alles auf 0 gesetzt.
Sehr schön sind jetzt auch die beiden führenden Nullen in den Hashs zu sehen, die durch die gestellte Rechenaufgabe (Proof of Work) bei der Erzeugung der Blöcke generiert wurden.

Die BlockChain für TrautCoins ist fertig

Alles was für die Programmierung der BlockChain eines TrautCoin in JavaSript wichtig ist, ist damit beschrieben. Natürlich benötigt man für die Simulation dann noch weitere Funktionen, aber damit möchte ich jetzt hier niemanden belasten.
Wer das gesamte Projekt auf seiner eigenen Website veröffentlichen möchte, der kann sich das dann hier runterladen. Einfach entpacken, den Ordner in das Verzeichnis der Website per FTP-Client hoch laden und auf der Website diesen Link dahin setzen: <a href="/trautcoin/index.html" target="_blank">TrautCoin BlockChain</a>.

Unsere TrautCoin Client Siumulation

Mit diesem Formular simulieren wir hier einen TrautCoin Client, also ein Programm, mit dem man TrautCoins transferieren kann. Hier wird ein Client simuliert, bei dem jeder Netzwerkteilnehmer seine TrautCoin Token an jeden anderen transferieren kann, was natürlich in der Realität auch nicht so ist. Der Einfachheit halber habe ich hier keine Wallets zur Auswahl gestellt, sondern die Personen selbst, also nicht mehr anonymisiert. Auf der rechten Seite sieht man dann die Guthaben dieser Personen.

Passworte

Person 1: 123456, Person 2: 234561, Person 3: 345612, Person 4: 456123, Person 5: 561234

TrautCoin Guthaben

Hier seht ihr die Guthaben der einzelnen generierten Personen in der BlockChain des TrautCoin.