Wenn eine Segwit-Eingabe signiert wird, verpflichtet sich die Signatur zum Witness-Skript (oder einem p2pkh-ähnlichen Skript im Fall von p2wpkh). Dies ist in BIP143 angegeben :
- Für
P2WPKH
das ZeugenprogrammscriptCode
ist das0x1976a914{20-byte-pubkey-hash}88ac
.- Für
P2WSH
das Zeugenprogramm,
- wenn die
witnessScript
keine enthältOP_CODESEPARATOR
,scriptCode
ist diewitnessScript
darin als Skript serialisiertCTxOut
.- wenn der
witnessScript
irgendwelche enthältOP_CODESEPARATOR
,scriptCode
wird derwitnessScript
aber alles bis einschließlich des letztenOP_CODESEPARATOR
vor der Ausführung der Signaturprüfung ausgeführten Opcodes entfernt und als Skripte innerhalb von serialisiertCTxOut
. (Die genaue Semantik wird in den Beispielen unten demonstriert)
Was ist der Grund dafür? Warum verpflichtet sich der Hash nicht zum Pubkey-Skript wie bei Legacy-Zahlungen (p2pkh und p2sh)? Dieser Unterschied erschwert das Signieren/Bestätigen des Codes ein wenig, daher muss es wohl einen guten Grund dafür geben.
Vielleicht sollte meine Frage lauten: Warum verpflichtet sich der Hash überhaupt zu irgendeinem Skript für Segwit-Eingaben? Bei älteren Signaturen ist das Einfügen von scriptPubkey in scriptSig für die aktuelle Eingabe eine (komplizierte, siehe unten) Möglichkeit, die Wiederverwendung von Signaturen zwischen Eingaben zu vermeiden. outpoint
Aber in Segwit wird dies mit einem Teil des Hashing-Algorithmus erreicht . Könnten wir den scriptCode
Teil nicht einfach überspringen?
Es scheint mir, dass es einen anderen Grund gibt, warum wir das scriptPubkey für Legacy-Signaturen und das Witness-Skript für Segwit-Signaturen hashen, da es einfachere Möglichkeiten gibt, die Wiederverwendung von Signaturen zu vermeiden:
Ich vermute nur, aber indem wir die Transaktion an den scriptCode übergeben, stellen wir sicher, dass der Unterzeichner weiß, für welches Skript er signiert. Eine Hardware-Wallet kann zum Beispiel nur dann sicher sein, dass Outpoint 1234...cdef:0 ein bestimmtes Skript bezahlt, wenn wir ihr die Transaktion geben, die diesen Outpoint erstellt hat (damit sie diese Transaktion hashen kann, die txid überprüfen, den scriptPubKey extrahieren kann , und vergleichen Sie dies mit einem bereitgestellten WitnessScript). Da eine Transaktion (ohne Zeugendaten) bis zu fast einem Megabyte groß sein kann und eine Ausgabentransaktion auf Tausende früherer Transaktionen verweisen kann, schaffen wir eine Situation, in der ressourcenarme Geräte wie Hardware-Wallets es schwer haben, zu überprüfen, was sie sind. neu unterschreiben.
Im Gegensatz dazu müssen wir bei BIP143 dem Wallet nur jeden der scriptCodes mitteilen, für den es signieren soll. BIP141 erlaubt diese bis zu 10.000 Byte, was nur 1/100 der maximalen Größe einer Transaktion ist. Das Wallet kann diese scriptCodes untersuchen, sicherstellen, dass sie mit den Erwartungen des Wallets übereinstimmen, und sich in seiner Signatur darauf verpflichten, zu wissen, dass die Signatur ungültig ist, wenn die Person, die ihnen den scriptCode sendet, über den tatsächlichen scriptCode gelogen hat.
Aus dem gleichen Grund legt das BIP143-Signaturformat den Wert jeder Eingabe fest. Zuvor musste es frühere Transaktionen verarbeiten, um ihre Ausgabebeträge zu erhalten; Jetzt akzeptiert es einfach alle Daten, die es erhält, und signiert es in dem Wissen, dass die Signatur ungültig ist, wenn jemand es bezüglich des Betrags belügt.
Kalle Rosenbaum
David A. Harding
Kalle Rosenbaum
Kalle Rosenbaum