@aztec/bb-prover 0.0.1-commit.d431d1c → 0.0.1-commit.d58ff9d0
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/dest/avm_proving_tests/avm_proving_tester.d.ts +16 -10
- package/dest/avm_proving_tests/avm_proving_tester.d.ts.map +1 -1
- package/dest/avm_proving_tests/avm_proving_tester.js +178 -111
- package/dest/bb/bb_js_backend.d.ts +196 -0
- package/dest/bb/bb_js_backend.d.ts.map +1 -0
- package/dest/bb/bb_js_backend.js +379 -0
- package/dest/bb/bb_js_debug.d.ts +52 -0
- package/dest/bb/bb_js_debug.d.ts.map +1 -0
- package/dest/bb/bb_js_debug.js +176 -0
- package/dest/bb/file_names.d.ts +4 -0
- package/dest/bb/file_names.d.ts.map +1 -0
- package/dest/bb/file_names.js +5 -0
- package/dest/config.d.ts +17 -1
- package/dest/config.d.ts.map +1 -1
- package/dest/index.d.ts +3 -2
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +2 -1
- package/dest/instrumentation.d.ts +1 -1
- package/dest/instrumentation.d.ts.map +1 -1
- package/dest/instrumentation.js +12 -4
- package/dest/prover/client/bb_private_kernel_prover.d.ts +21 -5
- package/dest/prover/client/bb_private_kernel_prover.d.ts.map +1 -1
- package/dest/prover/client/bb_private_kernel_prover.js +79 -15
- package/dest/prover/proof_utils.d.ts +11 -1
- package/dest/prover/proof_utils.d.ts.map +1 -1
- package/dest/prover/proof_utils.js +24 -1
- package/dest/prover/server/bb_prover.d.ts +6 -7
- package/dest/prover/server/bb_prover.d.ts.map +1 -1
- package/dest/prover/server/bb_prover.js +207 -80
- package/dest/test/delay_values.js +1 -1
- package/dest/test/test_circuit_prover.d.ts +3 -3
- package/dest/test/test_circuit_prover.d.ts.map +1 -1
- package/dest/test/test_circuit_prover.js +2 -2
- package/dest/verification_key/verification_key_data.js +1 -1
- package/dest/verifier/batch_chonk_verifier.d.ts +56 -0
- package/dest/verifier/batch_chonk_verifier.d.ts.map +1 -0
- package/dest/verifier/batch_chonk_verifier.js +384 -0
- package/dest/verifier/bb_verifier.d.ts +4 -1
- package/dest/verifier/bb_verifier.d.ts.map +1 -1
- package/dest/verifier/bb_verifier.js +134 -45
- package/dest/verifier/index.d.ts +2 -1
- package/dest/verifier/index.d.ts.map +1 -1
- package/dest/verifier/index.js +1 -0
- package/dest/verifier/queued_chonk_verifier.d.ts +2 -3
- package/dest/verifier/queued_chonk_verifier.d.ts.map +1 -1
- package/dest/verifier/queued_chonk_verifier.js +8 -7
- package/package.json +19 -17
- package/src/avm_proving_tests/avm_proving_tester.ts +85 -126
- package/src/bb/bb_js_backend.ts +435 -0
- package/src/bb/bb_js_debug.ts +227 -0
- package/src/bb/file_names.ts +6 -0
- package/src/config.ts +16 -0
- package/src/index.ts +2 -1
- package/src/instrumentation.ts +12 -4
- package/src/prover/client/bb_private_kernel_prover.ts +242 -21
- package/src/prover/proof_utils.ts +41 -1
- package/src/prover/server/bb_prover.ts +127 -141
- package/src/test/delay_values.ts +1 -1
- package/src/test/test_circuit_prover.ts +3 -5
- package/src/verification_key/verification_key_data.ts +1 -1
- package/src/verifier/batch_chonk_verifier.ts +415 -0
- package/src/verifier/bb_verifier.ts +66 -76
- package/src/verifier/index.ts +1 -0
- package/src/verifier/queued_chonk_verifier.ts +8 -8
- package/dest/bb/execute.d.ts +0 -107
- package/dest/bb/execute.d.ts.map +0 -1
- package/dest/bb/execute.js +0 -647
- package/src/bb/execute.ts +0 -678
|
@@ -1,3 +1,68 @@
|
|
|
1
|
+
function _ts_add_disposable_resource(env, value, async) {
|
|
2
|
+
if (value !== null && value !== void 0) {
|
|
3
|
+
if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
|
|
4
|
+
var dispose, inner;
|
|
5
|
+
if (async) {
|
|
6
|
+
if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
|
|
7
|
+
dispose = value[Symbol.asyncDispose];
|
|
8
|
+
}
|
|
9
|
+
if (dispose === void 0) {
|
|
10
|
+
if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
|
|
11
|
+
dispose = value[Symbol.dispose];
|
|
12
|
+
if (async) inner = dispose;
|
|
13
|
+
}
|
|
14
|
+
if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
|
|
15
|
+
if (inner) dispose = function() {
|
|
16
|
+
try {
|
|
17
|
+
inner.call(this);
|
|
18
|
+
} catch (e) {
|
|
19
|
+
return Promise.reject(e);
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
env.stack.push({
|
|
23
|
+
value: value,
|
|
24
|
+
dispose: dispose,
|
|
25
|
+
async: async
|
|
26
|
+
});
|
|
27
|
+
} else if (async) {
|
|
28
|
+
env.stack.push({
|
|
29
|
+
async: true
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
return value;
|
|
33
|
+
}
|
|
34
|
+
function _ts_dispose_resources(env) {
|
|
35
|
+
var _SuppressedError = typeof SuppressedError === "function" ? SuppressedError : function(error, suppressed, message) {
|
|
36
|
+
var e = new Error(message);
|
|
37
|
+
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
|
|
38
|
+
};
|
|
39
|
+
return (_ts_dispose_resources = function _ts_dispose_resources(env) {
|
|
40
|
+
function fail(e) {
|
|
41
|
+
env.error = env.hasError ? new _SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;
|
|
42
|
+
env.hasError = true;
|
|
43
|
+
}
|
|
44
|
+
var r, s = 0;
|
|
45
|
+
function next() {
|
|
46
|
+
while(r = env.stack.pop()){
|
|
47
|
+
try {
|
|
48
|
+
if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);
|
|
49
|
+
if (r.dispose) {
|
|
50
|
+
var result = r.dispose.call(r.value);
|
|
51
|
+
if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) {
|
|
52
|
+
fail(e);
|
|
53
|
+
return next();
|
|
54
|
+
});
|
|
55
|
+
} else s |= 1;
|
|
56
|
+
} catch (e) {
|
|
57
|
+
fail(e);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();
|
|
61
|
+
if (env.hasError) throw env.error;
|
|
62
|
+
}
|
|
63
|
+
return next();
|
|
64
|
+
})(env);
|
|
65
|
+
}
|
|
1
66
|
function applyDecs2203RFactory() {
|
|
2
67
|
function createAddInitializerMethod(initializers, decoratorFinishedRef) {
|
|
3
68
|
return function addInitializer(initializer) {
|
|
@@ -371,11 +436,10 @@ function _apply_decs_2203_r(targetClass, memberDecs, classDecs, parentClass) {
|
|
|
371
436
|
return (_apply_decs_2203_r = applyDecs2203RFactory())(targetClass, memberDecs, classDecs, parentClass);
|
|
372
437
|
}
|
|
373
438
|
var _dec, _dec1, _dec2, _initProto;
|
|
374
|
-
import {
|
|
439
|
+
import { AVM_V2_PROOF_LENGTH_IN_FIELDS, NESTED_RECURSIVE_PROOF_LENGTH, NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH, PAIRING_POINTS_SIZE, RECURSIVE_PROOF_LENGTH, ULTRA_KECCAK_PROOF_LENGTH } from '@aztec/constants';
|
|
375
440
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
376
441
|
import { runInDirectory } from '@aztec/foundation/fs';
|
|
377
442
|
import { createLogger } from '@aztec/foundation/log';
|
|
378
|
-
import { BufferReader } from '@aztec/foundation/serialize';
|
|
379
443
|
import { convertBlockMergeRollupOutputsFromWitnessMap, convertBlockMergeRollupPrivateInputsToWitnessMap, convertBlockRootEmptyTxFirstRollupOutputsFromWitnessMap, convertBlockRootEmptyTxFirstRollupPrivateInputsToWitnessMap, convertBlockRootFirstRollupOutputsFromWitnessMap, convertBlockRootFirstRollupPrivateInputsToWitnessMap, convertBlockRootRollupOutputsFromWitnessMap, convertBlockRootRollupPrivateInputsToWitnessMap, convertBlockRootSingleTxFirstRollupOutputsFromWitnessMap, convertBlockRootSingleTxFirstRollupPrivateInputsToWitnessMap, convertBlockRootSingleTxRollupOutputsFromWitnessMap, convertBlockRootSingleTxRollupPrivateInputsToWitnessMap, convertCheckpointMergeRollupOutputsFromWitnessMap, convertCheckpointMergeRollupPrivateInputsToWitnessMap, convertCheckpointPaddingRollupOutputsFromWitnessMap, convertCheckpointPaddingRollupPrivateInputsToWitnessMap, convertCheckpointRootRollupOutputsFromWitnessMap, convertCheckpointRootRollupPrivateInputsToWitnessMap, convertCheckpointRootSingleBlockRollupOutputsFromWitnessMap, convertCheckpointRootSingleBlockRollupPrivateInputsToWitnessMap, convertParityBaseOutputsFromWitnessMap, convertParityBasePrivateInputsToWitnessMap, convertParityRootOutputsFromWitnessMap, convertParityRootPrivateInputsToWitnessMap, convertPrivateTxBaseRollupOutputsFromWitnessMap, convertPrivateTxBaseRollupPrivateInputsToWitnessMap, convertPublicChonkVerifierOutputsFromWitnessMap, convertPublicChonkVerifierPrivateInputsToWitnessMap, convertPublicTxBaseRollupOutputsFromWitnessMap, convertPublicTxBaseRollupPrivateInputsToWitnessMap, convertRootRollupOutputsFromWitnessMap, convertRootRollupPrivateInputsToWitnessMap, convertTxMergeRollupOutputsFromWitnessMap, convertTxMergeRollupPrivateInputsToWitnessMap, getServerCircuitArtifact } from '@aztec/noir-protocol-circuits-types/server';
|
|
380
444
|
import { ServerCircuitVks } from '@aztec/noir-protocol-circuits-types/server/vks';
|
|
381
445
|
import { mapProtocolArtifactNameToCircuitName } from '@aztec/noir-protocol-circuits-types/types';
|
|
@@ -385,11 +449,12 @@ import { makePublicInputsAndRecursiveProof } from '@aztec/stdlib/interfaces/serv
|
|
|
385
449
|
import { Proof, RecursiveProof, makeRecursiveProofFromBinary } from '@aztec/stdlib/proofs';
|
|
386
450
|
import { Attributes, getTelemetryClient, trackSpan } from '@aztec/telemetry-client';
|
|
387
451
|
import { promises as fs } from 'fs';
|
|
452
|
+
import { ungzip } from 'pako';
|
|
388
453
|
import * as path from 'path';
|
|
389
|
-
import {
|
|
454
|
+
import { BBJsFactory } from '../../bb/bb_js_backend.js';
|
|
390
455
|
import { getUltraHonkFlavorForCircuit } from '../../honk.js';
|
|
391
456
|
import { ProverInstrumentation } from '../../instrumentation.js';
|
|
392
|
-
import {
|
|
457
|
+
import { constructRecursiveProofFromBuffers } from '../proof_utils.js';
|
|
393
458
|
const logger = createLogger('bb-prover');
|
|
394
459
|
_dec = trackSpan('BBNativeRollupProver.getBaseParityProof', {
|
|
395
460
|
[Attributes.PROTOCOL_CIRCUIT_NAME]: 'parity-base'
|
|
@@ -422,10 +487,15 @@ _dec = trackSpan('BBNativeRollupProver.getBaseParityProof', {
|
|
|
422
487
|
], []));
|
|
423
488
|
}
|
|
424
489
|
instrumentation;
|
|
490
|
+
bbJsFactory;
|
|
425
491
|
constructor(config, telemetry){
|
|
426
492
|
this.config = config;
|
|
427
493
|
_initProto(this);
|
|
428
494
|
this.instrumentation = new ProverInstrumentation(telemetry, 'BBNativeRollupProver');
|
|
495
|
+
this.bbJsFactory = new BBJsFactory(config.bbBinaryPath, {
|
|
496
|
+
logger,
|
|
497
|
+
debugDir: config.bbDebugOutputDir
|
|
498
|
+
});
|
|
429
499
|
}
|
|
430
500
|
get tracer() {
|
|
431
501
|
return this.instrumentation.tracer;
|
|
@@ -439,7 +509,7 @@ _dec = trackSpan('BBNativeRollupProver.getBaseParityProof', {
|
|
|
439
509
|
await fs.mkdir(config.bbWorkingDirectory, {
|
|
440
510
|
recursive: true
|
|
441
511
|
});
|
|
442
|
-
logger.info(`Using
|
|
512
|
+
logger.info(`Using bb.js API with binary at ${config.bbBinaryPath}`);
|
|
443
513
|
logger.info(`Using native ACVM at ${config.acvmBinaryPath} and working directory ${config.acvmWorkingDirectory}`);
|
|
444
514
|
return new BBNativeRollupProver(config, telemetry);
|
|
445
515
|
}
|
|
@@ -545,15 +615,14 @@ _dec = trackSpan('BBNativeRollupProver.getBaseParityProof', {
|
|
|
545
615
|
return makePublicInputsAndRecursiveProof(circuitOutput, proof, verificationKey);
|
|
546
616
|
}
|
|
547
617
|
async generateProofWithBB(input, circuitType, convertInput, convertOutput, workingDirectory) {
|
|
548
|
-
// Have the ACVM write the partial witness here
|
|
618
|
+
// Have the ACVM write the partial witness here (still needs a temp directory)
|
|
549
619
|
const outputWitnessFile = path.join(workingDirectory, 'partial-witness.gz');
|
|
550
620
|
// Generate the partial witness using the ACVM
|
|
551
|
-
|
|
552
|
-
const simulator = new NativeACVMSimulator(this.config.acvmWorkingDirectory, this.config.acvmBinaryPath, outputWitnessFile);
|
|
621
|
+
const simulator = new NativeACVMSimulator(this.config.acvmWorkingDirectory, this.config.acvmBinaryPath, outputWitnessFile, logger);
|
|
553
622
|
const artifact = getServerCircuitArtifact(circuitType);
|
|
554
623
|
logger.debug(`Generating witness data for ${circuitType}`);
|
|
555
624
|
const inputWitness = convertInput(input);
|
|
556
|
-
const foreignCallHandler = undefined;
|
|
625
|
+
const foreignCallHandler = undefined;
|
|
557
626
|
const witnessResult = await simulator.executeProtocolCircuit(inputWitness, artifact, foreignCallHandler);
|
|
558
627
|
const output = convertOutput(witnessResult.witness);
|
|
559
628
|
const circuitName = mapProtocolArtifactNameToCircuitName(circuitType);
|
|
@@ -567,49 +636,80 @@ _dec = trackSpan('BBNativeRollupProver.getBaseParityProof', {
|
|
|
567
636
|
outputSize: output.toBuffer().length,
|
|
568
637
|
eventName: 'circuit-witness-generation'
|
|
569
638
|
});
|
|
570
|
-
//
|
|
571
|
-
|
|
572
|
-
const
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
639
|
+
// Read and decompress the witness for bb.js
|
|
640
|
+
const witnessGz = await fs.readFile(outputWitnessFile);
|
|
641
|
+
const witness = ungzip(witnessGz);
|
|
642
|
+
// Decompress bytecode for bb.js
|
|
643
|
+
const bytecode = ungzip(Buffer.from(artifact.bytecode, 'base64'));
|
|
644
|
+
// Prove the circuit via bb.js API
|
|
645
|
+
logger.debug(`Proving ${circuitType} via bb.js...`);
|
|
646
|
+
let proofResult;
|
|
647
|
+
try {
|
|
648
|
+
const env = {
|
|
649
|
+
stack: [],
|
|
650
|
+
error: void 0,
|
|
651
|
+
hasError: false
|
|
652
|
+
};
|
|
653
|
+
try {
|
|
654
|
+
const instance = _ts_add_disposable_resource(env, await this.bbJsFactory.getInstance(), true);
|
|
655
|
+
proofResult = await instance.generateProof(circuitType, bytecode, this.getVerificationKeyDataForCircuit(circuitType).keyAsBytes, witness, getUltraHonkFlavorForCircuit(circuitType));
|
|
656
|
+
} catch (e) {
|
|
657
|
+
env.error = e;
|
|
658
|
+
env.hasError = true;
|
|
659
|
+
} finally{
|
|
660
|
+
const result = _ts_dispose_resources(env);
|
|
661
|
+
if (result) await result;
|
|
662
|
+
}
|
|
663
|
+
} catch (error) {
|
|
664
|
+
throw new ProvingError(`Failed to generate proof for ${circuitType}: ${error}`);
|
|
576
665
|
}
|
|
577
666
|
return {
|
|
578
667
|
circuitOutput: output,
|
|
579
|
-
|
|
668
|
+
proofResult
|
|
580
669
|
};
|
|
581
670
|
}
|
|
582
|
-
async generateAvmProofWithBB(input, workingDirectory) {
|
|
583
|
-
logger.info(`Proving avm-circuit for TX ${input.hints.tx.hash}...`);
|
|
584
|
-
const provingResult = await generateAvmProof(this.config.bbBinaryPath, workingDirectory, input, logger);
|
|
585
|
-
if (provingResult.status === BB_RESULT.FAILURE) {
|
|
586
|
-
logger.error(`Failed to generate AVM proof for TX ${input.hints.tx.hash}: ${provingResult.reason}`);
|
|
587
|
-
throw new ProvingError(provingResult.reason, provingResult, provingResult.retry);
|
|
588
|
-
}
|
|
589
|
-
return provingResult;
|
|
590
|
-
}
|
|
591
671
|
async createAvmProof(input) {
|
|
592
|
-
const
|
|
593
|
-
|
|
594
|
-
|
|
672
|
+
const env = {
|
|
673
|
+
stack: [],
|
|
674
|
+
error: void 0,
|
|
675
|
+
hasError: false
|
|
676
|
+
};
|
|
677
|
+
try {
|
|
678
|
+
logger.info(`Proving avm-circuit for TX ${input.hints.tx.hash}...`);
|
|
679
|
+
const inputsBuffer = input.serializeWithMessagePack();
|
|
680
|
+
const instance = _ts_add_disposable_resource(env, await this.bbJsFactory.getInstance(), true);
|
|
681
|
+
const { proof: proofFieldArrays, durationMs } = await instance.generateAvmProof(inputsBuffer);
|
|
682
|
+
// Convert Uint8Array[] (32-byte field elements) to Fr[]
|
|
683
|
+
const proofFields = proofFieldArrays.map((f)=>Fr.fromBuffer(Buffer.from(f)));
|
|
684
|
+
if (proofFields.length !== AVM_V2_PROOF_LENGTH_IN_FIELDS) {
|
|
685
|
+
throw new Error(`Proof has ${proofFields.length} fields, expected exactly ${AVM_V2_PROOF_LENGTH_IN_FIELDS}.`);
|
|
686
|
+
}
|
|
687
|
+
// Build the binary proof from the raw field data
|
|
688
|
+
const rawProofBuffer = Buffer.concat(proofFieldArrays.map((f)=>Buffer.from(f)));
|
|
689
|
+
const binaryProof = new Proof(rawProofBuffer, /*numPublicInputs=*/ 0);
|
|
690
|
+
const avmProof = new RecursiveProof(proofFields, binaryProof, true, AVM_V2_PROOF_LENGTH_IN_FIELDS);
|
|
595
691
|
const circuitType = 'avm-circuit';
|
|
596
692
|
const appCircuitName = 'unknown';
|
|
597
|
-
this.instrumentation.recordAvmDuration('provingDuration', appCircuitName,
|
|
693
|
+
this.instrumentation.recordAvmDuration('provingDuration', appCircuitName, durationMs);
|
|
598
694
|
this.instrumentation.recordAvmSize('proofSize', appCircuitName, avmProof.binaryProof.buffer.length);
|
|
599
|
-
logger.info(`Generated proof for ${circuitType}(${input.hints.tx.hash}) in ${Math.ceil(
|
|
695
|
+
logger.info(`Generated proof for ${circuitType}(${input.hints.tx.hash}) in ${Math.ceil(durationMs)} ms`, {
|
|
600
696
|
circuitName: circuitType,
|
|
601
697
|
appCircuitName: input.hints.tx.hash,
|
|
602
|
-
|
|
603
|
-
duration: provingResult.durationMs,
|
|
698
|
+
duration: durationMs,
|
|
604
699
|
proofSize: avmProof.binaryProof.buffer.length,
|
|
605
700
|
eventName: 'circuit-proving',
|
|
606
|
-
inputSize:
|
|
701
|
+
inputSize: inputsBuffer.length,
|
|
607
702
|
circuitSize: 1 << 21,
|
|
608
703
|
numPublicInputs: 0
|
|
609
704
|
});
|
|
610
705
|
return avmProof;
|
|
611
|
-
}
|
|
612
|
-
|
|
706
|
+
} catch (e) {
|
|
707
|
+
env.error = e;
|
|
708
|
+
env.hasError = true;
|
|
709
|
+
} finally{
|
|
710
|
+
const result = _ts_dispose_resources(env);
|
|
711
|
+
if (result) await result;
|
|
712
|
+
}
|
|
613
713
|
}
|
|
614
714
|
/**
|
|
615
715
|
* Executes a circuit and returns its outputs and corresponding proof with embedded aggregation object
|
|
@@ -620,21 +720,21 @@ _dec = trackSpan('BBNativeRollupProver.getBaseParityProof', {
|
|
|
620
720
|
* @param convertOutput - Function for parsing the output witness to it's corresponding object
|
|
621
721
|
* @returns The circuits output object and it's proof
|
|
622
722
|
*/ async createRecursiveProof(input, circuitType, proofLength, convertInput, convertOutput) {
|
|
623
|
-
//
|
|
624
|
-
const operation = async (
|
|
625
|
-
const {
|
|
723
|
+
// Still need runInDirectory for ACVM witness generation temp files
|
|
724
|
+
const operation = async (workingDirectory)=>{
|
|
725
|
+
const { proofResult, circuitOutput: output } = await this.generateProofWithBB(input, circuitType, convertInput, convertOutput, workingDirectory);
|
|
626
726
|
const vkData = this.getVerificationKeyDataForCircuit(circuitType);
|
|
627
|
-
//
|
|
628
|
-
const proof =
|
|
727
|
+
// Construct proof from in-memory buffers (no file I/O needed)
|
|
728
|
+
const proof = constructRecursiveProofFromBuffers(proofResult.proofFields, proofResult.publicInputFields, vkData, proofLength);
|
|
629
729
|
const circuitName = mapProtocolArtifactNameToCircuitName(circuitType);
|
|
630
|
-
this.instrumentation.recordDuration('provingDuration', circuitName,
|
|
730
|
+
this.instrumentation.recordDuration('provingDuration', circuitName, proofResult.durationMs);
|
|
631
731
|
this.instrumentation.recordSize('proofSize', circuitName, proof.binaryProof.buffer.length);
|
|
632
732
|
this.instrumentation.recordSize('circuitPublicInputCount', circuitName, vkData.numPublicInputs);
|
|
633
733
|
this.instrumentation.recordSize('circuitSize', circuitName, vkData.circuitSize);
|
|
634
|
-
logger.info(`Generated proof for ${circuitType} in ${Math.ceil(
|
|
734
|
+
logger.info(`Generated proof for ${circuitType} in ${Math.ceil(proofResult.durationMs)} ms, size: ${proof.proof.length} fields`, {
|
|
635
735
|
circuitName,
|
|
636
736
|
circuitSize: vkData.circuitSize,
|
|
637
|
-
duration:
|
|
737
|
+
duration: proofResult.durationMs,
|
|
638
738
|
inputSize: output.toBuffer().length,
|
|
639
739
|
proofSize: proof.binaryProof.buffer.length,
|
|
640
740
|
eventName: 'circuit-proving',
|
|
@@ -648,35 +748,69 @@ _dec = trackSpan('BBNativeRollupProver.getBaseParityProof', {
|
|
|
648
748
|
return await this.runInDirectory(operation);
|
|
649
749
|
}
|
|
650
750
|
/**
|
|
651
|
-
* Verifies a proof
|
|
751
|
+
* Verifies a proof via bb.js API (no temp files needed).
|
|
652
752
|
* @param circuitType - The type of circuit whose proof is to be verified
|
|
653
753
|
* @param proof - The proof to be verified
|
|
654
754
|
*/ async verifyProof(circuitType, proof) {
|
|
655
755
|
const verificationKey = this.getVerificationKeyDataForCircuit(circuitType);
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
const
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
await
|
|
671
|
-
}
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
756
|
+
const flavor = getUltraHonkFlavorForCircuit(circuitType);
|
|
757
|
+
// Split proof buffer into public input fields and proof fields (32-byte each)
|
|
758
|
+
const publicInputFields = splitBufferToFieldArrays(proof.buffer.subarray(0, proof.numPublicInputs * 32));
|
|
759
|
+
const proofFields = splitBufferToFieldArrays(proof.buffer.subarray(proof.numPublicInputs * 32));
|
|
760
|
+
let verified;
|
|
761
|
+
let durationMs;
|
|
762
|
+
try {
|
|
763
|
+
const env = {
|
|
764
|
+
stack: [],
|
|
765
|
+
error: void 0,
|
|
766
|
+
hasError: false
|
|
767
|
+
};
|
|
768
|
+
try {
|
|
769
|
+
const instance = _ts_add_disposable_resource(env, await this.bbJsFactory.getInstance(), true);
|
|
770
|
+
({ verified, durationMs } = await instance.verifyProof(proofFields, verificationKey.keyAsBytes, publicInputFields, flavor));
|
|
771
|
+
} catch (e) {
|
|
772
|
+
env.error = e;
|
|
773
|
+
env.hasError = true;
|
|
774
|
+
} finally{
|
|
775
|
+
const result = _ts_dispose_resources(env);
|
|
776
|
+
if (result) await result;
|
|
676
777
|
}
|
|
677
|
-
|
|
778
|
+
} catch (error) {
|
|
779
|
+
throw new ProvingError(`Failed to verify proof for ${circuitType}: ${error}`);
|
|
780
|
+
}
|
|
781
|
+
if (!verified) {
|
|
782
|
+
throw new ProvingError('Failed to verify proof from key!');
|
|
783
|
+
}
|
|
784
|
+
logger.info(`Successfully verified proof from key in ${durationMs} ms`);
|
|
785
|
+
}
|
|
786
|
+
/** Verify an AVM proof via bb.js API. */ async verifyAvmProof(proof, publicInputs) {
|
|
787
|
+
const env = {
|
|
788
|
+
stack: [],
|
|
789
|
+
error: void 0,
|
|
790
|
+
hasError: false
|
|
678
791
|
};
|
|
679
|
-
|
|
792
|
+
try {
|
|
793
|
+
// For AVM proofs, numPublicInputs is 0, so the full buffer is the proof.
|
|
794
|
+
const proofBuffer = proof.buffer.subarray(proof.numPublicInputs * 32);
|
|
795
|
+
// Split the raw proof buffer into 32-byte field element arrays
|
|
796
|
+
const proofFields = [];
|
|
797
|
+
for(let i = 0; i < proofBuffer.length; i += Fr.SIZE_IN_BYTES){
|
|
798
|
+
proofFields.push(new Uint8Array(proofBuffer.subarray(i, i + Fr.SIZE_IN_BYTES)));
|
|
799
|
+
}
|
|
800
|
+
const piBuffer = publicInputs.serializeWithMessagePack();
|
|
801
|
+
const instance = _ts_add_disposable_resource(env, await this.bbJsFactory.getInstance(), true);
|
|
802
|
+
const { verified, durationMs } = await instance.verifyAvmProof(proofFields, piBuffer);
|
|
803
|
+
if (!verified) {
|
|
804
|
+
throw new ProvingError('Failed to verify AVM proof!');
|
|
805
|
+
}
|
|
806
|
+
logger.info(`Successfully verified AVM proof in ${durationMs} ms`);
|
|
807
|
+
} catch (e) {
|
|
808
|
+
env.error = e;
|
|
809
|
+
env.hasError = true;
|
|
810
|
+
} finally{
|
|
811
|
+
const result = _ts_dispose_resources(env);
|
|
812
|
+
if (result) await result;
|
|
813
|
+
}
|
|
680
814
|
}
|
|
681
815
|
/**
|
|
682
816
|
* Returns the verification key data for a circuit.
|
|
@@ -689,20 +823,6 @@ _dec = trackSpan('BBNativeRollupProver.getBaseParityProof', {
|
|
|
689
823
|
}
|
|
690
824
|
return vk;
|
|
691
825
|
}
|
|
692
|
-
async readAvmProofAsFields(proofFilename) {
|
|
693
|
-
const rawProofBuffer = await fs.readFile(proofFilename);
|
|
694
|
-
const reader = BufferReader.asReader(rawProofBuffer);
|
|
695
|
-
const proofFields = reader.readArray(rawProofBuffer.length / Fr.SIZE_IN_BYTES, Fr);
|
|
696
|
-
// We extend to a fixed-size padded proof as during development any new AVM circuit column changes the
|
|
697
|
-
// proof length and we do not have a mechanism to feedback a cpp constant to noir/TS.
|
|
698
|
-
// TODO(#13390): Revive a non-padded AVM proof
|
|
699
|
-
if (proofFields.length > AVM_V2_PROOF_LENGTH_IN_FIELDS_PADDED) {
|
|
700
|
-
throw new Error(`Proof has ${proofFields.length} fields, expected no more than ${AVM_V2_PROOF_LENGTH_IN_FIELDS_PADDED}.`);
|
|
701
|
-
}
|
|
702
|
-
const proofFieldsPadded = proofFields.concat(Array(AVM_V2_PROOF_LENGTH_IN_FIELDS_PADDED - proofFields.length).fill(new Fr(0)));
|
|
703
|
-
const proof = new Proof(rawProofBuffer, /*numPublicInputs=*/ 0);
|
|
704
|
-
return new RecursiveProof(proofFieldsPadded, proof, true, AVM_V2_PROOF_LENGTH_IN_FIELDS_PADDED);
|
|
705
|
-
}
|
|
706
826
|
runInDirectory(fn) {
|
|
707
827
|
return runInDirectory(this.config.bbWorkingDirectory, (dir)=>fn(dir).catch((err)=>{
|
|
708
828
|
logger.error(`Error running operation at ${dir}: ${err}`);
|
|
@@ -710,3 +830,10 @@ _dec = trackSpan('BBNativeRollupProver.getBaseParityProof', {
|
|
|
710
830
|
}), this.config.bbSkipCleanup, logger);
|
|
711
831
|
}
|
|
712
832
|
}
|
|
833
|
+
/** Split a buffer into 32-byte Uint8Array field elements. */ function splitBufferToFieldArrays(buffer) {
|
|
834
|
+
const fields = [];
|
|
835
|
+
for(let i = 0; i < buffer.length; i += 32){
|
|
836
|
+
fields.push(new Uint8Array(buffer.subarray(i, i + 32)));
|
|
837
|
+
}
|
|
838
|
+
return fields;
|
|
839
|
+
}
|
|
@@ -32,7 +32,7 @@ export const PROOF_DELAY_MS = {
|
|
|
32
32
|
[ProvingRequestType.ROOT_ROLLUP]: 93_000,
|
|
33
33
|
[ProvingRequestType.TX_MERGE_ROLLUP]: 10_000,
|
|
34
34
|
[ProvingRequestType.PUBLIC_TX_BASE_ROLLUP]: 44_500,
|
|
35
|
-
[ProvingRequestType.PUBLIC_VM]:
|
|
35
|
+
[ProvingRequestType.PUBLIC_VM]: 180_000,
|
|
36
36
|
// TBD
|
|
37
37
|
[ProvingRequestType.BLOCK_MERGE_ROLLUP]: 15_000,
|
|
38
38
|
[ProvingRequestType.BLOCK_ROOT_ROLLUP]: 35_000,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { AVM_V2_PROOF_LENGTH_IN_FIELDS, NESTED_RECURSIVE_PROOF_LENGTH, NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH, RECURSIVE_PROOF_LENGTH } from '@aztec/constants';
|
|
2
2
|
import { type ServerProtocolArtifact } from '@aztec/noir-protocol-circuits-types/server';
|
|
3
3
|
import { type CircuitSimulator } from '@aztec/simulator/server';
|
|
4
4
|
import type { AvmCircuitInputs } from '@aztec/stdlib/avm';
|
|
@@ -63,10 +63,10 @@ export declare class TestCircuitProver implements ServerCircuitProver {
|
|
|
63
63
|
* @returns The public inputs as outputs of the simulation.
|
|
64
64
|
*/
|
|
65
65
|
getRootRollupProof(input: RootRollupPrivateInputs): Promise<PublicInputsAndRecursiveProof<RootRollupPublicInputs>>;
|
|
66
|
-
getAvmProof(_inputs: AvmCircuitInputs): Promise<RecursiveProof<typeof
|
|
66
|
+
getAvmProof(_inputs: AvmCircuitInputs): Promise<RecursiveProof<typeof AVM_V2_PROOF_LENGTH_IN_FIELDS>>;
|
|
67
67
|
private applyDelay;
|
|
68
68
|
verifyProof(_1: ServerProtocolArtifact, _2: Proof): Promise<void>;
|
|
69
69
|
private simulate;
|
|
70
70
|
}
|
|
71
71
|
export {};
|
|
72
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
72
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdF9jaXJjdWl0X3Byb3Zlci5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Rlc3QvdGVzdF9jaXJjdWl0X3Byb3Zlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsNkJBQTZCLEVBQzdCLDZCQUE2QixFQUM3Qix5Q0FBeUMsRUFDekMsc0JBQXNCLEVBQ3ZCLE1BQU0sa0JBQWtCLENBQUM7QUFJMUIsT0FBTyxFQUNMLEtBQUssc0JBQXNCLEVBbUM1QixNQUFNLDRDQUE0QyxDQUFDO0FBSXBELE9BQU8sRUFBRSxLQUFLLGdCQUFnQixFQUFzRCxNQUFNLHlCQUF5QixDQUFDO0FBQ3BILE9BQU8sS0FBSyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDMUQsT0FBTyxFQUNMLEtBQUssNkJBQTZCLEVBQ2xDLEtBQUssbUJBQW1CLEVBRXpCLE1BQU0saUNBQWlDLENBQUM7QUFDekMsT0FBTyxLQUFLLEVBQUUsdUJBQXVCLEVBQUUsa0JBQWtCLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNqSCxPQUFPLEVBQ0wsS0FBSyxLQUFLLEVBRVYsY0FBYyxFQUdmLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUNMLEtBQUssNkJBQTZCLEVBQ2xDLEtBQUssdUJBQXVCLEVBQzVCLEtBQUssd0NBQXdDLEVBQzdDLEtBQUssaUNBQWlDLEVBQ3RDLEtBQUssNEJBQTRCLEVBQ2pDLEtBQUsseUNBQXlDLEVBQzlDLEtBQUssb0NBQW9DLEVBQ3pDLEtBQUssa0NBQWtDLEVBQ3ZDLEtBQUssb0NBQW9DLEVBQ3pDLEtBQUssNEJBQTRCLEVBQ2pDLEtBQUssaUNBQWlDLEVBQ3RDLEtBQUssNENBQTRDLEVBQ2pELEtBQUssZ0NBQWdDLEVBQ3JDLEtBQUssZ0NBQWdDLEVBQ3JDLCtCQUErQixFQUMvQixLQUFLLCtCQUErQixFQUNwQyxLQUFLLHVCQUF1QixFQUM1QixLQUFLLHNC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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test_circuit_prover.d.ts","sourceRoot":"","sources":["../../src/test/test_circuit_prover.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,
|
|
1
|
+
{"version":3,"file":"test_circuit_prover.d.ts","sourceRoot":"","sources":["../../src/test/test_circuit_prover.ts"],"names":[],"mappings":"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"}
|
|
@@ -371,7 +371,7 @@ function _apply_decs_2203_r(targetClass, memberDecs, classDecs, parentClass) {
|
|
|
371
371
|
return (_apply_decs_2203_r = applyDecs2203RFactory())(targetClass, memberDecs, classDecs, parentClass);
|
|
372
372
|
}
|
|
373
373
|
var _dec, _dec1, _dec2, _dec3, _dec4, _dec5, _dec6, _dec7, _dec8, _dec9, _dec10, _dec11, _dec12, _dec13, _dec14, _dec15, _initProto;
|
|
374
|
-
import {
|
|
374
|
+
import { AVM_V2_PROOF_LENGTH_IN_FIELDS, NESTED_RECURSIVE_PROOF_LENGTH, NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH, RECURSIVE_PROOF_LENGTH } from '@aztec/constants';
|
|
375
375
|
import { createLogger } from '@aztec/foundation/log';
|
|
376
376
|
import { sleep } from '@aztec/foundation/sleep';
|
|
377
377
|
import { Timer } from '@aztec/foundation/timer';
|
|
@@ -563,7 +563,7 @@ _dec = trackSpan('TestCircuitProver.getBaseParityProof'), _dec1 = trackSpan('Tes
|
|
|
563
563
|
// We can't simulate the AVM because we don't have enough context to do so (e.g., DBs).
|
|
564
564
|
// We just return an empty proof.
|
|
565
565
|
this.logger.debug('Skipping AVM simulation in TestCircuitProver.');
|
|
566
|
-
return this.applyDelay(ProvingRequestType.PUBLIC_VM, ()=>makeEmptyRecursiveProof(
|
|
566
|
+
return this.applyDelay(ProvingRequestType.PUBLIC_VM, ()=>makeEmptyRecursiveProof(AVM_V2_PROOF_LENGTH_IN_FIELDS));
|
|
567
567
|
}
|
|
568
568
|
async applyDelay(type, fn) {
|
|
569
569
|
const timer = new Timer();
|
|
@@ -3,7 +3,7 @@ import { BufferReader } from '@aztec/foundation/serialize';
|
|
|
3
3
|
import { VerificationKeyAsFields, VerificationKeyData } from '@aztec/stdlib/vks';
|
|
4
4
|
import { promises as fs } from 'fs';
|
|
5
5
|
import * as path from 'path';
|
|
6
|
-
import { VK_FILENAME } from '../bb/
|
|
6
|
+
import { VK_FILENAME } from '../bb/file_names.js';
|
|
7
7
|
/**
|
|
8
8
|
* Reads the verification key data stored at the specified location and parses into a VerificationKeyData
|
|
9
9
|
* @param vkDirectoryPath - The directory containing the verification key data files
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import type { ClientProtocolCircuitVerifier, IVCProofVerificationResult } from '@aztec/stdlib/interfaces/server';
|
|
2
|
+
import type { Tx } from '@aztec/stdlib/tx';
|
|
3
|
+
import type { BBConfig } from '../config.js';
|
|
4
|
+
/**
|
|
5
|
+
* Batch verifier for Chonk IVC proofs. Uses the bb batch verifier service
|
|
6
|
+
* which batches IPA verification into a constant number of SRS MSMs for better throughput.
|
|
7
|
+
*
|
|
8
|
+
* Architecture:
|
|
9
|
+
* - Spawns a persistent `bb msgpack run` process via Barretenberg (native backend)
|
|
10
|
+
* - Sends proofs via the msgpack RPC protocol (ChonkBatchVerifierQueue)
|
|
11
|
+
* - Receives results via a named FIFO pipe (async, out-of-order)
|
|
12
|
+
* - Bisects batch failures to isolate individual bad proofs
|
|
13
|
+
*/
|
|
14
|
+
export declare class BatchChonkVerifier implements ClientProtocolCircuitVerifier {
|
|
15
|
+
private config;
|
|
16
|
+
private vkBuffers;
|
|
17
|
+
private batchSize;
|
|
18
|
+
private label;
|
|
19
|
+
private bb;
|
|
20
|
+
private fifoDir;
|
|
21
|
+
private fifoPath;
|
|
22
|
+
private nextRequestId;
|
|
23
|
+
private pendingRequests;
|
|
24
|
+
private sendQueue;
|
|
25
|
+
private fifoReader;
|
|
26
|
+
private logger;
|
|
27
|
+
/** Maps artifact name to VK index in the batch verifier. */
|
|
28
|
+
private vkIndexMap;
|
|
29
|
+
/** Bound cleanup handler for process exit signals. */
|
|
30
|
+
private exitCleanup;
|
|
31
|
+
private stopped;
|
|
32
|
+
private fatalError;
|
|
33
|
+
private pendingDrainedResolvers;
|
|
34
|
+
private constructor();
|
|
35
|
+
/** Create and start a BatchChonkVerifier using the protocol circuit VKs. */
|
|
36
|
+
static new(config: BBConfig, batchSize: number, label: string): Promise<BatchChonkVerifier>;
|
|
37
|
+
/** Create and start a BatchChonkVerifier with custom VKs (for testing). */
|
|
38
|
+
static newForTesting(config: Pick<BBConfig, 'bbChonkVerifyConcurrency'> & Partial<Pick<BBConfig, 'bbBinaryPath'>>, vks: Uint8Array[], batchSize: number): Promise<BatchChonkVerifier>;
|
|
39
|
+
private start;
|
|
40
|
+
verifyProof(tx: Tx): Promise<IVCProofVerificationResult>;
|
|
41
|
+
/** Enqueue raw proof fields for verification. Used directly by tests with custom VKs. */
|
|
42
|
+
enqueueProof(vkIndex: number, proofFields: Uint8Array[]): Promise<IVCProofVerificationResult>;
|
|
43
|
+
stop(): Promise<void>;
|
|
44
|
+
private withTimeout;
|
|
45
|
+
private startFifoReader;
|
|
46
|
+
private handleResult;
|
|
47
|
+
private registerExitCleanup;
|
|
48
|
+
private deregisterExitCleanup;
|
|
49
|
+
private rejectPendingRequests;
|
|
50
|
+
private failVerifier;
|
|
51
|
+
private waitForPendingRequestsToDrain;
|
|
52
|
+
private notifyPendingDrained;
|
|
53
|
+
private cleanupFifo;
|
|
54
|
+
private cleanupFifoSync;
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmF0Y2hfY2hvbmtfdmVyaWZpZXIuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy92ZXJpZmllci9iYXRjaF9jaG9ua192ZXJpZmllci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFNQSxPQUFPLEtBQUssRUFBRSw2QkFBNkIsRUFBRSwwQkFBMEIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ2pILE9BQU8sS0FBSyxFQUFFLEVBQUUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBVTNDLE9BQU8sS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQXdCN0M7Ozs7Ozs7OztHQVNHO0FBQ0gscUJBQWEsa0JBQW1CLFlBQVcsNkJBQTZCO0lBa0JwRSxPQUFPLENBQUMsTUFBTTtJQUNkLE9BQU8sQ0FBQyxTQUFTO0lBQ2pCLE9BQU8sQ0FBQyxTQUFTO0lBQ2pCLE9BQU8sQ0FBQyxLQUFLO0lBcEJmLE9BQU8sQ0FBQyxFQUFFLENBQWdCO0lBQzFCLE9BQU8sQ0FBQyxPQUFPLENBQXFCO0lBQ3BDLE9BQU8sQ0FBQyxRQUFRLENBQU07SUFDdEIsT0FBTyxDQUFDLGFBQWEsQ0FBSztJQUMxQixPQUFPLENBQUMsZUFBZSxDQUFxQztJQUM1RCxPQUFPLENBQUMsU0FBUyxDQUFjO0lBQy9CLE9BQU8sQ0FBQyxVQUFVLENBQWtCO0lBQ3BDLE9BQU8sQ0FBQyxNQUFNLENBQWtEO0lBQ2hFLDREQUE0RDtJQUM1RCxPQUFPLENBQUMsVUFBVSxDQUE2QjtJQUMvQyxzREFBc0Q7SUFDdEQsT0FBTyxDQUFDLFdBQVcsQ0FBNkI7SUFDaEQsT0FBTyxDQUFDLE9BQU8sQ0FBUztJQUN4QixPQUFPLENBQUMsVUFBVSxDQUFvQjtJQUN0QyxPQUFPLENBQUMsdUJBQXVCLENBQXlCO0lBRXhELE9BQU8sZUFTTjtJQUVELDRFQUE0RTtJQUM1RSxPQUFhLEdBQUcsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sR0FBRyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FlaEc7SUFFRCwyRUFBMkU7SUFDM0UsT0FBYSxhQUFhLENBQ3hCLE1BQU0sRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLDBCQUEwQixDQUFDLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsY0FBYyxDQUFDLENBQUMsRUFDNUYsR0FBRyxFQUFFLFVBQVUsRUFBRSxFQUNqQixTQUFTLEVBQUUsTUFBTSxHQUNoQixPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FPN0I7WUFFYSxLQUFLO0lBaUNaLFdBQVcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLE9BQU8sQ0FBQywwQkFBMEIsQ0FBQyxDQWU5RDtJQUVELHlGQUF5RjtJQUNsRixZQUFZLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLEdBQUcsT0FBTyxDQUFDLDBCQUEwQixDQUFDLENBa0RuRztJQUVZLElBQUksSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLENBK0JqQztZQU9hLFdBQVc7SUFrQnpCLE9BQU8sQ0FBQyxlQUFlO0lBNkJ2QixPQUFPLENBQUMsWUFBWTtJQTZCcEIsT0FBTyxDQUFDLG1CQUFtQjtJQU8zQixPQUFPLENBQUMscUJBQXFCO0lBTzdCLE9BQU8sQ0FBQyxxQkFBcUI7SUFTN0IsT0FBTyxDQUFDLFlBQVk7SUFPcEIsT0FBTyxDQUFDLDZCQUE2QjtJQTBCckMsT0FBTyxDQUFDLG9CQUFvQjtZQVNkLFdBQVc7SUFVekIsT0FBTyxDQUFDLGVBQWU7Q0FXeEIifQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"batch_chonk_verifier.d.ts","sourceRoot":"","sources":["../../src/verifier/batch_chonk_verifier.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,6BAA6B,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AACjH,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAU3C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAwB7C;;;;;;;;;GASG;AACH,qBAAa,kBAAmB,YAAW,6BAA6B;IAkBpE,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,KAAK;IApBf,OAAO,CAAC,EAAE,CAAgB;IAC1B,OAAO,CAAC,OAAO,CAAqB;IACpC,OAAO,CAAC,QAAQ,CAAM;IACtB,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,eAAe,CAAqC;IAC5D,OAAO,CAAC,SAAS,CAAc;IAC/B,OAAO,CAAC,UAAU,CAAkB;IACpC,OAAO,CAAC,MAAM,CAAkD;IAChE,4DAA4D;IAC5D,OAAO,CAAC,UAAU,CAA6B;IAC/C,sDAAsD;IACtD,OAAO,CAAC,WAAW,CAA6B;IAChD,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,UAAU,CAAoB;IACtC,OAAO,CAAC,uBAAuB,CAAyB;IAExD,OAAO,eASN;IAED,4EAA4E;IAC5E,OAAa,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAehG;IAED,2EAA2E;IAC3E,OAAa,aAAa,CACxB,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,0BAA0B,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC,EAC5F,GAAG,EAAE,UAAU,EAAE,EACjB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,kBAAkB,CAAC,CAO7B;YAEa,KAAK;IAiCZ,WAAW,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,0BAA0B,CAAC,CAe9D;IAED,yFAAyF;IAClF,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,0BAA0B,CAAC,CAkDnG;IAEY,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CA+BjC;YAOa,WAAW;IAkBzB,OAAO,CAAC,eAAe;IA6BvB,OAAO,CAAC,YAAY;IA6BpB,OAAO,CAAC,mBAAmB;IAO3B,OAAO,CAAC,qBAAqB;IAO7B,OAAO,CAAC,qBAAqB;IAS7B,OAAO,CAAC,YAAY;IAOpB,OAAO,CAAC,6BAA6B;IA0BrC,OAAO,CAAC,oBAAoB;YASd,WAAW;IAUzB,OAAO,CAAC,eAAe;CAWxB"}
|