]> git.codecow.com Git - nano-pow.git/commitdiff
Simplify bigint conversion to bytewords.
authorChris Duncan <chris@codecow.com>
Mon, 22 Jun 2026 07:30:37 +0000 (00:30 -0700)
committerChris Duncan <chris@codecow.com>
Mon, 22 Jun 2026 07:30:37 +0000 (00:30 -0700)
src/lib/generate/webgl/index.ts
src/lib/generate/webgpu/index.ts
src/lib/validate/index.ts
src/utils/bigint.ts

index aee86ebb38a44c99ea8f9cceb9f7e26ada98caa4..5800dcb8d8e8df4962fbf09daafa72cdc3fefe7f 100644 (file)
@@ -2,7 +2,7 @@
 //! SPDX-FileContributor: Ben Green <ben@latenightsketches.com>
 //! 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])
index 12d12cd019b4fc295e56cb08eff94b07239a6d97..caa6a9a7766d3d09150ddaa6a829456bf2c94ff3 100644 (file)
@@ -1,7 +1,7 @@
 //! SPDX-FileCopyrightText: 2025 Chris Duncan <chris@codecow.com>
 //! 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
index a648843f7ebe9d8ad847ebded9cc2c46bafd9356..1eb90b9d7b60219038a17214837890a9171c04e6 100644 (file)
@@ -1,7 +1,7 @@
 //! SPDX-FileCopyrightText: 2025 Chris Duncan <chris@codecow.com>
 //! 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)
        }
index 10db9ee45395792066db86f7de136325b9985a24..ab5a0b3a11372b0fd0645d146674de86ec662a21 100644 (file)
@@ -1,34 +1,27 @@
 //! SPDX-FileCopyrightText: 2025 Chris Duncan <chris@codecow.com>
 //! 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<ArrayBuffer> | BigUint64Array<ArrayBuffer>, 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<ArrayBuffer> {
+       const u32 = new Uint32Array(length)
+       bigintToUintArray(u32, int)
+       return u32
+}
+
+export function bigintToU64 (int: bigint, length: number): BigUint64Array<ArrayBuffer> {
+       const u64 = new BigUint64Array(length)
+       bigintToUintArray(u64, int)
+       return u64
 }
 
 export function bigintFrom (value: bigint | boolean | number | string | unknown, type?: 'bin' | 'oct' | 'hex'): bigint {