5. Transaktionen

Dieses Kapitel behandelt

  • Bitcoin oder Cookie Token Transaktionen

  • Erzeugung, Bestätigung und Verifikation von Transaktionen

  • Programmierung von Geld

Das Cookie Token Bezahlsystem, das du mit deinen Kollegen aufgestellt hast, hat ein paar ernsthafte Probleme. Das schlimmste ist, dass Lisa stehlen kann, was einige der neuen Kollegen beunruhigt. Sie zögern, das System zu benutzen, wenn sie wissen, dass Lisa ihnen Geld wegnehmen kann.

Dieses Kapitel konzentriert sich im Wesentlichen auf Transaktionen (Abbildung 1): Datenblöcke, die formalisieren, wie Benutzer Zahlungen an Lisa senden. Transaktionen ersetzen die alten Mails an Lisa. Sie werden unverändert im Spreadsheet gespeichert, anstelle des aktuellen VON, AN und CT Schemas. Das macht es Lisa unmöglich, das Geld von anderen Leuten zu stehlen, weil jetzt jeder alle Zahlungen im Spreadsheet verifizieren kann.

05 01
Abbildung 1. Bitcoin Transaktionen

In diesem Kapitel tauchen wir tief in Transaktionen ein und erforschen, wie programmierbar diese sind, was bedeutet, flexibel in Hinsicht auf das, was man mit ihnen machen kann. Zum Beispiel können Multisignatur-Transaktionen zwei von drei möglichen Signaturen benötigen, um Geld, das drei Leuten gehört, ausgeben zu können.

Nach diesem Kapitel wird sich das System erheblich verändert haben–in Bezug darauf, wie Wallets Zahlungen erzeugen, wie Lisa Zahlungen verifiziert, und wie Transaktionen gespeichert werden. Noch wichtiger aber, jeder wird in der Lage sein, Zahlungen im Spreadsheet zu überprüfen.

5.1. Probleme mit dem alten System

Lisa leistet wertvolle Arbeit. Sie sorgt dafür, dass niemand betrügt, indem sie digitale Signaturen überprüft und nach den Guthaben von public Key Hashes (PKH) schaut, bevor sie eine Zahlung bestätigt. Sie bestätigt die Zahlungen, indem sie sie an das Cookie Token Spreadsheet anhängt.

Aber dieser Ansatz führt zu einigen Problemen:

  • Lisa ist es leid, vor jeder Zahlung den Guthabenstand ausrechnen zu müssen. Der Ledger wächst, und mit jeder neuen Zahlung werden die Berechnungen und Prüfungen zeitraubender.

  • Wenn du zwei Adressen mit je 5 CT hast, musst du zwei separate Zahlungen mit je 5 CT leisten, um 10 CT für einen Keks zu bezahlen. Das belastet sowohl den Empfänger als auch Lisa unnötig. Es bläht ausserdem das Spreadsheet mit zusätzlichen Zeilen auf.

  • Weil die Firma gewachsen ist und einige Leute Lisa nicht gut kennen, schwindet langsam das Vertrauen in sie. Einige Kollegen befürchten, dass Lisa im Spreadsheet Cookie Tokens von ihnen stehlen könnte. Nur Lisa kann die Signaturen überprüfen, weil nur sie die Mails sieht, die an sie geschickt werden. Sie könnte also die CT Spalte von einer Zahlung an sie vergrössern, oder eine Zeile mit einer gefälschten Zahlung von, sagen wir, John an Lisa eintragen (Abbildung 2). Niemand könnte Lisa einen solchen Betrug nachweisen. Es spielt keine Rolle, dass sie die vertrauenswürdigste Person der Welt ist. Wenn die Leute das nicht wissen, dann werden sie annehmen, dass Lisa genauso gierig ist wie jeder andere.

05 02
Abbildung 2. Schlimme Dinge, die Lisa tun könnte. Würde sie ja nicht, aber sie könnte.

Bedenke, dass Lisa kein neues Geld über die vereinbarten 7.200 CT pro Tag hinaus erzeugen kann. Und wenn sie mehr stiehlt als das, was auf einem PKH verfügbar ist, wird jemand beim Verifizieren des Spreadsheets feststellen, dass die Geldmenge zu gross geworden ist. Dann würde Lisa auffliegen.

Vertrauen minimieren

Bei Bitcoin geht es im Kern um die Minimierung von Vertrauen zwischen Leuten. Transaktionen bringen uns einen Schritt näher an ein vertrauensfreies System, in dem jeder alles verifizieren kann.

Lisa gefällt es überhaupt nicht. dass ihr Leute misstrauen. Ihr ist klar, dass sie nicht viel daran ändern kann, um das Vertrauensniveau ihrer Kollegen zu erhöhen. Eine interessante Alternative ist, das notwendige Vertrauen zu minimieren. Sie beschliesst, dass der beste Weg dazu ist, den Prozess möglichst transparent zu gestalten, sodass jeder die Zahlungen verifizieren kann. Gleichzeitig wird sie das Verfahren verbessern, mit dem sie sicherstellt, dass Leute kein Geld ausgeben, das sie nicht haben, und wie man von mehreren Adressen gleichzeitig Geld ausgeben kann. Sie erfindet die Cookie Token Transaktion, um alle drei Probleme gleichzeitig zu lösen.

5.2. Zahlung mittels Transaktion

Transaktionen ändern sowohl die Art, wie Wallets Zahlungen an Lisa schicken, als auch das, was im Spreadsheet gespeichert wird. Sie ändern nicht, wie Wallets aus Benutzersicht funktionieren–die Wallet App wird unverändert aussehen.

Angenommen John will ein Keks im Café kaufen. Er mailt jetzt nicht mehr Lisa eine Zahlung, wie er es früher so oft gemacht hatte. Die Wallet Software benutzt jetzt Transaktionen, also wird sein Wallet stattdessen eine Transaktion erzeugen, wie in Abbildung 3 gezeigt. Der Zweck der Transaktion ist, 10 CT an die Cookie Token Adresse des Cafés zu senden.

05 03
Abbildung 3. Der Bezahlvorgang bleibt aus Benutzersicht unverändert, stellt sich für Lisa und das Spreadsheet aber anders dar.

John scannt die Zahlungs-URI des Cafés, und sein Wallet erzeugt eine Transaktion und bittet ihn, sie zu akzeptieren. Er klickt OK, und das Wallet signiert die Transaktion. Johns Wallet schickt dann die Transaktion als Attachment in einer anderweitig leeren Mail an Lisa.

Die Transaktion enthält Informationen darüber, wo das Geld hin soll. Aber auch darüber, welches Geld ausgegeben werden soll, indem es spezifische “Coins” namens unspent transaction outputs, unverbrauchte Transaktions Outputs (UTXOs), nennt, die John in früheren Transaktionen erhalten hatte.

Lisa verifiziert, dass die Coins, die in der Transaktion ausgegeben werden sollen, existieren und noch nicht anderweitig verbraucht worden sind. Sie überprüft auch, dass die Signaturen–es könnten mehrere in einer Transaktion sein–gültig sind. Wenn alle Prüfungen erfolgreich verlaufen sind, bestätigt Lisa die Transaktion, indem sie sie unverändert an das Ende des Spreadsheets hängt.

Wenn die Transaktion im Spreadsheet landet, kann jeder dieselben Überprüfungen daran vornehmen, wie Lisa dies tat. Sie können damit sicherstellen, dass Lisa kein Geld von jemandem stiehlt oder anderweitig mit anderer Leute Geld Schindluder treibt.

In den nächsten drei Abschnitten gehen wir näher auf die drei Phasen ein: Erzeugen, Bestätigen und Verifizieren.

5.2.1. Erzeugen der Transaktion

Johns Transaktion
  • Erzeugen (John)

  • Bestätigen (Lisa)

  • Verifizieren (jedermann)

Tauchen wir tiefer ein und schauen, wie Johns Transaktion zusammengebaut wird.

05 04
Abbildung 4. Johns Wallet bereitet eine Zahlung von 10 CT für einen Keks vor. Er benutzt zwei Keys mit Guthaben, um die Kosten dafür zu decken. Er zahlt sich selbst das Wechselgeld von 3 CT an eine neue Adresse. Die Transaktion ist noch nicht signiert.

Johns Wallet hat eine neue Transaktion generiert (Abbildung 4). Diese hat zwei Inputs und zwei Outputs. Inputs geben an, welche Outputs früherer Transaktionen ausgegeben werden sollen. Outputs geben an, wo das Geld hingehen soll.

Inputs

Die Inputs geben an, welche Transaktions Outputs ausgegeben werden sollen. John besitzt zwei UTXOs, eine mit 8 CT und eine mit 5 CT. Die unverbrauchten Outputs gehören zu zwei früheren Transaktionen, Transaktion 1 und Transaktion 2, mit denen Geld an John bezahlt wurde. Jetzt möchte John diese UTXOs ausgeben.

u05 01

Ein Transaktionsinput nimmt Bezug, oder zeigt auf eine vorangegangene Transaktion mit Hilfe von deren Transaktions ID (txid). Die txid der Transaktion ist deren doppel-SHA256 Hash. Sie heisst Transaktions ID, weil dieser Hash oft zum Referenzieren, oder Bezugnehmen auf die Transaktion verwendet wird, wie das bei den Inputs in Abbildung 4 der Fall ist.

