Skript

Finden Sie dieser Artikel interessant?

Script Bitcoin

Bitcoin verwendet ein Skript-System für Transaktionen. Script ist einfach, Stack-basiert und von links nach rechts verarbeitet. Es ist absichtlich nicht Turing-vollständig, ohne Schleifen.

Ein Skript ist im Wesentlichen eine Liste von Anweisungen, die bei jeder Transaktion aufgezeichnet werden und beschreibt, wie die nächste Person, die die übertragenen Bitcoins ausgeben möchte, Zugriff auf sie erhalten kann. Das Skript für eine typische Bitcoin-Übertragung an die Ziel-Bitcoin-Adresse D belastet die zukünftigen Ausgaben der Bitcoins lediglich mit zwei Dingen: Der Spender muss dafür sorgen

  1. ein öffentlicher Schlüssel, der beim Hash-Vorgang die im Skript eingebettete Zieladresse D liefert, und
  2. eine Signatur, um den Nachweis des privaten Schlüssels zu erbringen, der dem gerade bereitgestellten öffentlichen Schlüssel entspricht.

Scripting bietet die Flexibilität, die Parameter zu ändern, die benötigt werden, um übertragene Bitcoins auszugeben. Zum Beispiel könnte das Skriptsystem verwendet werden, um zwei private Schlüssel oder eine Kombination von mehreren oder gar keinen Schlüsseln zu erfordern.

Eine Transaktion ist gültig, wenn nichts im kombinierten Skript einen Fehler auslöst und das oberste Stapelelement wahr ist (ungleich Null). Die Partei, die ursprünglich die Bitcoins gesendet hat, die jetzt ausgegeben werden, bestimmt die Skriptoperationen, die zuletzt auftreten werden, um sie für die Verwendung in einer anderen Transaktion freizugeben. Die Partei, die sie ausgeben möchte, muss die Eingabe (n) für das zuvor aufgezeichnete Skript bereitstellen, die dazu führt, dass die letzten auftretenden Vorgänge wahr (nicht Null) bleiben.

Die Stapel enthalten Byte-Vektoren. Wenn sie als Zahlen verwendet werden, werden Bytevektoren als kleine-endian-Ganzzahlen variabler Länge interpretiert, wobei das höchstwertige Bit das Vorzeichen der Ganzzahl bestimmt. Somit repräsentiert 0x81 -1. 0x80 ist eine andere Darstellung von Null (sogenannte negative 0). Positive 0 wird durch einen Vektor mit Nulllänge dargestellt. Byte-Vektoren werden als boolesche Werte interpretiert, wobei False durch eine beliebige Darstellung von Null dargestellt wird und True durch eine beliebige Darstellung von Nicht-Null dargestellt wird.

Inhaltsverzeichnis

Wörter

Advanced Bitcoin Scripting — Part 1: Transactions & Multisig (eng)

Es gibt einige Wörter, die in sehr frühen Versionen von Bitcoin existierten, aber aus der Sorge entfernt wurden, dass der Client einen Fehler bei der Implementierung haben könnte. Diese Angst wurde durch einen Fehler in OP_LSHIFT ausgelöst, der einen beliebigen Bitcoin-Knoten zum Absturz bringen konnte, wenn er ausgenutzt wurde, und durch andere Fehler in der Funktionsweise von Script, die jedermann erlaubten, Bitcoins von irgendjemandem auszugeben. Die entfernten Opcodes werden manchmal als „gesperrte“ Opcodes bezeichnet, aber dies ist eine falsche Bezeichnung, da es für Bitcoin absolut keine Möglichkeit gibt, diese Opcodes zu verwenden (sie existieren einfach nicht mehr im Protokoll), und es gibt sie auch keine festen Pläne, alle diese Opcodes jemals wieder zu aktivieren. Sie sind hier nur für historisches Interesse aufgeführt.

Neue Opcodes können mit Hilfe einer sorgfältig entworfenen und ausgeführten Softfork mit OP_NOP1-OP_NOP10 hinzugefügt werden.

False ist Null oder negative Null (mit einer beliebigen Anzahl von Bytes) oder ein leeres Array und True ist alles andere.

Konstanten

Wenn Sie über Skripte sprechen, werden diese wertschöpfenden Wörter normalerweise weggelassen.

