Eine Einf├╝hrung in Bitcoin Script
Startseite
Artikel
Eine Einf├╝hrung in Bitcoin Script

Eine Einf├╝hrung in Bitcoin Script

Fortgeschritten
Ver├Âffentlicht Jul 10, 2020Aktualisiert Jan 18, 2022
13m

Einf├╝hrung

Bitcoin wird manchmal als programmierbares Geld bezeichnet. Aufgrund seines digitalen Charakters erm├Âglicht es den Benutzern ein hohes Ma├č an Flexibilit├Ąt, wenn es darum geht, die Bedingungen, wie Geld ausgegeben werden kann festzulegen.┬á
Wir sprechen von Wallets und Coins, wenn wir ├╝ber Bitcoin sprechen. Wir k├Ânnten uns aber auch Wallets als Schl├╝ssel, Coins als Schecks und die Blockchain als Aneinanderreihung von verschlossenen Tresoren vorstellen. In jedem Tresor befindet sich ein d├╝nner Schlitz, so dass jeder Schecks einwerfen oder hineinschauen kann, um zu sehen, wie viel Wert der Tresor fasst. Allerdings hat nur der Schl├╝sselinhaber Zugang zum Inneren des Tresors.

Wenn ein Schl├╝sselinhaber jemandem Geld geben will, schlie├čt er sein Fach auf. Er stellt einen neuen Scheck aus, der sich auf den ├Ąlteren Scheck bezieht (der dann vernichtet wird), und schlie├čt ihn in ein Fach ein, das der Empf├Ąnger ├Âffnen kann. Um das Geld auszugeben, wiederholt der neue Empf├Ąnger den Vorgang.

In diesem Artikel werfen wir einen genaueren Blick auf Script, die Programmiersprache, die von den Nodes im Bitcoin-Netzwerk interpretiert wird. Script ist das, was den erw├Ąhnten Verriegelungs-/Entriegelungsmechanismus f├╝r die Tresore regelt.


Wie funktioniert Bitcoin?

In Anlehnung an unsere Analogie von vorhin k├Ânnte man sagen, dass jede Transaktion aus zwei Teilen besteht - einem Schl├╝ssel (zum Entsperren Ihrer Kiste) und einem Schloss. Sie benutzen Ihren Schl├╝ssel, um die Kiste zu ├Âffnen, die den Scheck enth├Ąlt, den Sie versenden m├Âchten, und f├╝gen dann einen neuen Schl├╝ssel zu einer neuen Kiste mit einem anderen Schloss hinzu. Um Geld aus der neuen Kiste auszugeben, ben├Âtigen Sie einen weiteren Schl├╝ssel.
Ganz einfach. Es kann auch unterschiedliche Arten von Schl├Âssern im System geben. Vielleicht verlangen einige Tresore, dass Sie mehrere Schl├╝ssel zur Verf├╝gung stellen, und vielleicht m├╝ssen Sie bei anderen beweisen, dass Sie ein Geheimnis kennen. Es gibt eine Reihe von Bedingungen, die man stellen kann.┬á
Unser Schl├╝ssel ist das, was wir ein scriptSig nennen. Das Schloss ist unser scriptPubKey. Wenn wir uns diese Komponenten etwas genauer ansehen, werden wir feststellen, dass sie tats├Ąchlich aus Datenteilen und Codebl├Âcken bestehen. Wenn sie kombiniert werden, ergeben sie ein winziges Programm.

Wenn Sie eine Transaktion durchf├╝hren, senden Sie diese Kombination an das Netzwerk. Jeder Knoten (Node), der sie empf├Ąngt, ├╝berpr├╝ft das Programm, was ihm sagt, ob die Transaktion g├╝ltig ist. Wenn nicht, wird es einfach verworfen, und Sie k├Ânnen die gesperrten Mittel nicht ausgeben.

