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?
web3
unterstü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 27
Ihre v
.
Bei einer Signatur sgn
einer gehashten Nachricht msg
kö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 .
0xdeadbeef
und 0xd3fe64b6f0920593cc4afb1321d592ae91e25fe1a0216e9002a4a6580fb2698c5ec62491c62557b8cc8f64533a5097b3ffb68208952b30cb27ed0a56ae21682201
es ist sehr unklar, wie man ecrecover
in dieser Bibliothek verwendet, um die Adresse, die sie signiert hat, tatsächlich zu validieren.v = utils.toBuffer(27) //assuming that the given value was 0
sollte 27 + der letzte Hexadezimalwert der Signatur (0 oder 1) sein.utils
der v
Parameter in eine Zahl sein sollte, also sollte die v-Zeile lauten:v = utils.bufferToInt(utils.toBuffer('0x' + sgn.slice(130,132)))
Ab v1.0 können Sie web3.eth.accounts.recover verwenden
// message, signature
web3.eth.accounts.recover('Some data', '0xb91467e570a6466aa9e9876cbcd013baba02900b8979d43fe208a4a4f339f5fd6007e74cd82e037b800186422fc2da167c747ef045e5d18a5f5d4300f8e1a0291c');
> "0x2c7536E3605D9C16a7a3D7b1898e529396a65c23"
eur10
JB
enrique_83