proof_of_work.js
54 lines
| 1.5 KiB
| application/javascript
|
JavascriptLexer
neko259
|
r1428 | var POW_COMPUTING_TIMEOUT = 2; | ||
var POW_HASH_LENGTH = 16; | ||||
function computeHash(iteration, guess, target, payload, timestamp, hasher) { | ||||
iteration += 1; | ||||
var hash = hasher(payload + iteration).toString(); | ||||
guess = hash.substring(0, POW_HASH_LENGTH); | ||||
if (guess <= target) { | ||||
neko259
|
r1431 | //console.log("Iteration: ", iteration); | ||
//console.log("Guess: ", guess); | ||||
//console.log("Target: ", target); | ||||
neko259
|
r1428 | |||
var data = { | ||||
iteration: iteration, | ||||
timestamp: timestamp, | ||||
guess: guess | ||||
}; | ||||
self.postMessage(data); | ||||
} else { | ||||
//console.log("Iteration: ", iteration); | ||||
//console.log("Guess: ", guess); | ||||
//console.log("Target: ", target); | ||||
setTimeout(function() { | ||||
computeHash(iteration, guess, target, payload, timestamp, hasher); | ||||
}, POW_COMPUTING_TIMEOUT); | ||||
} | ||||
} | ||||
function doWork(message, hasher, difficulty) { | ||||
var timestamp = Date.now(); | ||||
var iteration = 0; | ||||
var payload = timestamp + message; | ||||
var target = parseInt(Math.pow(2, POW_HASH_LENGTH * 3) / difficulty).toString(); | ||||
while (target.length < POW_HASH_LENGTH) { | ||||
target = '0' + target; | ||||
} | ||||
var guess = target + '0'; | ||||
setTimeout(function() { | ||||
computeHash(iteration, guess, target, payload, timestamp, hasher); | ||||
}, POW_COMPUTING_TIMEOUT); | ||||
} | ||||
self.onmessage = function(e) { | ||||
var difficulty = e.data.difficulty; | ||||
importScripts(e.data.hasher); | ||||
var hasher = CryptoJS.SHA256; | ||||
self.doWork(e.data.msg, hasher, difficulty); | ||||
}; | ||||