From: Chris Duncan Date: Mon, 22 Jun 2026 07:30:37 +0000 (-0700) Subject: Simplify bigint conversion to bytewords. X-Git-Url: https://git.codecow.com/?a=commitdiff_plain;h=ad691d6db85353698f628476e563dd253526b79e;p=nano-pow.git Simplify bigint conversion to bytewords. --- diff --git a/src/lib/generate/webgl/index.ts b/src/lib/generate/webgl/index.ts index aee86eb..5800dcb 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 { Logger, bigintAsUintNArray, bigintToHex } from '#utils' +import { Logger, bigintToHex, bigintToU32 } from '#utils' import { WorkGenerateResponse } from 'nano-pow' import { downsampleSource, drawSource, quadSource } from './shaders' @@ -427,7 +427,7 @@ export async function generate (hash: bigint, difficulty: bigint, effort: number if (isReady === false || effort !== drawEffort || isFirstRetry) { setup(effort) } - init(bigintAsUintNArray(hash, 32, 8), difficulty) + init(bigintToU32(hash, 8), difficulty) crypto.getRandomValues(seed) LOG: logger.log('drawing frame 0') draw(seed[0], drawFbos[0], queries[0]) diff --git a/src/lib/generate/webgpu/index.ts b/src/lib/generate/webgpu/index.ts index 12d12cd..caa6a9a 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 { Logger, Queue, bigintAsUintNArray, bigintToHex } from '#utils' +import { Logger, Queue, bigintToHex, bigintToU64 } from '#utils' import { WorkGenerateResponse } from 'nano-pow' import { default as NanoPowGpuComputeShader } from './shaders/compute.wgsl' @@ -294,7 +294,7 @@ export async function generate (hash: bigint, difficulty: bigint, effort: number throw new Error('failed to start') } } - await q.add(init, bigintAsUintNArray(hash, 64, 4), difficulty) + await q.add(init, bigintToU64(hash, 4), difficulty) // Dispatch initial workgroups and set index await dispatch(0, crypto.getRandomValues(seed)[0], effort) let dispatchIndex = 1 diff --git a/src/lib/validate/index.ts b/src/lib/validate/index.ts index a648843..1eb90b9 100644 --- a/src/lib/validate/index.ts +++ b/src/lib/validate/index.ts @@ -1,7 +1,7 @@ //! SPDX-FileCopyrightText: 2025 Chris Duncan //! SPDX-License-Identifier: GPL-3.0-or-later -import { Logger, RECEIVE, SEND, bigintAsUintNArray, bigintToHex } from '#utils' +import { Logger, RECEIVE, SEND, bigintToHex, bigintToU64 } from '#utils' import { WorkValidateResponse } from 'nano-pow' const logger = new Logger() @@ -86,7 +86,7 @@ function init (seed: bigint, hash: BigUint64Array): void { } function blake2b (work: bigint, hash: bigint): void { - init(work, bigintAsUintNArray(hash, 64, 4)) + init(work, bigintToU64(hash, 4)) for (let i = 0; i < 12; i++) { ROUND(i) } diff --git a/src/utils/bigint.ts b/src/utils/bigint.ts index 10db9ee..ab5a0b3 100644 --- a/src/utils/bigint.ts +++ b/src/utils/bigint.ts @@ -1,34 +1,27 @@ //! SPDX-FileCopyrightText: 2025 Chris Duncan //! SPDX-License-Identifier: GPL-3.0-or-later -export function bigintAsUintNArray (int: bigint, bits: number, length: number = 0) { - const UintTypedArray: { [key: number]: any } = { - 8: Uint8Array, - 16: Uint16Array, - 32: Uint32Array, - 64: BigUint64Array - } - if (![8, 16, 32, 64].includes(bits)) throw new Error('Invalid TypedArray UintN subclass') +function bigintToUintArray (out: Uint32Array | BigUint64Array, int: bigint): void { if (int < 0n) int = ~(int - 1n) - length = Math.max(length, Math.ceil(bigintByteLength(int) / bits)) - const mask: bigint = (1n << BigInt(bits)) - 1n - const uintArray = new UintTypedArray[bits](length) - for (let i = length - 1; i >= 0; i--) { - bits === 64 - ? uintArray[i] = int & mask - : uintArray[i] = (Number(int & mask)) - int >>= BigInt(bits) + const bits = out instanceof BigUint64Array ? 64n : 32n + const mask = (1n << bits) - 1n + for (let i = out.length - 1; i >= 0 && int > 0n; i--) { + const v = int & mask + out[i] = bits === 64n ? v : Number(v) + int >>= bits } - return uintArray } -export function bigintByteLength (int: bigint): number { - let byteLength = 0 - while (int > 0n || int < -1n) { - byteLength++ - int >>= 8n - } - return byteLength +export function bigintToU32 (int: bigint, length: number): Uint32Array { + const u32 = new Uint32Array(length) + bigintToUintArray(u32, int) + return u32 +} + +export function bigintToU64 (int: bigint, length: number): BigUint64Array { + const u64 = new BigUint64Array(length) + bigintToUintArray(u64, int) + return u64 } export function bigintFrom (value: bigint | boolean | number | string | unknown, type?: 'bin' | 'oct' | 'hex'): bigint {