Proof-of-Work

Wie Proof-of-Work am Beispiel von Hashcash funktioniert

Proof-of-Work ist ein wichtiges Verfahren des Minings bei Kryptowährungen und anderen Blockchain-Anwendungen. In diesem Beitrag wollen wir uns dessen Funktionsweise anhand des Beispiels “Hashcash” genauer ansehen.

Einführung

Hashcash ist kein neues Konzept. Es wurde bereits 1997 von Adam Black entwickelt und veröffentlicht. Seine ursprüngliche Idee war es, E-Mail-Spam zu verringern. Der Grundgedanke darin ist, dass jeder, der eine E-Mail versenden möchte, zuvor eine gewisse Rechenleistung aufwenden und dies nachweisen muss (“Proof-of-Work”). Erst dann wird die E-Mail vom Empfänger akzeptiert.

Was macht das für einen Sinn? Angenommen, für jede E-Mail die versendet werden soll, muss zuvor eine Rechenzeit von im Schnitt 2 Sekunden aufgewendet werden. Für einen normalen Versender kein großes Problem, da der Zeitversatz unmerklich ist. Wenn ein Spammer jedoch hunderttausende E-Mails versenden möchte, und für jede E-Mail zusätzlich diese Zeit an Rechenpower investieren muss, kann ihm dies hohe Kosten verursachen, zumindest aber den Versand deutlich verlangsamen. Theoretisch könnte es für ihn dann Wochen anstatt Sekunden dauern, um mehrere tausend E-Mails zu versenden.

Die Betonung liegt allerdings auf “theoretisch”. Denn Spammer verwenden immer häufiger illegale Botnets, einem Netzwerk aus infizierten Rechnern, um darüber Spam zu versenden. Sie bezahlen also nicht für Rechenleistung und die Einbeziehung von tausenden infizierten Botrechnern. Auch der Geschwindigkeitsnachteil wird durch die Vielzahl der Rechner wieder relativiert. Im E-Mail-Umfeld hat sich dieses Verfahren deswegen nie so richtig durchgesetzt.

In den letzten Jahren hat das hinter Hashcash liegende Konzept “Proof-of-Work” einen neuen Hype erfahren, da es eine wichtige konzeptionelle Basis beim sogenannten “Mining” innerhalb von Blockchain-Anwendungen wie z. B. Bitcoin darstellt.

Doch wie funktioniert Proof-of-Work eigentlich unter der Motorhaube? Hierzu verwenden wir Hashcash, um es genauer zu erklären.

Hashing spielt eine zentrale Rolle

Um Hashcash und Proof-of-Work zu verstehen, ist es zunächst wichtig, zu verstehen, wie Hashfunktionen (Hashing) funktionieren. Sofern Du es nicht weißt bzw. eine kleine Auffrischung lesen möchtest, habe ich die wichtigsten Punkte zum Hashing hier zusammen gefasst: Wie funktioniert Hashing?

Wie funktioniert das Proof-of-Work-Verfahren am Beispiel von Hashcash?

Wie der Name schon sagt, ist ein wichtiger Bestandteil von Hashcash das Hashing mit dem sozusagen bezahlt wird. Beim Hashing ist es nicht möglich, aus einem errechneten Hashwert den ursprünglichen digitalen Eingabewert zu rekonstruieren. Umgekehrt heisst das, wenn ich einen ganz bestimmten Hashwert z. B. 00006e21 als Ergebnis haben möchte, es keinen anderen Weg gibt, als die Eingabe solange durch Ausprobieren zu verändern, bis ich als Ausgabe den gewünschten Hashwert erhalte. Dies bedeutet Rechenpower und damit Rechenzeit. Für SHA-1 Hashwerte sind im Schnitt ca. eine Million Versuche nötig, wenn das Ziel ist, die Eingabe für einen Hashwert zu ermitteln, der genau vier führende Nullen besitzt. Auf modernen Prozessoren dauert dies im Schnitt ca. 2 Sekunden.

hashing_3

Der Hashcash-Header beim Versender

Das Verfahren von Hashcash ist nun so simpel wie genial: Es schickt in jeder E-Mail einen Header mit. Dieser Header besteht unter anderem aus der E-Mail-Adresse des Empfängers und einer Zufallszahl. Ein Beispiel für einen solchen Header (siehe Wikipedia):

X-Hashcash: 1:20:1303030600:adam@cypherspace.org::McMybZIhxKXu57jd:ckvi

Über diesen gesamten Header wird dann ein Hashwert berechnet. Ziel ist es nun, dass der Versender die Zufallszahl im Header (in diesem Beispiel McMybZIhxKXu57jd) solange verändert, bis der berechnete Hashwert vier führende Nullen also z. B. 00000b7c65ac70650eb8d4f034e86d7d5cd1852f mit SHA-1 besitzt. Da der Versender keine andere Möglichkeit als die passende Zufallszahl durch Ausprobieren zu ermitteln, wird er im Schnitt eine Million Versuche bzw. 2 Sekunden Rechenleistung aufwänden müssen. Erst wenn er die passende Zufallszahl gefunden hat, versendet er die E-Mail inkl. dem Header an den Empfänger.

Der Hashcash-Header beim Empänger

Der Empfänger wiederum berechnet seinerseits den Hashwert aus dem Header (was sehr performant funktioniert) und überprüft, ob dieser Hashwert vier führende Nullen besitzt. Falls ja, ist das der Beweis, dass der Versender die entsprechende Rechenzeit von ca. 2 Sekunden aufgewendet hat und er kann die E-Mail akzeptieren. Für einen exponentiell höheren Rechenaufwand beim Versender ist nur die Anzahl der führenden Nullen zu erhöhen. Die Anzahl dieser führenden Nullen nennt man z. B. beim Bitcoin-Mining “Difficulty”.  Beim Empfänger bleibt der Aufwand hingegen gleich.

Fazit

Hashcash ist technisch gesehen ein so geniale wie einfache Lösung, um sich mit Rechenpower zu legitimieren. So lange jedoch Spammer Zugang zu beliebig großen und nahezu kostenlosen Rechenressourcen durch Botnets haben, wird es sich im E-Mail-Umfeld nicht durchsetzen.

Das grundsätzliche Konzept hingegen, sich mit der eigenen Rechenpower zu legitimieren und  damit zu bezahlen (Proof-of-Work), ist ein äußerst interessanter Ansatz. Im Zuge von Blockchain wird dieses Verfahren immer wichtiger und ständig verbessert. Idealerweise bald auch mit einer Lösung für optimierten Energieverbrauch, denn dies ist eines der Nachteile dieses Verfahrens. Es benötigt zusätzlich viel Energie und ist einer der Hauptgründe, warum derzeit viel über den hohen Energieverbrauch gerade beim Bitcoin-Mining diskutiert wird.

Stephan Niedermeier