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!
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 \n
sich 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
.
@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 toSign
Hex-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 eigentliche Signierung ist jedoch für „Sign Message“ und „Sign Transaction“ gleich .
Hoffentlich spart dies etwas Recherchezeit für andere mit einem ähnlichen Anwendungsfall.
entfernen
Andreas Chow
Nur Kevin