From: Chris Duncan Date: Wed, 18 Jun 2025 20:21:44 +0000 (-0700) Subject: Unblock CPU loop. X-Git-Tag: v5.0.2~4 X-Git-Url: https://git.codecow.com/?a=commitdiff_plain;h=81cb4f4a60718da619dbbc38972999f37a2c0f94;p=nano-pow.git Unblock CPU loop. CPU work_generate now returns a promise and iterates a limited loop before re-calling itself on the next animation frame. This unblocks the main thread and allows the environment to reload properly, i.e. refresh the browser tab. --- diff --git a/src/lib/generate/cpu/index.ts b/src/lib/generate/cpu/index.ts index 47726af..65c292b 100644 --- a/src/lib/generate/cpu/index.ts +++ b/src/lib/generate/cpu/index.ts @@ -3,16 +3,36 @@ import { NanoPowValidate } from '#lib/validate' import { WorkGenerateResponse } from '#types' -import { bigintRandom } from '#utils' +import { bigintRandom, Logger } from '#utils' -export function generate (hash: bigint, difficulty: bigint, debug: boolean): WorkGenerateResponse { - let result - do { - result = NanoPowValidate(bigintRandom(), hash, difficulty, debug) - } while (result.valid !== '1') - return { - hash: result.hash, - work: result.work, - difficulty: result.difficulty - } +const logger = new Logger() + +export async function generate (hash: bigint, difficulty: bigint, debug: boolean): Promise { + logger.isEnabled = debug + LOG: logger.groupStart('NanoPow CPU work_generate') + return new Promise((resolve, reject) => { + const check = () => { + try { + LOG: logger.log('check 0x8000 nonces') + let result = NanoPowValidate(bigintRandom(), hash, difficulty, false) + for (let i = 0; i < 0x8000; i++) { + result = NanoPowValidate(bigintRandom(), hash, difficulty, false) + if (result.valid === '1') break + } + if (result.valid === '1') { + LOG: logger.groupEnd('NanoPow CPU work_generate') + resolve({ + hash: result.hash, + work: result.work, + difficulty: result.difficulty + }) + } else { + requestAnimationFrame(check) + } + } catch (err) { + reject(err) + } + } + check() + }) }