Die in Ihrem Besitz befindlichen Schecks (Coins) werden als nicht ausgegebene Transaktionsausgaben bzw. Unspent Transaction Outputs (UTXOs) bezeichnet. Die Gelder k├Ânnen von jedem verwendet werden, der den zum Schloss passenden Schl├╝ssel zur Verf├╝gung stellen kann. Dabei ist der Schl├╝ssel das scriptSig und das Schloss das scriptPubKey.
Wenn sich die UTXOs in Ihrer Wallet befinden, haben diese wahrscheinlich eine Bedingung, die besagt, dass nur die Person, die den Besitz dieses ├Âffentlichen Schl├╝ssels nachweisen kann, diese Gelder entsperren kann. Um sie zu entsperren, stellen Sie ein scriptSig zur Verf├╝gung, das eine digitale Signatur enth├Ąlt, wobei Sie den privaten Schl├╝ssel verwenden, der dem im scriptPubKey angegebenen ├Âffentlichen Schl├╝ssel zugeordnet ist. Dies alles wird in K├╝rze klarer werden.


Den Bitcoin-Stapel verstehen

Script ist eine so genannte stack-based also eine <0>Stapel-basierte Sprache. Das bedeutet, dass wir, wenn wir eine Reihe von Anweisungen lesen, diese in einer Art vertikaler Spalte platzieren, die man sich vorstellen kann. Die Liste A, B, C w├╝rde zum Beispiel zu einem Stapel mit A in unterster und C in oberster Position f├╝hren. Wenn die Anweisungen uns auffordern, etwas zu tun, operieren wir mit einem oder mehreren Elementen, beginnend am oberen Ende des Stapels.


Die Elemente A, B und C werden hinzugef├╝gt und aus dem Stapel ÔÇťherausgesto├čenÔÇŁ.


Wir k├Ânnen zwischen den Daten (Dinge wie Signaturen, Hashes und ├Âffentliche Schl├╝ssel) und den Anweisungen (oder Opcodes) unterscheiden. Die Anweisungen entfernen Daten und machen etwas mit ihnen. Hier ist ein sehr einfaches Beispiel daf├╝r, wie ein Script aussehen k├Ânnte:
<xyz> <md5 hasher> <d16fb36f0911f878998c136191af705e> <check if equal>
In Rot haben wir Daten, und in Blau haben wir die Opcodes. Wir lesen von links nach rechts, also legen wir zuerst die Zeichenfolge <xyz> auf den Stapel. Als n├Ąchstes kommt der Opcode <md5 hasher>. Diesen gibt es in Bitcoin nicht, aber nehmen wir an, er entfernt das oberste Element des Stapels (<xyz>) und hasht es mit dem MD5-Algorithmus. Dann wird die Ausgabe wieder auf dem Stack hinzugef├╝gt. Die Ausgabe lautet hier zuf├Ąllig d16fb36f0911f878998c136191af705e.
Welch ein Zufall! Unser n├Ąchstes hinzuzuf├╝gendes Element ist <d16fb36f0911f878998c136191af705e>, so dass unser Stapel nun zwei identische Elemente hat. Zuletzt holt <check if equal> zwei Elemente von oben heraus und pr├╝ft, ob sie gleich sind. Wenn dies der Fall ist, f├╝gt es dem Stapel <1> hinzu. Wenn nicht, f├╝gt es <0> hinzu.┬á
Damit sind wir am Ende unserer Anweisungsliste angelangt. Unser Skript h├Ątte auf zwei Arten fehlschlagen k├Ânnen ÔÇô wenn das verbleibende Element eine Null war oder wenn einer der Operatoren es fehlschlagen lie├č, wenn einige Bedingungen nicht erf├╝llt waren. In diesem Beispiel hatten wir keine derartigen Operatoren, und am Ende hatten wir ein Nicht-Null-Element (<1>), so dass unser Skript g├╝ltig war. Diese Regeln gelten auch f├╝r echte Bitcoin-Transaktionen.

Das war nur ein erfundenes Programm. Schauen wir uns nun einige echte an.


Pay-to-Pubkey (P2PK)

Pay-to-Pubkey (P2PK) ist unglaublich unkompliziert. Es beinhaltet das Sperren von Geldern auf einen bestimmten ├Âffentlichen Schl├╝ssel. Wenn Sie auf diese Weise Gelder erhalten wollten, w├╝rden Sie in diesem Fall dem Absender Ihren ├Âffentlichen Schl├╝ssel zur Verf├╝gung stellen, und nicht etwa eine Bitcoin-Adresse.

