9. Nochmal zurück zu Transaktionen

Dieses Kapitel behandelt

  • Bitcoins mit Zeitschloss

  • Tauschgeschäfte zwischen Blockchains

  • Anhängen beliebiger Daten an Transaktionen

  • Erhöhen der Fee für eine ausstehende Transaktion

Wir haben jetzt die Kernkapitel des Buches hinter uns, in denen du die Grundlagen von Bitcoin gelernt hast. In diesem Kapitel scheuen wir tiefer in die Funktionalitäten hinein, die Transaktionen anbieten können.

Wir beginnen mit der Betrachtung von Zeitschlössern, oder Time Locks. Ein Time Lock ist eine Methode, eine Transaktion bis zu einem bestimmten Zeitpunkt ungültig zu machen. Das bedeutet, die Transaktion kann nicht bestätigt werden, bevor die zeitliche Bedingung erfüllt ist. Ausserdem kann ein Output einer Transaktion so programmiert werden, dass er nicht ausgegeben werden kann, bevor eine zeitliche Bedingung erfüllt ist. Das ist für digitale Verträge nützlich, wie atomare Tauschgeschäfte, die später im Kapitel behandelt werden.

Manchmal ist es nützlich, eine paar Daten in der Blockchain zu speichern. Zum Beispiel könnte ein Automobilhersteller die Besitzverhältnisse eines Autos dadurch verfolgen, dass er die Fahrgestellnummer in eine Bitcoin Transaktion packt und damit effektiv ein Token auf der Bitcoin Blockchain erzeugt. Der aktuelle Besitzer kann dann das Eigentum am Auto übertragen, indem er das Token an den neuen Besitzer sendet.

Wie in [altcoins] erwähnt, gibt es mehrere alternative Kryptowährungen. Manchmal möchte man, zum Beispiel, namecoins gegen bitcoins tauschen. Das Naheliegende wäre, auf einer Exchange bitcoins zu verkaufen und namecoins zu kaufen. Aber es gibt andere, dezentralisiertere Methoden, das zu tun. Atomare Tauschgeschäfte, oder Atomic Swaps lassen dich bitcoins direkt mit jemandem tauschen, der namecoins hat, ohne dass eine vertrauenswürdige Drittpartei wie eine Exchange benötigt wird.

Wenn du eine zu geringe Transaction Fee bezahlst, könnten die Miner sich weigern, die Transaktion innerhalb einer akzeptablen Zeit zu bestätigen. In dieser Situation kann es hilfreich sein, die Transaktion durch eine eine andere zu ersetzen, die eine etwas höhere Gebühr zahlt. Dies wird als Gebührenerhöhung oder Fee-Bumping bezeichnet.

Schliesslich untersuchen wir einige komplizierte Details von Signaturen. Man kann Signaturen je nach Anwendungsfall auf verschiedene Weisen erzeugen. Man kann justieren, woran sich die Signatur bindet: mit anderen Worten, wie der Signaturalgorithmus die Transaktion hasht.

9.1. Time-Locked Transaktionen

Wenn du eine Transaktion erzeugst und signierst, ist sie gültig und bereit für die Einbindung in einen künftigen Block. Du kannst sie sofort broadcasten und minen lassen. Dies ist der Normalfall.

Aber in manchen Fällen willst du vielleicht eine Transaktion signieren mit einer Garantie, dass sie frühestens nächstes Jahr oder, sagen wir, nach Ablauf eines Jahres, in einem Block landen kann.

Angenommen du hast 100 bitcoins, und du willst, dass deine Tochter das Geld auf ihrer Adresse @D erbt, aber erst nachdem du tot bist. Du kannst dafür eine Transaktion erzeugen, die ein Zeitschloss trägt. Man bezeichnet eine solche Transaktion als zeitverriegelt oder time-locked (Abbildung 1).

Keine Gebühr?

Der Einfachheit halber zahlen die meisten Beispiele in diesem Kapitel keine Gebühren.

09 01
Abbildung 1. Eine Zahlung an deine Tochter, die am 30. April 2019 gültig wird
Folgenummern

Folgenummern sind immer in Inputs enthalten, aber ich habe sie nicht gezeigt, weil sie für die bis jetzt behandelten Transaktionen keine Bedeutung hatten.

Was diese Transaktion besonders macht sind die Folgenummern, Sequenznummern oder Sequence Numbers, in den Inputs, und die Transaktions Lock Time. Ich hatte die Folgenummern bereits in [ch05] kurz erwähnt. Sie werden benutzt, um die Lock Time zu entsperren, sie zu enablen: besitzt irgendein Input eine Sequenznummer kleiner als ffffffff—zum Beispiel fffffffe–dann ist die auf der Transaktion gesetzte Lock Time wirksam. Wenn alle Sequenznummern ffffffff sind, besitzt die Lock Time keine Wirkung.

Du gibst diese Transaktion, Tx1, deiner Tochter. Die Transaktion ist momentan ungültig; deine Tochter speichert sie in ihrem Computer ab und druckt ein Backup aus, das sie anderswo aufbewahrt. Die Transaktion wird nicht ins Netzwerk gesendet; kein Full Node wird jetzt schon einen Block akzeptieren, der diese Transaktion enthält. Die Transaktion wird erst am Morgen des 30. April 2019 gültig. Wenn du vorher stirbst, muss deine Tochter bis nach der Lock-time warten und dann das Geld anfordern, indem sie die Transaktion sendet, die dann endlich gültig geworden ist.

Wenn du bis zu diesem Tag nicht stirbst, möchtest du sichergehen, dass die time-locked Transaktion nutzlos wird, damit deine Tochter sich nicht nach Ablauf des Datums einfach das Geld nehmen kann.

Du kannst eine Transaktion Tx2 erzeugen, aber noch nicht senden, die einen Output, den Tx1 ausgibt, doppelt ausgibt (Abbildung 2). Dann erzeugst du eine neue Transaktion für deine Tochter, die für ein weiteres Jahr time-locked ist. Nachdem sie die Transaktion sicher abgespeichert hat, sendest du Tx2.

09 02
Abbildung 2. Mache Tx1 ungültig, indem du einen Output ausgibst, den auch Tx1 ausgibt, und erzeuge eine neue time-locked Transaktion für deine Tochter.
Transaktions-Umformbarkeit, Transaction Malleability

Es gibt hier ein Problem. Die txid von Tx2 kann sich ändern, während sie gesendet wird, wodurch Tx3 für immer ungültig wird. Dieses Problem wird als Transaktions-Umformbarkeit oder Transaction Malleability bezeichnet und durch Segregated Witness behoben, was in [ch10] diskutiert wird.

Du musst

  1. Eine Transaktion Tx2, erzeugen, die mindestens einen der Outputs ausgibt, die von Tx1 ausgegeben werden. Tx2 ist eine normale, nicht time-locked Transaktion. Sende diese Transaktion aber noch nicht.

  2. Eine neue time-locked Transaktion Tx3 erzeugen, die alle deine Outputs so ausgibt, als wäre Tx2 confirmed. Tx3 ist für ein weiteres Jahr gesperrt. + Gib die Transaktion deiner Tochter.

  3. Broadcaste Tx2. Wenn Tx2 bestätigt ist, wird Tx1 für immer ungültig, weil einer der Inputs von Tx1 durch Tx2 ausgegeben wird.

