]> zoso.dev Git - libnemo.git/commitdiff
Implement initial PoW worker.
authorChris Duncan <chris@zoso.dev>
Mon, 2 Dec 2024 04:49:45 +0000 (20:49 -0800)
committerChris Duncan <chris@zoso.dev>
Mon, 2 Dec 2024 04:49:45 +0000 (20:49 -0800)
src/lib/pow.ts [new file with mode: 0644]
src/lib/workers.ts
src/lib/workers/pow.ts [deleted file]

diff --git a/src/lib/pow.ts b/src/lib/pow.ts
new file mode 100644 (file)
index 0000000..38e9782
--- /dev/null
@@ -0,0 +1,48 @@
+// SPDX-FileCopyrightText: 2024 Chris Duncan <chris@zoso.dev>
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+import { Blake2b } from './blake2b.js'
+import { Entropy } from './entropy.js'
+
+const p = () => {
+  /**
+  * Listens for messages from a calling function.
+  */
+  addEventListener('message', (message) => {
+    const data = JSON.parse(new TextDecoder().decode(message.data ?? message))
+    for (const d of data) {
+      d.nonce = find(d.hash, d.threshold)
+    }
+    const buf = new TextEncoder().encode(JSON.stringify(data)).buffer
+    //@ts-expect-error
+    postMessage(buf, [buf])
+  })
+
+  function find (hash: string, threshold: string) {
+    let nonce = null
+    do {
+      const e: Entropy = new Entropy(16)
+      const bytes: Uint8Array = parseHex(`${e.hex}${hash}`)
+      const result: string = new Blake2b(16).update(bytes).digest('hex') as string
+      const delta = BigInt(`0x${result}`) - BigInt(`0x${threshold}`)
+      if (delta >= 0) {
+        nonce = result
+      }
+    } while (nonce == null)
+    return nonce
+  }
+
+  function parseHex (hex: string) {
+    if (hex.length % 2 === 1) hex = `0${hex}`
+    const arr = hex.match(/.{1,2}/g)?.map(byte => parseInt(byte, 16))
+    return Uint8Array.from(arr ?? [])
+  }
+
+  return { find }
+}
+
+export const Pow = p()
+
+const start = p.toString().indexOf('{') + 1
+const end = p.toString().lastIndexOf('return')
+export const worker = p.toString().substring(start, end)
index e75c766c239b94ea13fd720c468f5b810d36dc67..bfe19fa7673185b40be9a5aba4aab1d912749eac 100644 (file)
@@ -1,8 +1,6 @@
 import { worker as Bip44Ckd } from './bip44-ckd.js'
 import { worker as NanoNaCl } from './nano-nacl.js'
 // import './workers/passkey.js'
-import pow from './workers/pow.js'
+import { worker as Pow } from './pow.js'
 
-
-
-export { Bip44Ckd, NanoNaCl }
+export { Bip44Ckd, NanoNaCl, Pow }
diff --git a/src/lib/workers/pow.ts b/src/lib/workers/pow.ts
deleted file mode 100644 (file)
index f75adb4..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-// SPDX-FileCopyrightText: 2024 Chris Duncan <chris@zoso.dev>
-// SPDX-License-Identifier: GPL-3.0-or-later
-
-const pow = () => {
-
-}
-
-export default pow.toString().substring(pow.toString().indexOf('{') + 1, pow.toString().lastIndexOf('}'))