@reclaimprotocol/zk-symmetric-crypto
Version:
JS Wrappers for Various ZK Snark Circuits
53 lines (52 loc) • 1.78 kB
JavaScript
import init, { is_circuit_loaded, is_solver_loaded, load_circuit, load_solver } from './wasm-binding.js';
const BIN_NAME = 'release';
export async function loadExpander(fetcher, logger) {
const buff = await fetcher
.fetch('expander', `${BIN_NAME}.wasm`, logger);
const wasm = await init({ 'module_or_path': buff });
return { wasm, module: buff };
}
export async function loadCircuitIfRequired(alg, fetcher, logger) {
const id = 0;
if (is_circuit_loaded(id)) {
return;
}
logger?.debug({ alg }, 'fetching circuit');
const circuit = await fetcher.fetch('expander', `${alg}.txt`);
logger?.debug({ alg }, 'circuit fetched, loading...');
load_circuit(id, circuit);
logger?.debug({ alg }, 'circuit loaded');
}
export async function loadProverCircuitIfRequired(alg, fetcher, logger) {
const id = 0;
if (is_solver_loaded(id)) {
return;
}
logger?.debug({ alg }, 'fetching solver');
const circuit = await fetcher.fetch('expander', `${alg}-solver.txt`);
logger?.debug({ alg }, 'solver fetched, loading...');
load_solver(id, circuit);
logger?.debug({ alg }, 'solver loaded');
}
export function makeWorkerPool(maxWorkers, initWorker) {
let pool = [];
let nextIdx = 0;
return {
getNext() {
if (pool.length < maxWorkers) {
pool.push(initWorker());
}
const worker = pool[nextIdx];
nextIdx = (nextIdx + 1) % pool.length;
return worker;
},
async release() {
const _pool = pool;
pool = [];
for (const worker of _pool) {
const _res = await worker.catch(() => undefined);
_res?.close();
}
},
};
}