Beachte, wie die Reihenfolge der Ereignisse hier wichtig ist. Wenn Tx2 gesendet wird bevor du Tx3 deiner Tochter gibst, könnte es sein dass du stirbst, bevor du ihr Tx3 geben kannst. Dann kann deine Tochter das Geld nicht bekommen, weil sie keine gültige Transaktion hat, mit der sie das Geld einfordern kann. Tx1 wurde durch Tx2 in der Blockchain ungültig gemacht, und Tx3 ist noch nicht im Besitz deiner Tochter.

9.1.1. Zeitmessungen

Du kannst die Verschlusszeit auf zwei Weisen angeben. Erstens durch Setzen von Datum und Zeit wie im vorangegangenen Beispiel. Zweitens durch Setzen einer Blockhöhe oder Block Height.

Blockzeit

Das erste Beispiel drückte die Lock Time als Datum und Zeit aus. Das bedeutet, die Median Time Past musste grösser sein als die Lock Time in der Transaktion. In [ch07] habe ich angemerkt, dass der Timestamp eines Blocks grösser sein muss als der Median der letzten 11 Block Timestamps, die Median Time Past des Blocks. Wir verwenden Median Time Past, um zu entscheiden, ob eine Transaktion bezüglich der Lock Time gültig ist. Angenommen, du stirbst am 24. Januar 2019. Deine trauernde Tochter wäre bis zum 30. April 2019 nicht in der Lage, dein Geld zu beanspruchen. Abbildung 3 illustriert dies deutlicher.

09 03
Abbildung 3. Deine Tochter kann dein Geld beanspruchen, nachdem die Median Time Past vor deiner Lock Time liegt.

Die Transaktion deiner Tochter kann in keinem Block vor dem letzten gezeigten bestätigt werden. Vor diesem Block ist die Median Time Past zu früh.

Ihre Transaktion würde sich nicht einmal durch das Bitcoin Netzwerk verbreiten, bis das Time Lock abgelaufen ist. Die Nodes wollen keine zeitgebundenen Transaktionen im Speicher halten, weil es bessere Anwendungen für ihren kostbaren Speicher gibt, als ihn mit Transaktionen zu füllen, die (noch) nicht einmal gültig sind. Es liegt an deiner Tochter, die Transaktion zu senden, nachdem die Lock Time vergangen ist.

Block Height

Man kann Zeit auch als Block Height ausdrücken. Man kann zum Beispiel sagen, dass eine Transaktion nicht gültig ist bis nach Block Height 571019. Das bedeutet, die Transaktion in Abbildung 4 kann nicht bestätigt werden, bis Block 571019 erzeugt worden ist.

09 04
Abbildung 4. Eine time-locked Transaktion basierend auf Block Height. Die Transaktion wird erst gültig bei Block Height 571020.

Der früheste Block, in den die Transaktion eingebunden werden kann, ist auf Höhe 571020. Es ist schwer vorauszusagen, wann dieser Block genau produziert werden wird, aber dank der Difficulty Adjustments, welche die durchschnittliche Blockzeit auf rund 10 Minuten einregeln, kann man etwa 52.596 Blocks pro Jahr erwarten.

9.1.2. Relative Time Locks

BIP68

Dieser Bitcoin Verbesserungsvorschlag (Bitcoin Improvement Proposal, BIP) beschreibt, wie ein Input einen bestimmten Abstand in Form von Zeit oder Blocks vom ausgegebenen Transaktions Output angeben kann. Er gilt für Transaktionen mit einer Versionsnummer von mindestens 2.

Das frühere Beispiel zeigte einen Anwendungsfall von absoluten Time Locks auf Transaktionen. Man kann den Input einer Transaktion aber auch so lange blockieren, bis sein ausgegebener Output alt genug ist. Das wird als relativer Time Lock bezeichnet. Das geschieht auf Basis der einzelnen Inputs (Abbildung 5).

09 05
Abbildung 5. Relative Time Locks können entweder als Anzahl Blocks oder als Anzahl Zeiteinheiten angegeben werden. Dafür wird die Sequenznummer der Inputs benutzt.

Die Folgenummer des ersten Inputs der Transaktion lautet 004013c6. Das bedeutet, dass der Input erst 30 Tage nach Bestätigung des ausgegebenen Outputs gültig wird (Abbildung 6).

09 06
Abbildung 6. Der erste Input blockiert die Transaktion bis 30 Tage nach Bestätigung des ausgegebenen Outputs.

Das am weitesten links stehende Bit der Folgenummer ist 0, was bedeutet, dass hier relative Time Locks benutzt werden. Das Bit an Position 9 von links ist 1, was bedeutet, dass die rechten 16 Bits interpretiert werden sollten als “Anzahl Intervalle zu je 512-Sekunden.” Die 16 rechten Bits sind 13c6, was in dezimaler Form 5.062 lautet; 5.062 Intervalle zu je 512 Sekunden entspricht rund 30 Tagen.

Der zweite Input hat eine Sequenznummer von 000003e8 (Abbildung 7). Das bedeutet, die Transaktion ist solange ungültig, bis 1.000 Blocks produziert wurden, nachdem der ausgegebene Output bestätigt wurde.

09 07
Abbildung 7. Der zweite Input blockiert die Transaktion für 1.000 Blocks ab dem ausgegebenen Output.

Das ganz links stehende Bit ist auch hier 0, was bedeutet, dass relative Time Locks für diesen Input eingeschaltet sind. Das Bit an Stelle 9 von links ist 0, was bedeutet, die 16 Bits ganz rechts sollen als Blocknummer interpretiert werden. Der Hex Code 03e8 entspricht 1.000 im Dezimalsystem.

Die Transaktionsversion muss mindestens 2 sein, damit relative Time Locks funktionieren. Wenn die Version 1 ist, haben die Folgenummern keine Wirkung auf die relative Lock Time, aber sie beeinflussen die absolute Lock Time und das Replace-by-Fee Feature, die wir beide später in Abschnitt 9.4 besprechen.

9.2. Zeitverriegelte Outputs

Zeitschlösser oder Time Locks sind an und für sich nicht sonderlich nützlich. Das einzige, was man mit ihnen machen kann ist, Transaktionen zu erzeugen, die irgendwann gültig werden.

Es ist wohl nützlicher, so etwas zu sagen wie: “Das Geld in diesem Output kann erst nach Neujahr ausgegeben werden.” Das wäre ein Beispiel für einen zeitverriegelten Output, oder time-locked Output. Ein Output kann absolut oder relativ verriegelt werden, und die Schlösser können zeitbasiert oder blockhöhenbasiert sein.

9.2.1. Absolutzeit-verriegelte Outputs

BIP65

Dieser BIP beschreibt detailliert den Script Operator OP_CHECKLOCK- TIMEVERIFY, der den Absolutzeit-verriegelten Output implementiert.

Angenommen, du willst deiner Tochter 1 BTC Taschengeld zum 1. Mai geben. Dann kannst du dafür eine Transaktion erzeugen wie in Abbildung 8 dargestellt.

09 08
Abbildung 8. Taschengeld an die Tochter zahlen. Sie kann es nicht vor dem 1. Mai ausgeben.
“OP_DROP?”

Die Benutzung von OP_CHECKLOCKTIME VERIFY verlangt ein anschliessendes OP_DROP aufgrund der Art, wie der Operator in Bitcoin umgesetzt wurde. Du lernst darüber mehr in [ch10]. Ignoriere es im Moment noch.

Du kannst diese Transaktion sofort an das Bitcoin Netzwerk senden, und sie bestätigen oder minen lassen. Der erste Output ist der interessante Teil. In ihm steht, dass der Output nicht vor dem 1. Mai ausgegeben werden kann. Für die Neugierigen lautet das genaue Pubkey Script

<may 1 2019 00:00:00> OP_CHECKLOCKTIMEVERIFY OP_DROP
OP_DUP OP_HASH160 <PKHD> OP_EQUALVERIFY OP_CHECKSIG

Dieses Script garantiert, dass die Transaktion, die den Output ausgibt, zeitgebunden ist, wie Abbildung 9 zeigt.

09 09
Abbildung 9. Verschiedene ausgebende Transaktionen und ihre Gültigkeit.

Die ersten beiden Transaktionen werden nie gültig, weil deren Zeitschlösser nicht spät genug sind. Die erste ist gar nicht verriegelt, was laut Pubkey Script ungültig ist. Die zweite ist zwar wenigstens zeitverriegelt, aber nicht spät genug–1 Sekunde vor dem 1. Mai ist zu früh.

Die dritte Transaktion ist OK, weil das Zeitschloss mindestens so spät ist wie die Zeit im Pubkey Script, nämlich 2019-05-01 00:00:00. Diese Transaktion wird ab dem 1. Mai gültig sein. Die letzte Transaktion wird an Sylvester direkt vor dem Feuerwerk gültig. Beachte aber, dass die letzten Transaktionen nicht beide bestätigt werden können–man kann höchstens eine davon bestätigen lassen–da sie beide denselben Output ausgeben.

Das Ergebnis des Beispiels ist, dass deine Tochter den Output ab dem 1. Mai nach Belieben ausgeben kann.

9.2.2. Relativzeit-verriegelte Outputs

BIP112

Dieser BIP beschreibt Relativzeit-verriegelte Outputs. Der Script Operator heisst OP_CHECKSEQUENCEVERIFY.

Ein Relativzeit-verriegelter Output funktioniert ähnlich wie ein Absolutzeit-verriegelter Output, aber relative Locks fordern, dass eine gewisse Menge Zeit zwischen dem Block mit dem auszugebenden Output und dem Block mit der ausgebenden Transaktion vergangen ist (Abbildung 10).

09 10
Abbildung 10. Das Ausgeben eines Relativzeit-verriegelten Outputs wird nach Ablauf einer gewissen Anzahl Blocks erlaubt.

Relative Zeitschlösser werden am häufigsten in Digitalen Verträgen verwendet. Ein digitaler Vertrag kann als herkömmlicher Vertrag angesehen werden, der aber mit Hilfe der Regeln des Bitcoin Netzwerks durchgesetzt wird und nicht durch nationale Gesetze. Verträge werden als Bitcoin Pubkey Scripts ausgedrückt. Wir verdeutlichen die Verwendung von zeitverriegelten Outputs bei einem atomaren Tauschgeschäft, einem atomic Swap, im nächsten Abschnitt. Ein atomic Swap bedeutet, zwei Leute tauschen Coins miteinander über verschiedene Kryptowährungen hinweg aus.

9.2.3. Atomare Tauschgeschäfte / Atomic Swaps

Atomar

In der Informatik wird das Wort atomar für Vorgänge benutzt, die entweder vollständig oder gar nicht ablaufen. Bei atomaren Tauschgeschäften bedeutet das, entweder der Tausch läuft vollständig durch, oder beide Seiten behalten ihre alten Coins. Andere Ergebnisse sind ausgeschlossen.

Ein häufig erwähnter digitaler Vertrag ist der atomic Swap, bei dem zwei Parteien Coins über Blockchains hinweg miteinander tauschen wollen.

Angenommen, John chattet mit Fadime auf einem öffentlichen Forum im Internet. Sie kennen einander nicht und haben keine gemeinsame Vertrauensbasis. Aber sie wollen miteinander handeln.

Sie einigen sich darauf, dass John 2 BTC gegen 100 von Fadimes namecoins (NMC) eintauscht. Namecoin ist eine Alt-Coin, die als dezentralisiertes Namenssystem, ähnlich DNS, benutzt wird. Wir haben Alt-Coins schon kurz in [ch01] besprochen. Es ist jetzt nicht wichtig zu wissen, wofür Namecoin eigentlich benutzt wird; wir belassen es dabei, dass es eine andere Kryptowährung auf einer anderen Blockchain als der von Bitcoin ist.

Die Unterhaltung zwischen John und Fadime fängt etwa so an:

John: Möchtest du 100 NMC gegen meine 2 BTC eintauschen? Mein Namecoin public Key ist 02381efd…88ca7f23. Ich habe eine geheime Zufallszahl erzeugt, die den SHA256 Hashwert H hat. Ich sage dir aber die Geheimzahl noch nicht.

Fadime: Klar John, machen wir! Mein Bitcoin public Key ist 02b0c907…df854ee8.

u09 01

Wir nennen die Geheimzahl S. Nur John kennt momentan S, aber er gibt den Hash von S–das ist H–an Fadime weiter. Jetzt haben beide genug Information, um loszulegen.

Sie erzeugen jeder eine Transaktion (Abbildung 11). John erzeugt eine Bitcoin Transaktion, die 2 BTC ausgibt. Fadime erzeugt eine Namecoin Transaktion, die 100 NMC ausgibt. Sie übermitteln ihre Transaktionen noch nicht.

09 11
Abbildung 11. John und Fadime erzeugen jeweils eine Transaktion. Das Redeem Script des p2sh Outputs enthält die Vertragsdetails.

Der Output von Johns Vertragstransaktion kann in einer von zwei Weisen ausgegeben werden:

  • Indem das Pre-Image von H und Fadimes Signatur mitgeliefert wird. John kennt dieses Pre-Image–die geheime Zahl S aus der vorhin beschriebenen Unterhaltung–aber Fadime kennt diese Zahl S nicht.

  • Mit Johns Signatur nach 48 Stunden.

Ebenso kann der Output von Fadimes Transaktion auf zwei Arten ausgegeben werden:

  • Durch Angabe des Pre-Images von H und Johns Signatur.

  • Mit Fadimes Signatur nach 24 Stunden.

Die relative Lock Time wird durch den Script Operator OP_CHECKSEQUENCEVERIFY erzwungen. Der Operator stellt sicher, dass der Output von Johns Transaktion durch John nicht ausgegeben werden kann, bevor 48 Stunden nach Bestätigung der Vertragstransaktion vergangen sind. In Fadimes Vertragstransaktion garantiert der Operator, dass Fadime den Output nicht ausgibt, bevor 24 Stunden abgelaufen sind.

Fadime weiss, dass John die Geheimzahl kennt. Wenn Fadime jetzt ihre Vertragstransaktion übermittelt, kann John das Geld nehmen und seinen Teil des Vertrags unerfüllt lassen. Deshalb sendet sie ihre Transaktion nicht, bis sie gesehen hat, dass Johns Transaktion sicher in der Blockchain bestätigt wurde. Weil Fadime die Geheimzahl S nicht kennt, kann John seine Vertragstransaktion beruhigt übermitteln, ohne dass Fadime sich das Geld schnappen kann.

u09 02

