Zusammenfassung aller meiner bisherigen Bitcoin Artikel. (leider in zwei teile unterteilt, da mein post sonst die post maximal größe überschritten hat).
Pseudonyme und Zugriffsberechtigungen
Die Verwendung von echten Namen im Blockchain Register wäre nicht sehr sinnvoll (Guthabenstände von Personen könnten direkt zugeordnet werden; jeder wüsste wie viel jeder hat) und natürlich das Problem der Legitimität (wie soll man nachweisen ob das wirklich Person xy ist). Diese Probleme werden wie wir wissen bei Bitcoin durch die Verwendung von Pseudonymen (Schlüsseln) gelöst. Damit diese Verwendung von Pseudonymen in einem dezentralen System umgesetzt werden kann müssen zwei Vorraussetzungen erfüllt werden:
- Jeder Teilnehmer muss sich eigenständig Pseudonyme erstellen können. Mithilfe dieser Pseudonyme muss eine eindeutige Zuordnung von Bitcoin Einheiten möglich sein. Bei der Auswahl der Pseudonyme darf es nicht zu Überschneidungen kommen weshalb die Zahl der möglichen Pseudonyme extrem groß sein muss.
- Die Besitzansprüche eines Pseudonyms müssen von jedem überprüft werden können der Zugriff auf ein Guthaben muss einen Nachweis erfordern.
Diese Bedingungen werden bei Bitcoin durch kryptografische Schlüsselpaare erfüllt. Aus dem öffentlichen Schlüssel kann eine Bitcoin Adresse berechnet werden, die als Pseudonym für die jeweilige Person verstanden werden kann. Wie in Artikel 2 bereits erklärt, wird mit dem privaten Schlüssel der Nachweis erbracht, ob der Initiant einer Transaktion auch tatsächlich der Besitzer von diesem Guthabens ist. Jeder kann beliebige viele Schlüsselpaare erstellen (und somit beliebig viele Pseudonyme annehmen).
Die Erstellung eines Schlüsselpaares:
Um ein Schlüsselpaar zu erstellen, wird ein Element aus einer sehr großen Zahlenmenge (alle Zahlen zwischen 1 und einer Zahl mit 78 stellen, genauer gesagt zwischen 1 und 115792089237316195423570985008687907852837564279074904382605163141518161494336) ausgewählt. Die daraus gewählte Zahl ist dann der private Schlüssel, aus dem der dazugehörige öffentliche Schlüssel berechnet wird. Dies geschieht indem ein bekannter Basispunkt G der elliptischen Kurve mit dem privaten Schlüssel multipliziert wird. Der öffentliche Schlüssel ist dann ein Punkt auf der elliptischen Kuve, dessen x- und y- Wert den öffentlichen Schlüssel repräsentieren. Wieso man das ganze macht ist einfach. Eine Multiplikation auf einer elliptischen Kurve kann nicht „umgedreht“ werden (Problem des diskreten Logarithmus). Das bedeutet, dass aus dem privaten Schlüssel der öffentliche Schlüssel hergeleitet werden kann, aber aus dem öffentlichen Schlüssel nicht der private Schlüssel hergeleitet werden kann. Der einzige Weg vom öffentlichen Schlüssel auf den privaten Schlüssel zu kommen ist das ausprobieren aller möglichen Werte (Brute-Force Methode). Dadurch ist es möglich, den eigenen öffentlichen Schlüssel anderen Teilnehmern des Bitcoin-Netzwerkes anzuvertrauen aber selber als einziger im Besitz des private keys zu bleiben (und damit befähigt zu sein, eine Transaktion zu starten und die Legitimität ebendieser zu bestätigen.)
Das von den Nutzern „Standardmäßig“ verwendete Pseudonym ist die Bitcoin Adresse. Die Bitcoin Adresse ist der Hashwert des öffentlichen Schlüssels (wieder nicht umkehrbar, da doppelter Hash).
#### Darstellung von Schlüsseln (Base 58Check) Sämtliche Schlüssel und Pseudonyme im Bitcoin Netzwerk sind Zahlen. Die Darstellungsform dieser Zahlen kann allerdings variieren; binär (Basis 2), Dezimalsystem (Basis 10), Hexadezimalsystem(Basis16),... bei Bitcoin wurde ein weiteres Format eingeführt; das Base58Check (Basis 58, die Zahlen 1-9 sowie alle Groß- und Kleinbuchstaben außer O,l,I )
Base58Check wird zur Darstellung von privaten Schlüsseln und Pseudonymen verwendet. Beginnt die Abfolge mit 1 oder 3 ist es ein Pseudonym. Wenn 5, K oder L am Anfang stehen handelt es sich um einen privaten Schlüssel.
Bitcoin Adresse
Das am meisten verwendete Pseudonym (wie schon vorher erwähnt) ist die Bitcoin Adresse. Die Bitcoin Adresse kann aus einem öffentlichen Schlüssel berechnet werden, indem nacheinander zwei Hashfunktionen auf diesen angewandt werden. (1. SHA256 und 2. RIPEMD160) sind die Namen der Hashfunktionen. Die Vorteile der Bitcoin Adresse im Vergleich zum öffentlichen Schlüssel sind
- Der Komfort (die Bitcoin Adresse ist deutlich kürzer und beinhaltet eine Prüfziffer, da Base58Check; öffentliche Schlüssel werden im Hexadezimal Format dargestellt)
- Theoretisch mehr Sicherheit (wenn jemand eine Schwachstelle in der Multiplikation auf elliptischen Kurven findet), da der öffentliche Schlüssel dank der Bitcoin Adresse erst zum Zeitpunkt der trx bekannt gegeben werden muss.
Eine andere Form der Bitcoin Adressen sind die Pay-to-Script-Hash-Adressen. Dadurch können Auszahlungen an bestimmte Bedingungen geknüpft werden, wie zum Beispiel das eine Zahlung durch mehrere private keys bestätigt werden muss.
Abbildung 6
Sicherheit bei Bitcoin (Hashfunktionen)
Einweg-Pseudonymität
Für die Sicherheit (und Anonymität) ist es wichtig, dass die Pseudonyme im Bitcoin System nur einmal verwendet werden. Wie das gelöst wird steht auch als Kommentar unter meinem letzten Artikel wird aber hier nochmal kurz erklärt. Viele Wallets (die meisten) erstellen für jede Transaktion ein neues Schlüsselpaar (da aus dem public key ja die Bitcoin Adresse generiert wird, wird damit auch eine neue Bitcoin Adresse erstellt). Bei der Transaktion (von deiner Wallet aus) sendet die Wallet also den eigentlichen Betrag an die Adresse des Rechnungsstellers und generiert gleichzeitig neue Adressen, auf die dann das restliche Guthaben geschickt wird.
Dabei wird schnell klar, das es einen extrem großen Bedarf nach Adressen bzw Pseudonymen gibt. Diese können wie in Artikel 6 gelernt aus dem private key generiert werden oder aber mithilfe eines sogenannten Seed´s.
Wallets (deterministisch und nicht-deterministisch)
Nicht deterministische Wallets erstellen zu Beginn eine gewisse Anzahl an Schlüsselpaaren die dann nacheinander genutzt werden.
Deterministische Wallets dagegen nutzen eine Zufallszahl (den Seed) und erzeugen mithilfe von diesem Seed und einer Hashfunktion die private keys (Hashwert vom Seed und der Laufnummer). Das geile ist jetzt, dass das eine unbegrenzte Anzahl neuer private keys ermöglicht (wie auch bei nicht deterministischen Wallets) aber mit dem großen Vorteil, dass nur der Seed als Backup gespeichert werden muss (den Seed bekommst du anfänglich, schreibst ihn auf/gravierst ihn in eine Stahlplatte die du in einen Tresor legst oder was auch immer:D) und dann kannst du aus dem Seed deine private keys wiederherstellen, falls du deinen private key verlierst. Bei der nicht deterministischen Wallet müssen alle private keys gespeichert werden (du musst die ganze Zeit Backups machen wenn ein neues Schlüsselpaar erzeugt wird). Die Deterministischen Wallets sind also "besser" wenn man das so sagen kann. Das die Schlüssel durch eine Deterministische Wallet auf Basis eines Seeds erzeugt wurden ist "von außen"nicht erkennbar. Es gibt auch eine "Weiterentwicklung" der deterministischen Wallet, die Hierarchisch deterministische Wallet.
Sicherheit des private keys und der Pseudonyme
Da die privaten Schlüssel ja aus einer bereits bekannten Zahlenmenge gewählt werden (wie in Artikel 6 beschrieben) sind die möglichen Werte bereits vorher bekannt. Da jeder Nutzer sich eine unbegrenzte Anzahl von private keys und damit Pseudonymen aussuchen kann, könnte es hierbei zu Überschneidungen kommen.
Hierzu mal drei Szenarien, die aufzeigen, wie gering das Risiko ist das ein und derselbe private key zweimal ausgewählt wird, oder es anderweitig zu Überschneidungen kommt.
-
Szenario 1: Jemand will den private key einer bestimmten Bitcoin Adresse um über diese Bitcoin Einheiten verfügen zu können. Dieser private key kann durch ihn nur durch einen Brute-Force Angriff (also ausprobieren aller möglichen Kombinationen) bestimmt werden. Mit einem Computer der in der Lage ist, 60 Milliarden private keys pro Sekunde zu überprüfen würde man im 24/7 Betrieb über 7 Quadrilliarden Jahre benötigen um den passenden private key mit einer einprozentigen Wahrscheinlichkeit zu finden.
-
Szenario 2: Den private key für irgendeine beliebige Adresse mit Guthaben zu finden ist praktisch genauso unmöglich. Selbst wenn man alle 21 Millionen Bitcoin Einheiten (die es irgendwann mal geben wird) kleinstmöglich aufteilt (also in 2.1 Billiarden Satoshi) und jedes Satoshi einzeln auf einer anderen Adresse verteilt würde man mit dem Computer aus dem ersten Szenario noch knapp 3.7 Billionen Jahre benötigen um mit einer einprozentigen Wahrscheinlichkeit einen passenden private key zu finden (mit der Brute Force Methode).
-
Szenario 3: "Geburtstagsparadoxon": Wahrscheinlichkeit das durch das gesamte Bitcoin Netzwerk mindestens 2 gleiche private keys gewählt werden. (Geburtstagparadoxon ist die Wahrscheinlichkeit, nach der in einer Gruppe von Menschen mindestens zwei am gleichen Tag Geburtstag haben). Bei 5,4*10 hoch 22 erstellten Bitcoin Adressen liegt die Wahrscheinlichkeit einer solchen Kollision bei 0.01%. Selbst wenn jeder Mensch auf der Welt einen Computer hätte und Non-stop Bitcoin Adressen generieren würde, würde es über 300 Jahre dauern bis die kritische Schlüsselzahl überschritten wäre (jeder Mensch bräuchte dann ungefär 50 000 TB Speicherplatz).
Im Endeffekt wird dadurch klar, dass das System mit Pseudonymen und Schlüsseln sehr sicher ist. Für Hacker lohnt es sich überhaupt nicht die Brute-Force Methode bei Bitcoin private keys anzuwenden (die Rechenleistung ist beim Minen besser aufgehoben also profitabler).
Der einzige Weg durch den euer private key unsicher wird, ist eigentlich wenn ihr diesen von "zwielichtigen" Zufallsprogrammen erstellen lasst. Diese private keys könnten dann ein bestimmtes Muster aufweisen, dass ein Hacker nutzen könnte.
Manche Zufallsgeneratoren nutzen auch die Bewegung der Maus zum erstellen eines private keys, was wenn der Generator kein Scam ist sicher ist.
Am besten ist es meiner Ansicht nach die private keys abseits vom Computer mithilfe von physikalischen Phänomenen (die aufjedenfall echte Zufallswerte liefern und garantiert kein Scam sind:D) zu erstellen. Da könnt ihr ganz kreativ sein. zb ganz altmodisch mit Würfeln oder Münzwürfen oder Naturereignissen die ihr in Zahlen irgendwie darstellt:D
Einstieg Hashfunktionen und Hashwerte
Wie uns mittlerweile klar geworden ist, basiert sehr viel im Bitcoin System auf diesen Hashfunktionen. Hier wird jetzt erklärt was diese Hashfunktionen überhaupt sind.
Hashfunktionen H sind mathematische Abbildungen, die einem Input m (auch Urbild genannt)einen Hashwert h zuweisen H(m)=h. Das Urbild kann dabei eine Zeichenfolge von beliebiger Länge sein. Ein und das selbe Urbild wird mit einer gegebenen Hashfunktion immer den selben Hashwert liefern. Theoretisch können auch unterschiedliche Urbilder den gleichen Hashwert liefern (Kollision).
Auch in der IBAN wird übrigens eine Hashfunktion verwendet. Die ersten zwei Ziffern (nach dem Ländercode selbstverständlich) entsprechen nämlich dem Hashwert vom Rest der Kontonummer. Falls nun eine Zahl falsch eingetippt wird, wird ein Fehler gemeldet, da der Hashwert nichtmehr passt.
Damit dies funktioniert muss die Hashfunktion zwei wesentliche Eigenschaften haben:
- Wenn man verschiedene Inputs durchprobiert sollten alle Hashwerte ungefähr gleich oft vorkommen.
- Selbst kleine Input Änderungen sollten zu einem anderen Hashwert führen (sonst würde die Tippfehler Kontrolle bei einem falsch eingegebenen Wert ja nichtmehr funktionieren).
Diese Hashfunktionen sind aber nicht für komplexere Aufgaben geeignet und könnten manipuliert werden (Wahl von bestimnmten Urbildern führt zu bestimmten Hashwerten, es ist möglich Kollisionen herbeizuführen). Außerdem dürfen vom Hashwert keine Rückschlüsse auf das Urbild zu vollziehen sein. Das wird durch die Verwendung kryptografischer Hashfunktionen möglich.
Integrität der Urbilder durch kryptografische Hashfunktionen
Jegliche Anpassung des Urbilds führt sofort zu einer starken Veränderung des Hashwerts. Aufgrund der Eigenschaften kryptografischer Hashfunktionen (bei Hashfunktionen wäre es möglich) ist es außerdem unmöglich eine Kollision herbeizuführen; das bedeutet ein anderes Urbild zu finden, dass den gleichen Hashwert ergibt.
Hashwerte als Arbeitsnachweis (Block ID Schwellenwert)
Da es bei kryptografischen Hashfunktionen nicht möglich ist gezielte Hashwerte herbeizuführen, kann eine solche Hashfunktion (bei Bitcoin SHA-256) auch als Nachweis dazu dienen, dass zur Berechnung eines bestimmten Hashwertes eine bestimmte Rechenleistung genutzt wurde(im Schnitt). Wie das ganze bei Bitcoin genutzt wird, wurde im Punkt Transaktionskonsens bereits grob erklärt.
Transaktionen
Elliptische Kurven
Wieso elliptische Kurven?
- Bei asymmetrischen Verschlüsselungsverfahren die auf elliptischen Kurven basieren werden für Signaturen (mit einem gewissen Mass an Sicherheit) um einiges kürzere Schlüssellängen benötigt als bei "herkömmlichen Verfahren" (ohne elliptische Kurven)
- Der Verschlüsselungprozess ist effizienter.
Bei Bitcoin wird ein Standard verwendet, durch den die elliptische Kurve definiert wird: secp256k1
Wie die Schlüssel erstellt werden wurde unter "Pseudonyme und Zugriffsberechtigungen" schon erklärt, aber hier nochmal. Der private key wird aus einer sehr sehr großen Zahlenmenge ausgewählt (siehe "Pseudonyme und Zugriffsberechtigungen"). Aus diesem wird dann den öffentliche Schlüssel berechnet. Dies geschieht durch Punkteverdopplung und Addition. Auf Deutsch heißt das ein Basispunkt G der elliptischen Kurve (der allgemein bekannt ist) wird mit dem privaten Schlüssel multipliziert. Der Punkt den man dann erhält ist der public key.
Signieren einer (Transaktions-)Nachricht
Wieder explizite Mathematik die ich überspringen werde. Grob gesagt:
- Wählen einer beliebigen Zahl i zwischen 1 und n-1 (Zahl wird nur einmal verwendet)
- Berechnung eines Punktes P=i*G
- r=xp (x-wert des berechneten Punktes bestimmen)
- s=[i^-1(t+r+kp)] t=Nachricht kp=private key
- Veröffentlichen der Nachricht t zusammen mit dem public key und der Signatur (r,s)
Überprüfung der Nachrichten Signatur
Wie wir wissen erhält ein beliebiger (vollwertiger) Knoten die Transaktionsnachricht dessen Signatur er nun überprüft.
- [u_1=(s^-1 *t)]
- [u_2=(s^-1 *r)]
- P=u_1 G+u_2 Kö
- Signatur gültig, wenn r=xp _ ist bei mir für tiefgestellte Zahlen und ^ für hochgestellte Zahlen (da Strg++ bzw Strg+# bei Steemit nicht funktioniert)
Transaktionen und wie sie aufgebaut sind
Transaktionen sind Nachrichten (Transaktionsnachrichten) über die wir in den vorigen Kapiteln schon oft gesprochen haben. Hier werden wir näher darauf eingehen.
- Transaktionsnachrichten werden über das Bitcoin Netzwerk (vollwertige)Knoten propagiert und fungieren als Zahlungsaufträge.
- Transaktionsnachrichten sind die einzige Möglichkeit das Besitzrecht von Bitcoin Einheiten zu ändern.
Kleine Wiederholung:
Eine Transaktionsnachricht wird vom Initianten einer Transaktion erstellt, kryptografisch signiert und an einen beliebigen Netzwerkteilnehmer (full node) geschickt. Der Knoten der die Nachricht erhält, wird diese anhand der kryptografischen Signatur prüfen (um die Transaktionslegitimität zu prüfen{sicherzugehen,dass die Nachricht wirklich vom Besitzer des Guthabens kommt}). Falls das passt wird eine kopie der Nachricht in den transaction pool des Knotens kommen und das Original wird an die Kontakte des Knotens weitergeleitet, die ebenso verfahren werden, bis das ganze Netzwerk von der Transaktion erfahren hat. (Daraus wird erkennbar, dass normale Transaktionen nicht storniert werden können; außer double-spend natürlich wie bereits erklärt).
Der Aufbau
Die Bestandteile einer Transaktion seht ihr im Bild. Selbstverständlich gibt es eine standartisierte Form nach dem Bitcoin Protokoll, die Abbildung ist daher nur eine vereinfachte Darstellung).
Abbildung 7
Jeder Output kann nur einmal verwendet werden. Falls ein Knoten eine Transaktionsnachricht erhält, die ein schon zuvor verwendeten Output als Input referenziert, wird er die Transaktionsnachricht ignorieren.
Wurde der Output nicht bereits zuvor als Input referenziert steht er für die neue Transaktion zur Verfügung. Diese Outputs nennt man unspent transaction outputs (UTXO) (Outputs die bisher nicht verwendet wurden). Die UTXO sind sozusagen die Wertspeicher des Bitcoin Netzwerkes und werden als Bestandteil einer Transaktion in der Blockchain gespeichert und können dann in einer beliebigen Transaktion als Input referenziert werden (alle nicht als Input referenzierten Outputs UTXO sind im Arbeitsspeicher jedes vollwertigen Knoten).
Jede Bitcoin Einheit ist Bestandteil eines nicht verwendeten Transaktionsoutputs.
Wenn eine UTXO von einem Input referenziert wird, muss diese komplett verwendet werden. Um dennoch präzise Beträge zu haben gibt es verschiedene Transaktionstypen, die entweder mehrere Inputs zu einem großen Output zusammenfügen oder einen großen Input in mehrere Outputs aufsplitten (Modifikation von Stückelungen/Wechselgeld).
Transaktionstypen
- Aggregierend: Eine beliebige Anzahl an Inputs wird zu einem einzigen Output zusammengefasst (mehrere Beträge können an eine einzige Auszahlungsbedingung geknüpft werden).
- Aufsplittend: Ein einzelner Input wird in eine beliebige Anzahl von Outputs aufgesplittet. (gängigste Transaktionsform). Hierbei übersteigt der vewendete Input den Output, sodass er Wechselgeld erhält, welches er zu seinen Gunsten auf eine zweite Adresse von sich schicken kann. (mehr Anonymität und Sicherheit)
- Weiterleitend: Ein einziger Input aus dem ein einzelner Output generiert wird.
Transaktionsgebühr
Die Summe aller Inputs/des Inputs muss mindestens so groß sein, wie die Summe der Outputs/des Outputs. Ist der Input größer als der Output bleibt eine gewisse Summe übrig. Diese Differenz (das Wechselgeld) wird (bei der aufsplittenden Transaktion auf eine nächste Adresse versendet) und kommt als Transaktionsgebühr dem Miner zugute, der die Transaktion in die Blockchain aufnimmt (einen gültigen Block erstellt). Umso höher diese Differenz zwischen Input und Output (umso mehr Geld für den Miner übrig bleibt) umso schneller wird die Transaktion in der Regel bearbeitet/bei der Auswahl der Transaktionen die in den Block des Miners kommen bevorzugt.
Durch diese Verkettung der Transaktionen entsteht eine Transaktionshierarchie, in der jeder Output eine klar nachvollziehbare Herkunft hat (bis hin zur jeweiligen Coinbase Transaktion).
Alle Transaktionen, die einen bestimmten Transaktionsoutput von vorherigen Transaktionen als Input referenzieren werden von den Knoten als Duplikate erkannt und verworfen.
Ein Output kann nicht mehrmals referenziert werden. Sonst würde er ja mit der ersten Transaktion die sich auf diesen Output referenziert konkurrieren.
Block Bestandteile (Transaktionskonsens)
Transaktionskonsens: Wieso Blöcke und Blockketten?
Wieso Bitcoin eine Blockchain braucht haben wir schon geklärt. Da das schon eine Weile her ist nochmal eine ganz kurze Erklärung.
- Stichwort Transaktionskonsens
Da das Bitcoin Netzwerk dezentral ist hat jeder Knoten seine eigene Registerversion. Um nun sicherzustellen welche Registerversion jetzt aktuell und gültig ist gibt es die Blockchain.
Die Blockchain ist also das "Instrument" das dafür sorgt, dass ein Konsens ("Übereinstimmung der Meinungen") erreicht wird. Also welche Transaktionen vom Netzwerk als gültig betrachtet werden (nach der Transaktionslegiti