@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.
Files changed (60) hide show
  1. package/dest/bb/cli.d.ts.map +1 -1
  2. package/dest/bb/cli.js +24 -2
  3. package/dest/bb/execute.d.ts +37 -2
  4. package/dest/bb/execute.d.ts.map +1 -1
  5. package/dest/bb/execute.js +276 -75
  6. package/dest/config.d.ts +9 -0
  7. package/dest/config.d.ts.map +1 -0
  8. package/dest/config.js +2 -0
  9. package/dest/index.d.ts +2 -0
  10. package/dest/index.d.ts.map +1 -1
  11. package/dest/index.js +3 -1
  12. package/dest/mappings/mappings.d.ts +1 -0
  13. package/dest/mappings/mappings.d.ts.map +1 -1
  14. package/dest/mappings/mappings.js +27 -8
  15. package/dest/prover/bb_native_proof_creator.d.ts +4 -9
  16. package/dest/prover/bb_native_proof_creator.d.ts.map +1 -1
  17. package/dest/prover/bb_native_proof_creator.js +77 -101
  18. package/dest/prover/bb_prover.d.ts +35 -23
  19. package/dest/prover/bb_prover.d.ts.map +1 -1
  20. package/dest/prover/bb_prover.js +247 -155
  21. package/dest/stats.d.ts +2 -5
  22. package/dest/stats.d.ts.map +1 -1
  23. package/dest/stats.js +27 -26
  24. package/dest/test/index.d.ts +1 -0
  25. package/dest/test/index.d.ts.map +1 -1
  26. package/dest/test/index.js +2 -1
  27. package/dest/test/test_circuit_prover.d.ts +9 -7
  28. package/dest/test/test_circuit_prover.d.ts.map +1 -1
  29. package/dest/test/test_circuit_prover.js +31 -15
  30. package/dest/test/test_verifier.d.ts +7 -0
  31. package/dest/test/test_verifier.d.ts.map +1 -0
  32. package/dest/test/test_verifier.js +10 -0
  33. package/dest/verification_key/verification_key_data.d.ts +8 -0
  34. package/dest/verification_key/verification_key_data.d.ts.map +1 -0
  35. package/dest/verification_key/verification_key_data.js +24 -0
  36. package/dest/verifier/bb_verifier.d.ts +18 -0
  37. package/dest/verifier/bb_verifier.d.ts.map +1 -0
  38. package/dest/verifier/bb_verifier.js +90 -0
  39. package/dest/verifier/index.d.ts +2 -0
  40. package/dest/verifier/index.d.ts.map +1 -0
  41. package/dest/verifier/index.js +2 -0
  42. package/package.json +6 -6
  43. package/src/bb/cli.ts +36 -1
  44. package/src/bb/execute.ts +371 -83
  45. package/src/config.ts +9 -0
  46. package/src/index.ts +2 -0
  47. package/src/mappings/mappings.ts +38 -12
  48. package/src/prover/bb_native_proof_creator.ts +139 -119
  49. package/src/prover/bb_prover.ts +454 -242
  50. package/src/stats.ts +30 -45
  51. package/src/test/index.ts +1 -0
  52. package/src/test/test_circuit_prover.ts +84 -21
  53. package/src/test/test_verifier.ts +12 -0
  54. package/src/verification_key/verification_key_data.ts +35 -0
  55. package/src/verifier/bb_verifier.ts +156 -0
  56. package/src/verifier/index.ts +1 -0
  57. package/dest/prover/verification_key_data.d.ts +0 -16
  58. package/dest/prover/verification_key_data.d.ts.map +0 -1
  59. package/dest/prover/verification_key_data.js +0 -5
  60. package/src/prover/verification_key_data.ts +0 -16
@@ -1,22 +1,41 @@
1
1
  import { PublicKernelType } from '@aztec/circuit-types';
