Mathematisch ausgedrückt, ist eine Hashfunktion eine Funktion, die gewisse Eingangsdaten beliebiger Länge durch Verschlüsselung auf eine Zeichenfolge mit fester Länge abbildet. Man kann sich ein Hash aber auch als eine Art Fingerabdruck vorstellen. Wie der Fingerabdruck zu einer bestimmten Person gehört, gehört der Hash zu einem ganz bestimmten Datensatz. Ein Hash beweist das Vorhandensein eines Dokuments zu einem bestimmten Zeitpunkt. Da in einer Blockchain nur wenig Speicherplatz zur Verfügung steht, begnügt man sich meistens mit einem kostengünstigen Hash. Man kann sogar sagen, dass eine Blockchain praktisch nur aus Hashes besteht. Beispiel einer Hashfunktion ist der SHA-256 Algorithmus (Secure Hash Algorithm). Der resultierende Hash kann hier ausprobiert werden. Unten derjenige für "ich heisse Reto". Für SHA-256 werden 512 Bits gebraucht. Dazu wird dem Computer zuerst angegeben aus wie vielen Bits die zu verschlüsselnde Nachricht besteht. Mein Vorname "Reto" wird im binären System durch 32 Bits abgebildet, jeder Buchstabe entspricht 8 Bits oder 1 Byte (siehe oberste Zeile unten). Die Zahl 32 sieht im binären System folgendermassen aus: 32 = 100000 = 1x32 + 0x16 + 0x8 + 0x4 + 0x2 + 0x1 Diese Zahl steht am Ende des Codes (siehe unten). Die nicht gebrauchten Stellen zwischen binärem Text und dessen Längenangabe werden mit Nullen aufgefüllt, um schliesslich auf die 512 Bits zu gelangen (siehe unten). Die 1 zu Beginn der zweiten Zeile gibt an, dass ab dort nicht mehr die ASCII Tabelle verwendet wird, sonst würde 1OOOOO = 20 statt 32 interpretiert. Dies ist der Input für die SHA-256 Hashfunktion. Der Output besteht dann aus 256 Bits. Der Hash in der obigen Grafik sieht optisch kürzer aus, was aber auf die hexadezimale Schreibweise zurückzuführen ist. Anwendung 1: Passwörter Meistgebrauchte Anwendung von Hashes ist die Passworteingabe. Die Speicherung von Passwörtern auf der Datenbank einer Internetseite ist keine gute Idee. Oft wird deshalb nicht das Passwort selber, sondern nur dessen Hash gespeichert. Beispiel: Falls ich das Passwort "blockchain-nachrichten" benutzen würde, ergibt der Hash: Dieser wird in die Datenbank geschrieben. Um das Passwort bei der Anmeldung zu prüfen, wird erneut der Hash generiert und mit dem gespeicherten verglichen. Viele Leute benutzen jedoch weiterhin einfache Passwörter, an die sie sich erinnern können. Für die gibt es aber ein Wörterbuch mit tabellierten Hash-Werten, womit der Hacker wieder einfaches Spiel hat. Deshalb werden heutzutage ein paar zufällige Zeichen an das Passwort angehängt (Salt genannt), bevor der Hash berechnet wird. Hier 2?5tq: Die Internetseite generiert nun ein sichereres Passwort. Der Zusatz muss nicht geschützt werden, da er nur dazu dient, dass ein Hacker kein Hash-Wörterbuch mehr benutzen kann. In der Datenbank der Internetseite steht nun: 3231835c22e0ae528dc92da96b8de2afec4aaca6844d39bc37a571a3a44be3e1 2?5tq Als zusätzliche Sicherheit kann die Hashfunktion mehrere Male durchlaufen werden. Anwendung 2: Sicherung der Bitcoin-Blockchain (Proof-of-Work) Jeder kann sich an der Sicherung der Bitcoin Blockchain beteiligen. Dazu muss er lediglich eine Software auf seinen Server runterladen und sicherstellen, dass er einen leistungsfähigen Prozessor sowie eine schnelle Internetverbindung (Bandbreite) hat. Die Software lädt die Blockchain auf den Server runter und führt gewisse Funktionen aus. Für die geleistete Arbeit dürfen sie an einer Lotterie teilnehmen. Diese läuft wie folgt ab: Zuerst wird der Kopfzeilen-Hash des Blocks generiert. Nun gilt es dem Blockinhalt Zahlen (Nonce) anzufügen, die einen Hash mit einer Null zu Beginn generieren. Wenn die Zahl 1 an den Text angehängt wird, resultiert per Zufall bereits ein Hash mit einer 0 am Anfang. Nun wird jeweils um 1 erhöht, bis ein Hash mit 2 Nullen gefunden wird. Dies geschieht erst nach 394 Versuchen beim Anhängen der Zahl 395. Als Bitcoin 2009 startete, musste ein Hash gefunden werden, der mit 32 Nullen begann: Der hexadezimale Wert beginnt mit weniger Nullen, da dies ja einem kompakteren Format entspricht. Es ist kein Zufall, dass im hexadezimalen System lauter F stehen, da im binären System nach den Nullen die grösstmögliche Zahl steht (224x1) und F im hexadezimalen System auch für den höchsten Wert steht. 0 und 1 entsprechen Kopf und Zahl bei einer Münze. Die Wahrscheinlichkeit, bei einem Münzwurf 32x Kopf (=0) zu werfen, beträgt: O,5^32 = O,OOOOOOOOO2325581 oder 1:43OOOOOOOO. Im Durchschnitt wurde zu Beginn von Bitcoin folglich nach 4,3 Mrd. Versuchen in der Lotterie gewonnen. Schauen wir mal, wie viele Nullen heute erforderlich sind. Dazu gehen wir auf blockchain.info: Da der Hash im hexadezimalen Format drin steht, muss er im Konverter ins binäre umgewandelt werden: Nun können die Nullen abgezählt werden. Da sich heute viele Computer an der Sicherung beteiligen und die Leistung der Prozessoren seit 2009 gestiegen ist, werden im Schnitt bereits 73 Nullen gefordert, damit immer noch nur all 10 Minuten ein Bitcoin Block entsteht. O,5^73 = O,OOOOOOOOOOOOOOOOOOOOO4235165 oder 1:944473296573929OOOOOOO Im Durchschnitt wird heute nach 9,4 Trilliarden Versuchen in der Lotterie gewonnen. Da Zahlen wie eine Trilliarde schwierig zu erfassen sind, wird der sogenannte Schwierigkeitsgrad (englisch Difficulty) definiert: Difficulty = benötigte Versuche heute / benötigte Versuche bei Start von Bitcoin 2009 9,4 Trilliarden / 4,3 Milliarden = 219 644 952 691 Anwendung 3: Light Wallets Die Grösse der Blockchain beträgt bereits ca. 85 GB. Dies ist zu viel für normale PCs oder Smartphones. Deshalb laden Light Wallets nur eine abgespeckte Version herunter, die keine Transaktionen, sondern nur die Kopfzeilen der Blockchain herunterladen. Die fehlenden Daten können dann bei den Minern angefordert werden. Die Hashes dienen als Beweismittel, dass der Miner die korrekten Daten liefert. Um möglichst wenig Beweis-Hashes zu brauchen, werden diese in einem sogenannten Merkle Tree geordnet (untere Grafik). Beispiel: Ein Smartphone Wallet fordert Transaktion Tx2 von einem Miner an. Der Root-Hash (Root für Wurzel des umgekehrten Baumes) ist in der Kopfzeile verankert. Führen die Hashes im Endeffekt zum Root-Hash, wurden keine Daten manipuliert. Hash2 kann das Wallet selber aus der angeforderten Transaktion Tx2 berechnen. Bei der oberen Anordnung werden also noch Hash1, Hash3 und Hash4 gebraucht, um den Root-Hash zu berechnen. Bei der unteren Anordnung genügen jedoch Hash1 und Hash34, da aus Hash1 und Hash2 Hash12 berechnet werden kann. Ein Hash wird über den Merkle Tree eingespart. Bei mehreren tausend Transaktionen pro Block ist die Einsparung immens.
1 Kommentar
Binäre Zeichen sind zwar für Computer geeignet, jedoch für den Menschen nicht wirklich leserlich. Deshalb wurde die hexadezimale Notation eingeführt. Mit 4 Bits können 16 Zeichen dargestellt werden: Damit kann das ABC nur bis zum Buchstaben F abgebildet werden. Daher wurde auf 8 Bits (=1 Byte) umgestellt. Da Geschichte pfadabhängig ist und die neue Version mit der alten hexadezimalen Notation kompatibel sein musste, wurden die 8 Bits als 2x4 Bits dargestellt. Damit können maximal 256 Zeichen dargestellt werden: Mein Vorname, bestehend aus 32 Bits, wird zu: ASCII Binär beinhaltet die 4 Bits Schreibweise, ausser dass die erste Null jeweils vernachlässigt wird. Dies ist auch wieder geschichtlich bedingt; ASCII bestand zuerst aus 7 Bits. Natürlich gibt es heute Konvertier-Programme:
Da in der Informatik meistens mit zwei Zuständen (ein/aus) gearbeitet wird, basiert die Mathematik auf Potenzen von 2 statt 10. Folgende Zahlensysteme werden bei Bitcoin gebraucht.
Beispiel: Zahl 64 (hinterste Stelle = 1. Stelle) Dezimal (dezi = 10) 1. Stelle = 10^0 = 1 4x1 = 4 2. Stelle = 10^1 = 10 6x10 = 60 Binär (bi = 2) 1. Stelle = 2^0 = 1 2. Stelle = 2^1 = 2 3. Stelle = 2^2 = 4 4. Stelle = 2^3 = 8 5. Stelle = 2^4 = 16 6. Stelle = 2^5 = 32 7. Stelle = 2^6 = 64 Zahl 64 =1000000 Hexadezimal: 1. Stelle = 16^0 = 1 2. Stelle = 16^1 = 16 3. Stelle = 16^2 = 256 Zahl 64 = 40 Basis 64 (Base64): 1. Stelle = 64^0 = 1 2. Stelle = 64^1 = 64 Zahl 64 = 10 Basis 58 (Base58): Dabei werden gewisse Zeichen von Base 64 aus Gründen der Verwechslung vermieden (so 0, O, I, l). Base58Check: Hier wird Base58 noch eine Prüfsumme angehängt. Ziel davon ist, Tippfehler zu erkennen. Base58Check ist schliesslich das Format der Bitcoin Adressen. |