Skip to content

Instantly share code, notes, and snippets.

@drsnyder
Created November 6, 2015 23:37
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save drsnyder/4510a75bf5eb97788073 to your computer and use it in GitHub Desktop.
Save drsnyder/4510a75bf5eb97788073 to your computer and use it in GitHub Desktop.
JS client for evaluating proof-of-work cost
var argv = require('minimist')(process.argv.slice(2));
var cjs = require('cryptojs');
var s = require('sprintf-js');
var sha1 = cjs.Crypto.SHA1;
var repeatString = function(s, n) {
var ret = '';
for (i = 0; i < n; i++) {
ret += s;
}
return ret;
}
var proof = function(challenge, bits) {
var zeros = Math.ceil(bits/4.0),
counter = 0,
paddedZeros = repeatString("0", zeros);
while (true) {
var digest = sha1(challenge+(counter).toString(16));
if (digest.slice(0, zeros) == paddedZeros) {
return {
counter: counter,
digest: digest
};
}
counter++;
}
};
var bench = function(fn, args) {
var start = new Date().getTime();
var result = fn.apply(undefined, args);
var end = new Date().getTime();
return {
time: end - start,
result: result
};
};
var iter = 0;
var toBits = parseInt(argv.bits);
var toIter = parseInt(argv.iterations);
console.log("# going to", toBits, "bits", toIter, "times each");
console.log("iteratation,time,num_bits,counter")
for (currentBits = 2; currentBits <= toBits; currentBits++) {
for (j = 0; j < toIter; j++) {
var challenge = Math.random().toString(36).replace(/[^a-z]+/g, '').substr(0, 10);
var ret = bench(proof, [challenge, currentBits]);
console.log(s.sprintf("%d,%f,%d,%d", iter, ret.time, currentBits, ret.result.counter));
iter++;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment