Zurück zum Inhaltsverzeichnis des Manuskripts verteilte Systeme

8.4.3 Blöcke und Blockketten

Transaktionen

Als Transaktion bezeichnet man bei Blockchain-Anwendungen einen Sachverhalt, der in der zugehörigen Blockchain aufgezeichnet werden soll. Im Finanzwesen wie zum Beispiel bei der Bitcoin-Anwendung steht der Begriff für eine Kontobewegung. Zu jeder Transaktion gehört ein durch Attribute beschriebener Datensatz. Bei Bitcoin beispielsweise haben die Datensätze unter anderem folgende Attribute:

Alle Transaktionen enthalten einen Zeitstempel, mit dessen Hilfe sie in eine zeitliche Reihenfolge gebracht werden können. Weiterhin werden sie mit einem Public-Key-System verschlüsselt, und zwar mit dem geheimen Schlüssel des für die Transaktion verantwortlichen Teilnehmers, dessen öffentlicher Schlüssel bekannt sein muss. Bei der Bitcoin-Anwendung ist die Kontonummer eines Teilnehmers sein öffentlicher Schlüssel. Durch die Verschlüsselung werden Transaktionen autorisiert, denn nur der Kontoinhaber kann die Transaktion so verschlüsselt haben, dass sie mit Hilfe seiner Kontonummer entschlüsselt werden kann.

Hauptbücher

Die Transaktionen einer Blockchain-Anwendung werden in einem sogenannten Hauptbuch (engl. Ledger) gespeichert. Dabei muss bei vielen Blockchain-Anwendungen die zeitliche Reihenfolge der Transaktionen berücksichtigt werden. Das Führen eines Hauptbuchs ist beispielsweise üblich bei der Verwaltung von

Ein Hauptbuch wie das bei der Bitcoin-Anwendung ist ein Mittel zur Dokumentation von Eigentumsübertragungen und liefert dadurch den Nachweis über den Besitz von Eigentum. Da ein Verlust, eine teilweise Zerstörung oder eine Fälschung eines Hauptbuchs gravierende Folgen haben kann, wird es üblicherweise mehrfach vorgehalten, und jedes Exemplar muss sicher aufbewahrt werden.

Bei Blockchain-Anwendungen führt jeder Teilnehmer eine Kopie des Hauptbuchs, das heißt, dass es hier sehr viele Exemplare gibt. Allein aufgrund zeitlicher Verzögerungen bei der Nachrichtenübertragung können diese Exemplare voneinander abweichen und es muss durch ein geeignetes Verfahren sichergestellt werden, dass letztendlich alle ein und dieselbe Hauptbuchausprägung benutzen. Der nächste Abschnitt (8.4.4 Blockverteilung) geht darauf ein.

Technisch gesehen werden die anfallenden Transaktionen zu Blöcken zusammengefasst, und diese Blöcke werden miteinander verkettet, was zu dem Begriff Blockchain (im technischen Sinne) geführt hat. Das heißt, dass eine Blockchain-Anwendung mit der dabei verwendeten Blockchain das Führen eines Hauptbuchs realisiert. Der Aufbau der Blöcke und einer Blockkette wird in wenigen Absätzen beschrieben.

Da in ein Hauptbuch und damit in die zugehörige Blockchain nur zulässige (gültige) Transaktionen aufgenommen werden dürfen, muss jeder Teilnehmer der Blockchain-Anwendung über ein entsprechendes anwendungsabhängiges Regelwerk verfügen, und dieses Regelwerk muss für alle Teilnehmer identisch sein. Es muss festlegen, wie Transaktionen aufgebaut sein müssen (Regeln über die Form einer Transaktion), welche inhaltlichen Gegebenheiten wie zum Beispiel der Umgang mit Kontoüberziehungen zu berücksichtigen sind (Regeln über die Semantik einer Transaktion) und ob die Ausführung der Transaktion korrekt autorisiert worden ist.

Blockaufbau

