Samstag, 30. Dezember 2017

Goldrausch im Cyberspace: Bitcoin und Blockchain für Programmierer nachvollziehbar erklärt

Es heißt, Geld regiere die Welt. Deswegen unternehmen Staaten und Ihre Notenbanken viel dafür, um die Kontrolle darüber zu behalten. Sie kontrollieren seine Ausgabe und sorgen mit ausgeklügelten Sicherheitsmechanismen z.B. dafür, dass Bargeld nicht ohne weiteres kopiert werden kann.

Doch dieser Post möchte sich nicht mit "klassischem" Geld auseinander setzen, sondern vielmehr die spannende Welt der "Goldsuche im Cyberspace" unter die Lupe nehmen. Wie funktionieren Bitcoins und die darunter liegende Blockchain aus technischer Sicht? Und wie schaffen sie es, elektronisches Geld ohne eine zentrale Authentifizierungsinstanz in einem "gesetzlosen" Online-Netzwerk glaubhaft überweisen und aufbewahren zu können?

Blöcke
Zunächst ist die Blockchain nichts weiter als ein gigantisches Kassenbuch (ein sogenannter Public Ledger). Dort wurde und wird jede Überweisung (bzw. sogenannte Transaktion) von Anbeginn der Währung (im Jahre 2009) an verzeichnet (s. z.B. hier) und einem Peer2Peer-Netzwerk einander unbekannter Teilnehmer gespeichert. Ende 2017 war die Blockchain entsprechend bereits ca. 175 GB groß (vgl. z.B. hier). Somit lässt sich durch einen einfachen (aber inzwischen recht zeitaufwändigen) Blick in dieses Kassenbuch nachvollziehen, ob ein Konto ein ausreichendes Guthaben zur Ausführung einer Überweisung aufweist: der aktuelle Kontostand wird schlicht durch Aufsummieren aller Ein- und Auszahlungen für dieses Konto berechnet.

Doch wie kann in einem dezentralen Netzwerk garantiert werden, dass es nicht zu doppelten Kontonummern kommt? Grundsätzlich ist das überhaupt nicht garantiert, Bitcoin-Kontonummern sind prinzipiell nur Zufallszahlen, die allerdings aus einem gigantischen Raum von 2 hoch 160 Möglichkeiten ausgewählt werden. Damit ist es extrem unwahrscheinlich, dass zwei Teilnehmer die gleiche Kontonummer für sich ausgewählt haben.

Überweisungen innerhalb des Bitcoin-Netzwerks werden schlicht vom Auftraggeber mit einer digitalen Signatur versehen in das Netzwerk gesendet und dort typischerweise in Paketen zu einigen Tausend in sogenannten Blöcken (man könnte diese auch als Seiten des Kassenbuchs betrachten) zusammengefasst. Das illustriert auch bereits den ersten Teil des Begriffs Blockchain; und auch der zweite Teil ist alles andere als schwer zu verstehen: Blöcke werden nämlich über sogenannte Hashes versiegelt und miteinander verkettet, wie im Folgenden genauer beschrieben. 

Blöcke + Hashes = Blockchain
In aller Kürze: Hashes werden von Hash-Funktionen berechnet und bilden quasi einen digitalen Fingerabdruck für Daten. Beliebige Eingabedaten werden jeweils in eine charakteristische Bit-Kette von z.B. 256 Bit Länge umgerechnet, die meist in Hexadezimal-Schreibweise dargestellt wird.  Beispielsweise lautet der SHA256-Hash des Wortes "Bitcoin":

b4056df6691f8dc72e56302ddad345d65fead3ead9299609a826e2344eb63aa4

Genau diese SHA256-Hash-Funktion wird auch in der Bitcoin-Blockchain verwendet.

Eine wichtige Besonderheit von Hash-Funktionen ist, dass sie zwar deterministisch sind (also für eine gleiche Eingabe immer die gleiche Ausgabe liefern), bereits eine minimale Änderung an den Ausgangsdaten allerdings zu einer deutlichen und nicht vorhersagbaren Änderung des berechneten Hash-Werts führt. Es ist ein wichtiges Qualitätsmerkmal für Hash-Funktionen, die in der Kryptographie eingesetzt werden, dass ihre Bits möglichst zufallsverteilt sind. Für "bitcoin" anstatt "Bitcoin" lautet der SHA256-Hash beispielsweise:

 6b88c087247aa2f07ee1c5956b8e1a9f4c7f892a70e324f1bb3d161e05ca107b

