@caatinga/zk 2.4.4 → 2.4.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +79 -40
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +53 -10
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.cjs
CHANGED
|
@@ -235,24 +235,93 @@ function ptauSizeForConstraints(constraintCount) {
|
|
|
235
235
|
return Math.min(Math.max(needed, 8), 28);
|
|
236
236
|
}
|
|
237
237
|
|
|
238
|
-
// src/
|
|
238
|
+
// src/serialization/curve-bytes.ts
|
|
239
|
+
function concatG1Bytes(point) {
|
|
240
|
+
const bytes = new Uint8Array(point.x.length + point.y.length);
|
|
241
|
+
bytes.set(point.x, 0);
|
|
242
|
+
bytes.set(point.y, point.x.length);
|
|
243
|
+
return bytes;
|
|
244
|
+
}
|
|
245
|
+
function concatG2Bytes(point) {
|
|
246
|
+
const bytes = new Uint8Array(
|
|
247
|
+
point.x[0].length + point.x[1].length + point.y[0].length + point.y[1].length
|
|
248
|
+
);
|
|
249
|
+
let offset = 0;
|
|
250
|
+
for (const chunk of [point.x[0], point.x[1], point.y[0], point.y[1]]) {
|
|
251
|
+
bytes.set(chunk, offset);
|
|
252
|
+
offset += chunk.length;
|
|
253
|
+
}
|
|
254
|
+
return bytes;
|
|
255
|
+
}
|
|
256
|
+
function concatG1Hex(point) {
|
|
257
|
+
return bytesToHex(concatG1Bytes(point));
|
|
258
|
+
}
|
|
259
|
+
function concatG2Hex(point) {
|
|
260
|
+
return bytesToHex(concatG2Bytes(point));
|
|
261
|
+
}
|
|
239
262
|
function bytesToHex(bytes) {
|
|
240
|
-
return Array.from(bytes
|
|
263
|
+
return Array.from(bytes, (byte) => byte.toString(16).padStart(2, "0")).join("");
|
|
241
264
|
}
|
|
242
|
-
|
|
243
|
-
|
|
265
|
+
|
|
266
|
+
// src/build/build-circuit.ts
|
|
267
|
+
var BYTES_PER_LINE = 16;
|
|
268
|
+
function formatRustByteArray(bytes) {
|
|
269
|
+
const chunks = [];
|
|
270
|
+
for (let i = 0; i < bytes.length; i += BYTES_PER_LINE) {
|
|
271
|
+
const slice = Array.from(bytes.slice(i, i + BYTES_PER_LINE));
|
|
272
|
+
chunks.push(
|
|
273
|
+
" " + slice.map((b) => `0x${b.toString(16).padStart(2, "0")}`).join(", ") + ","
|
|
274
|
+
);
|
|
275
|
+
}
|
|
276
|
+
return chunks.join("\n");
|
|
277
|
+
}
|
|
278
|
+
function generateVkRust(_vkPath, rawJson) {
|
|
279
|
+
const raw = JSON.parse(rawJson);
|
|
244
280
|
const vk = serializeVk(raw);
|
|
245
|
-
const
|
|
281
|
+
const alphaBytes = concatG1Bytes(vk.alpha);
|
|
282
|
+
const betaBytes = concatG2Bytes(vk.beta);
|
|
283
|
+
const gammaBytes = concatG2Bytes(vk.gamma);
|
|
284
|
+
const deltaBytes = concatG2Bytes(vk.delta);
|
|
285
|
+
const icEntries = vk.ic.map(concatG1Bytes);
|
|
286
|
+
const icItems = icEntries.map(
|
|
287
|
+
(ic, i) => ` G1Affine::from_array(&env, &[
|
|
288
|
+
${formatRustByteArray(ic)}
|
|
289
|
+
]), // IC[${i}]`
|
|
290
|
+
).join("\n");
|
|
291
|
+
return [
|
|
246
292
|
"// @generated by caatinga zk build --embed-vk",
|
|
293
|
+
`// DO NOT EDIT \u2014 re-run "caatinga zk build <circuit> --embed-vk" to regenerate.`,
|
|
294
|
+
"",
|
|
247
295
|
"use soroban_sdk::crypto::bls12_381::{G1Affine, G2Affine};",
|
|
248
296
|
"",
|
|
249
|
-
"
|
|
250
|
-
|
|
251
|
-
|
|
297
|
+
"#[allow(clippy::too_many_lines)]",
|
|
298
|
+
"pub fn embedded_vk(",
|
|
299
|
+
" env: &soroban_sdk::Env,",
|
|
300
|
+
") -> (G1Affine, G2Affine, G2Affine, G2Affine, soroban_sdk::Vec<G1Affine>) {",
|
|
301
|
+
` let alpha = G1Affine::from_array(&env, &[`,
|
|
302
|
+
formatRustByteArray(alphaBytes),
|
|
303
|
+
" ]);",
|
|
304
|
+
` let beta = G2Affine::from_array(&env, &[`,
|
|
305
|
+
formatRustByteArray(betaBytes),
|
|
306
|
+
" ]);",
|
|
307
|
+
` let gamma = G2Affine::from_array(&env, &[`,
|
|
308
|
+
formatRustByteArray(gammaBytes),
|
|
309
|
+
" ]);",
|
|
310
|
+
` let delta = G2Affine::from_array(&env, &[`,
|
|
311
|
+
formatRustByteArray(deltaBytes),
|
|
312
|
+
" ]);",
|
|
313
|
+
` let ic = soroban_sdk::vec![&env,`,
|
|
314
|
+
icItems,
|
|
315
|
+
" ];",
|
|
316
|
+
" (alpha, beta, gamma, delta, ic)",
|
|
252
317
|
"}",
|
|
253
318
|
""
|
|
254
|
-
];
|
|
255
|
-
|
|
319
|
+
].join("\n");
|
|
320
|
+
}
|
|
321
|
+
async function writeEmbeddedVk(vkPath, verifierSrcDir) {
|
|
322
|
+
const rawJson = await (0, import_promises2.readFile)(vkPath, "utf8");
|
|
323
|
+
const rustSource = generateVkRust(vkPath, rawJson);
|
|
324
|
+
await (0, import_promises2.writeFile)(import_node_path2.default.join(verifierSrcDir, "vk.rs"), rustSource, "utf8");
|
|
256
325
|
}
|
|
257
326
|
async function buildCircuit(options) {
|
|
258
327
|
const circom = await ensureCircom();
|
|
@@ -333,36 +402,6 @@ async function proveCircuit(options) {
|
|
|
333
402
|
var import_core4 = require("@caatinga/core");
|
|
334
403
|
var import_promises4 = require("fs/promises");
|
|
335
404
|
var import_node_path4 = __toESM(require("path"), 1);
|
|
336
|
-
|
|
337
|
-
// src/serialization/curve-bytes.ts
|
|
338
|
-
function concatG1Bytes(point) {
|
|
339
|
-
const bytes = new Uint8Array(point.x.length + point.y.length);
|
|
340
|
-
bytes.set(point.x, 0);
|
|
341
|
-
bytes.set(point.y, point.x.length);
|
|
342
|
-
return bytes;
|
|
343
|
-
}
|
|
344
|
-
function concatG2Bytes(point) {
|
|
345
|
-
const bytes = new Uint8Array(
|
|
346
|
-
point.x[0].length + point.x[1].length + point.y[0].length + point.y[1].length
|
|
347
|
-
);
|
|
348
|
-
let offset = 0;
|
|
349
|
-
for (const chunk of [point.x[0], point.x[1], point.y[0], point.y[1]]) {
|
|
350
|
-
bytes.set(chunk, offset);
|
|
351
|
-
offset += chunk.length;
|
|
352
|
-
}
|
|
353
|
-
return bytes;
|
|
354
|
-
}
|
|
355
|
-
function concatG1Hex(point) {
|
|
356
|
-
return bytesToHex2(concatG1Bytes(point));
|
|
357
|
-
}
|
|
358
|
-
function concatG2Hex(point) {
|
|
359
|
-
return bytesToHex2(concatG2Bytes(point));
|
|
360
|
-
}
|
|
361
|
-
function bytesToHex2(bytes) {
|
|
362
|
-
return Array.from(bytes, (byte) => byte.toString(16).padStart(2, "0")).join("");
|
|
363
|
-
}
|
|
364
|
-
|
|
365
|
-
// src/invoke/invoke-verifier.ts
|
|
366
405
|
function buildStellarVerifyProofArgs(options) {
|
|
367
406
|
const serializedProof = serializeProof(options.proof);
|
|
368
407
|
const args = [];
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/serialization/bigint-helpers.ts","../src/serialization/serialize-proof.ts","../src/serialization/serialize-vk.ts","../src/serialization/serialize-public-signals.ts","../src/build/build-circuit.ts","../src/install/lazy-install-zk-tools.ts","../src/errors/ZkError.ts","../src/build/detect-ptau-size.ts","../src/prove/prove-circuit.ts","../src/invoke/invoke-verifier.ts","../src/serialization/curve-bytes.ts"],"sourcesContent":["export { serializeProof, type SerializedProof, type SnarkjsProof } from \"./serialization/serialize-proof.js\";\nexport { serializeVk, type SerializedVk, type SnarkjsVk } from \"./serialization/serialize-vk.js\";\nexport { serializePublicSignals } from \"./serialization/serialize-public-signals.js\";\nexport { buildCircuit, type BuildCircuitOptions } from \"./build/build-circuit.js\";\nexport { proveCircuit, type ProveCircuitOptions } from \"./prove/prove-circuit.js\";\nexport { invokeVerifier, buildStellarVerifyProofArgs, type InvokeVerifierOptions, type InvokeVerifierResult } from \"./invoke/invoke-verifier.js\";\nexport { ptauSizeForConstraints } from \"./build/detect-ptau-size.js\";\nexport { ZkError } from \"./errors/ZkError.js\";\n","/**\n * Convert a decimal string to a little-endian unsigned 32-byte array.\n */\nexport function decimalToLe32(decimal: string): Uint8Array {\n let value = BigInt(decimal);\n const out = new Uint8Array(32);\n for (let i = 0; i < 32; i++) {\n out[i] = Number(value & 0xffn);\n value >>= 8n;\n }\n return out;\n}\n\n/**\n * Convert a decimal string to a big-endian unsigned 48-byte array.\n */\nexport function decimalToBe48(decimal: string): Uint8Array {\n let value = BigInt(decimal);\n const out = new Uint8Array(48);\n for (let i = 47; i >= 0; i--) {\n out[i] = Number(value & 0xffn);\n value >>= 8n;\n }\n return out;\n}\n","import { decimalToBe48 } from \"./bigint-helpers.js\";\n\nexport type SerializedG1 = {\n x: Uint8Array;\n y: Uint8Array;\n};\n\nexport type SerializedG2 = {\n x: [Uint8Array, Uint8Array];\n y: [Uint8Array, Uint8Array];\n};\n\nexport type SerializedProof = {\n a: SerializedG1;\n b: SerializedG2;\n c: SerializedG1;\n};\n\nexport type SnarkjsProof = {\n pi_a: [string, string, string];\n pi_b: [[string, string], [string, string]];\n pi_c: [string, string, string];\n protocol: string;\n curve: string;\n};\n\nexport function serializeProof(proof: SnarkjsProof): SerializedProof {\n if (proof.curve !== \"bls12381\") {\n throw new Error(`Expected curve bls12381, got ${proof.curve}`);\n }\n\n return {\n a: {\n x: decimalToBe48(proof.pi_a[0]),\n y: decimalToBe48(proof.pi_a[1]),\n },\n b: {\n x: [decimalToBe48(proof.pi_b[0][1]), decimalToBe48(proof.pi_b[0][0])],\n y: [decimalToBe48(proof.pi_b[1][1]), decimalToBe48(proof.pi_b[1][0])],\n },\n c: {\n x: decimalToBe48(proof.pi_c[0]),\n y: decimalToBe48(proof.pi_c[1]),\n },\n };\n}\n","import { decimalToBe48 } from \"./bigint-helpers.js\";\nimport type { SerializedG1, SerializedG2 } from \"./serialize-proof.js\";\n\nexport type SerializedVk = {\n alpha: SerializedG1;\n beta: SerializedG2;\n gamma: SerializedG2;\n delta: SerializedG2;\n ic: SerializedG1[];\n};\n\nexport type SnarkjsVk = {\n protocol: string;\n curve: string;\n vk_alpha_1: [string, string, string];\n vk_beta_2: [[string, string], [string, string], ...string[][]];\n vk_gamma_2: [[string, string], [string, string], ...string[][]];\n vk_delta_2: [[string, string], [string, string], ...string[][]];\n vk_ic?: Array<[string, string, string]>;\n IC?: Array<[string, string, string]>;\n};\n\nfunction g2FromSnarkjsExport(rows: [[string, string], [string, string], ...string[][]]): SerializedG2 {\n return g2FromSnarkjs([rows[0]!, rows[1]!]);\n}\n\nfunction g1FromSnarkjs(p: [string, string, string]): SerializedG1 {\n return {\n x: decimalToBe48(p[0]),\n y: decimalToBe48(p[1]),\n };\n}\n\nfunction g2FromSnarkjs(p: [[string, string], [string, string]]): SerializedG2 {\n return {\n x: [decimalToBe48(p[0][1]), decimalToBe48(p[0][0])],\n y: [decimalToBe48(p[1][1]), decimalToBe48(p[1][0])],\n };\n}\n\nexport function serializeVk(vk: SnarkjsVk): SerializedVk {\n if (vk.curve !== \"bls12381\") {\n throw new Error(`Expected curve bls12381, got ${vk.curve}`);\n }\n\n const ic = vk.vk_ic ?? vk.IC;\n if (!ic) {\n throw new Error(\"Verification key is missing vk_ic/IC entries.\");\n }\n\n return {\n alpha: g1FromSnarkjs(vk.vk_alpha_1),\n beta: g2FromSnarkjsExport(vk.vk_beta_2),\n gamma: g2FromSnarkjsExport(vk.vk_gamma_2),\n delta: g2FromSnarkjsExport(vk.vk_delta_2),\n ic: ic.map(g1FromSnarkjs),\n };\n}\n","import { decimalToLe32 } from \"./bigint-helpers.js\";\n\nexport function serializePublicSignals(signals: string[]): Uint8Array[] {\n return signals.map((s) => decimalToLe32(s));\n}\n","import { runCommand } from \"@caatinga/core\";\nimport path from \"node:path\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { createHash, randomBytes } from \"node:crypto\";\nimport { ensureCircom, ensurePtau, ensureSnarkjs } from \"../install/lazy-install-zk-tools.js\";\nimport { ptauSizeForConstraints } from \"./detect-ptau-size.js\";\nimport { serializeVk, type SnarkjsVk } from \"../serialization/serialize-vk.js\";\n\nexport type BuildCircuitOptions = {\n circuitName: string;\n circuitPath: string;\n artifactsDir: string;\n embedVk: boolean;\n};\n\nfunction bytesToHex(bytes: Uint8Array): string {\n return Array.from(bytes).map((b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n}\n\nasync function writeEmbeddedVk(\n vkPath: string,\n verifierSrcDir: string\n): Promise<void> {\n const raw = JSON.parse(await readFile(vkPath, \"utf8\")) as SnarkjsVk;\n const vk = serializeVk(raw);\n const lines = [\n \"// @generated by caatinga zk build --embed-vk\",\n \"use soroban_sdk::crypto::bls12_381::{G1Affine, G2Affine};\",\n \"\",\n \"pub fn embedded_vk() -> (G1Affine, G2Affine, G2Affine, G2Affine, alloc::vec::Vec<G1Affine>) {\",\n \" todo!(\\\"Embed VK coordinates from verification_key.json\\\")\",\n ` // alpha.x = ${bytesToHex(vk.alpha.x)}`,\n \"}\",\n \"\",\n ];\n await writeFile(path.join(verifierSrcDir, \"vk.rs\"), lines.join(\"\\n\"), \"utf8\");\n}\n\nexport async function buildCircuit(options: BuildCircuitOptions): Promise<void> {\n const circom = await ensureCircom();\n const snarkjs = await ensureSnarkjs();\n const circuitDir = path.resolve(options.circuitPath);\n const outDir = path.resolve(options.artifactsDir);\n const circuitFile = path.join(circuitDir, \"main.circom\");\n const r1csPath = path.join(outDir, \"main.r1cs\");\n const zkey0 = path.join(outDir, \"circuit_0000.zkey\");\n const zkeyFinal = path.join(outDir, \"circuit_final.zkey\");\n const vkPath = path.join(outDir, \"verification_key.json\");\n\n await mkdir(outDir, { recursive: true });\n\n await runCommand(circom, [\n circuitFile,\n \"--r1cs\",\n \"--wasm\",\n \"--sym\",\n \"-p\",\n \"bls12381\",\n \"-o\",\n outDir,\n ]);\n\n const r1csInfo = await runCommand(snarkjs, [\"r1cs\", \"info\", r1csPath]);\n const constraintMatch = r1csInfo.stdout.match(/# of Constraints:\\s+(\\d+)/);\n const constraints = constraintMatch ? Number.parseInt(constraintMatch[1]!, 10) : 1;\n const ptauSize = ptauSizeForConstraints(constraints);\n const ptauPath = await ensurePtau(ptauSize);\n const entropy = createHash(\"sha256\").update(randomBytes(32)).digest(\"hex\");\n\n await runCommand(snarkjs, [\"groth16\", \"setup\", r1csPath, ptauPath, zkey0]);\n await runCommand(snarkjs, [\"zkey\", \"contribute\", zkey0, zkeyFinal, \"-v\"], {\n input: `caatinga-dev\\n${entropy}\\n`,\n });\n await runCommand(snarkjs, [\"zkey\", \"export\", \"verificationkey\", zkeyFinal, vkPath]);\n\n if (options.embedVk) {\n const verifierSrcDir = path.resolve(\"contracts\", \"verifier\", \"src\");\n await writeEmbeddedVk(vkPath, verifierSrcDir);\n }\n}\n","import { runCommand } from \"@caatinga/core\";\nimport { access, chmod, mkdir, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport os from \"node:os\";\nimport { createHash, randomBytes } from \"node:crypto\";\nimport { ZkError } from \"../errors/ZkError.js\";\n\nconst ZK_CACHE_DIR = path.join(os.homedir(), \".caatinga\", \"zk-tools\");\nconst SNARKJS_VERSION = \"0.7.5\";\nconst CIRCOM_VERSION = \"2.1.9\";\n\nfunction circomAssetName(): string {\n const platform = process.platform;\n const arch = process.arch === \"x64\" ? \"amd64\" : process.arch;\n if (platform === \"linux\") {\n return `circom-linux-${arch}`;\n }\n if (platform === \"darwin\") {\n return `circom-macos-${arch}`;\n }\n throw new ZkError(\n `Unsupported platform for automatic circom install: ${platform}`,\n \"ZK_UNSUPPORTED_PLATFORM\",\n \"Install circom 2.x manually and ensure it is on PATH.\"\n );\n}\n\nexport async function ensureCircom(): Promise<string> {\n const cached = path.join(ZK_CACHE_DIR, \"circom\", CIRCOM_VERSION, \"circom\");\n try {\n await access(cached);\n return cached;\n } catch {\n // Fall through to download.\n }\n\n const asset = circomAssetName();\n const url = `https://github.com/iden3/circom/releases/download/v${CIRCOM_VERSION}/${asset}`;\n const installDir = path.join(ZK_CACHE_DIR, \"circom\", CIRCOM_VERSION);\n await mkdir(installDir, { recursive: true });\n\n const archivePath = path.join(installDir, asset);\n await runCommand(\"curl\", [\"-fsSL\", url, \"-o\", archivePath]);\n await chmod(archivePath, 0o755);\n\n return archivePath;\n}\n\nexport async function ensureSnarkjs(): Promise<string> {\n const installDir = path.join(ZK_CACHE_DIR, `snarkjs-${SNARKJS_VERSION}`);\n const cliPath = path.join(installDir, \"node_modules\", \".bin\", \"snarkjs\");\n\n try {\n await access(cliPath);\n return cliPath;\n } catch {\n await mkdir(installDir, { recursive: true });\n await writeFile(\n path.join(installDir, \"package.json\"),\n JSON.stringify({ name: \"caatinga-zk-snarkjs\", private: true, version: \"0.0.0\" }, null, 2),\n \"utf8\"\n );\n await runCommand(\"npm\", [\"install\", \"--no-save\", \"--legacy-peer-deps\", `snarkjs@${SNARKJS_VERSION}`], {\n cwd: installDir,\n });\n return cliPath;\n }\n}\n\nexport async function ensurePtau(size: number): Promise<string> {\n const ptauDir = path.join(ZK_CACHE_DIR, \"ptau\", \"bls12-381\");\n const finalPath = path.join(ptauDir, `pot${size}_final.ptau`);\n try {\n await access(finalPath);\n return finalPath;\n } catch {\n await mkdir(ptauDir, { recursive: true });\n }\n\n const snarkjs = await ensureSnarkjs();\n const pot0 = path.join(ptauDir, `pot${size}_0000.ptau`);\n const pot1 = path.join(ptauDir, `pot${size}_0001.ptau`);\n const entropy = createHash(\"sha256\").update(randomBytes(32)).digest(\"hex\");\n\n await runCommand(snarkjs, [\"powersoftau\", \"new\", \"bls12-381\", String(size), pot0, \"-v\"]);\n await runCommand(snarkjs, [\n \"powersoftau\",\n \"contribute\",\n pot0,\n pot1,\n \"-v\",\n ], {\n input: `caatinga-dev\\n${entropy}\\n`,\n });\n await runCommand(snarkjs, [\"powersoftau\", \"prepare\", \"phase2\", pot1, finalPath, \"-v\"]);\n\n return finalPath;\n}\n","export class ZkError extends Error {\n constructor(\n message: string,\n public readonly code: string,\n public readonly hint?: string\n ) {\n super(message);\n this.name = \"ZkError\";\n }\n}\n","export function ptauSizeForConstraints(constraintCount: number): number {\n const needed = Math.ceil(Math.log2(Math.max(constraintCount, 1))) + 1;\n return Math.min(Math.max(needed, 8), 28);\n}\n","import { runCommand } from \"@caatinga/core\";\nimport path from \"node:path\";\nimport { access, mkdir } from \"node:fs/promises\";\nimport { ensureSnarkjs } from \"../install/lazy-install-zk-tools.js\";\n\nexport type ProveCircuitOptions = {\n circuitName: string;\n circuitPath: string;\n artifactsDir: string;\n inputPath: string;\n debug: boolean;\n};\n\nexport function resolveCircuitWasmPath(artifactsDir: string): string {\n return path.join(artifactsDir, \"main_js\", \"main.wasm\");\n}\n\nexport async function proveCircuit(options: ProveCircuitOptions): Promise<void> {\n const snarkjs = await ensureSnarkjs();\n const artifactsDir = path.resolve(options.artifactsDir);\n const wasmPath = resolveCircuitWasmPath(artifactsDir);\n const zkeyPath = path.join(artifactsDir, \"circuit_final.zkey\");\n const inputPath = path.resolve(options.inputPath);\n const proofPath = path.join(artifactsDir, \"proof.json\");\n const publicPath = path.join(artifactsDir, \"public.json\");\n\n await mkdir(artifactsDir, { recursive: true });\n\n if (options.debug) {\n const witnessPath = path.join(artifactsDir, \"witness.wtns\");\n await runCommand(snarkjs, [\"wtns\", \"calculate\", wasmPath, inputPath, witnessPath, \"-v\"]);\n await runCommand(snarkjs, [\"groth16\", \"prove\", zkeyPath, witnessPath, proofPath, publicPath]);\n return;\n }\n\n await runCommand(snarkjs, [\n \"groth16\",\n \"fullprove\",\n inputPath,\n wasmPath,\n zkeyPath,\n proofPath,\n publicPath,\n ]);\n\n await access(proofPath);\n await access(publicPath);\n}\n","import { invokeContract, loadConfig, readArtifacts, type CaatingaConfig } from \"@caatinga/core\";\nimport { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { concatG1Hex, concatG2Hex } from \"../serialization/curve-bytes.js\";\nimport { serializeProof, type SnarkjsProof } from \"../serialization/serialize-proof.js\";\nimport { serializeVk, type SnarkjsVk } from \"../serialization/serialize-vk.js\";\nimport { ZkError } from \"../errors/ZkError.js\";\n\nexport type InvokeVerifierOptions = {\n verifierContract: string;\n network: string;\n sourceAccount: string;\n proofPath: string;\n vkPath: string;\n publicSignalsPath: string;\n embedVk: boolean;\n cwd?: string;\n config?: CaatingaConfig;\n};\n\nexport function buildStellarVerifyProofArgs(options: {\n proof: SnarkjsProof;\n vk?: SnarkjsVk;\n publicSignals: string[];\n embedVk: boolean;\n}): string[] {\n const serializedProof = serializeProof(options.proof);\n const args: string[] = [];\n\n if (!options.embedVk) {\n if (!options.vk) {\n throw new ZkError(\"Verification key is required when embedVk is false.\", \"ZK_VK_REQUIRED\");\n }\n\n const serializedVk = serializeVk(options.vk);\n args.push(\n \"--vk\",\n JSON.stringify({\n alpha: concatG1Hex(serializedVk.alpha),\n beta: concatG2Hex(serializedVk.beta),\n gamma: concatG2Hex(serializedVk.gamma),\n delta: concatG2Hex(serializedVk.delta),\n ic: serializedVk.ic.map(concatG1Hex),\n })\n );\n }\n\n args.push(\n \"--proof\",\n JSON.stringify({\n a: concatG1Hex(serializedProof.a),\n b: concatG2Hex(serializedProof.b),\n c: concatG1Hex(serializedProof.c),\n })\n );\n args.push(\"--pub_signals\", JSON.stringify(options.publicSignals));\n\n return args;\n}\n\nexport type InvokeVerifierResult = {\n network: string;\n verifierContract: string;\n contractId: string;\n publicSignals: string[];\n verified: true;\n};\n\nexport async function invokeVerifier(options: InvokeVerifierOptions): Promise<InvokeVerifierResult> {\n const cwd = options.cwd ?? process.cwd();\n const config = options.config ?? await loadConfig({ cwd });\n const proof = JSON.parse(await readFile(path.resolve(cwd, options.proofPath), \"utf8\")) as SnarkjsProof;\n const publicSignals = JSON.parse(\n await readFile(path.resolve(cwd, options.publicSignalsPath), \"utf8\")\n ) as string[];\n\n const vk = options.embedVk\n ? undefined\n : JSON.parse(await readFile(path.resolve(cwd, options.vkPath), \"utf8\")) as SnarkjsVk;\n\n const args = buildStellarVerifyProofArgs({\n proof,\n vk,\n publicSignals,\n embedVk: options.embedVk,\n });\n\n const target = `${options.verifierContract}.verify_proof`;\n const result = await invokeContract({\n config,\n target,\n args,\n networkName: options.network,\n source: options.sourceAccount,\n cwd,\n });\n\n if (!result.result) {\n throw new ZkError(\"Verifier invocation returned no result.\", \"ZK_INVOKE_FAILED\");\n }\n\n if (result.result.trim().toLowerCase() !== \"true\") {\n throw new ZkError(\n `Verifier returned ${result.result.trim()}.`,\n \"ZK_VERIFY_FAILED\"\n );\n }\n\n const artifacts = await readArtifacts(cwd);\n const contractId = artifacts.networks[options.network]?.contracts[options.verifierContract]?.contractId;\n\n if (!contractId) {\n throw new ZkError(\n `No deployed artifact found for \"${options.verifierContract}\" on \"${options.network}\".`,\n \"ZK_INVOKE_FAILED\",\n \"Run caatinga deploy before invoking the verifier.\"\n );\n }\n\n return {\n network: options.network,\n verifierContract: options.verifierContract,\n contractId,\n publicSignals,\n verified: true,\n };\n}\n","import type { SerializedG1, SerializedG2 } from \"./serialize-proof.js\";\n\nexport function concatG1Bytes(point: SerializedG1): Uint8Array {\n const bytes = new Uint8Array(point.x.length + point.y.length);\n bytes.set(point.x, 0);\n bytes.set(point.y, point.x.length);\n return bytes;\n}\n\nexport function concatG2Bytes(point: SerializedG2): Uint8Array {\n const bytes = new Uint8Array(\n point.x[0].length + point.x[1].length + point.y[0].length + point.y[1].length\n );\n let offset = 0;\n for (const chunk of [point.x[0], point.x[1], point.y[0], point.y[1]]) {\n bytes.set(chunk, offset);\n offset += chunk.length;\n }\n return bytes;\n}\n\nexport function concatG1Hex(point: SerializedG1): string {\n return bytesToHex(concatG1Bytes(point));\n}\n\nexport function concatG2Hex(point: SerializedG2): string {\n return bytesToHex(concatG2Bytes(point));\n}\n\nfunction bytesToHex(bytes: Uint8Array): string {\n return Array.from(bytes, (byte) => byte.toString(16).padStart(2, \"0\")).join(\"\");\n}\n"],"mappings":"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","names":["import_core","import_node_path","import_promises","import_node_crypto","path","os","path","import_core","import_node_path","import_promises","path","import_core","import_promises","import_node_path","bytesToHex","path"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/serialization/bigint-helpers.ts","../src/serialization/serialize-proof.ts","../src/serialization/serialize-vk.ts","../src/serialization/serialize-public-signals.ts","../src/build/build-circuit.ts","../src/install/lazy-install-zk-tools.ts","../src/errors/ZkError.ts","../src/build/detect-ptau-size.ts","../src/serialization/curve-bytes.ts","../src/prove/prove-circuit.ts","../src/invoke/invoke-verifier.ts"],"sourcesContent":["export { serializeProof, type SerializedProof, type SnarkjsProof } from \"./serialization/serialize-proof.js\";\nexport { serializeVk, type SerializedVk, type SnarkjsVk } from \"./serialization/serialize-vk.js\";\nexport { serializePublicSignals } from \"./serialization/serialize-public-signals.js\";\nexport { buildCircuit, type BuildCircuitOptions } from \"./build/build-circuit.js\";\nexport { proveCircuit, type ProveCircuitOptions } from \"./prove/prove-circuit.js\";\nexport { invokeVerifier, buildStellarVerifyProofArgs, type InvokeVerifierOptions, type InvokeVerifierResult } from \"./invoke/invoke-verifier.js\";\nexport { ptauSizeForConstraints } from \"./build/detect-ptau-size.js\";\nexport { ZkError } from \"./errors/ZkError.js\";\n","/**\n * Convert a decimal string to a little-endian unsigned 32-byte array.\n */\nexport function decimalToLe32(decimal: string): Uint8Array {\n let value = BigInt(decimal);\n const out = new Uint8Array(32);\n for (let i = 0; i < 32; i++) {\n out[i] = Number(value & 0xffn);\n value >>= 8n;\n }\n return out;\n}\n\n/**\n * Convert a decimal string to a big-endian unsigned 48-byte array.\n */\nexport function decimalToBe48(decimal: string): Uint8Array {\n let value = BigInt(decimal);\n const out = new Uint8Array(48);\n for (let i = 47; i >= 0; i--) {\n out[i] = Number(value & 0xffn);\n value >>= 8n;\n }\n return out;\n}\n","import { decimalToBe48 } from \"./bigint-helpers.js\";\n\nexport type SerializedG1 = {\n x: Uint8Array;\n y: Uint8Array;\n};\n\nexport type SerializedG2 = {\n x: [Uint8Array, Uint8Array];\n y: [Uint8Array, Uint8Array];\n};\n\nexport type SerializedProof = {\n a: SerializedG1;\n b: SerializedG2;\n c: SerializedG1;\n};\n\nexport type SnarkjsProof = {\n pi_a: [string, string, string];\n pi_b: [[string, string], [string, string]];\n pi_c: [string, string, string];\n protocol: string;\n curve: string;\n};\n\nexport function serializeProof(proof: SnarkjsProof): SerializedProof {\n if (proof.curve !== \"bls12381\") {\n throw new Error(`Expected curve bls12381, got ${proof.curve}`);\n }\n\n return {\n a: {\n x: decimalToBe48(proof.pi_a[0]),\n y: decimalToBe48(proof.pi_a[1]),\n },\n b: {\n x: [decimalToBe48(proof.pi_b[0][1]), decimalToBe48(proof.pi_b[0][0])],\n y: [decimalToBe48(proof.pi_b[1][1]), decimalToBe48(proof.pi_b[1][0])],\n },\n c: {\n x: decimalToBe48(proof.pi_c[0]),\n y: decimalToBe48(proof.pi_c[1]),\n },\n };\n}\n","import { decimalToBe48 } from \"./bigint-helpers.js\";\nimport type { SerializedG1, SerializedG2 } from \"./serialize-proof.js\";\n\nexport type SerializedVk = {\n alpha: SerializedG1;\n beta: SerializedG2;\n gamma: SerializedG2;\n delta: SerializedG2;\n ic: SerializedG1[];\n};\n\nexport type SnarkjsVk = {\n protocol: string;\n curve: string;\n vk_alpha_1: [string, string, string];\n vk_beta_2: [[string, string], [string, string], ...string[][]];\n vk_gamma_2: [[string, string], [string, string], ...string[][]];\n vk_delta_2: [[string, string], [string, string], ...string[][]];\n vk_ic?: Array<[string, string, string]>;\n IC?: Array<[string, string, string]>;\n};\n\nfunction g2FromSnarkjsExport(rows: [[string, string], [string, string], ...string[][]]): SerializedG2 {\n return g2FromSnarkjs([rows[0]!, rows[1]!]);\n}\n\nfunction g1FromSnarkjs(p: [string, string, string]): SerializedG1 {\n return {\n x: decimalToBe48(p[0]),\n y: decimalToBe48(p[1]),\n };\n}\n\nfunction g2FromSnarkjs(p: [[string, string], [string, string]]): SerializedG2 {\n return {\n x: [decimalToBe48(p[0][1]), decimalToBe48(p[0][0])],\n y: [decimalToBe48(p[1][1]), decimalToBe48(p[1][0])],\n };\n}\n\nexport function serializeVk(vk: SnarkjsVk): SerializedVk {\n if (vk.curve !== \"bls12381\") {\n throw new Error(`Expected curve bls12381, got ${vk.curve}`);\n }\n\n const ic = vk.vk_ic ?? vk.IC;\n if (!ic) {\n throw new Error(\"Verification key is missing vk_ic/IC entries.\");\n }\n\n return {\n alpha: g1FromSnarkjs(vk.vk_alpha_1),\n beta: g2FromSnarkjsExport(vk.vk_beta_2),\n gamma: g2FromSnarkjsExport(vk.vk_gamma_2),\n delta: g2FromSnarkjsExport(vk.vk_delta_2),\n ic: ic.map(g1FromSnarkjs),\n };\n}\n","import { decimalToLe32 } from \"./bigint-helpers.js\";\n\nexport function serializePublicSignals(signals: string[]): Uint8Array[] {\n return signals.map((s) => decimalToLe32(s));\n}\n","import { runCommand } from \"@caatinga/core\";\nimport path from \"node:path\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { createHash, randomBytes } from \"node:crypto\";\nimport { ensureCircom, ensurePtau, ensureSnarkjs } from \"../install/lazy-install-zk-tools.js\";\nimport { ptauSizeForConstraints } from \"./detect-ptau-size.js\";\nimport { serializeVk, type SnarkjsVk } from \"../serialization/serialize-vk.js\";\nimport { concatG1Bytes, concatG2Bytes } from \"../serialization/curve-bytes.js\";\n\nexport type BuildCircuitOptions = {\n circuitName: string;\n circuitPath: string;\n artifactsDir: string;\n embedVk: boolean;\n};\n\nconst BYTES_PER_LINE = 16;\n\nfunction formatRustByteArray(bytes: Uint8Array): string {\n const chunks: string[] = [];\n for (let i = 0; i < bytes.length; i += BYTES_PER_LINE) {\n const slice = Array.from(bytes.slice(i, i + BYTES_PER_LINE));\n chunks.push(\n \" \" + slice.map((b) => `0x${b.toString(16).padStart(2, \"0\")}`).join(\", \") + \",\"\n );\n }\n return chunks.join(\"\\n\");\n}\n\nexport function generateVkRust(_vkPath: string, rawJson: string): string {\n const raw = JSON.parse(rawJson) as SnarkjsVk;\n const vk = serializeVk(raw);\n\n const alphaBytes = concatG1Bytes(vk.alpha);\n const betaBytes = concatG2Bytes(vk.beta);\n const gammaBytes = concatG2Bytes(vk.gamma);\n const deltaBytes = concatG2Bytes(vk.delta);\n const icEntries = vk.ic.map(concatG1Bytes);\n\n const icItems = icEntries\n .map(\n (ic, i) =>\n ` G1Affine::from_array(&env, &[\\n${formatRustByteArray(ic)}\\n ]), // IC[${i}]`\n )\n .join(\"\\n\");\n\n return [\n \"// @generated by caatinga zk build --embed-vk\",\n `// DO NOT EDIT — re-run \"caatinga zk build <circuit> --embed-vk\" to regenerate.`,\n \"\",\n \"use soroban_sdk::crypto::bls12_381::{G1Affine, G2Affine};\",\n \"\",\n \"#[allow(clippy::too_many_lines)]\",\n \"pub fn embedded_vk(\",\n \" env: &soroban_sdk::Env,\",\n \") -> (G1Affine, G2Affine, G2Affine, G2Affine, soroban_sdk::Vec<G1Affine>) {\",\n ` let alpha = G1Affine::from_array(&env, &[`,\n formatRustByteArray(alphaBytes),\n \" ]);\",\n ` let beta = G2Affine::from_array(&env, &[`,\n formatRustByteArray(betaBytes),\n \" ]);\",\n ` let gamma = G2Affine::from_array(&env, &[`,\n formatRustByteArray(gammaBytes),\n \" ]);\",\n ` let delta = G2Affine::from_array(&env, &[`,\n formatRustByteArray(deltaBytes),\n \" ]);\",\n ` let ic = soroban_sdk::vec![&env,`,\n icItems,\n \" ];\",\n \" (alpha, beta, gamma, delta, ic)\",\n \"}\",\n \"\",\n ].join(\"\\n\");\n}\n\nasync function writeEmbeddedVk(\n vkPath: string,\n verifierSrcDir: string,\n): Promise<void> {\n const rawJson = await readFile(vkPath, \"utf8\");\n const rustSource = generateVkRust(vkPath, rawJson);\n await writeFile(path.join(verifierSrcDir, \"vk.rs\"), rustSource, \"utf8\");\n}\n\nexport async function buildCircuit(options: BuildCircuitOptions): Promise<void> {\n const circom = await ensureCircom();\n const snarkjs = await ensureSnarkjs();\n const circuitDir = path.resolve(options.circuitPath);\n const outDir = path.resolve(options.artifactsDir);\n const circuitFile = path.join(circuitDir, \"main.circom\");\n const r1csPath = path.join(outDir, \"main.r1cs\");\n const zkey0 = path.join(outDir, \"circuit_0000.zkey\");\n const zkeyFinal = path.join(outDir, \"circuit_final.zkey\");\n const vkPath = path.join(outDir, \"verification_key.json\");\n\n await mkdir(outDir, { recursive: true });\n\n await runCommand(circom, [\n circuitFile,\n \"--r1cs\",\n \"--wasm\",\n \"--sym\",\n \"-p\",\n \"bls12381\",\n \"-o\",\n outDir,\n ]);\n\n const r1csInfo = await runCommand(snarkjs, [\"r1cs\", \"info\", r1csPath]);\n const constraintMatch = r1csInfo.stdout.match(/# of Constraints:\\s+(\\d+)/);\n const constraints = constraintMatch ? Number.parseInt(constraintMatch[1]!, 10) : 1;\n const ptauSize = ptauSizeForConstraints(constraints);\n const ptauPath = await ensurePtau(ptauSize);\n const entropy = createHash(\"sha256\").update(randomBytes(32)).digest(\"hex\");\n\n await runCommand(snarkjs, [\"groth16\", \"setup\", r1csPath, ptauPath, zkey0]);\n await runCommand(snarkjs, [\"zkey\", \"contribute\", zkey0, zkeyFinal, \"-v\"], {\n input: `caatinga-dev\\n${entropy}\\n`,\n });\n await runCommand(snarkjs, [\"zkey\", \"export\", \"verificationkey\", zkeyFinal, vkPath]);\n\n if (options.embedVk) {\n const verifierSrcDir = path.resolve(\"contracts\", \"verifier\", \"src\");\n await writeEmbeddedVk(vkPath, verifierSrcDir);\n }\n}\n","import { runCommand } from \"@caatinga/core\";\nimport { access, chmod, mkdir, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport os from \"node:os\";\nimport { createHash, randomBytes } from \"node:crypto\";\nimport { ZkError } from \"../errors/ZkError.js\";\n\nconst ZK_CACHE_DIR = path.join(os.homedir(), \".caatinga\", \"zk-tools\");\nconst SNARKJS_VERSION = \"0.7.5\";\nconst CIRCOM_VERSION = \"2.1.9\";\n\nfunction circomAssetName(): string {\n const platform = process.platform;\n const arch = process.arch === \"x64\" ? \"amd64\" : process.arch;\n if (platform === \"linux\") {\n return `circom-linux-${arch}`;\n }\n if (platform === \"darwin\") {\n return `circom-macos-${arch}`;\n }\n throw new ZkError(\n `Unsupported platform for automatic circom install: ${platform}`,\n \"ZK_UNSUPPORTED_PLATFORM\",\n \"Install circom 2.x manually and ensure it is on PATH.\"\n );\n}\n\nexport async function ensureCircom(): Promise<string> {\n const cached = path.join(ZK_CACHE_DIR, \"circom\", CIRCOM_VERSION, \"circom\");\n try {\n await access(cached);\n return cached;\n } catch {\n // Fall through to download.\n }\n\n const asset = circomAssetName();\n const url = `https://github.com/iden3/circom/releases/download/v${CIRCOM_VERSION}/${asset}`;\n const installDir = path.join(ZK_CACHE_DIR, \"circom\", CIRCOM_VERSION);\n await mkdir(installDir, { recursive: true });\n\n const archivePath = path.join(installDir, asset);\n await runCommand(\"curl\", [\"-fsSL\", url, \"-o\", archivePath]);\n await chmod(archivePath, 0o755);\n\n return archivePath;\n}\n\nexport async function ensureSnarkjs(): Promise<string> {\n const installDir = path.join(ZK_CACHE_DIR, `snarkjs-${SNARKJS_VERSION}`);\n const cliPath = path.join(installDir, \"node_modules\", \".bin\", \"snarkjs\");\n\n try {\n await access(cliPath);\n return cliPath;\n } catch {\n await mkdir(installDir, { recursive: true });\n await writeFile(\n path.join(installDir, \"package.json\"),\n JSON.stringify({ name: \"caatinga-zk-snarkjs\", private: true, version: \"0.0.0\" }, null, 2),\n \"utf8\"\n );\n await runCommand(\"npm\", [\"install\", \"--no-save\", \"--legacy-peer-deps\", `snarkjs@${SNARKJS_VERSION}`], {\n cwd: installDir,\n });\n return cliPath;\n }\n}\n\nexport async function ensurePtau(size: number): Promise<string> {\n const ptauDir = path.join(ZK_CACHE_DIR, \"ptau\", \"bls12-381\");\n const finalPath = path.join(ptauDir, `pot${size}_final.ptau`);\n try {\n await access(finalPath);\n return finalPath;\n } catch {\n await mkdir(ptauDir, { recursive: true });\n }\n\n const snarkjs = await ensureSnarkjs();\n const pot0 = path.join(ptauDir, `pot${size}_0000.ptau`);\n const pot1 = path.join(ptauDir, `pot${size}_0001.ptau`);\n const entropy = createHash(\"sha256\").update(randomBytes(32)).digest(\"hex\");\n\n await runCommand(snarkjs, [\"powersoftau\", \"new\", \"bls12-381\", String(size), pot0, \"-v\"]);\n await runCommand(snarkjs, [\n \"powersoftau\",\n \"contribute\",\n pot0,\n pot1,\n \"-v\",\n ], {\n input: `caatinga-dev\\n${entropy}\\n`,\n });\n await runCommand(snarkjs, [\"powersoftau\", \"prepare\", \"phase2\", pot1, finalPath, \"-v\"]);\n\n return finalPath;\n}\n","export class ZkError extends Error {\n constructor(\n message: string,\n public readonly code: string,\n public readonly hint?: string\n ) {\n super(message);\n this.name = \"ZkError\";\n }\n}\n","export function ptauSizeForConstraints(constraintCount: number): number {\n const needed = Math.ceil(Math.log2(Math.max(constraintCount, 1))) + 1;\n return Math.min(Math.max(needed, 8), 28);\n}\n","import type { SerializedG1, SerializedG2 } from \"./serialize-proof.js\";\n\nexport function concatG1Bytes(point: SerializedG1): Uint8Array {\n const bytes = new Uint8Array(point.x.length + point.y.length);\n bytes.set(point.x, 0);\n bytes.set(point.y, point.x.length);\n return bytes;\n}\n\nexport function concatG2Bytes(point: SerializedG2): Uint8Array {\n const bytes = new Uint8Array(\n point.x[0].length + point.x[1].length + point.y[0].length + point.y[1].length\n );\n let offset = 0;\n for (const chunk of [point.x[0], point.x[1], point.y[0], point.y[1]]) {\n bytes.set(chunk, offset);\n offset += chunk.length;\n }\n return bytes;\n}\n\nexport function concatG1Hex(point: SerializedG1): string {\n return bytesToHex(concatG1Bytes(point));\n}\n\nexport function concatG2Hex(point: SerializedG2): string {\n return bytesToHex(concatG2Bytes(point));\n}\n\nfunction bytesToHex(bytes: Uint8Array): string {\n return Array.from(bytes, (byte) => byte.toString(16).padStart(2, \"0\")).join(\"\");\n}\n","import { runCommand } from \"@caatinga/core\";\nimport path from \"node:path\";\nimport { access, mkdir } from \"node:fs/promises\";\nimport { ensureSnarkjs } from \"../install/lazy-install-zk-tools.js\";\n\nexport type ProveCircuitOptions = {\n circuitName: string;\n circuitPath: string;\n artifactsDir: string;\n inputPath: string;\n debug: boolean;\n};\n\nexport function resolveCircuitWasmPath(artifactsDir: string): string {\n return path.join(artifactsDir, \"main_js\", \"main.wasm\");\n}\n\nexport async function proveCircuit(options: ProveCircuitOptions): Promise<void> {\n const snarkjs = await ensureSnarkjs();\n const artifactsDir = path.resolve(options.artifactsDir);\n const wasmPath = resolveCircuitWasmPath(artifactsDir);\n const zkeyPath = path.join(artifactsDir, \"circuit_final.zkey\");\n const inputPath = path.resolve(options.inputPath);\n const proofPath = path.join(artifactsDir, \"proof.json\");\n const publicPath = path.join(artifactsDir, \"public.json\");\n\n await mkdir(artifactsDir, { recursive: true });\n\n if (options.debug) {\n const witnessPath = path.join(artifactsDir, \"witness.wtns\");\n await runCommand(snarkjs, [\"wtns\", \"calculate\", wasmPath, inputPath, witnessPath, \"-v\"]);\n await runCommand(snarkjs, [\"groth16\", \"prove\", zkeyPath, witnessPath, proofPath, publicPath]);\n return;\n }\n\n await runCommand(snarkjs, [\n \"groth16\",\n \"fullprove\",\n inputPath,\n wasmPath,\n zkeyPath,\n proofPath,\n publicPath,\n ]);\n\n await access(proofPath);\n await access(publicPath);\n}\n","import { invokeContract, loadConfig, readArtifacts, type CaatingaConfig } from \"@caatinga/core\";\nimport { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { concatG1Hex, concatG2Hex } from \"../serialization/curve-bytes.js\";\nimport { serializeProof, type SnarkjsProof } from \"../serialization/serialize-proof.js\";\nimport { serializeVk, type SnarkjsVk } from \"../serialization/serialize-vk.js\";\nimport { ZkError } from \"../errors/ZkError.js\";\n\nexport type InvokeVerifierOptions = {\n verifierContract: string;\n network: string;\n sourceAccount: string;\n proofPath: string;\n vkPath: string;\n publicSignalsPath: string;\n embedVk: boolean;\n cwd?: string;\n config?: CaatingaConfig;\n};\n\nexport function buildStellarVerifyProofArgs(options: {\n proof: SnarkjsProof;\n vk?: SnarkjsVk;\n publicSignals: string[];\n embedVk: boolean;\n}): string[] {\n const serializedProof = serializeProof(options.proof);\n const args: string[] = [];\n\n if (!options.embedVk) {\n if (!options.vk) {\n throw new ZkError(\"Verification key is required when embedVk is false.\", \"ZK_VK_REQUIRED\");\n }\n\n const serializedVk = serializeVk(options.vk);\n args.push(\n \"--vk\",\n JSON.stringify({\n alpha: concatG1Hex(serializedVk.alpha),\n beta: concatG2Hex(serializedVk.beta),\n gamma: concatG2Hex(serializedVk.gamma),\n delta: concatG2Hex(serializedVk.delta),\n ic: serializedVk.ic.map(concatG1Hex),\n })\n );\n }\n\n args.push(\n \"--proof\",\n JSON.stringify({\n a: concatG1Hex(serializedProof.a),\n b: concatG2Hex(serializedProof.b),\n c: concatG1Hex(serializedProof.c),\n })\n );\n args.push(\"--pub_signals\", JSON.stringify(options.publicSignals));\n\n return args;\n}\n\nexport type InvokeVerifierResult = {\n network: string;\n verifierContract: string;\n contractId: string;\n publicSignals: string[];\n verified: true;\n};\n\nexport async function invokeVerifier(options: InvokeVerifierOptions): Promise<InvokeVerifierResult> {\n const cwd = options.cwd ?? process.cwd();\n const config = options.config ?? await loadConfig({ cwd });\n const proof = JSON.parse(await readFile(path.resolve(cwd, options.proofPath), \"utf8\")) as SnarkjsProof;\n const publicSignals = JSON.parse(\n await readFile(path.resolve(cwd, options.publicSignalsPath), \"utf8\")\n ) as string[];\n\n const vk = options.embedVk\n ? undefined\n : JSON.parse(await readFile(path.resolve(cwd, options.vkPath), \"utf8\")) as SnarkjsVk;\n\n const args = buildStellarVerifyProofArgs({\n proof,\n vk,\n publicSignals,\n embedVk: options.embedVk,\n });\n\n const target = `${options.verifierContract}.verify_proof`;\n const result = await invokeContract({\n config,\n target,\n args,\n networkName: options.network,\n source: options.sourceAccount,\n cwd,\n });\n\n if (!result.result) {\n throw new ZkError(\"Verifier invocation returned no result.\", \"ZK_INVOKE_FAILED\");\n }\n\n if (result.result.trim().toLowerCase() !== \"true\") {\n throw new ZkError(\n `Verifier returned ${result.result.trim()}.`,\n \"ZK_VERIFY_FAILED\"\n );\n }\n\n const artifacts = await readArtifacts(cwd);\n const contractId = artifacts.networks[options.network]?.contracts[options.verifierContract]?.contractId;\n\n if (!contractId) {\n throw new ZkError(\n `No deployed artifact found for \"${options.verifierContract}\" on \"${options.network}\".`,\n \"ZK_INVOKE_FAILED\",\n \"Run caatinga deploy before invoking the verifier.\"\n );\n }\n\n return {\n network: options.network,\n verifierContract: options.verifierContract,\n contractId,\n publicSignals,\n verified: true,\n };\n}\n"],"mappings":"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","names":["import_core","import_node_path","import_promises","import_node_crypto","path","os","path","import_core","import_node_path","import_promises","path","import_core","import_promises","import_node_path","path"]}
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import {
|
|
2
2
|
ZkError,
|
|
3
|
+
concatG1Bytes,
|
|
3
4
|
concatG1Hex,
|
|
5
|
+
concatG2Bytes,
|
|
4
6
|
concatG2Hex,
|
|
5
7
|
serializeProof,
|
|
6
8
|
serializePublicSignals,
|
|
@@ -108,23 +110,64 @@ function ptauSizeForConstraints(constraintCount) {
|
|
|
108
110
|
}
|
|
109
111
|
|
|
110
112
|
// src/build/build-circuit.ts
|
|
111
|
-
|
|
112
|
-
|
|
113
|
+
var BYTES_PER_LINE = 16;
|
|
114
|
+
function formatRustByteArray(bytes) {
|
|
115
|
+
const chunks = [];
|
|
116
|
+
for (let i = 0; i < bytes.length; i += BYTES_PER_LINE) {
|
|
117
|
+
const slice = Array.from(bytes.slice(i, i + BYTES_PER_LINE));
|
|
118
|
+
chunks.push(
|
|
119
|
+
" " + slice.map((b) => `0x${b.toString(16).padStart(2, "0")}`).join(", ") + ","
|
|
120
|
+
);
|
|
121
|
+
}
|
|
122
|
+
return chunks.join("\n");
|
|
113
123
|
}
|
|
114
|
-
|
|
115
|
-
const raw = JSON.parse(
|
|
124
|
+
function generateVkRust(_vkPath, rawJson) {
|
|
125
|
+
const raw = JSON.parse(rawJson);
|
|
116
126
|
const vk = serializeVk(raw);
|
|
117
|
-
const
|
|
127
|
+
const alphaBytes = concatG1Bytes(vk.alpha);
|
|
128
|
+
const betaBytes = concatG2Bytes(vk.beta);
|
|
129
|
+
const gammaBytes = concatG2Bytes(vk.gamma);
|
|
130
|
+
const deltaBytes = concatG2Bytes(vk.delta);
|
|
131
|
+
const icEntries = vk.ic.map(concatG1Bytes);
|
|
132
|
+
const icItems = icEntries.map(
|
|
133
|
+
(ic, i) => ` G1Affine::from_array(&env, &[
|
|
134
|
+
${formatRustByteArray(ic)}
|
|
135
|
+
]), // IC[${i}]`
|
|
136
|
+
).join("\n");
|
|
137
|
+
return [
|
|
118
138
|
"// @generated by caatinga zk build --embed-vk",
|
|
139
|
+
`// DO NOT EDIT \u2014 re-run "caatinga zk build <circuit> --embed-vk" to regenerate.`,
|
|
140
|
+
"",
|
|
119
141
|
"use soroban_sdk::crypto::bls12_381::{G1Affine, G2Affine};",
|
|
120
142
|
"",
|
|
121
|
-
"
|
|
122
|
-
|
|
123
|
-
|
|
143
|
+
"#[allow(clippy::too_many_lines)]",
|
|
144
|
+
"pub fn embedded_vk(",
|
|
145
|
+
" env: &soroban_sdk::Env,",
|
|
146
|
+
") -> (G1Affine, G2Affine, G2Affine, G2Affine, soroban_sdk::Vec<G1Affine>) {",
|
|
147
|
+
` let alpha = G1Affine::from_array(&env, &[`,
|
|
148
|
+
formatRustByteArray(alphaBytes),
|
|
149
|
+
" ]);",
|
|
150
|
+
` let beta = G2Affine::from_array(&env, &[`,
|
|
151
|
+
formatRustByteArray(betaBytes),
|
|
152
|
+
" ]);",
|
|
153
|
+
` let gamma = G2Affine::from_array(&env, &[`,
|
|
154
|
+
formatRustByteArray(gammaBytes),
|
|
155
|
+
" ]);",
|
|
156
|
+
` let delta = G2Affine::from_array(&env, &[`,
|
|
157
|
+
formatRustByteArray(deltaBytes),
|
|
158
|
+
" ]);",
|
|
159
|
+
` let ic = soroban_sdk::vec![&env,`,
|
|
160
|
+
icItems,
|
|
161
|
+
" ];",
|
|
162
|
+
" (alpha, beta, gamma, delta, ic)",
|
|
124
163
|
"}",
|
|
125
164
|
""
|
|
126
|
-
];
|
|
127
|
-
|
|
165
|
+
].join("\n");
|
|
166
|
+
}
|
|
167
|
+
async function writeEmbeddedVk(vkPath, verifierSrcDir) {
|
|
168
|
+
const rawJson = await readFile(vkPath, "utf8");
|
|
169
|
+
const rustSource = generateVkRust(vkPath, rawJson);
|
|
170
|
+
await writeFile2(path2.join(verifierSrcDir, "vk.rs"), rustSource, "utf8");
|
|
128
171
|
}
|
|
129
172
|
async function buildCircuit(options) {
|
|
130
173
|
const circom = await ensureCircom();
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/build/build-circuit.ts","../src/install/lazy-install-zk-tools.ts","../src/build/detect-ptau-size.ts","../src/prove/prove-circuit.ts","../src/invoke/invoke-verifier.ts"],"sourcesContent":["import { runCommand } from \"@caatinga/core\";\nimport path from \"node:path\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { createHash, randomBytes } from \"node:crypto\";\nimport { ensureCircom, ensurePtau, ensureSnarkjs } from \"../install/lazy-install-zk-tools.js\";\nimport { ptauSizeForConstraints } from \"./detect-ptau-size.js\";\nimport { serializeVk, type SnarkjsVk } from \"../serialization/serialize-vk.js\";\n\nexport type BuildCircuitOptions = {\n circuitName: string;\n circuitPath: string;\n artifactsDir: string;\n embedVk: boolean;\n};\n\nfunction bytesToHex(bytes: Uint8Array): string {\n return Array.from(bytes).map((b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n}\n\nasync function writeEmbeddedVk(\n vkPath: string,\n verifierSrcDir: string\n): Promise<void> {\n const raw = JSON.parse(await readFile(vkPath, \"utf8\")) as SnarkjsVk;\n const vk = serializeVk(raw);\n const lines = [\n \"// @generated by caatinga zk build --embed-vk\",\n \"use soroban_sdk::crypto::bls12_381::{G1Affine, G2Affine};\",\n \"\",\n \"pub fn embedded_vk() -> (G1Affine, G2Affine, G2Affine, G2Affine, alloc::vec::Vec<G1Affine>) {\",\n \" todo!(\\\"Embed VK coordinates from verification_key.json\\\")\",\n ` // alpha.x = ${bytesToHex(vk.alpha.x)}`,\n \"}\",\n \"\",\n ];\n await writeFile(path.join(verifierSrcDir, \"vk.rs\"), lines.join(\"\\n\"), \"utf8\");\n}\n\nexport async function buildCircuit(options: BuildCircuitOptions): Promise<void> {\n const circom = await ensureCircom();\n const snarkjs = await ensureSnarkjs();\n const circuitDir = path.resolve(options.circuitPath);\n const outDir = path.resolve(options.artifactsDir);\n const circuitFile = path.join(circuitDir, \"main.circom\");\n const r1csPath = path.join(outDir, \"main.r1cs\");\n const zkey0 = path.join(outDir, \"circuit_0000.zkey\");\n const zkeyFinal = path.join(outDir, \"circuit_final.zkey\");\n const vkPath = path.join(outDir, \"verification_key.json\");\n\n await mkdir(outDir, { recursive: true });\n\n await runCommand(circom, [\n circuitFile,\n \"--r1cs\",\n \"--wasm\",\n \"--sym\",\n \"-p\",\n \"bls12381\",\n \"-o\",\n outDir,\n ]);\n\n const r1csInfo = await runCommand(snarkjs, [\"r1cs\", \"info\", r1csPath]);\n const constraintMatch = r1csInfo.stdout.match(/# of Constraints:\\s+(\\d+)/);\n const constraints = constraintMatch ? Number.parseInt(constraintMatch[1]!, 10) : 1;\n const ptauSize = ptauSizeForConstraints(constraints);\n const ptauPath = await ensurePtau(ptauSize);\n const entropy = createHash(\"sha256\").update(randomBytes(32)).digest(\"hex\");\n\n await runCommand(snarkjs, [\"groth16\", \"setup\", r1csPath, ptauPath, zkey0]);\n await runCommand(snarkjs, [\"zkey\", \"contribute\", zkey0, zkeyFinal, \"-v\"], {\n input: `caatinga-dev\\n${entropy}\\n`,\n });\n await runCommand(snarkjs, [\"zkey\", \"export\", \"verificationkey\", zkeyFinal, vkPath]);\n\n if (options.embedVk) {\n const verifierSrcDir = path.resolve(\"contracts\", \"verifier\", \"src\");\n await writeEmbeddedVk(vkPath, verifierSrcDir);\n }\n}\n","import { runCommand } from \"@caatinga/core\";\nimport { access, chmod, mkdir, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport os from \"node:os\";\nimport { createHash, randomBytes } from \"node:crypto\";\nimport { ZkError } from \"../errors/ZkError.js\";\n\nconst ZK_CACHE_DIR = path.join(os.homedir(), \".caatinga\", \"zk-tools\");\nconst SNARKJS_VERSION = \"0.7.5\";\nconst CIRCOM_VERSION = \"2.1.9\";\n\nfunction circomAssetName(): string {\n const platform = process.platform;\n const arch = process.arch === \"x64\" ? \"amd64\" : process.arch;\n if (platform === \"linux\") {\n return `circom-linux-${arch}`;\n }\n if (platform === \"darwin\") {\n return `circom-macos-${arch}`;\n }\n throw new ZkError(\n `Unsupported platform for automatic circom install: ${platform}`,\n \"ZK_UNSUPPORTED_PLATFORM\",\n \"Install circom 2.x manually and ensure it is on PATH.\"\n );\n}\n\nexport async function ensureCircom(): Promise<string> {\n const cached = path.join(ZK_CACHE_DIR, \"circom\", CIRCOM_VERSION, \"circom\");\n try {\n await access(cached);\n return cached;\n } catch {\n // Fall through to download.\n }\n\n const asset = circomAssetName();\n const url = `https://github.com/iden3/circom/releases/download/v${CIRCOM_VERSION}/${asset}`;\n const installDir = path.join(ZK_CACHE_DIR, \"circom\", CIRCOM_VERSION);\n await mkdir(installDir, { recursive: true });\n\n const archivePath = path.join(installDir, asset);\n await runCommand(\"curl\", [\"-fsSL\", url, \"-o\", archivePath]);\n await chmod(archivePath, 0o755);\n\n return archivePath;\n}\n\nexport async function ensureSnarkjs(): Promise<string> {\n const installDir = path.join(ZK_CACHE_DIR, `snarkjs-${SNARKJS_VERSION}`);\n const cliPath = path.join(installDir, \"node_modules\", \".bin\", \"snarkjs\");\n\n try {\n await access(cliPath);\n return cliPath;\n } catch {\n await mkdir(installDir, { recursive: true });\n await writeFile(\n path.join(installDir, \"package.json\"),\n JSON.stringify({ name: \"caatinga-zk-snarkjs\", private: true, version: \"0.0.0\" }, null, 2),\n \"utf8\"\n );\n await runCommand(\"npm\", [\"install\", \"--no-save\", \"--legacy-peer-deps\", `snarkjs@${SNARKJS_VERSION}`], {\n cwd: installDir,\n });\n return cliPath;\n }\n}\n\nexport async function ensurePtau(size: number): Promise<string> {\n const ptauDir = path.join(ZK_CACHE_DIR, \"ptau\", \"bls12-381\");\n const finalPath = path.join(ptauDir, `pot${size}_final.ptau`);\n try {\n await access(finalPath);\n return finalPath;\n } catch {\n await mkdir(ptauDir, { recursive: true });\n }\n\n const snarkjs = await ensureSnarkjs();\n const pot0 = path.join(ptauDir, `pot${size}_0000.ptau`);\n const pot1 = path.join(ptauDir, `pot${size}_0001.ptau`);\n const entropy = createHash(\"sha256\").update(randomBytes(32)).digest(\"hex\");\n\n await runCommand(snarkjs, [\"powersoftau\", \"new\", \"bls12-381\", String(size), pot0, \"-v\"]);\n await runCommand(snarkjs, [\n \"powersoftau\",\n \"contribute\",\n pot0,\n pot1,\n \"-v\",\n ], {\n input: `caatinga-dev\\n${entropy}\\n`,\n });\n await runCommand(snarkjs, [\"powersoftau\", \"prepare\", \"phase2\", pot1, finalPath, \"-v\"]);\n\n return finalPath;\n}\n","export function ptauSizeForConstraints(constraintCount: number): number {\n const needed = Math.ceil(Math.log2(Math.max(constraintCount, 1))) + 1;\n return Math.min(Math.max(needed, 8), 28);\n}\n","import { runCommand } from \"@caatinga/core\";\nimport path from \"node:path\";\nimport { access, mkdir } from \"node:fs/promises\";\nimport { ensureSnarkjs } from \"../install/lazy-install-zk-tools.js\";\n\nexport type ProveCircuitOptions = {\n circuitName: string;\n circuitPath: string;\n artifactsDir: string;\n inputPath: string;\n debug: boolean;\n};\n\nexport function resolveCircuitWasmPath(artifactsDir: string): string {\n return path.join(artifactsDir, \"main_js\", \"main.wasm\");\n}\n\nexport async function proveCircuit(options: ProveCircuitOptions): Promise<void> {\n const snarkjs = await ensureSnarkjs();\n const artifactsDir = path.resolve(options.artifactsDir);\n const wasmPath = resolveCircuitWasmPath(artifactsDir);\n const zkeyPath = path.join(artifactsDir, \"circuit_final.zkey\");\n const inputPath = path.resolve(options.inputPath);\n const proofPath = path.join(artifactsDir, \"proof.json\");\n const publicPath = path.join(artifactsDir, \"public.json\");\n\n await mkdir(artifactsDir, { recursive: true });\n\n if (options.debug) {\n const witnessPath = path.join(artifactsDir, \"witness.wtns\");\n await runCommand(snarkjs, [\"wtns\", \"calculate\", wasmPath, inputPath, witnessPath, \"-v\"]);\n await runCommand(snarkjs, [\"groth16\", \"prove\", zkeyPath, witnessPath, proofPath, publicPath]);\n return;\n }\n\n await runCommand(snarkjs, [\n \"groth16\",\n \"fullprove\",\n inputPath,\n wasmPath,\n zkeyPath,\n proofPath,\n publicPath,\n ]);\n\n await access(proofPath);\n await access(publicPath);\n}\n","import { invokeContract, loadConfig, readArtifacts, type CaatingaConfig } from \"@caatinga/core\";\nimport { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { concatG1Hex, concatG2Hex } from \"../serialization/curve-bytes.js\";\nimport { serializeProof, type SnarkjsProof } from \"../serialization/serialize-proof.js\";\nimport { serializeVk, type SnarkjsVk } from \"../serialization/serialize-vk.js\";\nimport { ZkError } from \"../errors/ZkError.js\";\n\nexport type InvokeVerifierOptions = {\n verifierContract: string;\n network: string;\n sourceAccount: string;\n proofPath: string;\n vkPath: string;\n publicSignalsPath: string;\n embedVk: boolean;\n cwd?: string;\n config?: CaatingaConfig;\n};\n\nexport function buildStellarVerifyProofArgs(options: {\n proof: SnarkjsProof;\n vk?: SnarkjsVk;\n publicSignals: string[];\n embedVk: boolean;\n}): string[] {\n const serializedProof = serializeProof(options.proof);\n const args: string[] = [];\n\n if (!options.embedVk) {\n if (!options.vk) {\n throw new ZkError(\"Verification key is required when embedVk is false.\", \"ZK_VK_REQUIRED\");\n }\n\n const serializedVk = serializeVk(options.vk);\n args.push(\n \"--vk\",\n JSON.stringify({\n alpha: concatG1Hex(serializedVk.alpha),\n beta: concatG2Hex(serializedVk.beta),\n gamma: concatG2Hex(serializedVk.gamma),\n delta: concatG2Hex(serializedVk.delta),\n ic: serializedVk.ic.map(concatG1Hex),\n })\n );\n }\n\n args.push(\n \"--proof\",\n JSON.stringify({\n a: concatG1Hex(serializedProof.a),\n b: concatG2Hex(serializedProof.b),\n c: concatG1Hex(serializedProof.c),\n })\n );\n args.push(\"--pub_signals\", JSON.stringify(options.publicSignals));\n\n return args;\n}\n\nexport type InvokeVerifierResult = {\n network: string;\n verifierContract: string;\n contractId: string;\n publicSignals: string[];\n verified: true;\n};\n\nexport async function invokeVerifier(options: InvokeVerifierOptions): Promise<InvokeVerifierResult> {\n const cwd = options.cwd ?? process.cwd();\n const config = options.config ?? await loadConfig({ cwd });\n const proof = JSON.parse(await readFile(path.resolve(cwd, options.proofPath), \"utf8\")) as SnarkjsProof;\n const publicSignals = JSON.parse(\n await readFile(path.resolve(cwd, options.publicSignalsPath), \"utf8\")\n ) as string[];\n\n const vk = options.embedVk\n ? undefined\n : JSON.parse(await readFile(path.resolve(cwd, options.vkPath), \"utf8\")) as SnarkjsVk;\n\n const args = buildStellarVerifyProofArgs({\n proof,\n vk,\n publicSignals,\n embedVk: options.embedVk,\n });\n\n const target = `${options.verifierContract}.verify_proof`;\n const result = await invokeContract({\n config,\n target,\n args,\n networkName: options.network,\n source: options.sourceAccount,\n cwd,\n });\n\n if (!result.result) {\n throw new ZkError(\"Verifier invocation returned no result.\", \"ZK_INVOKE_FAILED\");\n }\n\n if (result.result.trim().toLowerCase() !== \"true\") {\n throw new ZkError(\n `Verifier returned ${result.result.trim()}.`,\n \"ZK_VERIFY_FAILED\"\n );\n }\n\n const artifacts = await readArtifacts(cwd);\n const contractId = artifacts.networks[options.network]?.contracts[options.verifierContract]?.contractId;\n\n if (!contractId) {\n throw new ZkError(\n `No deployed artifact found for \"${options.verifierContract}\" on \"${options.network}\".`,\n \"ZK_INVOKE_FAILED\",\n \"Run caatinga deploy before invoking the verifier.\"\n );\n }\n\n return {\n network: options.network,\n verifierContract: options.verifierContract,\n contractId,\n publicSignals,\n verified: true,\n };\n}\n"],"mappings":"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","names":["runCommand","path","mkdir","writeFile","createHash","randomBytes","writeFile","path","mkdir","runCommand","createHash","randomBytes","runCommand","path","access","mkdir","path","mkdir","runCommand","access","readFile","path","readFile","path"]}
|
|
1
|
+
{"version":3,"sources":["../src/build/build-circuit.ts","../src/install/lazy-install-zk-tools.ts","../src/build/detect-ptau-size.ts","../src/prove/prove-circuit.ts","../src/invoke/invoke-verifier.ts"],"sourcesContent":["import { runCommand } from \"@caatinga/core\";\nimport path from \"node:path\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { createHash, randomBytes } from \"node:crypto\";\nimport { ensureCircom, ensurePtau, ensureSnarkjs } from \"../install/lazy-install-zk-tools.js\";\nimport { ptauSizeForConstraints } from \"./detect-ptau-size.js\";\nimport { serializeVk, type SnarkjsVk } from \"../serialization/serialize-vk.js\";\nimport { concatG1Bytes, concatG2Bytes } from \"../serialization/curve-bytes.js\";\n\nexport type BuildCircuitOptions = {\n circuitName: string;\n circuitPath: string;\n artifactsDir: string;\n embedVk: boolean;\n};\n\nconst BYTES_PER_LINE = 16;\n\nfunction formatRustByteArray(bytes: Uint8Array): string {\n const chunks: string[] = [];\n for (let i = 0; i < bytes.length; i += BYTES_PER_LINE) {\n const slice = Array.from(bytes.slice(i, i + BYTES_PER_LINE));\n chunks.push(\n \" \" + slice.map((b) => `0x${b.toString(16).padStart(2, \"0\")}`).join(\", \") + \",\"\n );\n }\n return chunks.join(\"\\n\");\n}\n\nexport function generateVkRust(_vkPath: string, rawJson: string): string {\n const raw = JSON.parse(rawJson) as SnarkjsVk;\n const vk = serializeVk(raw);\n\n const alphaBytes = concatG1Bytes(vk.alpha);\n const betaBytes = concatG2Bytes(vk.beta);\n const gammaBytes = concatG2Bytes(vk.gamma);\n const deltaBytes = concatG2Bytes(vk.delta);\n const icEntries = vk.ic.map(concatG1Bytes);\n\n const icItems = icEntries\n .map(\n (ic, i) =>\n ` G1Affine::from_array(&env, &[\\n${formatRustByteArray(ic)}\\n ]), // IC[${i}]`\n )\n .join(\"\\n\");\n\n return [\n \"// @generated by caatinga zk build --embed-vk\",\n `// DO NOT EDIT — re-run \"caatinga zk build <circuit> --embed-vk\" to regenerate.`,\n \"\",\n \"use soroban_sdk::crypto::bls12_381::{G1Affine, G2Affine};\",\n \"\",\n \"#[allow(clippy::too_many_lines)]\",\n \"pub fn embedded_vk(\",\n \" env: &soroban_sdk::Env,\",\n \") -> (G1Affine, G2Affine, G2Affine, G2Affine, soroban_sdk::Vec<G1Affine>) {\",\n ` let alpha = G1Affine::from_array(&env, &[`,\n formatRustByteArray(alphaBytes),\n \" ]);\",\n ` let beta = G2Affine::from_array(&env, &[`,\n formatRustByteArray(betaBytes),\n \" ]);\",\n ` let gamma = G2Affine::from_array(&env, &[`,\n formatRustByteArray(gammaBytes),\n \" ]);\",\n ` let delta = G2Affine::from_array(&env, &[`,\n formatRustByteArray(deltaBytes),\n \" ]);\",\n ` let ic = soroban_sdk::vec![&env,`,\n icItems,\n \" ];\",\n \" (alpha, beta, gamma, delta, ic)\",\n \"}\",\n \"\",\n ].join(\"\\n\");\n}\n\nasync function writeEmbeddedVk(\n vkPath: string,\n verifierSrcDir: string,\n): Promise<void> {\n const rawJson = await readFile(vkPath, \"utf8\");\n const rustSource = generateVkRust(vkPath, rawJson);\n await writeFile(path.join(verifierSrcDir, \"vk.rs\"), rustSource, \"utf8\");\n}\n\nexport async function buildCircuit(options: BuildCircuitOptions): Promise<void> {\n const circom = await ensureCircom();\n const snarkjs = await ensureSnarkjs();\n const circuitDir = path.resolve(options.circuitPath);\n const outDir = path.resolve(options.artifactsDir);\n const circuitFile = path.join(circuitDir, \"main.circom\");\n const r1csPath = path.join(outDir, \"main.r1cs\");\n const zkey0 = path.join(outDir, \"circuit_0000.zkey\");\n const zkeyFinal = path.join(outDir, \"circuit_final.zkey\");\n const vkPath = path.join(outDir, \"verification_key.json\");\n\n await mkdir(outDir, { recursive: true });\n\n await runCommand(circom, [\n circuitFile,\n \"--r1cs\",\n \"--wasm\",\n \"--sym\",\n \"-p\",\n \"bls12381\",\n \"-o\",\n outDir,\n ]);\n\n const r1csInfo = await runCommand(snarkjs, [\"r1cs\", \"info\", r1csPath]);\n const constraintMatch = r1csInfo.stdout.match(/# of Constraints:\\s+(\\d+)/);\n const constraints = constraintMatch ? Number.parseInt(constraintMatch[1]!, 10) : 1;\n const ptauSize = ptauSizeForConstraints(constraints);\n const ptauPath = await ensurePtau(ptauSize);\n const entropy = createHash(\"sha256\").update(randomBytes(32)).digest(\"hex\");\n\n await runCommand(snarkjs, [\"groth16\", \"setup\", r1csPath, ptauPath, zkey0]);\n await runCommand(snarkjs, [\"zkey\", \"contribute\", zkey0, zkeyFinal, \"-v\"], {\n input: `caatinga-dev\\n${entropy}\\n`,\n });\n await runCommand(snarkjs, [\"zkey\", \"export\", \"verificationkey\", zkeyFinal, vkPath]);\n\n if (options.embedVk) {\n const verifierSrcDir = path.resolve(\"contracts\", \"verifier\", \"src\");\n await writeEmbeddedVk(vkPath, verifierSrcDir);\n }\n}\n","import { runCommand } from \"@caatinga/core\";\nimport { access, chmod, mkdir, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport os from \"node:os\";\nimport { createHash, randomBytes } from \"node:crypto\";\nimport { ZkError } from \"../errors/ZkError.js\";\n\nconst ZK_CACHE_DIR = path.join(os.homedir(), \".caatinga\", \"zk-tools\");\nconst SNARKJS_VERSION = \"0.7.5\";\nconst CIRCOM_VERSION = \"2.1.9\";\n\nfunction circomAssetName(): string {\n const platform = process.platform;\n const arch = process.arch === \"x64\" ? \"amd64\" : process.arch;\n if (platform === \"linux\") {\n return `circom-linux-${arch}`;\n }\n if (platform === \"darwin\") {\n return `circom-macos-${arch}`;\n }\n throw new ZkError(\n `Unsupported platform for automatic circom install: ${platform}`,\n \"ZK_UNSUPPORTED_PLATFORM\",\n \"Install circom 2.x manually and ensure it is on PATH.\"\n );\n}\n\nexport async function ensureCircom(): Promise<string> {\n const cached = path.join(ZK_CACHE_DIR, \"circom\", CIRCOM_VERSION, \"circom\");\n try {\n await access(cached);\n return cached;\n } catch {\n // Fall through to download.\n }\n\n const asset = circomAssetName();\n const url = `https://github.com/iden3/circom/releases/download/v${CIRCOM_VERSION}/${asset}`;\n const installDir = path.join(ZK_CACHE_DIR, \"circom\", CIRCOM_VERSION);\n await mkdir(installDir, { recursive: true });\n\n const archivePath = path.join(installDir, asset);\n await runCommand(\"curl\", [\"-fsSL\", url, \"-o\", archivePath]);\n await chmod(archivePath, 0o755);\n\n return archivePath;\n}\n\nexport async function ensureSnarkjs(): Promise<string> {\n const installDir = path.join(ZK_CACHE_DIR, `snarkjs-${SNARKJS_VERSION}`);\n const cliPath = path.join(installDir, \"node_modules\", \".bin\", \"snarkjs\");\n\n try {\n await access(cliPath);\n return cliPath;\n } catch {\n await mkdir(installDir, { recursive: true });\n await writeFile(\n path.join(installDir, \"package.json\"),\n JSON.stringify({ name: \"caatinga-zk-snarkjs\", private: true, version: \"0.0.0\" }, null, 2),\n \"utf8\"\n );\n await runCommand(\"npm\", [\"install\", \"--no-save\", \"--legacy-peer-deps\", `snarkjs@${SNARKJS_VERSION}`], {\n cwd: installDir,\n });\n return cliPath;\n }\n}\n\nexport async function ensurePtau(size: number): Promise<string> {\n const ptauDir = path.join(ZK_CACHE_DIR, \"ptau\", \"bls12-381\");\n const finalPath = path.join(ptauDir, `pot${size}_final.ptau`);\n try {\n await access(finalPath);\n return finalPath;\n } catch {\n await mkdir(ptauDir, { recursive: true });\n }\n\n const snarkjs = await ensureSnarkjs();\n const pot0 = path.join(ptauDir, `pot${size}_0000.ptau`);\n const pot1 = path.join(ptauDir, `pot${size}_0001.ptau`);\n const entropy = createHash(\"sha256\").update(randomBytes(32)).digest(\"hex\");\n\n await runCommand(snarkjs, [\"powersoftau\", \"new\", \"bls12-381\", String(size), pot0, \"-v\"]);\n await runCommand(snarkjs, [\n \"powersoftau\",\n \"contribute\",\n pot0,\n pot1,\n \"-v\",\n ], {\n input: `caatinga-dev\\n${entropy}\\n`,\n });\n await runCommand(snarkjs, [\"powersoftau\", \"prepare\", \"phase2\", pot1, finalPath, \"-v\"]);\n\n return finalPath;\n}\n","export function ptauSizeForConstraints(constraintCount: number): number {\n const needed = Math.ceil(Math.log2(Math.max(constraintCount, 1))) + 1;\n return Math.min(Math.max(needed, 8), 28);\n}\n","import { runCommand } from \"@caatinga/core\";\nimport path from \"node:path\";\nimport { access, mkdir } from \"node:fs/promises\";\nimport { ensureSnarkjs } from \"../install/lazy-install-zk-tools.js\";\n\nexport type ProveCircuitOptions = {\n circuitName: string;\n circuitPath: string;\n artifactsDir: string;\n inputPath: string;\n debug: boolean;\n};\n\nexport function resolveCircuitWasmPath(artifactsDir: string): string {\n return path.join(artifactsDir, \"main_js\", \"main.wasm\");\n}\n\nexport async function proveCircuit(options: ProveCircuitOptions): Promise<void> {\n const snarkjs = await ensureSnarkjs();\n const artifactsDir = path.resolve(options.artifactsDir);\n const wasmPath = resolveCircuitWasmPath(artifactsDir);\n const zkeyPath = path.join(artifactsDir, \"circuit_final.zkey\");\n const inputPath = path.resolve(options.inputPath);\n const proofPath = path.join(artifactsDir, \"proof.json\");\n const publicPath = path.join(artifactsDir, \"public.json\");\n\n await mkdir(artifactsDir, { recursive: true });\n\n if (options.debug) {\n const witnessPath = path.join(artifactsDir, \"witness.wtns\");\n await runCommand(snarkjs, [\"wtns\", \"calculate\", wasmPath, inputPath, witnessPath, \"-v\"]);\n await runCommand(snarkjs, [\"groth16\", \"prove\", zkeyPath, witnessPath, proofPath, publicPath]);\n return;\n }\n\n await runCommand(snarkjs, [\n \"groth16\",\n \"fullprove\",\n inputPath,\n wasmPath,\n zkeyPath,\n proofPath,\n publicPath,\n ]);\n\n await access(proofPath);\n await access(publicPath);\n}\n","import { invokeContract, loadConfig, readArtifacts, type CaatingaConfig } from \"@caatinga/core\";\nimport { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { concatG1Hex, concatG2Hex } from \"../serialization/curve-bytes.js\";\nimport { serializeProof, type SnarkjsProof } from \"../serialization/serialize-proof.js\";\nimport { serializeVk, type SnarkjsVk } from \"../serialization/serialize-vk.js\";\nimport { ZkError } from \"../errors/ZkError.js\";\n\nexport type InvokeVerifierOptions = {\n verifierContract: string;\n network: string;\n sourceAccount: string;\n proofPath: string;\n vkPath: string;\n publicSignalsPath: string;\n embedVk: boolean;\n cwd?: string;\n config?: CaatingaConfig;\n};\n\nexport function buildStellarVerifyProofArgs(options: {\n proof: SnarkjsProof;\n vk?: SnarkjsVk;\n publicSignals: string[];\n embedVk: boolean;\n}): string[] {\n const serializedProof = serializeProof(options.proof);\n const args: string[] = [];\n\n if (!options.embedVk) {\n if (!options.vk) {\n throw new ZkError(\"Verification key is required when embedVk is false.\", \"ZK_VK_REQUIRED\");\n }\n\n const serializedVk = serializeVk(options.vk);\n args.push(\n \"--vk\",\n JSON.stringify({\n alpha: concatG1Hex(serializedVk.alpha),\n beta: concatG2Hex(serializedVk.beta),\n gamma: concatG2Hex(serializedVk.gamma),\n delta: concatG2Hex(serializedVk.delta),\n ic: serializedVk.ic.map(concatG1Hex),\n })\n );\n }\n\n args.push(\n \"--proof\",\n JSON.stringify({\n a: concatG1Hex(serializedProof.a),\n b: concatG2Hex(serializedProof.b),\n c: concatG1Hex(serializedProof.c),\n })\n );\n args.push(\"--pub_signals\", JSON.stringify(options.publicSignals));\n\n return args;\n}\n\nexport type InvokeVerifierResult = {\n network: string;\n verifierContract: string;\n contractId: string;\n publicSignals: string[];\n verified: true;\n};\n\nexport async function invokeVerifier(options: InvokeVerifierOptions): Promise<InvokeVerifierResult> {\n const cwd = options.cwd ?? process.cwd();\n const config = options.config ?? await loadConfig({ cwd });\n const proof = JSON.parse(await readFile(path.resolve(cwd, options.proofPath), \"utf8\")) as SnarkjsProof;\n const publicSignals = JSON.parse(\n await readFile(path.resolve(cwd, options.publicSignalsPath), \"utf8\")\n ) as string[];\n\n const vk = options.embedVk\n ? undefined\n : JSON.parse(await readFile(path.resolve(cwd, options.vkPath), \"utf8\")) as SnarkjsVk;\n\n const args = buildStellarVerifyProofArgs({\n proof,\n vk,\n publicSignals,\n embedVk: options.embedVk,\n });\n\n const target = `${options.verifierContract}.verify_proof`;\n const result = await invokeContract({\n config,\n target,\n args,\n networkName: options.network,\n source: options.sourceAccount,\n cwd,\n });\n\n if (!result.result) {\n throw new ZkError(\"Verifier invocation returned no result.\", \"ZK_INVOKE_FAILED\");\n }\n\n if (result.result.trim().toLowerCase() !== \"true\") {\n throw new ZkError(\n `Verifier returned ${result.result.trim()}.`,\n \"ZK_VERIFY_FAILED\"\n );\n }\n\n const artifacts = await readArtifacts(cwd);\n const contractId = artifacts.networks[options.network]?.contracts[options.verifierContract]?.contractId;\n\n if (!contractId) {\n throw new ZkError(\n `No deployed artifact found for \"${options.verifierContract}\" on \"${options.network}\".`,\n \"ZK_INVOKE_FAILED\",\n \"Run caatinga deploy before invoking the verifier.\"\n );\n }\n\n return {\n network: options.network,\n verifierContract: options.verifierContract,\n contractId,\n publicSignals,\n verified: true,\n };\n}\n"],"mappings":"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","names":["runCommand","path","mkdir","writeFile","createHash","randomBytes","writeFile","path","mkdir","runCommand","createHash","randomBytes","runCommand","path","access","mkdir","path","mkdir","runCommand","access","readFile","path","readFile","path"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@caatinga/zk",
|
|
3
|
-
"version": "2.4.
|
|
3
|
+
"version": "2.4.5",
|
|
4
4
|
"description": "Zero-knowledge proof serialization bridge for Stellar/Soroban",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"engines": {
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
"LICENSE"
|
|
28
28
|
],
|
|
29
29
|
"dependencies": {
|
|
30
|
-
"@caatinga/core": "^2.4.
|
|
30
|
+
"@caatinga/core": "^2.4.5"
|
|
31
31
|
},
|
|
32
32
|
"devDependencies": {
|
|
33
33
|
"tsup": "^8.3.5",
|