Files
salvium-rs/test/test-full-worker.js
T
Matt Hess 7730b6993f ● Add AssemblyScript WASM VM for RandomX full mode
- Create assembly/vm.ts with full RandomX VM implementation
    - 256 instructions, 2048 iterations per hash
    - Native u64/f64 operations in WebAssembly
    - Full mode dataset lookups (2GB pre-computed)

  - Update miner to use WASM VM for full mode
    - mining-worker-asm.js uses pre-compiled WASM
    - ~32 H/s per thread (4x faster than light mode)
    - 8 threads achieves ~260 H/s

  - Clean up redundant code
    - Remove mining-worker-full.js (old JIT approach)
    - Consolidate 'asm' mode into 'full' mode
2026-01-18 01:16:10 +00:00

107 lines
3.0 KiB
JavaScript

/**
* Test full mode worker directly
*/
import { Worker } from 'worker_threads';
import { fileURLToPath } from 'url';
import { dirname, join } from 'path';
import { randomx_init_cache, randomx_superscalarhash } from '../src/randomx/vendor/index.js';
import { RANDOMX_DATASET_ITEM_COUNT } from '../src/randomx/full-mode.js';
const __dirname = dirname(fileURLToPath(import.meta.url));
const WORKER_PATH = join(__dirname, '../src/stratum/mining-worker-asm.js');
const TEST_SEED = '33d64e8899b07bcc1234567890abcdef1234567890abcdef1234567890abcdef';
async function main() {
console.log('=== Full Mode Worker Test ===\n');
// Generate a small test dataset
console.log('Generating small test dataset (1000 items)...');
const TEST_ITEMS = 1000;
const seedBytes = Buffer.from(TEST_SEED, 'hex');
const cache = randomx_init_cache(seedBytes);
const ssHash = randomx_superscalarhash(cache);
// Use SharedArrayBuffer
const datasetSize = RANDOMX_DATASET_ITEM_COUNT * 8 * 8;
console.log('Creating SharedArrayBuffer of size:', datasetSize);
try {
const sharedBuffer = new SharedArrayBuffer(datasetSize);
const datasetView = new BigInt64Array(sharedBuffer);
// Only fill first 1000 items for testing
for (let i = 0; i < TEST_ITEMS; i++) {
const item = ssHash(BigInt(i));
const offset = i * 8;
for (let j = 0; j < 8; j++) {
datasetView[offset + j] = item[j];
}
}
console.log('Test dataset ready\n');
// Create worker
console.log('Creating worker...');
const worker = new Worker(WORKER_PATH, {
workerData: { workerId: 0, mode: 'full' }
});
worker.on('message', (msg) => {
console.log('Worker message:', msg);
});
worker.on('error', (err) => {
console.error('Worker error:', err);
});
// Wait for ready
await new Promise(resolve => {
worker.once('message', (msg) => {
if (msg.type === 'ready') {
console.log('Worker ready');
resolve();
}
});
});
// Send job with dataset
console.log('\nSending job to worker...');
const testJob = {
job_id: 'test123',
blob: '0707a5e28db705ede4b8bef6e9dbf2f0d2e2d0d0e5d0d4b8e0d5d0c8c0d0d4b8e5e0c0d0d0c0b8e0e0d0d0b8c0e0d4d0b8',
target: 'ffffff00',
height: 12345
};
worker.postMessage({
type: 'job',
job: testJob,
seedHash: TEST_SEED,
startNonce: 0,
dataset: sharedBuffer
});
// Wait a bit and check hash count
console.log('Waiting 3 seconds for hashes...');
await new Promise(resolve => setTimeout(resolve, 3000));
worker.postMessage({ type: 'getHashCount' });
await new Promise(resolve => setTimeout(resolve, 500));
// Stop worker
worker.postMessage({ type: 'stop' });
await new Promise(resolve => setTimeout(resolve, 500));
worker.terminate();
console.log('\nTest complete');
} catch (err) {
console.error('Error:', err);
}
}
main().catch(console.error);