John übermittelt seine Vertragstransaktion. Denke daran, dass der Output der Vertragstransaktion in diesem Beispiel ein pay-to-script-hash (p2sh) Output ist. Der Output enthält eine p2sh Adresse, die nichts darüber sagt, dass dies Johns Vertragsoutput ist. Damit Fadime Johns Vertragstransaktion auf der Bitcoin Blockchain findet, wird sie dasselbe Redeem Script bauen, das John für seine Vertragstransaktion generiert hat, und erzeugt die p2sh Adresse, an die Johns Vertragstransaktion gezahlt hat. Sie kann dann in der Bitcoin Blockchain nach der p2sh Adresse schauen.

Wenn Fadime sieht, dass Johns Transaktion bestätigt wurde, übermittelt sie ihre eigene Transaktion. John wartet, bis Fadimes Transaktion hinreichend tief in der Namecoin bestätigt wurde. Dann geschieht der eigentliche Tausch in zwei Schritten. Abbildung 12 zeigt den ersten Schritt.

09 12
Abbildung 12. Der erste Schritt des eigentlichen Tauschgeschäfts. John holt sich Fadimes 100 NMC, indem er das Geheimnis S preisgibt.

John übermittelt seine Swap Transaktion. Johns Swap Transaktion gibt Fadimes Vertragstransaktions Output aus, indem es das Geheimnis S und seine Signatur liefert. Beachte wieder, dass John einen p2sh Output ausgibt. Das bedeutet, dass während der Script-Validierung als erstes das Redeem Script, das John im Signatur Script geliefert hat, gehasht und mit dem Hash im Pubkey Script verglichen wird. Danach läuft das eigentliche Redeem Script.

Wir gehen das Programm nicht detailliert durch. Aber wenn das Redeem Script zu laufen anfängt, liegt oben auf dem Stack eine 1. Das bedeutet true in Namecoin ebenso wie in Bitcoin. Dieser Wert führt dazu, dass das Programm den Teil des Scripts laufen lässt, der das Pre-Image und Johns Signatur benötigt. Der andere Teil läuft überhaupt nicht ab.

Das Script hinterlässt true auf dem Stack, weil John beide benötigten Objekte in der richtigen Reihenfolge geliefert hat–seine Signatur und das Pre-Image S. Er holt sich erfolgreich die 100 NMC.

Sobald Fadime Johns Swap Transaktion auf dem Namecoin Netzwerk sieht, kann sie ihre eigene Swap Transaktion für das Bitcoin Netzwerk erzeugen (Abbildung 13).

09 13
Abbildung 13. Fadime komplettiert den Atomic Swap, indem sie ihre Swap Transaktion an das Bitcoin Netzwerk sendet.

Sie nimmt das Pre-Image, S, aus Johns Swap Transaktion, und tut es in ihre eigene Swap Transaktion, die 2 BTC an Fadimes public Key Hash PKHF zahlt. Mit Bestätigung der beiden Swap Transaktionen ist der Atomic Swap erledigt. Der Effekt all dessen ist, dass John 2 BTC an Fadime unter der Bedingung geschickt hat, dass Fadime ihm 100 NMC schickt, und dass Fadime 100 NMC an John schickt, sofern er + 2 BTC an sie schickt.

Atomic Swap Fehlschlag

Die Abfolge von Ereignissen in diesem Atomic Swap Beispiel illustriert einen Fall, in dem beide Seiten, John und Fadime, sich an die Regeln halten. Niemand musste auf die time-locked Zweige der Vertragstransaktions-Outputs zurückgreifen. Dieser Abschnitt bespricht einige der Arten, auf die der Swap vielleicht schiefgehen könnte:

Fadime übermittelt ihre Vertragstransaktion nicht.

Das bedeutet, John kann den Output von Fadimes Vertragstransaktion nicht ausgeben, was wiederum bedeutet, dass Fadime S nie zu Gesicht bekommt. Ohne S kann sie Johns Vertragsoutput nicht ausgeben. Das einzige mögliche Ergebnis ist, dass John 48 Stunden warten muss, damit das relative Time Lock ausläuft, und er dann sein Geld wiederholen kann.

John gibt Fadimes Vertragsoutput 24 Stunden lang nicht aus.

Fadime kann ihre Coins zurückholen und John muss noch weitere 24 Stunden warten, bis er seine Coins auch wiederbekommt.

John gibt Fadimes Coinbase Output aus, kurz nach Ablauf der 24 Stunden aber bevor Fadime ihre Coins zurückholt.

Glücklicherweise hat Johns Vertragsoutput eine 48 Stunden relative Lock Time, im Gegensatz zu den 24 Stunden in Fadimes Vertragsoutput, also kann John seine Coins erst zurückholen, nachdem er weitere 24 Stunden abgewartet hat. Während dieser Zeit kann Fadime ihre BTC aus Johns Vertragsoutput holen, indem sie S und ihre Signatur liefert.

Fadime wird kurz nach Übermittlung ihres Vertragsoutputs vom Bus überfahren.

Das ist nicht gut. John kann sich die NMC aus Fadimes Vertragsoutput holen und nach 48 Stunden Wartezeit auch seine BTC zurückholen. Hier hat Fadime verloren.

Im letzten Fall könnten wir argumentieren, dass der Swap nicht atomar ablief. Schliesslich ist er nicht durchgegangen und John hat am Ende alle Coins bekommen. Das ist eine etwas philosophische Frage. Aber wir können Swaps als atomar bezeichnen unter der Bedingung, dass Fadime agieren kann. Wir haben diese Bedingung aber nicht für John. Es hängt davon ab, wer das Geheimnis S erzeugt.

9.3. Speichern von Zeug in der Bitcoin Blockchain

In der Anfangszeit von Bitcoin wurde klar, dass Leute Zeug in Transaktionen auf der Bitcoin Blockchain speichern wollten, das nichts mit Bitcoin zu tun hatte: zum Beispiel Listing 1, was eine Blockchain Ehrung des Kryptografen Sassama darstellt, die angeblich von Dan Kaminsky gepostet wurde (die Nachricht wurde in drei Kolumnen umgebrochen, um Platz zu sparen.)

Listing 1. Eine Ehrung in einer Transaktion
---BEGIN TRIBUTE---     LEN "rabbi" SASSAMA     P.S.  My apologies,
#./BitLen                    1980-2011          BitCoin people.  He
:::::::::::::::::::     Len was our friend.     also would have
:::::::.::.::.:.:::     A brilliant mind,       LOL'd at BitCoin's
:.: :.' ' ' ' ' : :     a kind soul, and        new dependency upon
:.:'' ,,xiW,"4x, ''     a devious schemer;         ASCII BERNANKE
:  ,dWWWXXXXi,4WX,      husband to Meredith     :'::.:::::.:::.::.:
' dWWWXXX7"     `X,     brother to Calvin,      : :.: ' ' ' ' : :':
 lWWWXX7   __   _ X     son to Jim and          :.:     _.__    '.:
