var POW_COMPUTING_TIMEOUT = 2; var POW_HASH_LENGTH = 16; var hasher = null; function computeHash(iteration, guess, target, payload, timestamp, port) { iteration += 1; var hash = hasher(payload + iteration).toString(); guess = hash.substring(0, POW_HASH_LENGTH); if (guess <= target) { //console.log("Iteration: ", iteration); //console.log("Guess: ", guess); //console.log("Target: ", target); var data = { iteration: iteration, timestamp: timestamp, guess: guess }; port.postMessage(data); } else { //console.log("Iteration: ", iteration); //console.log("Guess: ", guess); //console.log("Target: ", target); setTimeout(function() { computeHash(iteration, guess, target, payload, timestamp, port); }, POW_COMPUTING_TIMEOUT); } } function doWork(message, difficulty, port) { 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, port); }, POW_COMPUTING_TIMEOUT); } onconnect = function(e) { var port = e.ports[0]; port.start(); port.onmessage = function(e) { var difficulty = e.data.difficulty; if (hasher == null) { importScripts(e.data.hasher); hasher = CryptoJS.SHA256; } self.doWork(e.data.msg, difficulty, port); }; }