Die allererste Transaktion zwischen Satoshi Nakamoto und Hal Finney im Jahr 2009 war eine P2PK-Transaktion. Diese Struktur wurde in den frühen Tagen von Bitcoin sehr oft genutzt, aber heutzutage hat Pay-to-Pubkey-Hash (P2PKH) sie weitgehend ersetzt. 
Das Sperrskript f├╝r eine P2PK-Transaktion folgt dem Format <public key>┬áOP_CHECKSIG. Einfach genug. Sie haben vielleicht schon vermutet, dass OP_CHECKSIG eine Signatur gegen den bereitgestellten ├Âffentlichen Schl├╝ssel pr├╝ft. Als solches wird unser SkriptSig eine einfache <signature> sein. Denken Sie daran, dass das scriptSig der Schl├╝ssel zum Schloss ist.



Viel einfacher geht es nicht. Eine Signatur wird dem Stapel hinzugef├╝gt, gefolgt von einem ├Âffentlichen Schl├╝ssel. OP_CHECKSIG nimmt sich beide und verifiziert die Signatur gegen den ├Âffentlichen Schl├╝ssel. Wenn sie ├╝bereinstimmen, f├╝gt es dem Stapel eine <1> hinzu. Andernfalls f├╝gt es eine <0> hinzu.

Aus Gr├╝nden, auf die wir im n├Ąchsten Abschnitt n├Ąher eingehen werden, wird P2PK nicht mehr wirklich verwendet.


Pay-to-Pubkey-Hash (P2PKH)

Pay-to-Pubkey-Hash (P2PKH) ist heute die gebr├Ąuchlichste Art der Transaktion. Nur bei veralteter Software ist dies nicht der Fall, Ihre aktuelle Wallet sollte P2PKH jedoch standardm├Ą├čig verwenden.

Der scriptPubKey in P2PKH lautet wie folgt:

OP_DUP OP_HASH160 <public key hash> OP_EQUALVERIFY OP_CHECKSIG

Bevor wir das scriptSig einf├╝hren, lassen Sie uns aufschl├╝sseln, was die neuen Opcodes bewirken werden:


OP_DUP

OP_DUP ├Âffnet das erste Element und dupliziert es. Dann f├╝gt es beide wieder dem Stapel hinzu. Normalerweise geschieht dies, damit wir eine Operation auf dem Duplikat durchf├╝hren k├Ânnen, ohne das Original zu beeinflussen.


OP_HASH160

Dadurch wird das erste Element ausgew├Ąhlt und zweimal gehasht. Die erste Runde wird mit dem SHA-256-Algorithmus gehasht. Die SHA-256-Ausgabe wird dann mit dem RIPEMD-160-Algorithmus gehasht. Die resultierende Ausgabe wird wieder zu dem Stapel hinzugef├╝gt.


OP_EQUALVERIFY

OP_EQUALVERIFY kombiniert zwei weitere Operatoren ÔÇô OP_EQUAL und OP_VERIFY. OP_EQUAL nimmt zwei Elemente und pr├╝ft, ob sie identisch sind. Wenn sie identisch sind, f├╝gt es dem Stapel eine 1 hinzu. Wenn nicht, f├╝gt es eine 0 hinzu. OP_VERIFY nimmt das oberste Element und pr├╝ft, ob es wahr ist (d.h. ungleich Null). Ist dies nicht der Fall, schl├Ągt die Transaktion fehl. In Kombination bewirkt OP_EQUALVERIFY, dass die Transaktion fehlschl├Ągt, wenn die beiden obersten Elemente nicht ├╝bereinstimmen.

Diesmal sieht das scriptSig wie folgt aus:

<signature> <public key>

Sie m├╝ssen eine Signatur und den entsprechenden ├Âffentlichen Schl├╝ssel bereitstellen, um P2PKH-Ausgaben freizuschalten.



Sie k├Ânnen sehen, was im obigen GIF vor sich geht. Es unterscheidet sich nicht allzu sehr von einem P2PK-Skript. Wir f├╝gen nur einen zus├Ątzlichen Schritt hinzu, um zu ├╝berpr├╝fen, ob der ├Âffentliche Schl├╝ssel mit dem Hash im Skript ├╝bereinstimmt.

