28.01.2018

Bitcoins Datenstrukturen

Wenn man in Bitcoin investieren möchte, dann sollte man über die Hintergründe und Details von Bitcoin informiert sein. Wie schon oft haben viele über Bitcoin gelesen und wissen mittlerweile, was Bitcoin ist bzw. wie die Technologie Blockchain aufgebaut ist. Wenige aber wissen, wie die Datenstrukturen, die in der Blockchain abgespeichert werden, tatsächlich aussehen. So ist zum Beispiel die Bitcoin Adresse oder der Hash bzw. die ID der Transaktion auch nicht Teil der Blockchain. In diesem Artikel möchten wir darauf näher eingeben.

Mit dieser Beschreibung soll technischer Einblick in Bitcoin gegeben werden, damit Bitcoin Trader verstehen, was bei einer Transaktion eigentlich passiert. Sollten Sie Bitcoin kaufen wollen, haben Sie die Möglichkeit dies über Coinbase zu tun:

Tip: €8 Bonus bei Coinbase sichern

Registrieren Sie sich über diesen Link bei Coinbase, erhalten Sie €8 in Bitcoins von Coinbase geschenkt sobald Sie über €80 an einer digitalen Währung investiert haben.

Zu allererst betrachten wir alle Datenstrukturen, die in der Bitcoin Blockchain vorhanden sind. Es sei hier erwähnt, dass die Strukturen von Blockchain zu Blockchain unterschiedlich ausfallen. Den gemeinsamen Nenner haben alle in der Abspeicherung des Blockhashes vom vorangegangenen Block. Die Bitcoin Blockchain besteht aus „nur“ 4 Datentypen:

  • Block
  • Transaktion
  • Input
  • Output

Wobei ein Block ein oder mehrere Transaktionen, eine Transaktion ein oder mehreren Inputs und ein oder mehrere Outputs beinhalten.

Untenstehende Erklärungen können mit folgendem Beispiel veranschaulicht werden:

Bitcoin Struktur

Block

Betrachten wir einen Block besteht die Datenstruktur dahinter aus folgenden Feldern:

Previous Hash

Hier wird in den aktuellen Block der Hash des vorangegangenen Blocks hinein genommen. Denkt man an den Anfang von Bitcoin stellt sich die Frage, welcher Hash für den ersten, s.g. Genesis Block, abgespeichert wird. Bei genauerer Betrachung stellt man fest, dass es 0000000000000000000000000000000000000000000000000000000000000000 ist.

Merkle Hash

Der Merkel Hash ist etwas komplizierter zu erklären. Aber im groben kann man ihn dadruch erklären, dass dieser Hash die Transaktionen des aktuellen Blocks identifiziert. Man kann folgende Rechenschritte heranziehen, um zu verstehen, was der Merkel Hash ist:

TX-Hash1 = hash(Transaktion1 in Block)
TX-Hash2 = hash(Transaktion2 in Block)
...
TX-Hashn = hash(TransaktionN in Block)
Merkel-Hash von Block = hash(TX-Hash1 + TX-Hash2 ... TX-Hashn)

Creation Time

Dieser Zeitpunkt definiert, wann der Block vom Blockchain Netzwerk als neuer Block angenommen wird. Wichtig zu wissen ist, dass alle Transaktionen in diesem Block genau diesen Timestamp besitzen und keine unterschiedlichen haben. Eine Transaktion kann somit nie genau einem Zeitpunkt zugeordnet werden sondern lediglich gesagt werden, dass die in diesem Block beinhaltete Transaktion in diesem Zeitraum erstellt wurde und aufgenommen wurde. Hierbei ergeben sich sehr eigenartige Konstruktionen, denn es sei erwähnt, dass Transaktionen oft Stunden in der Blockchain verbringen, ohne in einen Block aufgenommen zu werden, da es einfach zu viele sind. Wie viele vielleicht bemerkt haben, ist bei einer Transaktion immer eine „Fee“ fällig, Diese bekommt der Miner des aktuellen Blocks. Nun ist der Miner natürlich auch dazu aufgefordert, Transaktionen aufzunehmen. Hierbei kann er sich allerdings aussuchen, welche er von den aktuell Anstehenden nimmt. Natürlich wird sich der Miner diese nehmen, wo die meiste Fee anfällt. Dies ist der Grund, warum eine höhere Fee die Wahrscheinlichkeit erhöht, in die Blockchain aufgenommen zu werden. Des Weiteren kann es auch passieren, dass eine Transaktion vom Netzwerk als gültig angenommen wird und der transferierte Betrag auf den neuen Konten in einer weiteren Transaktion verwendet wird. Dabei ist es Möglich, dass die neuer Transaktion eine höhere Fee enthält und dies vor der Alten in die Blockchain gespeichert wird. Dies bedeutet wiederum, dass eine Transaktion B „jünger“ sein kann als Transaktion A jedoch zeitlich nach A passiert ist.

Nonce

Dieser Wert ist jener, der sagt, mit welcher Lösung der aktuelle Block gemined wurde. Ein neuer Block wird ja bekanntlich durch die Lösung eines mathematischen Problems generiert. In diesem Feld ist die Lösung gespeichert.

Transaktion

Folgend gehen wir auf die Felder des Datentyps der Transaktion ein.

Transaktionshash (nicht in der Blockchain enhalten)

Wie oben ersichtlich ist, ist der eigentliche Transaktionshash nicht in der Blockchain vorhanden. Das Grund hierfür liegt darin, dass dieser berechnet werden kann und zwar durch das Hashen der gesamten Blockdaten.

Version

