Blockchain für Angeber


Die Blockchain-Technologie wird in den nächsten Jahren wohl zunehmend an Bedeutung gewinnen. Selbst große Finanzinstitute fangen bereits an eigene Blobkchain-Algorithmen für ihre Transaktionen zu evaluieren. Es gibt sogar Pilotprojekte, welche mit Hilfe der Blockchain ein soziales Netzwerk realisiert haben. Die Anzahl der Software-Entwickler, welche sich mit dieser Technologie befassen müssen, wird in den nächsten Jahren sehr wahrscheinlich sprunghaft ansteigen. Ich selbst habe mich daher einmal rangesetzt und mich in das Thema eingelesen.

Einführung

Die Blockchain ist dazu entworfen worden Transaktionen für immer und unveränderlich festzuhalten. Sie ist als ein Währungssystem entwickelt worden, welches frei zugänglich ist und nicht manipuliert werden kann. Wurde eine Transaktion einmal in die Blockchain aufgenommen ist sie dort permanent enthalten und kann nicht wieder entfernt werden. Diese Eigenschaft macht die Blockchain gerade für Finanztransaktionen interessant. So ist es beispielsweise möglich jemandem einen Betrag zu überweisen, welcher weder widerrufen noch im Nachhinein angefochten werden kann.

Der Name Blockchain kommt von einzelnen Transaktionblöcken, welche in einer endlosen Kette zusammengefügt werden. Dabei werden mehrere Transaktionen in einem Block zusammengefasst. Die Blöcke selbst werden anschließend an das Ende der Blockchain gehängt. Dadurch wächst die Blockchain immer weiter an. Ein Block mit Transaktionen kann jedoch nicht einfach in die Blockchain aufgenommen werden. Zuerst muss dazu der letze Block analisiert werden und eine Herausforderung gelöst werden. Nur, wenn diese Herausforderung korrekt ist kann der Block an das Ende der Blockchain geschrieben werden. Die Herausforderung selbst kann je nach Blockchain-Technologie unterschiedlich ausfallen. Dies kann beispielsweise der Nachweis einer bestimmten Rechenleistung (Proof-of-Work), oder der Nachweis dass man einen großen Anteil an der gehandelten Währung besitzt (Proof-of-Stake) sein. Es können aber auch ganz andere Methoden zum lösen der Herausforderung möglich sein.

Interessant wird die Blockchain-Technologie erst dadurch, dass alle diese Schritte in einem Netzwerk von mehreren Teilnehmern durchgeführt werden. Jeder Teilnehmer arbeitet nicht nur daran die gestellte Herausforderung des letzen Blocks zu lösen, sondern validiert auch gleichzeitig alle bisherigen Blöcke. Eine falsch gelöste Herausforderung kann daher nicht in das Netzwerk aufgenommen werden. Nur wenn eine Herausforderung im Konsens des Netzwerks als gelöst gilt wird der neue Block und die darin enthaltenen Transaktionen in die Blockchain aufgenommen.

Aufbau einer Blockchain

Die Blockchain besteht aus unendlich vielen Blöcken. Ein einzelner Block besteht aus Header-Informationen und einem Body. Der Body enthält eine bestimmte Anzahl von durchgeführten Transaktionen (Transactions) und deren Hashes, welche in einem Hash-Baum (Merkle-Tree) abgelegt sind. Der Header wiederum besteht aus dem Hash des letzen Blocks (Previous Hash), einem Zeitstempel(Timestamp), und einer Zufallszahl (Nounce). Mehr ist für die Blockchain nicht nötig. Je nach Blockchain-Technologie können jedoch auch weitere Header-Informationen enthalten sein.

Wie bereits beschrieben enthält der Body eines Blocks mehrere Transaktionen. Eine Transaktion ist eine Operation die ein beliebiger Nutzer gerne in der Blockchain festhalten möchte. Meistens handelt es sich bei diesen Operationen um Überweisungen. Denkbar sind jedoch auch andere Operationen, wie etwa das Festhalten einer Nachricht oder die Lösung einer mathematischen Formel. Mit Ethereum ist es beispielsweise möglich Programmcode in eine Transaktion zu stecken.