Die Transaktionen einer Blockchain-Anwendung, genauer gesagt die zugehörigen Datensätze, werden von jedem Teilnehmer zu sogenannten Blöcken zusammengefasst. In jedem Block werden die Transaktionen (die Datensätze) über Hashreferenzen baumartig miteinander verbunden. Dies wird im Folgenden über das allmähliche Entstehen eines Blocks mit einer Verzeigerungsstruktur in Form eines binären Baums dargestellt. Beschrieben wird eine Situation, bei der ein Teilnehmer einer Blockchain-Anwendung gerade einen Block fertiggestellt und in seine Blockchain aufgenommen hat. Jetzt erreicht ihn eine neue Transaktion, die er mit seinem Regelwerk untersucht. Er kann sie als korrekt bewerten und beginnt mit ihr den Aufbau eines neuen Blocks. Mit einer kryptographischen Hashfunktion, die auch alle anderen Teilnehmer verwenden, wird der Hashwert des Datensatzes berechnet und als Referenz auf den Datensatz benutzt. Anschaulich zeigt er auf den Datensatz (auf die Transaktion) und ist vorläufiger Blockkopf. Die folgende Grafik veranschaulicht diesen Sachverhalt:


Hashbaum-1

Jetzt soll eine zweite Transaktion T2 den Teilnehmer erreichen, als korrekt bewertet und in den Block aufgenommen werden. Dazu wird von ihr der Hashwert h2 bestimmt, dieser mit dem Hashwert der ersten Transaktion zu einer Zeichenkette zusammengefasst und davon wiederum der Hashwert h12 berechnet. Dieser wird neuer vorläufiger Blockkopf:


Hashbaum-2

Nach Aufnahme einer weiteren Transaktion T3 mit dem Hashwert h3 entwickelt sich der binäre Transaktionsbaum mit einem neuen Kopf in dem Block zu:


Hashbaum-3

Wird schließlich eine vierte Transaktion T4 aufgenommen, dann entsteht in dem Block der folgende Baum mit dem Blockkopf h1234:


Hashbaum-4

Auffallend an einem solchen Transaktionsbaum ist seine Veränderungsresistenz. Es ist aufwändig, im Nachhinein Änderungen an Transaktionen im Block vorzunehmen, weil durch eine Änderung an einem der Datensätze einer Transaktion die daraus abgeleiteten Hashreferenzen nicht mehr stimmen, neu berechnet und ebenfalls geändert werden müssen. Erfolgt dies nicht, kann durch Nachrechnen der Hashwerte eine Änderung an einer Transaktion sofort bemerkt werden.

Um eine ungefähre Vorstellung davon zu bekommen, welche Größe Transaktionen und Blöcke in der Praxis haben, soll wieder die Bitcoin-Anwendung herangezogen werden. Dort haben die Blöcke in der Regel eine Größe von 2 MByte. Setzt man sehr grob für die Größe einer Transaktion 500 Bytes an, dann passen 2.000 Transaktionen in einen Block. (Und es wird etwa alle 10 Minuten ein neuer Block gebildet und der Blockkette hinzugefügt.)

Blockheader

Ist ein Block voll, dann wird er vor seinem Einbringen in die vorhandene Blockchain abgeschlossen. Man sagt dazu, er werde versiegelt. Dieses Versiegeln eines Blocks geschieht dadurch, dass der versiegelnde Teilnehmer einen Proof of Work (einen Arbeitsnachweis) erbringen muss, der im Lösen eines Hashpuzzles besteht. Dieser Vorgang wird als Schürfen (Mining) bezeichnet, weil er an das Schürfen von Edelmetallen erinnert. Dabei wird folgendermaßen vorgegangen: Zunächst erhält der Block einen vorläufigen Blockkopf (Block Header) mit den folgenden Werten:

  1. eine Hashreferenz auf den vorherigen Block, (Nur der erste Block einer Blockchain hat keinen solchen Eintrag.)
  2. die Hashreferenz auf den Kopf des Transaktionsbaums des aktuellen Blocks,
  3. den Schwierigkeitsgrad des noch zu lösenden Hashpuzzles und
  4. den Zeitpunkt an dem das Schürfen (das Lösen des Hashpuzzles) beginnen soll.