Es gibt jedoch etwas zu beachten. In einem P2PKH-Sperr-Skript ist der ├Âffentliche Schl├╝ssel nicht sichtbar ÔÇô wir k├Ânnen nur seinen Hash sehen. Wenn wir zu einem Blockchain-Explorer gehen und uns eine P2PKH-Ausgabe ansehen, die nicht ausgegeben wurde, k├Ânnen wir den ├Âffentlichen Schl├╝ssel nicht bestimmen. Er wird erst enth├╝llt, wenn der Empf├Ąnger beschlie├čt, die Gelder zu transferieren.
Dies hat eine Reihe von Vorteilen. Der erste ist, dass der Hash des ├Âffentlichen Schl├╝ssels einfach leichter weitergegeben werden kann als ein vollst├Ąndiger ├Âffentlicher Schl├╝ssel. Genau aus diesem Grund hat Satoshi ihn 2009 eingef├╝hrt. Der Hash des ├Âffentlichen Schl├╝ssels ist das, was wir heute als Bitcoin-Adresse kennen.
Der zweite Vorteil besteht darin, dass Hashes von ├Âffentlichen Schl├╝sseln eine zus├Ątzliche Sicherheitsebene gegen Quantencomputer bieten k├Ânnten. Da unser ├Âffentlicher Schl├╝ssel erst bekannt ist, wenn wir die Mittel ausgegeben haben, ist es f├╝r andere noch schwieriger, den privaten Schl├╝ssel zu berechnen. Sie m├╝ssten die beiden Runden des Hashings (RIPEMD-160 und SHA-256) umkehren, um ihn zu erhalten.



Pay-to-Script-Hash (P2SH)

Pay-to-Script-Hash (P2SH) war eine sehr interessante Entwicklung f├╝r Bitcoin. Es erm├Âglicht es Absendern, Gelder an den Hash eines Skripts zu binden ÔÇô sie m├╝ssen nicht wissen, was das Skript tats├Ąchlich bewirkt. Nehmen Sie den folgenden SHA-256-Hash:

e145fe9ed5c23aa71fdb443de00c7d9b4a69f8a27a2e4fbb1fe1d0dbfb6583f1

Sie m├╝ssen den Input des Hashes nicht kennen, um Gelder f├╝r ihn zu sperren. Der das Geld ausgeben will, muss jedoch das Skript bereitstellen, das zum Hashing verwendet wurde, und muss die Bedingungen dieses Skripts erf├╝llen.

Der obige Hash wurde aus dem folgenden Skript erstellt:

<multiply by 2> <4> <check if equal>

Wenn Sie die an diesen scriptPubKey gebundenen Coins ausgeben wollen, stellen Sie nicht nur diese Befehle zur Verf├╝gung. Sie ben├Âtigen auch ein scriptSig, das das abgeschlossene Skript als Wahr (True) auswerten l├Ąsst. In diesem Beispiel ist es das Element <multiply by 2>, mit dem Sie mit Zwei multiplizieren, und ein Ergebnis von <4> erhalten. Das bedeutet nat├╝rlich, dass unser scriptSig nur <2> ist.

Im wirklichen Leben ist der scriptPubKey f├╝r eine P2SH-Ausgabe:

OP_HASH160 <redeemScript hash> OP_EQUAL

Hier gibt es keine neuen Operators. Aber, wir haben <redeemScript hash> als ein neues Element. Wie der Name schon andeutet, handelt es sich dabei um einen Hash des Skripts, das wir zum Einl├Âsen der Gelder bereitstellen m├╝ssen (das sogenannte redeemScript). Das ScriptSig ├Ąndert sich je nachdem, was im redeemScript steht. Im Allgemeinen werden Sie jedoch feststellen, dass es sich um eine Kombination aus Signaturen und den beigef├╝gten ├Âffentlichen Schl├╝sseln handelt, gefolgt vom (obligatorischen) redeemScript:

<signature> <public key> <redeemScript>

Unsere Bewertung unterscheidet sich ein wenig von der bisherigen Stapel-Ausf├╝hrung, die wir bisher gesehen haben. Sie erfolgt in zwei Teilen. Der erste pr├╝ft einfach, ob Sie den richtigen Hash angegeben haben.