Über jede Transaktion wird ein Hash gebildet. Dieser ist dazu  da einen Hash-Baum aufzubauen. Am Ende des Hash-Baumes, wenn also alle Transaktionen berücksichtigt wurden, erhält man den Root-Hash (Merkle Root). Keine Transaktion kann sich nun mehr ändern, ohne das auch der Root-Hash davon beeinflusst würde. Kommt eine weitere Transaktion beispielsweise hinzu, so müsste man den Root-Hash neu berechnen.

Ein ganzer Block hat ebenfalls einen einzigartigen Hashwert. Dieser Block-Hash berechnet sich aus den Werten des Root-Hashes, der aktuellen Uhrzeit, einer Zufallszahl und dem Block-Hash des vorherigen Blocks. Bei den Transaktionen ist es so, dass sich keine Transaktion ändern kann, ohne das sich zwangsläufig auch der Root-Hash ändern würde. Bei dem Block-Hash gilt dies ebenfalls. Hinzu kommt jedoch, dass der Block-Hash mit Hilfe des vorherigen Block-Hashes des alten Blockes berechnet wird. Der alte Block kann sich also nicht mehr ändern, sobald der neue Block-Hash berechnet wurde. Würde sich ein Block irgendwo in der Mitte der Blockchain verändern, so wäre die gesamte Blockchain invalide und damit ungültig. Jeder Teilnehmer hat die Möglichkeit dies zu erkennen, indem er die Hashwerte selber nachrechnet. Eine Manipulation der Blöcke ist damit nicht möglich.

Währungen

Blockchains haben meist eine eigene digitale Währung, welche der jeweiligen Blockchain-Technologie ihren Namen gibt. Um eine Blockchain zu realisieren ist eine eigene Währung jedoch nicht zwangsläufig notwendig. Es könnten beispielsweise auch Dollar-Transaktionen in einer Blockchain festgehalten werden, ohne dass dabei selbst ein neuer Wert entstehen müsste. Dollar-Transaktionen in einer Blockchain festzuhalten macht jedoch oft nur wenig Sinn. Nur weil eine Überweisung in der Blockchain festgehalten wurde heißt das noch lange nicht, dass diese auch im realen Leben stattgefunden hat. Aus diesem Grund wurden Blockchains von Anfang an mit eigenen Währungen ausgestattet. Wenn Währungen nur durch Transaktionen innerhalb der Blockchain generiert und überwiesen werden können, dann ist sichergestellt, dass alle Transaktionen von allen Teilnehmern zurückverfolgbar sind. Niemand hat die Möglichkeit eigene Einheiten der Währung zu generieren oder zu verteilen. Zwar finden hierbei ebenfalls keine Transaktionen in der realen Welt statt, dies ist jedoch auch nicht mehr nötig. Der Wert ist nun kein Dollar-Schein mehr, sondern eine virtuelle Einheit, welche es im echten Leben überhaupt nicht gibt. Ob und wie lange ein rein virtuelles Gut wirklich an Wert behält wird die Zukunft zeigen.

Transaktionen

Um in einer Blockchain Währungen zu handeln benötigen die Teilnehmer eigene Adressen. Hierzu wird ein Schlüsselpaar benötigt. Ein Schlüsselpaar besteht aus einem öffentlichen und einem privaten Schlüssel. Der private Schlüssel ist geheim. Aus ihm kann jederzeit der öffentliche Schlüssel generiert werden. Der öffentliche Schlüssel kann ohne Bedenken weiter gegeben werden, da er alleine ohne Nutzen ist. Der öffentliche Schlüssel wird daher als Adresse hergenommen. Sind die Adressen von zwei Parteien bekannt, so kann damit eine Transaktion erstellt werden.

Eine Transaktion besteht aus Eingängen und Ausgängen. Ein- und Ausgänge müssen dabei nicht gleich hoch oder in gleicher Anzahl vorhanden sein. So können beispielsweise 30 Einheiten von einer Adresse auf jeweils drei Adressen mit je 10 Einheiten innerhalb der gleichen Transaktion aufgeteilt werden. Wichtig ist letztendlich nur, dass gleich viel hinein wie auch hinaus geht.