2
- import { convertPublicInnerRollupInputsToWitnessMap, convertPublicInnerRollupOutputFromWitnessMap, convertPublicSetupRollupInputsToWitnessMap, convertPublicSetupRollupOutputFromWitnessMap, convertPublicTeardownRollupInputsToWitnessMap, convertPublicTeardownRollupOutputFromWitnessMap, } from '@aztec/noir-protocol-circuits-types';
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: convertPublicInnerRollupInputsToWitnessMap,
8
- convertOutputs: convertPublicInnerRollupOutputFromWitnessMap,
26
+ convertInputs: convertPublicInnerInputsToWitnessMap,
27
+ convertOutputs: convertPublicInnerOutputFromWitnessMap,
9
28
  },
10
29
  [PublicKernelType.SETUP]: {
11
30
  artifact: 'PublicKernelSetupArtifact',
12
- convertInputs: convertPublicSetupRollupInputsToWitnessMap,
13
- convertOutputs: convertPublicSetupRollupOutputFromWitnessMap,
31
+ convertInputs: convertPublicSetupInputsToWitnessMap,
32
+ convertOutputs: convertPublicSetupOutputFromWitnessMap,
14
33
  },
15
34
  [PublicKernelType.TEARDOWN]: {
16
35
  artifact: 'PublicKernelTeardownArtifact',
17
- convertInputs: convertPublicTeardownRollupInputsToWitnessMap,
18
- convertOutputs: convertPublicTeardownRollupOutputFromWitnessMap,
36
+ convertInputs: convertPublicTeardownInputsToWitnessMap,
37
+ convertOutputs: convertPublicTeardownOutputFromWitnessMap,
19
38
  },
20
39
  [PublicKernelType.TAIL]: undefined,
21
40
  };
22
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFwcGluZ3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbWFwcGluZ3MvbWFwcGluZ3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFeEQsT0FBTyxFQUVMLDBDQUEwQyxFQUMxQyw0Q0FBNEMsRUFDNUMsMENBQTBDLEVBQzFDLDRDQUE0QyxFQUM1Qyw2Q0FBNkMsRUFDN0MsK0NBQStDLEdBQ2hELE1BQU0scUNBQXFDLENBQUM7QUFZN0MsTUFBTSxDQUFDLE1BQU0sMkJBQTJCLEdBQXlCO0lBQy9ELENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLEVBQUUsU0FBUztJQUN4QyxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxFQUFFO1FBQzVCLFFBQVEsRUFBRSw4QkFBOEI7UUFDeEMsYUFBYSxFQUFFLDBDQUEwQztRQUN6RCxjQUFjLEVBQUUsNENBQTRDO0tBQzdEO0lBQ0QsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsRUFBRTtRQUN4QixRQUFRLEVBQUUsMkJBQTJCO1FBQ3JDLGFBQWEsRUFBRSwwQ0FBMEM7UUFDekQsY0FBYyxFQUFFLDRDQUE0QztLQUM3RDtJQUNELENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLEVBQUU7UUFDM0IsUUFBUSxFQUFFLDhCQUE4QjtRQUN4QyxhQUFhLEVBQUUsNkNBQTZDO1FBQzVELGNBQWMsRUFBRSwrQ0FBK0M7S0FDaEU7SUFDRCxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxFQUFFLFNBQVM7Q0FDbkMsQ0FBQyJ9
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 ACVMField } from '@aztec/simulator';
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: Map<number, ACVMField>, bytecode: Buffer): Promise<AppCircuitProofOutput>;
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;AAC7G,OAAO,EACL,EAAE,EAEF,KAAK,0BAA0B,EAC/B,KAAK,gCAAgC,EACrC,KAAK,qCAAqC,EAC1C,KAAK,sCAAsC,EAC3C,KAAK,qCAAqC,EAC1C,KAAK,oCAAoC,EACzC,KAAK,EAKN,MAAM,oBAAoB,CAAC;AAK5B,OAAO,EAEL,KAAK,sBAAsB,EAS5B,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EAAE,KAAK,SAAS,EAAiB,MAAM,kBAAkB,CAAC;AA4CjE;;;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;IAKlD,gBAAgB,CAC3B,MAAM,EAAE,sCAAsC,GAC7C,OAAO,CAAC,iBAAiB,CAAC,gCAAgC,CAAC,CAAC;IAKlD,eAAe,CAC1B,MAAM,EAAE,qCAAqC,GAC5C,OAAO,CAAC,iBAAiB,CAAC,oCAAoC,CAAC,CAAC;IAStD,qBAAqB,CAChC,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,EACtC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,qBAAqB,CAAC;IAsBjC;;;;OAIG;IACU,6BAA6B,CAAC,WAAW,EAAE,sBAAsB,EAAE,KAAK,EAAE,KAAK;YAmB9E,kBAAkB;IAsBhC;;;;OAIG;YACW,gCAAgC;IAqB9C;;;;OAIG;YACW,SAAS;IAqBvB;;;;OAIG;YACW,+BAA+B;YAU/B,eAAe;YAef,6BAA6B;YAiC7B,WAAW;IA0CzB;;;;;OAKG;YACW,iBAAiB;CAoBhC"}
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, VerificationKeyAsFields, } from '@aztec/circuits.js';
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 { randomBytes } from '@aztec/foundation/crypto';
3
+ import { runInDirectory } from '@aztec/foundation/fs';
4
4
  import { createDebugLogger } from '@aztec/foundation/log';
