EDITAR: Problema resuelto; ejemplo de trabajo de inicio de sesión a continuación
Uso el sha3 de un mensaje que quiero firmar con eth.signm = web3.sha3("Please work.")
entonces corroeth.sign(eth.coinbase, m)
Y me devuelve:0x1c28d6720234343026c24718728cf0c251b0d09c87c32a6e380396a3360065290d0e7ec99a48e547e36645cecc11fd8d09742955c3d16c32eb75d9b24dd158d754
Teóricamente, podría derivar la validez de la firma de esto.
r = 0x1c28d6720234343026c24718728cf0c251b0d09c87c32a6e380396a336006529
s = 0x0d0e7ec99a48e547e36645cecc11fd8d09742955c3d16c32eb75d9b24dd158d7
v = 54
?! (Tenía la impresión de que sería un 0 o un 1. Para ecrecover probé 27 y 28)
Ahora los conecto a ecrecover(m, v, r, s) y obtengo...
Con 27:0x8c6c953abf2957f7fec4c689f8fe2ff09b81b245
Con 28:0xb8feaa9b9bfd7f10caefdc6d7baa1f74c37cedef
¿Qué sucede? Estoy tratando de implementar un inicio de sesión para mi aplicación usando web3 y este es un obstáculo importante. Espero que ustedes, genios, puedan corregirme donde me equivoque.
Gracias.
Encontré la respuesta yo mismo, vea el código de trabajo a continuación . ¡Estaba siguiendo esta guía que no recomendaría!.
También estaba usando paridad en modo geth para firmar los datos, lo que tampoco recomendaría. Cambiar a RPC simple y antiguo me dio resultados más sensatos.
Dicho esto, ¡cuidado con v! . Hay un error entre las implementaciones de geth que devolverá 00/01 o 1b/1c para v. Resolví mi problema usando el método fromRpcSig de ethereumjs-util , que explica el error. Si lo siguiente no funciona, intente importar web3 y usar su método sha3 con ethUtils toBuffer.
Aquí hay un fragmento completo del código del lado del cliente y del lado del servidor que implementa el inicio de sesión:
CLIENTE
function login() {
let data = web3.sha3('hello world');
web3.eth.sign(web3.eth.defaultAccount, data, (err, result) => {
if (!err) {
axios.post(url + '/login', {
addr: web3.eth.defaultAccount,
sig: result
}).then((res) => {
console.log(res);
});
}
});
}
SERVIDOR
var ethUtils = require('ethereumjs-util');
let addr = req.body.addr;
let sig = req.body.sig;
let signature = ethUtils.fromRpcSig(sig);
let data = 'hello world';
let pubKey = ethUtils.ecrecover(
ethUtils.sha3(data),
signature.v,
signature.r,
signature.s);
let foundAddr = '0x' + ethUtils.pubToAddress(pubKey).toString('hex');
if (foundAddr === addr) {
// Hooray! The user's signature proves they are who they say they are!
} else {
// Not authenticated successfully
}
q9f