Die Begründung für die Verwendung von doppel-SHA256 ist nicht ganz klar, aber es verhindert jedenfalls eine sogenannte Verlängerungs-Attacke. Bitcoin’s Schöpfer hat sich wahrscheinlich doppel-SHA256 ausgesucht, damit er sich nicht auch noch um diese Art von Attacken kümmern musste. Details findest du unter [web-length-extension-attack].

Johns erster Input, mit Index 0, enthält

  • Die txid von Transaktion 1

  • Den Index, 1, des Outputs in Transaktion 1, der ausgegeben werden soll

  • Einen leeren Platzhalter für eine Signatur

Sein zweiter Input, mit Index 1, enthält

  • Die txid von Transaktion 2

  • Den Index, 0, des Outputs in Transaktion 2, der ausgegeben werden soll

  • Einen leeren Platzhalter für eine Signatur

John wird die Signaturen am Schluss ausfüllen, nachdem die Transaktion ansonsten vollständig ist.

Outputs

Ein Transaktions-Output enthält einen Betrag und einen PKH. Johns Transaktion hat zwei Outputs. Der Output an Index 0 zahlt 10 CT an PKHC, das Café, für den Keks. Der Output an Index 1 zahlt 3 CT an einen von Johns Keys zurück, PKH3. Wir nennen das Rückgeld oder Change, weil es traditionellem Wechselgeld oder Rückgeld entspricht, wie man es bekommt, wenn man $75 mit einem $100 Schein bezahlt und $25 zurückbekommt: John bezahlt mit 13 CT und bekommt 3 CT zurück an seine Change Adresse, PKH3. Change ist nötig, weil man einen Transaktions-Output nicht nur teilweise ausgeben kann. Man verbraucht ihn entweder ganz oder gar nicht.

Hinter Outputs und Inputs steckt ein bisschen mehr als nur die Angabe eines PKH in einem Output und einer Signatur in einem Input. Tatsächlich enthält ein Output ein Computerprogramm, das die Signatur im ausgebenden Input verifiziert. Wir besprechen das später genauer.

Transaktionsgebühr

Normalerweise muss man eine Transaktionsgebühr an das Bitcoin Netzwerk bezahlen, damit die Transaktion bearbeitet wird.

Damit eine Transaktion gültig ist, muss die Summe der Inputbeträge grösser oder gleich der Summe der Outputbeträge sein. Die Differenz, so vorhanden, ist die Transaktionsgebühr, die wir in [ch07] behandeln. werden. Im Moment zahlt John keine Transaktionsgebühren, also sind die Summen der Outputs und Inputs gleich.

Die Transaktion ist jetzt zwar erzeugt, aber noch nicht signiert. Diese Transaktion hätte jeder zusammenbauen können; sie basiert vollständig auf frei zugänglicher Information. Die Inputs referenzieren Transaktionen im Spreadsheet und Indizes innerhalb dieser Transaktionen. Aber nur John allein ist in der Lage, diese Transaktion zu signieren, denn nur er hat den private Key, der zu PKH1 und PKH2 passt.

Signieren der Transaktion

John klickt in seinem Wallet auf OK, um das Signieren der Transaktion freizugeben. Das Wallet muss jetzt zwei Signaturen erzeugen, eine für PKH1 und eine für PKH2. Das liegt daran, dass John beweisen muss, dass er sowohl den private Key für PKH1 als auch den für PKH2 besitzt. Siehe Abbildung 5.

05 05
Abbildung 5. Johns Wallet signiert die Transaktion. Jeder Input bekommt seine eigene Signatur. Auch der public Key wird in den Inputs gebraucht, denn jeder soll die Transaktion verifizieren können.

Jeder Input muss einzeln signiert werden. Der zu PKH1 gehörende private Key muss zum Signieren des Inputs an Index 0 benutzt werden, weil dieser Input Geld ausgibt, das an PKH1 geschickt worden war. Entsprechend muss der zu PKH2 gehörende private Key zum Signieren des Inputs an Index 1 benutzt werden, denn dieser gibt Geld aus, das an PKH2 adressiert worden war.

Jede Signatur bindet sich an die gesamte Transaktion, was bedeutet, der Signatur-Algorithmus hasht die gesamte Transaktion, ohne Signaturen. Wenn sich irgendetwas an der Transaktion ändert, wird jede Signatur für diese Transaktion ungültig.

Zur Vereinfachung der Überprüfung signiert man eine bereinigte Version der Transaktion, also eine ohne Signaturen für irgendeinen der nputs. Man kann nicht eine Signatur in Input 0 eintragen und dann Input 1 signieren. Die Verifikation wäre dann schwierig, weil derjenige nicht weiss, in welcher Reihenfolge die Signaturen erstellt wurden. Erstellt man aber alle Signaturen aus einer bereinigten Transaktion und fügt dann alle Signaturen ein, dann ist es egal, in welcher Reihenfolge die Inputs signiert wurden.

Wenn das Wallet alle Signaturen erstellt hat, fügt es sie in die Transaktion ein. Aber ein Teil fehlt noch. Woher soll jemand, der die Transaktion überprüfen will–das Café zum Beispiel– wissen, welchen public Key sie zum prüfen der Signatur benutzen sollen? Das Café sieht nur den PKH im ausgegebenen Output und die Signatur im ausgebenden Input. Es kann den public Key aus dem PKH nicht herleiten, weil kryptografische Hashes Einbahnfunktionen sind, weisst du noch? Johns Wallet muss ausdrücklich den entsprechenden public Key dem Input hinzufügen. Die Signatur in Input 0, die Geld von PKH1 ausgibt, muss anhand des public Keys geprüft werden, aus dem PKH1 generiert wurde. Ebenso bekommt Input 1 den public Key, der zu PKH2 gehört.

5.2.2. Lisa bestätigt die Transaktion

Johns Transaktion
  • Erzeugen (John)

  • Bestätigen (Lisa)

  • Verifizieren (jedermann)

Die Transaktion ist bereit zum Senden an Lisa. Johns Wallet schickt es als Anhang in einer Mail. Lisa schnappt sich die Transaktion und prüft, dass:

  • Die Transaktion Outputs ausgibt, die im Spreadsheet tatsächlich existieren und noch nicht anderweitig ausgegeben wurden.

  • Der Gesamtwert der Transaktions-Outputs den der Transaktions-Inputs nicht übersteigt. Ansonsten würde die Transaktion Geld aus dem Nichts erschaffen.

  • Die Signaturen korrekt sind.

Lisa braucht das Saldo des PKH nicht mehr zu berechnen, aber sie muss noch prüfen, dass der ausgegebene Output existiert und nicht bereits ausgegeben wurde.

Wie prüft sie, ob ein Output noch unverbraucht ist? Muss sie nicht das Spreadsheet durchsuchen, um Transaktionen zu finden, die diesen Output verwenden? Ja, das muss sie. Das scheint nicht weniger mühsam als durch das Spreadsheet zu gehen, um die Salden zu berechnen. Aber keine Sorge: Lisa hat einen Plan.

Unverbrauchter Transaktions Output Set
UTXO Set

Alle Nodes im Bitcoin Netzwerk unterhalten ihr eigenes UTXO Set, um die Verifikation von Transaktionen zu beschleunigen.

Um leichter checken zu können, ob ein Output schon verbraucht wurde, erzeugt sie eine neue, private Datenbank, die sie UTXO set nennt (Abbildung 6). Sie enthält die Menge aller UTXOs.

05 06
Abbildung 6. Lisa verifiziert mit ihrem UTXO Set, dass John nichts doppelt ausgibt.

Ein Eintrag im UTXO set besteht aus einer txid, einem Index (idx) und dem eigentlichen Transaktions-Output. Lisa hält ihr UTXO Set während der Überprüfung von Transaktionen stets aktuell.

Double Spend

Double Spend bedeutet, denselben Output zweimal auszugeben. Lisa kann Double Spends verhindern, indem sie ihr UTXO Set zu Rate zieht.

Bevor Lisa Johns Transaktion zum Spreadsheet hinzufügt prüft sie, ob alle Outputs, die die Transaktion ausgibt, im UTXO Set sind. Wenn nicht, dann versucht John Geld auszugeben, das entweder nie im Spreadsheet existiert hat, oder das bereits ausgegeben wurde (so etwas wird üblicherweise als Double Spend Attacke bezeichnet).

Zu jedem von Johns Inputs schaut Lisa in ihr UTXO Set nach der txid und dem Output index. Wenn alle auszugebenden Output im UTXO Set liegen, dann findet keine Double-Spend Attacke und kein Ausgeben nicht-existenter Coins statt. In unserem Fall findet Lisa beide Outputs in ihrem UTXO Set und beginnt, die Signaturen zu verifizieren. Lisa muss die Signaturen von beiden von Johns Transaktions-Outputs verifizieren.

05 07
Abbildung 7. Lisa verifiziert die erste Signatur von Johns Transaktion.

