Konsens

Published by Martin Schuster on

Angenommen, Bob erstellt zwei konkurrierende Transaktionen, wie in der Abbildung Doppelte Ausgabe (im Thema Benutzerüberprüfung – Adressen). In diesem Fall muss das Netzwerk entscheiden, welche Transaktion gültig ist und welche ignoriert werden soll.

Daher erstellen wir zunächst eine Datenstruktur, die wir Blockchain nennen.

Wir fügen die Transaktion von Bob in eine Datei ein, fügen ein paar Metadaten hinzu (z. B. einen Zeitstempel, einen Schwierigkeitswert, eine Nonce usw.).

Dies nennen wir Block. Im Moment ist es nicht wichtig zu verstehen, wozu all die verschiedenen Daten in dem Block gut sind. Wir werden uns einige von ihnen später ansehen.

Ein vereinfachter Block

Dann fügen wir diesem Block einen so genannten Block-Hash hinzu. Eine Hash-Funktion ist eine mathematische Funktion, die eine Eingabe beliebiger Länge zu einer Ausgabe mit fester Länge verdichtet.

Es gibt viele Hash-Funktionen. In Bitcoin verwenden wir eine Hash-Funktion namens SHA-256.

Sie können hier mit einigen Hash-Funktionen spielen:

Hashcalculator


Grundprinzip einer Hash-Funktion

Die Ausgabe sieht für uns zufällig aus, und das ist auch gut so. Es gibt drei wichtige Eigenschaften:

  • Wenn man die gleiche Eingabe verwendet, erhält man immer die gleiche Ausgabe.
  • Es ist unmöglich, von der Ausgabe auf die Eingabe zurückzugreifen (Einwegfunktion).
  • Ändert man die Eingabe auch nur ein klein wenig, ändert sich die Ausgabe (Hash) komplett.

Die Eingabe unserer Hash-Funktion sind die Metadaten und die Transaktionsdaten. Unser Ausgabe-Hash könnte wie folgt aussehen: 0x1b49c8ga3627f6…

Diesen Hash schreiben wir in den Kopf unseres Blocks und nennen ihn Blockhash. Sie werden in den nächsten Abschnitten verstehen, warum wir das Brauchen.

Die Metadaten und die Transaktion werden in die Hash-Funktion eingegeben, und die Ausgabe ist unser Block-Hash.

Es ist möglich, mehr als eine Transaktion in jeden Block zu schreiben. Das macht den gesamten Prozess effizienter. Aus Gründen der Übersichtlichkeit begnügen wir uns in dieser Lektion jedoch mit einer einzigen Transaktion.

Wenn wir eine kleine Änderung an den Transaktionsdaten vornehmen, ändert sich der resultierende Hash vollständig. Wie können wir dies zu unserem Vorteil nutzen? Wir können eine Kette von Blöcken bilden, die miteinander verbunden sind. Dazu nehmen wir den Hash des vorhergehenden Blocks in die Metadaten des folgenden Blocks auf und verwenden ihn als Teil der Eingabe in unserer Hash-Funktion. Das sieht folgendermaßen aus:

Der Blockhash des vorherigen Blocks wird Teil der Metadaten des folgenden Blocks.

Wenn Sie sich fragen, welcher Hash in den Block 1 (den ersten Block überhaupt) eingeht, in Bitcoin ist es 0.

Was würde also passieren, wenn jemand die Daten in Block 1 ändert?

  • Die Daten im Block ändern sich und damit auch die Eingabe für unsere Hash-Funktion.
  • Der Block-Hash von Block 1 ändert sich daraufhin.
  • Das würde bedeuten, dass sich die Metadaten in Block 2 ändern und
  • und damit auch der Blockhash von Block 2.
Änderungsablauf, wenn sich Details einer Transaktion in Block 1 ändern.

Die Verbindung zwischen Block 1 und 2 wird unterbrochen, wenn Block 2 nicht aktualisiert wird. Dies ist also eine einfache Möglichkeit, Änderungen in der Datenstruktur zu erkennen.

In dieser Datenstruktur verweist Block 2 auf Block 1, indem er seinen Block-Hash referenziert. Und Block drei verweist auf Block zwei, indem er seinen Block-Hash verwendet, und so weiter. Deshalb nennen wir dies Hash-Zeiger. Normalerweise wird er wie folgt dargestellt:

Hash-Zeiger zwischen Blöcken.

Und jetzt sagen wir, dass eine Transaktion nur auf eine Transaktion verweisen kann, die Teil eines vorherigen Blocks ist. Erinnern Sie sich an den Abschnitt, in dem wir gesagt haben, dass Debora überprüft, ob Chris Bobs Münze ausgeben darf und Bob Alices Münze ausgeben darf? Und dass dies ziemlich schwierig war? Hier haben wir die Lösung.

Nehmen wir an, Alice hat eine Transaktion durchgeführt, bei der sie eine Münze an Bob (genauer gesagt, an seine Adresse) geschickt hat. Bob kann diese Münze nun nur ausgeben, wenn sich die Transaktion von Alice in einem Block befindet, der Teil der Kette ist. Befindet sie sich nicht in einem solchen Block, werden alle anderen Knoten die Transaktion von Bob an Chris ignorieren, weil sie sagen würden, dass Bob diese Münze nicht besitzt.

Dies ist jedoch nur der erste Schritt zur Lösung des Problems der Doppelausgaben.

Bob könnte tatsächlich zwei Ketten erstellen. Eine Kette mit seiner Transaktion an Chris und eine Kette mit seiner Transaktion an Deborah. Beide Ketten wären tatsächlich “technisch korrekt”. Im Grunde könnte in diesem Fall jeder seine eigene Kette erstellen. Wenn also jeder Blöcke hinzufügen kann, wann immer er will, führt das zu keinem Konsens, wie man sich leicht vorstellen kann. Deshalb müssen wir das Hinzufügen von Blöcken auf irgendeine Weise einschränken.

Wir tun dies, indem wir bestimmten Benutzern das Recht einräumen, einen Block hinzuzufügen. Idealerweise sollte dieser Benutzerauswahlprozess jedes Mal einen anderen “Blockproduzenten” auswählen, und es sollte eine zufällige Wahl sein. Andernfalls könnte ein solcher Benutzer seine Macht missbrauchen. An dieser Stelle kommt unser Konsensmechanismus Proof of Work ins Spiel.

Categories: