У меня есть вопрос о восстановлении публичного адреса из подписи.
Я следую этому уроку https://www.toptal.com/ethereum/one-click-login-flows-a-metamask-tutorial. Для внешнего интерфейса я использую Angular и для внутреннего Java
В front-end я отправляю подпись, подписанную с помощью web3js.
this.web3Service.getWeb3().eth.personal.sign(
this.web3Service.getWeb3().utils.fromUtf8('I am signing my one-time nonce ' + this.currentUser.nonce),
this.currentUser.ethereumAddress
).then(signature => {
this.authenticationService.authenticate(signature, this.currentUser.ethereumAddress).subscribe();
});
В серверной части я получаю подпись и публичный адрес пользователя. Я пытаюсь воссоздать этот код в Java
const msg = `I am signing my one-time nonce: ${user.nonce}`;
// We now are in possession of msg, publicAddress and signature. We
// can perform an elliptic curve signature verification with ecrecover
const msgBuffer = ethUtil.toBuffer(msg);
const msgHash = ethUtil.hashPersonalMessage(msgBuffer);
const signatureBuffer = ethUtil.toBuffer(signature);
const signatureParams = ethUtil.fromRpcSig(signatureBuffer);
const publicKey = ethUtil.ecrecover(
msgHash,
signatureParams.v,
signatureParams.r,
signatureParams.s
);
const addressBuffer = ethUtil.publicToAddress(publicKey);
const address = ethUtil.bufferToHex(addressBuffer);
// The signature verification is successful if the address found with
// ecrecover matches the initial publicAddress
if (address.toLowerCase() === publicAddress.toLowerCase()) {
return user;
} else {
return res
.status(401)
.send({ error: 'Signature verification failed' });
}
Есть ли в Java эквивалент для получения открытого ключа из подписи и сообщения?