Im kryptografischen Sinne gute Hash-Funktionen können daher zwar einfach berechnet, aber mit heutigen Mitteln nicht mehr zurückgerechnet werden. Sie erlauben es somit zu erkennen, ob an einem Dokument für das ein Hash erzeugt worden ist, manipuliert worden ist oder ob es noch seinem Ursprungszustand entspricht. Dies lässt sich sehr schön in dieser Online-Demo ausprobieren, mit der auch die weiteren Bausteine der Blockchain ausprobiert werden können.

Berechnet man nun für einen Transaktionsblock (vgl. Online-Demo) in der Blockchain einen Hash, fallen nachträgliche Manipulationen an den enthaltenen Überweisungen sofort auf, da der Hash nicht mehr zum enthaltenen Blockinhalt passt. Übernimmt man ferner den Hash eines Block in seinen Nachfolger und berechnet für letzteren abermals einen Hash, sind Manipulationen an beiden Blöcken leicht erkennbar. Und so weiter. Blöcke können somit untrennbar miteinander verkettet werden und bilden fortan die sogenannte Blockchain (s. Online-Demo).

Erschwerte Bedingungen
Doch wie stellt das Netzwerk sicher, dass jeder Teilnehmer die gleiche Blockchain verwendet (sog. Consensus) und diese nicht nachträglich durch eine Neuberechnung manipuliert werden kann? Schließlich dauert die Berechnung eines Hashs auch für große Daten nur Sekundenbruchteile. Prinzipiell könnte somit jeder Teilnehmer am Netzwerk seine eigene Version der Blockchain berechnen und versuchen, diese in Umlauf zu bringen?

Dies wird durch einen der genialen Kniffe des Bitcoin-Protokolls praktisch unmöglich gemacht: das Berechnen des Hash-Werts wird nämlich künstlich so erschwert, dass es stets eine gewisse Zeit in Anspruch nimmt, bis ein Block mit einem Hash versiegelt werden kann. Das Bitcoin-Protokoll steuert diese Erschwernis genau so, dass das gesamte Netzwerk ca. 10 Minuten benötigt, um einen korrekten Hash berechnen oder besser gesagt erraten zu können.

Wir erinnern uns, dass die Bits eines Hash-Codes quasi zufallsverteilt sind und nicht vorhergesagt werden können. Daher gibt es auch keine Möglichkeit, einen Hash-Code einer bestimmten Form zu erzeugen, außer der, so lange beliebige Zahlen (sog. Nonces) an das Ausgangsdokument anzuhängen, bis sich zufällig ein Hash-Code der gewünschten Form ergibt.

Ein gültiger Hash-Code zum Abzeichnen eines Transaktionsblock in der Bitcoin-Blockchain muss mit einer bestimmten Anzahl von Nullen beginnen (bzw. genauer muss er kleiner als ein vorgegebener Wert sein). Das ist in den Blöcken der Blockchain, die z.B. auch hier im Web verfügbar sind, sehr schön zu sehen. Die genaue Zahl der geforderten Nullen wird vom Protokoll beständig so angepasst, dass das gesamte Netzwerk wie bereits gesagt im Durchschnitt 10 Minuten damit beschäftigt ist, um einen passenden Hash zu erraten. Da Blöcke in der Bitcoin-Blockchain auf 1 Megabyte begrenzt sind, was normalerweise für etwas mehr als 2.000 Transaktionen reicht, gibt es momentan eine Obergrenze von maximal etwa 300.000 Transaktionen pro Tag. Zum Vergleich: alleine in Deutschland liegt die Zahl von Kreditkarten-Transaktionen pro Tag etwa zehn Mal so hoch. So verwundert es nicht, dass beispielsweise während des "Bitcoin-Crashs" im Dezember 2017 die Transaktionsgebühren etwa auf das zehnfache des normalen Stands angestiegen sind.

Im November 2017 wurden im Bitcoin-Netzwerk weltweit pro Sekunde etwa 10 Millionen mal 10 Millionen mal 10 Millionen (also 10 Millionen Tera- oder 1019) Hashes pro Sekunde berechnet, was einen immensen Aufwand bedeutet. Kein Wunder also, dass der geschätzte Stromverbrauch des Bitcoins-Netzwerks beständig wächst: nach diesen Schätzungen ist der CO2-Ausstoß für eine einzelne Bitcoin-Transaktion in etwa so hoch wie für eine Fahrtstrecke von ca. 750 km (Stand Anfang März 2018: > 2500 km) mit einem Mittelklassewagen. Vielleicht sollte Greenpeace in den USA also doch lieber wieder Abstand von Bitcoin-Spenden nehmen*?

Auch nach deutlich vorsichtigeren Schätzungen liegt der minimale Stromverbrauch des Bitcoin-Netzwerks mit 1,6 Gigawatt bereits deutlich über den 1,21 Gigawatt, die Doc Brown in "Zurück in die Zukunft" zum Verzweifeln brachten:

 