Wort Opcode Hex Eingang Ausgang Beschreibung
OP_0, OP_FALSE 0 0x00 Nichts (leerer Wert) Ein leeres Array von Bytes wird auf den Stapel geschoben. (Dies ist kein No-Op: Ein Element wird dem Stapel hinzugefügt.)
N/A 1-75 0x01-0x4b (spezial) data Die nächsten „Opcode“ -Bytes sind Daten, die auf den Stapel geschoben werden
OP_PUSHDATA1 76 0x4c (spezial) data Das nächste Byte enthält die Anzahl der Bytes, die auf den Stapel geschoben werden sollen.
OP_PUSHDATA2 77 0x4d (spezial) data Die nächsten zwei Bytes enthalten die Anzahl der Bytes, die auf den Stapel geschoben werden sollen.
OP_PUSHDATA4 78 0x4e (spezial) data Die nächsten vier Bytes enthalten die Anzahl der Bytes, die auf den Stapel geschoben werden sollen.
OP_1NEGATE 79 0x4f Nichts. -1 Die Nummer -1 wird auf den Stapel geschoben.
OP_1, OP_TRUE 81 0x51 Nichts. 1 Die Nummer 1 wird auf den Stapel geschoben.
OP_2-OP_16 82-96 0x52-0x60 Nichts. 2-16 Die Nummer im Wortnamen (2-16) wird auf den Stapel geschoben.

Ablaufsteuerung

Wort Opcode Hex Eingang Ausgang Beschreibung
OP_NOP 97 0x61 Nichts Nichts Tut nichts.
OP_IF 99 0x63 <expression> if [statements] [else [statements]]* endif Wenn der oberste Stapelwert nicht False ist, werden die Anweisungen ausgeführt. Der oberste Stapelwert wird entfernt.
OP_NOTIF 100 0x64 <expression> notif [statements] [else [statements]]* endif Wenn der oberste Stapelwert False ist, werden die Anweisungen ausgeführt. Der oberste Stapelwert wird entfernt.
OP_ELSE 103 0x67 <expression> if [statements] [else [statements]]* endif Wenn das vorhergehende OP_IF oder OP_NOTIF oder OP_ELSE nicht ausgeführt wurde, sind diese Anweisungen und wenn das vorhergehende OP_IF oder OP_NOTIF oder OP_ELSE ausgeführt wurde, dann sind diese Anweisungen nicht.
OP_ENDIF 104 0x68 <expression> if [statements] [else [statements]]* endif Beendet einen if / else-Block. Alle s müssen enden, oder die Transaktion ist ‘ungültig‘. Ein OP_ENDIF ohne OP_IF früher ist auch ‘ungültig’.
OP_VERIFY 105 0x69 Richtig/falsch Nichts / fail Markiert die Transaktion als ungültig wenn der oberste Stapelwert nicht wahr ist.
106 0x6a Nichts fail Markiert die Transaktion als ungültig. Eine Standardmethode zum Anhängen zusätzlicher Daten an Transaktionen besteht darin, eine nullwertige Ausgabe mit einem scriptPubKey hinzuzufügen, der aus OP_RETURN gefolgt von genau einem Pushdata-Befehl besteht. Solche Ausgaben sind nachweisbar unzuverlässig und reduzieren ihre Kosten für das Netzwerk. Derzeit wird es normalerweise als nicht standardgemäß (obwohl gültig) angesehen, wenn eine Transaktion mehr als eine OP_RETURN-Ausgabe oder eine OP_RETURN-Ausgabe mit mehr als einer Pushdata-Operation hat.

Stapel