:WWWXX7 ,xXX7' "^^X     Dana Hartshorn,         :   _,^"   "^x,   :
lWWWX7, _.+,, _.+.,     coauthor and            '  x7'        `4,
:WWW7,. `^"-" ,^-'      cofounder and            XX7            4XX
 WW",X:        X,       Shmoo and so much        XX              XX
 "7^^Xl.    _(_x7'      more.  We dedicate       Xl ,xxx,   ,xxx,XX
 l ( :X:       __ _     this silly hack to      ( ' _,+o, | ,o+,"
 `. " XX  ,xxWWWWX7     Len, who would have      4   "-^' X "^-'" 7
  )X- "" 4X" .___.      found it absolutely      l,     ( ))     ,X
,W X     :Xi  _,,_      hilarious.               :Xx,_ ,xXXXxx,_,XX
WW X      4XiyXWWXd     --Dan Kaminsky,           4XXiX'-___-`XXXX'
"" ,,      4XWWWWXX     Travis Goodspeed           4XXi,_   _iXX7'
, R7X,       "^447^                               , `4XXXXXXXXX^ _,
R, "4RXk,      _, ,                               Xx,  ""^^^XX7,xX
TWk  "4RXXi,   X',x                             W,"4WWx,_ _,XxWWX7'
lTWk,  "4RRR7' 4 XH                             Xwi, "4WW7""4WW7',W
:lWWWk,  ^"     `4                              TXXWw, ^7 Xk 47 ,WH
::TTXWWi,_  Xll :..                             :TXXXWw,_ "), ,wWT:
=-=-=-=-=-=-=-=-=-=                             ::TTXXWWW lXl WWT:
                                                ----END TRIBUTE----

Obwohl dies sicher interessant und originell war, hatte es ein paar Implikationen für Bitcoins Full Nodes.

Die Nachricht in Listing 1 wurde in der Blockchain verewigt mit einer einzigen Transaktion mit der txid

930a2114cdaa86e1fac46d15c74e81c09eee1d4150ff9d48e76cb0697d8e1d72
Blockchain Explorer

Du kannst dir die Transaktion mit Hilfe eines Blockchain Explorers anscheuen, zum Beispiel dem hier [web-bernanke-ascii-art].

Der Autor hat eine Transaktion mit 78 Outputs erzeugt, eine pro 20-Zeichen Zeile in der Nachricht. Jede Zeile endet mit einem Leerzeichen, sodass nur 19 Zeichen sichtbar sind.

Das Pubkey Script des letzten Outputs sieht zum Beispiel so aus:

OP_DUP OP_HASH160 2d2d2d2d454e4420545249425554452d2d2d2d20 OP_EQUALVERIFY OP_CHECKSIG

Der interessante Teil ist der PKH. Dies ist kein eigentlicher PKH, sondern ein erfundener. Vielleicht kannst du das Muster erkennen, wenn du ihn mit der Zeile “----END TRIBUTE---- ” vergleichst:

2d 2d 2d 2d 45 4e 44 20 54 52 49 42 55 54 45 2d 2d 2d 2d 20
-  -  -  -  E  N  D     T  R  I  B  U  T  E  -  -  -  -

Dieser “public Key Hash” kodiert eine 20-Zeichen Zeile in der Nachricht. Er benutzt die ASCII Tabelle, um Zeichen zu kodieren. Zum Beispiel wird das Zeichen - als Byte 2d kodiert. Die Zeichen A-Z werden durch die Bytes 41-5a kodiert, und die Leerstelle als das Byte 20.

Schauen wir uns die PKHs der letzten 10 Zeilen der Nachricht an, zusammen mit dem ASCII-kodierten Text:

20203458586958272d5f5f5f2d60585858582720   4XXiX'-___-`XXXX'
202020345858692c5f2020205f69585837272020    4XXi,_   _iXX7'
20202c2060345858585858585858585e205f2c20   , `4XXXXXXXXX^ _,
202058782c202022225e5e5e5858372c78582020   Xx,  ""^^^XX7,xX
572c22345757782c5f205f2c5878575758372720 W,"4WWx,_ _,XxWWX7'
5877692c202234575737222234575737272c5720 Xwi, "4WW7""4WW7',W
54585857772c205e3720586b203437202c574820 TXXWw, ^7 Xk 47 ,WH
3a5458585857772c5f2022292c202c7757543a20 :TXXXWw,_ "), ,wWT:
3a3a54545858575757206c586c205757543a2020 ::TTXXWWW lXl WWT:
2d2d2d2d454e4420545249425554452d2d2d2d20 ----END TRIBUTE----

9.3.1. Aufgeblähtes UTXO Set

u09 03

Weil die PKHs erfunden sind, haben sie keine bekannten Pre-Images. Das bedeutet auch, dass keine bekannten public/private Key Paare mit ihnen assoziiert sind, sodass niemand jemals diese Outputs wird ausgeben können. Sie sind nicht verwendbar, oder unspendable. Die Bitcoin Adresse des letzten PKHs ist 157sXYpj…QnHB6FGU. Jeder, der Geld an diese Adresse zahlt, wirft dieses Geld in den Mülleimer. Das Geld ist für immer verloren. Es entspricht dem Verbrennen eines Dollarscheins.

Unspendable Outputs wie diese sind von normalen, verwendbaren Outputs nicht zu unterscheiden. Man kann nicht beweisen, dass sie unspendable sind. Full Nodes müssen sie als verwendbar betrachten, was bedeutet, sie müssen auf ewig diese unspendable Outputs in ihrem Unausgegebenen Transaktions Output (UTXO) Set halten. Das belastet die Nodes unnötig, weil sie all diese Outputs im Speicher halten müssen.

Bitcoin Entwickler haben eine partielle Lösung für dieses Problem entwickelt- Statt Geld an nicht beweisbar unspendable Outputs zu schicken, können Benutzer beweisbar unspendable Outputs erzeugen. Wenn ein Full Node feststellen kann, ob ein Output unspendable ist + dann muss er diesen nicht zum UTXO Set hinzufügen.

Die teilweise Lösung involviert einen neuen Script Operator namens OP_RETURN. Dieser Operator bricht die Ausführung des Scripts sofort ab. Ein typisches OP_RETURN Script kann zum Beispiel so aussehen:

OP_RETURN "Ich begreife Bitcoin"

Wenn jemand versucht, diesen Output auszugeben, wird das Script abbrechen, sobald es auf den OP_RETURN Operator trifft. Wenn das Pubkey Script diesen Operator enthält, kann ein Full Node feststellen, dass der Output nicht verwendbar ist und ihn ignorieren, um zu verhindern, dass das UTXO Set für immer von diesem Unsinn aufgebläht wird. Ein typischer OP_RETURN Outpus zahlt 0 BTC, aber er kann auch einen Wert grösser als 0 BTC zahlen, um Geld zu “verbrennen.”

Es gibt ein paar Policies hinsichtlich OP_RETURN:

  • Das gesamte Pubkey Script darf nicht grösser als 83 Bytes sein.

  • Es ist nur ein OP_RETURN Output pro Transaktion erlaubt.

Diese beiden Policies sind genau das–Policies, also Grundsätze. Full Nodes, die sich an diese Policies halten, relayen keine Transaktionen, die die Policies verletzen. Aber wenn sie einem Block begegnen, der Transaktionen enthält, die die Policies verletzen, dann wird der Block akzeptiert und weitergeleitet. Ich spreche mehr über Policies und Konsensregeln, strenge Regeln, die für Blocks gelten, in [ch10] und [ch11].

9.3.2. Erzeugung eines Tokens in Bitcoin

Ich bin in [ch01] kurz auf das Protokollieren von Eigentumsrechten auf der Blockchain eingegangen. Angenommen ein Autohersteller, nennen wir ihn mal Ampere, beschliesst, dass er die Eigentumsrechte an seinen Autos auf digitalem Wege auf der Bitcoin Blockchain verfolgen will. Dies kann durch Erzeugung eines Tokens in Bitcoin erreicht werden.

Angenommen Ampere möchte für ein neu hergestelltes Auto mit der Fahrgestellnummer 123456 ein Token erzeugen. Es übermittelt dazu eine Bitcoin Transaktion wie in Abbildung 14 gezeigt.

09 14
Abbildung 14. Ampere erzeugt ein neuen Token für ein neu gebautes Auto. Ampere gibt das Token an sich selbst heraus, weil die Firma das Auto immer noch besitzt.

Das “Ampere Token Protokoll” spezifiziert, dass ein neues Token generiert wird, wenn

  • Ampere eine Coin von PKH~ A~ ausgibt.

  • Die Transaktion einen OP_RETURN Output mit dem Text "ampere <chassis number>" enthält.

  • Der erste Output ist der initiale Tokenbesitzer.

Ampere hat eine wohlbekannte Webseite auf https://www.ampere.example.com, wo es seinen public Key, der mit PKHA korrespondiert, veröffentlicht hat. Die Firma verbreitet ausserdem den public Key durch Werbung und über Facebook und Twitter. Es tut all dies, damit Leute sicherstellen können, dass PKHA tatsächlich Ampere gehört.

Angenommen Ampere verkauft dieses Auto an einen Händler. Der Händler hat einen public Key Hash, PKHD. Abbildung 15 zeigt, wie Ampere das digitale Eigentum an den Händler übergibt.

09 15
Abbildung 15. Ampere verkauft das Auto an der Händler mit dem public Key Hash PKHD.

Gemäss unserem einfachen Protokoll wird das Eigentum am Auto übertragen, indem der Output des alten Besitzers ausgegeben wird. Hierbei gelten folgende Regeln:

  • Die ausgebende Transaktion gibt den Output des vorigen Besitzers aus.

  • Der erste Output der ausgebenden Transaktion ist der neue Besitzer der Autos.

Der Autohändler ist nun der neue Besitzer, weil PKHD der erste Output der ausgebenden Transaktion ist. Das ist alles. Wenn der Händler das Auto an eine Kundin verkauft, Fadime, überträgt er die Eigentumsrechte auf Fadimes Adresse PKHF (Abbildung 16).

09 16
Abbildung 16. Der Autohändler überträgt die Eigentumsrechte an dem Auto an Fadimes PKHF.

9.3.3. Anlassen des Autos mit Proof of Ownership

Nun, da Fadime die rechtmässige Besitzerin des Autos ist, wäre es da nicht toll, wenn sie es anlassen könnte, indem sie beweist, dass sie die Eigentümerin ist? Das kann sie. Der Wagen ist mit einem Zündschloss versehen, das den Motor startet, wenn Fadime den Beweis des Eigentums, den Proof of Ownership, an das Auto schickt (Abbildung 17).

09 17
Abbildung 17. Fadime startet ihr Auto, indem sie eine Aufforderung des Autos, oder Challenge, signiert.

Fadime bittet zunächst den Wagen, zu starten. Das Auto startet aber nicht, wenn es nicht weiss, dass Fadime den private Key hat, der zu PKHF gehört. Daher erzeugt das Auto eine sehr grosse Zufallszahl und schickt sie an Fadime, welche diese Zufallszahl mit ihrem private Key signiert und die Signatur und ihren public Key an das Auto zurückschickt. Man nennt diese Zufallszahl eine Challenge.

Das Auto benötigt den public Key, um zu prüfen, dass er mit dem in der Blockchain gespeicherten PKHF korrespondiert. Das Fahrzeug bleibt über die Eigentumsrechte an ihm im Bilde, indem es ein Lightweight Wallet beherbergt, welches das Ampere Token Protokoll versteht.

Wenn der Wagen überprüft hat, dass die Signatur gültig ist und vom korrekten private Key stammt, startet es die Maschine.

9.4. Ersetzen ausstehender Transaktionen

Wenn du eine Bitcoin Transaktion schickst, um ein Buch online zu kaufen, wartet der Buchladen, bis die Transaktion bestätigt wurde, bevor er dir das Buch schickt. Normalerweise wird deine Transaktion innerhalb von einer Stunde oder so bestätigt. Aber was, wenn nicht? Was, wenn kein Miner jemals deine Transaktion in einen Block hineinnehmen will? Das kann sicherlich passieren, wenn die Transaktionsgebühr zu gering ist (Abbildung 18).

09 18
Abbildung 18. Du bezahlst ein Buch und setzt die Transaction Fee auf 0,00001 BTC.

Du erinnerst sich vielleicht aus [transaction-fees], dass die Transaction Fee der Summe der Input Werte minus der Summe der Output Werte entspricht. Die Fee pro Byte, die die Miner interessiert, wird durch Division dieser Fee durch die Transaktionsgrösse berechnet–in diesem Fall sind das 1.000 satoshi geteilt duch 226 Bytes, was etwa 4,4 sat/Byte entspricht.

Wenn kein Miner bereit ist, die Transaktion für diese Gebühr zu minen, bleibt deine Transaktion beim Warten auf die Bestätigung stecken. Wird die Transaktion nicht bestätigt, bekommst du dein Buch nicht. Du würdest jetzt wahrscheinlich gerne Abhilfe schaffen. Vielleicht kannst du eine neue, ähnliche Transaktion erzeugen, die aber eine höhere Gebühr zahlt. Probieren wir es (Abbildung 19).

09 19
Abbildung 19. Du versuchst deine alte, festgefahrene Transaktion durch eine neue mit einer höheren Gebühr zu ersetzen.

Das ist schick: du hast eine neue Transaktion erzeugt und signiert, die eine 20 mal höhere Fee zahlt. Die wird ganz sicher bestätigt, denkst du, und übermittelst die Transaktion.

Das Problem ist, dass deine neue Transaktion wahrscheinlich von den meisten Nodes als Double-Spend Versuch gewertet und fallengelassen wird. Die werden denken, dass die erste Transaktion diejenige ist, die zählt, und sie werden alle weiteren Transaktionen ignorieren, die denselben Output ausgeben. Wie sie mit der zweiten Transaktion umgehen, ist völlig den Nodes überlassen, aber die verbreitetste Policy besteht darin, die Transaktion zu verwerfen. Das ist das, was Bitcoin Core tut, und das ist die am weitesten verbreitete Bitcoin Software. Diese Policy heisst zuerst-gesehen-Policy, oder first-seen policy.

Hinweis zu den Übungen

Behalte dies im Hinterkopf für Exercise 11.

Du könntest es schaffen, diese Policy zu umschiffen, indem du die zweite Transaktion direkt an einen oder mehrere Miner schickst. Miner haben andere Anreize als Full Nodes. Minende Full Nodes wollen Block Rewards verdienen, wogegen nicht minende Full Nodes ihren Verbrauch an Speicher- und Verarbeitungsressourcen niedrig halten wollen. Würde sich ein Miner die zweite, hoch bezahlte Transaktion schnappen, würde er sie höchstwahrscheinlich in seinen Block tun, obwohl die wenig zahlende Transaktion die zuerst gesehene war. Transaktionen auf solche Weise zu ersetzen ist impraktikabel, weil du die Adressen von Minern nicht kennst, solange sie nicht irgendwo veröffentlicht worden sind. Ausserdem gibst du den Minern gegenüber deine IP Adresse preis, und damit werden die Miner zum Ziel für diverse Überwachungsorganisationen oder Firmen, die Informationen über dich zu Geld machen wollen.

9.4.1. Optionaler Gebührenersatz / Replace-by-Fee

BIP125

Dieser BIP beschreibt, wie Transaktionen sich selbst für ersetzbar erklären können.

Im Jahre 2016 wurde eine Policy für das Ersetzen von Transaktionen ausgerollt. Sie wird im Allgemeinen als opt-in replace-by-fee, oder opt-in RBF bezeichnet (Abbildung 20). Sie funktioniert durch Verwendung der Sequenznummern in den Transaktionsinputs.

09 20
Abbildung 20. Benutze Opt-In RBF, um eine Transaktion auf einfachem Wege zu ersetzen, bevor sie confirmed ist.

Wieder einmal angenommen, dass du ein Buch in einem Online Buchladen kaufen willst. Wenn du die Transaktion erzeugst, sorgst du dafür, dass einer der Inputs (in diesem Beispiel gibt es nur einen) eine Folgenummer kleiner als fffffffe besitzt. Dies signalisiert den Nodes, dass du diese Transaktion als ersetzbar markieren möchtest.

Wenn ein Node diese Transaktion empfängt, behandelt er sie wie eine normale Transaktion, aber er merkt sich die Ersetzbarkeit.

Wenn dir später klar wird, dass die Transaktion wegen zu geringer Gebühren nicht bestätigt wird, erzeugst eine neue Ersatztransaktion mit einer höheren Gebühr. Wenn du diese Ersatztransaktion sendest, werden die Nodes, die diese empfangen–sofern sie die opt-in RBF Policy umgesetzt haben–die alte Transaktion freundlicherweise durch die neue ersetzen und die neue an ihre Peers weiterleiten. Die alte Transaktion wird verworfen. Auf diesem Weg wird die Ersatztransaktion irgendwann bei allen Nodes ankommen und hoffentlich innerhalb einer vernünftigen Zeit bestätigt werden.

In diesem Beispiel setzt du die Folgenummer des Transaktionsinputs auf ffffffff. Das bedeutet, die Ersatztransaktion ist nicht selbst wieder ersetzbar. Wenn du die Ersatztransaktion wiederum ebenfalls ersetzbar haben willst, musst du ihre Folgenummer auf fffffffd oder weniger setzen, genau wie du es mit der ersetzten Transaktion getan hast.

Du magst dich vielleicht fragen, wo diese Folgenummern herkommen. Die Intention mit den Folgenummern oder Sequenznummern war von Anfang an, eine andere Art von Transaktionsersatz zu erlauben. Dieses Feature wurde in Bitcoin früh disabled, aber die Folgenummern in den Transaktionsinputs blieben. Diese Nummern wurden seitdem zur Benutzung für absolute und relative Lock Time und replace-by-fee umgewidmet, wie im Laufe dieses Kapitels besprochen. Wenn du jetzt verwirrt bist, mach dir keine Sorgen; Ich summiere die verschiedenen Anwendungen von Folgenummern in Abschnitt 9.6 auf.

9.4.2. Kind zahlt für Eltern, Child Pays for Parent

Es gibt noch eine Art, eine Gebühr nachträglich zu erhöhen. Angenommen du hast die in Abbildung 18 beschriebene Situation und merkst, dass die Transaktion steckenbleibt (Abbildung 21).

09 21
Abbildung 21. Du hast keine ausreichende Transaction Fee bezahlt. Die Transaktion ist im pending Zustand steckengeblieben, weil die Miner sie nicht in einen Block hineintun wollen.

Du kannst eine weitere Transaktion erstellen, die dein Wechselgeld, deine Change, ausgibt und eine extra hohe Gebühr zahlt, um die zu geringe Gebühr in der originalen Transaktion zu kompensieren (Abbildung 22).

09 22
Abbildung 22. Deine Change ausgeben und eine extra hohe Gebühr für die “Parent” Transaktion zahlen.

Angenommen, ein Miner sieht diese beiden Transaktionen. Wenn der Miner die Fee von der Child Transaktion einsammeln will, muss er sowohl Parent als auch Child Transaktion in seinen Block einbringen. Versucht er, nur die Child Transaktion einzubringen, wäre der Block ungültig, weil die Child Transaktion Geld ausgibt, das in der Blockchain nicht existiert.

Sowohl du als auch der Buchladen können diesen Trick anwenden. Wenn du die Gebühr nicht hochschraubst, kann der Buchladen seinen Output von 10 BTC ausgeben und sich selbst davon 9,9998 BTC schicken, was 0,0002 BTC zu der gesamten Gebühr der beiden Transaktionen hinzufügt.

9.5. Verschiedene Signaturtypen

Wenn du eine typische Bitcoin Transaktion signierst, signierst du die gesamte Transaktion bis auf das Signatur Script (Abbildung 23).

09 23
Abbildung 23. Normalerweise wird eine ganze Transaktion signiert. Alle Inputs und alle Outputs sind abgedeckt.

Diese Transaktion enthält zwei Inputs, und jeder Input signiert die komplette Transaktion. Eine Signatur bindet, oder committet, sich an alle Inputs und alle Outputs. Wenn irgendwelche Inputs oder Outputs sich ändern, wird die Signatur ungültig.

Du kannst dieses Signaturverhalten ändern, indem du einen Parameter in der Signatur namens SIGHASH Typ verwendest. Du kannst die Signatur auf drei Arten an die Outputs binden (ALL, SINGLE und NONE) und auf zwei Arten an die Inputs (ANYONECANPAY gesetzt oder nicht gesetzt). Jede beliebige Kombination eines Input SIGHASH Typs mit einem Output SIGHASH Typ ist verwendbar, was sechs verschiedene Kombinationen ergibt, wie Abbildung 24 zeigt.

09 24
Abbildung 24. Eine Signatur kann sich, je nach SIGHASH Typ, an verschiedene Teile der Transaktion binden. Die Signatur beinhaltet nicht die ausgegrauten Teile.

Für die Outputs kannst du dich an das folgende binden:

  • Alle Outputs (ALL)—Niemand darf irgendeinen Output ändern.

  • Ein einzelner Output an derselben Stelle wie der Input (SINGLE)—Dir geht es nur um einen bestimmten Output. Die anderen Outputs können sich ändern.

  • Keine Outputs (NONE)—Dir ist egal, wo das Geld hingeht. Jeder kann Outputs hinzufügen, ohne dass deine Signatur ungültig wird.

Für die Inputs kannst du dich wie folgt binden:

  • Alle Inputs (ANYONECANPAY ist nicht gesetzt)—Niemand kann irgendeinen Input verändern, ohne dass deine Signatur ungültig wird.

  • Nur der aktuelle Input (ANYONECANPAY ist gesetzt)—Andere Inputs können sich ändern, entfernt oder hinzugefügt werden. Dir ist egal, wer zahlt. Jeder darf zahlen.

Für die überwältigende Mehrheit der Signaturen wird ALL zusammen mit einem nicht gesetzten ANYONECANPAY benutzt, um sich an die gesamte Transaktion zu binden. Das entspricht dem, was du aus den früheren Kapiteln dieses Buches gewohnt bist. Andere Typen sind selten und werden in erster Linie für spezielle digitale Verträge verwendet.

9.6. Zusammenfassung

Dieses Kapitel war ein Potpourri von Dingen, die man mit Transaktionen anstellen kann.

Transaktionen und Transaktions Outputs können auf verschiedene Arten zeitgesperrt werden, um zu verhindern, dass Geld vor einem bestimmten Datum oder vor Ablauf einer bestimmten Zeitspanne ausgegeben wird, wie die folgende Tabelle zeigt.

Aktion Ergebnis

Setze die Lock Time einer Transaktion.

Die Transaktion wird erst bei einer bestimmten Block Height gültig.

Setze das relative Time Lock auf einem Input mittels der Folgenummer .

Die Transaktion wird erst nach Ablauf einer bestimmten Zeit oder Anzahl Blocks gültig.

Verwende OP_CHECKLOCKTIMEVERIFY in einem Pubkey Script.

Der Output kann erst ab einer bestimmten Zeit oder Block Height ausgegeben werden.

Verwende OP_CHECKSEQUENCEVERIFY in einem Pubkey Script.

Der Output kann erst nach Ablauf einer bestimmten Zeit oder Anzahl Blocks ausgegeben werden.

All diese Varianten können entweder in Form von Block Height oder Zeit angegeben werden. Time Locks sind am nützlichsten in digitalen Verträgen wie Atomic Swaps. Ein Atomic Swap erlaubt es Leuten, die sich gegenseitig nicht trauen, ohne vertrauenswürdige Drittpartei Coins miteinander zu tauschen.

u09 04

Die allgemeine Idee ist die, dass John das Geheimnis, S, preisgeben muss, um seine Coins zu bekommen. Fadime kann dann S benutzen, um den Anspruch auf ihre Coins geltend zu machen.

In OP_RETURN Outputs können beliebige Daten gespeichert werden, ohne die UTXO Sets der Nodes zu belasten. Das kann zur Erzeugung von Tokens benutzt werden. Zum Beispiel könnten die Eigentumsrechte an einem Auto auf der Bitcoin Blockchain geführt und verifiziert werden.

Manchmal kann eine Transaktion im Zustand pending steckenbleiben, weil kein Miner sie in einen Block hineinnehmen will. Das geschieht üblicherweise, weil du eine zu geringe Gebühr zahlst. Um dieser Situation vorzubeugen, kannst du die Transaktion als ersetzbar markieren, indem du die Sequenznummer von mindestens einem Input auf einen Wert kleiner als fffffffe setzt. Wenn diese Transaktion steckenbleibt, kannst du die Gebühr nachträglich dadurch erhöhen, dass du eine Ersatztransaktion sendest, die eine höhere Gebühr bezahlt.

Die Sequenznummern von Inputs werden für verschiedene Zwecke verwendet. Wir haben viele verschiedene Verwendungen für Sequenznummern in diesem Kapitel kennengelernt und es ist schwer, den Überblick zu behalten. Tabelle 1 fasst die Bedeutung der Werte verschiedener Sequenznummern zusammen.

Tabelle 1. Sequenznummern werden zum An- und Abschalten diverser Features benutzt. =angeschaltet, =abgeschaltet. *Tx Version 2 benötigt.
Sequenznummernwert Lock Time, jeder Input Replace-by-fee (BIP125), jeder Input Relative Lock Time auf Input (BIP68)*

00000000-7fffffff

80000000-fffffffd

fffffffe

ffffffff

9.7. Übungen

9.7.1. Wärm dich auf

  1. Was wird vom Input einer Transaktion verlangt, um absolute Lock Time anzuschalten?

  2. Angenommen, eine Transaktion ist absolut time-locked (absolute time lock) bis zum 25. Dezember 2019 00:00:00. Wie überprüft ein Miner, ob es OK ist, die Transaktion in einen Block einzubauen?

  3. Wo liegt die relative Lock Time in einem Input?

  4. Angenommen, Adam und Eva wollen über einen Atomic Swap Coins miteinander austauschen. Wie viele Transaktionen würden bis zum Abschluss auf jeder Blockchain erzeugt?

  5. Warum ist es schlecht für das UTXO Set, willkürliche Daten wie “HELLO WORLD” als gefälschte PKHs in Outputs zu speichern anstatt in OP_RETURN Outputs?

  6. Warum würdest du eine gesendete Transaktion ersetzen wollen, die noch nicht bestätigt wurde?

9.7.2. Grabe tiefer

  1. Erkläre die Unterschiede zwischen absolute Lock Time und relative Lock Time.

  2. (Diese Übung ist schwer. Du kannst sie gerne überspringen.) Nimm an, du willst 1 BTC darauf wetten, dass es in London am Weihnachtsabend schneit, und Ruth wettet 1 BTC, dass es das nicht tut. Ihr bestimmt eine Person, Beth, der ihr beide damit vertraut, einen eventuell auftretenden Konflikt zu lösen. Du und Ruth kollaborieren bei der Erzeugung und dem Senden einer Transaktion, die jeweils 1 BTC ausgibt und an einen Output von 2 BTC schickt, mit dem folgenden Redeem Script. (Das Redeem Script kann kleiner gemacht werden, aber um es leichter lesbar zu machen, habe ich eine etwas grössere Version benutzt.) Erkläre auf konzeptioneller Ebene, wie das Redeem Script funktioniert.

    u09 05
  3. Wenn ein p2sh Output an den Hash eines Redeem Scripts zahlt, das ausschliesslich aus einem OP_RETURN mit 32 zufälligen Bytes besteht, könnten Full Nodes dann wissen, dass der Output unspendable, also unverwendbar ist?

    OP_RETURN 53a1e411…b4e6d949
  4. Erläutere, wie die first-seen Policy funktioniert. Und sind Nodes verpflichtet, der Policy zu folgen?

  1. Opt-in RBF bietet eine Methode zum Ersetzen von Transaktionen. Gibt es irgendeinen fundamentalen Unterschied bezüglich der Sicherheit von Transaktionen, die opt-in RBF angeschaltet haben und solchen, die es abgeschaltet haben? Erläutere deine Argumentation.

9.8. Zusammenfassung

  • Transaktionen können ja nach Bedarf der Anwendung in Bezug auf Zeit oder Block Height gesperrt werden. Die Sperren können entweder absolut oder relativ sein.

  • Ein Transaktions Output kann verlangen, dass die sie ausgebende Transaktion eine Zeitsperre besitzt. Das ist in vielen digitalen Verträgen nützlich.

  • Atomic Swaps sind ein nützlicher Weg, Kryptowährungen zwischen zwei Parteien auszutauschen, die sich gegenseitig nicht trauen.

  • Beliebige Daten–zum Beispiel das Eigentums-Token für ein Auto–können in OP_RETURN Outputs gespeichert werden, ohne das UTXO Set zu belasten.

  • Eine Transaktion kann als ersetzbar markiert werden. Das lässt dich die Transaktion ersetzen, falls sie nicht innerhalb einer vernünftigen Zeitspanne bestätigt wird.

  • Signaturen können sich mit sechs verschiedenen SIGHASH Typen an verschiedene Teile der Transaktion binden. Das kann in bestimmten digitalen Verträgen praktisch sein.