Ein Blockchain-Beispiel Teil 1
Ein Problem
Das Rollenspiel der vorherigen Seiten ist so natürlich nicht auf Dauer umsetzbar. Und es gibt ein wesentliches Problem mit dem Transaktionsbuch: Einzelne Veränderungen auf wenigen Seiten fallen kaum auf. Für dieses Problem gibt es eine Lösung - sie heißt...
Blockchain
Blockchain heißt übersetzt nichts anderes als eine Kette aus Blöcken. Sie entspricht in dem Rollenspiel dem Transaktionsbuch und unter einem Block können wir uns eine Seite des Transaktionsbuchs vorstellen.
Die entscheidende Idee ist nun, dass wir die einzelnen Seiten des Transaktionsbuchs so miteinander verknüpfen (bzw. verketten), dass eine Manipulation auf irgendeiner Seite des Transaktionsbuchs sofort auf der obersten Seite als Fehler angezeigt wird.
Hierzu benötigen wir (mal wieder) eine kryptografische Hashfunktionen
Eine kollisionsresistente Streuwertfunktion, d.h. es ist praktisch unmöglich zwei unterschiedliche (beliebig große) Eingabewerte zu finden, die den gleichen Ausgabewert fester Länge (Hashwert) erzeugen (vgl. Fingerabdruck) => minimale Änderung das Eingabewerts erzeugt maximale Änderung des Ausgabewerts (ca. 50% der Bits)
Wenn auf jeder Seite des Transaktionsbuchs also noch der Hashwert der vorangegangenen Seite dazu geschrieben wird, dann haben wir schon die Verkettung der Seiten.
Umsetzung der Zusatzaufgabe "Schloss knacken"
Im Rollenspiel hatten die aktiven Teilnehmer die Zusatzaufgabe ein Zahlenschloss zu knacken, bevor sie eine Seite des Transaktionsbuchs abschließen konnten. Für unsere Blockchain führen wir so etwas ähnliches ein. Es wird eine Zahl gesucht, die nur einmalig verwendet wird. Diese Zahl heißt deswegen Nonce (Number used once). Sie ist der Arbeitsnachweis ("Proof of Work") für erfolgreiches "Schloss knacken".
Überlege erst einmal selbst: Hast du eine Idee, welche Eigenschaft die Nonce haben muss? (Tipp: Der Hashwert kommt hier erneut ins Spiel...)
Eine Nonce ist eine Zahl, die so lange geändert wird, bis der Hashwert nicht größer als eine bestimmte Obergrenze ist. Z.B. muss die Nonce so lange geändert werden, bis der Hashwert des gesamten Blockes inklusive Nonce mit mindestens vier Nullen beginnt.
Aufgabe
Welche Zahl musst du an die Zeichenkette 'A' hängen, damit der md5-Wert der Zeichenkette, die aus A und der Zahl besteht, mit '0000' beginnt?
Der md5-Wert von 'A80' ist z.B. '000766e7976637b592cbce71fd228e16' - er beginnt also nur mit drei Nullen.
>>> from hashlib import md5
>>> text = 'A80'
>>> m = md5(text.encode('utf-8'))
>>> m.hexdigest()
'000766e7976637b592cbce71fd228e16'