diff options
Diffstat (limited to 'web/js/proof-of-work.mjs')
| -rw-r--r-- | web/js/proof-of-work.mjs | 32 |
1 files changed, 28 insertions, 4 deletions
diff --git a/web/js/proof-of-work.mjs b/web/js/proof-of-work.mjs index b4f9c53..60d8d61 100644 --- a/web/js/proof-of-work.mjs +++ b/web/js/proof-of-work.mjs @@ -1,4 +1,9 @@ -export default function process(data, difficulty = 5, threads = (navigator.hardwareConcurrency || 1)) { +export default function process( + data, + difficulty = 5, + progressCallback = null, + threads = (navigator.hardwareConcurrency || 1), +) { console.debug("fast algo"); return new Promise((resolve, reject) => { let webWorkerURL = URL.createObjectURL(new Blob([ @@ -11,9 +16,12 @@ export default function process(data, difficulty = 5, threads = (navigator.hardw let worker = new Worker(webWorkerURL); worker.onmessage = (event) => { - workers.forEach(worker => worker.terminate()); - worker.terminate(); - resolve(event.data); + if (typeof event.data === "number") { + progressCallback?.(event.data); + } else { + workers.forEach(worker => worker.terminate()); + resolve(event.data); + } }; worker.onerror = (event) => { @@ -55,6 +63,8 @@ function processTask() { let nonce = event.data.nonce; let threads = event.data.threads; + const threadId = nonce; + while (true) { const currentHash = await sha256(data + nonce); const thisHash = new Uint8Array(currentHash); @@ -78,7 +88,21 @@ function processTask() { break; } + const oldNonce = nonce; nonce += threads; + + // send a progess update every 1024 iterations. since each thread checks + // separate values, one simple way to do this is by bit masking the + // nonce for multiples of 1024. unfortunately, if the number of threads + // is not prime, only some of the threads will be sending the status + // update and they will get behind the others. this is slightly more + // complicated but ensures an even distribution between threads. + if ( + nonce > oldNonce | 1023 && // we've wrapped past 1024 + (nonce >> 10) % threads === threadId // and it's our turn + ) { + postMessage(nonce); + } } postMessage({ |
