Skip to content

Instantly share code, notes, and snippets.

@jar-o
Last active April 26, 2022 18:47
Show Gist options
  • Save jar-o/255120ad5fa322b952cc50f23dc69d8c to your computer and use it in GitHub Desktop.
Save jar-o/255120ad5fa322b952cc50f23dc69d8c to your computer and use it in GitHub Desktop.
ecrecover script node javascript web3 ethereumjs-util
#!/usr/bin/env node
/*
Test (1) r/s/v:
> node ecrecover.js \
0xb9cbc613e7154b248b1fb1cfd190e173c6d4e8e7bd89b754debe1322f9a4a15c \
0xa58c6ba0acb8005d0e3510396951a7949707428d7db97be8dc114af58a06140f \
0x0fe3e42fed1daabef16b2a9f3da5d36538898c8a9f491b48b4cef9ee731ff2f3 \
27
0xe0b28ae70d6f90a64761fdd148c8193a3f80b13f
0xa56a4cd3bbca1866317b0d51ccd64184b62777c4 (median.recover)
Test (2) sig:
> node ecrecover.js \
0xbfd7990b842673512f0f61acc04c5db7a9c24d474b40baf78566f052a9cd6c74 \
0xa58c6ba0acb8005d0e3510396951a7949707428d7db97be8dc114af58a06140f0fe3e42fed1daabef16b2a9f3da5d36538898c8a9f491b48b4cef9ee731ff2f31b
0xe0b28ae70d6f90a64761fdd148c8193a3f80b13f
0xa56a4cd3bbca1866317b0d51ccd64184b62777c4 (median.recover)
*/
const Web3 = require('web3');
const web3 = new Web3();
const util = require('ethereumjs-util')
const prefix = new Buffer.from("\x19Ethereum Signed Message:\n32");
function ecrecover(args) {
// console.log(args);
var data = Buffer.from(args[0].replace('0x',''), 'hex');
var r = Buffer.from(args[1].replace('0x',''), 'hex');
var s = Buffer.from(args[2].replace('0x',''), 'hex');
var v = parseInt(args[3]);
// console.log(data,r,s,v);
var pk = util.ecrecover(data, v, r, s);
var addr = util.bufferToHex(util.pubToAddress(pk));
console.log(addr);
pk = util.ecrecover(util.keccak256(Buffer.concat([prefix, data])), v, r, s);
addr = util.bufferToHex(util.pubToAddress(pk));
console.log(addr + ' (median.recover)');
}
function ecrecoverSig(args) {
var data = Buffer.from(args[0].replace('0x',''), 'hex')
var sig = Buffer.from(args[1].replace('0x',''), 'hex')
const res = util.fromRpcSig(sig);
var pub = util.ecrecover(data, res.v, res.r, res.s);
var addr = util.bufferToHex(util.pubToAddress(pub));
console.log(addr);
pk = util.ecrecover(util.keccak256(Buffer.concat([prefix, data])), res.v, res.r, res.s);
addr = util.bufferToHex(util.pubToAddress(pk));
console.log(addr + ' (median.recover)');
}
const args = process.argv.slice(2);
if (args.length != 4) {
if (args.length == 2) {
ecrecoverSig(args);
return;
}
console.log('Usage: node ecrecover.js $data $r $s $v');
console.log(' (or): node ecrecover.js $data $sig\n');
console.log(' E.g.: node ecrecover.js 0xabc123 0xdeadbeef 0xbeefdead 28');
} else {
ecrecover(args);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment