Zum Inhalt springen
buybitcoinsmart

Glossar / Entwicklerreferenz

Signatur-Skript

Auch bekannt als ScriptSig, Unlocking Script, Entsperrskript.

Was ist ein Signatur-Skript?
Ein Signatur-Skript sind die entsperrenden Daten, die ein Input mitführt, um das Pubkey-Skript des Outputs zu erfüllen, den er ausgibt, und bei modernen SegWit-Inputs ist es leer.

Jeder Input einer Transaktion verweist auf einen früheren Output und muss beweisen, dass er ihn ausgeben darf. Bitcoin Core nennt dieses Feld scriptSig; in einem alten Pay-to-Public-Key-Hash-Input enthält es eine Signatur von 71 oder 72 Byte und einen öffentlichen Schlüssel von 33 Byte, insgesamt rund 107 Byte. Seit SegWit liegt dieser Nachweis meist anderswo, und darin liegt der größte Teil des Grundes, warum eine Auszahlung an eine bech32-Adresse Sie weniger kostet.

Wie es funktioniert

Das Signatur-Skript wird zuerst ausgeführt und hinterlässt seine Ergebnisse auf dem Stack, damit das Skript des Outputs sie verbraucht. Die beiden laufen nicht als ein zusammenhängendes Programm: Sie werden nacheinander ausgeführt, wobei der Stack zwischen ihnen übergeben wird, eine Trennung, die 2010 eingeführt wurde, nachdem sich das ursprüngliche Design als ausnutzbar erwiesen hatte.

Die Weiterleitungsrichtlinie verlangt, dass dieses Feld nichts außer Daten-Pushes enthält. Keine Bedingung, keine Arithmetik, kein Opcode, der Arbeit verrichtet. Die Beschränkung besteht, weil der Ausgebende diese Bytes vollständig steuert, und wenn ein Angreifer beim Eingang Logik ausführen darf, öffnen sich Probleme wieder, die das Netzwerk längst geschlossen hat. Pay-to-Script-Hash macht die Regel zu einer Konsensanforderung statt zu einer Präferenz, da das Redeem-Skript als letzter einfacher Push ankommen muss.

Seine Größe hängt ganz davon ab, was es entsperrt. Ein alter Input mit einem einzigen Schlüssel führt eine Signatur und einen Schlüssel mit. Ein verschachtelter SegWit-Input führt genau 23 Byte mit, einen einzigen Push des 22 Byte großen Witness-Programms, und verschiebt alles Übrige in den Witness. Ein nativer bech32- oder bech32m-Input führt gar nichts mit: Das serialisierte Feld ist ein einziges Byte der Länge null.

Es gibt einen Input, dessen Signatur-Skript kein Nachweis für irgendetwas ist. Der einzige Input einer Coinbase-Transaktion hat keinen früheren Output zu entsperren, deshalb wird das Feld als freier Platz zwischen 2 und 100 Byte zweckentfremdet, und seit BIP-34 muss es mit der Blockhöhe beginnen. Miner haben dort seit 2009 Nachrichten, Abstimmungen und Witze signiert.

Wo Sie es sehen

Dekodieren Sie eine beliebige Transaktion, und jeder Input zeigt ein scriptSig-Objekt mit einer Assembler-Ansicht und einer Hex-Ansicht. Bei einem nativen SegWit- oder Taproot-Input sind beide leere Zeichenketten, während ein separates Witness-Feld die Daten enthält, und diese sichtbare Asymmetrie ist der schnellste Weg, auf einen Blick zu erkennen, welches Adressformat eine alte Transaktion verwendet hat.

Es erklärt außerdem ein häufig falsch gelesenes Stück Geschichte. Weil scriptSig in die Transaktions-ID einfloss, konnte ein Dritter eine Signatur neu kodieren, ohne sie ungültig zu machen, und die ID einer bereits übertragenen Transaktion ändern. Mt. Gox setzte im Februar 2014 Auszahlungen aus und machte genau dieses Verhalten dafür verantwortlich, obwohl eine spätere akademische Analyse der Blockchain ergab, dass das Volumen der manipulierten Transaktionen viel zu klein war, um die fehlenden Bitcoin zu erklären. SegWit beendete den Streit im August 2017, indem es die entsperrenden Daten ganz aus der Berechnung der ID nahm.

Signatur-Skript vs. Witness-Daten

Ein Signatur-Skript und Witness-Daten tragen beide dieselbe Art von Nachweis, und SegWit verlagerte die Aufgabe von einem zum anderen, ohne zu ändern, was eine Signatur bedeutet. Die Unterschiede, die für Sie zählen, sind Preis und Beständigkeit. Witness-Bytes werden mit einer Gewichtseinheit pro Byte berechnet, während Signatur-Skript-Bytes vier kosten, sodass dieselbe Transaktion mit einem einzelnen Schlüssel rund 148 virtuelle Bytes belegt, wenn der Nachweis im scriptSig mitreist, und rund 68, wenn er im Witness mitreist. Witness-Daten liegen zudem außerhalb der Transaktions-ID, sodass die Kennung einer Transaktion nicht unterwegs verändert werden kann. Ein alter Input nutzt noch das alte Feld, weshalb Bitcoin, die auf einer Adresse liegen, die mit 1 beginnt, bei jeder Bewegung unbemerkt mehr kosten.

Nicht zu verwechseln mit

Häufig gestellte Fragen

Warum ist das Signatur-Skript in meiner SegWit-Transaktion leer?

Weil Signatur und öffentlicher Schlüssel in das Witness-Feld gewandert sind, das mit einem Viertel des Gewichts berechnet wird. Ein leeres scriptSig in einem bech32-Input ist korrekt und zu erwarten, kein Zeichen dafür, dass etwas fehlgeschlagen ist.

Kann jemand mein Signatur-Skript ändern, nachdem ich die Transaktion übertragen habe?

Bei einem alten Input konnte ein Dritter einst die Signatur neu kodieren und die Transaktions-ID ändern, ohne die Transaktion ungültig zu machen. SegWit hat diese Möglichkeit für Witness-Inputs beseitigt, indem es die entsperrenden Daten aus der Kennung ausschließt.

Verwandte Begriffe

Mehr zum Thema Entwicklerreferenz

Diese Seite auf Englisch lesen