From 18f941b81b4450e12e41103cf66952f61b20007f Mon Sep 17 00:00:00 2001 From: Chris Duncan Date: Fri, 22 May 2026 16:16:01 -0700 Subject: [PATCH] Implement new Bytes helper, currently validating incorrectly and needs fixed. --- src/lib/generate/cpu/index.ts | 8 ++++---- src/lib/generate/wasm/index.ts | 6 +++--- src/lib/index.ts | 10 +++++----- src/lib/validate/index.ts | 22 +++++++++++----------- src/utils/bytes.ts | 13 +++++++------ src/utils/index.ts | 1 + 6 files changed, 31 insertions(+), 29 deletions(-) diff --git a/src/lib/generate/cpu/index.ts b/src/lib/generate/cpu/index.ts index 211e4eb..7289984 100644 --- a/src/lib/generate/cpu/index.ts +++ b/src/lib/generate/cpu/index.ts @@ -1,9 +1,9 @@ //! SPDX-FileCopyrightText: 2025 Chris Duncan //! SPDX-License-Identifier: GPL-3.0-or-later -import { WorkGenerateResponse } from 'nano-pow' import { NanoPowValidate } from '#lib/validate' -import { bigintRandom, Logger } from '#utils' +import { Bytes, Logger } from '#utils' +import { WorkGenerateResponse } from 'nano-pow' const logger = new Logger() @@ -14,9 +14,9 @@ export async function generate (hash: bigint, difficulty: bigint, debug: boolean const check = () => { try { LOG: logger.log('check 0x8000 nonces') - let result = NanoPowValidate(bigintRandom(), hash, difficulty, false) + let result = NanoPowValidate(crypto.getRandomValues(new Uint8Array(8)), Bytes(hash, 32), difficulty, false) for (let i = 0; i < 0x8000; i++) { - result = NanoPowValidate(bigintRandom(), hash, difficulty, false) + result = NanoPowValidate(crypto.getRandomValues(new Uint8Array(8)), Bytes(hash, 32), difficulty, false) if (result.valid === '1') break } if (result.valid === '1') { diff --git a/src/lib/generate/wasm/index.ts b/src/lib/generate/wasm/index.ts index 8ec7344..1b5df5e 100644 --- a/src/lib/generate/wasm/index.ts +++ b/src/lib/generate/wasm/index.ts @@ -1,9 +1,9 @@ //! SPDX-FileCopyrightText: 2025 Chris Duncan //! SPDX-License-Identifier: GPL-3.0-or-later -import { WorkGenerateResponse } from 'nano-pow' import { NanoPowValidate } from '#lib/validate' -import { bigintRandom, bigintToHex, Logger } from '#utils' +import { bigintRandom, bigintToHex, Bytes, Logger } from '#utils' +import { WorkGenerateResponse } from 'nano-pow' import { NanoPowWasmWorker } from './worker.js' const logger = new Logger() @@ -143,7 +143,7 @@ export async function generate (hash: bigint, difficulty: bigint, effort: number let result = '' try { work = await dispatch() - result = (await NanoPowValidate(work, hash, difficulty, debug)).difficulty + result = (await NanoPowValidate(Bytes(work, 8), Bytes(hash, 32), difficulty, debug)).difficulty } catch (err) { LOG: logger.log(err) } finally { diff --git a/src/lib/index.ts b/src/lib/index.ts index 15dcfbe..592fb30 100644 --- a/src/lib/index.ts +++ b/src/lib/index.ts @@ -4,7 +4,7 @@ import { NanoPowConfig } from '#lib/config' import { NanoPowCpu, NanoPowWasm, NanoPowWebgl, NanoPowWebgpu } from '#lib/generate' import { NanoPowValidate } from '#lib/validate' -import { bigintFrom, Cache, Logger, Queue } from '#utils' +import { bigintFrom, Bytes, Cache, Logger, Queue } from '#utils' import { WorkErrorResponse, WorkGenerateResponse, WorkValidateResponse } from 'nano-pow' const logger = new Logger() @@ -19,7 +19,7 @@ export async function generate (hash: unknown, options?: unknown): Promise { try { - const bigintHash = bigintFrom(hash, 'hex') - const bigintWork = bigintFrom(work, 'hex') + const hashBytes = Bytes(hash, 32) + const workBytes = Bytes(work, 8) const { debug, difficulty } = await NanoPowConfig(options) - const result = await NanoPowValidate(bigintWork, bigintHash, difficulty, debug) + const result = await NanoPowValidate(workBytes, hashBytes, difficulty, debug) return result } catch (e: any) { return { error: (typeof e === 'string' ? e : (e?.message ?? '')) } diff --git a/src/lib/validate/index.ts b/src/lib/validate/index.ts index 285b193..d777214 100644 --- a/src/lib/validate/index.ts +++ b/src/lib/validate/index.ts @@ -1,8 +1,8 @@ //! SPDX-FileCopyrightText: 2025 Chris Duncan //! SPDX-License-Identifier: GPL-3.0-or-later +import { bigintToHex, BytesToHex, Logger, RECEIVE, SEND } from '#utils' import { WorkValidateResponse } from 'nano-pow' -import { bigintAsUintNArray, bigintToHex, Logger, RECEIVE, SEND } from '#utils' const logger = new Logger() @@ -67,7 +67,7 @@ function ROUND (i: number): void { G(3, 4, 9, 14, s[14], s[15]) } -function init (seed: bigint, hash: BigUint64Array): void { +function init (seed: BigUint64Array, hash: BigUint64Array): void { // Reset buffers before each calculation result = 0n for (let i = 0; i < 8; i++) { @@ -79,36 +79,36 @@ function init (seed: bigint, hash: BigUint64Array): void { v[14] = ~v[14] // Compression // Set up input buffers - mView.setBigUint64(0, seed, true) + mView.setBigUint64(0, seed[0], true) for (let i = 0; i < 4; i++) { mView.setBigUint64(8 * (i + 1), hash[i]) } } -function blake2b (work: bigint, hash: bigint): void { - init(work, bigintAsUintNArray(hash, 64, 4)) +function blake2b (work: Uint8Array, hash: Uint8Array): void { + init(new BigUint64Array(work.buffer), new BigUint64Array(hash.buffer)) for (let i = 0; i < 12; i++) { ROUND(i) } result = (blake2b_IV[0] ^ 0x01010008n ^ v[0] ^ v[8]) } -function log (work: bigint, hash: bigint, difficulty: bigint): void { +function log (work: Uint8Array, hash: Uint8Array, difficulty: bigint): void { LOG: logger.groupStart('NanoPow CPU work_validate') - LOG: logger.log('NanoPow CPU work_validate', 'work', bigintToHex(work, 16)) - LOG: logger.log('NanoPow CPU work_validate', 'hash', bigintToHex(hash, 64)) + LOG: logger.log('NanoPow CPU work_validate', 'work', BytesToHex(work.buffer)) + LOG: logger.log('NanoPow CPU work_validate', 'hash', BytesToHex(hash.buffer)) LOG: logger.log('NanoPow CPU work_validate', 'difficulty', bigintToHex(difficulty, 16)) LOG: logger.log('NanoPow CPU work_validate', 'result', bigintToHex(result, 16)) LOG: logger.groupEnd('NanoPow CPU work_validate') } -function validate (work: bigint, hash: bigint, difficulty: bigint, debug: boolean): WorkValidateResponse { +function validate (work: Uint8Array, hash: Uint8Array, difficulty: bigint, debug: boolean): WorkValidateResponse { logger.isEnabled = debug blake2b(work, hash) log(work, hash, difficulty) return { - hash: bigintToHex(hash, 64), - work: bigintToHex(work, 16), + hash: BytesToHex(hash.buffer, 64), + work: BytesToHex(work.buffer, 16), difficulty: bigintToHex(result, 16), valid: (result >= difficulty) ? '1' : '0', valid_all: (result >= SEND) ? '1' : '0', diff --git a/src/utils/bytes.ts b/src/utils/bytes.ts index b0a60b3..cfc6d1c 100644 --- a/src/utils/bytes.ts +++ b/src/utils/bytes.ts @@ -7,8 +7,8 @@ * @param {(bigint|number|string)} input * @param {number} [length] * @returns {Uint8Array} - */ -export function Bytes (input: unknown, minLength?: number): Uint8Array { +*/ +export function Bytes (input: unknown, minLength: unknown = 1): Uint8Array { if (typeof input === 'number') { input = BigInt(input | 0) } @@ -36,14 +36,15 @@ export function Bytes (input: unknown, minLength?: number): Uint8Array b.toString(16).padStart(2, '0')).join('').padStart(length, '0') + return [...bytes].map(b => b.toString(16).padStart(2, '0')).join('').padStart(minLength, '0') } diff --git a/src/utils/index.ts b/src/utils/index.ts index 3160d10..77fd538 100644 --- a/src/utils/index.ts +++ b/src/utils/index.ts @@ -3,6 +3,7 @@ export * from './api-support' export * from './bigint' +export * from './bytes' export * from './cache' export * from './logger' export * from './queue' -- 2.52.0