Sie werden feststellen, dass wir nichts mit den Elementen tun, die dem redeemScript vorausgehen. Sie werden an dieser Stelle nicht verwendet. Wir sind am Ende dieses Mini-Programms angelangt, und das oberste Element ist ungleich Null. Das bedeutet, dass es g├╝ltig ist.

Aber wir sind noch nicht ganz fertig. Die Netzwerk-Nodes erkennen diese Struktur als P2SH, so dass sie die Elemente des scriptSig tats├Ąchlich in einem anderen Stapel bereitgestellt haben. Dort werden die Signatur und der ├Âffentliche Schl├╝ssel verwendet.
Bisher haben wir das redeemScript als ein Element behandelt. Aber jetzt wird es als eine Folge von Instruktionen interpretiert, die alles M├Âgliche bewirken k├Ânnen. Nehmen wir das Beispiel eines P2PKH-Sperr-Skripts, dem wir die <signature> und den <public key> ├╝bergeben m├╝ssen, die zu einem <public key hash> innerhalb des <redeemScript> passen.



Sobald Ihr redeemScript erweitert wurde, k├Ânnen Sie sehen, dass wir eine Situation haben, die genau wie eine normale P2PKH-Transaktion aussieht. Von dort aus f├╝hren Sie sie einfach wie eine normale Transaktion aus.

Wir haben hier ein so genanntes P2SH(P2PKH)-Skript demonstriert, aber es ist unwahrscheinlich, dass Sie so etwas in der freien Wildbahn finden werden. Nichts hindert Sie daran, eines zu machen, aber es bietet Ihnen keine zus├Ątzlichen Vorteile und nimmt am Ende mehr Platz in einem Block ein (und kostet daher mehr).

P2SH ist im Allgemeinen n├╝tzlich f├╝r Dinge wie Multisignatur- oder SegWit-kompatible Transaktionen. Multisig-Transaktionen k├Ânnen sehr gro├č sein, da sie m├Âglicherweise mehrere Schl├╝ssel erfordern. Vor der Implementierung von Pay-to-Script-Hash m├╝sste ein Absender alle m├Âglichen ├Âffentlichen Schl├╝ssel in seinem Sperr-Skript auflisten.┬á

Bei P2SH spielt es jedoch keine Rolle, wie komplex die Ausgabebedingungen sind. Der Hash des redeemScript hat immer eine feste Gr├Â├če. Die Kosten werden daher an den/die Benutzer weitergegeben, die das Sperr-Skript entsperren wollen.

Die SegWit-Kompatibilit├Ąt ist ein weiterer Fall, in dem P2SH sich als n├╝tzlich erweist (auf die Einzelheiten, wie sich die Transaktionsstruktur unterscheidet, gehen wir im n├Ąchsten Abschnitt ein). SegWit war ein Soft Fork, welcher zu einer ├änderung der Block-/Transaktionsformate f├╝hrte. Da es sich um ein Opt-In-Upgrade handelt, erkennt nicht jede Wallet-Software diese ├änderungen.

Das spielt keine Rolle, wenn Clients den SegWit-Skript-Hash in P2SH einpacken. Wie bei allen Transaktionen dieser Art m├╝ssen sie nicht wissen, wie das entsperrende redeemScript aussehen wird.


SegWit-Transaktionen (P2WPKH und P2WSH)

Eine umfassendere Einf├╝hrung in SegWit finden Sie in dem Artikel Segregated Witness (SegWit) f├╝r Einsteiger.
Um das Transaktionsformat in SegWit zu verstehen, m├╝ssen Sie nur wissen, dass wir nicht mehr nur ein scriptSig und einen scriptPubKey haben. Jetzt haben wir auch ein neues Feld namens Witness. Die Daten, die wir im scriptSig aufbewahrt haben, werden zum Witness verschoben, so dass das scriptSig leer ist.

Sie haben eventuell bereits Adressen gesehen, die mit ÔÇśbc1ÔÇÖ beginnen, diese nennen wir SegWit-native (im Gegensatz zu SegWit-kompatiblen Adressen, die mit einer ÔÇś3ÔÇÖ beginnen, da es sich um P2SH-Adressen handelt).