Die leistungsstärkste Spezialhardware (sogenannte Mining Rigs), die Ende 2017 auf dem Markt war, der Antminer S9 schafft übrigens ca. 14 Tera-Hashes pro Sekunde (und verbraucht pro TH etwa 100 Watt), was den Umgekehrschluss nahe legt, dass weltweit derzeit bereits deutlich über eine Million Geräte Bitcoin-Mining betreiben. Zum Vergleich, der Laptop des Autors schafft mit einem Java-Programm auf Basis von java.security.MessageDigest ohne Multi-Threading gerade mal etwa 1,5 Millionen SHA256-Hashes pro Sekunde.

Bitcoin-Mining
Stellt sich die Frage, warum die Teilnehmer einen solchen Aufwand betreiben und dem Netzwerk Hardware und Unmengen von Energie zur Verfügung stellen sollten? Die Antwort ist einfach und abermals einer der gut überlegten Kniffe, die die Blockchain am Laufen halten: der Teilnehmer, der einen passenden Hash gefunden hat, wird mit Bitcoins belohnt, das Signieren der Blöcke ist also genau die Aufgabe, die beim sogenannten "Bitcoin-Mining", also beim Schürfen bzw. Erschaffen von Bitcoins erfüllt werden muss. Jeder "Miner" schreibt zu Beginn eine Überweisung an sich selbst in den Transaktionsblock, den er zu signieren versucht; findet er einen passenden Hash, ist seine Überweisung automatisch mit in die Blockchain aufgenommen. Aktuell gibt es dafür eine Belohnung von 12,5 neu geschaffenen Bitcoins (sog. Coinbase-Transaktion, vgl. Online-Demo), diese wird vom Protokoll allerdings alle 210.000 Blöcke halbiert, ein entsprechender Countdown bis zur nächsten Halbierung findet sich natürlich im Web. Es lässt sich abschätzen, dass ca. 2032 die Höhe der Belohnung auf unter 1 Bitcoin fallen und mit Block 6.930.000 der letzte (der 21millionste) Bitcoin ca. im Jahr 2136 geschürft sein wird.

Nun drängt sich abermals die Frage auf, warum die Netzwerk-Teilnehmer dann weiterhin große Summen in Elektrizität und Hardware investieren sollten, um Blöcke zu signieren und damit das Netzwerk am Leben zu erhalten. Die Antwort ist abermals recht einfach, die Idee ist nämlich, dass zu dieser Zeit alle Transaktionen mit einer Überweisungsgebühr entlohnt werden sollen. Diese wird demjenigen gutgeschrieben, der den jeweiligen Block signiert. Das ist übrigens heute schon möglich, daher werden Transaktionen mit Transaktionsgebühren üblicherweise bevorzugt in Blöcke aufgenommen und können somit schneller signiert werden.

Überweisungen authentifizieren
Bleibt noch die Frage zu klären, wie in einer Kryptowährung wie Bitcoin Überweisungen anonym veranlasst und bestätigt werden können. Hierfür werden sogenannte Public-Key-Systeme, wie sie auch in der Verschlüsselung von E-Mails eingesetzt werden, verwendet. Diese bestehen vereinfacht gesagt aus einem öffentlichen und einem privaten (elektronischen) Schlüssel. Der Einfachheit halber entspricht der gehashte öffentliche Schlüssel im Bitcoin-System der Kontonummer, so dass Überweisungen dorthin getätigt werden können. Bitcoin ist somit nicht komplett anonym, sondern besser mit einem System von Nummernkonten zu vergleichen. Eine solche Kontonummer ist zum Beispiel die folgende (und da sage noch einer, IBANs seien kompliziert):

1D8rYSDNh28JU8gVQh5HTcWN2uouPbcVL9

Auf diese Nummernkonten kann natürlich nur mit dem zugehörigen privaten Schlüssel zugegriffen werden. Nur der Inhaber dieses elektronischen Schlüssels (den wir uns wieder als eine komplizierte Zahlenkombination vorstellen können) ist in der Lage, mit Hilfe seines Schlüssels und einer kryptografischen Funktion Überweisungen an andere öffentliche Schlüssel (also Nummernkonten) zu signieren. Und mit Hilfe des öffentlichen Schlüssels des Absenders kann von jedem Teilnehmer am Bitcoin-Netzwerk überprüft werden, ob tatsächlich der rechtmäßige Kontoinhaber eine Transaktion authorisiert hat. Ist das nicht der Fall, wird die Transaktion nicht in die Blockchain aufgenommen.

