Das deterministische Signieren eines Tx mit RFC6979 gibt zurück v, r, s
, wobei r
und s
die beiden Werte sind, die in Standard-ECDSA-Signaturen verwendet werden. v = 27 + (y % 2)
, also 27 + die Parität von r
, wie pybitcointools anzeigt .
Also für gerade r
bekommen wir v = 27
, ungerade r
bekommen wir v = 28
.
Wie wichtig ist der Wert von v
(27 oder 28)? Warum ist es notwendig, einen v
Wert zu haben? Außerdem, warum ist es 27
?
Das hat nichts mit RFC6979 zu tun, sondern mit ECDSA Signing und Public Key Recovery.
(r, s) ist die normale Ausgabe einer ECDSA-Signatur, wobei r als die X-Koordinate eines Punktes R berechnet wird, Modulo der Kurvenordnung n.
In Bitcoin verwenden wir für Nachrichtensignaturen einen Trick namens Public Key Recovery. Tatsache ist, dass Sie, wenn Sie den vollständigen R-Punkt (nicht nur seine X-Koordinate) und s sowie eine Nachricht haben, berechnen können, für welchen öffentlichen Schlüssel dies eine gültige Signatur wäre. Dies ermöglicht es, eine Nachricht mit einer Adresse zu „verifizieren“, ohne den vollständigen Schlüssel kennen zu müssen (wir führen einfach die Wiederherstellung des öffentlichen Schlüssels für die Signatur durch und hashen dann den wiederhergestellten Schlüssel und vergleichen ihn mit der Adresse).
Dies bedeutet jedoch, dass wir die vollständigen R-Koordinaten benötigen. Es kann bis zu 4 verschiedene Punkte mit einer gegebenen "X-Koordinate modulo n" geben. (2, weil jede X-Koordinate zwei mögliche Y-Koordinaten hat, und 2, weil r+n immer noch eine gültige X-Koordinate sein kann). Diese Zahl zwischen 0 und 3 nennen wir die Wiederherstellungs-ID oder Recid. Daher geben wir ein zusätzliches Byte zurück, das auch als Header-Byte fungiert, indem wir 27+recid (für unkomprimierte wiederhergestellte Pubkeys) oder 31+recid (für komprimierte wiederhergestellte Pubkeys) verwenden.
Genau genommen ist die Recid nicht erforderlich, da wir einfach alle möglichen Koordinatenpaare durchlaufen und prüfen können, ob eines davon mit der Signatur übereinstimmt. Die recid beschleunigt nur diese Überprüfung.
Wenn h der Kofaktor ist, beträgt im Allgemeinen die maximale Anzahl unterschiedlicher Punkte mit gegebener "X-Koordinate modulo n" 2(h+1). Im Fall von secp256k1 mit Cofaktor 1 erhalten wir 2(1+1) = 4.
There can be up to 4 different points with a given "X coordinate modulo n". (2 because each X coordinate has two possible Y coordinates, and 2 because r+n may still be a valid X coordinate).
Ich verstehe ersteres (2 y-Werte für jedes x wegen der Symmetrie) ... Aber wie funktioniert letzteres? dh r+n may still be a valid X coordinate
??Ich glaube nicht, dass das von Ihnen beschriebene v Teil von RFC6979 ist, da ich es in diesem Dokument nicht finden kann. Dieses v ist zufällig Teil der ecdsa_raw_sign
Rohzeichenfunktion in pybitcointools, die aufruft deterministic_generate_k
, was eine Implementierung von RFC6979 ist.
RFC6979 hilft Ihnen nur dabei, einen deterministischen k - Wert zum Signieren zu generieren. Es hilft Ihnen nicht, r und s zu generieren . Um r und s zu generieren , verwenden Sie einfach den normalen ECDSA-Algorithmus; Sie müssen nicht auf RFC6979 verweisen, nachdem Sie es zum Generieren von k verwendet haben . RFC6979 generiert k , was eine Eingabe für den Signaturalgorithmus ist, der r und s generieren kann .
v
erscheint über Implementierungen hinweg? Pybitcointools ist nicht die einzige Implementierung, die es verwendet, glaube ich.secp256k1_nonce_function_rfc6979
deren einzige Ausgabe ein 32-Byte-Datenpuffer ist.v
hat mit Signieren zu tun, nicht mit RFC6979.Wie alle anderen Antworten bereits skizzieren: v
ist erforderlich, um den richtigen öffentlichen Schlüssel für eine Signatur wiederherzustellen, da manchmal (auch mit geringer Wahrscheinlichkeit) mehr als ein gültiger öffentlicher Schlüssel durch eine Signatur abgerufen werden kann.
Hier ist ein Spickzettel:
27
unkomprimierter öffentlicher Schlüssel, y-Parität 0
, Größe x
kleiner als die Kurvenordnung28
unkomprimierter öffentlicher Schlüssel, y-Parität 1
, Größe x
kleiner als die Kurvenordnung29
unkomprimierter öffentlicher Schlüssel, y-Parität 0
, Größe x
größer als die Kurvenordnung30
unkomprimierter öffentlicher Schlüssel, y-Parität 1
, Größe x
größer als die Kurvenordnung31
komprimierter öffentlicher Schlüssel, y-Parität 0
, Größe x
kleiner als die Kurvenordnung32
komprimierter öffentlicher Schlüssel, y-Parität 1
, Größe x
kleiner als die Kurvenordnung33
komprimierter öffentlicher Schlüssel, y-Parität 0
, Größe x
größer als die Kurvenordnung34
komprimierter öffentlicher Schlüssel, y-Parität 1
, Größe x
größer als die KurvenordnungFür alle v >= 35
, die Sie möglicherweise mit Ethereum-Signaturen gemäß EIP-155 zu tun haben :
v = recovery_id + CHAIN_ID * 2 + 35
v
wird benötigt, um den öffentlichen Schlüssel wiederherzustellen. Als Ergebnis der Wiederherstellung des öffentlichen Schlüssels aus der ECDSA-Signatur können 0, 1 oder 2 Punkte zurückgegeben werden. Um genau anzugeben, welcher Punkt dem "ursprünglichen" öffentlichen Schlüssel entspricht, wird ein zusätzliches Byte verwendet
Morsecoder
David Grayson
Zauberer von Ozzie
Pieter Wuille