Wort Opcode Hex Eingang Ausgang Beschreibung
OP_TOALTSTACK 107 0x6b x1 (alt)x1 Fügt die Eingabe oben auf den Alt-Stapel ein. Entfernt es vom Hauptstapel.
OP_FROMALTSTACK 108 0x6c (alt)x1 x1 Fügt die Eingabe auf die oberste Ebene des Hauptstapels. Entfernt es aus dem Alt-Stapel.
OP_IFDUP 115 0x73 x x / x x Wenn der oberste Stapelwert nicht 0 ist, duplizieren Sie ihn.
OP_DEPTH 116 0x74 Nichts <Stack size> Setzt die Anzahl der Stapelobjekte auf den Stapel.
OP_DROP 117 0x75 x Nichts Entfernt das oberste Stapelelement.
OP_DUP 118 0x76 x x x Dupliziert das oberste Stapelelement.
OP_NIP 119 0x77 x1 x2 x2 Entfernt den zweithöchsten Stapelposten.
OP_OVER 120 0x78 x1 x2 x1 x2 x1 Kopiert den zweithöchsten Stapel nach oben.
OP_PICK 121 0x79 xn … x2 x1 x0 <n> xn … x2 x1 x0 xn Das Element n zurück im Stapel wird nach oben kopiert.
OP_ROLL 122 0x7a xn … x2 x1 x0 <n> … x2 x1 x0 xn Der Gegenstand n zurück im Stapel wird nach oben verschoben.
OP_ROT 123 0x7b x1 x2 x3 x2 x3 x1 Die obersten drei Elemente auf dem Stapel werden nach links gedreht.
OP_SWAP 124 0x7c x1 x2 x2 x1 Die obersten zwei Elemente auf dem Stapel werden ausgetauscht.
OP_TUCK 125 0x7d x1 x2 x2 x1 x2 Das Element am oberen Rand des Stapels wird kopiert und vor dem zweitletzten Element eingefügt.
OP_2DROP 109 0x6d x1 x2 Nichts Entfernt die beiden obersten Stapelelemente.
OP_2DUP 110 0x6e x1 x2 x1 x2 x1 x2 Kopiert die beiden obersten Stapelelemente.
OP_3DUP 111 0x6f x1 x2 x3 x1 x2 x3 x1 x2 x3 Kopiert die obersten drei Stapelelemente.
OP_2OVER 112 0x70 x1 x2 x3 x4 x1 x2 x3 x4 x1 x2 Kopiert das Objektpaar zwei Felder zurück im Stapel nach vorne.
OP_2ROT 113 0x71 x1 x2 x3 x4 x5 x6 x3 x4 x5 x6 x1 x2 Die fünfte und sechste Position zurück werden an die Spitze des Stapels bewegt.
OP_2SWAP 114 0x72 x1 x2 x3 x4 x3 x4 x1 x2 Tauscht die oberen zwei Paare von Gegenständen.

Spleißen

Wenn ein Opcode, der als deaktiviert gekennzeichnet ist, in einem Skript vorhanden ist, muss er abgebrochen werden und fehlschlagen.

Wort Opcode Hex Eingang Ausgang Beschreibung
OP_CAT 126 0x7e x1 x2 aus Verkettet zwei Zeichenfolgen. disabled.
OP_SUBSTR 127 0x7f in beginnen Größe aus Gibt einen Abschnitt einer Zeichenfolge zurück. disabled.
OP_LEFT 128 0x80 in Größe aus Behält nur Zeichen vom angegebenen Punkt in einer Zeichenfolge bei. disabled.
OP_RIGHT 129 0x81 in Größe aus Hält nur Zeichen des angegebenen Punkts in einer Zeichenfolge. disabled.
OP_SIZE 130 0x82 in in Größe Setzt die String-Länge des obersten Elements des Stacks (ohne es zu knacken).

Bitweise Logik

Wenn ein Opcode, der als deaktiviert gekennzeichnet ist, in einem Skript vorhanden ist, muss er abgebrochen werden und fehlschlagen.

Wort Opcode Hex Eingang Ausgang Beschreibung
OP_INVERT 131 0x83 in aus Flippt alle Bits im Eingang. disabled.
OP_AND 132 0x84 x1 x2 aus Boolesches und zwischen jedem Bit in den Eingängen. disabled.
OP_OR 133 0x85 x1 x2 aus Boolesches oder zwischen jedem Bit in den Eingängen. disabled.
OP_XOR 134 0x86 x1 x2 aus Boolescher Exclusive or zwischen jedem Bit in den Eingängen. disabled.
OP_EQUAL 135 0x87 x1 x2 Richtig/falsch Gibt 1 zurück, wenn die Eingaben genau gleich sind, andernfalls 0.
OP_EQUALVERIFY 136 0x88 x1 x2 Nichts / fail Wie OP_EQUAL, aber OP_VERIFY wird danach ausgeführt.

Arithmetik

Hinweis: Arithmetische Eingaben sind auf vorzeichenbehaftete 32-Bit-Ganzzahlen beschränkt, können jedoch ihre Ausgabe überlaufen lassen.