Sie holt sich den PKH von dem Output, der vom ersten Input ausgegeben wird, und verifiziert, dass dieser mit dem Hash des public Keys im Input übereinstimmt (Abbildung 7). Sie verifiziert die Signatur im Input mit Hilfe des public Keys, der Signatur und der Transaktion und prüft anschliessend die Signatur des zweiten Inputs genauso. Beide Prüfungen verlaufen erfolgreich.

Lisa trägt die Transaktion dann in ihr Spreadsheet ein. Sie muss jetzt die neu ausgegebenen Outputs aus ihrem UTXO Set entfernen und die Outputs von Johns Transaktion hinzunehmen (Abbildung 8). So hält sie das UTXO Set aktuell, damit es stets den Inhalt des Spreadsheet widerspiegelt.

05 08
Abbildung 8. Lisa hängt die Transaktion an das Spreadsheet an und entfernt die verbrauchten Outputs aus dem UTXO Set.
Neuaufbau des UTXO Sets.

Das UTXO Set wird ausschliesslich aus den Transaktionen im Spreadsheet gewonnen. Es kann jederzeit neu erzeugt werden, und zwar von jedem, der Lesezugriff auf das Spreadsheet hat.

Lisa hält das Spreadsheet up-to-date, in dem sie es wie in Abbildung 8 gezeigt mit jeder hereinkommenden Transaktion nachführt. Sollte sie das UTXO Set einmal verlieren, kann sie es aus dem Spreadsheet wieder neu gewinnen, indem sie mit einem leeren UTXO Set beginnt und alle Transaktionen im Spreadsheet eine nach der anderen abarbeitet.

Aber nicht nur Lisa kann ein UTXO Set erzeugen. Jeder mit Zugang zum Spreadsheet kann jetzt dasselbe tun. Das wird in den späteren Kapiteln wichtig, wenn wir Lisa durch mehrere Leute ersetzen, die ihren Job übernehmen. Es ist auch für Leute wichtig, die nur das Spreadsheet verifizieren wollen, um sich von der Korrektheit der Informationen darin überzeugen wollen.

5.2.3. Jeder verifiziert die Transaktion

Johns Transaktion
  • Erzeugen (John)

  • Bestätigen (Lisa)

  • Verifizieren (jedermann)

Jetzt, da Johns Transaktion genauso abgespeichert wird wie er sie erzeugt hat, kann jeder mit Lesezugriff sie überprüfen. Jeder kann ein privates UTXO Set generieren und sich durch die Transaktionen durcharbeiten. Am Ende wird er dasselbe UTXO Set wie Lisa haben.

Das bedeutet, jeder kann dieselben Checks durchführen wie Lisa. Alle können prüfen, dass Lisa ihren Job korrekt erledigt. Diese Verifikationen sind wichtig für das System, weil sie garantieren, dass Änderungen am Spreadsheet alle vereinbarten Regeln einhalten.

In Bitcoin heissen diese Verifikatoren Full Nodes. Lisa ist also ein Full Node (ein Verifizierer), aber sie tut mehr als ein Full Node–sie aktualisiert auch das Spreadsheet. Ein Full Node heisst auch verifizierender Node oder einfach Node in Bitcoin.

Johns Transaktion
  • Erzeugen (John)

  • Bestätigen (Lisa)

  • Verifizieren (jeden)

Lisa kann nicht mehr jemand anderem Geld stehlen, weil das Spreadsheet ungültig würde, wenn sie es täte. Nehmen wir zum Beispiel an, sie würde versuchen, den Output Empfänger von Johns Transaktion von PKHC auf PKHL abzuändern. Sie würde damit effektiv versuchen, 10 CT vom Café zu stehlen (Abbildung 9).

05 09
Abbildung 9. Lisa kann jetzt nicht mehr jemand anderem Geld stehlen. Wenn sie das täte, würden die Signaturen ungültig und damit würde ihr unmoralisches Handeln enthüllt.

Weil Lisa den Inhalt von Johns Transaktion geändert hat, sind die Signaturen nicht mehr gültig. Jeder mit Zugriff auf das Spreadsheet kann dies bemerken, weil alles super transparent ist.

Konsequenzen öffentlicher Signaturen für die Sicherheit

Das Gute an öffentlichen Signaturen ist, dass jeder alle Transaktionen verifizieren kann. Aber es gibt einen kleinen Nachteil.

Erinnerst du dich an [ch03], wo wir PKHs eingeführt haben? Wenn du PKH benutzt hast, wurde der public Key im Spreadsheet nicht preisgegeben. Das hat das Geld mit zwei Lagen Sicherheit geschützt: der public Key Ableitungsfunktion und einer kryptografischen Hashfunktion (SHA256
RIPEMD160). Wenn der public Key irgendwie enthüllt wurde, war der private Key immer noch durch die public Key Ableitungsfunktion geschützt. Es war, wie wenn man Gürtel und Hosenträger gleichzeitig trägt.

Aber wenn man Transaktionen benutzt, wird der public Key im Input der ausgebenden Transaktion preisgegeben, wenn ein Output ausgegeben wird. Schau dir Johns Transaktion in Abbildung 10 noch einmal an.

05 10
Abbildung 10. Der Input gibt den public Key preis. Wir trieben in [ch03] aber einigen Aufwand, um das zu vermeiden.
Benutze Adressen nicht mehrfach

Bitcoin Adressen sollten nicht wiederbenutzt werden. Wiederbenutzung von Adressen verringert sowohl Sicherheit als auch Privacy.

Der Input enthält den public Key. Aber er enthüllt den public Key erst, wenn der Output ausgegeben wird. Dies bringt einen wichtigen Punkt hoch: benutze Adressen nie mehrmals. Wenn John noch andere UTXOs auf PKH1 hat, dann sind diese Output jetzt weniger sicher, weil sie nicht mehr von der kryptografischen Hashfunktion gesichert werden–nur noch von der public Key Ableitungsfunktion.

Nicht nur verringert Adressen-Wiederbenutzung die Sicherheit deines private Keys. Es verschlechtert auch deine Privacy, wie in [ch03] diskutiert. Nimm nochmal an, dass John weitere Output auf PKH1 hat. Wenn die Acme Versicherung das Café zwingt zu sagen, dass es John war, der den Keks gekauft hatte, dann wüsste Acme auch, dass alle Output an PKH1 John gehören. Dasselbe gilt für Change Outputs.

Glücklicherweise automatisieren die Wallets die Key Generierung für dich, sodass man sich normalerweise keine Sorgen um Key Wiederverwendung machen muss. Die meisten Bitcoin Wallets, die heute auf dem Markt sind, benutzen Einweg-Adressen für alle eingehenden Zahlungen.

5.2.4. Kontenbasierte und wertbasierte Systeme

Reflektieren wir nochmal über die Änderungen, die wir gemacht haben. Wir sind von einem kontenbasierten System zu einem wertbasierten System übergegangen.

Ein kontenbasiertes System führt Buch darüber, wie viel Geld auf jedem Konto liegt. Diesen Typ von System hatten wir vor diesem Kapitel. Lisa musste das Saldo einer PKH ausrechnen, bevor sie entschied, ob eine Zahlung durchgeht oder nicht.

Ein wertbasiertes System verfolgt stattdessen “Coins”. In diesem Kapitel muss Lisa sicherstellen, dass spezielle Coins (UTXOs) existieren, bevor sie entscheidet, eine Zahlung zuzulassen. Sie braucht nicht den Kontostand irgendwelcher PKHs zu ermitteln. Bitcoin ist ebenfalls ein wertbasiertes System.

5.3. Script

Ich war nicht ganz ehrlich mit dem, was in einer Transaktion enthalten ist. Ein Transaktions-Output enthält keinen PKH, sondern einen Teil eines Computerprogramms, das den PKH enthält. Dieser Teil des Programms wird als Pubkey Script bezeichnet. Der Input, der den Output ausgibt, enthält den anderen Teil dieses Programmes. Dieser andere Teil, die Signatur und der public Key in Johns Transaktion, heisst das Signature Script (Abbildung 11).

05 11
Abbildung 11. Die Signatur ist der vordere Teil eines Programms. Das Pubkey Script im ausgegebenen Output ist der hintere Teil. Wenn der Ablauf des gesamten Programms OK ergibt, dann ist die Zahlung autorisiert und darf den Output verwenden.

Dieses winzige Programm, in einer Programmiersprache namens Script geschrieben, enthält die Befehle für Lisa dazu, wie sie verifizieren kann, dass die ausgebende Transaktion authentisch ist. Wenn Lisa alle Instruktionen in dem Programm fehlerfrei ausführt und das Endergebnis ist OK, dann ist die Transaktion authentisch.

Die Fähigkeit, ein Computerprogramm innerhalb einer Transaktion zu schreiben, ist für verschiedene Anwendungsfälle nützlich. Wir werden diverse Fälle von massgeschneiderten Programmen im Laufe dieses Buches besprechen.

Angenommen, Lisa möchte Input 0 von Johns Transaktion verifizieren. Sie wird dazu das Programm von oben nach unten durchlaufen lassen. Dabei wird ein Stack oder Stapelspeicher benutzt, um die Zwischenergebnisse zu verwalten. Dieser Stack ist wie ein Stapel Zeug. Man kann oben etwas drauflegen oder von oben etwas wegnehmen.

