Skript
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
- ein öffentlicher Schlüssel, der beim Hash-Vorgang die im Skript eingebettete Zieladresse D liefert, und
- 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
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
- Bitcoin IDE: Bitcoin Script for dummies
- Bitcoin Debug Script Execution
- Script Playground — convert Script to JavaScript
- https://en.bitcoin.it/wiki/Script