Ein Blockkopf ist vollständig, also dann nicht mehr vorläufig, wenn er durch die Lösung (das Nonce) des Hashpuzzles ergänzt wird. Das geschieht, indem der vorläufige Blockkopf als eine Zeichenkette betrachtet wird, zu der ein Nonce zu suchen ist, also eine Zeichenfolge, die zusammen mit dem vorläufigen Blockkopf einen Hashwert ergibt, der die im Blockkopf angegebene Bedingung erfüllen muss. Bei der Bitcoin-Anwendung muss er mit einer bestimmten Anzahl an Nullen beginnen. Das Puzzle ist offensichtlich um so schwieriger zu lösen, je mehr führende Nullen gefordert werden. Dann wird dieser Block per Broadcast an alle Teilnehmer der Blockchain-Anwendung mit der Bitte um Lösen des Puzzles übermittelt. Alle Teilnehmer, auch der, der den Block erzeugt hat, suchen jetzt nach einer Lösung des Puzzles. Der erste, der eine Lösung findet, sendet diese wiederum per Broadcast an alle Teilnehmer der Blockchain-Anwendung. Er erhält dafür eine (finanzielle) Belohnung, die er übrigens zurückgeben muss, wenn es sich herausstellt, dass seine Lösung falsch ist. Geht bei einem Teilnehmer eine Lösung ein, unterbricht er sein Schürfen, prüft die Korrektheit der Lösung und ergänzt, falls die Lösung korrekt ist, den vorläufigen Blockkopf durch die Lösung (das durch das Schürfen gefundene Nonce). Dann nimmt er den Block, der jetzt einen vollständigen Blockkopf hat, in seine Blockchain auf.

Blockketten

Dadurch, dass jeder Block (außer dem ersten) mit der ersten Hashreferenz seines Kopfs auf den vorangehenden Block verweist, entsteht eine Kette (versiegelter) Blöcke. Die folgende Grafik zeigt eine solche Blockkette. In der Darstellung sind die Blockköpfe stark vereinfacht und auf die beiden im Kopf enthaltenen Hashreferenzen reduziert worden. Der Transaktionsbaum in einem Block wird durch ein Dreieck symbolisiert.


Blockkette

Man beachte die große Veränderungsresistenz einer solchen Blockkette. Wird in irgendeinem der in der Blockchain enthaltenen Blöcke auch nur eine Transaktion im Nachhinein (und sei es auch noch so geringfügig) geändert, dann sind nicht nur die Hashreferenzen in dem zugehörigen Block ebenfalls zu verändern, sondern als Folge daraus ist auch die Versiegelung (also das Lösen des Hashpuzzles) für diesen Block zu wiederholen. Dadurch verändert sich jedoch das Nonce im Blockkopf, was dazu führt, dass auch die Hashreferenz im Header des darauf folgenden Blocks nicht mehr stimmt und dessen Hashpuzzle ebenfalls erneut gelöst werden muss usw. bis zum vorläufigen Kopf der Blockchain.

Die Hashpuzzles, mit denen die Blöcke versiegelt werden, werden durch ein Schürfen gelöst. An diesem sind sehr viele Teilnehmer beteiligt. Will ein einzelner Teilnehmer im Nachhinein eine der Transaktionen ändern, dann muss er alle diese Hashpuzzles allein lösen. Durch diese Überlegung wird deutlich, dass dies umso schwieriger wird, je länger die Blockchain ist und je weiter vorn in der Kette der Block steht, in dem eine Transaktion geändert werden soll. Je näher am Anfang einer Blockchain ein Block steht, desto fälschungssicherer ist er.



Zurück zum Inhaltsverzeichnis des Manuskripts verteilte Systeme