Fangen wir an: schaue dir Abbildung 12 an. Das erste (Top) Element in dem Programm ist eine Signatur, was einfach nur Daten sind. Wenn du normalen Daten begegnest, dann tust du sie oben auf den Stack. Lisa legt die Signatur auf den anderweitig leeren Stack. Dann sieht sie einen public Key, was auch nur Daten sind. Sie tut den ebenfalls auf den Stack. Der Stack enthält jetzt eine Signatur und einen public Key, mit dem public Key oben.

05 12
Abbildung 12. Hinzufügen einer Signatur und eines public Key auf den Stack

Das nächste Element im Programm ist OP_DUP (Abbildung 13). Das sind jetzt nicht nur Daten–das ist ein Operator. Ein Operator führt Berechnungen durch auf Basis der Elemente auf dem Stack und, in manchen Fällen, der zu verifizierenden Transaktion. Dieser spezielle Operator ist einfach: er sagt “Kopiere das oberste Element auf dem Stack (aber lasse es dort liegen), und lege die Kopie obendrauf”. Lisa befolgt den Befehl und kopiert den public Key auf dem Stack. Jetzt liegen zwei public Keys und eine Signatur auf dem Stack.

05 13
Abbildung 13. Kopieren des public Key auf dem Stack und Hinzufügen eines PKH

Das nächste Element ist ebenfalls ein Operator, OP_HASH160 (auch dargestellt in Abbildung 13). Dies bedeutet “Nimm das oberste Element vom Stack herunter, berechne dessen Hash mittels SHA256+RIPEMD160, und lege das Ergebnis wieder auf den Stack.”

Cool. Lisa nimmt den oberen public Key vom Stack, hasht ihn und legt den resultierenden PKH oben auf den Stack. Das ist natürlich gerade Johns PKH1, weil es ja Johns public Key war, den Lisa gehasht hat.

Das nächste Element ist wieder nur Daten (Abbildung 14): es ist PKH1, was der rechtmässige Empfänger der 8 CT ist. Lisa legt PKH1 auf den Stack.

05 14
Abbildung 14. Ablegen von PKH1 auf dem Stack und Vergleich der beiden PKH Elemente

Als Nächstes kommt ein weiterer Operator, OP_EQUALVERIFY. Das bedeutet “Nimm die beiden obersten Elemente vom Stack und vergleiche sie miteinander. Wenn sie gleich sind, dann fahre beim nächsten Element mit dem Programm fort; ansonsten brich das Programm mit einem Fehler ab.” Lisa nimmt die beiden PKH Elemente von der Spitze des Stacks und prüft, ob sie identisch sind. Sie sind identisch, was bedeutet, der public Key, den John im Signature Script seiner Transaktion mitgeliefert hatte passt zu dem PKH, der als Empfänger im Output gesetzt worden war.

05 15
Abbildung 15. Prüfung der Signatur unter Benutzung von Johns Transaktion und dem Rest der Elemente auf dem Stack.
Johns bereinigte Transaktion

u05 02