Pay-to-Witness-Pubkey-Hash (P2WPKH)

Pay-to-Wit-Pubkey-Hash (P2WPKH) ist die SegWit-Version von P2PKH. Unser Witness sieht wie folgt aus:

<signature> <public key>

Sie werden feststellen, dass dies dasselbe ist wie das scriptSig von P2PKH. Hier ist das scriptSig leer. W├Ąhrenddessen ├Ąhnelt das scriptPubKey dem folgenden:

<OP_0> <public key hash>

Das sieht ein bisschen merkw├╝rdig aus, nicht wahr? Wo sind die Opcodes, mit denen wir die Signatur, den ├Âffentlichen Schl├╝ssel und seinen Hash vergleichen k├Ânnen?

Wir zeigen hier keine zus├Ątzlichen Operatoren, weil die Nodes, die die Transaktion erhalten, wissen, was sie mit ihr zu tun haben, basierend auf der L├Ąnge des <public key hash>. Sie werden die L├Ąnge berechnen und verstehen, dass sie im gleichen Stil ausgef├╝hrt werden muss wie eine gute alte P2PKH-Transaktion.
Nodes ohne Upgrade wissen nicht, wie sie die Transaktion auf diese Weise interpretieren sollen, aber das spielt keine Rolle. Nach den alten Regeln gibt es keinen Witness, also lesen sie ein leeres scriptSig und einige Daten. Sie werten dies aus und kennzeichnen es als g├╝ltig ÔÇô was sie betrifft, k├Ânnte jeder die Ausgabe ausgeben. Aus diesem Grund wird SegWit als r├╝ckw├Ąrtskompatibler Soft Fork betrachtet.


Pay-to-Witness-Script-Hash (P2WSH)

Pay-to-Witness-Script-Hash (P2WSH) ist das neue P2SH. Wenn Sie es bis hierher geschafft haben, k├Ânnen Sie sich wahrscheinlich denken, wie es aussehen wird, aber wir werden es trotzdem durchgehen. Unser Witness ist das, was wir normalerweise in das scriptSig eingeben w├╝rden. In einem P2WSH, das zum Beispiel eine P2PKH-Transaktion einbindet, k├Ânnte es etwa so aussehen:

<signature 1> <public key>

Hier ist unser scriptPubKey:

<OP_0> <script hash>

Es gelten die gleichen Regeln. SegWit-Nodes lesen die L├Ąnge des Script-Hashes und stellen fest, dass es sich um eine P2WSH-Ausgabe handelt, die ├Ąhnlich wie P2SH ausgewertet wird. In der Zwischenzeit sehen alte Nodes es einfach als eine Ausgabe an, die jeder ausgeben kann.


Fazit

In diesem Artikel haben wir ein wenig ├╝ber die Bausteine von Bitcoin gelernt. Lassen Sie uns diese kurz zusammenfassen:


Script-TypBeschreibung

Pay-to-Pubkey (P2PK)

Sperrt Gelder f├╝r einen bestimmten ├Âffentlichen Schl├╝ssel

Pay-to-Pubkey-Hash (P2PKH)

Sperrt Gelder f├╝r den Hash eines bestimmten ├Âffentlichen Schl├╝ssels (d. h. eine Adresse)

Pay-to-Script-Hash (P2SH)

Sperrt Gelder f├╝r den Hash eines Scripts, das der Empf├Ąnger zur Verf├╝gung stellen kann

Pay-to-Witness-Pubkey-Hash (P2WPKH)

Die SegWit-Version von P2PK

Pay-to-Witness-Script-Hash (P2WSH)

Die SegWit-Version von P2SH


Wenn man sich erst einmal tiefer in Bitcoin vertieft hat, beginnt man zu verstehen, warum es so viel Potenzial hat. Transaktionen k├Ânnen sich aus vielen verschiedenen Komponenten zusammensetzen. Durch die Manipulation dieser Bausteine haben die Nutzer ein hohes Ma├č an Flexibilit├Ąt, wenn es darum geht, Bedingungen festzulegen, wie und wann Mittel ausgegeben werden k├Ânnen.