Как я могу проверить подпись с помощью API javascript web3?

Используя javascript web3 API, я могу создать такую ​​подпись :

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

Теперь я хотел бы убедиться, что подпись верна; это в контракте уже задокументировано в другом месте , но я ищу способ сделать это с помощью web3. (Как это может быть сделано?

@ euri10 спасибо, но я ищу ответ, для проверки которого не требуется контракт
(не ответ на комментарий) Но я застрял на ethereum.stackexchange.com/questions/15461/… - есть предложения, что не так? огромное спасибо

Ответы (2)

web3пока не поддерживает эту функцию, но она может появиться в web3 1.0 .

А пока вы можете использовать функцию ecrecover ethereumjs- utils . Обратите внимание, что эта функция vдолжна быть в {27, 28}, и, поскольку ваша подпись исходит от geth (поскольку она еще не возвращает подписи в каноническом формате), вам придется добавить 27в свой файл v.

Получив подпись sgnхешированного сообщения msg, вы можете использовать библиотеку ethereumjs-util следующим образом:

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')

Чтобы выполнить проверку в контракте на солидность, ознакомьтесь с этим ответом .

Хотя этот ответ может быть технически правильным, я не нашел его очень полезным. В частности, начиная с 0xdeadbeefи 0xd3fe64b6f0920593cc4afb1321d592ae91e25fe1a0216e9002a4a6580fb2698c5ec62491c62557b8cc8f64533a5097b3ffb68208952b30cb27ed0a56ae21682201очень непонятно, как использовать ecrecoverв этой библиотеке фактическую проверку адреса, подписавшего ее.
Обновил ответ более подробно, надеюсь, теперь это будет более понятно
v = utils.toBuffer(27) //assuming that the given value was 0должно быть 27 + последнее шестнадцатеричное значение подписи (0 или 1).
Также стоит отметить, что в utils, vпараметр должен быть числом, поэтому строка v должна выглядеть так:v = utils.bufferToInt(utils.toBuffer('0x' + sgn.slice(130,132)))
Предлагаю изменить заголовок, указав, что это для web3 0.*
Есть ли сейчас этот функционал?

Начиная с версии 1.0 вы можете использовать web3.eth.accounts.recover

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