Die falsche Adresse von ecrecover zurückerhalten

Wenn ich eine Zeichenfolge mit dem folgenden Code signiere, bekomme ich eine andere Adresse zurück als die, mit der ich signiert habe. Die zurückgegebene Adresse ist für verschiedene Zeichenfolgen unterschiedlich.

const util = require('ethereumjs-util')
const msg = web3.sha3('hello!');
const sig = web3.eth.sign(web3.eth.accounts[0], msg);
const {v, r, s} = util.fromRpcSig(sig);

const pubKey  = util.ecrecover(util.toBuffer(msg), v, r, s);
const addrBuf = util.pubToAddress(pubKey);
const addr    = util.bufferToHex(addrBuf);

Ich habe den Code aus der Antwort auf eine Frage genommen, die ich zuvor hier gestellt habe . Eine Adresse von ethereumjs-utils erecover erhalten .

Ich habe hier eine Frage gestellt: Secp256k1-Bindungen werden nicht kompiliert. Über einen möglicherweise relevanten Fehler wird eine reine JS-Implementierung verwendet . Die Kommentare deuteten darauf hin, dass es harmlos sein sollte.

Können Sie bitte genaue Versionen der von Ihnen verwendeten Pakete posten ( npm list). Ich denke, es gab einen Fehler in einigen der testrpcAbhängigkeiten.
@maxtaldykin pastebin.com/v2ydwkgy das habe ich bekommen
@maxtaldykin Ich verwende macOS Sierra Version 10.12.4 und bin mir nicht sicher, wo ich die testrpc-Version finden kann
@maxtaldykin Ich habe einen Fehler imgur.com/a/JTyU4

Antworten (1)

Geth fügt der Nachricht ein Präfix hinzu, bevor es sie signiert web3.eth.sign(siehe JSON-PRC-Spezifikation ). Ohne dies kann es möglich sein, den Benutzer dazu zu bringen, eine Transaktion zu signieren (mehr hier ).

Der richtige Code zum Signieren der Nachricht web3.eth.signund Wiederherstellen der Adresse mit ethereumjs-util.ecrecoveroder (Solidity's ecrecover) sollte also das Präfix explizit hinzufügen.

const util = require('ethereumjs-util')

const msg = new Buffer('hello');
const sig = web3.eth.sign(web3.eth.accounts[0], '0x' + msg.toString('hex'));
const res = util.fromRpcSig(sig);

const prefix = new Buffer("\x19Ethereum Signed Message:\n");
const prefixedMsg = util.sha3(
  Buffer.concat([prefix, new Buffer(String(msg.length)), msg])
);

const pubKey  = util.ecrecover(prefixedMsg, res.v, res.r, res.s);
const addrBuf = util.pubToAddress(pubKey);
const addr    = util.bufferToHex(addrBuf);

console.log(web3.eth.accounts[0],  addr);

Es besteht eine irreführende Inkonsistenz mit ethereumjs-testrpc, da der Nachricht vor der Anmeldung kein Präfix vorangestellt wird web3.eth.sign.

Es scheint, dass Meteor nur Node-Versionen von 4.x zulässt
Es funktionierte! Vielen Dank, ich kämpfe schon seit Ewigkeiten damit
Entschuldigung, nur eine Kleinigkeit ... die Ecrecover-Adresse ist in Kleinbuchstaben geschrieben, aber die ursprüngliche Adresse hat einige Großbuchstaben. Macht das einen Unterschied?
macht nichts, es wird hier beantwortet ethereum.stackexchange.com/questions/2045/…
Wie um alles in der Welt hast du das gefunden?! Ich suche schon ewig.