@axiom-crypto/halo2-wasm-cli
Version:
Halo2 Javascript library
125 lines (119 loc) • 4.7 kB
text/typescript
import * as ts from 'typescript';
import * as vm from 'vm';
import * as fs from 'fs';
import * as path from 'path';
import * as os from 'os';
import { DEFAULT_CIRCUIT_CONFIG } from '@axiom-crypto/halo2-wasm/shared';
import { execSync } from 'child_process';
export async function getFunctionFromTs(relativePath: string, shouldCircuitFunctionExist = true) {
const code = fs.readFileSync(path.resolve(relativePath), 'utf8');
const result = ts.transpileModule(code, {
compilerOptions: { module: ts.ModuleKind.CommonJS }
});
const script = new vm.Script(result.outputText);
const customRequire = (moduleName: string) => {
try {
if (moduleName === "@axiom-crypto/halo2-lib-js") {
return require("@axiom-crypto/halo2-lib-js");
}
else {
const npmRoot = execSync('npm root').toString().trim();
return require(`${npmRoot}/${moduleName}`);
}
} catch (e) {
throw new Error(`Cannot find module '${moduleName}'.\n Try installing it globally with 'npm install -g ${moduleName}'`);
}
};
const context = vm.createContext({
exports: {},
require: customRequire,
module: module,
console: console,
__filename: __filename,
__dirname: __dirname,
});
script.runInContext(context);
if (shouldCircuitFunctionExist && !context.exports.circuit) throw new Error("File does not export a `circuit` function");
let config = DEFAULT_CIRCUIT_CONFIG;
let inputs = undefined;
if (context.exports.config) config = context.exports.config;
if (context.exports.inputs) inputs = context.exports.inputs;
return {
circuit: context.exports.circuit,
config,
inputs,
};
}
export async function getRunCircuitFromTs(relativePath: string | undefined) {
const home = os.homedir();
const halo2WasmRunnerPath = path.join(home, '.halo2-wasm', 'run.ts');
const folderPath = path.dirname(halo2WasmRunnerPath);
if (!relativePath) {
relativePath = halo2WasmRunnerPath;
}
const exists = fs.existsSync(path.resolve(relativePath));
if (!exists) {
const run = fs.readFileSync(path.resolve(__dirname, 'run.ts'), 'utf8');
if (!fs.existsSync(folderPath)) {
fs.mkdirSync(folderPath, { recursive: true });
}
fs.writeFileSync(halo2WasmRunnerPath, run);
}
const code = fs.readFileSync(path.resolve(relativePath), 'utf8');
const result = ts.transpileModule(code, {
compilerOptions: { module: ts.ModuleKind.CommonJS }
});
const script = new vm.Script(result.outputText);
const customRequire = (moduleName: string) => {
try {
if (moduleName === "@axiom-crypto/halo2-lib-js") {
return require("@axiom-crypto/halo2-lib-js");
}
else {
const npmRoot = execSync('npm root').toString().trim();
return require(`${npmRoot}/${moduleName}`);
}
} catch (e) {
throw new Error(`Cannot find module '${moduleName}'.\n Try installing it globally with 'npm install -g ${moduleName}'`);
}
};
const context = vm.createContext({
exports: {},
require: customRequire,
module: module,
console: console,
__filename: __filename,
__dirname: __dirname,
});
script.runInContext(context);
if (!fs.existsSync(folderPath)) {
fs.mkdirSync(folderPath, { recursive: true });
}
fs.writeFileSync(halo2WasmRunnerPath, code)
return context.exports.run;
}
export function getUint8ArrayFromBuffer(relativePath: string) {
const buffer = fs.readFileSync(path.resolve(relativePath));
return new Uint8Array(buffer);
}
export function saveBufferToFile(buffer: Buffer, relativePath: string, name: string) {
const filePath = path.resolve(relativePath);
const folderPath = path.dirname(filePath);
if (!fs.existsSync(folderPath)) {
fs.mkdirSync(folderPath, { recursive: true });
}
fs.writeFileSync(filePath, buffer);
console.log(`Saved ${name} to ${filePath}`);
}
export function saveJsonToFile(json: string, relativePath: string, name: string) {
const filePath = path.resolve(relativePath);
const folderPath = path.dirname(filePath);
if (!fs.existsSync(folderPath)) {
fs.mkdirSync(folderPath, { recursive: true });
}
fs.writeFileSync(filePath, json);
console.log(`Saved ${name} to ${filePath}`);
}
export function readJsonFromFile(relativePath: string) {
return JSON.parse(fs.readFileSync(path.resolve(relativePath), 'utf8'))
}