Um sicherzustellen, dass eine Transaktion valide ist, muss der Ersteller der Transaktion diese mit seinem privaten Schlüssel signieren. Dadurch wird gewährleistet, dass kein anderer die besagte Transaktion erstellt hat. Wie bereits erwähnt können Währungseinheiten nicht einfach so erstellt werden. Jede Adresse kann nur dann eine Einheit verschicken, wenn sie diese früher einmal erhalten hat. Da jede Transaktion in der Blockchain gespeichert ist, kann dies von jedem überprüft werden. Die gesamte Blockchain nach Zahlungseingängen zu durchforschen, nur um zu überprüfen, ob die besagte Adresse wirklich genug Einheiten angehäuft hat, währe jedoch viel zu aufwendig. Eingänge von Transaktionen sind daher nicht etwa bestimmte Einheiten der Währung von einer Adresse, sondern jeweils Ausgänge von vergangenen Transaktionen. Hat eine Adresse beispielsweise einmal 30 Einheiten erhalten, so kann sie auf diese Transaktion verweisen. Der gesamte Betrag der vergangenen Transaktion wird dabei als Eingangswert für die neue Transaktion hergenommen. Nur einen Teilbetrag aus einer vergangenen Transaktion herauszunehmen ist nicht möglich. Möchte man nur einen Teil der eingezahlten Beträge auf eine andere Adresse überweisen, so muss man sich den überbleibenden Betrag wieder selbst gutschreiben lassen. Das hört sich kompliziert an, macht die Validierung der gesamten Blockchain jedoch um einiges einfacher. Verfügt eine Adresse beispielsweise über 70 Einheiten und möchte 60 Einheiten davon an eine andere Adresse überweisen, so muss sie im schlimmsten Fall 10 Einheiten an sich selbst überweisen.

Mining

Eine öffentliche Blockchain lebt von ihren Teilnehmern. Nur wenn ständig neue Blöcke generiert werden in denen Transaktionen festgehalten werden ist eine Blockchain zu gebrauchen. Daher ist es wichtig, dass sich möglichst viele Teilnehmer daran beteiligen neue Blöcke zu generieren. Als Ansporn für ihre Mühe erhalten diejenigen eine Gutschrift, welche selbständig einen Block generiert haben. Genauer gesagt gibt sich derjenige selbst die Gutschrift, welcher den Block berechnet hat. Transaktionen werden in der Blockchain aufgeteilt in eingehende und ausgehende Transaktionen. Der Wert der ausgehenden Transaktionen darf jedoch um einen bestimmten Anteil größer sein, als der Wert der eingehenden Transaktionen. Diesen zusätzlichen Anteil kann der Ersteller des Block nun auf seine eigene Adresse überweisen. Damit hat er durch das Berechnen des Blocks einen Gewinn gemacht. Der Vorgang neue Blöcke zu generieren wird als Mining bezeichnet. Einen Teilnehmer bezeichnet man als Miner.

Zusätzlich zu den neu generierten Einheiten gibt es noch eine andere Möglichkeit um die Arbeit eines Miners zu würdigen. Dies geschieht mit Transaktionsgebühren. Da eingehende und ausgehende Transaktionen getrennt betrachtet werden, kann derjenige welcher die Transaktion erstellt die ausgehende Transaktion geringer ansetzen. Am Ende bleibt dabei ein Anteil übrig, den sich der Miner selbst gut schreiben kann. Möchte ein Teilnehmer beispielsweise 100 Einheiten an einen anderen überweisen,und zahlt 105 Einheiten ein, dann kann sich der Miner die 5 Einheiten, welche zuviel eingezahlt wurden gutschreiben. Der Initiator der Transaktion macht dies jedoch meistens nicht nur aus purer Dankbarkeit. Wird ein neuer Block generiert, so bleibt es im Ermessen des Erstellers des neuen Blocks, welche Transaktionen er in den Block aufnimmt. Sieht er keinen Grund eine Transaktion in seinen zu berechnenden Block aufzunehmen, so muss er dies nicht tun. Transaktionsgebühren sind quasi ein Anreiz für den Ersteller des neuen Blocks die gewünschte Transaktion in den Block aufzunehmen. Dies wird besonders dann wichtig, wenn ein hohes Transaktionsvolumen herrscht und jeder möglichst schnell möchte, dass seine Transaktion in die Blockchain aufgenommen wird.

