web3.eth.sign no devuelve una firma válida - ¿O de qué otra manera funciona esto?

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.

Respuestas (1)

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
}