ScriptCode-Feld im P2SH-P2WPKH BIP-143-Testvektor

Ich versuche, die Bedeutung von scriptCodeim Zusammenhang mit der Ausgabe eines P2SH (P2WPKH) UTXO zu verstehen.

Ich habe bereits die folgende Antwort auf eine ähnliche Frage gelesen, aber sie behebt mein Missverständnis nicht vollständig.

Nachdem wir BIP141 für P2WPKH gelesen haben, das in BIP16 P2SH verschachtelt ist, wird uns gesagt, dass die Struktur wie folgt ist:

witness:      <signature> <pubkey>
scriptSig:    <0 <20-byte-key-hash>>
                  (0x160014{20-byte-key-hash})
scriptPubKey: HASH160 <20-byte-script-hash> EQUAL
                  (0xA914{20-byte-script-hash}87)

Mir ist aufgefallen, dass scriptCodeder Hash für jede Eingabe signiert wird. Kann jemand erklären, warum 1976a91479091972186c449eb1ded22b78e40d009bdf008988ac( dup hash160 [79091972186c449eb1ded22b78e40d009bdf0089] equalverify checksig) als Skriptcode (nach meinem Verständnis das scriptPubKey- oder Sperrskript) für ein p2sh(p2wpkh)UTXO verwendet wird? Dieses Skript entspricht einem p2pkhscriptPubKey (das ist hier sicherlich aus dem Zusammenhang gerissen)?

Ich verstehe die Reihenfolge der Ausführung als:

  1. witness <signature> <pubkey>und scriptSig <0 <20-byte-key-hash-compressed-pub-key>>werden auf den Stapel geschoben.
  2. Dann wird das scriptPubKey: HASH160 <20-byte-script-hash> EQUALmit dem Argument „redemountScript ( )“ ausgeführt <0 <20-byte-key-hash-compressed-pub-key>>, was schließlich zur Ausführung von CHECKSIG führt.

Warum sollte man ein einfügen, scriptCodedas einem Skript entspricht, das scheinbar aus dem Kontext gerissen ist und nicht verwendet wird?

Warum ist Folgendes wahr?

For P2WPKH witness program, the scriptCode is 0x1976a914{20-byte-pubkey-hash}88ac.

Es wird wie in dieser Javascript-Bibliothek referenziert prevOutScript: https://github.com/bitcoinjs/bitcoinjs-lib/blob/master/src/transaction.js#L396

Können Sie Ihre Frage klarer formulieren? In einem Teil erwähnen Sie, dass die Operatoren OP_EQUALVERIFY und OP_DUP in P2SH(P2WPKH) verwendet werden, was eindeutig nicht der Fall ist
@BlockGuru Das ist genau mein Punkt, warum enthält der Testvektor hier github.com/bitcoin/bips/blob/master/… das scriptCode-Feld: 1976a91479091972186c449eb1ded22b78e40d009bdf008988acwenn es eindeutig nicht verwendet wird? Es ist nicht intuitiv, soweit ich weiß, dass das Skript nur für ein p2pkh-Sperrskript PubKey relevant ist ...

Antworten (1)

Der, auf den Sie sich beziehen, ist Seufzen. 1976a91479091972186c449eb1ded22b78e40d009bdf008988ac (dup hash160 [79091972186c449eb1ded22b78e40d009bdf0089] equalverify checksigEs gibt keinen guten Grund, as in Segwit zu verwenden, scriptCodesondern die Anzahl der Änderungen zu begrenzen, die SegWit am ursprünglichen Seufzen vornimmt. Beim Entwerfen von SegWit wurden nur beabsichtigte Änderungen vorgenommen. Die Hash-Struktur bleibt gleich und enthält dieselben Daten. Die Sighash-Flags haben immer noch den gleichen Effekt. Das einzige, was sich in BIP-143 ändert, ist, dass einige Daten unter vorberechneten Hashes organisiert sind und die Eingabemengen darin einfließen.

In diesem Sinne wird der scriptCode also zu keinem Zeitpunkt ausgeführt? Es ist nur enthalten, um Änderungen am Protokoll zu reduzieren. Wenn ich dieses scriptCode-Feld entferne, sollte ich immer noch in der Lage sein, einen gültigen Hash zu generieren ...?
Wenn Sie den scriptCode ändern, ändert sich nach dem, was ich bekomme, der Hash der Nachricht, die Sie signieren. Andere Knoten, die die Transaktion verifizieren, betrachten die Signatur als ungültig.
Warum ist das wahr? -> Für das Zeugenprogramm P2WPKH lautet der scriptCode 0x1976a914{20-byte-pubkey-hash}88ac(gemäß bip143)
Ich kenne den Ursprung von Skriptcode nicht, aber in Bezug auf Ihre zweite Frage gehe ich davon aus, dass er in diesem Szenario gut erklärt werden kann. Stellen Sie sich vor, Sie haben ein Café und möchten alle Transaktionen in SegWit erstellen, um die Transaktionsgebühren zu reduzieren. Es ist jedoch ungewiss, ob Ihre Kunden Wallets haben, die SegWit unterstützen. Wenn Sie P2SH(P2WPKH) erstellen, sehen die Wallets anderer Kunden dies als normale P2SH-Transaktion und können Zahlungen daran leisten, ohne zu wissen, dass es sich um eine SegWit-Transaktion handelt. Wenn alle Wallets auf SegWit aktualisiert werden, wird davon ausgegangen, dass wir zur nativen BIP173-Adresse tendieren werden
@Malone der scriptCode ist in P2WPKH und P2SH(P2WPKH) gleich. 0x1976a914{20-byte-pubkey-hash}88ac. Nur dass für beide gezeigten Transaktionen unterschiedliche öffentliche Schlüssel verwendet wurden.