Ethereum-Signaturüberprüfung stimmt nicht überein

Was ich erreichen möchte, ist eine Nachricht zu signieren und dann die Signatur zu überprüfen, ob sie von derselben Adresse verifiziert wird oder nicht.

Vertrag zum Aufrufen der ecrecover-Methode zur Überprüfung der Adresse

contract MyAuth {      
    function verify( bytes32 hash, uint8 v, bytes32 r, bytes32 s) 
        constant returns(address returnAddress) {
        returnAddress = ecrecover(hash, v, r, s);
    }
}

Java-Script-Code

var cMyAuthAddress="0x09343c5EBB988315E117E1Cd6EE501AF02412cFB"; // Contract address

var cMyAuthABI="<ABI data>"; // Contract ABI
var cDeployed=web3.eth.contract(JSON.parse(cMyAuthABI)).at(cMyAuthAddress);

var msg = web3.sha3('This my test data');

console.log('Message Hash: '+ msg); // Generated message hash
console.log("Account Used to Sign: "+ web3.eth.accounts[0]);
var state=web3.personal.unlockAccount(web3.eth.accounts[0], '<account password>', 1000); // Unlocking the account to perform the operation
console.log('Account State: '+ state);

var signature = web3.eth.sign(web3.eth.accounts[0], msg); // Signing the messge

console.log('Signature: '+ signature);

var r = signature.slice(0, 66)
var s = '0x' + signature.slice(66, 130)
var v = '0x' + signature.slice(130, 132)
v = web3.toDecimal(v);

console.log("V: "+ v);
console.log("R: "+ r);
console.log("S: "+ s);

if(v<27 || v>28){
    v+=27;
    console.log("Updated V: "+ v);
}

var finalAddress=cDeployed.verify.call(msg,v,r,s)

console.log("Final Address: "+ finalAddress);

Ausgabe

Message Hash: 0x1c6f4ab842fb95857783a0177eafb0133b3a626c89877a8bf4e2d07987aa1422
Account Used to Sign: 0x890bd380e472df5b8bab22075c6a5d4f0b84415c
Account State: true
Signature: 0xb8b01f46f147bd5e8f84343719ca7492164f80af5f60370c433e2e096ae52fec76d2bbe0e454b2a07e4100e8463d98286ec6e849cbcf6e24f66f7d579fc8654f1c
V: 28
R: 0xb8b01f46f147bd5e8f84343719ca7492164f80af5f60370c433e2e096ae52fec
S: 0x76d2bbe0e454b2a07e4100e8463d98286ec6e849cbcf6e24f66f7d579fc8654f
Decimal V: 28
Final Address: 0x0609b9fae476d8b844716e3a0a6a3b5b7a5a2cdf

Sie können deutlich sehen, dass die aufgeführte endgültige Adresse nicht mit der Adresse übereinstimmt, die zum Signieren der Nachricht verwendet wurde.

Hinweis: Ich versuche dies auf meiner privaten Blockchain.

Frage : Welcher Schritt muss korrigiert werden, um das gewünschte Ergebnis zu erzielen (d. h. die endgültige Adresse sollte mit der Kontoadresse übereinstimmen, die in diesem Fall zum Signieren verwendet wird, also 0x890bd380e472df5b8bab22075c6a5d4f0b84415c )?

Versucht, ethereumjs-util mit dem von baove generierten Signaturwert zu verwenden, aber mit dem gleichen Ergebnis konfrontiert.

  var ethUtils = require('ethereumjs-util'); 
  let tSig = ethUtils.fromRpcSig(signature);
  let pubKey = ethUtils.ecrecover(
    ethUtils.sha3("This my test data"),
    tSig.v,
    tSig.r,
    tSig.s);
  let foundAddr = '0x' + ethUtils.pubToAddress(pubKey).toString('hex');
  console.log("Final Address 2: "+ finalAddress);

Ausgabe ist Final Address 2: 0x0609b9fae476d8b844716e3a0a6a3b5b7a5a2cdf " (d.h. dieselbe Adresse)

Antworten (1)

Sie müssen der Nachricht die Zeichenfolge „\x19Ethereum Signed Message:\n“ und die Länge der Nachricht voranstellen

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

Und verwenden Sie dann die vorangestellte Zeichenfolge in ecrecover.

Code aus der Antwort hier https://ethereum.stackexchange.com/a/12684/

Vielen Dank für das Teilen der Details in dieser Hinsicht. Ich kann jetzt die Adresse entschlüsseln, mit der die Signatur generiert wurde.