Ich versuche, eine Rohtransaktion für Bitcoin Cash Testnet zu erstellen. Ich habe viel von dieser sehr netten Antwort zum Erstellen einer Rohtransaktion profitiert, bin aber immer noch nicht in der Lage, selbst eine korrekte zu erstellen. Ich möchte die erste Ausgabe 7098b2735336c85077e9704cb8ba521f5c2d92f768081345c5ded26c52fcc1a9 ausgeben .
Hier ist, was ich tue:
Erstellen Sie eine Transaktion mit dem vorherigen Transaktions-Hash und Index mit der scriptSig, die mit dem scriptPubKey der Ausgabe ausgefüllt ist, die ich einlösen möchte. Die Rohtransaktion sieht so aus:
01000000
01
a9c1fc526cd2dec545130868f7922d5c1f52bab84c70e97750c8365373b29870
00000000
19
76a914edc822bff914a255b819156c70e19dd09e8c0f6a88ac
ffffffff
01
80d6e34c00000000
19
76a9147971da00aa2aae27e2ff5d801a602014453c4c2c88ac
00000000
Daran hänge ich einen Vier-Byte-Hashcode vom Typ 41000000 an.
01000000
01
a9c1fc526cd2dec545130868f7922d5c1f52bab84c70e97750c8365373b29870
00000000
19
76a914edc822bff914a255b819156c70e19dd09e8c0f6a88ac
ffffffff
01
80d6e34c00000000
19
76a9147971da00aa2aae27e2ff5d801a602014453c4c2c88ac
00000000
41000000
Jetzt berechne ich den sha256-Hash davon zweimal, was ergibt:
f6b38f93c859db4920f22a1cd07d6c615a503ce89a7b2a3d90babad521b26062
Jetzt unterschreibe ich das Ergebnis in 3. Hier könnte ich etwas falsch machen. Die Signatur ergibt:
r = 767fb3ae5c9cab9a5afae16289e672a9723bcea919c429fc9cc6449d0baa6131
s = 6dcaab24e992565473c0e080d934df239c3bbb5f7869ac92d93f598a9e646136
und dann kodiere ich es in DER-Format als
30440220767fb3ae5c9cab9a5afae16289e672a9723bcea919c429fc9cc6449d0baa613102206dcaab24e992565473c0e080d934df239c3bbb5f7869ac92d93f598a9e646136
Sieht das richtig aus?
An diese Signatur füge ich den Ein-Byte-Hashcode Typ 41 an:
30440220767fb3ae5c9cab9a5afae16289e672a9723bcea919c429fc9cc6449d0baa613102206dcaab24e992565473c0e080d934df239c3bbb5f7869ac92d93f598a9e64613641
Dann stelle ich die Länge des Ergebnisses von 5 voran:
4730440220767fb3ae5c9cab9a5afae16289e672a9723bcea919c429fc9cc6449d0baa613102206dcaab24e992565473c0e080d934df239c3bbb5f7869ac92d93f598a9e64613641
Dann hänge ich 2103ce9f14cccee963def0f3a50978daa2dd91905eb11958da2c83e44c0ebb585c72
(die Länge des öffentlichen Schlüssels + den tatsächlichen öffentlichen Schlüssel) an das Ergebnis von 6 an und erhalte:
4730440220767fb3ae5c9cab9a5afae16289e672a9723bcea919c429fc9cc6449d0baa613102206dcaab24e992565473c0e080d934df239c3bbb5f7869ac92d93f598a9e646136412103ce9f14cccee963def0f3a50978daa2dd91905eb11958da2c83e44c0ebb585c72
Das Ergebnis von 7 ist meine Signatur, ihre Länge ist 0x6a, also ersetze ich jetzt scriptSig_length und scriptSig in 1 mit diesen Daten, was ergibt:
01000000
01
a9c1fc526cd2dec545130868f7922d5c1f52bab84c70e97750c8365373b29870
00000000
6a
4730440220767fb3ae5c9cab9a5afae16289e672a9723bcea919c429fc9cc6449d0baa613102206dcaab24e992565473c0e080d934df239c3bbb5f7869ac92d93f598a9e646136412103ce9f14cccee963def0f3a50978daa2dd91905eb11958da2c83e44c0ebb585c72
ffffffff
01
80d6e34c00000000
19
76a9147971da00aa2aae27e2ff5d801a602014453c4c2c88ac
00000000
Dies ist meine Rohtransaktion, aber wenn ich versuche, sie zu senden, erhalte ich die folgende Fehlermeldung:
16: mandatory-script-verify-flag-failed (Signature must be zero for failed CHECK(MULTI)SIG operation)
Kann mir jemand sagen was ich falsch gemacht habe? Danke sehr!
Bitcoin Cash verwendet nicht das ursprüngliche Bitcoin-Sighash-Schema (was so aussieht, wie Sie es hier versuchen).
Stattdessen verwendet es eine Variante des Sighash-Schemas, das in BIP143 vorgeschlagen wurde (das für Segregated Witness-Transaktionen in Bitcoin verwendet wird).
Obwohl Sie die Schritte korrekt befolgt haben, versuchen Sie, das Rad "neu zu erfinden", indem Sie versuchen, es selbst über ein Python-Skript zu signieren. Die Bitcoin Cash-Software stellt Ihnen genau wie Bitcoin die JSON-RPC-APIs zur Verfügung. Diese APIs folgen der Referenzimplementierung und liefern Ihnen bereits alle Schritte, die Sie gerade ausgeführt haben. Als Beispiel/Tutorial können Sie das auf bitcoin.org verfügbare Tutorial durchgehen, das sehr prägnant und erklärend ist.
Beachten Sie, dass Sie einen laufenden Knoten benötigen, um auf die APIs zugreifen zu können
craigpastro