//! SPDX-FileContributor: Ben Green <ben@latenightsketches.com>
//! SPDX-License-Identifier: GPL-3.0-or-later AND MIT
-import { bigintAsUintNArray, bigintRandom, bigintToHex, Logger } from '#utils'
+import { Bytes, Logger, bigintRandom, bigintToHex } from '#utils'
import { WorkGenerateResponse } from 'nano-pow'
import { downsampleSource, drawSource, quadSource } from './shaders'
// Set up INPUT which must be 16 bytes per 32-bit value due to array alignment
for (let i = 0; i < 8; i++) {
- inputHashView.setUint32(i * 16, hash[i])
+ inputHashView.setUint32(i * 16, hash[i], true)
}
inputDifficultyView.setBigUint64(0, difficulty, true)
LOG: logger.log('INPUT', inputArray.buffer.slice(0))
if (isReady === false || effort !== drawEffort || isFirstRetry) {
setup(effort)
}
- init(bigintAsUintNArray(hash, 32, 8), difficulty)
+ init(new Uint32Array(Bytes(hash, 32).buffer), difficulty)
LOG: logger.log('drawing frame 0')
draw(bigintRandom(), drawFbos[0], queries[0])
draw(bigintRandom(), drawFbos[1], queries[1])
//! SPDX-FileCopyrightText: 2025 Chris Duncan <chris@codecow.com>
//! SPDX-License-Identifier: GPL-3.0-or-later
+import { Bytes, Logger, Queue, bigintRandom, bigintToHex } from '#utils'
import { WorkGenerateResponse } from 'nano-pow'
-import { bigintAsUintNArray, bigintRandom, bigintToHex, Logger, Queue } from '#utils'
import { default as NanoPowGpuComputeShader } from './shaders/compute.wgsl'
type NanoPowDeviceStatus = 'Idle' | 'Starting' | 'Unsupported' | 'Ready' | 'Restoring' | 'Crashed'
}
}
-async function init (hash: BigUint64Array, difficulty: bigint): Promise<void> {
+async function init (hash: Uint8Array<ArrayBuffer>, difficulty: bigint): Promise<void> {
LOG: logger.log('variables initializing')
try {
// Save hash data for normal usage and potential recovery efforts
- hashData.set(hash)
+ hashData.set(new BigUint64Array(hash.buffer))
// Write data that will not change per dispatch to uniform buffer object
// Note: u64 size is 8, but total alignment must be multiple of 16
inputData.fill(0n)
for (let i = 0; i < 4; i++) {
- inputDataView.setBigUint64(i * 8, hashData[i])
+ inputDataView.setBigUint64(i * 8, hashData[i], true)
}
inputDataView.setBigUint64(32, difficulty, true)
device.queue.writeBuffer(inputBuffers[0], 0, inputDataView)
throw new Error('failed to start')
}
}
- await q.add(init, bigintAsUintNArray(hash, 64, 4), difficulty)
+ await q.add(init, Bytes(hash, 32), difficulty)
// Dispatch initial workgroups and set index
await dispatch(0, bigintRandom(), effort)
let dispatchIndex = 1
import { NanoPowConfig } from '#lib/config'
import { NanoPowCpu, NanoPowWasm, NanoPowWebgl, NanoPowWebgpu } from '#lib/generate'
import { NanoPowValidate } from '#lib/validate'
-import { bigintFrom, Bytes, Cache, Logger, Queue } from '#utils'
+import { Bytes, Cache, Logger, Queue, bigintFrom } from '#utils'
import { WorkErrorResponse, WorkGenerateResponse, WorkValidateResponse } from 'nano-pow'
const logger = new Logger()
}
switch (api) {
case 'webgpu': {
- return Cache.store(await NanoPowWebgpu(bigintFrom(hash, 'hex'), difficulty, effort, debug))
+ return Cache.store(await NanoPowWebgpu(bigintHash, difficulty, effort, debug))
}
case 'webgl': {
- return Cache.store(await NanoPowWebgl(bigintFrom(hash, 'hex'), difficulty, effort, debug))
+ return Cache.store(await NanoPowWebgl(bigintHash, difficulty, effort, debug))
}
case 'wasm': {
- return Cache.store(await NanoPowWasm(bigintFrom(hash, 'hex'), difficulty, effort, debug))
+ return Cache.store(await NanoPowWasm(bigintHash, difficulty, effort, debug))
}
default: {
- return Cache.store(await NanoPowCpu(bigintFrom(hash, 'hex'), difficulty, debug))
+ return Cache.store(await NanoPowCpu(bigintHash, difficulty, debug))
}
}
} catch (e: any) {
export async function validate (work: unknown, hash: unknown, options?: unknown): Promise<WorkValidateResponse | WorkErrorResponse> {
try {
- const hashBytes = Bytes(hash, 32)
- const workBytes = Bytes(work, 8)
const { debug, difficulty } = await NanoPowConfig(options)
- const result = await NanoPowValidate(workBytes, hashBytes, difficulty, debug)
+ const result = await NanoPowValidate(Bytes(work, 8), Bytes(hash, 32), difficulty, debug)
return result
} catch (e: any) {
return { error: (typeof e === 'string' ? e : (e?.message ?? '')) }
//! 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')
- 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)
- }
- return uintArray
-}
-
export function bigintBitLength (int: bigint): bigint {
let bitLength = 1n
while (int > 1n || int < -1n) {
* Convert a byte buffer to a hex string.
*
* @param {ArrayBuffer} input
- * @param {number} [length]
+ * @param {number} [minLength]
* @returns {string}
*/
export function BytesToHex (input: ArrayBuffer, minLength?: number): string