Unterschied zwischen Sign Message und Sign Transaction

Mit „Sign Message“ kann man den Besitz einer Adresse nachweisen.
Dies geschieht durch Signieren einer für Menschen lesbaren Zeichenkette mit dem zur Adresse gehörenden privaten Schlüssel.
Der Eigentümer stellt dann die Adresse, die Nachricht und die Signatur bereit, und jeder kann überprüfen, ob er tatsächlich den privaten Schlüssel der Adresse besitzt.
Die ECDSA-Signatur wird normalerweise im 65-Byte-Format ( Recovery byte + 32-byte R + 32-byte S) und base64-codiert bereitgestellt.

Es gibt jedoch auch eine andere Art der Signatur, die für "Sign Transaction" verwendet wird .
Für jede Eingabe einer Transaktion müssen einige Daten signiert werden. Diese Daten sind binäre Daten, die normalerweise im Hex-Format bereitgestellt werden.
Die entsprechende Signatur wird im 70-, 71- oder 72-Byte-DER-Format bereitgestellt.

In beiden Fällen wird die Nachricht (Nachrichtenfolge im ersten Fall und binäre Eingabedaten im zweiten Fall) in ein Byte-Array umgewandelt, und der private Schlüssel wird verwendet, um eine ECDSA-Signatur für dieses Nachrichten-Byte-Array zu generieren.
Das Ausgabeformat ist unterschiedlich, aber das 65-Byte-Format kann einfach in DER konvertiert werden.

Folglich dachte ich, dass ich einfach "Sign Message" (mit einer geringfügigen Änderung, sodass eine Hex-Zeichenfolge anstelle einer ASCII/UTF-8-Zeichenfolge erforderlich ist) verwenden könnte , um die hex-codierten Binärdaten einer Transaktion pro Eingabe zu signieren.
Ich habe das gemacht, die Signatur ins DER-Format konvertiert und versucht, die Transaktion zu senden, aber es hat nicht funktioniert, weil die Signatur falsch war.

Meine Frage ist also, was ist der Unterschied zwischen der Generierung von Signaturen durch "Sign Message" und "Sign Transaction" und warum sind sie nicht kompatibel?

Ist der Unterschied, dass bei „Sign Message“ zuerst ein Digest erstellt wird, der dann signiert wird, während bei „Sign Transaction“ (in der oben geschriebenen Bedeutung) die Eingabe bereits ein Digest ist, also nicht noch einmal gehasht werden sollte ?

Danke schön!

Antworten (2)

Ist der Unterschied, dass bei „Sign Message“ zuerst ein Digest erstellt wird, der dann signiert wird, während bei „Sign Transaction“ (in der oben geschriebenen Bedeutung) die Eingabe bereits ein Digest ist, also nicht noch einmal gehasht werden sollte ?

Nein. Es hat nichts mit dem Hashing zu tun. Außerdem ist die Eingabe nicht bereits ein Digest, sie muss vor dem Signieren gehasht werden. Sowohl die Nachricht als auch die Eingabedaten werden zweimal mit SHA256 gehasht.

Der Unterschied zwischen der Nachrichtensignierung und der Transaktionseingabesignierung besteht darin, dass die Nachrichtensignierung die Zeichenfolge Bitcoin Signed Message:\n(wobei es \nsich um ein Zeilenumbruchzeichen handelt, nicht wörtlich \n) der Nachricht voranstellt, bevor sie gehasht wird.

Darüber hinaus hat die 65-Byte-Signatur, die durch das Signieren von Nachrichten erzeugt wird, ein Byte am Anfang, das nicht Teil der kryptografischen Signatur selbst ist. Stattdessen handelt es sich um eine Wiederherstellungs-ID, sodass der korrekte öffentliche Schlüssel während der Überprüfung der signierten Nachricht aus der Signatur wiederhergestellt werden kann. Bei Transaktionssignaturen wird am Ende der Signatur ein anderes Byte angehängt, das vom Typ Sighash ist, normalerweise ist es das Byte 0x01.

Danke, @andrew Du schreibst, dass in der 65-Byte-Signatur am Ende ein Wiederherstellungsbyte steht. Das Wiederherstellungsbyte steht am Anfang (wie in meiner obigen Frage erwähnt). Außerdem, in welchen TX-Signaturen gibt es am Ende ein zusätzliches Byte? Im DER-Format gibt es andere DER-spezifische Bytes, die sich jedoch nicht auf Signhash beziehen. Ich habe versucht, meine Frage allgemein zu halten, aber vielleicht hätte ich erwähnen sollen, dass die TX-Eingabe, die ich signieren möchte, BlockCyphers toSign ist . Ich denke, das ist bereits ein Digest, also muss es nur noch unterschrieben werden.
Schade, das Recovery-Byte steht ja am Anfang. Wenn Sie eine Signatur, die Sie in eine Transaktion einfügen (oder eine Signatur, die Sie von einer Transaktion erhalten), richtig DER decodieren, werden Sie feststellen, dass am Ende ein zusätzliches Byte vorhanden ist. Dieses Byte entspricht dem Sighash-Typ.
Es sollte beachtet werden, dass die vorangestellte „magische Zeichenfolge“ ein Encoder-Byte mit vorangestellter Größe enthält, sodass es lautet „\x18Bitcoin Signed Message:\n“ (Dies unterscheidet sich vom Wiederherstellungsbyte in der Signatur).

@andrew lieferte hilfreiche Informationen, dass ein Hauptunterschied zwischen „Nachricht signieren“ und „Transaktion signieren“ darin besteht, dass „Nachricht signieren“ der zu signierenden Textnachricht intern eine benutzerdefinierte Zeichenfolge voranstellt.
Außerdem befasst sich seine Antwort mit dem Fall, wenn Sie alle Schritte der TX-Erstellung und -Signierung ausführen.

Ich habe versucht, meine anfängliche Frage allgemein zu halten, aber jetzt sehe ich, dass ich hätte erwähnen sollen, dass die TX-Daten pro Eingabe, die ich signieren möchte, das toSign- Array von BlockCypher sind.
In ihrer Dokumentation ist es nicht sofort klar, aber mit einigen Nachforschungen habe ich herausgefunden, dass die bereitgestellten toSignHex-Strings bereits zweimal mit SHA256 gehasht sind, sodass sie tatsächlich nur signiert werden müssen.
Wahrscheinlich gibt es auch andere Systeme, die solche Digests zum Signieren bereitstellen.

Wenn Sie also zusammenfassend ein externes System zum Erstellen von TXs verwenden, das Ihnen Daten zum Signieren mit Ihrem privaten Schlüssel bereitstellt, sind diese Daten möglicherweise bereits gehasht. Ein guter Indikator für einen solchen Digest ist, dass er 32 Bytes lang ist.
Es gibt mehrere Gründe, warum "Nachricht signieren" nicht standardmäßig zum Signieren solcher TX-Daten funktioniert:

  • Die TX-Daten sind Binärdaten (normalerweise im Hex-Format), und "Sign Message" erwartet ASCII/UTF-8-Strings.
  • "Nachricht signieren" fügt der zu signierenden Nachricht intern ein benutzerdefiniertes Präfix hinzu.
  • Die TX-Daten sind bereits gehasht, sollten also nicht erneut gehasht werden.
  • Die Ausgabe von „Sign Message“ ist eine 65-Byte-ECDSA-Signatur und nicht im DER-Format (kann leicht konvertiert werden).

Die eigentliche Signierung ist jedoch für „Sign Message“ und „Sign Transaction“ gleich .

Hoffentlich spart dies etwas Recherchezeit für andere mit einem ähnlichen Anwendungsfall.