UNPKG

nanpow

Version:

This repository contains a WebAssembly based multi-threaded PoW generator.

296 lines (290 loc) 46.9 kB
/** * Decodes the provided base64 encoded wasm stub * @param stub - The base64 wasm stub */ function decodeWasmModule(stub) { const str = atob(stub); const buffer = new Uint8Array(str.length); for (let ii = 0; ii < str.length; ++ii) buffer[ii] = str.charCodeAt(ii); return buffer; } const IS_BROWSER = typeof window !== "undefined"; class CrossWorker { constructor(code) { this._instance = null; // Browser if (IS_BROWSER) { // Create worker blob const workerBlob = new Blob([code], { type: "text/javascript" }); const workerBlobURL = window.URL.createObjectURL(workerBlob); this._instance = new Worker(workerBlobURL); this._instance.onmessage = (e) => { this.onmessage(e); }; } // Node else { const { Worker } = require("worker_threads"); const worker = new Worker(code, { eval: true }); worker.on("message", (e) => { this.onmessage({ data: e }); }); this._instance = worker; } } postMessage(e) { if (IS_BROWSER) this._instance.postMessage(e); else { this._instance.postMessage(e); } } } var powC = `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`; let crypto = null; if (typeof window !== "undefined") { crypto = window.crypto; } else { crypto = require("crypto").webcrypto; } var crypto$1 = crypto; // Pre-decode simulation wasm code const POW_CODE = decodeWasmModule(powC); /** * Thread action messages */ const THREAD_ACTION_INIT = 0; const THREAD_ACTION_INIT_DONE = 1; const THREAD_ACTION_UPDATE = 2; const THREAD_ACTION_UPDATE_DONE = 3; function hexReverse(hex) { let out = ""; for (let i = hex.length; i > 0; i -= 2) { out += hex.slice(i - 2, i); } return out; } function bytesToHex(bytes) { return Array.prototype.map.call(bytes, (x) => ("00" + x.toString(16)).slice(-2)).join("").toUpperCase(); } /** * Inline worker code */ const WORKER_CODE = function () { /** * Thread action messages */ const THREAD_ACTION_INIT = 0; const THREAD_ACTION_INIT_DONE = 1; const THREAD_ACTION_UPDATE = 2; const THREAD_ACTION_UPDATE_DONE = 3; let ctx = null; // @ts-ignore if (typeof WorkerGlobalScope !== "undefined") { // Running inside browser ctx = self; } else { // Running inside node const { parentPort } = require("worker_threads"); // Bridge calls to match web worker API ctx = {}; ctx.postMessage = (e) => { parentPort.postMessage(e); }; ctx.addEventListener = function (_type, callback) { parentPort.on("message", (e) => { callback({ data: e }); }); }; } function arrayHex(arr, length) { let out = ""; for (let i = length - 1; i > -1; i--) { out += (arr[i] > 15 ? "" : "0") + arr[i].toString(16); } return out; } function hexToBytes(hex) { const result = new Uint8Array(hex.length / 2); for (let ii = 0; ii < result.length; ++ii) { result[ii] = parseInt(hex.substring((ii * 2) + 0, (ii * 2) + 2), 16); } return result; } function uint32ToRGBA8(uint32) { return new Uint8Array([ (uint32 >> 24) & 0xFF, (uint32 >> 16) & 0xFF, (uint32 >> 8) & 0xFF, (uint32 >> 0) & 0xFF ]); } // Global webassembly properties let exports = null; // Handle incoming messages from the main thread ctx.addEventListener("message", (e) => { const { data } = e; // Initialization message if (data.action === THREAD_ACTION_INIT) { const packet = data; // Allocate main-thread wasm module (async () => { const memory = new WebAssembly.Memory({ initial: 4, maximum: 4 }); const imports = { env: { memory, } }; const wasm = await WebAssembly.instantiate(packet.module, imports); exports = wasm.exports; ctx.postMessage({ action: THREAD_ACTION_INIT_DONE }); })(); } // Update message else if (data.action === THREAD_ACTION_UPDATE) { const packet = data; const { difficulty, hash0, hash1, work0, work1, blockOffsetX, blockOffsetY, blockSize } = packet; const resultU32 = exports.Calculate(blockOffsetX, blockOffsetY, blockSize, difficulty, work0[0], work0[1], work0[2], work0[3], work1[0], work1[1], work1[2], work1[3], hash0[0], hash0[1], hash0[2], hash0[3], hash1[0], hash1[1], hash1[2], hash1[3]); let hash = null; if (resultU32 !== 0) { // Extract result const resultRGBAU8 = uint32ToRGBA8(resultU32); const result = new Uint8Array([ resultRGBAU8[2], resultRGBAU8[3], work0[2] ^ (resultRGBAU8[0] - 1), work0[3] ^ (resultRGBAU8[1] - 1) ]); const hexA = arrayHex(work1, 4); const hexB = arrayHex(result, 4); hash = hexToBytes(hexA + hexB); } ctx.postMessage({ action: THREAD_ACTION_UPDATE_DONE, data: hash }); } }); }.toString(); const MAX_WORKER_COUNT = 16; const threads = []; let module = null; async function create() { // Create the wasm module const memory = new WebAssembly.Memory({ initial: 4, maximum: 4 }); const imports = { env: { memory, } }; module = await WebAssembly.instantiate(POW_CODE, imports); // Create threads for (let ii = 0; ii < MAX_WORKER_COUNT; ++ii) { const threadId = ii; const worker = new CrossWorker(`(${WORKER_CODE})();`); threads.push({ id: threadId, worker }); } return new Promise(resolve => { // Initialize threads let threadInitCounter = 0; // Initialize the threads for (let ii = 0; ii < threads.length; ++ii) { const thread = threads[ii]; const packet = { id: ii, module: module.module, action: THREAD_ACTION_INIT, }; // Clear previous thread message listener thread.worker.onmessage = null; // Create new thread message listener thread.worker.onmessage = (e) => { const { data } = e; const packet = data; // Thread notified that the initialization is done if (packet.action === THREAD_ACTION_INIT_DONE) { // Resolve when all threads finished initialization if (++threadInitCounter >= threads.length) { resolve(); } } }; thread.worker.postMessage(packet); } }); } const BLOCK_SIZE = 128; const THREAD_DIMENSION = 4; /** * Calculates PoW based on the provided hash and difficulty * @param hash - The hash to calculate PoW for * @param difficulty - The difficulty of the PoW to calculate for * @param blockSize - Optional custom block size to use * @param threadDimension - Optional custom thread dimension to use */ async function getWork(hash, difficulty, blockSize = BLOCK_SIZE, threadDimension = THREAD_DIMENSION) { // If module isn't created yet, then create it first if (module === null) await create(); const reverseHex = hexReverse(bytesToHex(hash)); const hash0 = new Uint32Array([ parseInt(reverseHex.slice(56, 64), 16), parseInt(reverseHex.slice(48, 56), 16), parseInt(reverseHex.slice(40, 48), 16), parseInt(reverseHex.slice(32, 40), 16), ]); const hash1 = new Uint32Array([ parseInt(reverseHex.slice(24, 32), 16), parseInt(reverseHex.slice(16, 24), 16), parseInt(reverseHex.slice(8, 16), 16), parseInt(reverseHex.slice(0, 8), 16), ]); // Run until match return new Promise(resolve => { setTimeout(function updateLoop() { const work0 = crypto$1.getRandomValues(new Uint8Array(4)); const work1 = crypto$1.getRandomValues(new Uint8Array(4)); let isResolved = false; let threadUpdateCounter = 0; for (let yy = 0; yy < threadDimension; ++yy) { for (let xx = 0; xx < threadDimension; ++xx) { const bx = xx; const by = yy; const { worker } = threads[(by * threadDimension) + bx]; worker.onmessage = (e) => { const { data } = e; const packet = data; // Thread notified that the work is done if (packet.action === THREAD_ACTION_UPDATE_DONE) { // Found a match if (packet.data !== null) { // Terminate all workers //for (let ii = 0; ii < threads.length; ++ii) { // threads[ii].worker.terminate(); //} // We can abort now if (!isResolved) { resolve(packet.data); isResolved = true; } } else if (++threadUpdateCounter >= threads.length) { // Continue update loop setTimeout(updateLoop); } } }; const packet = { action: THREAD_ACTION_UPDATE, difficulty: difficulty, hash0: hash0, hash1: hash1, work0: work0, work1: work1, blockSize: BLOCK_SIZE, blockOffsetX: bx * BLOCK_SIZE, blockOffsetY: by * BLOCK_SIZE, }; worker.postMessage(packet); } } }); }); } export { getWork };