Wenn ein Eingabewert für einen dieser Befehle länger als 4 Byte ist, muss das Skript abgebrochen werden und fehlschlagen. Wenn ein Opcode, der als deaktiviert markiert ist, in einem Skript vorhanden ist, muss er ebenfalls abgebrochen und fehlgeschlagen sein.

Wort Opcode Hex Eingang Ausgang Beschreibung
OP_1ADD 139 0x8b in aus 1 wird zum Eingang hinzugefügt.
OP_1SUB 140 0x8c in aus 1 wird von der Eingabe subtrahiert.
OP_2MUL 141 0x8d in aus Die Eingabe wird mit 2 multipliziert. disabled.
OP_2DIV 142 0x8e in aus Die Eingabe wird durch 2 geteilt. disabled.
OP_NEGATE 143 0x8f in aus Das Vorzeichen der Eingabe wird umgedreht.
OP_ABS 144 0x90 in aus Die Eingabe wird positiv gemacht.
OP_NOT 145 0x91 in aus Wenn die Eingabe 0 oder 1 ist, wird sie umgedreht. Andernfalls wird der Ausgang 0 sein.
OP_0NOTEQUAL 146 0x92 in aus Gibt 0 zurück, wenn die Eingabe 0 ist. Andernfalls.
OP_ADD 147 0x93 a b aus a wird zu b hinzugefügt.
OP_SUB 148 0x94 a b aus b wird von a subtrahiert.
OP_MUL 149 0x95 a b aus a wird mit b multipliziert. disabled.
OP_DIV 150 0x96 a b aus a ist durch b geteilt. disabled.
OP_MOD 151 0x97 a b aus Gibt den Rest zurück, nachdem a von b dividiert wurde. disabled.
OP_LSHIFT 152 0x98 a b aus Verschiebt ‚a‘ links ‚b‘ Bits und erhält das Zeichen. disabled.
OP_RSHIFT 153 0x99 a b aus Verschiebt ‚a‘ rechts ‚b‘ Bits und erhält das Zeichen. disabled.
OP_BOOLAND 154 0x9a a b aus Wenn a und b nicht 0 sind, ist die Ausgabe 1. Andernfalls 0.
OP_BOOLOR 155 0x9b a b aus Wenn a und b nicht 0 sind, ist die Ausgabe 1. Andernfalls 0.
OP_NUMEQUAL 156 0x9c a b aus Gibt 1 zurück, wenn die Zahlen gleich sind, andernfalls 0.
OP_NUMEQUALVERIFY 157 0x9d a b Nichts / fail Wie OP_NUMEQUAL, aber führt OP_VERIFY danach aus.
OP_NUMNOTEQUAL 158 0x9e a b aus Gibt 1 zurück, wenn die Zahlen nicht gleich sind, andernfalls 0.
OP_LESSTHAN 159 0x9f a b aus Gibt 1 zurück, wenn a kleiner als b ist, andernfalls 0.
OP_GREATERTHAN 160 0xa0 a b aus Gibt 1 zurück, wenn a größer als b ist, andernfalls 0.
OP_LESSTHANOREQUAL 161 0xa1 a b aus Gibt 1 zurück, wenn a kleiner oder gleich b ist, andernfalls 0.
OP_GREATERTHANOREQUAL 162 0xa2 a b aus Gibt 1 zurück, wenn a größer als oder gleich b ist, andernfalls 0.
OP_MIN 163 0xa3 a b aus Gibt das kleinere von a und b zurück.
OP_MAX 164 0xa4 a b aus Gibt das größere von a und b zurück.
OP_WITHIN 165 0xa5 x min max aus Gibt 1 zurück, wenn x innerhalb des angegebenen Bereichs liegt (links eingeschlossen), andernfalls 0.

Krypto