Einen neuen Block zu generieren hat seine Vorteile. Um sicher zu stellen, dass nicht jeder anfängt tausende von Blöcke zu generieren und sich die Summe, welche dabei generiert wurde gutschreibt, muss die Anzahl der Blöcke zeitlich begrenzt werden. Eine Vorgabe kann beispielsweise sein, dass nur jede Minute ein neuer Block generiert werden darf. Um dies sicherzustellen gibt es mehrere Methoden. Die verbreitetste in der Proof-of-Work, welcher auch bei der Generierung von Bitcoins zum Einsatz kommt. Es gibt jedoch auch andere Verfahren, wie beispielsweise den Proof-of-Stake.

Proof-of-Work

Der Proof-of-work (Beweis der Arbeit) beweist dem Blockchain-Netzwerk, dass der Ersteller eines Blockes Arbeit geleistet hat. Arbeit wird hier im Sinne von Rechenleistung verstanden. Um einen neuen Block zu generieren wird also Rechenleistung benötigt. Der Ersteller des Blocks muss eine Rechenaufgabe lösen. Oft wird diese Aufgabe als eine komplizierte mathematische Aufgabe beschrieben. Dies ist jedoch nicht richtig. Die Berechnung der Aufgabe ist sogar ziemlich simpel. Alles was man dafür tun muss ist es den Hash des Blocks zu berechnen.

Schwierig wird die Aufgabe erst dadurch, dass der Hash eine bestimmte Form haben muss. So ist es bei Bitcoin beispielsweise der Fall, dass Hashes mit führenden Nullen anfangen müssen. Der Hash eines Blockes sieht dann beispielsweise so aus: 00000000000000000049d7467305060c49d09e52583848a2fe3a2fe0a2b32a5c. Hashes haben die Eigenschaft, dass sich durch eine kleine Änderung im Ausgangswert der komplette Hash verändert. Würde sich bei einer Transaktion beispielsweise nur eine Ziffer ändern, so wäre der gesamte Hash des Blocks anders. Hier kommt nun die Nounce aus dem Header eines Blocks zum Einsatz. Durch Veränderung der Nounce kann der gesamte Hash des Blocks verändert werden. Um nun einen neuen Block generieren zu können muss eine Nounce gefunden werden, bei welcher die Hash-Berechnung die besagten führenden Nullen als Ergebnis liefert. Dies ist garnicht so einfach. Oftmals bedarf es Milliarden von Versuchen bis eine passende Nounce gefunden wurde. Das tolle an Hashes ist, dass sie keine Umkehrfunktion besitzen. Es kann also nicht einfach ein beliebiger Hash hergenommen werden um dadurch auf eine Nounce zu schließen.

Um nun die Berechnung von neuen Blöcken auf ein Zeitintervall einzuschränken muss nur die Schwierigkeit der Herausforderung angepasst werden. Schafft es das Netzwerk beispielsweise alle 10 Sekunden einen Block mit fünf führenden Nullen zu finden, so legt man einfach fest, dass nun sechs führende Nullen erforderlich sind. Nachdem diese Anpassung gemacht wurde kann das Netzwerk im Schnitt nur noch alle 2 Minuten einen neuen Block generieren. Die Anpassung der Schwierigkeit erfolgt automatisch durch den Algorithmus der Blockchain-Technologie. Die Überprüfung, ob die Schwierigkeit eingehalten, wurde ist ein zentraler Bestandteil der Validierung eines neuen Blocks.

Proof-of-Stake

