Was kommt in das tx-Hash-Preimage, wenn mit 0x83 (SINGLE|ANYONECANPAY) signiert wird?

Ich habe ein Skript zum Erstellen einer P2WPKH-zu-P2WPKH-Transaktion (1 Eingabe, 1 Ausgabe) und signiere sie mit dem Sighash-Typ 0x01 SIGHASH_ALL.

Welche Felder müsste ich im tx-Digest-Preimage ändern, um die Signatur in eine Signatur mit dem Sighash-Typ 0x83 (SINGLE|ANYONECANPAY) umzuwandeln? Ich habe Probleme, die Dokumentation in bip_143 zu verstehen.

Als Referenz das tx-Digest-Preimage:

Double SHA256 der Serialisierung von:
1. nVersion der Transaktion (4-Byte Little Endian)
2. hashPrevouts (32-Byte Hash)
3. hashSequence (32-Byte Hash)
4. outpoint (32-Byte Hash + 4-Byte Little Endian)
5. scriptCode der Eingabe (serialisiert als Skripte innerhalb von CTxOuts)
6. Wert der Ausgabe, die von dieser Eingabe ausgegeben wird (8-Byte Little Endian)
7. nSequence der Eingabe (4-Byte Little Endian)
8. HashOutputs ( 32-Byte-Hash)
9. nLocktime der Transaktion (4-Byte-Little-Endian)
10. Sighash-Typ der Signatur (4-Byte-Little-Endian)

Antworten (1)

Von BIP143:

Wenn das ANYONECANPAY-Flag nicht gesetzt ist, ist hashPrevouts das doppelte SHA256 der Serialisierung aller Eingabe-Outpoints;

Andernfalls ist hashPrevouts ein uint256 von 0x0000......0000.

Alle Details, die Sie benötigen, finden Sie im BIP

Danke. Es fühlt sich an, als hätte ich jede Kombination aus dem Setzen von hashPrevouts, hashSequence, hashOutputs auf 0x0000 ...... 0000 sowie den Sighash-Typ selbst ausprobiert, aber ich erhalte immer wieder die Fehlermeldung: error message: non-mandatory-script -verify-flag (Signatur muss Null sein für fehlgeschlagene CHECK(MULTI)SIG-Operation) (Code 64)
Hast du dir den Code angeschaut? Vielleicht finden Sie es hilfreicher: github.com/bitcoin/bitcoin/blob/master/src/script/… oder in bcoin: github.com/bcoin-org/bcoin/blob/master/lib/primitives/…
Leider kenne ich cpp nicht, daher ist es ein bisschen schwer zu folgen
@Darius bcoin ist JavaScript, falls das hilft. Welche Sprache verwenden Sie, um diesen Seufzer zu berechnen?
Mit JavaScript kenne ich mich auch nicht aus. Ich verwende die Ecsda- und Hashlib-Bibliotheken in Python. Ich erstelle ein Skript basierend auf diesem Tutorial: github.com/zeltsi/segwit_tutorial/tree/master/transactions Falls Sie neugierig waren, sieht das (nicht funktionierende) Skript so aus: github.com/DariusParvin/temp/blob /Meister/…
Ich habe nur kurz nachgesehen - Sie müssen möglicherweise überprüfen, ob Ihre txid Little-Endian ist ...
vielen Dank. Ich weiß, dass alles andere in Ordnung ist, weil ich damit einen gültigen sighash_all tx erstellt habe. Von da an habe ich nur das Sighash-Flag auf 0x83 geändert, hashPrevouts, hashSequence, hashOutputs im Digest auf 0 gesetzt, aber der BTC-Kern sagt mir, dass die Signatur ungültig ist.
Ich bin froh zu sagen, dass ich es endlich gelöst habe. Es war ein dummer Fehler. Bei der Konvertierung von String nach Hex habe ich 32 Nullen gesetzt, was natürlich nur 16 Byte Nullen entsprach. Also ja, alle Informationen waren eindeutig im BIP und es war mein Fehler!