Используя javascript web3 API, я могу создать такую подпись :
> web3.eth.sign(eth.coinbase, "0xdeadbeef")
"0xd3fe64b6f0920593cc4afb1321d592ae91e25fe1a0216e9002a4a6580fb2698c5ec62491c62557b8cc8f64533a5097b3ffb68208952b30cb27ed0a56ae21682201"
Теперь я хотел бы убедиться, что подпись верна; это в контракте уже задокументировано в другом месте , но я ищу способ сделать это с помощью web3
. (Как это может быть сделано?
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)))
Начиная с версии 1.0 вы можете использовать web3.eth.accounts.recover
// message, signature
web3.eth.accounts.recover('Some data', '0xb91467e570a6466aa9e9876cbcd013baba02900b8979d43fe208a4a4f339f5fd6007e74cd82e037b800186422fc2da167c747ef045e5d18a5f5d4300f8e1a0291c');
> "0x2c7536E3605D9C16a7a3D7b1898e529396a65c23"
евро10
Джей Би
Энрике_83