Segwit-Txin. Zeugendatenverknüpfung

Ich versuche, mehr über das Bitcoin-Protokoll zu erfahren, und ich schreibe eine Python-Software, um eine leichte Brieftasche zu erstellen. Ich bin ziemlich weit fortgeschritten und bin auf etwas gestoßen, das ich nicht wirklich verstehe, während ich über Änderungen des getrennten Zeugenprotokolls in Bezug auf Transaktionen lese.

https://bitcoincore.org/en/segwit_wallet_dev/

Wenn Sie hierher gehen und den Teil mit der Überschrift "Transaktionsserialisierung" lesen, lautet der Text folgendermaßen:

Wenn ein Txin keinen Witness-Daten zugeordnet ist, ist sein entsprechendes Witness-Feld genau 0x00, was anzeigt, dass die Anzahl der Witness-Stack-Elemente Null ist.

Woher weiß ich, ob eine Eingabe, die ich in meinem Skript verwende, Zeugendaten zugeordnet ist? Ich habe versucht, öffentliche APIs zu verwenden, um die von mir verwendeten Ausgaben zu betrachten, und ich kann nicht verstehen, was das bedeutet. Ich sehe Zeugenfelder, die den Eingaben der Transaktion zugeordnet sind, die die Ausgaben erzeugt haben, die ich in meine Transaktion einzubeziehen versuche, aber nicht umgekehrt.

Versuchen Sie, eine Transaktion zu erstellen oder eine vorhandene zu analysieren?
Versuch, eine Transaktion zu erstellen. Ich würde die Adressen verwenden, um es zu bestimmen, aber ich weiß, dass es unmöglich ist, einen P2SH von einem P2SH-P2WPKH zu unterscheiden
Sie müssen wissen, was Sie unterschreiben. Offensichtlich können Sie ohne den privaten Schlüssel keine Signatur erstellen; Ebenso müssen Sie wissen, ob es sich um ein Multisig oder P2SH oder P2WPKH oder welches Skript Sie auch immer signieren. Die Adresse ist nie genug.
Verstanden. Wenn ich also ein bech32 oder ein p2sh-p2wpkh habe, wird die Eingabe, die ich besitze, immer als mit Zeugendaten verknüpft eingestuft? Aber mit einer Legacy-Adresse wird es nie in Verbindung gebracht?
Die Ausgabe einer Segwit-Ausgabe erfordert immer einen Zeugen. Das Ausgeben einer Nicht-Segwit-Ausgabe erfordert niemals einen Zeugen. Aber ich sehe nicht, wie diese Informationen hilfreich sein sollen; Sie müssen immer noch genau wissen, wie Sie scriptSig und Witness konstruieren, was von der Art des Skripts abhängt, das Sie ausgeben. Es kommt einfach so vor, dass alle Segwit-Skripte einen nicht leeren Zeugen benötigen, während andere dies nicht tun.
Ich versuche nur, das Serialisierungsformat dynamisch zu ändern, je nachdem, ob ich eine Ausgabe von einer Segwit- oder keiner Segwit-Adresse ausgeben möchte.
Die Serialisierung hängt nicht von der Ausgabe ab; nur die Daten, die serialisiert werden, tun dies. Das Null-Byte zeigt in jeder Situation nur "leeres Zeugnis" an (entweder Ausgabe einer Segwit- oder Nicht-Segwit-Ausgabe). Ein nicht leerer Zeuge kann nicht in einer gültigen Transaktion auftreten, die eine Nicht-Segwit-Ausgabe ausgibt, aber Ihr Serialisierer sollte sich darum nicht kümmern.
Ich fange an zu verstehen. Danke
Eine Sache noch. Ich sollte wahrscheinlich eine andere Frage eröffnen, aber ich denke, es wäre eine Wiederholung von bitcoin.stackexchange.com/questions/61290/… . Wenn ich mehrere Eingaben habe, wie hoch wäre der Betrag für das Hash-PreImage? Ich denke, die Menge der letzten Eingabe, aber ich bin mir nicht sicher. Es ist nicht sehr klar.
Der Betrag, der von der Eingabe ausgegeben wird, für die Sie unterschreiben.
Aber in den Beispielen in github.com/bitcoin/bips/blob/master/bip-0143.mediawiki hat er mehrere Eingaben, aber er signiert nur einmal. Das ist so verwirrend.
In der/den Signatur(en) für Input 1 unterschreiben Sie den Betrag, den Input 1 ausgibt. In der/den Signatur(en) für Input 2 unterschreiben Sie den Betrag, den Input 2 ausgibt, usw.
Wusste nicht, dass Sie jede Eingabe separat signieren müssen. Das ist frustrierend.
Es ist wirklich der einzige Weg. Jede Eingabe kann nicht zusammenhängende Ausgaben ausgeben (jede von einer anderen Adresse, mit unterschiedlichen Schlüsseln – alle diese Schlüssel müssen sich abmelden, um die Transaktion zu autorisieren). Aus diesem Grund gibt es auch einen scriptSig/Witness pro Eingabe und nicht einen global für die gesamte Transaktion. Es wird laufend geforscht, wie Multisignatur-Schemata in Bitcoin integriert werden können, was eine einzige Signatur ermöglichen würde, die alle abgezeichneten Schlüssel nachweist, aber das wird in absehbarer Zeit nicht verfügbar sein.

Antworten (1)

Woher weiß ich, ob eine Eingabe, die ich in meinem Skript verwende, Zeugendaten zugeordnet ist? Ich habe versucht, öffentliche APIs zu verwenden, um die von mir verwendeten Ausgaben zu betrachten, und ich kann nicht verstehen, was das bedeutet. Ich sehe Zeugenfelder, die mit den Eingaben der Transaktion verbunden sind, die die Ausgaben erzeugt haben, die ich in meine Transaktion einzubeziehen versuche, aber nicht umgekehrt.

Ich glaube, Ihre Verwirrung ist auf diese Zeile zurückzuführen

Wenn ein Txin keinen Witness-Daten zugeordnet ist, ist sein entsprechendes Witness-Feld genau 0x00, was anzeigt, dass die Anzahl der Witness-Stack-Elemente Null ist.

bezieht sich nicht auf das Serialisierungsformat, sondern auf den Inhalt.

Ein Zeuge wird immer wie folgt serialisiert:

  • Eine Ganzzahl variabler Länge, die die Anzahl der Witness-Stack-Elemente n angibt .
  • Für jedes der n Stapelelemente:
    • Eine Ganzzahl variabler Länge, die die Größe des Stack-Elements angibt b
    • Ein b -Byte-Array mit dem Inhalt dieses Stack-Elements.

Eine Folge davon ist, dass ein leerer Zeuge immer nur als 0x00-Byte serialisiert wird (was darauf hinweist, dass keine Stapelelemente vorhanden sind).

Ihr Serialisierungs- und Parsing-Code muss also nicht wissen, ob ein bestimmtes TXin zugehörige Zeugendaten hat. Es serialisiert/parst nur den Zeugen, der leer sein kann.

Es kommt vor, dass die Gültigkeitsregeln erfordern, dass der Zeuge für eine Nicht-Segwit-Ausgabe immer leer sein muss, und die Serialisierung eines solchen Zeugen daher immer nur 0x00 ist.