From: Chris Duncan Date: Sat, 23 May 2026 08:53:22 +0000 (-0700) Subject: Implement bytes across generate APIs. Fix repeated byte conversions. Declare global... X-Git-Url: https://git.codecow.com/?a=commitdiff_plain;h=a7e2b9100ead3f2ccee43f6de963822f7b547609;p=nano-pow.git Implement bytes across generate APIs. Fix repeated byte conversions. Declare global type alias for u8 typed array. --- diff --git a/src/index.ts b/src/index.ts index 1ea806c..9a9e8cd 100644 --- a/src/index.ts +++ b/src/index.ts @@ -8,6 +8,7 @@ declare global { interface Window { NanoPow: typeof NanoPow } + type Bytes = Uint8Array } /** diff --git a/src/lib/generate/cpu/index.ts b/src/lib/generate/cpu/index.ts index 7289984..eb93230 100644 --- a/src/lib/generate/cpu/index.ts +++ b/src/lib/generate/cpu/index.ts @@ -2,21 +2,21 @@ //! SPDX-License-Identifier: GPL-3.0-or-later import { NanoPowValidate } from '#lib/validate' -import { Bytes, Logger } from '#utils' +import { Logger } from '#utils' import { WorkGenerateResponse } from 'nano-pow' const logger = new Logger() -export async function generate (hash: bigint, difficulty: bigint, debug: boolean): Promise { +export async function generate (hash: Bytes, 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(crypto.getRandomValues(new Uint8Array(8)), Bytes(hash, 32), difficulty, false) + let result = NanoPowValidate(crypto.getRandomValues(new Uint8Array(8)), hash, difficulty, false) for (let i = 0; i < 0x8000; i++) { - result = NanoPowValidate(crypto.getRandomValues(new Uint8Array(8)), Bytes(hash, 32), difficulty, false) + result = NanoPowValidate(crypto.getRandomValues(new Uint8Array(8)), hash, 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 1b5df5e..eb4179c 100644 --- a/src/lib/generate/wasm/index.ts +++ b/src/lib/generate/wasm/index.ts @@ -2,7 +2,7 @@ //! SPDX-License-Identifier: GPL-3.0-or-later import { NanoPowValidate } from '#lib/validate' -import { bigintRandom, bigintToHex, Bytes, Logger } from '#utils' +import { Bytes, BytesToHex, Logger, bigintRandom, bigintToHex } from '#utils' import { WorkGenerateResponse } from 'nano-pow' import { NanoPowWasmWorker } from './worker.js' @@ -37,8 +37,8 @@ function reset (): void { v?.fill(0n) } -async function init (hash: bigint, difficulty: bigint, effort: number): Promise { - data.hash = bigintToHex(hash, 64) +async function init (hash: Bytes, difficulty: bigint, effort: number): Promise { + data.hash = BytesToHex(hash.buffer, 64) data.difficulty = bigintToHex(difficulty, 16) for (let i = workers.length; i < effort; i++) { @@ -132,7 +132,7 @@ async function workersStopped (): Promise { /** * Nano proof-of-work using WebAssembly. */ -export async function generate (hash: bigint, difficulty: bigint, effort: number, debug: boolean): Promise { +export async function generate (hash: Bytes, difficulty: bigint, effort: number, debug: boolean): Promise { logger.isEnabled = debug LOG: logger.groupStart('NanoPow WASM work_generate') LOG: logger.log('generating') @@ -143,7 +143,7 @@ export async function generate (hash: bigint, difficulty: bigint, effort: number let result = '' try { work = await dispatch() - result = (await NanoPowValidate(Bytes(work, 8), Bytes(hash, 32), difficulty, debug)).difficulty + result = (await NanoPowValidate(Bytes(work, 8), hash, difficulty, debug)).difficulty } catch (err) { LOG: logger.log(err) } finally { @@ -158,7 +158,7 @@ export async function generate (hash: bigint, difficulty: bigint, effort: number } return { - hash: bigintToHex(hash, 64), + hash: BytesToHex(hash.buffer, 64), work: bigintToHex(work, 16), difficulty: result } diff --git a/src/lib/generate/webgl/index.ts b/src/lib/generate/webgl/index.ts index 7fa8192..278a4d1 100644 --- a/src/lib/generate/webgl/index.ts +++ b/src/lib/generate/webgl/index.ts @@ -2,7 +2,7 @@ //! SPDX-FileContributor: Ben Green //! SPDX-License-Identifier: GPL-3.0-or-later AND MIT -import { Bytes, Logger, bigintRandom, bigintToHex } from '#utils' +import { BytesToHex, Logger, bigintRandom, bigintToHex } from '#utils' import { WorkGenerateResponse } from 'nano-pow' import { downsampleSource, drawSource, quadSource } from './shaders' @@ -405,7 +405,7 @@ function read (drawFbo: FBO): { work: bigint, difficulty: bigint } { /** * Nano proof-of-work using WebGL 2.0. */ -export async function generate (hash: bigint, difficulty: bigint, effort: number, debug: boolean): Promise { +export async function generate (hash: Bytes, difficulty: bigint, effort: number, debug: boolean): Promise { logger.isEnabled = debug // Set up 60s timeout to prevent long-running calls let timeout = false @@ -414,7 +414,7 @@ export async function generate (hash: bigint, difficulty: bigint, effort: number LOG: logger.log('timed out') }, 60_000) LOG: logger.groupStart('NanoPow WebGL work_generate') - LOG: logger.log(`generate('${hash.toString(16)}', '${difficulty.toString(16)}', ${effort}, ${debug})`) + LOG: logger.log(`generate('${BytesToHex(hash.buffer)}', '${difficulty.toString(16)}', ${effort}, ${debug})`) // Start drawing to calculate one nonce per pixel let found = false @@ -426,7 +426,7 @@ export async function generate (hash: bigint, difficulty: bigint, effort: number if (isReady === false || effort !== drawEffort || isFirstRetry) { setup(effort) } - init(new Uint32Array(Bytes(hash, 32).buffer), difficulty) + init(new Uint32Array(hash.buffer), difficulty) LOG: logger.log('drawing frame 0') draw(bigintRandom(), drawFbos[0], queries[0]) draw(bigintRandom(), drawFbos[1], queries[1]) @@ -457,7 +457,7 @@ export async function generate (hash: bigint, difficulty: bigint, effort: number } return { - hash: bigintToHex(hash, 64), + hash: BytesToHex(hash.buffer, 64), work: bigintToHex(result.work, 16), difficulty: bigintToHex(result.difficulty, 16) } diff --git a/src/lib/generate/webgpu/index.ts b/src/lib/generate/webgpu/index.ts index 16b7566..4e87cdd 100644 --- a/src/lib/generate/webgpu/index.ts +++ b/src/lib/generate/webgpu/index.ts @@ -1,7 +1,7 @@ //! SPDX-FileCopyrightText: 2025 Chris Duncan //! SPDX-License-Identifier: GPL-3.0-or-later -import { Bytes, Logger, Queue, bigintRandom, bigintToHex } from '#utils' +import { BytesToHex, Logger, Queue, bigintRandom, bigintToHex } from '#utils' import { WorkGenerateResponse } from 'nano-pow' import { default as NanoPowGpuComputeShader } from './shaders/compute.wgsl' @@ -177,7 +177,7 @@ async function restore (): Promise { } } -async function init (hash: Uint8Array, difficulty: bigint): Promise { +async function init (hash: Bytes, difficulty: bigint): Promise { LOG: logger.log('variables initializing') try { // Save hash data for normal usage and potential recovery efforts @@ -270,7 +270,7 @@ function read (dispatchIndex: number): { work: bigint, difficulty: bigint } { /** * Nano proof-of-work using WebGPU. */ -export async function generate (hash: bigint, difficulty: bigint, effort: number, debug: boolean): Promise { +export async function generate (hash: Bytes, difficulty: bigint, effort: number, debug: boolean): Promise { logger.isEnabled = debug // Set up 60s timeout to prevent long-running calls let timeout = false @@ -293,7 +293,7 @@ export async function generate (hash: bigint, difficulty: bigint, effort: number throw new Error('failed to start') } } - await q.add(init, Bytes(hash, 32), difficulty) + await q.add(init, hash, difficulty) // Dispatch initial workgroups and set index await dispatch(0, bigintRandom(), effort) let dispatchIndex = 1 @@ -326,7 +326,7 @@ export async function generate (hash: bigint, difficulty: bigint, effort: number } return { - hash: bigintToHex(hash, 64), + hash: BytesToHex(hash.buffer, 64), work: bigintToHex(result.work, 16), difficulty: bigintToHex(result.difficulty, 16) } diff --git a/src/lib/index.ts b/src/lib/index.ts index 2ec72c1..31eb811 100644 --- a/src/lib/index.ts +++ b/src/lib/index.ts @@ -30,18 +30,19 @@ export async function generate (hash: unknown, options?: unknown): Promise, hash: Uint8Array, difficulty: bigint): void { +function log (work: Bytes, hash: Bytes, difficulty: bigint): void { LOG: logger.groupStart('NanoPow CPU work_validate') LOG: logger.log('NanoPow CPU work_validate', 'work', BytesToHex(work.buffer)) LOG: logger.log('NanoPow CPU work_validate', 'hash', BytesToHex(hash.buffer)) @@ -102,7 +102,7 @@ function log (work: Uint8Array, hash: Uint8Array, diff LOG: logger.groupEnd('NanoPow CPU work_validate') } -function validate (work: Uint8Array, hash: Uint8Array, difficulty: bigint, debug: boolean): WorkValidateResponse { +function validate (work: Bytes, hash: Bytes, difficulty: bigint, debug: boolean): WorkValidateResponse { logger.isEnabled = debug blake2b(work, hash) log(work, hash, difficulty) diff --git a/src/utils/bytes.ts b/src/utils/bytes.ts index 1d04340..26a0815 100644 --- a/src/utils/bytes.ts +++ b/src/utils/bytes.ts @@ -6,9 +6,9 @@ * * @param {(bigint|number|string)} input * @param {number} [minLength=1] - * @returns {Uint8Array} + * @returns {Bytes} */ -export function Bytes (input: unknown, minLength: unknown = 1): Uint8Array { +export function Bytes (input: unknown, minLength: unknown = 1): Bytes { if (typeof input === 'number') { input = BigInt(input | 0) } diff --git a/test/index.html b/test/index.html index 92d400d..4913c1c 100644 --- a/test/index.html +++ b/test/index.html @@ -72,7 +72,7 @@ SPDX-License-Identifier: GPL-3.0-or-later async function run (size, difficulty, effort, api, isOutputShown, isDebug, isSelfCheck) { // Generate once on load to compile shaders and initialize buffers - await NanoPow.work_generate(random(), { api, difficulty: 0 }) + await NanoPow.work_generate(random(), { api, difficulty: '0' }) const type = api api = type.toLowerCase() if (isSelfCheck) {