5
- import { ClientCircuitArtifacts, convertPrivateKernelInitInputsToWitnessMap, convertPrivateKernelInitOutputsFromWitnessMap, convertPrivateKernelInnerInputsToWitnessMap, convertPrivateKernelInnerOutputsFromWitnessMap, convertPrivateKernelTailForPublicOutputsFromWitnessMap, convertPrivateKernelTailInputsToWitnessMap, convertPrivateKernelTailOutputsFromWitnessMap, convertPrivateKernelTailToPublicInputsToWitnessMap, } from '@aztec/noir-protocol-circuits-types';
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, VK_FIELDS_FILENAME, VK_FILENAME, generateKeyForNoirCircuit, generateProof, verifyProof, } from '../bb/execute.js';
10
- import { AGGREGATION_OBJECT_SIZE, CIRCUIT_PUBLIC_INPUTS_INDEX, CIRCUIT_RECURSIVE_INDEX, CIRCUIT_SIZE_INDEX, } from './verification_key_data.js';
11
- const PrivateKernelArtifactMapping = {
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
- const witnessMap = convertPrivateKernelInitInputsToWitnessMap(inputs);
43
- return await this.createSafeProof(witnessMap, 'PrivateKernelInitArtifact');
30
+ return await this.createSafeProof(inputs, 'PrivateKernelInitArtifact', convertPrivateKernelInitInputsToWitnessMap, convertPrivateKernelInitOutputsFromWitnessMap);
44
31
  }
45
32
  async createProofInner(inputs) {
46
- const witnessMap = convertPrivateKernelInnerInputsToWitnessMap(inputs);
47
- return await this.createSafeProof(witnessMap, 'PrivateKernelInnerArtifact');
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
- const witnessMap = convertPrivateKernelTailInputsToWitnessMap(inputs);
52
- return await this.createSafeProof(witnessMap, 'PrivateKernelTailArtifact');
40
+ return await this.createSafeProof(inputs, 'PrivateKernelTailArtifact', convertPrivateKernelTailInputsToWitnessMap, convertPrivateKernelTailOutputsFromWitnessMap);
53
41
  }