Möchte ein Teilnehmer also eine Überweisung tätigen, signiert er sie mit seinem privaten Schlüssel und sendet sie in das Bitcoin-Netzwerk, wo sie an alle Mining-Rechner (oder kurz: Miners) verteilt wird. Jeder dieser Rechner sammelt eine Reihe von Überweisungen und fügt sie zu einem Block zusammen. Anschließend beginnt das große Wettrennen, welcher der Miners zuerst einen passenden Hash errät, mit dem ein neuer Block an die Blockchain angehängt werden kann (vgl. Online-Demo).

Geht der private Schlüssel zu einem Konto verloren, sind auch dorthin überwiesene Bitcoins unwiederbringlich verloren, mit heutige bekannten Mitteln ist dieses System nicht zu knacken. Fehlgeleitete Überweisungen ereilt im Übrigen das gleiche Schicksal, auch sie sind für immer dem Konto zugeordnet, an das sie überwiesen wurden und können ohne einen passenden privaten Schlüssel nicht zurücküberwiesen werden.

Forks
Bleibt abschließend noch eine Detailfrage zu klären, was nämlich passiert, wenn zufällig zwei Teilnehmer ungefähr gleichzeitig Hashes für ihre Transaktionsblöcke finden? Was im mittlerweile sehr stark gewachsenen Bitcoin-Netzwerk durchaus häufiger passieren kann. Damit könnte beispielsweise ein böswilliger Teilnehmer versuchen, seine Bitcoins zwei Mal auszugeben, diese Überweisungen in verschiedene Teile des Netzwerks zu senden und darauf zu hoffen, dass beide in unterschiedlichen Blöcken an die Blockchain angehängt werden.

Doch das Bitcoin-Protokoll hat auch für diesen Fall vorgesorgt. Es sieht vor, dass neue Blöcke immer nur an die längste existierende Kette angehängt werden dürfen. Spaltet sich die Blockchain auf, kann es durchaus passieren, dass einige Zeit zwei gleichlange aber verschiedene Versionen der Kette im Netzwerk existieren, weil beide zufällig immer in etwa gleichzeitig mit neuen Blöcken verlängert werden. Spätestens beim sechsten Block ist die Wahrscheinlichkeit dafür allerdings so weit abgesunken (auf unter 0,1%), dass eine sechs Blöcke zurückliegende Überweisung als dauerhaft angenommen werden kann.

Das ist übrigens auch genau der Grund, warum man bei höheren Beträgen eine Stunde (und damit sechs Blöcke) abwarten sollte, bevor man eine Überweisung anerkennt. Landet eine Transaktion nämlich in einem kürzeren Zweig der Kette, wird sie mitsamt ihres Blocks gelöscht und muss abermals in einem anderen Block abgezeichnet werden, bzw. ist unter Umständen natürlich auch bereits in der längeren Version der Blockchain aufgenommen worden.

Weiterführend
Ich habe an einem Artikel zu Bitcoins in Informatik Aktuell mitgewirkt, die technischen Hintergründe sind im ersten Teil erklärt, der Handel mit Bitcoins wird im zweiten Teil genauer erläutert.


* Anmerkung: Sämtliche Zahlen über den Energieverbrauch von Bitcoin sind natürlich mit Vorsicht zu genießen, insbesondere, wenn daraus noch Aussagen zum CO2-Ausstoß abgeleitet werden sollen. Wobei sich der Stromverbrauch auf Basis der erzeugten Hashes sicherlich noch recht gut abschätzen lässt. Deutschland ist auf Grund seiner hohen Strompreise natürlich vergleichsweise unattraktiv zum Bitcoin-Mining, gilt aber als recht vorbildlich, was die Nutzung von erneuerbaren Energien angeht. Nichtsdestotrotz liegt der aktuelle Ausstoß von CO2 pro kWh noch bei knapp 500 g, was bedeuten würde, dass eine Bitcoin-Transaktion nach hiesigen Gegebenheiten insgesamt rund 300 kg CO2 produziert, wenn man von aktuell (09/19) rund 600 kWh pro Transaktion ausgeht.

Und dieser Wert ist sicher in einem sinnvollen Rahmen: geht man davon aus, dass ein einzelner Miner ca. 1,5 kWh verbraucht, könnten wir 400 Miner damit eine Stunde betreiben. Da eine Transaktion in einem Block ist, für den nur 1/6 einer Stunde benötigt wird, reicht das für rund 2500 Miner. Und gehen wir nun von durchschnittlich 1000 Transaktionen pro Block aus, wären wir bei etwa 2,5 Millionen Minern, die dafür genutzt werden können. Wohlgemerkt mit der optimiertesten Spezial-Hardware, die gerade am Markt verfügbar ist.