Wie kann ich eine Signatur mit der web3-Javascript-API überprüfen?

Mit der Javascript-Web3-API kann ich eine Signatur wie folgt erstellen:

> web3.eth.sign(eth.coinbase, "0xdeadbeef")
"0xd3fe64b6f0920593cc4afb1321d592ae91e25fe1a0216e9002a4a6580fb2698c5ec62491c62557b8cc8f64533a5097b3ffb68208952b30cb27ed0a56ae21682201"

Jetzt möchte ich überprüfen, ob die Signatur korrekt ist; Dies in einem Vertrag zu tun, ist bereits an anderer Stelle dokumentiert , aber ich suche nach einer Möglichkeit, dies mithilfe von web3. (Wie) kann dies geschehen?

@euri10 danke, aber ich suche nach einer Antwort, für deren Überprüfung kein Vertrag erforderlich ist
(keine Antwort auf den Kommentar) Aber ich stecke bei ethereum.stackexchange.com/questions/15461/… fest - irgendwelche Vorschläge, was falsch ist? Danke schön

Antworten (2)

web3unterstützt dieses Feature noch nicht, aber es könnte mit web3 1.0 kommen .

In der Zwischenzeit können Sie die Ecrecover-Funktion von ethereumjs-utils verwenden . Beachten Sie, dass diese Funktion erwartet v, in {27, 28} zu sein, und da Ihre Signatur von Geth stammt (da sie noch keine Signaturen im kanonischen Format zurückgibt), müssen Sie 27Ihre v.

Bei einer Signatur sgneiner gehashten Nachricht msgkönnen Sie die ethereumjs-util-Bibliothek wie folgt verwenden:

r = utils.toBuffer(sgn.slice(0,66))
s = utils.toBuffer('0x' + sgn.slice(66,130))
v = utils.toBuffer('0x' + sgn.slice(130,132))
m = utils.toBuffer(msg)
pub = utils.ecrecover(m, v, r, s)
adr = '0x' + utils.pubToAddress(pub).toString('hex')

Um die Überprüfung in einem Soliditätsvertrag durchzuführen, sehen Sie sich diese Antwort an .

Obwohl diese Antwort technisch korrekt sein mag, fand ich sie nicht sehr nützlich. Insbesondere beginnend mit 0xdeadbeefund 0xd3fe64b6f0920593cc4afb1321d592ae91e25fe1a0216e9002a4a6580fb2698c5ec62491c62557b8cc8f64533a5097b3ffb68208952b30cb27ed0a56ae21682201es ist sehr unklar, wie man ecrecoverin dieser Bibliothek verwendet, um die Adresse, die sie signiert hat, tatsächlich zu validieren.
Die Antwort wurde detaillierter aktualisiert, hoffentlich wird das jetzt klarer
v = utils.toBuffer(27) //assuming that the given value was 0sollte 27 + der letzte Hexadezimalwert der Signatur (0 oder 1) sein.
Beachten Sie auch, dass utilsder vParameter in eine Zahl sein sollte, also sollte die v-Zeile lauten:v = utils.bufferToInt(utils.toBuffer('0x' + sgn.slice(130,132)))
Ich schlage vor, den Titel zu ändern und anzugeben, dass er für web3 0 ist.*
Gibt es diese Funktion jetzt?

Ab v1.0 können Sie web3.eth.accounts.recover verwenden

// message, signature
web3.eth.accounts.recover('Some data', '0xb91467e570a6466aa9e9876cbcd013baba02900b8979d43fe208a4a4f339f5fd6007e74cd82e037b800186422fc2da167c747ef045e5d18a5f5d4300f8e1a0291c');
> "0x2c7536E3605D9C16a7a3D7b1898e529396a65c23"