Wort Opcode Hex Eingang Ausgang Beschreibung
OP_RIPEMD160 166 0xa6 in hash Die Eingabe wird mit RIPEMD-160 hashed.
OP_SHA1 167 0xa7 in hash Die Eingabe wird mit SHA-1 hashed.
OP_SHA256 168 0xa8 in hash Die Eingabe wird mit SHA-256 hashed.
OP_HASH160 169 0xa9 in hash Die Eingabe wird zweimal gehackt: zuerst mit SHA-256 und dann mit RIPEMD-160.
OP_HASH256 170 0xaa in hash Die Eingabe wird zweimal mit SHA-256 hashed.
OP_CODESEPARATOR 171 0xab Nichts Nichts Alle Signaturprüfwörter stimmen nur Signaturen mit den Daten nach dem zuletzt ausgeführten OP_CODESEPARATOR überein.
172 0xac sig pubkey Richtig/falsch Die Ausgaben, Eingaben und das Skript der gesamten Transaktion (vom zuletzt ausgeführten OP_CODESEPARATOR bis zum Ende) werden gehasht. Die von OP_CHECKSIG verwendete Signatur muss eine gültige Signatur für diesen Hash und diesen öffentlichen Schlüssel sein. Wenn dies der Fall ist, wird 1 zurückgegeben, andernfalls 0.
OP_CHECKSIGVERIFY 173 0xad sig pubkey Nichts / fail Wie OP_CHECKSIG, aber OP_VERIFY wird danach ausgeführt.
OP_CHECKMULTISIG 174 0xae x sig1 sig2 … <number of signatures> pub1 pub2 <number of public keys> Richtig/ falsch Vergleicht die erste Signatur mit jedem öffentlichen Schlüssel, bis eine ECDSA-Übereinstimmung gefunden wird. Er beginnt mit dem nachfolgenden öffentlichen Schlüssel und vergleicht die zweite Signatur mit jedem verbleibenden öffentlichen Schlüssel, bis eine ECDSA-Übereinstimmung gefunden wird. Der Prozess wird wiederholt, bis alle Signaturen überprüft wurden oder nicht genügend öffentliche Schlüssel übrig sind, um ein erfolgreiches Ergebnis zu erzielen. Alle Signaturen müssen einem öffentlichen Schlüssel entsprechen. Da öffentliche Schlüssel nicht erneut überprüft werden, wenn sie einen Signaturvergleich nicht bestehen, müssen die Signaturen in der scriptSig in derselben Reihenfolge platziert werden, in der die entsprechenden öffentlichen Schlüssel im scriptPubKey oder reademScript platziert wurden. Wenn alle Signaturen gültig sind, wird 1 zurückgegeben, andernfalls 0. Aufgrund eines Fehlers wird ein zusätzlicher nicht verwendeter Wert aus dem Stapel entfernt.
OP_CHECKMULTISIGVERIFY 175 0xaf x sig1 sig2 … <number of signatures> pub1 pub2 … <number of public keys> Nichts / fail Wie OP_CHECKMULTISIG, aber OP_VERIFY wird später ausgeführt.

Sperrzeit

Wort Opcode Hex Eingang Ausgang Beschreibung
OP_CHECKLOCKTIMEVERIFY (vorher OP_NOP2) 177 0xb1 x x / fail Marks transaction as invalid Wenn das oberste Stapelelement größer als das Feld nLockTime der Transaktion ist, wird die Skriptauswertung ansonsten so fortgesetzt, als ob ein OP_NOP ausgeführt wurde. Die Transaktion ist auch ungültig, wenn 1. der Stapel leer ist oder 2. der oberste Stapelposten negativ ist; oder 3. das oberste Stapelelement ist größer oder gleich 500000000, während das Feld nLockTime der Transaktion weniger als 500000000 oder umgekehrt ist; oder 4. Das Feld nSequence der Eingabe ist gleich 0xffffffff. Die genaue Semantik wird in BIP 0065 beschrieben.
OP_CHECKSEQUENCEVERIFY (vorher OP_NOP3) 178 0xb2 x x / fail Marks transaction as invalid wenn die relative Sperrzeit der Eingabe (durch BIP 0068 mit nSequence erzwungen) nicht gleich oder länger als der Wert des obersten Stapelelements ist. Die genaue Semantik wird in BIP 0112 beschrieben.

Pseudowörter

Diese Wörter werden intern für die Unterstützung beim Transaktionsabgleich verwendet. Sie sind ungültig, wenn sie in tatsächlichen Skripten verwendet werden.

Wort Opcode Hex Beschreibung
OP_PUBKEYHASH 253 0xfd Stellt einen öffentlichen Schlüssel dar, der mit OP_HASH160 gehackt wurde.
OP_PUBKEY 254 0xfe Stellt einen öffentlichen Schlüssel dar, der mit OP_CHECKSIG kompatibel ist.
OP_INVALIDOPCODE 255 0xff Entspricht jedem Opcode, der noch nicht zugewiesen wurde.