Proof-of-Work hat den Nachteil, dass wahnsinnig viele Ressourcen verbraten werden.  Die besten Chancen einen Block zu finden hat derjenige, der möglichst viele Nouncen durchprobiert. Das verbraucht extrem viel Strom. Für eine Währung, welche sich der Zukunft verschrieben hat ist das eine relativ schlechte Eigenschaft. Proof-of-Stake soll dies ändern. PoS ist ein Verfahren, welches zukünftig bei Etherum zum Einsatz kommen soll und bereits erfolgreich bei NXT implementiert wurde. Miner sollen damit eine größere Chance haben neue Blöcke zu generieren, wenn sie selbst viele Einheiten der Währung halten. Wer beispielsweise 2% der gesamten Währung besitzt, hat eine 2% Chance den nächsten Block validieren zu können.

Zunächst hört sich das etwas ungerecht an. Wer viel hat bekommt viel zurück. Das mag stimmen. Jedoch bekommt jemand, der 2% der Währung besitzt auch nur 2% der Gewinne. Sein Gesamtanteil bleibt damit bei 2%. Jeder aktive Miner erhält sich damit letztendlich seinen Anteil an dem gesamten Kuchen. Um erfolgreich Minen zu können ist es daher nötig erst einmal selbst in die Währung zu investieren.

Wie hoch die Wahrscheinlichkeit ist einen Block zu generieren hängt von drei Faktoren ab. Das ist der Wert an Währungseinheiten, die vergangene Zeit seitdem der letzte Block generiert wurde und einer Basiseinheit, mit welcher die Geschwindigkeit gesteuert werden kann mit der neue Blöcke gefunden werden.

    \[Target = PersonalBalance * BaseTarget * ElapsedTime\]

Der Miner, oder besser Validator, nimmt nun den Hash des letzen Blocks und signiert diesen mit seinem öffentlichen Schlüssel. Dieser Wert wird als Hit bezeichnet. Sobald der Hit kleiner ist als das Target darf der Validator sich als Gewinner ansehen und einen neuen Block im Netzwerk propagieren.  Das Target berechnet sich aus der bereits verstrichenen Zeit. Umso mehr Zeit verstreicht, umso größer ist die Wahrscheinlichkeit, dass der Hit überschritten wird.

Denkbar wäre es, dass ein Miner versucht nur die Transaktionen in den aktuellen Block aufzunehmen, die seine Chance erhöhen den nächsten Block ebenfalls zu bekommen. In dem Fall würde er alle Permutationen von Transaktionen durchprobieren und davon diejenige mit dem kleinsten Hit als neuen Block geltend machen.

Mining-Pools

Das Minen von Blöcken ist unheimlich rechenaufwendig. Ein einzelner Rechner wird es kaum schaffen selbst einen Block zu generieren. Die Wahrscheinlichkeit dafür tendiert gegen null. Schließen man jedoch viele Rechner zusammen, so steigt die Wahrscheinlichkeit einen Block zu generieren mit der Anzahl der Rechner immer weiter an. Mining-Pools haben hieraus eine Geschäftsidee gemacht. In etwa wie bei einer Tippgemeinschaft können sich viele Teilnehmer in einem Pool zusammenschließen und gemeinsam nach Blöcken minen.

Wird ein Block gefunden, so erhalten alle Teilnehmer einen gewissen Anteil an dem dadurch generierten Betrag. Der Betrag richtet sich dabei nach der prozeduralen Anteil der erbrachten Leistung jedes Teilnehmers. Um die Leistung festzustellen werden sogenannte Shares benutzt. Ein Share ist ebenfalls ein Proof-of-Work. Er ist jedoch bedeutend einfacher zu generieren wie ein ganzer Block. Muss für einen Block beispielsweise ein Hash gefunden werden, welcher zehn führende Nullen aufweist, so muss für einen Share nur ein Hash gefunden werden, der beispielsweise 3 führende Nullen besitzt. Hat einer der Miner einen solchen Hash gefunden, dann kann er diesen zum Mining-Pool schicken. Der Mining-Pool vermerkt den gefundenen Hash und schreibt dem Teilnehmer diesen bei der Gewinnermittlung durch den nächsten generierten Block gut.

