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<WorkGenerateResponse> {
+ 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()
+ })
}