Reservierte Wörter

Jeder nicht zugewiesene Opcode ist ebenfalls reserviert. Die Verwendung eines nicht zugewiesenen Opcodes macht die Transaktion ungültig.

Wort Opcode Hex Wenn benutzt…
OP_RESERVED 80 0x50 Die Transaktion ist ungültig, es sei denn, sie tritt in einer nicht ausgeführten OP_IF-Verzweigung auf
OP_VER 98 0x62 Die Transaktion ist ungültig, es sei denn, sie wird in einer nicht ausgeführten OP_IF-Verzweigung ausgeführt
OP_VERIF 101 0x65 Die Transaktion ist ungültig, selbst wenn sie in einer nicht ausgeführten OP_IF-Verzweigung auftritt
OP_VERNOTIF 102 0x66 Die Transaktion ist ungültig, selbst wenn sie in einer nicht ausgeführten OP_IF-Verzweigung auftritt
OP_RESERVED1 137 0x89 Transaktion ist ungültig, außer wenn sie in einer nicht ausgeführten OP_IF-Verzweigung auftritt
OP_RESERVED2 138 0x8a Die Transaktion ist ungültig, sofern sie nicht in einer nicht ausgeführten OP_IF-Verzweigung auftritt
OP_NOP1, OP_NOP4-OP_NOP10 176, 179-185 0xb0, 0xb3-0xb9 Das Wort wird ignoriert. Markiert die Transaktion nicht als ungültig.

Skripte

Dies ist eine Liste interessanter Skripte. Denken Sie daran, dass alle Konstanten tatsächlich die oben genannten Befehle zur Datenspeicherung verwenden. Beachten Sie, dass es eine kleine Anzahl von Standardskriptformularen gibt, die von Knoten zu Knoten weitergeleitet werden. Nicht-Standardskripte werden akzeptiert, wenn sie in einem Block sind, aber Knoten werden sie nicht weiterleiten.

Standardtransaktion zur Bitcoin-Adresse (Pay-to-Pubkey-Hash)

scriptPubKey: OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG scriptSig: <sig> <pubKey> 

Um zu zeigen, wie Skripts auf dem Draht aussehen, hier ein roher SkriptPubKey:

76  A9    14 OP_DUP OP_HASH160 Bytes to push 
89 AB CD EF AB BA AB BA AB BA AB BA AB BA AB BA AB BA AB BA 88   AC      Data to push      OP_EQUALVERIFY OP_CHECKSIG 

Hinweis: scriptSig befindet sich in der Eingabe der Ausgabentransaktion, und scriptPubKey befindet sich in der Ausgabe der zuvor nicht verwendeten, d.h. „verfügbaren“ Transaktion.

So wird jedes Wort verarbeitet:

Stapel Skript Beschreibung
Leer. <sig> <pubKey> OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG scriptSig and scriptPubKey sind kombiniert.
<sig> <pubKey> OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG Konstanten werden dem Stapel hinzugefügt.
<sig> <pubKey> <pubKey> OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG Der oberste Stapelartikel wird dupliziert.
<sig> <pubKey> <pubHashA> <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG Der oberste Stapel wird hashed.
<sig> <pubKey> <pubHashA> <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG Konstante hinzugefügt.
<sig> <pubKey> OP_CHECKSIG Die Gleichheit wird zwischen den beiden obersten Stapeln geprüft.
Richtig Leer Die Signatur wird auf die beiden obersten Stapelpositionen überprüft.

Überholte Pay-to-Pubkey-Transaktion

OP_CHECKSIG wird direkt verwendet, ohne zuerst den öffentlichen Schlüssel zu hashen. Dies wurde von früheren Bitcoin-Versionen verwendet, bei denen Benutzer direkt an IP-Adressen gezahlt haben, bevor Bitcoin-Adressen eingeführt wurden. scriptPubKeys dieses Transaktionsformulars werden von Bitcoin Core weiterhin als Zahlungen an den Benutzer erkannt. Der Nachteil dieser Transaktionsform besteht darin, dass der gesamte öffentliche Schlüssel im Voraus bekannt sein muss, was längere Zahlungsadressen impliziert, und dass er im Fall einer Unterbrechung des ECDSA-Signaturalgorithmus weniger Schutz bietet.

scriptPubKey: <pubKey> OP_CHECKSIG scriptSig: <sig> 