54
- const witnessMap = convertPrivateKernelTailToPublicInputsToWitnessMap(inputs);
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 directory = `${this.bbWorkingDirectory}/${randomBytes(8).toString('hex')}`;
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
- finally {
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
- // Create random directory to be used for temp files
99
- const bbWorkingDirectory = `${this.bbWorkingDirectory}/${randomBytes(8).toString('hex')}`;
100
- await fs.mkdir(bbWorkingDirectory, { recursive: true });
101
- const proofFileName = `${bbWorkingDirectory}/proof`;
102
- const verificationKeyPath = `${bbWorkingDirectory}/vk`;
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
- finally {
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 this.convertVk(result.vkPath);
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 = this.convertVk(filePath);
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 directory = `${this.bbWorkingDirectory}/${randomBytes(8).toString('hex')}`;
171
- await fs.mkdir(directory, { recursive: true });
172
- this.log.debug(`Created directory: ${directory}`);
173
- try {
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 outputWitness = await this.simulator.simulateCircuit(inputs, compiledCircuit);
185
- this.log.debug(`Generated witness for ${circuitType}`);
186
- const publicInputs = PrivateKernelArtifactMapping[circuitType].convertOutputs(outputWitness);
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 this.convertVk(directory);
166
+ const vkData = await extractVkData(directory);
211
167
  const proof = await this.readProofAsFields(directory, circuitType, vkData);
212
- return { proof, verificationKey: new VerificationKeyAsFields(vkData.keyAsFields, vkData.hash) };
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
- return { proof, verificationKey: new VerificationKeyAsFields(vkData.keyAsFields, vkData.hash) };
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 - AGGREGATION_OBJECT_SIZE;
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 PublicInputsAndProof, type PublicKernelNonTailRequest, type PublicKernelTailRequest, type ServerCircuitProver } from '@aztec/circuit-types';
2
- import { type BaseOrMergeRollupPublicInputs, type BaseParityInputs, type BaseRollupInputs, type KernelCircuitPublicInputs, type MergeRollupInputs, type NESTED_RECURSIVE_PROOF_LENGTH, Proof, type PublicKernelCircuitPublicInputs, type RECURSIVE_PROOF_LENGTH, RecursiveProof, RootParityInput, type RootParityInputs, type RootRollupInputs, type RootRollupPublicInputs, VerificationKeyAsFields } from '@aztec/circuits.js';
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 { type WitnessMap } from '@noir-lang/types';
5
- export type BBProverConfig = {
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<PublicInputsAndProof<PublicKernelCircuitPublicInputs>>;
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<PublicInputsAndProof<KernelCircuitPublicInputs>>;
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<PublicInputsAndProof<BaseOrMergeRollupPublicInputs>>;
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<PublicInputsAndProof<BaseOrMergeRollupPublicInputs>>;
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<PublicInputsAndProof<RootRollupPublicInputs>>;
62
- createProof(witnessMap: WitnessMap, circuitType: ServerProtocolArtifact): Promise<[WitnessMap, Proof]>;
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<PROOF_LENGTH extends number, CircuitOutputType>(witnessMap: WitnessMap, circuitType: ServerProtocolArtifact, convertOutput: (outputWitness: WitnessMap) => CircuitOutputType): Promise<[CircuitOutputType, RecursiveProof<PROOF_LENGTH>]>;
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
- private verifyPreviousRollupProof;
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":"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"}
1
+ {"version":3,"file":"bb_prover.d.ts","sourceRoot":"","sources":["../../src/prover/bb_prover.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,uBAAuB,EAC5B,KAAK,6BAA6B,EAClC,KAAK,0BAA0B,EAC/B,KAAK,uBAAuB,EAE5B,KAAK,mBAAmB,EAEzB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAEL,KAAK,gBAAgB,EACrB,KAAK,6BAA6B,EAClC,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EAIrB,KAAK,yBAAyB,EAC9B,KAAK,iBAAiB,EACtB,6BAA6B,EAC7B,KAAK,2BAA2B,EAEhC,KAAK,EACL,KAAK,+BAA+B,EACpC,sBAAsB,EACtB,cAAc,EACd,eAAe,EACf,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,KAAK,sBAAsB,EAC3B,KAAK,uBAAuB,EAC5B,KAAK,mBAAmB,EAEzB,MAAM,oBAAoB,CAAC;AAI5B,OAAO,EAGL,KAAK,sBAAsB,EAe5B,MAAM,qCAAqC,CAAC;AAsB7C,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAYzD,MAAM,WAAW,cAAe,SAAQ,QAAQ,EAAE,UAAU;IAE1D,aAAa,CAAC,EAAE,sBAAsB,EAAE,CAAC;CAC1C;AAED;;GAEG;AACH,qBAAa,oBAAqB,YAAW,mBAAmB;IAKlD,OAAO,CAAC,MAAM;IAJ1B,OAAO,CAAC,gBAAgB,CAGpB;gBACgB,MAAM,EAAE,cAAc;WAE7B,GAAG,CAAC,MAAM,EAAE,cAAc;IAWvC;;;;OAIG;IACU,kBAAkB,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC,OAAO,sBAAsB,CAAC,CAAC;IAgBlH;;;;OAIG;IACU,kBAAkB,CAC7B,MAAM,EAAE,gBAAgB,GACvB,OAAO,CAAC,eAAe,CAAC,OAAO,6BAA6B,CAAC,CAAC;IAgBjE;;;;OAIG;IACU,WAAW,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,uBAAuB,CAAC;IAMpF;;;;OAIG;IACU,oBAAoB,CAC/B,aAAa,EAAE,0BAA0B,GACxC,OAAO,CAAC,6BAA6B,CAAC,+BAA+B,CAAC,CAAC;IAiC1E;;;;OAIG;IACU,kBAAkB,CAC7B,aAAa,EAAE,uBAAuB,GACrC,OAAO,CAAC,6BAA6B,CAAC,yBAAyB,CAAC,CAAC;IAgBpE;;;;OAIG;IACU,kBAAkB,CAC7B,KAAK,EAAE,gBAAgB,GACtB,OAAO,CAAC,6BAA6B,CAAC,6BAA6B,CAAC,CAAC;IAuBxE;;;;OAIG;IACU,mBAAmB,CAC9B,KAAK,EAAE,iBAAiB,GACvB,OAAO,CAAC,6BAA6B,CAAC,6BAA6B,CAAC,CAAC;IAgBxE;;;;OAIG;IACU,kBAAkB,CAC7B,KAAK,EAAE,gBAAgB,GACtB,OAAO,CAAC,6BAA6B,CAAC,sBAAsB,CAAC,CAAC;IAiBpD,0BAA0B,CACrC,MAAM,EAAE,2BAA2B,GAClC,OAAO,CAAC,6BAA6B,CAAC,yBAAyB,CAAC,CAAC;YAYtD,mBAAmB;YAgBnB,yCAAyC;YAiBzC,mBAAmB;YAiEnB,WAAW;YAuCX,sBAAsB;YAatB,cAAc;IAgC5B;;;;;;;;OAQG;YACW,oBAAoB;IA4ClC;;;;OAIG;IACU,WAAW,CAAC,WAAW,EAAE,sBAAsB,EAAE,KAAK,EAAE,KAAK;IAK7D,cAAc,CAAC,KAAK,EAAE,KAAK,EAAE,eAAe,EAAE,mBAAmB;IAIjE,aAAa,CAAC,eAAe,EAAE,mBAAmB,EAAE,KAAK,EAAE,KAAK;YAI/D,qBAAqB;IAkCnC;;;;OAIG;IACU,4BAA4B,CAAC,WAAW,EAAE,sBAAsB,GAAG,OAAO,CAAC,uBAAuB,CAAC;IAKhH;;;;OAIG;IACU,gBAAgB,CAC3B,KAAK,EAAE,cAAc,CAAC,OAAO,6BAA6B,CAAC,EAC3D,OAAO,EAAE,sBAAsB,EAC/B,EAAE,EAAE,mBAAmB;IAmDzB;;;;OAIG;YACW,gCAAgC;IAsB9C;;;;OAIG;YACW,+BAA+B;IAY7C;;;;;OAKG;YACW,iBAAiB;CAmChC"}