web3.eth.sign gibt keine gültige Signatur zurück - Oder wie funktioniert das sonst?

BEARBEITEN: Problem gelöst; Arbeitsbeispiel für die Anmeldung unten

Ich verwende den sha3 einer Nachricht, die ich mit eth.sign signieren möchtem = web3.sha3("Please work.")

Ich laufe danneth.sign(eth.coinbase, m)

Und es gibt mir zurück:0x1c28d6720234343026c24718728cf0c251b0d09c87c32a6e380396a3360065290d0e7ec99a48e547e36645cecc11fd8d09742955c3d16c32eb75d9b24dd158d754

Theoretisch könnte ich daraus die Gültigkeit der Signatur ableiten.

r = 0x1c28d6720234343026c24718728cf0c251b0d09c87c32a6e380396a336006529

s = 0x0d0e7ec99a48e547e36645cecc11fd8d09742955c3d16c32eb75d9b24dd158d7

v = 54?! (Ich hatte den Eindruck, dies wäre eine 0 oder 1. Für Ecrecover habe ich 27 und 28 ausprobiert.)

Jetzt stecke ich diese in ecrecover(m, v, r, s) und ich bekomme ...

Mit 27:0x8c6c953abf2957f7fec4c689f8fe2ff09b81b245

Mit 28:0xb8feaa9b9bfd7f10caefdc6d7baa1f74c37cedef

Was in aller Welt ist los? Ich versuche, ein Login für meine Anwendung mit web3 zu implementieren, und dies ist ein großes Hindernis. Ich hoffe, ihr Genies könnt mich korrigieren, wo ich falsch liege.

Vielen Dank.

Antworten (1)

Ich bin selbst auf die Antwort gestoßen, siehe Arbeitscode unten . Ich habe diese Anleitung befolgt, die ich nicht empfehlen würde!.

Ich habe auch Parität im Geth-Modus verwendet, um die Daten zu signieren, was ich auch nicht empfehlen würde. Der Wechsel zum einfachen alten Geth-RPC brachte mir vernünftigere Ergebnisse.

Davon abgesehen, hüte dich vor v! . Es gibt einen Fehler zwischen den Implementierungen von geth, der entweder 00/01 oder 1b/1c für v zurückgibt. Ich habe mein Problem gelöst, indem ich die fromRpcSig-Methode von ethereumjs- util verwendet habe , die den Fehler erklärt. Wenn das Folgende nicht funktioniert, versuchen Sie, web3 zu importieren und seine sha3-Methode mit ethUtils toBuffer zu verwenden.

Hier ist ein vollständiges Code-Snippet auf Client- und Serverseite, das die Anmeldung implementiert:

KLIENT

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);
      });

    }
  });
}

SERVER

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
}