Der letzte Operator, OP_CHECKSIG (Abbildung 15), bedeutet “Verifiziere, dass der public Key oben auf dem Stack und die Signatur darunter die Transaktion korrekt signieren. Lege true oder false oben auf den Stack, abhängig vom Ergebnis der Verifikation.” Lisa nimmt Johns Transaktion und löscht alle Signaturen aus allen Inputs. Sie benutzt die beiden obersten Objekte, was Johns public Key und seine Signatur sind, um zu verifizieren, dass die Signatur die bereinigte Transaktion signiert. Als John seine Transaktion signierte, hat er das ohne Signaturdaten in den Inputs getan. Deshalb muss Lisa erstmal die Signatur-Scriptdaten aus der Transaktion entfernen, bevor sie die Transaktion verifiziert. Die Signatur war in Ordnung, also legt Lisa true, was so viel heisst wie `OK´, zurück auf den Stack.

Schau, das Programm ist jetzt leer! Es gibt nichts mehr zu tun. Nachdem das Programm durchgelaufen ist, enthüllt das oberste Element auf dem Stack, ob das Ausgeben des Outputs authentisch ist. Wenn trueOK–dann ist das Ausgeben autorisiert. Wenn falsenicht OK– dann muss die Transaktion abgewiesen werden. Lisa schaut auf das oberste Stack-Element, und das ist ein OK. Lisa weiss jetzt, dass Johns Input mit Index 0 in Ordnung ist (Abbildung 16).

05 16
Abbildung 16. Der erste Input wird geprüft.

Lisa führt dieselben Checks für den anderen Input von Johns Transaktion durch, den mit Index 1. Wenn dieses Programm ebenfalls mit OK endet, dann ist die Transaktion gültig und sie kann die Transaktion an das Ende des Spreadsheets hängen.

5.3.1. Warum ein Programm benutzen?

Der Pubkey Script Teil des Programmes schreibt vor, was die ausgebende Transaktion genau liefern muss, um einen Output auszugeben. Die einzige Methode, einen Output auszugeben ist, ein Signatur Script zu liefern, das für einen fehlerfreien Programmdurchlauf sorgt, bei dem am Ende ein OK auf dem Stack liegt.

In dem Beispiel, das ich gerade präsentiert habe, ist das einzige akzeptable Signatur Script eine gültige Signatur, gefolgt von dem public Key, der mit dem PKH im Pubkey Script korrespondiert.

Operatoren

Eine Menge nützlicher Operatoren können verwendet werden, um allerlei originelle Programme zu schreiben. Schau dir die komplette Liste an unter [web-op-codes].

Eine Programmiersprache, Script, in den Transaktionen zu benutzen macht diese sehr flexibel. Du wirst mehrere verschiedene Typen von Script Programmen in diesem Buch zu sehen bekommen. Wenn die Transaktionen keine Programmiersprache benutzen würden, hätten alle Anwendungsfälle schon vorab erfunden werden müssen. Die Script Sprache lässt einen später nach Bedarf neue Anwendungsfälle einrichten.

Ich habe bereits erwähnt, dass “pay to PKH” nicht die einzige Art zu zahlen ist. Man kann in einem Pubkey Script beliebige Programme schreiben. Zum Beispiel kann man ein Pubkey Script schreiben, das mit OK nur dann endet, wenn das Signatur Script zwei Zahlen enthält, deren Summe 10 ist. Oder ein Programm, das nur dann mit OK endet, wenn das Signatur Script das SHA256 Pre-Image eines Hashes enthält. Schau dir folgendes Beispiel an:

OP_SHA256
334d016f755cd6dc58c53a86e183882f8ec14f52fb05345887c8a5edd42c87b7
OP_EQUAL

Dies gestattet jedem das Ausgeben des Outputs, der einen Input für SHA256 liefert, der als Hashwert 334d016f…d42c87b7 liefert. Du weisst zufälligerweise aus [ch02], der Text "Hello!" genau diesen Wert erzeugt. Angenommen, dein Signatur Script ist

Hello!

Lass das Programm laufen um dich zu vergewissern, dass es funktioniert und dass alle Signatur Scripts, die kein korrektes Pre-Image enthalten, scheitern.

5.3.2. Weshalb Signatur Script und Pubkey Script?

Merkwürdige Namen

Bitcoin Entwickler benutzen oft den Term scriptPubKey für das Pubkey Script und scriptSig für das Signatur Script, weil diese im Bitcoin Core Quellcode so heissen.

Du fragst dich vielleicht, warum wir den Output Script Teil Pubkey Script nennen, obwohl es doch keinen public Key enthält. Und ebenso, warum das Input Script Signatur Script heisst, obwohl es nicht nur aus einer Signatur besteht.

Das Pubkey Script in Bitcoin Transaktionen enthielt früher einen richtigen public Key, und das Signatur Script bestand nur aus der Signatur. Damals war es einfacher. Ein typisches Pubkey Script sah so aus

<public key> OP_CHECKSIG

und das Signature Script so:

<signature>

Die Dinge haben sich seitdem verändert, aber die Namen Signatur Script und Pubkey Script sind geblieben. Die meisten Entwickler betrachten das Ganze abstrakter: man kann das Pubkey Script als public Key betrachten und das Signatur Script als Signatur, aber nicht notwendigerweise als normale public Keys und Signaturen. In einer normalen Zahlung heute ist der "public Key" das Script, das durch die "Signatur" erfüllt werden muss, das Signatur Script. Natürlich enthält hier der "public Key" einige Operatoren und einen PKH, aber wir können ihn konzeptionell immer noch als public Key betrachten. Das gleiche gilt für das Signatur Script, das wir konzeptionell als Signatur betrachten können.

5.4. Wo waren wir?

Dieses Kapitel beleuchtet die meisten Aspekte von Transaktionen. Abbildung 17 ist ein Rückverweis aus [ch01] darüber, wie eine typische Transaktion gesendet wird.

Wir sind durch die Anatomie einer Transaktion durchgegangen und diskutieren jetzt verschiedene Wege, Transaktionen zu authentisieren oder "signieren".

05 17
Abbildung 17. Dieses Kapitel betrachtet Transaktionen. Im Moment erforschen wir verschiedene Wege, Transaktionen zu authentisieren.

5.5. Einfallsreiche Zahlungsweisen

Zahlung an Hash, pay to hash
OP_SHA256
334d…87b7
OP_EQUAL

Johns Transaktion hat gerade zwei pay-to-public-key-hash (p2pkh) Outputs ausgegeben. Aber wie vorher erwähnt, gibt es auch andere Arten zu zahlen–zum Beispiel pay-to-hash, wobei man an einen SHA256 Hash bezahlt. Um einen solchen Output auszugeben, muss man das Pre-Image des Hashes im Signatur Script des ausgebenden Inputs mitliefern. Wir untersuchen noch einige weitere interessante und nützliche Wege, Transaktionen zu authentisieren.

5.5.1. Mehrere Signaturen, multiple signatures

In p2pkh erzeugt der Empfänger eine Cookie Token Adresse, die dem Sender übergeben wird. Der Sender zahlt dann an diese Adresse.

Aber was, wenn der Empfänger sein Geld lieber mit etwas anderem absichern will als mit einem einfachen private Key? Angenommen Faiza, Ellen und John wollen Spenden von ihren Kollegen für einen guten Zweck sammeln.

u05 04

Sie könnten eine normale p2pkh Adresse benutzen, an die die Spender zahlen würden. Sie könnten dann zum Beispiel Faiza den private Key geben, sadass nur sie das Geld ausgeben könnte. Dieser Ansatz hat ein paar Probleme:

  • Wenn Faiza sterben würde, wäre das Geld für immer verloren. Ellen und John könnten nicht über die Spenden verfügen.

  • Wenn Faiza unvorsichtig mit ihrem Backup ist, könnte das Geld verlorengehen. Wieder wird niemand in der Lage sein, das Geld zu verwenden.

  • Wenn Faiza mit dem private Key unvorsichtig ist, könnte das Geld gestohlen werden.

  • Faiza könnte mit dem Geld abhauen.

In diesem Aufbau scheint eine Menge Risiko zu stecken, aber was, wenn Faiza den private Key ihren beiden Wohltätigkeits-Kollegen gibt? Dann kann jeder von denen das Geld ausgeben. Das löst Probleme 1 und 2, aber Probleme 3 und 4 würden schlimmer werden, weil jetzt jeder der drei den private Key nachlässig sichern oder mit dem Geld durchbrennen könnte.

Die Organisation besteht aus drei Leuten. Es wäre besser, wenn diese drei irgendwie die Verantwortung und Kontrolle über das Geld teilen könnten. Dank der Script Programmiersprache können sie dies tun.

Sie können je einen private Key erzeugen und verlangen, dass zwei der drei Keys die Transaktion signieren, bevor die Spenden ausgegeben werden können. (Abbildung 18).

05 18
Abbildung 18. Multisignatur-Aufbau zwischen Faiza, Ellen und John. Zwei der drei Keys sind nötig, um auf das Geld zuzugreifen.

Dies führt einige gute Eigenschaften in den Wohltätigkeits-Fonds ein:

  • Wenn einer der drei Keys gestohlen wird, kommt der Dieb trotzdem nicht an das Geld heran.

  • Wenn einer der drei Keys aufgrund von Nachlässigkeit oder Tod verlorengeht, dann reichen die anderen beiden Keys aus, um das Geld zu verwenden.

  • Von den dreien kann nicht einer einfach mit dem Geld verschwinden.

Abbildung 19 zeigt ein Script Programm, das die zwei-aus-drei Regel umsetzt.

Bug

Es gibt einen Bug in der Bitcoin Software, der verursacht, dass OP_CHECKMULTISIG ein zusätzliches Dummy-Element am Beginn des Signatur Scripts verlangt.

05 19
Abbildung 19. Ein Programm, das zwei Signaturen aus drei möglichen Keys erfordert. Das Geheimrezept ist OP_CHECKMULTISIG.

Der OP_CHECKMULTISIG Operator instruiert Lisa, zu prüfen, dass die zwei Signaturen im Signatur Script mit den Keys im Pubkey Script erzeugt wurden. Lisa lässt das Programm in Abbildung 20 laufen.

05 20
Abbildung 20. Ablegen einiger Datenelemente auf den Stack.

Die obersten acht Datenobjekte im Programm werden auf den Stack gelegt. Danach wird der einzige Operator, OP_CHECKMULTISIG, gestartet, wie in Abbildung 21 dargestellt. OP_CHECKMULTISIG nimmt eine Zahl, in diesem Fall 3, vom Stack herunter und erwartet dann diese Anzahl public Keys auf dem Stack, gefolgt von einer weiteren Zahl. Diese zweite Zahl gibt an, wie viele Signaturen zum Ausgeben des Geldes benötigt werden. In diesem Fall ist die Zahl 2. Der Operator nimmt dann die erwartete Anzahl Signaturen vom Stack, gefolgt von dem oben genannten Dummy. Das Dummy Objekt wird nicht benutzt.

05 21
Abbildung 21. Ausführen des OP_CHECKMULTISIG Operators, was dieses Mal zu OK führt.

OP_CHECKMULTISIG benutzt all diese Informationen und die Transaktion, um festzustellen, ob genug Signaturen erstellt wurden, und verifiziert diese Signaturen. Wenn alles OK ist, tut er OK zurück auf den Stack. Damit endet das Programm. Weil auf dem Stack oben OK liegt, ist das Ausgeben des Outputs autorisiert.

u05 05

Ein Kollege, der Cookie Tokens an den wohltätigen Fonds spenden möchte, muss sein Wallet dazu bringen, das Pubkey Script in Abbildung 19 in den Transaktions-Output zu schreiben. Das erzeugt ein paar Probleme:

  • Das Wallet des Kollegen weiss nur, wie es p2pkh Outputs erzeugen kann. Das Wallet müsste modifiziert werden, um Multisignatur Outputs zu verstehen, und müsste eine Benutzerschnittstelle bekommen, die diese Art von Output für Benutzer verwendbar macht.

  • Ein Sender muss normalerweise nicht wissen, wie der Empfänger sein Geld schützt. Dem Sender ist es egal, ob Multisignatur, p2pkh oder sonst irgendetwas. Sie wollen einfach bezahlen.

  • Transaktionen müssen normalerweise eine Gebühr zahlen, um bearbeitet zu werden (mehr dazu in [ch07]). Diese Gebühr hängt davon ab, wie gross die Transaktion in Bytes ist. Für ein grosses Pubkey Script muss der Sender eine höhere Gebühr bezahlen. Das ist unfair, weil der Empfänger derjenige ist, der dieses extravagante, teure Feature benutzt. Der Empfänger, nicht der Sender, sollte für diesen Luxus zahlen.

Man kann dies mit einer kleinen Änderung in der Weise, wie die Programme laufen, korrigieren. Ein paar der Entwickler unter deinen Kollegen erfinden etwas namens pay-to-script-hash (p2sh).

5.5.2. Pay-to-script-hash

Wir haben diskutiert, wie p2pkh den public Key vor dem Sender versteckt, der anstelle des public Key nur den Hash des public Key zu sehen bekommt.

BIP16

Diese Art von Zahlung wurde 2012 mit BIP16 eingeführt.

p2sh spinnt diese Idee noch weiter–es versteckt das Script Programm. Anstatt dem Sender ein grosses, kompliziertes Script Programm zu geben, gibt man ihm nur den Hash des Scripts. Der Sender bezahlt dann an diesen Hash und überlässt es dem Empfänger, später das Script zu liefern, wenn er das Geld ausgeben möchte.

Nehmen wir wieder mal an, dass Faiza, Ellen und John Geld für eine Hilfsorganisation sammeln wollen, und sie wollen ein Multisignatur Setup benutzen, um das Geld zu sichern (Abbildung 22).

05 22
Abbildung 22. Überblick über p2sh. Das Pubkey Script ist einfach. Das Signatur Script ist etwas Besonderes, weil es ein Datenobjekt enthält, das ein Programm ist.

Um diese Transaktion vollständig zu validieren, brauchen wir neue Software. Wir sprechen gleich darüber, wie die neue Software diese Transaktionen verifiziert. Lass uns zuerst schauen, wie die alte Software es machen würde.

Alte Software

Was, wenn die Person, die die Transaktion verifiziert, ihre Software nicht auf die schillernde neue Version aktualisiert hat, die das Verifizieren von p2sh Zahlungen unterstützt? Die Entwickler haben das vorwärtskompatibel umgesetzt, das bedeutet, alte Software wird diese neuen Transaktionen nicht ablehnen.

Wozu verifizieren?

Das Café ist in die Transaktion nicht involviert, warum sollte sie es also überhaupt verifizieren? Das Café will wissen, ob Lisa ihren Job macht. Es ist im Interesse des Café zu wissen, ob da irgendwo eine miese Geschichte abläuft.

Stellen wir uns vor, das Café führt alte Software aus, um diese Transaktion im Spreadsheet zu überprüfen (Abbildung 23). Alte Software macht das, was sie immer gemacht hat - das Zeug in das Signaturskript schieben und dann das Pubkey Script laufen lassen.

Wenn das Programm zu Ende ist, ist das oberste Objekt auf dem Stack true, oder OK. Das bedeutet, die Zahlung ist für die alte Software gültig.

05 23
Abbildung 23. Überprüfung der p2sh Transaktion mit der alten Software

Du erkennst vielleicht das Pubkey Script aus dem früheren Beispiel wieder, als du Geld an ein Pre-Image eines Hashes zahlen konntest. Das ist auch das, was hier passiert ist, nur mit einer anderen kryptografischen Hashfunktion.

Die alte Software interpretiert das Programm als Zahlung an einen Hash. Wer immer ein Pre-Image dieses Hashes zeigen kann, bekommt das Geld. Das eigentliche Multisignatur Programm, das in dem Einlöse-Script enthalten ist, läuft nie ab.

Neue Software

Angenommen das Café hat gerade ein Upgrade der Software gemacht und will die Transaktion erneut überprüfen. Schauen wir mal, was passiert.

Die neue Software schaut sich das Pubkey Script an, um festzustellen, ob diese Transaktion einen p2sh Output ausgibt. Sie sucht nach diesem Muster:

OP_HASH160
20 Byte Hash
OP_EQUAL

Wenn das Pubkey Script genau dieses Muster hat–das p2sh Muster, dann behandelt die Software das Programm anders. Zuerst führt es dieselben Schritte durch wie die alte Software, siehe Abbildung 23, aber sie wird den Stack nach Schritt 2 retten. Nennen wir das einmal den geretteten Stack. Wenn die ersten sieben Schritte ein OK ergeben, dann wird der Stack durch den geretteten Stack ersetzt; und das oberste Stack-Element, Einlöse-Script, wird vom Stack genommen (Abbildung 24).

05 24
Abbildung 24. Der Stack wird durch den geretteten Stack ersetzt, und das Einlöse-Script vom Stack genommen.

Das Einlöse-Script, wir bezeichnen es von jetzt an mit dem Fachbegriff Redeem Script, ist ein Datenobjekt, das ein Programm beherbergt, wie vorhin beschrieben. Dieses Programm wird jetzt in den Programmbereich gelegt und beginnt zu laufen. Es läuft jetzt genau so ab, als wäre es eine herkömmliche Zahlung (Abbildung 25).

05 25
Abbildung 25. Ausführen des im Redeem Script enthaltenen Programms

Es ist wichtig für Lisa, dass sie auf den letzten Stand der Software ist. Würde Lisa alte Software laufen lassen, könnte sie nur verifizieren, dass der Hash des Redeem Scripts dem Script Hash des Pubkey Scripts entspricht. Jeder, der zufällig das Redeem Script kennt–zum Beispiel Faiza–könnte sich das Geld im Spreadsheet aneignen. Lisa würde fröhlich die Transaktion bestätigen. Das würde zu Problemen führen, wenn auf anderen verifizierenden Nodes neuere Software liefe. Diese Nodes würden die Transaktion im Spreadsheet ablehnen, weil sie gemäss der neuen Regeln unzulässig wäre. Das gesamte Spreadsheet wäre dann ungültig und für neue Nodes ab diesem Punkt inakzeptabel. Wir diskutieren diese Situation detaillierter in [ch11].

5.5.3. Pay-to-script-hash Adressen

Faiza, Ellen und John haben ein zwei-aus-drei Multisignatur Redeem Script erzeugt:

2
022f52f2868dfc7ba9f17d2ee3ea2669f1fea7aea3df6d0cb7e31ea1df284bdaec
023d01ba1b7a1a2b84fc0f45a8a3a36cc7440500f99c797f084f966444db7baeee
02b0c907f0876485798fc1a8e15e9ddabae0858b49236ab3b1330f2cbadf854ee8
3
OP_CHECKMULTISIG

Sie wollen jetzt, dass Leute an den SHA256+RIPEMD160 Hash des Redeem Scripts bezahlen:

04e214163b3b927c3d2058171dd66ff6780f8708
u05 06

Wie sagen Faiza, Ellen und John den Leuten, wohin sie zahlen sollen? Was drucken sie auf die Flugblätter, damit die Kollegen an ihren Script Hash zahlen können? Schauen wir uns ein paar Möglichkeiten an:

  • Drucke den Script Hash so, wie er ist, und informiere die Kollegen, dass dies der Hash eines Redeem Scripts ist. Das würde die Kollegen dem unnötigen Risiko von Tippfehlern aussetzen, genau wie bei Zahlungen an rohe PKHs, wie in [ch03] diskutiert.

  • Base58check-codiere den Script Hash genau wie in [ch03], was eine Adresse erzeugen würde wie 1SpXyW…RMmEMZ. Würde diese Adresse auf die Flugblätter gedruckt, dann müssten sie den Benutzern auch sagen, dass die einen p2sh Output statt eines normalen p2pkh Outputs erzeugen sollen.

In beiden Fällen, wenn der Spender irrtümlich eine p2pkh Zahlung mit dem gedruckten Hash oder der Adresse macht, kann niemand das Geld ausgeben, weil kein private Key mit diesem falschen PKH korrespondiert.

Diese zwei Optionen scheinen also weder sicher noch praktikabel. Lass uns stattdessen ein neues Adressformat für p2sh einführen, die ps2h Adresse (Abbildung 26). Dieses Format ist ähnlich wie die normalen p2pkh Adressen. Es benutzt das base58check Codierschema, genau wie normale Adressen dies tun.

05 26
Abbildung 26. Erzeugen einer p2sh Adresse. Der Unterschied zu normalen Adressen ist die Version, die für p2sh Adressen 05 ist statt 00.

Der Vorgang ist fast derselbe wie bei p2pkh Adressen. Der einzige Unterschied ist, dass die Version 05 ist statt 00. Das führt dazu, dass die Adresse mit einer 3 beginnt statt mit einer 1.

Wegen dieser Änderung und aufgrund der Funktionsweise von base58–wiederholte Integerdivision durch 58–wird der letzte Rest immer 2 sein. Wenn es dich interessiert, in Abbildung 27 siehst du die base58 Codierung des versionierten und mit Checksum versehenen Script Hashes von Faizas, Ellens und Johns Script.

05 27
Abbildung 27. Codieren eines versionierten und mit Checksum versehenen Scripts mit base58. Das Ergebnis beginnt immer mit der Ziffer 3.

Der letzte Rest 2 übersetzt sich zu 3 in der Zeichen-Lookup-Tabelle von base58. Dieses Zeichen 3 wird zum ersten Zeichen, wenn der base58 Prozess den Umkehrschritt durchführt. Daher beginnen alle p2sh Adressen mit 3. So können Benutzer sie als p2sh Adressen erkennen und nicht zum Beispiel als p2pkh Adressen.

u05 07

Faiza, Ellen und John können jetzt 328qTX…wrB2ag auf die Flugblätter drucken. Wenn ein Kollege den QR code ihres Flugblattes scannt, erkennt deren Wallet die Adresse als p2sh Adresse, weil sie mit 3 beginnt.Das Wallet wird die Adresse base58check-decodieren und einen korrekten ps2h Output erzeugen:

OP_HASH160
04e214163b3b927c3d2058171dd66ff6780f8708
OP_EQUAL

Dies beendet unsere Diskussion über programmierbare Transaktionen. Du hast gelernt, dass Transaktionen eine Menge verschiedener Bedingungen für das Ausgeben des Geldes setzen können. Wohlgemerkt kann man nicht diktieren, wo das ausgegebene Geld hingehen soll, nur was der Input liefern muss, damit er das Geld ausgeben kann. Das Pubkey Script definiert die Regeln für das, was das Signatur Script liefern muss. Später im Buch werden wir Transaktionen noch einmal anschauen um über noch extravagantere Sachen zu reden, die man mit ihnen machen kann, wie zum Beispiel das Geld bis zu einem bestimmten Zeitpunkt einzufrieren.

5.6. Mehr Zeug in Transaktionen

u05 08

Wir haben immer noch nicht alle Bestandteile einer Transaktion besprochen. Ein paar weitere Brocken Information gehören noch in Transaktionen, inklusive Version, Verwahrdauer und Sequenznummern.

Version

Jede Transaktion hat eine Version. Derzeit gibt es zwei Versionen: 1 und 2.

Sequenznummer

Eine 4 Byte Zahl in jedem Input. Für die meisten Transaktionen ist diese auf den Maximalwert gesetzt: ffffffff. Dies ist ein altes, abgeschaltetes Feature, das für eine neue Funktionalität umgestaltet wurde.

Verwahrdauer–Lock time

Ein Zeitpunkt, vor dem die Transaktion dem Spreadsheet nicht hinzugefügt werden kann. Wenn die Lock Time 0 ist, darf die Transaktion jederzeit ins Spreadsheet eingetragen werden.

Ich nenne diese knappe Information hier der Vollständigkeit halber. Wir diskutieren diese Features näher in [ch09], wenn du mehr über die Grundlagen von Bitcoin weisst.

5.7. Belohnungen und Coin-Erzeugung

u05 09

Du fragst dich vielleicht, wo all die Cookie Tokens überhaupt erst herkommen. Erinnerst du dich an [ch02], als ich beschrieben hatte, wie Lisa täglich mit 7.200 CT belohnt wird? Sie trägt jeden Tag eine Zeile ins Spreadsheet ein, die 7.200 an sie selbst zahlt.

Jetzt belohnt sie sich immer noch mit 7.200 CT täglich, allerdings auf eine etwas andere Weise. Jeden Tag fügt sie eine neue Transaktion an das Spreadsheet an, die sie Coinbase Transaktion nennt (Abbildung 28).

05 28
Abbildung 28. Lisa belohnt sich täglich mit einer Coinbase-Transaktion
Belohnungen–Rewards

Belohnungen werden in Bitcoin ungefähr alle 10 Minuten mittels Coinbase-Transaktionen ausgeschüttet, und zwar an die Nodes, die die Bitcoin Blockchain absichern. Das wird in [ch07] besprochen.

Der Input der Coinbase-Transaktion heisst coinbase. Die einzige Möglichkeit, neue Coins zu generieren, besteht darin, dem Spreadsheet eine Coinbase-Transaktion hinzuzufügen. Neue Coins werden an Lisa ausgeschüttet, als Belohnung für ihre wertvolle Arbeit.

Alle Transaktionen können zu einer oder mehreren Coinbase Transaktionen zurückverfolgt werden, indem man den txid Referenzen in den Transaktions-Inputs folgt. Die Transaktionen formen einen Transaktionsgraphen (Abbildung 29). Sie sind durch die txids miteinander verbunden.

05 29
Abbildung 29. Der Transaktionsgraph. Alle Transaktionen stammen von einer oder mehreren Coinbase-Transaktionen ab

Johns Transaktion stammt von vier verschiedenen Coinbase Transaktionen ab. Um Johns Transaktion zu verifizieren, muss man allen txids von Johns Transaktion zurück folgen und alle Transaktionen entlang des Weges prüfen, bis man bei den vier Coinbase Transaktionen angekommen ist. Das ist der Teil, wo das UTXO Set den Prüfern hilft. Es enthält alle bereits geprüften UTXOs. Die Prüfer müssen nur den txids folgen (normalerweise nur ein Schritt), bis sie an einen Output kommen, der schon im UTXO Set liegt.

Die Coinbase Transaktionen müssen ebenfalls verifiziert werden, damit es nur genau eine coinbase pro 24 Stunden gibt, und jede coinbase genau 7.200 neue Cookie Tokens erzeugt.

5.7.1. Übergang von Version 4.0

Du fragst dich vielleicht, wie die Kollegen vom alten Spreadsheet–wie es in Release 4.0 war–auf das neue umstellen konnten, das mit den Transaktionen. Was ist mit den existierenden Cookie Tokens im Spreadsheet passiert?

Sie hatten sich alle auf einen Zeitslot geeinigt, an dem der Upgrade stattfinden würde. Während dieser Zeit erzeugte Lisa eine einzelne, riesige Transaktion mit einem Output pro PKH im Spreadsheet. Die Transaktion sieht aus wie eine Coinbase Transaktion, aber mit einer Menge Outputs. Jeder kann eine Version des alten Spreadsheets vorhalten und verifizieren, dass diese Transaktion exakt dieselben Outputs enthält wie das alte UTXO Set. Neue Prüfer können jedoch nicht sicher sein, ob es gut gelaufen ist - sie müssen Lisa damit vertrauen.

Bedenke, dass dies in Bitcoin, das von Anfang an für Transaktionen konzipiert wurde, überhaupt nicht so ist. Der „Initialzustand“ in Bitcoin war ein leeres UTXO Set. Niemand hatte Bitcoins.

5.8. Vertrauen in Lisa

In diesem Kapitel haben wir den Bezahlvorgang formalisiert–zum Beispiel muss die Transaktion aus dem Wallet als Anhang in einer Mail an Lisa geschickt werden. Lisa kann diese Formalisierung zur Automatisierung aller ihrer Aufgaben nutzen. Sie schreibt ein Computerprogramm, das die Transaktionen aus ihrer Mailbox holt und automatisch überprüft, das UTXO Set verwaltet und Transaktionen ans Spreadsheet anhängt. Lisa kann entspannt zuschauen, wie ihr Computerprogramm ihr die Routinearbeit abnimmt. Schön.

Aber jetzt fragt man sich vielleicht, ob Lisa die 7.200 CT Belohnung pro Tag noch wert ist. Sie arbeitet nicht mehr aktiv an den Überprüfungen; sie sitzt nur da und dreht Däumchen. Überlegen wir mal kurz, wofür Lisa eigentlich bezahlt wird. Sie wird nicht bezahlt, um langweilige, manuelle Arbeit zu verrichten, sondern um korrekte, ehrliche Bestätigungen von Transaktionen durchzuführen und sie nicht zu zensieren. Das ist es, was für dich und deine Kollegen wertvoll ist. Wenn Lisa ein Computerprogramm schreibt, um die Hauptarbeit zu erledigen, dann macht dies die Zahlungsabwicklung nicht weniger korrekt oder ehrlich.

Wir vertrauen Lisa, dass sie Transaktionen nicht…
  • zensiert

  • rückabwickelt

Transaktionen lösen das Problem, dass Lisa beliebig Zeug im Spreadsheet ändern könnte. Das einzige, womit wir Lisa noch trauen müssen, ist, dass sie

Transaktionen nicht zensiert

Sie muss jede gültige Transaktion, die sie in einer Mail erhält, dem Spreadsheet anhängen.

Transaktionen nicht rückabwickelt

Eine Transaktion rückabwickeln bedeutet, sie aus dem Spreadsheet entfernen.

Wenn es Lisa einfällt, dass sie Faiza eigentlich nicht mag, und sie ausserdem zufälligerweise Kenntnis über Faizas UTXOs hat, kann sie sich weigern, Faizas Transaktionen abzuarbeiten, die versuchen, diese UTXOs auszugeben. Das bedeutet, Faiza kann ihr Geld nicht ausgeben. Lisa zensiert Faizas Transaktionen.

Wenn Lisa eine Transaktion aus dem Spreadsheet entfernt, deren Outputs alle unverbraucht sind, dann könnte das von bereits laufenden Prüfern festgestellt werden. Aber Prüfer, die nach dem Rückabwickeln angefangen haben zu verifizieren, werden es nicht feststellen, weil das Spreadsheet immer noch regelkonform gültig ist.

Angenommen, Lisa revertiert Johns Transaktion aus Abschnitt 5.2. Lisa entfernt Johns Transaktion aus dem Spreadsheet. Niemand hat einen der Output aus Johns Transaktion bisher ausgegeben, sodass das Spreadsheet keine Transaktionen enthält, die ungültig werden, wenn Johns Eintrag gelöscht wird.

Ein bereits laufender Verifizierer–zum Beispiel das Café– merkt davon nichts, weil es nur nach neuen Transaktionen am Ende des Spreadsheets schaut. Es hat bereits Johns Transaktion überprüft und sein UTXO Set aktualisiert. Das Café vertraut darauf, dass Lisa keine Transaktionen löscht und überprüft daher das Spreadsheet nicht immer wieder.

Weiter, angenommen eine neue Kollegin, Vera, fängt an ihr eigenes UTXO Set aus dem Spreadsheet aufzubauen, das jetzt Johns Transaktion nicht mehr enthält. Das UTXO Set wird sich von dem des Cafés unterscheiden. Aus Veras Perspektive hat John immer noch das Geld und hat nicht 10 CT an das Café bezahlt. Die Outputs, die John in der jetzt gelöschten Transaktion ausgegeben hatte, erscheinen Vera unverbraucht, weil sie in Veras UTXO Set liegen.

Wir haben jetzt Vera, die glaubt, dass John immer noch das Geld hat; Lisa, die die Transaktion gelöscht hat; und das Café, das glaubt es hat 10 CT von John bekommen. Bisher hat niemand das Vergehen von Lisa bemerkt. Es wird auch niemand bemerken, bis jemand versucht, einen Output von Johns Transaktion auszugeben. Das könnte das Café sein, das seine 10 CT ausgibt, oder John, der seine 3 CT Change ausgibt.

Sagen wir, das Café will die Miete an die Firma zahlen. Es muss dazu unter anderem die Outputs von Johns Transaktion benutzen. Das Café erzeugt eine Transaktion, die den Output ausgibt, signiert sie und schickt sie an Lisa. Lisa weiss, dass sie Johns Transaktion gelöscht hatte und dass ihr Vergehen bemerkt werden wird. Wenn Lisa sich entscheidet, die Transaktion des Cafés zu bestätigen, dann macht sie damit das ganze Spreadsheet ungültig, und Vera und alle anderen Verifikatoren werden das Spreadsheet komplett verwerfen. Nicht gut. Wenn Lisa sich entscheidet, die Transaktion abzuweisen, was das vernünftiger für sie ist, dann wird es das Café merken, weil die Transaktion nie bestätigt werden wird.

Wenn das Café das merkt, dann kann es nicht beweisen, dass Johns Transaktion je in dem Spreadsheet war. Lisa kann nicht beweisen, dass Johns Transaktion nie in dem Spreadsheet war. Es steht Aussage gegen Aussage. Wir lösen dieses Problem in [ch06].

Es ist nicht klar, weshalb Lisa Johns Transaktion löschen sollte. Vielleicht bezahlt John Lisa dafür, dass sie es tut. Es wäre aber vermutlich vernünftiger, wenn Lisa stattdessen mit ihrem eigenen Geld betrügen würde. Sagen wir, sie kauft einen Keks im Café, und wenn das Café die Transaktion im Spreadsheet gesehen hat, gibt es Lisa den Keks. Lecker. Dann läuft Lisa zurück zu ihrem Arbeitsplatz und löscht ihre Transaktion. Jetzt hat sie einen Keks und behält das Geld. Das wird natürlich bemerkt, wenn das Café versucht, den Output von der gelöschten Transaktion auszugeben. Aber wie bei Johns Transaktion steht hier Aussage gegen Aussage. Lisa kann behaupten, dass die Transaktion nie im Spreadsheet war, und das Café kann behaupten, dass sie darin war. Niemand kann irgendetwas beweisen.

5.9. Zusammenfassung

Transaktionen machen es Lisa unmöglich, Cookie Tokens von anderen zu stehlen. Sie lösen dieses Problem dadurch, dass alle Signaturen öffentlich im Spreadsheet stehen. Die Wallets der Benutzer erzeugen und signieren Transaktionen, die Lisa verifiziert und an das Spreadsheet hängt.

u05 10

Transaktionen haben Inputs und Outputs. Ein Output einer Transaktion enthält den zweiten Teil eines Script Programms. Wenn der Output ausgegeben werden soll, muss der Input, der den Output ausgeben will, den ersten Teil des Programms liefern.

u05 11

Lisa lässt das Programm laufen. Wenn das Programm mit OK endet, dann ist das Ausgeben dieses Outputs autorisiert. Wenn die Programme aller Inputs einer Transaktion mit OK enden, ist die gesamte Transaktion gültig, und Lisa hängt sie hinten an das Spreadsheet an.

Wenn die Transaktion einmal im Spreadsheet ist, kann jeder genau dieselben Checks machen, wie sie Lisa gemacht hat, weil sie die Transaktion genau so in das Spreadsheet eingetragen hat, wie sie sie bekommen hatte. Wenn Lisa die Transaktion verändern würde, würde man bemerken, dass das Spreadsheet nicht mehr gültig ist, weil es eine ungültige Transaktion enthält. Das einzige, was man nicht überprüfen kann ist, ob Transaktionen zensiert (nicht an das Spreadsheet angehängt) oder gelöscht werden. Mit diesen beiden Sachen muss man Lisa noch trauen.

5.9.1. Systemänderungen

u05 12

Transaktionen und die txid hast du jetzt in deinem Werkzeugkasten. Die Konzept-Tabelle (Tabelle 1) schrumpft um zwei Zeilen: Mails an Lisa und Zeilen im Spreadsheet werden durch Transaktionen ersetzt. Wir schicken wohlgemerkt immer noch Transaktionen an Lisa, aber die Transaktionen haben dasselbe Format wie in Bitcoin. Deshalb können wir sie jetzt entfernen.

Tabelle 1. Transaktionen ersetzen Klartext-Mails an Lisa und Zeilen im Spreadsheet.
Cookie Tokens Bitcoin Behandelt in

1 cookie token

1 bitcoin

[ch02]

Das Spreadsheet

Die Blockchain

[ch06]

Email an Lisa

Eine Transaktion

Kapitel 5

Eine Zeile im Spreadsheet

Eine Transaktion

Kapitel 5

Lisa

Ein Miner

[ch07]

Das nächste Kapitel widmet sich dem Ersetzen des Spreadsheets, das jetzt die Transaktionen enthält, durch eine Blockchain.

Geben wir Version 5.0 des Cookie Token Systems frei (Tabelle 2).

Tabelle 2. Release Notes, Cookie Tokens 5.0
Version Feature Wie

new5.0

Mehrere “Coins” in einer Zahlung

Mehrere Inputs in Transaktionen

Jeder kann das Spreadsheet überprüfen

Signaturen in Transaktionen öffentlich einsehbar

Sender legt Kriterien für das Ausgeben fest

Script Programme in Transaktionen

4.0

Einfache Zahlungen und Adresserzeugung

Mobile App “Wallet”

Einfachere Backups

HD Wallets aus Seed generiert. Nur der Seed, 12 bis 24 englische Wörter, wird gesichert.

Adresserzeugung in unsicherer Umgebung

HD Wallets können public Key Bäume erzeugen, ohne je die private Keys zu sehen.

3.0

Sicher gegen teure Tippfehler

Cookie Token Adressen.

Privacy Verbesserungen

Ein PKH statt eines Namens steht im Spreadsheet.

2.0

Sichere Zahlungen

Digitale Signaturen lösen das Problem mit Betrügern.

5.10. Übungen

5.10.1. Wärm dich auf

  1. Angenommen, dein ganzes Geld ist auf drei UTXOs verteilt: einen mit 4 CT, einen mit 7 CT und einen mit 2 VT. Welche dieser Outputs würdest du für eine Zahlung von 10 CT verwenden? Welche Outputs hätte deine Transaktion und was wären ihre Werte in CT?

  2. Für was werden in einer Transaktion txids benutzt?

  3. Warum besitzt eine Transaktion normalerweise einen Change Output?

  4. Wo liegen in einer Transaktion die Signaturen?

  5. Warum wird der public Key im Input einer Transaktion benötigt, die einen p2pkh Output ausgeben will?

  6. Warum werden die Signatur Scripts einer Transaktion bereinigt, wenn ein Wallet die Transaktion signiert?

  7. Wo liegen innerhalb einer Transaktion die Pubkey Scripts und was enthalten sie?

  8. Was muss ein Script Programm (Signatur Script + Pubkey Script) erfüllen, damit ein Input als authentisch gilt?

  9. Woran kann man eine p2sh Adresse erkennen?

5.10.2. Grabe tiefer

  1. Angenommen, du hast 100 CT in einem einfachen Output an Index 7 einer Transaktion. Du möchtest 10 CT an die p2pkh Adresse @C des Cafés und 40 CT an Faizas, Ellens und Johns p2sh Wohltätigkeits-Spendenadresse @FEJ zahlen. Konstruiere eine einzige Transaktion, die das erledigt. Bitte schummele, indem du die genauen Operatoren und Programmvorlagen aus diesem Kapitel nachschlägst. Du brauchst die Inputs nicht zu signieren.

  2. Das UTXO Set enthält alle UTXOs. Nimm an, es enthält 10.000 UTXOs und du schickst eine Transaktion an Lisa, die zwei Inputs und fünf Outputs enthält. Wie viele UTXOs enthält das UTXO Set, nachdem die Transaktion bestätigt wurde?

  3. Erzeuge ein wirklich einfaches Pubkey Script, das jedem das Ausgeben des Outputs erlaubt. Was würde das Signatur Script des ausgebenden Inputs enthalten?

  4. Erzeuge ein Pubkey Script, das von Ausgebenden verlangt, zwei Zahlen im Signatur Script zu liefern, deren Summe 10 beträgt, damit das Geld ausgegeben werden kann. Ein Operator namens OP_ADD nimmt die beiden obersten Elemente vom Stack und legt deren Summe wieder dort ab.

  5. Angenommen, du betreibst einen Full Node und erhältst Geld von Faiza in einer bestätigten Transaktion. Kann du darauf vertrauen, dass das Geld von Faiza echt ist?

  6. Ein public Key ist in dem Input, der einen p2pkh Output ausgibt, sichtbar. Was ist der Nachteil davon, wenn du mehrere UTXOs an derselben PKH Adresse besitzt? Was kannst du tun, um diesen Nachteil zu vermeiden?

5.11. Zusammenfassung

  • Transaktionen haben Inputs und Outputs, sodass man in einer einzelnen Transaktion mehrere “Coins” ausgeben und an mehrere Empfänger zahlen kann.

  • Die Outputs von Transaktionen sind “programmierbar”. Das Sender-Wallet entscheidet, welches Programm in den Output kommt. Dies gibt die Bedingungen vor, die zum Ausgeben des Geldes nötig sind.

  • Jeder kann das gesamte Spreadsheet verifizieren, weil die Signaturen öffentlich sind. Das verringert das Mass an notwendigem Vertrauen in Lisa.

  • Scripts können benutzt werden, um Multisignatur-Fähigkeiten zu erreichen–zum Beispiel drei-von-sieben Tauglichkeit von Transaktionen. Das ist grossartig für Firmen und karitative Einrichtungen.

  • Ein neuer Adresstyp, die mit 3 beginnende p2sh Adresse, wird zur Vereinfachung von Bezahlvorgängen bei einer Reihe von Bezahlarten verwendet, zum Beispiel für Multisignaturen.

  • Alle Transaktionen stammen von einer oder mehreren Coinbase Transaktionen ab, Coinbase Transaktionen sind die einzige Art der Geldschöpfung.

  • Die Geldschöpfung wird von jedem Kollegen geprüft um sicherzustellen, dass Lisa exakt so viel erzeugt wie vereinbart: 7.200 CT pro Tag, mit einer Halbierung alle vier Jahre.

  • Lisa kann Transaktionen zensieren und umkehren. Damit musst du ihr immer noch vertrauen.