//! 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'
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])
//! 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'
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
//! 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()
}
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)
}
//! 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 {