nanpow
Version:
This repository contains a WebAssembly based multi-threaded PoW generator.
296 lines (290 loc) • 46.9 kB
JavaScript
/**
* 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 };