I am trying to run some tests for my ecrecover
function. I saw a bunch of tutorials and I always have the same problem, my contract always reverts before anything is being logged.
Contract function
event Test(bytes32 _msgHash, uint8 _v, bytes32 _r, bytes32 _s);
function registerAddress(address _addr, bytes32 _msgHash, uint8 _v, bytes32 _r, bytes32 _s) public returns (bool) {
emit Test(_msgHash, _v, _r, _s);
if (_v < 27) _v += 27;
emit Test(_msgHash, _v, _r, _s);
if (_v != 27 && _v != 28) revert();
emit Test(_msgHash, _v, _r, _s);
if(ecrecover(_msgHash, _v, _r, _s) != _addr)
{
emit Test(_msgHash, _v, _r, _s);
revert();
}
registeredAddresses[_addr] = true;
emit LogRegisterAddress(_addr);
return true;
}
Test Code
it('ecrecover result matches address', async function () {
var address = owner;
const message = 'Lorem ipsum mark mark dolor sit amet, consectetur adipiscing elit. Tubulum fuisse, qua illum, cuius is condemnatus est rogatione, P. Eaedem res maneant alio modo.';
var sig = await generateSignature(address, message);
var ret = await verifySignature(address, message, sig);
var result = await coinx.registerAddress.sendTransaction(address, ret.encoded, ret.v, ret.r, ret.s, {from: address});
assert.equal(result, true);
});
Functions and some variables
const web3 = new Web3(new Web3.providers.HttpProvider(WEB3_PROVIDER_URL));
var node = web3.version.node.split('/')[0];
console.log('Using node=' + node);
var testrpc = false;
var geth = false;
var parity = false;
if (node === 'Geth') geth = true;
if (node === 'EthereumJS TestRPC') testrpc = true;
if (node === 'Parity') parity = true;
function generateSignature (address, message) {
console.log('Generating signature');
console.log(' address=' + address);
if (testrpc) {
var encoded = web3.sha3(message);
}
if (geth || parity) {
encoded = '0x' + Buffer.from(message).toString('hex');
}
console.log(' encoded message=' + encoded);
return web3.eth.sign(address, encoded);
}
async function verifySignature (address, message, sig) {
console.log('Verifying signature');
console.log(' address=' + address);
let encoded;
if (testrpc) {
encoded = web3.sha3(message);
} else if (geth || parity) {
encoded = web3.sha3('\x19Ethereum Signed Message:\n' + message.length + message);
}
console.log(' encoded message=' + encoded);
if (sig.slice(0, 2) === '0x') sig = sig.substr(2);
if (testrpc || geth) {
var r = '0x' + sig.substr(0, 64);
var s = '0x' + sig.substr(64, 64);
var v = '0x' + sig.substr(128, 2);
}
if (parity) {
v = '0x' + sig.substr(0, 2);
r = '0x' + sig.substr(2, 64);
s = '0x' + sig.substr(66, 64);
}
console.log(' r: ' + r);
console.log(' s: ' + s);
console.log(' v: ' + v);
var ret = {};
ret.r = r;
ret.s = s;
ret.v = v;
ret.encoded = encoded;
return ret;
}
Version:
Truffle v4.1.13 (core: 4.1.13)
Solidity v0.4.24 (solc-js)
npm v5.4.2
node v8.7.0