aboutsummaryrefslogtreecommitdiff
path: root/web/js/proof-of-work.mjs
diff options
context:
space:
mode:
Diffstat (limited to 'web/js/proof-of-work.mjs')
-rw-r--r--web/js/proof-of-work.mjs32
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({