Überprüfungsprozess:

Stapel Skript Beschreibung
Leer. <sig> <pubKey> OP_CHECKSIG scriptSig and scriptPubKey sind kombiniert.
<sig> <pubKey> OP_CHECKSIG Konstanten werden dem Stapel hinzugefügt.
richtig Leer. Die Signatur wird auf die beiden obersten Stapelpositionen überprüft.

Erheblich ausgabefähige/verwerfbare Ausgaben

Der Standardweg, um eine Transaktion als nachweisbar unbenutzbar zu markieren, ist mit einem scriptPubKey der folgenden Form:

scriptPubKey: OP_RETURN {zero or more ops} 

OP_RETURN markiert das Skript sofort als ungültig und garantiert, dass keine scriptSig existiert, die diese Ausgabe ausgeben könnte. Daher kann die Ausgabe sofort aus dem UTXO-Satz gelöscht werden, selbst wenn sie nicht ausgegeben wurde. eb31ca1a4cbd97c2770983164d7560d2d03276ae1aee26f12d7c2c6424252f29 ist ein Beispiel: Es hat eine einzige Ausgabe von Null-Wert, so dass die vollen 0,125BTC Gebühr an den Bergmann, der die Transaktion, ohne einen Eintrag in die UTXO-Set gewonnen hat. Sie können auch OP_RETURN verwenden, um Daten zu einer Transaktion hinzuzufügen, ohne dass die Daten jemals in der UTXO-Gruppe angezeigt werden, wie in 1a2e22a717d626fc5db363582007c46924ae6b28319f07cb1b907776bd8293fc; P2Pool tut dies mit dem Share Chain Hash Txout in der CoinBase von Blöcken, die es erstellt.

Anyone-can-spend (Jeder kann Ausgaben) Ausgeben

Umgekehrt kann eine Transaktion von jedermann überhaupt getätigt werden:

scriptPubKey: (empty) scriptSig: OP_TRUE 

Mit einigen Softwareänderungen können solche Transaktionen als Möglichkeit genutzt werden, zusätzlich zu Transaktionsgebühren Geld an Bergleute zu spenden: Jeder Bergmann, der eine solche Transaktion abbaut, kann auch eine zusätzliche hinzufügen, nachdem er die Gelder an eine von ihnen kontrollierte Adresse gesendet hat. Dieser Mechanismus kann in Zukunft für Treuhandanleihen verwendet werden, um Fonds in nachweisbarer Weise zu opfern.

Anyone-Can-Spend-Ausgaben werden derzeit als nicht standardisiert betrachtet und nicht im P2P-Netzwerk weitergeleitet.

Transaktionspuzzle

Transaktion a4bfa8ab6435ae5f25dae9d89e4eb67dfa94283ca751f393c1ddc5a837bbc31b ist ein interessantes Puzzle.

scriptPubKey: OP_HASH256 6fe28c0ab6f1b372c1a6a246ae63f74f931e8365e15a089c68d6190000000000 OP_EQUAL scriptSig:  

Um die Transaktion auszugeben, müssen Sie einige Daten bereitstellen, so dass das Hashing der Daten zweimal zu dem angegebenen Hash führt.

Stapel Skript Beschreibung
Leer. OP_HASH256 <given_hash> OP_EQUAL
<data> OP_HASH256 <given_hash> OP_EQUAL scriptSig zum Stapel hinzugefügt.
<data_hash> <given_hash> OP_EQUAL Die Daten werden gehackt.
<data_hash> <given_hash> OP_EQUAL Der angegebene Hash wird auf den Stapel geschoben.
richtig Leer. Die Hashes werden verglichen und auf dem Stack bleiben.

Diese Transaktion wurde erfolgreich von 09f691b2263260e71f363d1db51ff3100d285956a40cc0e4f8c8c2c4a80559b1 ausgegeben. Die benötigten Daten waren zufällig der Genesis-Block und der gegebene Hash war der Geneseblock-Hash. Beachten Sie, dass solche Transaktionen zwar Spaß machen, aber nicht sicher sind, da sie keine Signaturen enthalten. Daher kann jede Transaktion, die versucht, sie auszugeben, durch eine andere Transaktion ersetzt werden, die die Geldmittel an einen anderen Ort sendet.

Siehe auch auf BitcoinWiki

Ressourcen