@aztec/bb-prover 0.40.1 → 0.42.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/dest/bb/cli.d.ts.map +1 -1
- package/dest/bb/cli.js +24 -2
- package/dest/bb/execute.d.ts +37 -2
- package/dest/bb/execute.d.ts.map +1 -1
- package/dest/bb/execute.js +276 -75
- package/dest/config.d.ts +9 -0
- package/dest/config.d.ts.map +1 -0
- package/dest/config.js +2 -0
- package/dest/index.d.ts +2 -0
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +3 -1
- package/dest/mappings/mappings.d.ts +1 -0
- package/dest/mappings/mappings.d.ts.map +1 -1
- package/dest/mappings/mappings.js +27 -8
- package/dest/prover/bb_native_proof_creator.d.ts +4 -9
- package/dest/prover/bb_native_proof_creator.d.ts.map +1 -1
- package/dest/prover/bb_native_proof_creator.js +77 -101
- package/dest/prover/bb_prover.d.ts +35 -23
- package/dest/prover/bb_prover.d.ts.map +1 -1
- package/dest/prover/bb_prover.js +247 -155
- package/dest/stats.d.ts +2 -5
- package/dest/stats.d.ts.map +1 -1
- package/dest/stats.js +27 -26
- package/dest/test/index.d.ts +1 -0
- package/dest/test/index.d.ts.map +1 -1
- package/dest/test/index.js +2 -1
- package/dest/test/test_circuit_prover.d.ts +9 -7
- package/dest/test/test_circuit_prover.d.ts.map +1 -1
- package/dest/test/test_circuit_prover.js +31 -15
- package/dest/test/test_verifier.d.ts +7 -0
- package/dest/test/test_verifier.d.ts.map +1 -0
- package/dest/test/test_verifier.js +10 -0
- package/dest/verification_key/verification_key_data.d.ts +8 -0
- package/dest/verification_key/verification_key_data.d.ts.map +1 -0
- package/dest/verification_key/verification_key_data.js +24 -0
- package/dest/verifier/bb_verifier.d.ts +18 -0
- package/dest/verifier/bb_verifier.d.ts.map +1 -0
- package/dest/verifier/bb_verifier.js +90 -0
- package/dest/verifier/index.d.ts +2 -0
- package/dest/verifier/index.d.ts.map +1 -0
- package/dest/verifier/index.js +2 -0
- package/package.json +6 -6
- package/src/bb/cli.ts +36 -1
- package/src/bb/execute.ts +371 -83
- package/src/config.ts +9 -0
- package/src/index.ts +2 -0
- package/src/mappings/mappings.ts +38 -12
- package/src/prover/bb_native_proof_creator.ts +139 -119
- package/src/prover/bb_prover.ts +454 -242
- package/src/stats.ts +30 -45
- package/src/test/index.ts +1 -0
- package/src/test/test_circuit_prover.ts +84 -21
- package/src/test/test_verifier.ts +12 -0
- package/src/verification_key/verification_key_data.ts +35 -0
- package/src/verifier/bb_verifier.ts +156 -0
- package/src/verifier/index.ts +1 -0
- package/dest/prover/verification_key_data.d.ts +0 -16
- package/dest/prover/verification_key_data.d.ts.map +0 -1
- package/dest/prover/verification_key_data.js +0 -5
- package/src/prover/verification_key_data.ts +0 -16
|
@@ -1,22 +1,41 @@
|
|
|
1
1
|
import { PublicKernelType } from '@aztec/circuit-types';
|
|
2
|
-
import {
|
|
2
|
+
import { convertPublicInnerInputsToWitnessMap, convertPublicInnerOutputFromWitnessMap, convertPublicSetupInputsToWitnessMap, convertPublicSetupOutputFromWitnessMap, convertPublicTeardownInputsToWitnessMap, convertPublicTeardownOutputFromWitnessMap, convertSimulatedPublicInnerInputsToWitnessMap, convertSimulatedPublicInnerOutputFromWitnessMap, convertSimulatedPublicSetupInputsToWitnessMap, convertSimulatedPublicSetupOutputFromWitnessMap, convertSimulatedPublicTeardownInputsToWitnessMap, convertSimulatedPublicTeardownOutputFromWitnessMap, } from '@aztec/noir-protocol-circuits-types';
|
|
3
|
+
export const SimulatedPublicKernelArtifactMapping = {
|
|
4
|
+
[PublicKernelType.NON_PUBLIC]: undefined,
|
|
5
|
+
[PublicKernelType.APP_LOGIC]: {
|
|
6
|
+
artifact: 'PublicKernelAppLogicArtifact',
|
|
7
|
+
convertInputs: convertSimulatedPublicInnerInputsToWitnessMap,
|
|
8
|
+
convertOutputs: convertSimulatedPublicInnerOutputFromWitnessMap,
|
|
9
|
+
},
|
|
10
|
+
[PublicKernelType.SETUP]: {
|
|
11
|
+
artifact: 'PublicKernelSetupArtifact',
|
|
12
|
+
convertInputs: convertSimulatedPublicSetupInputsToWitnessMap,
|
|
13
|
+
convertOutputs: convertSimulatedPublicSetupOutputFromWitnessMap,
|
|
14
|
+
},
|
|
15
|
+
[PublicKernelType.TEARDOWN]: {
|
|
16
|
+
artifact: 'PublicKernelTeardownArtifact',
|
|
17
|
+
convertInputs: convertSimulatedPublicTeardownInputsToWitnessMap,
|
|
18
|
+
convertOutputs: convertSimulatedPublicTeardownOutputFromWitnessMap,
|
|
19
|
+
},
|
|
20
|
+
[PublicKernelType.TAIL]: undefined,
|
|
21
|
+
};
|
|
3
22
|
export const PublicKernelArtifactMapping = {
|
|
4
23
|
[PublicKernelType.NON_PUBLIC]: undefined,
|
|
5
24
|
[PublicKernelType.APP_LOGIC]: {
|
|
6
25
|
artifact: 'PublicKernelAppLogicArtifact',
|
|
7
|
-
convertInputs:
|
|
8
|
-
convertOutputs:
|
|
26
|
+
convertInputs: convertPublicInnerInputsToWitnessMap,
|
|
27
|
+
convertOutputs: convertPublicInnerOutputFromWitnessMap,
|
|
9
28
|
},
|
|
10
29
|
[PublicKernelType.SETUP]: {
|
|
11
30
|
artifact: 'PublicKernelSetupArtifact',
|
|
12
|
-
convertInputs:
|
|
13
|
-
convertOutputs:
|
|
31
|
+
convertInputs: convertPublicSetupInputsToWitnessMap,
|
|
32
|
+
convertOutputs: convertPublicSetupOutputFromWitnessMap,
|
|
14
33
|
},
|
|
15
34
|
[PublicKernelType.TEARDOWN]: {
|
|
16
35
|
artifact: 'PublicKernelTeardownArtifact',
|
|
17
|
-
convertInputs:
|
|
18
|
-
convertOutputs:
|
|
36
|
+
convertInputs: convertPublicTeardownInputsToWitnessMap,
|
|
37
|
+
convertOutputs: convertPublicTeardownOutputFromWitnessMap,
|
|
19
38
|
},
|
|
20
39
|
[PublicKernelType.TAIL]: undefined,
|
|
21
40
|
};
|
|
22
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
41
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFwcGluZ3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbWFwcGluZ3MvbWFwcGluZ3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFeEQsT0FBTyxFQUVMLG9DQUFvQyxFQUNwQyxzQ0FBc0MsRUFDdEMsb0NBQW9DLEVBQ3BDLHNDQUFzQyxFQUN0Qyx1Q0FBdUMsRUFDdkMseUNBQXlDLEVBQ3pDLDZDQUE2QyxFQUM3QywrQ0FBK0MsRUFDL0MsNkNBQTZDLEVBQzdDLCtDQUErQyxFQUMvQyxnREFBZ0QsRUFDaEQsa0RBQWtELEdBQ25ELE1BQU0scUNBQXFDLENBQUM7QUFZN0MsTUFBTSxDQUFDLE1BQU0sb0NBQW9DLEdBQXlCO0lBQ3hFLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLEVBQUUsU0FBUztJQUN4QyxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxFQUFFO1FBQzVCLFFBQVEsRUFBRSw4QkFBOEI7UUFDeEMsYUFBYSxFQUFFLDZDQUE2QztRQUM1RCxjQUFjLEVBQUUsK0NBQStDO0tBQ2hFO0lBQ0QsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsRUFBRTtRQUN4QixRQUFRLEVBQUUsMkJBQTJCO1FBQ3JDLGFBQWEsRUFBRSw2Q0FBNkM7UUFDNUQsY0FBYyxFQUFFLCtDQUErQztLQUNoRTtJQUNELENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLEVBQUU7UUFDM0IsUUFBUSxFQUFFLDhCQUE4QjtRQUN4QyxhQUFhLEVBQUUsZ0RBQWdEO1FBQy9ELGNBQWMsRUFBRSxrREFBa0Q7S0FDbkU7SUFDRCxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxFQUFFLFNBQVM7Q0FDbkMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLDJCQUEyQixHQUF5QjtJQUMvRCxDQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxFQUFFLFNBQVM7SUFDeEMsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsRUFBRTtRQUM1QixRQUFRLEVBQUUsOEJBQThCO1FBQ3hDLGFBQWEsRUFBRSxvQ0FBb0M7UUFDbkQsY0FBYyxFQUFFLHNDQUFzQztLQUN2RDtJQUNELENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLEVBQUU7UUFDeEIsUUFBUSxFQUFFLDJCQUEyQjtRQUNyQyxhQUFhLEVBQUUsb0NBQW9DO1FBQ25ELGNBQWMsRUFBRSxzQ0FBc0M7S0FDdkQ7SUFDRCxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxFQUFFO1FBQzNCLFFBQVEsRUFBRSw4QkFBOEI7UUFDeEMsYUFBYSxFQUFFLHVDQUF1QztRQUN0RCxjQUFjLEVBQUUseUNBQXlDO0tBQzFEO0lBQ0QsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxTQUFTO0NBQ25DLENBQUMifQ==
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/// <reference types="node" resolution-mode="require"/>
|
|
2
2
|
import { type AppCircuitProofOutput, type KernelProofOutput, type ProofCreator } from '@aztec/circuit-types';
|
|
3
|
-
import { Fr, type PrivateCircuitPublicInputs, type PrivateKernelCircuitPublicInputs, type PrivateKernelInitCircuitPrivateInputs, type PrivateKernelInnerCircuitPrivateInputs, type PrivateKernelTailCircuitPrivateInputs, type PrivateKernelTailCircuitPublicInputs, Proof } from '@aztec/circuits.js';
|
|
3
|
+
import { Fr, type PrivateCircuitPublicInputs, type PrivateKernelCircuitPublicInputs, type PrivateKernelInitCircuitPrivateInputs, type PrivateKernelInnerCircuitPrivateInputs, type PrivateKernelResetCircuitPrivateInputsVariants, type PrivateKernelTailCircuitPrivateInputs, type PrivateKernelTailCircuitPublicInputs, Proof } from '@aztec/circuits.js';
|
|
4
4
|
import { type ClientProtocolArtifact } from '@aztec/noir-protocol-circuits-types';
|
|
5
|
-
import { type
|
|
5
|
+
import { type WitnessMap } from '@noir-lang/types';
|
|
6
6
|
/**
|
|
7
7
|
* This proof creator implementation uses the native bb binary.
|
|
8
8
|
* This is a temporary implementation until we make the WASM version work.
|
|
@@ -17,8 +17,9 @@ export declare class BBNativeProofCreator implements ProofCreator {
|
|
|
17
17
|
getSiloedCommitments(publicInputs: PrivateCircuitPublicInputs): Promise<Fr[]>;
|
|
18
18
|
createProofInit(inputs: PrivateKernelInitCircuitPrivateInputs): Promise<KernelProofOutput<PrivateKernelCircuitPublicInputs>>;
|
|
19
19
|
createProofInner(inputs: PrivateKernelInnerCircuitPrivateInputs): Promise<KernelProofOutput<PrivateKernelCircuitPublicInputs>>;
|
|
20
|
+
createProofReset(inputs: PrivateKernelResetCircuitPrivateInputsVariants): Promise<KernelProofOutput<PrivateKernelCircuitPublicInputs>>;
|
|
20
21
|
createProofTail(inputs: PrivateKernelTailCircuitPrivateInputs): Promise<KernelProofOutput<PrivateKernelTailCircuitPublicInputs>>;
|
|
21
|
-
createAppCircuitProof(partialWitness:
|
|
22
|
+
createAppCircuitProof(partialWitness: WitnessMap, bytecode: Buffer, appCircuitName?: string): Promise<AppCircuitProofOutput>;
|
|
22
23
|
/**
|
|
23
24
|
* Verifies a proof, will generate the verification key if one is not cached internally
|
|
24
25
|
* @param circuitType - The type of circuit whose proof is to be verified
|
|
@@ -32,12 +33,6 @@ export declare class BBNativeProofCreator implements ProofCreator {
|
|
|
32
33
|
* @returns The verification key data
|
|
33
34
|
*/
|
|
34
35
|
private getVerificationKeyDataForCircuit;
|
|
35
|
-
/**
|
|
36
|
-
* Reads the verification key data stored at the specified location and parses into a VerificationKeyData
|
|
37
|
-
* @param filePath - The directory containing the verification key data files
|
|
38
|
-
* @returns The verification key data
|
|
39
|
-
*/
|
|
40
|
-
private convertVk;
|
|
41
36
|
/**
|
|
42
37
|
* Ensures our verification key cache includes the key data located at the specified directory
|
|
43
38
|
* @param filePath - The directory containing the verification key data files
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bb_native_proof_creator.d.ts","sourceRoot":"","sources":["../../src/prover/bb_native_proof_creator.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,KAAK,qBAAqB,EAAE,KAAK,iBAAiB,EAAE,KAAK,YAAY,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"bb_native_proof_creator.d.ts","sourceRoot":"","sources":["../../src/prover/bb_native_proof_creator.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,KAAK,qBAAqB,EAAE,KAAK,iBAAiB,EAAE,KAAK,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAE7G,OAAO,EAEL,EAAE,EAEF,KAAK,0BAA0B,EAC/B,KAAK,gCAAgC,EACrC,KAAK,qCAAqC,EAC1C,KAAK,sCAAsC,EAC3C,KAAK,8CAA8C,EACnD,KAAK,qCAAqC,EAC1C,KAAK,oCAAoC,EACzC,KAAK,EAKN,MAAM,oBAAoB,CAAC;AAK5B,OAAO,EAEL,KAAK,sBAAsB,EAY5B,MAAM,qCAAqC,CAAC;AAK7C,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAcnD;;;GAGG;AACH,qBAAa,oBAAqB,YAAW,YAAY;IASrD,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,kBAAkB;IAC1B,OAAO,CAAC,GAAG;IAVb,OAAO,CAAC,SAAS,CAAuB;IAExC,OAAO,CAAC,gBAAgB,CAGpB;gBAGM,YAAY,EAAE,MAAM,EACpB,kBAAkB,EAAE,MAAM,EAC1B,GAAG,yCAA8C;IAGpD,oBAAoB,CAAC,YAAY,EAAE,0BAA0B;IAQvD,eAAe,CAC1B,MAAM,EAAE,qCAAqC,GAC5C,OAAO,CAAC,iBAAiB,CAAC,gCAAgC,CAAC,CAAC;IASlD,gBAAgB,CAC3B,MAAM,EAAE,sCAAsC,GAC7C,OAAO,CAAC,iBAAiB,CAAC,gCAAgC,CAAC,CAAC;IASlD,gBAAgB,CAC3B,MAAM,EAAE,8CAA8C,GACrD,OAAO,CAAC,iBAAiB,CAAC,gCAAgC,CAAC,CAAC;IASlD,eAAe,CAC1B,MAAM,EAAE,qCAAqC,GAC5C,OAAO,CAAC,iBAAiB,CAAC,oCAAoC,CAAC,CAAC;IAiBtD,qBAAqB,CAChC,cAAc,EAAE,UAAU,EAC1B,QAAQ,EAAE,MAAM,EAChB,cAAc,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC,qBAAqB,CAAC;IAkBjC;;;;OAIG;IACU,6BAA6B,CAAC,WAAW,EAAE,sBAAsB,EAAE,KAAK,EAAE,KAAK;YAmB9E,kBAAkB;IAgBhC;;;;OAIG;YACW,gCAAgC;IAqB9C;;;;OAIG;YACW,+BAA+B;YAU/B,eAAe;YAYf,6BAA6B;YA6C7B,WAAW;IA6EzB;;;;;OAKG;YACW,iBAAiB;CAwBhC"}
|
|
@@ -1,27 +1,15 @@
|
|
|
1
|
-
import { Fr, NESTED_RECURSIVE_PROOF_LENGTH, Proof, RECURSIVE_PROOF_LENGTH, RecursiveProof,
|
|
1
|
+
import { AGGREGATION_OBJECT_LENGTH, Fr, NESTED_RECURSIVE_PROOF_LENGTH, Proof, RECURSIVE_PROOF_LENGTH, RecursiveProof, } from '@aztec/circuits.js';
|
|
2
2
|
import { siloNoteHash } from '@aztec/circuits.js/hash';
|
|
3
|
-
import {
|
|
3
|
+
import { runInDirectory } from '@aztec/foundation/fs';
|
|
4
4
|
import { createDebugLogger } from '@aztec/foundation/log';
|
|
5
|
-
import {
|
|
5
|
+
import { Timer } from '@aztec/foundation/timer';
|
|
6
|
+
import { ClientCircuitArtifacts, PrivateResetTagToArtifactName, convertPrivateKernelInitInputsToWitnessMap, convertPrivateKernelInitOutputsFromWitnessMap, convertPrivateKernelInnerInputsToWitnessMap, convertPrivateKernelInnerOutputsFromWitnessMap, convertPrivateKernelResetInputsToWitnessMap, convertPrivateKernelResetOutputsFromWitnessMap, convertPrivateKernelTailForPublicOutputsFromWitnessMap, convertPrivateKernelTailInputsToWitnessMap, convertPrivateKernelTailOutputsFromWitnessMap, convertPrivateKernelTailToPublicInputsToWitnessMap, } from '@aztec/noir-protocol-circuits-types';
|
|
6
7
|
import { WASMSimulator } from '@aztec/simulator';
|
|
7
8
|
import { serializeWitness } from '@noir-lang/noirc_abi';
|
|
8
9
|
import * as fs from 'fs/promises';
|
|
9
|
-
import { BB_RESULT, PROOF_FIELDS_FILENAME, PROOF_FILENAME,
|
|
10
|
-
import {
|
|
11
|
-
|
|
12
|
-
PrivateKernelInitArtifact: {
|
|
13
|
-
convertOutputs: convertPrivateKernelInitOutputsFromWitnessMap,
|
|
14
|
-
},
|
|
15
|
-
PrivateKernelInnerArtifact: {
|
|
16
|
-
convertOutputs: convertPrivateKernelInnerOutputsFromWitnessMap,
|
|
17
|
-
},
|
|
18
|
-
PrivateKernelTailArtifact: {
|
|
19
|
-
convertOutputs: convertPrivateKernelTailOutputsFromWitnessMap,
|
|
20
|
-
},
|
|
21
|
-
PrivateKernelTailToPublicArtifact: {
|
|
22
|
-
convertOutputs: convertPrivateKernelTailForPublicOutputsFromWitnessMap,
|
|
23
|
-
},
|
|
24
|
-
};
|
|
10
|
+
import { BB_RESULT, PROOF_FIELDS_FILENAME, PROOF_FILENAME, generateKeyForNoirCircuit, generateProof, verifyProof, } from '../bb/execute.js';
|
|
11
|
+
import { mapProtocolArtifactNameToCircuitName } from '../stats.js';
|
|
12
|
+
import { extractVkData } from '../verification_key/verification_key_data.js';
|
|
25
13
|
/**
|
|
26
14
|
* This proof creator implementation uses the native bb binary.
|
|
27
15
|
* This is a temporary implementation until we make the WASM version work.
|
|
@@ -39,28 +27,24 @@ export class BBNativeProofCreator {
|
|
|
39
27
|
return Promise.resolve(publicInputs.newNoteHashes.map(commitment => siloNoteHash(contractAddress, commitment.value)));
|
|
40
28
|
}
|
|
41
29
|
async createProofInit(inputs) {
|
|
42
|
-
|
|
43
|
-
return await this.createSafeProof(witnessMap, 'PrivateKernelInitArtifact');
|
|
30
|
+
return await this.createSafeProof(inputs, 'PrivateKernelInitArtifact', convertPrivateKernelInitInputsToWitnessMap, convertPrivateKernelInitOutputsFromWitnessMap);
|
|
44
31
|
}
|
|
45
32
|
async createProofInner(inputs) {
|
|
46
|
-
|
|
47
|
-
|
|
33
|
+
return await this.createSafeProof(inputs, 'PrivateKernelInnerArtifact', convertPrivateKernelInnerInputsToWitnessMap, convertPrivateKernelInnerOutputsFromWitnessMap);
|
|
34
|
+
}
|
|
35
|
+
async createProofReset(inputs) {
|
|
36
|
+
return await this.createSafeProof(inputs, PrivateResetTagToArtifactName[inputs.sizeTag], convertPrivateKernelResetInputsToWitnessMap, output => convertPrivateKernelResetOutputsFromWitnessMap(output, inputs.sizeTag));
|
|
48
37
|
}
|
|
49
38
|
async createProofTail(inputs) {
|
|
50
39
|
if (!inputs.isForPublic()) {
|
|
51
|
-
|
|
52
|
-
return await this.createSafeProof(witnessMap, 'PrivateKernelTailArtifact');
|
|
40
|
+
return await this.createSafeProof(inputs, 'PrivateKernelTailArtifact', convertPrivateKernelTailInputsToWitnessMap, convertPrivateKernelTailOutputsFromWitnessMap);
|
|
53
41
|
}
|
|
54
|
-
|
|
55
|
-
return await this.createSafeProof(witnessMap, 'PrivateKernelTailToPublicArtifact');
|
|
42
|
+
return await this.createSafeProof(inputs, 'PrivateKernelTailToPublicArtifact', convertPrivateKernelTailToPublicInputsToWitnessMap, convertPrivateKernelTailForPublicOutputsFromWitnessMap);
|
|
56
43
|
}
|
|
57
|
-
async createAppCircuitProof(partialWitness, bytecode) {
|
|
58
|
-
const
|
|
59
|
-
await fs.mkdir(directory, { recursive: true });
|
|
60
|
-
this.log.debug(`Created directory: ${directory}`);
|
|
61
|
-
try {
|
|
44
|
+
async createAppCircuitProof(partialWitness, bytecode, appCircuitName) {
|
|
45
|
+
const operation = async (directory) => {
|
|
62
46
|
this.log.debug(`Proving app circuit`);
|
|
63
|
-
const proofOutput = await this.createProof(directory, partialWitness, bytecode, 'App');
|
|
47
|
+
const proofOutput = await this.createProof(directory, partialWitness, bytecode, 'App', appCircuitName);
|
|
64
48
|
if (proofOutput.proof.proof.length != RECURSIVE_PROOF_LENGTH) {
|
|
65
49
|
throw new Error(`Incorrect proof length`);
|
|
66
50
|
}
|
|
@@ -70,11 +54,8 @@ export class BBNativeProofCreator {
|
|
|
70
54
|
verificationKey: proofOutput.verificationKey,
|
|
71
55
|
};
|
|
72
56
|
return output;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
await fs.rm(directory, { recursive: true, force: true });
|
|
76
|
-
this.log.debug(`Deleted directory: ${directory}`);
|
|
77
|
-
}
|
|
57
|
+
};
|
|
58
|
+
return await runInDirectory(this.bbWorkingDirectory, operation);
|
|
78
59
|
}
|
|
79
60
|
/**
|
|
80
61
|
* Verifies a proof, will generate the verification key if one is not cached internally
|
|
@@ -83,7 +64,7 @@ export class BBNativeProofCreator {
|
|
|
83
64
|
*/
|
|
84
65
|
async verifyProofForProtocolCircuit(circuitType, proof) {
|
|
85
66
|
const verificationKey = await this.getVerificationKeyDataForCircuit(circuitType);
|
|
86
|
-
this.log.debug(`Verifying with key: ${verificationKey.hash.toString()}`);
|
|
67
|
+
this.log.debug(`Verifying with key: ${verificationKey.keyAsFields.hash.toString()}`);
|
|
87
68
|
const logFunction = (message) => {
|
|
88
69
|
this.log.debug(`${circuitType} BB out - ${message}`);
|
|
89
70
|
};
|
|
@@ -95,19 +76,14 @@ export class BBNativeProofCreator {
|
|
|
95
76
|
this.log.info(`Successfully verified ${circuitType} proof in ${result.duration} ms`);
|
|
96
77
|
}
|
|
97
78
|
async verifyProofFromKey(verificationKey, proof, logFunction = () => { }) {
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
await fs.writeFile(proofFileName, proof.buffer);
|
|
104
|
-
await fs.writeFile(verificationKeyPath, verificationKey);
|
|
105
|
-
try {
|
|
79
|
+
const operation = async (bbWorkingDirectory) => {
|
|
80
|
+
const proofFileName = `${bbWorkingDirectory}/proof`;
|
|
81
|
+
const verificationKeyPath = `${bbWorkingDirectory}/vk`;
|
|
82
|
+
await fs.writeFile(proofFileName, proof.buffer);
|
|
83
|
+
await fs.writeFile(verificationKeyPath, verificationKey);
|
|
106
84
|
return await verifyProof(this.bbBinaryPath, proofFileName, verificationKeyPath, logFunction);
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
await fs.rm(bbWorkingDirectory, { recursive: true, force: true });
|
|
110
|
-
}
|
|
85
|
+
};
|
|
86
|
+
return await runInDirectory(this.bbWorkingDirectory, operation);
|
|
111
87
|
}
|
|
112
88
|
/**
|
|
113
89
|
* Returns the verification key data for a circuit, will generate and cache it if not cached internally
|
|
@@ -121,37 +97,12 @@ export class BBNativeProofCreator {
|
|
|
121
97
|
if (result.status === BB_RESULT.FAILURE) {
|
|
122
98
|
throw new Error(`Failed to generate verification key for ${circuitType}, ${result.reason}`);
|
|
123
99
|
}
|
|
124
|
-
return
|
|
100
|
+
return extractVkData(result.vkPath);
|
|
125
101
|
});
|
|
126
102
|
this.verificationKeys.set(circuitType, promise);
|
|
127
103
|
}
|
|
128
104
|
return await promise;
|
|
129
105
|
}
|
|
130
|
-
/**
|
|
131
|
-
* Reads the verification key data stored at the specified location and parses into a VerificationKeyData
|
|
132
|
-
* @param filePath - The directory containing the verification key data files
|
|
133
|
-
* @returns The verification key data
|
|
134
|
-
*/
|
|
135
|
-
async convertVk(filePath) {
|
|
136
|
-
const [rawFields, rawBinary] = await Promise.all([
|
|
137
|
-
fs.readFile(`${filePath}/${VK_FIELDS_FILENAME}`, { encoding: 'utf-8' }),
|
|
138
|
-
fs.readFile(`${filePath}/${VK_FILENAME}`),
|
|
139
|
-
]);
|
|
140
|
-
const fieldsJson = JSON.parse(rawFields);
|
|
141
|
-
const fields = fieldsJson.map(Fr.fromString);
|
|
142
|
-
// The first item is the hash, this is not part of the actual VK
|
|
143
|
-
const vkHash = fields[0];
|
|
144
|
-
const actualVk = fields.slice(1);
|
|
145
|
-
const vk = {
|
|
146
|
-
hash: vkHash,
|
|
147
|
-
keyAsFields: actualVk,
|
|
148
|
-
keyAsBytes: rawBinary,
|
|
149
|
-
numPublicInputs: Number(actualVk[CIRCUIT_PUBLIC_INPUTS_INDEX]),
|
|
150
|
-
circuitSize: Number(actualVk[CIRCUIT_SIZE_INDEX]),
|
|
151
|
-
isRecursive: actualVk[CIRCUIT_RECURSIVE_INDEX] == Fr.ONE,
|
|
152
|
-
};
|
|
153
|
-
return vk;
|
|
154
|
-
}
|
|
155
106
|
/**
|
|
156
107
|
* Ensures our verification key cache includes the key data located at the specified directory
|
|
157
108
|
* @param filePath - The directory containing the verification key data files
|
|
@@ -160,60 +111,85 @@ export class BBNativeProofCreator {
|
|
|
160
111
|
async updateVerificationKeyAfterProof(filePath, circuitType) {
|
|
161
112
|
let promise = this.verificationKeys.get(circuitType);
|
|
162
113
|
if (!promise) {
|
|
163
|
-
promise =
|
|
114
|
+
promise = extractVkData(filePath);
|
|
164
115
|
this.log.debug(`Updated verification key for circuit: ${circuitType}`);
|
|
165
116
|
this.verificationKeys.set(circuitType, promise);
|
|
166
117
|
}
|
|
167
118
|
return await promise;
|
|
168
119
|
}
|
|
169
|
-
async createSafeProof(inputs, circuitType) {
|
|
170
|
-
const
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
return await this.generateWitnessAndCreateProof(inputs, circuitType, directory);
|
|
175
|
-
}
|
|
176
|
-
finally {
|
|
177
|
-
await fs.rm(directory, { recursive: true, force: true });
|
|
178
|
-
this.log.debug(`Deleted directory: ${directory}`);
|
|
179
|
-
}
|
|
120
|
+
async createSafeProof(inputs, circuitType, convertInputs, convertOutputs) {
|
|
121
|
+
const operation = async (directory) => {
|
|
122
|
+
return await this.generateWitnessAndCreateProof(inputs, circuitType, directory, convertInputs, convertOutputs);
|
|
123
|
+
};
|
|
124
|
+
return await runInDirectory(this.bbWorkingDirectory, operation);
|
|
180
125
|
}
|
|
181
|
-
async generateWitnessAndCreateProof(inputs, circuitType, directory) {
|
|
126
|
+
async generateWitnessAndCreateProof(inputs, circuitType, directory, convertInputs, convertOutputs) {
|
|
182
127
|
this.log.debug(`Generating witness for ${circuitType}`);
|
|
183
128
|
const compiledCircuit = ClientCircuitArtifacts[circuitType];
|
|
184
|
-
const
|
|
185
|
-
|
|
186
|
-
const
|
|
129
|
+
const witnessMap = convertInputs(inputs);
|
|
130
|
+
const timer = new Timer();
|
|
131
|
+
const outputWitness = await this.simulator.simulateCircuit(witnessMap, compiledCircuit);
|
|
132
|
+
const output = convertOutputs(outputWitness);
|
|
133
|
+
this.log.debug(`Generated witness for ${circuitType}`, {
|
|
134
|
+
eventName: 'circuit-witness-generation',
|
|
135
|
+
circuitName: mapProtocolArtifactNameToCircuitName(circuitType),
|
|
136
|
+
duration: timer.ms(),
|
|
137
|
+
inputSize: inputs.toBuffer().length,
|
|
138
|
+
outputSize: output.toBuffer().length,
|
|
139
|
+
});
|
|
187
140
|
const proofOutput = await this.createProof(directory, outputWitness, Buffer.from(compiledCircuit.bytecode, 'base64'), circuitType);
|
|
188
141
|
if (proofOutput.proof.proof.length != NESTED_RECURSIVE_PROOF_LENGTH) {
|
|
189
142
|
throw new Error(`Incorrect proof length`);
|
|
190
143
|
}
|
|
191
144
|
const nestedProof = proofOutput.proof;
|
|
192
145
|
const kernelOutput = {
|
|
193
|
-
publicInputs,
|
|
146
|
+
publicInputs: output,
|
|
194
147
|
proof: nestedProof,
|
|
195
148
|
verificationKey: proofOutput.verificationKey,
|
|
196
149
|
};
|
|
197
150
|
return kernelOutput;
|
|
198
151
|
}
|
|
199
|
-
async createProof(directory, partialWitness, bytecode, circuitType) {
|
|
152
|
+
async createProof(directory, partialWitness, bytecode, circuitType, appCircuitName) {
|
|
200
153
|
const compressedBincodedWitness = serializeWitness(partialWitness);
|
|
201
154
|
const inputsWitnessFile = `${directory}/witness.gz`;
|
|
202
155
|
await fs.writeFile(inputsWitnessFile, compressedBincodedWitness);
|
|
203
156
|
this.log.debug(`Written ${inputsWitnessFile}`);
|
|
157
|
+
this.log.info(`Proving ${circuitType} circuit...`);
|
|
158
|
+
const timer = new Timer();
|
|
204
159
|
const provingResult = await generateProof(this.bbBinaryPath, directory, circuitType, bytecode, inputsWitnessFile, this.log.debug);
|
|
205
160
|
if (provingResult.status === BB_RESULT.FAILURE) {
|
|
206
161
|
this.log.error(`Failed to generate proof for ${circuitType}: ${provingResult.reason}`);
|
|
207
162
|
throw new Error(provingResult.reason);
|
|
208
163
|
}
|
|
164
|
+
this.log.info(`Generated ${circuitType === 'App' ? appCircuitName : circuitType} circuit proof in ${timer.ms()} ms`);
|
|
209
165
|
if (circuitType === 'App') {
|
|
210
|
-
const vkData = await
|
|
166
|
+
const vkData = await extractVkData(directory);
|
|
211
167
|
const proof = await this.readProofAsFields(directory, circuitType, vkData);
|
|
212
|
-
|
|
168
|
+
this.log.debug(`Generated proof`, {
|
|
169
|
+
eventName: 'circuit-proving',
|
|
170
|
+
circuitName: 'app-circuit',
|
|
171
|
+
duration: provingResult.duration,
|
|
172
|
+
inputSize: compressedBincodedWitness.length,
|
|
173
|
+
proofSize: proof.binaryProof.buffer.length,
|
|
174
|
+
appCircuitName,
|
|
175
|
+
circuitSize: vkData.circuitSize,
|
|
176
|
+
numPublicInputs: vkData.numPublicInputs,
|
|
177
|
+
});
|
|
178
|
+
return { proof, verificationKey: vkData.keyAsFields };
|
|
213
179
|
}
|
|
214
180
|
const vkData = await this.updateVerificationKeyAfterProof(directory, circuitType);
|
|
215
181
|
const proof = await this.readProofAsFields(directory, circuitType, vkData);
|
|
216
|
-
|
|
182
|
+
await this.verifyProofForProtocolCircuit(circuitType, proof.binaryProof);
|
|
183
|
+
this.log.debug(`Generated proof`, {
|
|
184
|
+
circuitName: mapProtocolArtifactNameToCircuitName(circuitType),
|
|
185
|
+
duration: provingResult.duration,
|
|
186
|
+
eventName: 'circuit-proving',
|
|
187
|
+
inputSize: compressedBincodedWitness.length,
|
|
188
|
+
proofSize: proof.binaryProof.buffer.length,
|
|
189
|
+
circuitSize: vkData.circuitSize,
|
|
190
|
+
numPublicInputs: vkData.numPublicInputs,
|
|
191
|
+
});
|
|
192
|
+
return { proof, verificationKey: vkData.keyAsFields };
|
|
217
193
|
}
|
|
218
194
|
/**
|
|
219
195
|
* Parses and returns the proof data stored at the specified directory
|
|
@@ -228,11 +204,11 @@ export class BBNativeProofCreator {
|
|
|
228
204
|
]);
|
|
229
205
|
const json = JSON.parse(proofString);
|
|
230
206
|
const fields = json.map(Fr.fromString);
|
|
231
|
-
const numPublicInputs = circuitType === 'App' ? vkData.numPublicInputs : vkData.numPublicInputs -
|
|
207
|
+
const numPublicInputs = circuitType === 'App' ? vkData.numPublicInputs : vkData.numPublicInputs - AGGREGATION_OBJECT_LENGTH;
|
|
232
208
|
const fieldsWithoutPublicInputs = fields.slice(numPublicInputs);
|
|
233
209
|
this.log.debug(`Circuit type: ${circuitType}, complete proof length: ${fields.length}, without public inputs: ${fieldsWithoutPublicInputs.length}, num public inputs: ${numPublicInputs}, circuit size: ${vkData.circuitSize}, is recursive: ${vkData.isRecursive}, raw length: ${binaryProof.length}`);
|
|
234
|
-
const proof = new RecursiveProof(fieldsWithoutPublicInputs, new Proof(binaryProof));
|
|
210
|
+
const proof = new RecursiveProof(fieldsWithoutPublicInputs, new Proof(binaryProof, vkData.numPublicInputs), true);
|
|
235
211
|
return proof;
|
|
236
212
|
}
|
|
237
213
|
}
|
|
238
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmJfbmF0aXZlX3Byb29mX2NyZWF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcHJvdmVyL2JiX25hdGl2ZV9wcm9vZl9jcmVhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFDTCxFQUFFLEVBQ0YsNkJBQTZCLEVBTzdCLEtBQUssRUFDTCxzQkFBc0IsRUFDdEIsY0FBYyxFQUVkLHVCQUF1QixHQUN4QixNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFMUQsT0FBTyxFQUNMLHNCQUFzQixFQUV0QiwwQ0FBMEMsRUFDMUMsNkNBQTZDLEVBQzdDLDJDQUEyQyxFQUMzQyw4Q0FBOEMsRUFDOUMsc0RBQXNELEVBQ3RELDBDQUEwQyxFQUMxQyw2Q0FBNkMsRUFDN0Msa0RBQWtELEdBQ25ELE1BQU0scUNBQXFDLENBQUM7QUFDN0MsT0FBTyxFQUFrQixhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUdqRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUV4RCxPQUFPLEtBQUssRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUVsQyxPQUFPLEVBQ0wsU0FBUyxFQUNULHFCQUFxQixFQUNyQixjQUFjLEVBQ2Qsa0JBQWtCLEVBQ2xCLFdBQVcsRUFDWCx5QkFBeUIsRUFDekIsYUFBYSxFQUNiLFdBQVcsR0FDWixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsMkJBQTJCLEVBQzNCLHVCQUF1QixFQUN2QixrQkFBa0IsR0FFbkIsTUFBTSw0QkFBNEIsQ0FBQztBQU1wQyxNQUFNLDRCQUE0QixHQUE0RDtJQUM1Rix5QkFBeUIsRUFB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
|
|
214
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmJfbmF0aXZlX3Byb29mX2NyZWF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcHJvdmVyL2JiX25hdGl2ZV9wcm9vZl9jcmVhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFDTCx5QkFBeUIsRUFDekIsRUFBRSxFQUNGLDZCQUE2QixFQVE3QixLQUFLLEVBQ0wsc0JBQXNCLEVBQ3RCLGNBQWMsR0FHZixNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDMUQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ2hELE9BQU8sRUFDTCxzQkFBc0IsRUFFdEIsNkJBQTZCLEVBQzdCLDBDQUEwQyxFQUMxQyw2Q0FBNkMsRUFDN0MsMkNBQTJDLEVBQzNDLDhDQUE4QyxFQUM5QywyQ0FBMkMsRUFDM0MsOENBQThDLEVBQzlDLHNEQUFzRCxFQUN0RCwwQ0FBMEMsRUFDMUMsNkNBQTZDLEVBQzdDLGtEQUFrRCxHQUNuRCxNQUFNLHFDQUFxQyxDQUFDO0FBQzdDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUdqRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUV4RCxPQUFPLEtBQUssRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUVsQyxPQUFPLEVBQ0wsU0FBUyxFQUNULHFCQUFxQixFQUNyQixjQUFjLEVBQ2QseUJBQXlCLEVBQ3pCLGFBQWEsRUFDYixXQUFXLEdBQ1osTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQUUsb0NBQW9DLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDbkUsT0FBTyxFQUFFLGFBQWEsRUFB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
|
|
@@ -1,14 +1,10 @@
|
|
|
1
|
-
import { type
|
|
2
|
-
import { type BaseOrMergeRollupPublicInputs, type BaseParityInputs, type BaseRollupInputs, type KernelCircuitPublicInputs, type MergeRollupInputs, type
|
|
1
|
+
import { type ProofAndVerificationKey, type PublicInputsAndRecursiveProof, type PublicKernelNonTailRequest, type PublicKernelTailRequest, type ServerCircuitProver } from '@aztec/circuit-types';
|
|
2
|
+
import { type AvmCircuitInputs, type BaseOrMergeRollupPublicInputs, type BaseParityInputs, type BaseRollupInputs, type KernelCircuitPublicInputs, type MergeRollupInputs, NESTED_RECURSIVE_PROOF_LENGTH, type PrivateKernelEmptyInputData, Proof, type PublicKernelCircuitPublicInputs, RECURSIVE_PROOF_LENGTH, RecursiveProof, RootParityInput, type RootParityInputs, type RootRollupInputs, type RootRollupPublicInputs, type VerificationKeyAsFields, type VerificationKeyData } from '@aztec/circuits.js';
|
|
3
3
|
import { type ServerProtocolArtifact } from '@aztec/noir-protocol-circuits-types';
|
|
4
|
-
import {
|
|
5
|
-
export
|
|
6
|
-
bbBinaryPath: string;
|
|
7
|
-
bbWorkingDirectory: string;
|
|
8
|
-
acvmBinaryPath: string;
|
|
9
|
-
acvmWorkingDirectory: string;
|
|
4
|
+
import type { ACVMConfig, BBConfig } from '../config.js';
|
|
5
|
+
export interface BBProverConfig extends BBConfig, ACVMConfig {
|
|
10
6
|
circuitFilter?: ServerProtocolArtifact[];
|
|
11
|
-
}
|
|
7
|
+
}
|
|
12
8
|
/**
|
|
13
9
|
* Prover implementation that uses barretenberg native proving
|
|
14
10
|
*/
|
|
@@ -29,70 +25,86 @@ export declare class BBNativeRollupProver implements ServerCircuitProver {
|
|
|
29
25
|
* @returns The public inputs of the parity circuit.
|
|
30
26
|
*/
|
|
31
27
|
getRootParityProof(inputs: RootParityInputs): Promise<RootParityInput<typeof NESTED_RECURSIVE_PROOF_LENGTH>>;
|
|
28
|
+
/**
|
|
29
|
+
* Creates an AVM proof and verifies it.
|
|
30
|
+
* @param inputs - The inputs to the AVM circuit.
|
|
31
|
+
* @returns The proof.
|
|
32
|
+
*/
|
|
33
|
+
getAvmProof(inputs: AvmCircuitInputs): Promise<ProofAndVerificationKey>;
|
|
32
34
|
/**
|
|
33
35
|
* Requests that a public kernel circuit be executed and the proof generated
|
|
34
36
|
* @param kernelRequest - The object encapsulating the request for a proof
|
|
35
37
|
* @returns The requested circuit's public inputs and proof
|
|
36
38
|
*/
|
|
37
|
-
getPublicKernelProof(kernelRequest: PublicKernelNonTailRequest): Promise<
|
|
39
|
+
getPublicKernelProof(kernelRequest: PublicKernelNonTailRequest): Promise<PublicInputsAndRecursiveProof<PublicKernelCircuitPublicInputs>>;
|
|
38
40
|
/**
|
|
39
41
|
* Requests that the public kernel tail circuit be executed and the proof generated
|
|
40
42
|
* @param kernelRequest - The object encapsulating the request for a proof
|
|
41
43
|
* @returns The requested circuit's public inputs and proof
|
|
42
44
|
*/
|
|
43
|
-
getPublicTailProof(kernelRequest: PublicKernelTailRequest): Promise<
|
|
45
|
+
getPublicTailProof(kernelRequest: PublicKernelTailRequest): Promise<PublicInputsAndRecursiveProof<KernelCircuitPublicInputs>>;
|
|
44
46
|
/**
|
|
45
47
|
* Simulates the base rollup circuit from its inputs.
|
|
46
48
|
* @param input - Inputs to the circuit.
|
|
47
49
|
* @returns The public inputs as outputs of the simulation.
|
|
48
50
|
*/
|
|
49
|
-
getBaseRollupProof(input: BaseRollupInputs): Promise<
|
|
51
|
+
getBaseRollupProof(input: BaseRollupInputs): Promise<PublicInputsAndRecursiveProof<BaseOrMergeRollupPublicInputs>>;
|
|
50
52
|
/**
|
|
51
53
|
* Simulates the merge rollup circuit from its inputs.
|
|
52
54
|
* @param input - Inputs to the circuit.
|
|
53
55
|
* @returns The public inputs as outputs of the simulation.
|
|
54
56
|
*/
|
|
55
|
-
getMergeRollupProof(input: MergeRollupInputs): Promise<
|
|
57
|
+
getMergeRollupProof(input: MergeRollupInputs): Promise<PublicInputsAndRecursiveProof<BaseOrMergeRollupPublicInputs>>;
|
|
56
58
|
/**
|
|
57
59
|
* Simulates the root rollup circuit from its inputs.
|
|
58
60
|
* @param input - Inputs to the circuit.
|
|
59
61
|
* @returns The public inputs as outputs of the simulation.
|
|
60
62
|
*/
|
|
61
|
-
getRootRollupProof(input: RootRollupInputs): Promise<
|
|
62
|
-
|
|
63
|
+
getRootRollupProof(input: RootRollupInputs): Promise<PublicInputsAndRecursiveProof<RootRollupPublicInputs>>;
|
|
64
|
+
getEmptyPrivateKernelProof(inputs: PrivateKernelEmptyInputData): Promise<PublicInputsAndRecursiveProof<KernelCircuitPublicInputs>>;
|
|
65
|
+
private getEmptyNestedProof;
|
|
66
|
+
private getEmptyPrivateKernelProofFromEmptyNested;
|
|
67
|
+
private generateProofWithBB;
|
|
68
|
+
private createProof;
|
|
69
|
+
private generateAvmProofWithBB;
|
|
70
|
+
private createAvmProof;
|
|
63
71
|
/**
|
|
64
72
|
* Executes a circuit and returns it's outputs and corresponding proof with embedded aggregation object
|
|
65
73
|
* @param witnessMap - The input witness
|
|
66
74
|
* @param circuitType - The type of circuit to be executed
|
|
75
|
+
* @param proofLength - The length of the proof to be generated. This is a dummy parameter to aid in type checking
|
|
76
|
+
* @param convertInput - Function for mapping the input object to a witness map.
|
|
67
77
|
* @param convertOutput - Function for parsing the output witness to it's corresponding object
|
|
68
78
|
* @returns The circuits output object and it's proof
|
|
69
79
|
*/
|
|
70
|
-
createRecursiveProof
|
|
80
|
+
private createRecursiveProof;
|
|
71
81
|
/**
|
|
72
82
|
* Verifies a proof, will generate the verification key if one is not cached internally
|
|
73
83
|
* @param circuitType - The type of circuit whose proof is to be verified
|
|
74
84
|
* @param proof - The proof to be verified
|
|
75
85
|
*/
|
|
76
86
|
verifyProof(circuitType: ServerProtocolArtifact, proof: Proof): Promise<void>;
|
|
87
|
+
verifyAvmProof(proof: Proof, verificationKey: VerificationKeyData): Promise<void>;
|
|
88
|
+
verifyWithKey(verificationKey: VerificationKeyData, proof: Proof): Promise<void>;
|
|
89
|
+
private verifyWithKeyInternal;
|
|
77
90
|
/**
|
|
78
91
|
* Returns the verification key for a circuit, will generate it if not cached internally
|
|
79
92
|
* @param circuitType - The type of circuit for which the verification key is required
|
|
80
93
|
* @returns The verification key
|
|
81
94
|
*/
|
|
82
95
|
getVerificationKeyForCircuit(circuitType: ServerProtocolArtifact): Promise<VerificationKeyAsFields>;
|
|
83
|
-
|
|
96
|
+
/**
|
|
97
|
+
* Will check a recursive proof argument for validity of it's 'fields' format of proof and convert if required
|
|
98
|
+
* @param proof - The input proof that may need converting
|
|
99
|
+
* @returns - The valid proof
|
|
100
|
+
*/
|
|
101
|
+
ensureValidProof(proof: RecursiveProof<typeof NESTED_RECURSIVE_PROOF_LENGTH>, circuit: ServerProtocolArtifact, vk: VerificationKeyData): Promise<RecursiveProof<109>>;
|
|
84
102
|
/**
|
|
85
103
|
* Returns the verification key data for a circuit, will generate and cache it if not cached internally
|
|
86
104
|
* @param circuitType - The type of circuit for which the verification key is required
|
|
87
105
|
* @returns The verification key data
|
|
88
106
|
*/
|
|
89
107
|
private getVerificationKeyDataForCircuit;
|
|
90
|
-
/**
|
|
91
|
-
* Reads the verification key data stored at the specified location and parses into a VerificationKeyData
|
|
92
|
-
* @param filePath - The directory containing the verification key data files
|
|
93
|
-
* @returns The verification key data
|
|
94
|
-
*/
|
|
95
|
-
private convertVk;
|
|
96
108
|
/**
|
|
97
109
|
* Ensures our verification key cache includes the key data located at the specified directory
|
|
98
110
|
* @param filePath - The directory containing the verification key data files
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bb_prover.d.ts","sourceRoot":"","sources":["../../src/prover/bb_prover.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,
|
|
1
|
+
{"version":3,"file":"bb_prover.d.ts","sourceRoot":"","sources":["../../src/prover/bb_prover.ts"],"names":[],"mappings":"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"}
|