Die Aufgabe des Pools ist es jedoch nicht nur den Gewinn zu ermitteln, sondern auch das Minen selbst zu optimieren. Der Mining-Pool vergibt die Arbeit an die Teilnehmer. Das ist nötig, damit nicht mehrere Teilnehmer die selben Hashes berechnen. Solche, als Job bezeichneten Arbeitseinheiten, sind relativ klein, damit die Jobs möglichst flexibel verteilt werden können. Im durchschnitt rechnet ein Miner nur ein paar Sekunden an einem Job und holt sich dann den nächsten.

Konfliktlösung

Da es sich bei den Blockchain-Technologien um verteilte Anwendungen handelt kann sich immer mal wieder ein schwarzes Schaff unter den Teilnehmern befinden. Dies kann absichtlich mit den Versuch des Betrugs oder Versehentlich, weil beispielsweise ein uralter Klient verwendet wird, geschehen. Dadurch, dass jeder Klient die gesamte Blockchain zurück verfolgen und validieren kann ist ein Betrug durch Manipulation ausgeschlossen. Jeder Klient kann einen neu hinzugefügten Block auf Validität überprüfen und diesen ignorieren, falls er als invalide erkannt wurde.

Da Netzwerke von Klienten beliebig groß werden können können auch Probleme mit der Nebenläufigkeit entstehen. Das bedeutet, dass zwei unterschiedliche Klienten zur selben Zeit einen neuen Block berechnen und beide Blöcke an das Netzwerk geschickt werden. Beide Blöcke sind gültig und werden im Netzwerk verbreitet. Es entstehen nun zwei Netzwerkgruppen, welche jeweils mit unterschiedlichen Blockchains rechnen. Irgendwann wird einer der Klients beide Blockchains von unterschiedlichen Teilnehmern zugesandt bekommen. Er wird nun diejenige ignorieren, welche kürzer ist und mit der längeren der beiden weiter rechnen. Da die längere Blockchain bevorzugt im Netzwerk propagiert wird heilt sich das Netzwerk somit von selbst. Irgendwann wird kein Teilnehmer mehr mit der kürzeren Blockchain arbeiten.

Forks

Da die meisten Blockchains frei zugänglich sind und jeder nach belieben Teilnehmen kann gibt es des öfteren Unstimmigkeiten über die Zukunft der Blockchain-Technologie zwischen den Teilnehmern. Eine Gruppe möchte beispielsweise eine Änderung in der Berechnung der Blöcke vornehmen, die eine andere Gruppe ablehnt. Dies ist für die Blockchain kein Problem. Können sich die Teilnehmer nicht einigen, so kann jede Gruppe ihren eigenen Weg gehen. Die Blockchain wird in diesem Fall aufgeteilt. Dies wird als Fork bezeichnet.

Wie bereits beschrieben werden neue Blöcke nur dann akzeptiert, wenn sie von einem Klienten als gültig erklärt werden. Möchte man nun eine neue Berechnungsmethode einführen, so muss der neue Klient ab einem bestimmten Zeitpunkt eben nur noch Blöcke akzeptieren, welche mit der neuen Berechnungsmethode erstellt wurden. Blöcke, welche noch mit der alten Methode berechnet wurden werden von den neuen Klienten als ungültig erkannt. Dies beruht jedoch auf Gegenseitigkeit. Alte Klients beispielsweise erkennen die neuen Blöcke, welche mit der neuen Methode berechnet werden ebenfalls als ungültig an und rechnen mit ihrer eigenen Methode weiter. Es sind dadurch letztendlich zwei Netzwerke entstanden.

Wichtig dabei ist es, dass beide Netzwerke auf der gleichen Blockchain beruhen. Alle Transaktionen die vor der Abspaltung in die Blockchain aufgenommen wurden sind in beiden Blockchains enthalten. Hatte ein Teilnehmer des Netzwerks beispielsweise 50 Einheiten der jeweiligen Währung auf einer seiner Adressen, so hat er anschließend 50 Einheiten der neuen und der alten Blockchain-Währung.