Hier wird festgehalten, welcher Bitcoin Transaktions Version diese Transaktion angehört. Waren es bisher nur Version 1 Transaktionen, ist es seit April 2017 möglich, Version 2 Transaktionen zu erstellen. Technisch bedeutet es, dass BIP68 (https://github.com/bitcoin/bips/blob/master/bip-0068.mediawiki) vom Client unterstützt wurde (Anm.: Im Skript wird OP_CHECKSEQUENCEVERIFY unterstützt).

Locktime

Dieses Feld gibt an, ab welcher Blockheight die Transaktion in die Blockchain aufgenommen hätte werden könnte. Hier ein Beispiel bei dem die Lock Time den Block 413784 anzeigt, die Transaktion aber erst im nächsten Block in die Blockchain gespeichert wurde. Dieser Offset von 1 Block wurde in der Blockchain festgehalten.

Output

Im Folgenden wird beschrieben, wie ein Output abgespeichert wird.

Value

Die Anzahl an Bitcoin, die auf das Konto überwiesen werden. Abgespeichert wird meist eine sehr größe Zahl, wie z.B. 50.000.000.000. Dies ist Satoshi, was nichts anderes ist wie 100.000.000stel Bitcoin. D.h. die vorige Zahl sind 50 Bitcoin.

Script Signature

Dieses Feld speichert das Output Script. Dieses identifiziert den Public Key des Empfängers. Die Entwickler von Bitcoin haben sich hierfür ein interessantes System ausgedacht. Sieht man sich ein Beispiel eines Scripts an:

4104678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5fac 

stellt man fest, dass hier zur Zahlen und Buchstaben vorhanden sind. In Wirklichkeit steckt dahinter ein Programm, welches duch die Bitcoin Script Programmiersprache definiert ist (genaue Spezifikation siehe https://en.bitcoin.it/wiki/Script). Dieses Programm wird ausgeführt und bestimmte Daten in einen Speicher geschrieben. Darin wird auch definiert, was mit diesen Daten passiert. Nimmt man z.B. die letzten 2 Zeichen des obigen Scripts „AC“ ist damit die Operation (OP-Code) OPCHECKSIG definiert, welche folgendes durchführt: „The entire transaction's outputs, inputs, and script (from the most recently-executed OPCODESEPARATOR to the end) are hashed. The signature used by OP_CHECKSIG must be a valid signature for this hash and public key. If it is, 1 is returned, 0 otherwise.“ Wie man hier sieht, werden die Daten im Speicher gehasht. Dieser Hash kann dann Base58 encodiert werden und man erhält die Bitcoin Adresse. D.h. aber das die eigentliche Bitcoin Adresse NICHT in der Blockchain abgespeichert wird, sondern erst berechnet werden muss.

Input

Hier wird beschrieben wie die Inputs aufgebaut sind bzw. wie Bitcoin mit dem Double Spending Problem (siehe https://en.wikipedia.org/wiki/Double-spending) um geht.

Previous Hash

Ein Input einer Transaktion beinhaltet keine Anzahl an Bitcoin die von diesem Konto wegüberwiesen werden. Der Grund hierfür liegt darin, dass das Netzwerk dezentral veranlagt ist und es keine zentrale Stelle gibt, die überprüft ob „1 Bitcoin verwendet wird“ oder nicht oder „der Kontostand gemanaged“ wird. D.h. es muss gewährleistet sein, dass aus den vorhanden Bitcoin nicht plötzlich mehr Bitcoin werden. Dieses Problem gibt es in der Realwirtschaft bzw. dem e-Banking bereits und nennt sich Double-Spending Problem. In diesem Feld „Previous Hash“ wird also KEINE Bitcoin Adresse oder kein Wert, der transferiert wird, abgespeichert, sondern eine Referenz zu einer anderen Transaktion, von welcher ein Output nun als Input „verwendet“ wird. Welche Output dies ist, wird in dem weiteren Feld „OutID“ definiert.

Script Signature

Hier wird das Bitcoin Script für einen Input abgespeichert. Beim Output Script wurde bereits erwähnt, dass es sich hierbei um den Public Key des Emfpängers handelt und das Netzwerk somit weiß, an wen die Bitcoin überwiesen werden. Das Input Script hat den Sinn, dass das Netzwerk überprüfen kann, ob der Sender die Bitcoin die er überweisen will auch besitzt. D.h. dieses Script muss eine Art „Beweis“ beinhalten, dass der Sender, dessen Public Key allgemein bekannt ist, auch den Private Key zum Public Key besitzt.

OutID

Wie bereits im Feld Previous Hash erwähnt, wird bei einem Input lediglich ein Output einer anderen Transaktion referenziert. Welcher Output das ist, wird mit diesem OutID Feld definiert. Dieser ist aber 0-basierend. D.h. der Wert „0“ würde auf das erste Output-Element in der Transaktion, referenziert durch „Previous Hash“, zeigen.

SeqNo

Diese Feld wird im aktuellen Netzwerk nicht verwendet. Es ist dafür gedacht, um im Zukunft Transaktionen in das Netzwerk zu senden, welche aber noch nicht durchgeführt werden und auf eine „Vervollständigung“ warten.

Conclusio

Durch obiges Beispiel hat man sehr gut gesehen, wie die Architektur der Datenstrukturen hinter Bitcoin aufgebaut sind. Des Weiteren bekommt man ein Gefühl für so manche nicht ganz klar ersichtlichen Gegebenheiten, wie die Auswahl der Beträge im Bitcoin Netzwerk bei einer Überweisung bzw. wie das Double Spending Problem gelöst wurde, nämlich durch Verweise bei den Inputs.

Überzeugt von Bitcoin? Bei Coinbase registrieren

Aktuelle Kurse