@caatinga/zk 3.1.1 → 3.2.0
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 +183 -60
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +26 -1
- package/dist/index.d.ts +26 -1
- package/dist/index.js +166 -46
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.cjs
CHANGED
|
@@ -31,14 +31,19 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
31
31
|
var index_exports = {};
|
|
32
32
|
__export(index_exports, {
|
|
33
33
|
ZkError: () => ZkError,
|
|
34
|
+
assertDevCeremonyAllowed: () => assertDevCeremonyAllowed,
|
|
34
35
|
buildCircuit: () => buildCircuit,
|
|
35
36
|
buildStellarVerifyProofArgs: () => buildStellarVerifyProofArgs,
|
|
36
37
|
invokeVerifier: () => invokeVerifier,
|
|
38
|
+
isProductionNetwork: () => isProductionNetwork,
|
|
37
39
|
proveCircuit: () => proveCircuit,
|
|
38
40
|
ptauSizeForConstraints: () => ptauSizeForConstraints,
|
|
41
|
+
readDevCeremonyManifest: () => readDevCeremonyManifest,
|
|
39
42
|
serializeProof: () => serializeProof,
|
|
40
43
|
serializePublicSignals: () => serializePublicSignals,
|
|
41
|
-
serializeVk: () => serializeVk
|
|
44
|
+
serializeVk: () => serializeVk,
|
|
45
|
+
writeDevCeremonyManifest: () => writeDevCeremonyManifest,
|
|
46
|
+
zkArtifactsDir: () => zkArtifactsDir
|
|
42
47
|
});
|
|
43
48
|
module.exports = __toCommonJS(index_exports);
|
|
44
49
|
|
|
@@ -123,13 +128,13 @@ function serializePublicSignals(signals) {
|
|
|
123
128
|
|
|
124
129
|
// src/build/build-circuit.ts
|
|
125
130
|
var import_core2 = require("@caatinga/core");
|
|
126
|
-
var
|
|
127
|
-
var
|
|
131
|
+
var import_node_path3 = __toESM(require("path"), 1);
|
|
132
|
+
var import_promises4 = require("fs/promises");
|
|
128
133
|
var import_node_crypto2 = require("crypto");
|
|
129
134
|
|
|
130
135
|
// src/install/lazy-install-zk-tools.ts
|
|
131
136
|
var import_core = require("@caatinga/core");
|
|
132
|
-
var
|
|
137
|
+
var import_promises2 = require("fs/promises");
|
|
133
138
|
var import_node_path = __toESM(require("path"), 1);
|
|
134
139
|
var import_node_os = __toESM(require("os"), 1);
|
|
135
140
|
var import_node_crypto = require("crypto");
|
|
@@ -146,10 +151,53 @@ var ZkError = class extends Error {
|
|
|
146
151
|
hint;
|
|
147
152
|
};
|
|
148
153
|
|
|
154
|
+
// src/install/download-with-progress.ts
|
|
155
|
+
var import_node_fs = require("fs");
|
|
156
|
+
var import_promises = require("stream/promises");
|
|
157
|
+
var import_node_stream = require("stream");
|
|
158
|
+
async function downloadWithProgress(url, destinationPath, progress) {
|
|
159
|
+
const response = await fetch(url);
|
|
160
|
+
if (!response.ok) {
|
|
161
|
+
throw new ZkError(
|
|
162
|
+
`Failed to download ${url}: HTTP ${response.status}`,
|
|
163
|
+
"ZK_DOWNLOAD_FAILED",
|
|
164
|
+
"Check your network connection and try again."
|
|
165
|
+
);
|
|
166
|
+
}
|
|
167
|
+
if (!response.body) {
|
|
168
|
+
throw new ZkError(
|
|
169
|
+
`Failed to download ${url}: empty response body`,
|
|
170
|
+
"ZK_DOWNLOAD_FAILED",
|
|
171
|
+
"Check your network connection and try again."
|
|
172
|
+
);
|
|
173
|
+
}
|
|
174
|
+
const contentLength = response.headers.get("content-length");
|
|
175
|
+
const total = contentLength ? Number.parseInt(contentLength, 10) : void 0;
|
|
176
|
+
let loaded = 0;
|
|
177
|
+
const reader = response.body.getReader();
|
|
178
|
+
const nodeStream = import_node_stream.Readable.from(
|
|
179
|
+
(async function* () {
|
|
180
|
+
while (true) {
|
|
181
|
+
const { done, value } = await reader.read();
|
|
182
|
+
if (done) {
|
|
183
|
+
break;
|
|
184
|
+
}
|
|
185
|
+
loaded += value.byteLength;
|
|
186
|
+
progress?.onDownloadProgress?.(loaded, total);
|
|
187
|
+
yield Buffer.from(value);
|
|
188
|
+
}
|
|
189
|
+
})()
|
|
190
|
+
);
|
|
191
|
+
await (0, import_promises.pipeline)(nodeStream, (0, import_node_fs.createWriteStream)(destinationPath));
|
|
192
|
+
progress?.onDownloadComplete?.();
|
|
193
|
+
}
|
|
194
|
+
|
|
149
195
|
// src/install/lazy-install-zk-tools.ts
|
|
150
|
-
var ZK_CACHE_DIR = import_node_path.default.join(import_node_os.default.homedir(), ".caatinga", "zk-tools");
|
|
151
196
|
var SNARKJS_VERSION = "0.7.5";
|
|
152
197
|
var CIRCOM_VERSION = "2.1.9";
|
|
198
|
+
function zkCacheDir() {
|
|
199
|
+
return import_node_path.default.join(process.env.HOME ?? import_node_os.default.homedir(), ".caatinga", "zk-tools");
|
|
200
|
+
}
|
|
153
201
|
function circomAssetName() {
|
|
154
202
|
const platform = process.platform;
|
|
155
203
|
const arch = process.arch === "x64" ? "amd64" : process.arch;
|
|
@@ -165,31 +213,37 @@ function circomAssetName() {
|
|
|
165
213
|
"Install circom 2.x manually and ensure it is on PATH."
|
|
166
214
|
);
|
|
167
215
|
}
|
|
168
|
-
async function ensureCircom() {
|
|
169
|
-
const
|
|
216
|
+
async function ensureCircom(progress) {
|
|
217
|
+
const asset = circomAssetName();
|
|
218
|
+
const installDir = import_node_path.default.join(zkCacheDir(), "circom", CIRCOM_VERSION);
|
|
219
|
+
const binaryPath = import_node_path.default.join(installDir, asset);
|
|
170
220
|
try {
|
|
171
|
-
await (0,
|
|
172
|
-
|
|
221
|
+
await (0, import_promises2.access)(binaryPath);
|
|
222
|
+
progress?.onStatus?.(`Using cached circom v${CIRCOM_VERSION}`);
|
|
223
|
+
return binaryPath;
|
|
173
224
|
} catch {
|
|
174
225
|
}
|
|
175
|
-
const asset = circomAssetName();
|
|
176
226
|
const url = `https://github.com/iden3/circom/releases/download/v${CIRCOM_VERSION}/${asset}`;
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
await (0,
|
|
181
|
-
|
|
182
|
-
return
|
|
183
|
-
}
|
|
184
|
-
async function ensureSnarkjs() {
|
|
185
|
-
const installDir = import_node_path.default.join(
|
|
227
|
+
await (0, import_promises2.mkdir)(installDir, { recursive: true });
|
|
228
|
+
progress?.onStatus?.(`Downloading circom v${CIRCOM_VERSION} (${asset})...`);
|
|
229
|
+
await downloadWithProgress(url, binaryPath, progress);
|
|
230
|
+
await (0, import_promises2.chmod)(binaryPath, 493);
|
|
231
|
+
progress?.onStatus?.(`circom installed \u2192 ${binaryPath}`);
|
|
232
|
+
return binaryPath;
|
|
233
|
+
}
|
|
234
|
+
async function ensureSnarkjs(progress) {
|
|
235
|
+
const installDir = import_node_path.default.join(zkCacheDir(), `snarkjs-${SNARKJS_VERSION}`);
|
|
186
236
|
const cliPath = import_node_path.default.join(installDir, "node_modules", ".bin", "snarkjs");
|
|
187
237
|
try {
|
|
188
|
-
await (0,
|
|
238
|
+
await (0, import_promises2.access)(cliPath);
|
|
239
|
+
progress?.onStatus?.(`Using cached snarkjs v${SNARKJS_VERSION}`);
|
|
189
240
|
return cliPath;
|
|
190
241
|
} catch {
|
|
191
|
-
|
|
192
|
-
|
|
242
|
+
progress?.onStatus?.(
|
|
243
|
+
`Installing snarkjs v${SNARKJS_VERSION} into ${installDir} (first run only)...`
|
|
244
|
+
);
|
|
245
|
+
await (0, import_promises2.mkdir)(installDir, { recursive: true });
|
|
246
|
+
await (0, import_promises2.writeFile)(
|
|
193
247
|
import_node_path.default.join(installDir, "package.json"),
|
|
194
248
|
JSON.stringify({ name: "caatinga-zk-snarkjs", private: true, version: "0.0.0" }, null, 2),
|
|
195
249
|
"utf8"
|
|
@@ -201,19 +255,22 @@ async function ensureSnarkjs() {
|
|
|
201
255
|
cwd: installDir
|
|
202
256
|
}
|
|
203
257
|
);
|
|
258
|
+
progress?.onStatus?.(`snarkjs installed \u2192 ${cliPath}`);
|
|
204
259
|
return cliPath;
|
|
205
260
|
}
|
|
206
261
|
}
|
|
207
|
-
async function ensurePtau(size) {
|
|
208
|
-
const ptauDir = import_node_path.default.join(
|
|
262
|
+
async function ensurePtau(size, progress) {
|
|
263
|
+
const ptauDir = import_node_path.default.join(zkCacheDir(), "ptau", "bls12-381");
|
|
209
264
|
const finalPath = import_node_path.default.join(ptauDir, `pot${size}_final.ptau`);
|
|
210
265
|
try {
|
|
211
|
-
await (0,
|
|
266
|
+
await (0, import_promises2.access)(finalPath);
|
|
267
|
+
progress?.onStatus?.(`Using cached powers-of-tau (bls12-381, size ${size})`);
|
|
212
268
|
return finalPath;
|
|
213
269
|
} catch {
|
|
214
|
-
await (0,
|
|
270
|
+
await (0, import_promises2.mkdir)(ptauDir, { recursive: true });
|
|
215
271
|
}
|
|
216
|
-
|
|
272
|
+
progress?.onStatus?.(`Generating dev powers-of-tau (bls12-381, size ${size})...`);
|
|
273
|
+
const snarkjs = await ensureSnarkjs(progress);
|
|
217
274
|
const pot0 = import_node_path.default.join(ptauDir, `pot${size}_0000.ptau`);
|
|
218
275
|
const pot1 = import_node_path.default.join(ptauDir, `pot${size}_0001.ptau`);
|
|
219
276
|
const entropy = (0, import_node_crypto.createHash)("sha256").update((0, import_node_crypto.randomBytes)(32)).digest("hex");
|
|
@@ -224,6 +281,7 @@ ${entropy}
|
|
|
224
281
|
`
|
|
225
282
|
});
|
|
226
283
|
await (0, import_core.runCommand)(snarkjs, ["powersoftau", "prepare", "phase2", pot1, finalPath, "-v"]);
|
|
284
|
+
progress?.onStatus?.(`powers-of-tau ready \u2192 ${finalPath}`);
|
|
227
285
|
return finalPath;
|
|
228
286
|
}
|
|
229
287
|
|
|
@@ -233,6 +291,62 @@ function ptauSizeForConstraints(constraintCount) {
|
|
|
233
291
|
return Math.min(Math.max(needed, 8), 28);
|
|
234
292
|
}
|
|
235
293
|
|
|
294
|
+
// src/ceremony/dev-ceremony.ts
|
|
295
|
+
var import_promises3 = require("fs/promises");
|
|
296
|
+
var import_node_path2 = __toESM(require("path"), 1);
|
|
297
|
+
var DEV_CEREMONY_TYPE = "dev-single-party";
|
|
298
|
+
var CEREMONY_MANIFEST_FILE = "ceremony.json";
|
|
299
|
+
function isProductionNetwork(networkName) {
|
|
300
|
+
return networkName === "mainnet";
|
|
301
|
+
}
|
|
302
|
+
function ceremonyManifestPath(artifactsDir) {
|
|
303
|
+
return import_node_path2.default.join(artifactsDir, CEREMONY_MANIFEST_FILE);
|
|
304
|
+
}
|
|
305
|
+
async function writeDevCeremonyManifest(artifactsDir) {
|
|
306
|
+
const manifest = {
|
|
307
|
+
type: DEV_CEREMONY_TYPE,
|
|
308
|
+
generatedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
309
|
+
};
|
|
310
|
+
await (0, import_promises3.writeFile)(
|
|
311
|
+
ceremonyManifestPath(artifactsDir),
|
|
312
|
+
`${JSON.stringify(manifest, null, 2)}
|
|
313
|
+
`,
|
|
314
|
+
"utf8"
|
|
315
|
+
);
|
|
316
|
+
}
|
|
317
|
+
async function readDevCeremonyManifest(artifactsDir) {
|
|
318
|
+
try {
|
|
319
|
+
const raw = await (0, import_promises3.readFile)(ceremonyManifestPath(artifactsDir), "utf8");
|
|
320
|
+
const parsed = JSON.parse(raw);
|
|
321
|
+
if (parsed.type !== DEV_CEREMONY_TYPE) {
|
|
322
|
+
return null;
|
|
323
|
+
}
|
|
324
|
+
return parsed;
|
|
325
|
+
} catch {
|
|
326
|
+
return null;
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
async function assertDevCeremonyAllowed(options) {
|
|
330
|
+
if (!isProductionNetwork(options.networkName)) {
|
|
331
|
+
return;
|
|
332
|
+
}
|
|
333
|
+
if (options.allowDevCeremony) {
|
|
334
|
+
return;
|
|
335
|
+
}
|
|
336
|
+
const manifest = await readDevCeremonyManifest(options.artifactsDir);
|
|
337
|
+
if (!manifest) {
|
|
338
|
+
return;
|
|
339
|
+
}
|
|
340
|
+
throw new ZkError(
|
|
341
|
+
`${options.operation} is blocked on mainnet: ZK artifacts were produced by a single-party development ceremony.`,
|
|
342
|
+
"ZK_DEV_CEREMONY_BLOCKED",
|
|
343
|
+
"Run on testnet, supply audited MPC ceremony artifacts, or pass --allow-dev-ceremony only for conscious testing."
|
|
344
|
+
);
|
|
345
|
+
}
|
|
346
|
+
function zkArtifactsDir(circuitName) {
|
|
347
|
+
return `.artifacts/zk/${circuitName}`;
|
|
348
|
+
}
|
|
349
|
+
|
|
236
350
|
// src/serialization/curve-bytes.ts
|
|
237
351
|
function concatG1Bytes(point) {
|
|
238
352
|
const bytes = new Uint8Array(point.x.length + point.y.length);
|
|
@@ -317,21 +431,23 @@ ${formatRustByteArray(ic)}
|
|
|
317
431
|
].join("\n");
|
|
318
432
|
}
|
|
319
433
|
async function writeEmbeddedVk(vkPath, verifierSrcDir) {
|
|
320
|
-
const rawJson = await (0,
|
|
434
|
+
const rawJson = await (0, import_promises4.readFile)(vkPath, "utf8");
|
|
321
435
|
const rustSource = generateVkRust(vkPath, rawJson);
|
|
322
|
-
await (0,
|
|
436
|
+
await (0, import_promises4.writeFile)(import_node_path3.default.join(verifierSrcDir, "vk.rs"), rustSource, "utf8");
|
|
323
437
|
}
|
|
324
438
|
async function buildCircuit(options) {
|
|
325
|
-
const
|
|
326
|
-
const
|
|
327
|
-
const
|
|
328
|
-
const
|
|
329
|
-
const
|
|
330
|
-
const
|
|
331
|
-
const
|
|
332
|
-
const
|
|
333
|
-
const
|
|
334
|
-
|
|
439
|
+
const progress = options.progress;
|
|
440
|
+
const circom = await ensureCircom(progress);
|
|
441
|
+
const snarkjs = await ensureSnarkjs(progress);
|
|
442
|
+
const circuitDir = import_node_path3.default.resolve(options.circuitPath);
|
|
443
|
+
const outDir = import_node_path3.default.resolve(options.artifactsDir);
|
|
444
|
+
const circuitFile = import_node_path3.default.join(circuitDir, "main.circom");
|
|
445
|
+
const r1csPath = import_node_path3.default.join(outDir, "main.r1cs");
|
|
446
|
+
const zkey0 = import_node_path3.default.join(outDir, "circuit_0000.zkey");
|
|
447
|
+
const zkeyFinal = import_node_path3.default.join(outDir, "circuit_final.zkey");
|
|
448
|
+
const vkPath = import_node_path3.default.join(outDir, "verification_key.json");
|
|
449
|
+
await (0, import_promises4.mkdir)(outDir, { recursive: true });
|
|
450
|
+
progress?.onStatus?.(`Compiling ${circuitFile}...`);
|
|
335
451
|
await (0, import_core2.runCommand)(circom, [
|
|
336
452
|
circuitFile,
|
|
337
453
|
"--r1cs",
|
|
@@ -346,8 +462,9 @@ async function buildCircuit(options) {
|
|
|
346
462
|
const constraintMatch = r1csInfo.stdout.match(/# of Constraints:\s+(\d+)/);
|
|
347
463
|
const constraints = constraintMatch ? Number.parseInt(constraintMatch[1], 10) : 1;
|
|
348
464
|
const ptauSize = ptauSizeForConstraints(constraints);
|
|
349
|
-
const ptauPath = await ensurePtau(ptauSize);
|
|
465
|
+
const ptauPath = await ensurePtau(ptauSize, progress);
|
|
350
466
|
const entropy = (0, import_node_crypto2.createHash)("sha256").update((0, import_node_crypto2.randomBytes)(32)).digest("hex");
|
|
467
|
+
progress?.onStatus?.("Running Groth16 trusted setup...");
|
|
351
468
|
await (0, import_core2.runCommand)(snarkjs, ["groth16", "setup", r1csPath, ptauPath, zkey0]);
|
|
352
469
|
await (0, import_core2.runCommand)(snarkjs, ["zkey", "contribute", zkey0, zkeyFinal, "-v"], {
|
|
353
470
|
input: `caatinga-dev
|
|
@@ -356,29 +473,30 @@ ${entropy}
|
|
|
356
473
|
});
|
|
357
474
|
await (0, import_core2.runCommand)(snarkjs, ["zkey", "export", "verificationkey", zkeyFinal, vkPath]);
|
|
358
475
|
if (options.embedVk) {
|
|
359
|
-
const verifierSrcDir =
|
|
476
|
+
const verifierSrcDir = import_node_path3.default.resolve("contracts", "verifier", "src");
|
|
360
477
|
await writeEmbeddedVk(vkPath, verifierSrcDir);
|
|
361
478
|
}
|
|
479
|
+
await writeDevCeremonyManifest(outDir);
|
|
362
480
|
}
|
|
363
481
|
|
|
364
482
|
// src/prove/prove-circuit.ts
|
|
365
483
|
var import_core3 = require("@caatinga/core");
|
|
366
|
-
var
|
|
367
|
-
var
|
|
484
|
+
var import_node_path4 = __toESM(require("path"), 1);
|
|
485
|
+
var import_promises5 = require("fs/promises");
|
|
368
486
|
function resolveCircuitWasmPath(artifactsDir) {
|
|
369
|
-
return
|
|
487
|
+
return import_node_path4.default.join(artifactsDir, "main_js", "main.wasm");
|
|
370
488
|
}
|
|
371
489
|
async function proveCircuit(options) {
|
|
372
|
-
const snarkjs = await ensureSnarkjs();
|
|
373
|
-
const artifactsDir =
|
|
490
|
+
const snarkjs = await ensureSnarkjs(options.progress);
|
|
491
|
+
const artifactsDir = import_node_path4.default.resolve(options.artifactsDir);
|
|
374
492
|
const wasmPath = resolveCircuitWasmPath(artifactsDir);
|
|
375
|
-
const zkeyPath =
|
|
376
|
-
const inputPath =
|
|
377
|
-
const proofPath =
|
|
378
|
-
const publicPath =
|
|
379
|
-
await (0,
|
|
493
|
+
const zkeyPath = import_node_path4.default.join(artifactsDir, "circuit_final.zkey");
|
|
494
|
+
const inputPath = import_node_path4.default.resolve(options.inputPath);
|
|
495
|
+
const proofPath = import_node_path4.default.join(artifactsDir, "proof.json");
|
|
496
|
+
const publicPath = import_node_path4.default.join(artifactsDir, "public.json");
|
|
497
|
+
await (0, import_promises5.mkdir)(artifactsDir, { recursive: true });
|
|
380
498
|
if (options.debug) {
|
|
381
|
-
const witnessPath =
|
|
499
|
+
const witnessPath = import_node_path4.default.join(artifactsDir, "witness.wtns");
|
|
382
500
|
await (0, import_core3.runCommand)(snarkjs, ["wtns", "calculate", wasmPath, inputPath, witnessPath, "-v"]);
|
|
383
501
|
await (0, import_core3.runCommand)(snarkjs, ["groth16", "prove", zkeyPath, witnessPath, proofPath, publicPath]);
|
|
384
502
|
return;
|
|
@@ -392,14 +510,14 @@ async function proveCircuit(options) {
|
|
|
392
510
|
proofPath,
|
|
393
511
|
publicPath
|
|
394
512
|
]);
|
|
395
|
-
await (0,
|
|
396
|
-
await (0,
|
|
513
|
+
await (0, import_promises5.access)(proofPath);
|
|
514
|
+
await (0, import_promises5.access)(publicPath);
|
|
397
515
|
}
|
|
398
516
|
|
|
399
517
|
// src/invoke/invoke-verifier.ts
|
|
400
518
|
var import_core4 = require("@caatinga/core");
|
|
401
|
-
var
|
|
402
|
-
var
|
|
519
|
+
var import_promises6 = require("fs/promises");
|
|
520
|
+
var import_node_path5 = __toESM(require("path"), 1);
|
|
403
521
|
function buildStellarVerifyProofArgs(options) {
|
|
404
522
|
const serializedProof = serializeProof(options.proof);
|
|
405
523
|
const args = [];
|
|
@@ -434,12 +552,12 @@ async function invokeVerifier(options) {
|
|
|
434
552
|
const cwd = options.cwd ?? process.cwd();
|
|
435
553
|
const config = options.config ?? await (0, import_core4.loadConfig)({ cwd });
|
|
436
554
|
const proof = JSON.parse(
|
|
437
|
-
await (0,
|
|
555
|
+
await (0, import_promises6.readFile)(import_node_path5.default.resolve(cwd, options.proofPath), "utf8")
|
|
438
556
|
);
|
|
439
557
|
const publicSignals = JSON.parse(
|
|
440
|
-
await (0,
|
|
558
|
+
await (0, import_promises6.readFile)(import_node_path5.default.resolve(cwd, options.publicSignalsPath), "utf8")
|
|
441
559
|
);
|
|
442
|
-
const vk = options.embedVk ? void 0 : JSON.parse(await (0,
|
|
560
|
+
const vk = options.embedVk ? void 0 : JSON.parse(await (0, import_promises6.readFile)(import_node_path5.default.resolve(cwd, options.vkPath), "utf8"));
|
|
443
561
|
const args = buildStellarVerifyProofArgs({
|
|
444
562
|
proof,
|
|
445
563
|
vk,
|
|
@@ -481,13 +599,18 @@ async function invokeVerifier(options) {
|
|
|
481
599
|
// Annotate the CommonJS export names for ESM import in node:
|
|
482
600
|
0 && (module.exports = {
|
|
483
601
|
ZkError,
|
|
602
|
+
assertDevCeremonyAllowed,
|
|
484
603
|
buildCircuit,
|
|
485
604
|
buildStellarVerifyProofArgs,
|
|
486
605
|
invokeVerifier,
|
|
606
|
+
isProductionNetwork,
|
|
487
607
|
proveCircuit,
|
|
488
608
|
ptauSizeForConstraints,
|
|
609
|
+
readDevCeremonyManifest,
|
|
489
610
|
serializeProof,
|
|
490
611
|
serializePublicSignals,
|
|
491
|
-
serializeVk
|
|
612
|
+
serializeVk,
|
|
613
|
+
writeDevCeremonyManifest,
|
|
614
|
+
zkArtifactsDir
|
|
492
615
|
});
|
|
493
616
|
//# sourceMappingURL=index.cjs.map
|
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/serialization/curve-bytes.ts","../src/prove/prove-circuit.ts","../src/invoke/invoke-verifier.ts"],"sourcesContent":["export {\n serializeProof,\n type SerializedProof,\n type SnarkjsProof,\n} 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 {\n invokeVerifier,\n buildStellarVerifyProofArgs,\n type InvokeVerifierOptions,\n type InvokeVerifierResult,\n} 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(\n rows: [[string, string], [string, string], ...string[][]]\n): 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(vkPath: string, verifierSrcDir: string): 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(\n \"npm\",\n [\"install\", \"--no-save\", \"--legacy-peer-deps\", `snarkjs@${SNARKJS_VERSION}`],\n {\n cwd: installDir,\n }\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, [\"powersoftau\", \"contribute\", pot0, pot1, \"-v\"], {\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(\n options: InvokeVerifierOptions\n): Promise<InvokeVerifierResult> {\n const cwd = options.cwd ?? process.cwd();\n const config = options.config ?? (await loadConfig({ cwd }));\n const proof = JSON.parse(\n await readFile(path.resolve(cwd, options.proofPath), \"utf8\")\n ) 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(`Verifier returned ${result.result.trim()}.`, \"ZK_VERIFY_FAILED\");\n }\n\n const artifacts = await readArtifacts(cwd);\n const contractId =\n 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"]}
|
|
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/install/download-with-progress.ts","../src/build/detect-ptau-size.ts","../src/ceremony/dev-ceremony.ts","../src/serialization/curve-bytes.ts","../src/prove/prove-circuit.ts","../src/invoke/invoke-verifier.ts"],"sourcesContent":["export {\n serializeProof,\n type SerializedProof,\n type SnarkjsProof,\n} 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 {\n invokeVerifier,\n buildStellarVerifyProofArgs,\n type InvokeVerifierOptions,\n type InvokeVerifierResult,\n} from \"./invoke/invoke-verifier.js\";\nexport { ptauSizeForConstraints } from \"./build/detect-ptau-size.js\";\nexport {\n assertDevCeremonyAllowed,\n isProductionNetwork,\n readDevCeremonyManifest,\n writeDevCeremonyManifest,\n zkArtifactsDir,\n type AssertDevCeremonyAllowedOptions,\n type DevCeremonyManifest,\n} from \"./ceremony/dev-ceremony.js\";\nexport type { ZkInstallProgress } from \"./install/install-progress.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(\n rows: [[string, string], [string, string], ...string[][]]\n): 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 type { ZkInstallProgress } from \"../install/install-progress.js\";\nimport { ptauSizeForConstraints } from \"./detect-ptau-size.js\";\nimport { writeDevCeremonyManifest } from \"../ceremony/dev-ceremony.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 progress?: ZkInstallProgress;\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(vkPath: string, verifierSrcDir: string): 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 progress = options.progress;\n const circom = await ensureCircom(progress);\n const snarkjs = await ensureSnarkjs(progress);\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 progress?.onStatus?.(`Compiling ${circuitFile}...`);\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, progress);\n const entropy = createHash(\"sha256\").update(randomBytes(32)).digest(\"hex\");\n\n progress?.onStatus?.(\"Running Groth16 trusted setup...\");\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 await writeDevCeremonyManifest(outDir);\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\";\nimport { downloadWithProgress } from \"./download-with-progress.js\";\nimport type { ZkInstallProgress } from \"./install-progress.js\";\n\nconst SNARKJS_VERSION = \"0.7.5\";\nconst CIRCOM_VERSION = \"2.1.9\";\n\nfunction zkCacheDir(): string {\n return path.join(process.env.HOME ?? os.homedir(), \".caatinga\", \"zk-tools\");\n}\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(progress?: ZkInstallProgress): Promise<string> {\n const asset = circomAssetName();\n const installDir = path.join(zkCacheDir(), \"circom\", CIRCOM_VERSION);\n const binaryPath = path.join(installDir, asset);\n\n try {\n await access(binaryPath);\n progress?.onStatus?.(`Using cached circom v${CIRCOM_VERSION}`);\n return binaryPath;\n } catch {\n // Fall through to download.\n }\n\n const url = `https://github.com/iden3/circom/releases/download/v${CIRCOM_VERSION}/${asset}`;\n await mkdir(installDir, { recursive: true });\n\n progress?.onStatus?.(`Downloading circom v${CIRCOM_VERSION} (${asset})...`);\n await downloadWithProgress(url, binaryPath, progress);\n await chmod(binaryPath, 0o755);\n progress?.onStatus?.(`circom installed → ${binaryPath}`);\n\n return binaryPath;\n}\n\nexport async function ensureSnarkjs(progress?: ZkInstallProgress): Promise<string> {\n const installDir = path.join(zkCacheDir(), `snarkjs-${SNARKJS_VERSION}`);\n const cliPath = path.join(installDir, \"node_modules\", \".bin\", \"snarkjs\");\n\n try {\n await access(cliPath);\n progress?.onStatus?.(`Using cached snarkjs v${SNARKJS_VERSION}`);\n return cliPath;\n } catch {\n progress?.onStatus?.(\n `Installing snarkjs v${SNARKJS_VERSION} into ${installDir} (first run only)...`\n );\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(\n \"npm\",\n [\"install\", \"--no-save\", \"--legacy-peer-deps\", `snarkjs@${SNARKJS_VERSION}`],\n {\n cwd: installDir,\n }\n );\n progress?.onStatus?.(`snarkjs installed → ${cliPath}`);\n return cliPath;\n }\n}\n\nexport async function ensurePtau(size: number, progress?: ZkInstallProgress): Promise<string> {\n const ptauDir = path.join(zkCacheDir(), \"ptau\", \"bls12-381\");\n const finalPath = path.join(ptauDir, `pot${size}_final.ptau`);\n try {\n await access(finalPath);\n progress?.onStatus?.(`Using cached powers-of-tau (bls12-381, size ${size})`);\n return finalPath;\n } catch {\n await mkdir(ptauDir, { recursive: true });\n }\n\n progress?.onStatus?.(`Generating dev powers-of-tau (bls12-381, size ${size})...`);\n const snarkjs = await ensureSnarkjs(progress);\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, [\"powersoftau\", \"contribute\", pot0, pot1, \"-v\"], {\n input: `caatinga-dev\\n${entropy}\\n`,\n });\n await runCommand(snarkjs, [\"powersoftau\", \"prepare\", \"phase2\", pot1, finalPath, \"-v\"]);\n progress?.onStatus?.(`powers-of-tau ready → ${finalPath}`);\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","import { createWriteStream } from \"node:fs\";\nimport { pipeline } from \"node:stream/promises\";\nimport { Readable } from \"node:stream\";\nimport type { ZkInstallProgress } from \"./install-progress.js\";\nimport { ZkError } from \"../errors/ZkError.js\";\n\nexport async function downloadWithProgress(\n url: string,\n destinationPath: string,\n progress?: ZkInstallProgress\n): Promise<void> {\n const response = await fetch(url);\n if (!response.ok) {\n throw new ZkError(\n `Failed to download ${url}: HTTP ${response.status}`,\n \"ZK_DOWNLOAD_FAILED\",\n \"Check your network connection and try again.\"\n );\n }\n\n if (!response.body) {\n throw new ZkError(\n `Failed to download ${url}: empty response body`,\n \"ZK_DOWNLOAD_FAILED\",\n \"Check your network connection and try again.\"\n );\n }\n\n const contentLength = response.headers.get(\"content-length\");\n const total = contentLength ? Number.parseInt(contentLength, 10) : undefined;\n let loaded = 0;\n\n const reader = response.body.getReader();\n const nodeStream = Readable.from(\n (async function* () {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n loaded += value.byteLength;\n progress?.onDownloadProgress?.(loaded, total);\n yield Buffer.from(value);\n }\n })()\n );\n\n await pipeline(nodeStream, createWriteStream(destinationPath));\n progress?.onDownloadComplete?.();\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 { readFile, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { ZkError } from \"../errors/ZkError.js\";\n\nexport const DEV_CEREMONY_TYPE = \"dev-single-party\" as const;\nexport const CEREMONY_MANIFEST_FILE = \"ceremony.json\";\n\nexport type DevCeremonyManifest = {\n type: typeof DEV_CEREMONY_TYPE;\n generatedAt: string;\n};\n\nexport function isProductionNetwork(networkName: string): boolean {\n return networkName === \"mainnet\";\n}\n\nexport function ceremonyManifestPath(artifactsDir: string): string {\n return path.join(artifactsDir, CEREMONY_MANIFEST_FILE);\n}\n\nexport async function writeDevCeremonyManifest(artifactsDir: string): Promise<void> {\n const manifest: DevCeremonyManifest = {\n type: DEV_CEREMONY_TYPE,\n generatedAt: new Date().toISOString(),\n };\n await writeFile(\n ceremonyManifestPath(artifactsDir),\n `${JSON.stringify(manifest, null, 2)}\\n`,\n \"utf8\"\n );\n}\n\nexport async function readDevCeremonyManifest(\n artifactsDir: string\n): Promise<DevCeremonyManifest | null> {\n try {\n const raw = await readFile(ceremonyManifestPath(artifactsDir), \"utf8\");\n const parsed = JSON.parse(raw) as DevCeremonyManifest;\n if (parsed.type !== DEV_CEREMONY_TYPE) {\n return null;\n }\n return parsed;\n } catch {\n return null;\n }\n}\n\nexport type AssertDevCeremonyAllowedOptions = {\n networkName: string;\n artifactsDir: string;\n allowDevCeremony: boolean;\n operation: string;\n};\n\nexport async function assertDevCeremonyAllowed(\n options: AssertDevCeremonyAllowedOptions\n): Promise<void> {\n if (!isProductionNetwork(options.networkName)) {\n return;\n }\n\n if (options.allowDevCeremony) {\n return;\n }\n\n const manifest = await readDevCeremonyManifest(options.artifactsDir);\n if (!manifest) {\n return;\n }\n\n throw new ZkError(\n `${options.operation} is blocked on mainnet: ZK artifacts were produced by a single-party development ceremony.`,\n \"ZK_DEV_CEREMONY_BLOCKED\",\n \"Run on testnet, supply audited MPC ceremony artifacts, or pass --allow-dev-ceremony only for conscious testing.\"\n );\n}\n\nexport function zkArtifactsDir(circuitName: string): string {\n return `.artifacts/zk/${circuitName}`;\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\";\nimport type { ZkInstallProgress } from \"../install/install-progress.js\";\n\nexport type ProveCircuitOptions = {\n circuitName: string;\n circuitPath: string;\n artifactsDir: string;\n inputPath: string;\n debug: boolean;\n progress?: ZkInstallProgress;\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(options.progress);\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(\n options: InvokeVerifierOptions\n): Promise<InvokeVerifierResult> {\n const cwd = options.cwd ?? process.cwd();\n const config = options.config ?? (await loadConfig({ cwd }));\n const proof = JSON.parse(\n await readFile(path.resolve(cwd, options.proofPath), \"utf8\")\n ) 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(`Verifier returned ${result.result.trim()}.`, \"ZK_VERIFY_FAILED\");\n }\n\n const artifacts = await readArtifacts(cwd);\n const contractId =\n 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","import_promises","path","os","import_promises","import_node_path","path","path","import_core","import_node_path","import_promises","path","import_core","import_promises","import_node_path","path"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -2,11 +2,18 @@ import { b as SnarkjsProof, c as SnarkjsVk } from './serialize-public-signals-Cu
|
|
|
2
2
|
export { d as SerializedProof, e as SerializedVk, s as serializeProof, f as serializePublicSignals, g as serializeVk } from './serialize-public-signals-Cu4-2Uv0.cjs';
|
|
3
3
|
import { CaatingaConfig } from '@caatinga/core';
|
|
4
4
|
|
|
5
|
+
type ZkInstallProgress = {
|
|
6
|
+
onStatus?: (message: string) => void;
|
|
7
|
+
onDownloadProgress?: (loaded: number, total?: number) => void;
|
|
8
|
+
onDownloadComplete?: () => void;
|
|
9
|
+
};
|
|
10
|
+
|
|
5
11
|
type BuildCircuitOptions = {
|
|
6
12
|
circuitName: string;
|
|
7
13
|
circuitPath: string;
|
|
8
14
|
artifactsDir: string;
|
|
9
15
|
embedVk: boolean;
|
|
16
|
+
progress?: ZkInstallProgress;
|
|
10
17
|
};
|
|
11
18
|
declare function buildCircuit(options: BuildCircuitOptions): Promise<void>;
|
|
12
19
|
|
|
@@ -16,6 +23,7 @@ type ProveCircuitOptions = {
|
|
|
16
23
|
artifactsDir: string;
|
|
17
24
|
inputPath: string;
|
|
18
25
|
debug: boolean;
|
|
26
|
+
progress?: ZkInstallProgress;
|
|
19
27
|
};
|
|
20
28
|
declare function proveCircuit(options: ProveCircuitOptions): Promise<void>;
|
|
21
29
|
|
|
@@ -47,10 +55,27 @@ declare function invokeVerifier(options: InvokeVerifierOptions): Promise<InvokeV
|
|
|
47
55
|
|
|
48
56
|
declare function ptauSizeForConstraints(constraintCount: number): number;
|
|
49
57
|
|
|
58
|
+
declare const DEV_CEREMONY_TYPE: "dev-single-party";
|
|
59
|
+
type DevCeremonyManifest = {
|
|
60
|
+
type: typeof DEV_CEREMONY_TYPE;
|
|
61
|
+
generatedAt: string;
|
|
62
|
+
};
|
|
63
|
+
declare function isProductionNetwork(networkName: string): boolean;
|
|
64
|
+
declare function writeDevCeremonyManifest(artifactsDir: string): Promise<void>;
|
|
65
|
+
declare function readDevCeremonyManifest(artifactsDir: string): Promise<DevCeremonyManifest | null>;
|
|
66
|
+
type AssertDevCeremonyAllowedOptions = {
|
|
67
|
+
networkName: string;
|
|
68
|
+
artifactsDir: string;
|
|
69
|
+
allowDevCeremony: boolean;
|
|
70
|
+
operation: string;
|
|
71
|
+
};
|
|
72
|
+
declare function assertDevCeremonyAllowed(options: AssertDevCeremonyAllowedOptions): Promise<void>;
|
|
73
|
+
declare function zkArtifactsDir(circuitName: string): string;
|
|
74
|
+
|
|
50
75
|
declare class ZkError extends Error {
|
|
51
76
|
readonly code: string;
|
|
52
77
|
readonly hint?: string | undefined;
|
|
53
78
|
constructor(message: string, code: string, hint?: string | undefined);
|
|
54
79
|
}
|
|
55
80
|
|
|
56
|
-
export { type BuildCircuitOptions, type InvokeVerifierOptions, type InvokeVerifierResult, type ProveCircuitOptions, SnarkjsProof, SnarkjsVk, ZkError, buildCircuit, buildStellarVerifyProofArgs, invokeVerifier, proveCircuit, ptauSizeForConstraints };
|
|
81
|
+
export { type AssertDevCeremonyAllowedOptions, type BuildCircuitOptions, type DevCeremonyManifest, type InvokeVerifierOptions, type InvokeVerifierResult, type ProveCircuitOptions, SnarkjsProof, SnarkjsVk, ZkError, type ZkInstallProgress, assertDevCeremonyAllowed, buildCircuit, buildStellarVerifyProofArgs, invokeVerifier, isProductionNetwork, proveCircuit, ptauSizeForConstraints, readDevCeremonyManifest, writeDevCeremonyManifest, zkArtifactsDir };
|
package/dist/index.d.ts
CHANGED
|
@@ -2,11 +2,18 @@ import { b as SnarkjsProof, c as SnarkjsVk } from './serialize-public-signals-Cu
|
|
|
2
2
|
export { d as SerializedProof, e as SerializedVk, s as serializeProof, f as serializePublicSignals, g as serializeVk } from './serialize-public-signals-Cu4-2Uv0.js';
|
|
3
3
|
import { CaatingaConfig } from '@caatinga/core';
|
|
4
4
|
|
|
5
|
+
type ZkInstallProgress = {
|
|
6
|
+
onStatus?: (message: string) => void;
|
|
7
|
+
onDownloadProgress?: (loaded: number, total?: number) => void;
|
|
8
|
+
onDownloadComplete?: () => void;
|
|
9
|
+
};
|
|
10
|
+
|
|
5
11
|
type BuildCircuitOptions = {
|
|
6
12
|
circuitName: string;
|
|
7
13
|
circuitPath: string;
|
|
8
14
|
artifactsDir: string;
|
|
9
15
|
embedVk: boolean;
|
|
16
|
+
progress?: ZkInstallProgress;
|
|
10
17
|
};
|
|
11
18
|
declare function buildCircuit(options: BuildCircuitOptions): Promise<void>;
|
|
12
19
|
|
|
@@ -16,6 +23,7 @@ type ProveCircuitOptions = {
|
|
|
16
23
|
artifactsDir: string;
|
|
17
24
|
inputPath: string;
|
|
18
25
|
debug: boolean;
|
|
26
|
+
progress?: ZkInstallProgress;
|
|
19
27
|
};
|
|
20
28
|
declare function proveCircuit(options: ProveCircuitOptions): Promise<void>;
|
|
21
29
|
|
|
@@ -47,10 +55,27 @@ declare function invokeVerifier(options: InvokeVerifierOptions): Promise<InvokeV
|
|
|
47
55
|
|
|
48
56
|
declare function ptauSizeForConstraints(constraintCount: number): number;
|
|
49
57
|
|
|
58
|
+
declare const DEV_CEREMONY_TYPE: "dev-single-party";
|
|
59
|
+
type DevCeremonyManifest = {
|
|
60
|
+
type: typeof DEV_CEREMONY_TYPE;
|
|
61
|
+
generatedAt: string;
|
|
62
|
+
};
|
|
63
|
+
declare function isProductionNetwork(networkName: string): boolean;
|
|
64
|
+
declare function writeDevCeremonyManifest(artifactsDir: string): Promise<void>;
|
|
65
|
+
declare function readDevCeremonyManifest(artifactsDir: string): Promise<DevCeremonyManifest | null>;
|
|
66
|
+
type AssertDevCeremonyAllowedOptions = {
|
|
67
|
+
networkName: string;
|
|
68
|
+
artifactsDir: string;
|
|
69
|
+
allowDevCeremony: boolean;
|
|
70
|
+
operation: string;
|
|
71
|
+
};
|
|
72
|
+
declare function assertDevCeremonyAllowed(options: AssertDevCeremonyAllowedOptions): Promise<void>;
|
|
73
|
+
declare function zkArtifactsDir(circuitName: string): string;
|
|
74
|
+
|
|
50
75
|
declare class ZkError extends Error {
|
|
51
76
|
readonly code: string;
|
|
52
77
|
readonly hint?: string | undefined;
|
|
53
78
|
constructor(message: string, code: string, hint?: string | undefined);
|
|
54
79
|
}
|
|
55
80
|
|
|
56
|
-
export { type BuildCircuitOptions, type InvokeVerifierOptions, type InvokeVerifierResult, type ProveCircuitOptions, SnarkjsProof, SnarkjsVk, ZkError, buildCircuit, buildStellarVerifyProofArgs, invokeVerifier, proveCircuit, ptauSizeForConstraints };
|
|
81
|
+
export { type AssertDevCeremonyAllowedOptions, type BuildCircuitOptions, type DevCeremonyManifest, type InvokeVerifierOptions, type InvokeVerifierResult, type ProveCircuitOptions, SnarkjsProof, SnarkjsVk, ZkError, type ZkInstallProgress, assertDevCeremonyAllowed, buildCircuit, buildStellarVerifyProofArgs, invokeVerifier, isProductionNetwork, proveCircuit, ptauSizeForConstraints, readDevCeremonyManifest, writeDevCeremonyManifest, zkArtifactsDir };
|
package/dist/index.js
CHANGED
|
@@ -11,8 +11,8 @@ import {
|
|
|
11
11
|
|
|
12
12
|
// src/build/build-circuit.ts
|
|
13
13
|
import { runCommand as runCommand2 } from "@caatinga/core";
|
|
14
|
-
import
|
|
15
|
-
import { mkdir as mkdir2, readFile, writeFile as
|
|
14
|
+
import path3 from "path";
|
|
15
|
+
import { mkdir as mkdir2, readFile as readFile2, writeFile as writeFile3 } from "fs/promises";
|
|
16
16
|
import { createHash as createHash2, randomBytes as randomBytes2 } from "crypto";
|
|
17
17
|
|
|
18
18
|
// src/install/lazy-install-zk-tools.ts
|
|
@@ -21,9 +21,54 @@ import { access, chmod, mkdir, writeFile } from "fs/promises";
|
|
|
21
21
|
import path from "path";
|
|
22
22
|
import os from "os";
|
|
23
23
|
import { createHash, randomBytes } from "crypto";
|
|
24
|
-
|
|
24
|
+
|
|
25
|
+
// src/install/download-with-progress.ts
|
|
26
|
+
import { createWriteStream } from "fs";
|
|
27
|
+
import { pipeline } from "stream/promises";
|
|
28
|
+
import { Readable } from "stream";
|
|
29
|
+
async function downloadWithProgress(url, destinationPath, progress) {
|
|
30
|
+
const response = await fetch(url);
|
|
31
|
+
if (!response.ok) {
|
|
32
|
+
throw new ZkError(
|
|
33
|
+
`Failed to download ${url}: HTTP ${response.status}`,
|
|
34
|
+
"ZK_DOWNLOAD_FAILED",
|
|
35
|
+
"Check your network connection and try again."
|
|
36
|
+
);
|
|
37
|
+
}
|
|
38
|
+
if (!response.body) {
|
|
39
|
+
throw new ZkError(
|
|
40
|
+
`Failed to download ${url}: empty response body`,
|
|
41
|
+
"ZK_DOWNLOAD_FAILED",
|
|
42
|
+
"Check your network connection and try again."
|
|
43
|
+
);
|
|
44
|
+
}
|
|
45
|
+
const contentLength = response.headers.get("content-length");
|
|
46
|
+
const total = contentLength ? Number.parseInt(contentLength, 10) : void 0;
|
|
47
|
+
let loaded = 0;
|
|
48
|
+
const reader = response.body.getReader();
|
|
49
|
+
const nodeStream = Readable.from(
|
|
50
|
+
(async function* () {
|
|
51
|
+
while (true) {
|
|
52
|
+
const { done, value } = await reader.read();
|
|
53
|
+
if (done) {
|
|
54
|
+
break;
|
|
55
|
+
}
|
|
56
|
+
loaded += value.byteLength;
|
|
57
|
+
progress?.onDownloadProgress?.(loaded, total);
|
|
58
|
+
yield Buffer.from(value);
|
|
59
|
+
}
|
|
60
|
+
})()
|
|
61
|
+
);
|
|
62
|
+
await pipeline(nodeStream, createWriteStream(destinationPath));
|
|
63
|
+
progress?.onDownloadComplete?.();
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// src/install/lazy-install-zk-tools.ts
|
|
25
67
|
var SNARKJS_VERSION = "0.7.5";
|
|
26
68
|
var CIRCOM_VERSION = "2.1.9";
|
|
69
|
+
function zkCacheDir() {
|
|
70
|
+
return path.join(process.env.HOME ?? os.homedir(), ".caatinga", "zk-tools");
|
|
71
|
+
}
|
|
27
72
|
function circomAssetName() {
|
|
28
73
|
const platform = process.platform;
|
|
29
74
|
const arch = process.arch === "x64" ? "amd64" : process.arch;
|
|
@@ -39,29 +84,35 @@ function circomAssetName() {
|
|
|
39
84
|
"Install circom 2.x manually and ensure it is on PATH."
|
|
40
85
|
);
|
|
41
86
|
}
|
|
42
|
-
async function ensureCircom() {
|
|
43
|
-
const
|
|
87
|
+
async function ensureCircom(progress) {
|
|
88
|
+
const asset = circomAssetName();
|
|
89
|
+
const installDir = path.join(zkCacheDir(), "circom", CIRCOM_VERSION);
|
|
90
|
+
const binaryPath = path.join(installDir, asset);
|
|
44
91
|
try {
|
|
45
|
-
await access(
|
|
46
|
-
|
|
92
|
+
await access(binaryPath);
|
|
93
|
+
progress?.onStatus?.(`Using cached circom v${CIRCOM_VERSION}`);
|
|
94
|
+
return binaryPath;
|
|
47
95
|
} catch {
|
|
48
96
|
}
|
|
49
|
-
const asset = circomAssetName();
|
|
50
97
|
const url = `https://github.com/iden3/circom/releases/download/v${CIRCOM_VERSION}/${asset}`;
|
|
51
|
-
const installDir = path.join(ZK_CACHE_DIR, "circom", CIRCOM_VERSION);
|
|
52
98
|
await mkdir(installDir, { recursive: true });
|
|
53
|
-
|
|
54
|
-
await
|
|
55
|
-
await chmod(
|
|
56
|
-
|
|
99
|
+
progress?.onStatus?.(`Downloading circom v${CIRCOM_VERSION} (${asset})...`);
|
|
100
|
+
await downloadWithProgress(url, binaryPath, progress);
|
|
101
|
+
await chmod(binaryPath, 493);
|
|
102
|
+
progress?.onStatus?.(`circom installed \u2192 ${binaryPath}`);
|
|
103
|
+
return binaryPath;
|
|
57
104
|
}
|
|
58
|
-
async function ensureSnarkjs() {
|
|
59
|
-
const installDir = path.join(
|
|
105
|
+
async function ensureSnarkjs(progress) {
|
|
106
|
+
const installDir = path.join(zkCacheDir(), `snarkjs-${SNARKJS_VERSION}`);
|
|
60
107
|
const cliPath = path.join(installDir, "node_modules", ".bin", "snarkjs");
|
|
61
108
|
try {
|
|
62
109
|
await access(cliPath);
|
|
110
|
+
progress?.onStatus?.(`Using cached snarkjs v${SNARKJS_VERSION}`);
|
|
63
111
|
return cliPath;
|
|
64
112
|
} catch {
|
|
113
|
+
progress?.onStatus?.(
|
|
114
|
+
`Installing snarkjs v${SNARKJS_VERSION} into ${installDir} (first run only)...`
|
|
115
|
+
);
|
|
65
116
|
await mkdir(installDir, { recursive: true });
|
|
66
117
|
await writeFile(
|
|
67
118
|
path.join(installDir, "package.json"),
|
|
@@ -75,19 +126,22 @@ async function ensureSnarkjs() {
|
|
|
75
126
|
cwd: installDir
|
|
76
127
|
}
|
|
77
128
|
);
|
|
129
|
+
progress?.onStatus?.(`snarkjs installed \u2192 ${cliPath}`);
|
|
78
130
|
return cliPath;
|
|
79
131
|
}
|
|
80
132
|
}
|
|
81
|
-
async function ensurePtau(size) {
|
|
82
|
-
const ptauDir = path.join(
|
|
133
|
+
async function ensurePtau(size, progress) {
|
|
134
|
+
const ptauDir = path.join(zkCacheDir(), "ptau", "bls12-381");
|
|
83
135
|
const finalPath = path.join(ptauDir, `pot${size}_final.ptau`);
|
|
84
136
|
try {
|
|
85
137
|
await access(finalPath);
|
|
138
|
+
progress?.onStatus?.(`Using cached powers-of-tau (bls12-381, size ${size})`);
|
|
86
139
|
return finalPath;
|
|
87
140
|
} catch {
|
|
88
141
|
await mkdir(ptauDir, { recursive: true });
|
|
89
142
|
}
|
|
90
|
-
|
|
143
|
+
progress?.onStatus?.(`Generating dev powers-of-tau (bls12-381, size ${size})...`);
|
|
144
|
+
const snarkjs = await ensureSnarkjs(progress);
|
|
91
145
|
const pot0 = path.join(ptauDir, `pot${size}_0000.ptau`);
|
|
92
146
|
const pot1 = path.join(ptauDir, `pot${size}_0001.ptau`);
|
|
93
147
|
const entropy = createHash("sha256").update(randomBytes(32)).digest("hex");
|
|
@@ -98,6 +152,7 @@ ${entropy}
|
|
|
98
152
|
`
|
|
99
153
|
});
|
|
100
154
|
await runCommand(snarkjs, ["powersoftau", "prepare", "phase2", pot1, finalPath, "-v"]);
|
|
155
|
+
progress?.onStatus?.(`powers-of-tau ready \u2192 ${finalPath}`);
|
|
101
156
|
return finalPath;
|
|
102
157
|
}
|
|
103
158
|
|
|
@@ -107,6 +162,62 @@ function ptauSizeForConstraints(constraintCount) {
|
|
|
107
162
|
return Math.min(Math.max(needed, 8), 28);
|
|
108
163
|
}
|
|
109
164
|
|
|
165
|
+
// src/ceremony/dev-ceremony.ts
|
|
166
|
+
import { readFile, writeFile as writeFile2 } from "fs/promises";
|
|
167
|
+
import path2 from "path";
|
|
168
|
+
var DEV_CEREMONY_TYPE = "dev-single-party";
|
|
169
|
+
var CEREMONY_MANIFEST_FILE = "ceremony.json";
|
|
170
|
+
function isProductionNetwork(networkName) {
|
|
171
|
+
return networkName === "mainnet";
|
|
172
|
+
}
|
|
173
|
+
function ceremonyManifestPath(artifactsDir) {
|
|
174
|
+
return path2.join(artifactsDir, CEREMONY_MANIFEST_FILE);
|
|
175
|
+
}
|
|
176
|
+
async function writeDevCeremonyManifest(artifactsDir) {
|
|
177
|
+
const manifest = {
|
|
178
|
+
type: DEV_CEREMONY_TYPE,
|
|
179
|
+
generatedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
180
|
+
};
|
|
181
|
+
await writeFile2(
|
|
182
|
+
ceremonyManifestPath(artifactsDir),
|
|
183
|
+
`${JSON.stringify(manifest, null, 2)}
|
|
184
|
+
`,
|
|
185
|
+
"utf8"
|
|
186
|
+
);
|
|
187
|
+
}
|
|
188
|
+
async function readDevCeremonyManifest(artifactsDir) {
|
|
189
|
+
try {
|
|
190
|
+
const raw = await readFile(ceremonyManifestPath(artifactsDir), "utf8");
|
|
191
|
+
const parsed = JSON.parse(raw);
|
|
192
|
+
if (parsed.type !== DEV_CEREMONY_TYPE) {
|
|
193
|
+
return null;
|
|
194
|
+
}
|
|
195
|
+
return parsed;
|
|
196
|
+
} catch {
|
|
197
|
+
return null;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
async function assertDevCeremonyAllowed(options) {
|
|
201
|
+
if (!isProductionNetwork(options.networkName)) {
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
if (options.allowDevCeremony) {
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
const manifest = await readDevCeremonyManifest(options.artifactsDir);
|
|
208
|
+
if (!manifest) {
|
|
209
|
+
return;
|
|
210
|
+
}
|
|
211
|
+
throw new ZkError(
|
|
212
|
+
`${options.operation} is blocked on mainnet: ZK artifacts were produced by a single-party development ceremony.`,
|
|
213
|
+
"ZK_DEV_CEREMONY_BLOCKED",
|
|
214
|
+
"Run on testnet, supply audited MPC ceremony artifacts, or pass --allow-dev-ceremony only for conscious testing."
|
|
215
|
+
);
|
|
216
|
+
}
|
|
217
|
+
function zkArtifactsDir(circuitName) {
|
|
218
|
+
return `.artifacts/zk/${circuitName}`;
|
|
219
|
+
}
|
|
220
|
+
|
|
110
221
|
// src/build/build-circuit.ts
|
|
111
222
|
var BYTES_PER_LINE = 16;
|
|
112
223
|
function formatRustByteArray(bytes) {
|
|
@@ -163,21 +274,23 @@ ${formatRustByteArray(ic)}
|
|
|
163
274
|
].join("\n");
|
|
164
275
|
}
|
|
165
276
|
async function writeEmbeddedVk(vkPath, verifierSrcDir) {
|
|
166
|
-
const rawJson = await
|
|
277
|
+
const rawJson = await readFile2(vkPath, "utf8");
|
|
167
278
|
const rustSource = generateVkRust(vkPath, rawJson);
|
|
168
|
-
await
|
|
279
|
+
await writeFile3(path3.join(verifierSrcDir, "vk.rs"), rustSource, "utf8");
|
|
169
280
|
}
|
|
170
281
|
async function buildCircuit(options) {
|
|
171
|
-
const
|
|
172
|
-
const
|
|
173
|
-
const
|
|
174
|
-
const
|
|
175
|
-
const
|
|
176
|
-
const
|
|
177
|
-
const
|
|
178
|
-
const
|
|
179
|
-
const
|
|
282
|
+
const progress = options.progress;
|
|
283
|
+
const circom = await ensureCircom(progress);
|
|
284
|
+
const snarkjs = await ensureSnarkjs(progress);
|
|
285
|
+
const circuitDir = path3.resolve(options.circuitPath);
|
|
286
|
+
const outDir = path3.resolve(options.artifactsDir);
|
|
287
|
+
const circuitFile = path3.join(circuitDir, "main.circom");
|
|
288
|
+
const r1csPath = path3.join(outDir, "main.r1cs");
|
|
289
|
+
const zkey0 = path3.join(outDir, "circuit_0000.zkey");
|
|
290
|
+
const zkeyFinal = path3.join(outDir, "circuit_final.zkey");
|
|
291
|
+
const vkPath = path3.join(outDir, "verification_key.json");
|
|
180
292
|
await mkdir2(outDir, { recursive: true });
|
|
293
|
+
progress?.onStatus?.(`Compiling ${circuitFile}...`);
|
|
181
294
|
await runCommand2(circom, [
|
|
182
295
|
circuitFile,
|
|
183
296
|
"--r1cs",
|
|
@@ -192,8 +305,9 @@ async function buildCircuit(options) {
|
|
|
192
305
|
const constraintMatch = r1csInfo.stdout.match(/# of Constraints:\s+(\d+)/);
|
|
193
306
|
const constraints = constraintMatch ? Number.parseInt(constraintMatch[1], 10) : 1;
|
|
194
307
|
const ptauSize = ptauSizeForConstraints(constraints);
|
|
195
|
-
const ptauPath = await ensurePtau(ptauSize);
|
|
308
|
+
const ptauPath = await ensurePtau(ptauSize, progress);
|
|
196
309
|
const entropy = createHash2("sha256").update(randomBytes2(32)).digest("hex");
|
|
310
|
+
progress?.onStatus?.("Running Groth16 trusted setup...");
|
|
197
311
|
await runCommand2(snarkjs, ["groth16", "setup", r1csPath, ptauPath, zkey0]);
|
|
198
312
|
await runCommand2(snarkjs, ["zkey", "contribute", zkey0, zkeyFinal, "-v"], {
|
|
199
313
|
input: `caatinga-dev
|
|
@@ -202,29 +316,30 @@ ${entropy}
|
|
|
202
316
|
});
|
|
203
317
|
await runCommand2(snarkjs, ["zkey", "export", "verificationkey", zkeyFinal, vkPath]);
|
|
204
318
|
if (options.embedVk) {
|
|
205
|
-
const verifierSrcDir =
|
|
319
|
+
const verifierSrcDir = path3.resolve("contracts", "verifier", "src");
|
|
206
320
|
await writeEmbeddedVk(vkPath, verifierSrcDir);
|
|
207
321
|
}
|
|
322
|
+
await writeDevCeremonyManifest(outDir);
|
|
208
323
|
}
|
|
209
324
|
|
|
210
325
|
// src/prove/prove-circuit.ts
|
|
211
326
|
import { runCommand as runCommand3 } from "@caatinga/core";
|
|
212
|
-
import
|
|
327
|
+
import path4 from "path";
|
|
213
328
|
import { access as access2, mkdir as mkdir3 } from "fs/promises";
|
|
214
329
|
function resolveCircuitWasmPath(artifactsDir) {
|
|
215
|
-
return
|
|
330
|
+
return path4.join(artifactsDir, "main_js", "main.wasm");
|
|
216
331
|
}
|
|
217
332
|
async function proveCircuit(options) {
|
|
218
|
-
const snarkjs = await ensureSnarkjs();
|
|
219
|
-
const artifactsDir =
|
|
333
|
+
const snarkjs = await ensureSnarkjs(options.progress);
|
|
334
|
+
const artifactsDir = path4.resolve(options.artifactsDir);
|
|
220
335
|
const wasmPath = resolveCircuitWasmPath(artifactsDir);
|
|
221
|
-
const zkeyPath =
|
|
222
|
-
const inputPath =
|
|
223
|
-
const proofPath =
|
|
224
|
-
const publicPath =
|
|
336
|
+
const zkeyPath = path4.join(artifactsDir, "circuit_final.zkey");
|
|
337
|
+
const inputPath = path4.resolve(options.inputPath);
|
|
338
|
+
const proofPath = path4.join(artifactsDir, "proof.json");
|
|
339
|
+
const publicPath = path4.join(artifactsDir, "public.json");
|
|
225
340
|
await mkdir3(artifactsDir, { recursive: true });
|
|
226
341
|
if (options.debug) {
|
|
227
|
-
const witnessPath =
|
|
342
|
+
const witnessPath = path4.join(artifactsDir, "witness.wtns");
|
|
228
343
|
await runCommand3(snarkjs, ["wtns", "calculate", wasmPath, inputPath, witnessPath, "-v"]);
|
|
229
344
|
await runCommand3(snarkjs, ["groth16", "prove", zkeyPath, witnessPath, proofPath, publicPath]);
|
|
230
345
|
return;
|
|
@@ -244,8 +359,8 @@ async function proveCircuit(options) {
|
|
|
244
359
|
|
|
245
360
|
// src/invoke/invoke-verifier.ts
|
|
246
361
|
import { invokeContract, loadConfig, readArtifacts } from "@caatinga/core";
|
|
247
|
-
import { readFile as
|
|
248
|
-
import
|
|
362
|
+
import { readFile as readFile3 } from "fs/promises";
|
|
363
|
+
import path5 from "path";
|
|
249
364
|
function buildStellarVerifyProofArgs(options) {
|
|
250
365
|
const serializedProof = serializeProof(options.proof);
|
|
251
366
|
const args = [];
|
|
@@ -280,12 +395,12 @@ async function invokeVerifier(options) {
|
|
|
280
395
|
const cwd = options.cwd ?? process.cwd();
|
|
281
396
|
const config = options.config ?? await loadConfig({ cwd });
|
|
282
397
|
const proof = JSON.parse(
|
|
283
|
-
await
|
|
398
|
+
await readFile3(path5.resolve(cwd, options.proofPath), "utf8")
|
|
284
399
|
);
|
|
285
400
|
const publicSignals = JSON.parse(
|
|
286
|
-
await
|
|
401
|
+
await readFile3(path5.resolve(cwd, options.publicSignalsPath), "utf8")
|
|
287
402
|
);
|
|
288
|
-
const vk = options.embedVk ? void 0 : JSON.parse(await
|
|
403
|
+
const vk = options.embedVk ? void 0 : JSON.parse(await readFile3(path5.resolve(cwd, options.vkPath), "utf8"));
|
|
289
404
|
const args = buildStellarVerifyProofArgs({
|
|
290
405
|
proof,
|
|
291
406
|
vk,
|
|
@@ -326,13 +441,18 @@ async function invokeVerifier(options) {
|
|
|
326
441
|
}
|
|
327
442
|
export {
|
|
328
443
|
ZkError,
|
|
444
|
+
assertDevCeremonyAllowed,
|
|
329
445
|
buildCircuit,
|
|
330
446
|
buildStellarVerifyProofArgs,
|
|
331
447
|
invokeVerifier,
|
|
448
|
+
isProductionNetwork,
|
|
332
449
|
proveCircuit,
|
|
333
450
|
ptauSizeForConstraints,
|
|
451
|
+
readDevCeremonyManifest,
|
|
334
452
|
serializeProof,
|
|
335
453
|
serializePublicSignals,
|
|
336
|
-
serializeVk
|
|
454
|
+
serializeVk,
|
|
455
|
+
writeDevCeremonyManifest,
|
|
456
|
+
zkArtifactsDir
|
|
337
457
|
};
|
|
338
458
|
//# sourceMappingURL=index.js.map
|
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\";\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(vkPath: string, verifierSrcDir: string): 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(\n \"npm\",\n [\"install\", \"--no-save\", \"--legacy-peer-deps\", `snarkjs@${SNARKJS_VERSION}`],\n {\n cwd: installDir,\n }\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, [\"powersoftau\", \"contribute\", pot0, pot1, \"-v\"], {\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(\n options: InvokeVerifierOptions\n): Promise<InvokeVerifierResult> {\n const cwd = options.cwd ?? process.cwd();\n const config = options.config ?? (await loadConfig({ cwd }));\n const proof = JSON.parse(\n await readFile(path.resolve(cwd, options.proofPath), \"utf8\")\n ) 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(`Verifier returned ${result.result.trim()}.`, \"ZK_VERIFY_FAILED\");\n }\n\n const artifacts = await readArtifacts(cwd);\n const contractId =\n 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/install/download-with-progress.ts","../src/build/detect-ptau-size.ts","../src/ceremony/dev-ceremony.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 type { ZkInstallProgress } from \"../install/install-progress.js\";\nimport { ptauSizeForConstraints } from \"./detect-ptau-size.js\";\nimport { writeDevCeremonyManifest } from \"../ceremony/dev-ceremony.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 progress?: ZkInstallProgress;\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(vkPath: string, verifierSrcDir: string): 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 progress = options.progress;\n const circom = await ensureCircom(progress);\n const snarkjs = await ensureSnarkjs(progress);\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 progress?.onStatus?.(`Compiling ${circuitFile}...`);\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, progress);\n const entropy = createHash(\"sha256\").update(randomBytes(32)).digest(\"hex\");\n\n progress?.onStatus?.(\"Running Groth16 trusted setup...\");\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 await writeDevCeremonyManifest(outDir);\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\";\nimport { downloadWithProgress } from \"./download-with-progress.js\";\nimport type { ZkInstallProgress } from \"./install-progress.js\";\n\nconst SNARKJS_VERSION = \"0.7.5\";\nconst CIRCOM_VERSION = \"2.1.9\";\n\nfunction zkCacheDir(): string {\n return path.join(process.env.HOME ?? os.homedir(), \".caatinga\", \"zk-tools\");\n}\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(progress?: ZkInstallProgress): Promise<string> {\n const asset = circomAssetName();\n const installDir = path.join(zkCacheDir(), \"circom\", CIRCOM_VERSION);\n const binaryPath = path.join(installDir, asset);\n\n try {\n await access(binaryPath);\n progress?.onStatus?.(`Using cached circom v${CIRCOM_VERSION}`);\n return binaryPath;\n } catch {\n // Fall through to download.\n }\n\n const url = `https://github.com/iden3/circom/releases/download/v${CIRCOM_VERSION}/${asset}`;\n await mkdir(installDir, { recursive: true });\n\n progress?.onStatus?.(`Downloading circom v${CIRCOM_VERSION} (${asset})...`);\n await downloadWithProgress(url, binaryPath, progress);\n await chmod(binaryPath, 0o755);\n progress?.onStatus?.(`circom installed → ${binaryPath}`);\n\n return binaryPath;\n}\n\nexport async function ensureSnarkjs(progress?: ZkInstallProgress): Promise<string> {\n const installDir = path.join(zkCacheDir(), `snarkjs-${SNARKJS_VERSION}`);\n const cliPath = path.join(installDir, \"node_modules\", \".bin\", \"snarkjs\");\n\n try {\n await access(cliPath);\n progress?.onStatus?.(`Using cached snarkjs v${SNARKJS_VERSION}`);\n return cliPath;\n } catch {\n progress?.onStatus?.(\n `Installing snarkjs v${SNARKJS_VERSION} into ${installDir} (first run only)...`\n );\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(\n \"npm\",\n [\"install\", \"--no-save\", \"--legacy-peer-deps\", `snarkjs@${SNARKJS_VERSION}`],\n {\n cwd: installDir,\n }\n );\n progress?.onStatus?.(`snarkjs installed → ${cliPath}`);\n return cliPath;\n }\n}\n\nexport async function ensurePtau(size: number, progress?: ZkInstallProgress): Promise<string> {\n const ptauDir = path.join(zkCacheDir(), \"ptau\", \"bls12-381\");\n const finalPath = path.join(ptauDir, `pot${size}_final.ptau`);\n try {\n await access(finalPath);\n progress?.onStatus?.(`Using cached powers-of-tau (bls12-381, size ${size})`);\n return finalPath;\n } catch {\n await mkdir(ptauDir, { recursive: true });\n }\n\n progress?.onStatus?.(`Generating dev powers-of-tau (bls12-381, size ${size})...`);\n const snarkjs = await ensureSnarkjs(progress);\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, [\"powersoftau\", \"contribute\", pot0, pot1, \"-v\"], {\n input: `caatinga-dev\\n${entropy}\\n`,\n });\n await runCommand(snarkjs, [\"powersoftau\", \"prepare\", \"phase2\", pot1, finalPath, \"-v\"]);\n progress?.onStatus?.(`powers-of-tau ready → ${finalPath}`);\n\n return finalPath;\n}\n","import { createWriteStream } from \"node:fs\";\nimport { pipeline } from \"node:stream/promises\";\nimport { Readable } from \"node:stream\";\nimport type { ZkInstallProgress } from \"./install-progress.js\";\nimport { ZkError } from \"../errors/ZkError.js\";\n\nexport async function downloadWithProgress(\n url: string,\n destinationPath: string,\n progress?: ZkInstallProgress\n): Promise<void> {\n const response = await fetch(url);\n if (!response.ok) {\n throw new ZkError(\n `Failed to download ${url}: HTTP ${response.status}`,\n \"ZK_DOWNLOAD_FAILED\",\n \"Check your network connection and try again.\"\n );\n }\n\n if (!response.body) {\n throw new ZkError(\n `Failed to download ${url}: empty response body`,\n \"ZK_DOWNLOAD_FAILED\",\n \"Check your network connection and try again.\"\n );\n }\n\n const contentLength = response.headers.get(\"content-length\");\n const total = contentLength ? Number.parseInt(contentLength, 10) : undefined;\n let loaded = 0;\n\n const reader = response.body.getReader();\n const nodeStream = Readable.from(\n (async function* () {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n loaded += value.byteLength;\n progress?.onDownloadProgress?.(loaded, total);\n yield Buffer.from(value);\n }\n })()\n );\n\n await pipeline(nodeStream, createWriteStream(destinationPath));\n progress?.onDownloadComplete?.();\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 { readFile, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { ZkError } from \"../errors/ZkError.js\";\n\nexport const DEV_CEREMONY_TYPE = \"dev-single-party\" as const;\nexport const CEREMONY_MANIFEST_FILE = \"ceremony.json\";\n\nexport type DevCeremonyManifest = {\n type: typeof DEV_CEREMONY_TYPE;\n generatedAt: string;\n};\n\nexport function isProductionNetwork(networkName: string): boolean {\n return networkName === \"mainnet\";\n}\n\nexport function ceremonyManifestPath(artifactsDir: string): string {\n return path.join(artifactsDir, CEREMONY_MANIFEST_FILE);\n}\n\nexport async function writeDevCeremonyManifest(artifactsDir: string): Promise<void> {\n const manifest: DevCeremonyManifest = {\n type: DEV_CEREMONY_TYPE,\n generatedAt: new Date().toISOString(),\n };\n await writeFile(\n ceremonyManifestPath(artifactsDir),\n `${JSON.stringify(manifest, null, 2)}\\n`,\n \"utf8\"\n );\n}\n\nexport async function readDevCeremonyManifest(\n artifactsDir: string\n): Promise<DevCeremonyManifest | null> {\n try {\n const raw = await readFile(ceremonyManifestPath(artifactsDir), \"utf8\");\n const parsed = JSON.parse(raw) as DevCeremonyManifest;\n if (parsed.type !== DEV_CEREMONY_TYPE) {\n return null;\n }\n return parsed;\n } catch {\n return null;\n }\n}\n\nexport type AssertDevCeremonyAllowedOptions = {\n networkName: string;\n artifactsDir: string;\n allowDevCeremony: boolean;\n operation: string;\n};\n\nexport async function assertDevCeremonyAllowed(\n options: AssertDevCeremonyAllowedOptions\n): Promise<void> {\n if (!isProductionNetwork(options.networkName)) {\n return;\n }\n\n if (options.allowDevCeremony) {\n return;\n }\n\n const manifest = await readDevCeremonyManifest(options.artifactsDir);\n if (!manifest) {\n return;\n }\n\n throw new ZkError(\n `${options.operation} is blocked on mainnet: ZK artifacts were produced by a single-party development ceremony.`,\n \"ZK_DEV_CEREMONY_BLOCKED\",\n \"Run on testnet, supply audited MPC ceremony artifacts, or pass --allow-dev-ceremony only for conscious testing.\"\n );\n}\n\nexport function zkArtifactsDir(circuitName: string): string {\n return `.artifacts/zk/${circuitName}`;\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\";\nimport type { ZkInstallProgress } from \"../install/install-progress.js\";\n\nexport type ProveCircuitOptions = {\n circuitName: string;\n circuitPath: string;\n artifactsDir: string;\n inputPath: string;\n debug: boolean;\n progress?: ZkInstallProgress;\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(options.progress);\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(\n options: InvokeVerifierOptions\n): Promise<InvokeVerifierResult> {\n const cwd = options.cwd ?? process.cwd();\n const config = options.config ?? (await loadConfig({ cwd }));\n const proof = JSON.parse(\n await readFile(path.resolve(cwd, options.proofPath), \"utf8\")\n ) 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(`Verifier returned ${result.result.trim()}.`, \"ZK_VERIFY_FAILED\");\n }\n\n const artifacts = await readArtifacts(cwd);\n const contractId =\n 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","readFile","writeFile","createHash","randomBytes","writeFile","path","path","writeFile","readFile","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": "3.
|
|
3
|
+
"version": "3.2.0",
|
|
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": "^3.
|
|
30
|
+
"@caatinga/core": "^3.2.0"
|
|
31
31
|
},
|
|
32
32
|
"devDependencies": {
|
|
33
33
|
"tsup": "^8.3.5",
|