Es kann keine korrekte Rohtransaktion für das Bitcoin-Cash-Testnet erstellt werden

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:

  1. 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
    
  2. 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
    
  3. Jetzt berechne ich den sha256-Hash davon zweimal, was ergibt:

    f6b38f93c859db4920f22a1cd07d6c615a503ce89a7b2a3d90babad521b26062
    
  4. 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?

  5. An diese Signatur füge ich den Ein-Byte-Hashcode Typ 41 an:

    30440220767fb3ae5c9cab9a5afae16289e672a9723bcea919c429fc9cc6449d0baa613102206dcaab24e992565473c0e080d934df239c3bbb5f7869ac92d93f598a9e64613641
    
  6. Dann stelle ich die Länge des Ergebnisses von 5 voran:

    4730440220767fb3ae5c9cab9a5afae16289e672a9723bcea919c429fc9cc6449d0baa613102206dcaab24e992565473c0e080d934df239c3bbb5f7869ac92d93f598a9e64613641
    
  7. 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
    
  8. 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!

Antworten (2)

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).

Danke Pieter! Das war mir nicht klar. Ich werde diesen BIP lesen!

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

Danke Shabahat. Das Problem ist, dass ich meine Transaktion komplett offline erstellen möchte. Mir ist etwas in dem Link aufgefallen, den Sie zum Offline-Signieren gesendet haben, aber ich muss ihn noch einmal lesen, um ihn besser zu verstehen.
Die Transaktion bleibt offline, solange der von Ihnen ausgeführte Knoten die Transaktion nicht sendet (die einen separaten RPC hat). Gehen Sie durch den Link, Sie werden verstehen, was ich zu sagen versuche.