Am Ende von Schritt 15 haben wir festgestellt, dass die Blockchain-Datenstruktur Daten veränderungssensitiv speichert. Jede Änderung der in der Blockchain-Datenstruktur gespeicherten Daten wird offensichtlich und muss über einen aufwendigen Prozess in die bestehende Struktur eingepflegt werden. In diesem Schritt wird erläutert, wie dieses Merkmal genutzt werden kann, um die Transaktionsdatenhistorie für die Freigabe und Verteilung in einer nicht vertrauenswürdigen Umgebung vorzubereiten, ohne dass zu befürchten ist, unehrliche Mitglieder eines Peer-to-Peer-Systems könnten deren Inhalt zu ihrem eigenen Vorteil manipulieren.
Angenommen, ich möchte mich als Mitglied einer ehrwürdigen Adelsfamilie ausgeben. Wie würde ich das tun? Zum Beispiel durch das Fälschen eines Stammbaums. Ich könnte einen adligen Großvater erfinden und in diesem gefälschten Familienstammbaum eine Verbindung zwischen ihm und mir herstellen. Aber überzeugt das andere von meiner (falschen) adligen Herkunft? Dieser Betrug dürfte recht schnell aufgedeckt werden, denn Stammbäume stehen selten für sich allein – sie sind über Verwandtschaftsbeziehungen mit anderen Stammbäumen verbunden und verwoben. Wenn also keiner der Stammbäume der etablierten Adelsfamilien einen Verweis auf oder eine verwandtschaftliche Beziehung mit meinem erfundenen Großvater enthält, ist meine fiktive Familiengeschichte schnell als Betrug entlarvt. Damit meine erfundene Familie anerkannt wird, muss ich auch die Aufzeichnungen einiger der etablierten Adelshäuser fälschen, indem ich Verweise auf meinen ausgedachten Stammbaum in deren Geschichte einfüge. Doch selbst das ist vielleicht noch nicht genug, schließlich leben echte Menschen echte Leben und hinterlassen dabei Spuren in der Weltgeschichte. Mein erfundener Großvater hat allerdings niemals gelebt. Ich muss also einen Lebenslauf für ihn erfinden, damit die Fälschung real erscheint – und zwar für sein gesamtes Leben, von der Kindheit über seine Ausbildung bis zu seinem späteren beruflichen Werdegang. Auch Dokumente, die diesen Lebenslauf belegen, müssen gefälscht werden: Geburtsurkunde, Einschulungsunterlagen, Zeugnisse, Diplome, Ausbildungsbescheinigungen, Meisterbriefe, Mitgliedschaften usw. Schulen, Universitäten und Arbeitgeber haben Unterlagen über die Schüler, Studenten und Mitarbeiter, veröffentlichen Jahrbücher oder Fotografien von gesellschaftlichen Veranstaltungen. Diese Nachweise müsste ich ebenfalls fälschen, damit mein fiktiver Großvater als ehemaliges Mitglied der entsprechenden Einrichtungen durchgeht. Allerdings ist das Manipulieren all dieser Unterlagen nicht nur kompliziert, sondern auch kostspielig, deshalb denke ich, ich würde letztlich doch bei meiner echten, nicht adligen Familiengeschichte bleiben ...
Dieses Gedankenspiel zeigt, dass es zwar möglich ist, die Vergangenheit »zurechtzubiegen«, aber eben auch extrem aufwendig, denn es sind umfassende Änderungen und Fälschungen erforderlich, um die vorzutäuschenden Angaben glaubhaft in die vielen Unterlagen und Querverweise der echten Historie einzubetten. Der hierfür zu betreibende Aufwand ist außerordentlich hoch – im Verhältnis dazu ist es viel einfacher, die Wahrheit zu sagen. In diesem Schritt wird erklärt, inwiefern die Blockchain diese Erkenntnis nutzt, um die Transaktionsdatenhistorie vor Fälschungen zu schützen.
Es ist wichtig, dass die gesamte Transaktionsdatenhistorie in der Blockchain stets die Wahrheit abbildet, damit sie als vertrauenswürdige Quelle zum Abklären von Eigentumsangelegenheiten dienen kann.
Die Blockchain ist ein für alle zugängliches, rein verteiltes Peer-to-Peer-System. Daher besteht die Gefahr, dass unehrliche Peers die Transaktionsdatenhistorie zu ihrem eigenen Vorteil manipulieren oder fälschen. Die Herausforderung besteht in diesem Fall darin, das System für alle zu öffnen und gleichzeitig die Transaktionsdatenhistorie vor Fälschungen und Manipulationen zu schützen.
In einem offenen verteilten System ist es kaum oder gar nicht möglich, die »ehrlichen Knoten« im Vorfeld von den unehrlichen zu unterscheiden. Um die Transaktionshistorie vor Manipulationen durch »unehrliche Knoten« zu schützen, können wir radikal jede Manipulation der Historie unterbinden, unabhängig davon, wer Änderungen vornehmen will. Wenn niemand die Transaktionsdatenhistorie ändern kann (ob ehrlich oder unehrlich), müssen wir uns um mögliche Manipulationen keine Gedanken mehr machen. Ist die Transaktionsdatenhistorie also von Anfang an unveränderlich, haben wir das Problem gelöst. Das System kann in der Folge für alle offen bleiben und niemand muss Angst davor haben, dass unehrliche Knoten die Transaktionshistorie manipulieren.
Unveränderlichkeit bedeutet, dass etwas nicht geändert werden kann. Unveränderliche Daten können nach dem Erzeugen oder Schreiben nicht geändert werden. Daher bezeichnet man diese Daten auch als Nur-Lese-Daten oder schreibgeschützte Daten. Sie dienen einzig dazu, Informationen ausschließlich zum Lesen oder Darstellen zu liefern – das ist besonders wünschenswert, wenn diese Daten weitergegeben werden und somit keine Kontrolle mehr über ihre weitere Verwendung besteht. Die Weitergabe unveränderlicher Daten ist eine wirkungsvolle Möglichkeit, Änderungen oder Manipulationen an den Dateninhalten zu verhindern. Führerscheine, Ausweispapiere und Zeugnisse sind Beispiele für unveränderliche Dateninhalte im echten Leben. Sie werden von Behörden erstellt, um eine Tatsache zu dokumentieren – und ihr einzig beabsichtigter Zweck besteht darin, vorgezeigt und gelesen zu werden.
Die Grundidee einer unveränderlichen Transaktionshistorie für die Blockchain besteht darin, Änderungen unverhältnismäßig aufwendig zu machen, sodass jegliche Manipulationsbestrebungen bereits im Keim erstickt werden. Eine unveränderliche Transaktionsdatenhistorie besteht aus drei Komponenten:
dem Speichern der Transaktionsdatenhistorie in einer Weise, dass selbst kleinste Manipulationen klar erkennbar und offensichtlich sind,
dem Erfordernis, dass das Einbetten einer Manipulation in die Transaktionshistorie ein Neuschreiben großer Teile derselben erfordert,
dem Konstruieren einer Historie, in der das Hinzufügen, Schreiben oder Neuschreiben von Daten rechenintensiv ist.
Die Blockchain-Datenstruktur, in der die Daten veränderungssensitiv gespeichert sind, erfüllt die erste Anforderung. Auf diese Weise können Daten, die Teil der Blockchain-Datenstruktur sind, nicht heimlich und in der Hoffnung geändert werden, dass niemand diese Manipulation bemerkt. Jegliche Änderung ist ganz deutlich sichtbar, denn sie zerstört die Hashreferenzen, die infolge von Modifikationen in den Verweiszielen ungültig werden.
Auch die zweite Anforderung wird von der Blockchain-Datenstruktur erfüllt, denn sie verfolgt bei Änderungen an ihren Daten einen radikalen Alles-oder-nichts-Ansatz: Entweder wird die Datenstruktur ab dem Punkt, der die Änderung verursacht, bis zum Kopf der gesamten Kette geändert, oder man sieht von vornherein besser von Änderungen ab.
Die dritte Anforderung oder Komponente ist für jene gedacht, die sich nicht scheuen, große Teile der Blockchain-Datenstruktur neu zu schreiben, um eine Manipulation in die Transaktionshistorie einzubetten. Denn sobald das Schreiben oder Neuschreiben der Blockchain-Datenstruktur hohen Rechenaufwand und dadurch hohe (monetäre) Kosten verursacht, überlegen es sich die meisten zweimal, ob das Ändern überhaupt eine gute Idee war.
Das Blockchain-Technologiepaket stellt einen unveränderlichen Inhalt der Blockchain-Datenstruktur sicher, indem das Schreiben, Neu-Schreiben oder Hinzufügen von Blöcken zur Blockchain-Datenstruktur erheblichen Rechenaufwand fordert. Der Rechenaufwand wird durch Hashpuzzles erzeugt, die für jeden Block-Header eindeutig sind und einzeln gelöst werden müssen.[1] Somit kann man entweder den Gesamtaufwand für eine Änderung der Datenstruktur ab dem Punkt, der die Modifikation verursacht hat, bis zum Kopf der Kette (dem Listenkopf) akzeptieren, indem man für jeden beteiligten Block-Header ein Hashpuzzle löst, oder man unterlässt den Manipulationsversuch von vornherein.
Das Verfahren zum Anfügen eines neuen Blocks an die Blockchain-Datenstruktur selbst (vgl. Schritt 15) ist nicht rechenintensiv, da nur die Hashreferenz, die auf den aktuellen Listenkopf verweist, zum neuen Block-Header hinzugefügt und ein neuer Listenkopf definiert werden muss. Die Herausforderung einer unveränderlichen Blockchain-Datenstruktur besteht darin, das Hinzufügen eines neuen Blocks (künstlich) zu einer rechenintensiven Aufgabe zu machen. Zu diesem Zweck müssen die folgenden Aspekte betrachtet werden:
Obligatorische Daten der Block-Header
Verfahren zum Erstellen eines neuen Block-Headers
Validierungsregeln für Block-Header
Jeder Block-Header in der Blockchain-Datenstruktur muss mindestens folgende Daten enthalten:[2]
Die Wurzel eines Hashbaums, der Transaktionsdaten enthält
Eine Hashreferenz auf den Header des vorhergehenden Blocks
Den Schwierigkeitsgrad des Hashpuzzles
Den Zeitpunkt, zu dem mit der Lösung des Hashpuzzles begonnen wurde
Die Nonce, die das Hashpuzzle löst
Das Erstellen eines neuen Blocks umfasst die folgenden Schritte:
Erzeugen der Wurzel des Hashbaums, der die einzutragenden Transaktionsdaten enthält
Erzeugen einer Hashreferenz auf den Header des Blocks, der zum Vorgänger des neuen Blocks wird
Ermitteln des erforderlichen Schwierigkeitsgrades
Ermitteln der aktuellen Uhrzeit
Erzeugen eines vorläufigen Block-Headers, der die in den Punkten 1 bis 4 aufgeführten Daten enthält
Lösen des Hashpuzzles für den vorläufigen Block-Header
Fertigstellen des neuen Blocks durch Hinzufügen der Nonce, die das Hashpuzzle für den vorläufigen Header löst
Abbildung 16.1 stellt das Hashpuzzle dar, das beim Eintragen eines neuen Blocks in die Blockchain-Datenstruktur gelöst werden muss. Die Grafik zeigt die Daten des Block-Headers, dessen Hashwert die vorgegebenen Beschränkungen bzw. den Schwierigkeitsgrad erfüllen muss. Beachten Sie, dass der Schwierigkeitsgrad Teil des Block-Headers ist und somit auch in den Hashwert des Blocks einfließt. Auf diese Weise ist sichergestellt, dass niemand den Rechenaufwand eines Hashpuzzles durch mutwilliges Reduzieren des Schwierigkeitsgrades umgehen kann.
Jeder Block-Header muss die folgenden Regeln oder Vorschriften erfüllen:
Er muss eine Hashreferenz auf einen vorhergehenden Block enthalten.
Er muss eine gültige Wurzel eines Hashbaums enthalten, der Transaktionsdaten aufweist.
Er muss einen korrekten Schwierigkeitsgrad enthalten.
Sein Zeitstempel muss nach dem Zeitstempel des vorhergehenden Block-Headers liegen.
Er muss eine Nonce enthalten.
Der Hashwert aller fünf kombinierten Datenwerte muss den Schwierigkeitsgrad erfüllen.
Die Validierungsregeln stellen sicher, dass nur solche Blöcke in die Blockchain-Datenstruktur eingetragen werden, für die das Hashpuzzle gelöst und der Rechenaufwand geleistet wurden. Regel 4 stellt sicher, dass die Blöcke und Transaktionsdaten tatsächlich in der Reihenfolge der Zeitpunkte der Eintragungen sortiert sind.
In der Blockchain-Datenstruktur sind beliebige Änderungen infolge der Zerbrechlichkeit der Hashreferenzen klar erkennbar, denn diese Referenzen werden bei Modifikationen der Verweisziele beschädigt. Das führt dazu, dass alle von einer Manipulation betroffenen Blöcke neu geschrieben werden müssen. Die Hashpuzzles verursachen Kosten für jeden Block, der zum Einbetten einer Manipulation neu geschrieben werden muss. Und die kumulierten Kosten für das Neuschreiben der Blockchain-Datenstruktur beim Einbetten einer Manipulation machen es unvorteilhaft, die Transaktionshistorie überhaupt zu manipulieren. Damit wird die Blockchain-Datenstruktur zu einem unveränderlichen Nur-Hinzufüge-Datenspeicher.
Einmal angenommen, wir möchten einen bestimmten Transaktionsdatenwert manipulieren, der Teil eines Hashbaums ist, dessen Wurzel zu einem Block-Header gehört, der sich wiederum 20 Blöcke vom aktuellen Kopf der Blockchain-Datenstruktur entfernt befindet. In diesem Fall müssen wir die folgenden Arbeiten ausführen, um die manipulierten Transaktionsdaten einzubetten:
Neuschreiben des Hashbaums, zu dem die manipulierte Transaktion gehört
Neuschreiben des Block-Headers, zu dem die Wurzel des neu geschriebenen Hashbaums gehört
Neuschreiben aller nachfolgenden Block-Header bis zum Kopf der Blockchain-Datenstruktur
Für Punkt 2 müssen wir ein Hashpuzzle lösen, denn beim Ändern der Wurzel des Hashbaums ändert sich auch der Hashwert des Block-Headers und somit die Lösung des zugehörigen Hashpuzzles. Für Punkt 3 müssen wir 20 Hashpuzzles lösen, da sich die Hashreferenzen auf die jeweils vorhergehenden Block-Header allesamt ändern. Davon ausgehend, dass wir ein Hashpuzzle im Schnitt in 10 Minuten lösen können, benötigen wir also insgesamt 210 Minuten, um eine Manipulation einer Transaktion einzubetten, die zu einem Block-Header gehört, der 20 Blöcke vom aktuellen Kopf entfernt ist. Diese gewaltigen Kosten halten Knoten davon ab, die Blockchain-Datenstruktur zu ändern.
Die Unveränderlichkeit der Blockchain-Datenstruktur ist abhängig vom Rechenaufwand, die durch das Hashpuzzle verursacht werden. Die Schwierigkeit des Hashpuzzles entscheidet, wie groß der Rechenaufwand ist und wie viel Zeit für dessen Lösung benötigt wird – und das wiederum entscheidet über die Unveränderlichkeit der Blockchain-Datenstruktur. Ist der Schwierigkeitsgrad zu niedrig, sinken der Rechenaufwand für Änderungen der Blockchain-Datenstruktur und kann in Folge dessen nicht mehr als unverhältnismäßig hoch betrachtet werden, wodurch sich einige Knoten möglicherweise dazu ermuntert fühlen, die Transaktionsdatenhistorie zu manipulieren. Ist der Schwierigkeitsgrad allerdings zu hoch, wird möglicherweise selbst der Rechenaufwand für das Anfügen eines neuen Blocks als unangemessen hoch betrachtet, sodass Knoten davon abgehalten werden, neue Transaktionsdaten hinzuzufügen. Eine der Herausforderungen beim Entwerfen einer Blockchain besteht also darin, das passende Maß für die Schwierigkeit der Hashpuzzles zu finden. Und diese Herausforderung wird mit einer entsprechend des technischen Fortschritts veränderten Rechenleistung der Computer sogar noch anspruchsvoller. Es kann also erforderlich sein, den Schwierigkeitsgrad dynamisch anzupassen.
Blockchain-Anwendungen in der Realität setzen nur selten auf einen gleichbleibenden Schwierigkeitsgrad für sämtliche Blöcke. Stattdessen wird normalerweise ein dynamischer Schwierigkeitsgrad gew��hlt, der sich danach richtet, wie schnell neue Blöcke hinzugefügt werden. [3] Auf diese Weise ist sichergestellt, dass die für das Lösen der Hashpuzzles erforderliche Zeit so gewählt ist, dass Knoten von Manipulationen der Transaktionsdatenhistorie abgehalten werden, während der tatsächliche Rechenaufwand ansteigt.
Dieser Schritt hat gezeigt, dass die Blockchain Manipulationen oder Fälschungen der Transaktionsdatenhistorie verhindert, indem die Blockchain-Datenstruktur als unveränderlicher Nur-Hinzufüge-Datenspeicher verwendet wird. Der nächste Schritt konzentriert sich darauf, diesen Datenspeicher allen Knoten in einem verteilten Peer-to-Peer-System zugänglich zu machen.
Die Blockchain schützt die Transaktionsdatenhistorie vor Manipulationen und Fälschungen, indem die Transaktionsdaten in einem unveränderlichen Datenspeicher abgelegt werden.
Die Transaktionshistorie wird mithilfe von zwei Konzepten unveränderlich:
Speichern der Transaktionsdaten in der veränderungssensitiven Blockchain-Datenstruktur, die beim Ändern das Neuschreiben der Datenstruktur ab dem Punkt, der die Änderung verursacht, bis zum Kopf der gesamten Kette (Listenkopf) erforderlich macht
Erfordernis des Lösens eines Hashpuzzles beim Schreiben, Neuschreiben oder Hinzufügen jedes einzelnen Block-Headers in der Blockchain-Datenstruktur
Das Hashpuzzle ist für jeden einzelnen Block-Header einzigartig, denn es ist von dessen Inhalt abhängig.
Das Erfordernis, die Blockchain-Datenstruktur bei Änderungen neu zu schreiben, sowie die Kosten dafür machen es unvorteilhaft, die Transaktionsdatenhistorie überhaupt zu manipulieren.
Das Erfordernis einer Lösung für ein Hashpuzzle bei jedem Schreiben, Neuschreiben oder Hinzufügen von Block-Headern in der Blockchain-Datenstruktur führt dazu, dass sie zu einem Nur-Hinzufüge-Datenspeicher wird.
Ein Block-Header enthält mindestens die folgenden Daten:
Eine Hashreferenz auf den Header des vorhergehenden Blocks
Die Wurzel eines Hashbaums, der Transaktionsdaten enthält
Den Schwierigkeitsgrad des Hashpuzzles
Den Zeitpunkt, zu dem mit der Lösung des Hashpuzzles begonnen wurde
Die Nonce, die das Hashpuzzle löst
[1] Nakamoto, Satoshi. Bitcoin: A peer-to-peer electronic cash system. 2008. https://bitcoin.org/bitcoin.pdf.
[2] Okupski, Krzysztof. Bitcoin developer reference. Arbeitspapier. 2014.
[3] Okupski, Krzysztof. Bitcoin developer reference. Arbeitspapier. 2014; Wood, Gavin. Ethereum: A secure decentralized generalized transaction ledger. 2014. http://gavwood.com/paper.pdf.