@aztec/bb-prover 0.55.0 → 0.56.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.
@@ -4,12 +4,11 @@ import { AvmVerificationKeyData, EmptyNestedData, NESTED_RECURSIVE_PROOF_LENGTH,
4
4
  import { createDebugLogger } from '@aztec/foundation/log';
5
5
  import { sleep } from '@aztec/foundation/sleep';
6
6
  import { Timer } from '@aztec/foundation/timer';
7
- import { ProtocolCircuitVkIndexes, ProtocolCircuitVks, SimulatedServerCircuitArtifacts, convertBaseParityInputsToWitnessMap, convertBaseParityOutputsFromWitnessMap, convertBlockMergeRollupInputsToWitnessMap, convertBlockMergeRollupOutputsFromWitnessMap, convertBlockRootRollupInputsToWitnessMap, convertBlockRootRollupOutputsFromWitnessMap, convertMergeRollupInputsToWitnessMap, convertMergeRollupOutputsFromWitnessMap, convertPrivateKernelEmptyInputsToWitnessMap, convertPrivateKernelEmptyOutputsFromWitnessMap, convertRootParityInputsToWitnessMap, convertRootParityOutputsFromWitnessMap, convertRootRollupInputsToWitnessMap, convertRootRollupOutputsFromWitnessMap, convertSimulatedBaseRollupInputsToWitnessMap, convertSimulatedBaseRollupOutputsFromWitnessMap, convertSimulatedPrivateKernelEmptyOutputsFromWitnessMap, convertSimulatedPublicTailInputsToWitnessMap, convertSimulatedPublicTailOutputFromWitnessMap, getVKSiblingPath, } from '@aztec/noir-protocol-circuits-types';
7
+ import { ProtocolCircuitVkIndexes, ProtocolCircuitVks, SimulatedServerCircuitArtifacts, convertBaseParityInputsToWitnessMap, convertBaseParityOutputsFromWitnessMap, convertBlockMergeRollupInputsToWitnessMap, convertBlockMergeRollupOutputsFromWitnessMap, convertBlockRootRollupInputsToWitnessMap, convertBlockRootRollupOutputsFromWitnessMap, convertMergeRollupInputsToWitnessMap, convertMergeRollupOutputsFromWitnessMap, convertPrivateKernelEmptyInputsToWitnessMap, convertPrivateKernelEmptyOutputsFromWitnessMap, convertRootParityInputsToWitnessMap, convertRootParityOutputsFromWitnessMap, convertRootRollupInputsToWitnessMap, convertRootRollupOutputsFromWitnessMap, convertSimulatedBaseRollupInputsToWitnessMap, convertSimulatedBaseRollupOutputsFromWitnessMap, convertSimulatedPrivateKernelEmptyOutputsFromWitnessMap, convertSimulatedPublicInnerInputsToWitnessMap, convertSimulatedPublicInnerOutputFromWitnessMap, convertSimulatedPublicMergeInputsToWitnessMap, convertSimulatedPublicMergeOutputFromWitnessMap, convertSimulatedPublicTailInputsToWitnessMap, convertSimulatedPublicTailOutputFromWitnessMap, getVKSiblingPath, } from '@aztec/noir-protocol-circuits-types';
8
8
  import { WASMSimulator, emitCircuitSimulationStats } from '@aztec/simulator';
9
9
  import { trackSpan } from '@aztec/telemetry-client';
10
10
  import { ProverInstrumentation } from '../instrumentation.js';
11
- import { SimulatedPublicKernelArtifactMapping } from '../mappings/mappings.js';
12
- import { mapPublicKernelToCircuitName } from '../stats.js';
11
+ import { mapProtocolArtifactNameToCircuitName } from '../stats.js';
13
12
  /**
14
13
  * A class for use in testing situations (e2e, unit test, etc) and temporarily for assembling a block in the sequencer.
15
14
  * Simulates circuits using the most efficient method and performs no proving.
@@ -24,7 +23,8 @@ let TestCircuitProver = (() => {
24
23
  let _getBlockRootRollupProof_decorators;
25
24
  let _getBlockMergeRollupProof_decorators;
26
25
  let _getRootRollupProof_decorators;
27
- let _getPublicKernelProof_decorators;
26
+ let _getPublicKernelInnerProof_decorators;
27
+ let _getPublicKernelMergeProof_decorators;
28
28
  let _getPublicTailProof_decorators;
29
29
  return _a = class TestCircuitProver {
30
30
  constructor(telemetry, simulationProvider, opts = { proverTestDelayMs: 0 }) {
@@ -143,6 +143,9 @@ let TestCircuitProver = (() => {
143
143
  emitCircuitSimulationStats('block-root-rollup', timer.ms(), input.toBuffer().length, result.toBuffer().length, this.logger);
144
144
  return makePublicInputsAndRecursiveProof(result, makeEmptyRecursiveProof(NESTED_RECURSIVE_PROOF_LENGTH), ProtocolCircuitVks['BlockRootRollupArtifact']);
145
145
  }
146
+ getBlockRootRollupFinalProof(input) {
147
+ return this.getBlockRootRollupProof(input);
148
+ }
146
149
  /**
147
150
  * Simulates the block merge rollup circuit from its inputs.
148
151
  * @param input - Inputs to the circuit.
@@ -174,31 +177,42 @@ let TestCircuitProver = (() => {
174
177
  await this.delay();
175
178
  return makePublicInputsAndRecursiveProof(result, makeEmptyRecursiveProof(NESTED_RECURSIVE_PROOF_LENGTH), ProtocolCircuitVks['RootRollupArtifact']);
176
179
  }
177
- async getPublicKernelProof(kernelRequest) {
180
+ async getPublicKernelInnerProof(inputs) {
178
181
  const timer = new Timer();
179
- const kernelOps = SimulatedPublicKernelArtifactMapping[kernelRequest.type];
180
- if (kernelOps === undefined) {
181
- throw new Error(`Unable to prove for kernel type ${kernelRequest.type}`);
182
- }
183
- const witnessMap = kernelOps.convertInputs(kernelRequest.inputs);
184
- const witness = await this.wasmSimulator.simulateCircuit(witnessMap, SimulatedServerCircuitArtifacts[kernelOps.artifact]);
185
- const result = kernelOps.convertOutputs(witness);
186
- const circuitName = mapPublicKernelToCircuitName(kernelRequest.type);
182
+ const artifact = 'PublicKernelInnerArtifact';
183
+ const circuitName = mapProtocolArtifactNameToCircuitName(artifact);
184
+ const witnessMap = convertSimulatedPublicInnerInputsToWitnessMap(inputs);
185
+ const witness = await this.wasmSimulator.simulateCircuit(witnessMap, SimulatedServerCircuitArtifacts[artifact]);
186
+ const result = convertSimulatedPublicInnerOutputFromWitnessMap(witness);
187
187
  this.instrumentation.recordDuration('simulationDuration', circuitName, timer);
188
- emitCircuitSimulationStats(circuitName, timer.ms(), kernelRequest.inputs.toBuffer().length, result.toBuffer().length, this.logger);
188
+ emitCircuitSimulationStats(circuitName, timer.ms(), inputs.toBuffer().length, result.toBuffer().length, this.logger);
189
189
  await this.delay();
190
- return makePublicInputsAndRecursiveProof(result, makeEmptyRecursiveProof(NESTED_RECURSIVE_PROOF_LENGTH), ProtocolCircuitVks[kernelOps.artifact]);
190
+ return makePublicInputsAndRecursiveProof(result, makeEmptyRecursiveProof(NESTED_RECURSIVE_PROOF_LENGTH), ProtocolCircuitVks[artifact]);
191
191
  }
192
- async getPublicTailProof(kernelRequest) {
192
+ async getPublicKernelMergeProof(inputs) {
193
193
  const timer = new Timer();
194
- const witnessMap = convertSimulatedPublicTailInputsToWitnessMap(kernelRequest.inputs);
194
+ const artifact = 'PublicKernelMergeArtifact';
195
+ const circuitName = mapProtocolArtifactNameToCircuitName(artifact);
196
+ const witnessMap = convertSimulatedPublicMergeInputsToWitnessMap(inputs);
197
+ const witness = await this.wasmSimulator.simulateCircuit(witnessMap, SimulatedServerCircuitArtifacts[artifact]);
198
+ const result = convertSimulatedPublicMergeOutputFromWitnessMap(witness);
199
+ this.instrumentation.recordDuration('simulationDuration', circuitName, timer);
200
+ emitCircuitSimulationStats(circuitName, timer.ms(), inputs.toBuffer().length, result.toBuffer().length, this.logger);
201
+ await this.delay();
202
+ return makePublicInputsAndRecursiveProof(result, makeEmptyRecursiveProof(NESTED_RECURSIVE_PROOF_LENGTH), ProtocolCircuitVks[artifact]);
203
+ }
204
+ async getPublicTailProof(inputs) {
205
+ const timer = new Timer();
206
+ const artifact = 'PublicKernelTailArtifact';
207
+ const circuitName = mapProtocolArtifactNameToCircuitName(artifact);
208
+ const witnessMap = convertSimulatedPublicTailInputsToWitnessMap(inputs);
195
209
  // use WASM here as it is faster for small circuits
196
- const witness = await this.wasmSimulator.simulateCircuit(witnessMap, SimulatedServerCircuitArtifacts['PublicKernelTailArtifact']);
210
+ const witness = await this.wasmSimulator.simulateCircuit(witnessMap, SimulatedServerCircuitArtifacts[artifact]);
197
211
  const result = convertSimulatedPublicTailOutputFromWitnessMap(witness);
198
- this.instrumentation.recordDuration('simulationDuration', 'public-kernel-tail', timer);
199
- emitCircuitSimulationStats('public-kernel-tail', timer.ms(), kernelRequest.inputs.toBuffer().length, result.toBuffer().length, this.logger);
212
+ this.instrumentation.recordDuration('simulationDuration', circuitName, timer);
213
+ emitCircuitSimulationStats(circuitName, timer.ms(), inputs.toBuffer().length, result.toBuffer().length, this.logger);
200
214
  await this.delay();
201
- return makePublicInputsAndRecursiveProof(result, makeEmptyRecursiveProof(NESTED_RECURSIVE_PROOF_LENGTH), ProtocolCircuitVks['PublicKernelTailArtifact']);
215
+ return makePublicInputsAndRecursiveProof(result, makeEmptyRecursiveProof(NESTED_RECURSIVE_PROOF_LENGTH), ProtocolCircuitVks[artifact]);
202
216
  }
203
217
  async getAvmProof(_inputs) {
204
218
  // We can't simulate the AVM because we don't have enough context to do so (e.g., DBs).
@@ -226,7 +240,8 @@ let TestCircuitProver = (() => {
226
240
  _getBlockRootRollupProof_decorators = [trackSpan('TestCircuitProver.getBlockRootRollupProof')];
227
241
  _getBlockMergeRollupProof_decorators = [trackSpan('TestCircuitProver.getBlockMergeRollupProof')];
228
242
  _getRootRollupProof_decorators = [trackSpan('TestCircuitProver.getRootRollupProof')];
229
- _getPublicKernelProof_decorators = [trackSpan('TestCircuitProver.getPublicKernelProof')];
243
+ _getPublicKernelInnerProof_decorators = [trackSpan('TestCircuitProver.getPublicKernelInnerProof')];
244
+ _getPublicKernelMergeProof_decorators = [trackSpan('TestCircuitProver.getPublicKernelMergeProof')];
230
245
  _getPublicTailProof_decorators = [trackSpan('TestCircuitProver.getPublicTailProof')];
231
246
  __esDecorate(_a, null, _getBaseParityProof_decorators, { kind: "method", name: "getBaseParityProof", static: false, private: false, access: { has: obj => "getBaseParityProof" in obj, get: obj => obj.getBaseParityProof }, metadata: _metadata }, null, _instanceExtraInitializers);
232
247
  __esDecorate(_a, null, _getRootParityProof_decorators, { kind: "method", name: "getRootParityProof", static: false, private: false, access: { has: obj => "getRootParityProof" in obj, get: obj => obj.getRootParityProof }, metadata: _metadata }, null, _instanceExtraInitializers);
@@ -235,11 +250,12 @@ let TestCircuitProver = (() => {
235
250
  __esDecorate(_a, null, _getBlockRootRollupProof_decorators, { kind: "method", name: "getBlockRootRollupProof", static: false, private: false, access: { has: obj => "getBlockRootRollupProof" in obj, get: obj => obj.getBlockRootRollupProof }, metadata: _metadata }, null, _instanceExtraInitializers);
236
251
  __esDecorate(_a, null, _getBlockMergeRollupProof_decorators, { kind: "method", name: "getBlockMergeRollupProof", static: false, private: false, access: { has: obj => "getBlockMergeRollupProof" in obj, get: obj => obj.getBlockMergeRollupProof }, metadata: _metadata }, null, _instanceExtraInitializers);
237
252
  __esDecorate(_a, null, _getRootRollupProof_decorators, { kind: "method", name: "getRootRollupProof", static: false, private: false, access: { has: obj => "getRootRollupProof" in obj, get: obj => obj.getRootRollupProof }, metadata: _metadata }, null, _instanceExtraInitializers);
238
- __esDecorate(_a, null, _getPublicKernelProof_decorators, { kind: "method", name: "getPublicKernelProof", static: false, private: false, access: { has: obj => "getPublicKernelProof" in obj, get: obj => obj.getPublicKernelProof }, metadata: _metadata }, null, _instanceExtraInitializers);
253
+ __esDecorate(_a, null, _getPublicKernelInnerProof_decorators, { kind: "method", name: "getPublicKernelInnerProof", static: false, private: false, access: { has: obj => "getPublicKernelInnerProof" in obj, get: obj => obj.getPublicKernelInnerProof }, metadata: _metadata }, null, _instanceExtraInitializers);
254
+ __esDecorate(_a, null, _getPublicKernelMergeProof_decorators, { kind: "method", name: "getPublicKernelMergeProof", static: false, private: false, access: { has: obj => "getPublicKernelMergeProof" in obj, get: obj => obj.getPublicKernelMergeProof }, metadata: _metadata }, null, _instanceExtraInitializers);
239
255
  __esDecorate(_a, null, _getPublicTailProof_decorators, { kind: "method", name: "getPublicTailProof", static: false, private: false, access: { has: obj => "getPublicTailProof" in obj, get: obj => obj.getPublicTailProof }, metadata: _metadata }, null, _instanceExtraInitializers);
240
256
  if (_metadata) Object.defineProperty(_a, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
241
257
  })(),
242
258
  _a;
243
259
  })();
244
260
  export { TestCircuitProver };
245
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdF9jaXJjdWl0X3Byb3Zlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0L3Rlc3RfY2lyY3VpdF9wcm92ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFNTCxpQ0FBaUMsR0FDbEMsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QixPQUFPLEVBRUwsc0JBQXNCLEVBT3RCLGVBQWUsRUFHZiw2QkFBNkIsRUFFN0Isd0JBQXdCLEVBR3hCLHNCQUFzQixFQUV0QixlQUFlLEVBSWYsaUJBQWlCLEVBRWpCLG1CQUFtQixFQUNuQixjQUFjLEVBQ2QsdUJBQXVCLEVBQ3ZCLGtCQUFrQixHQUNuQixNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzFELE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNoRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDaEQsT0FBTyxFQUNMLHdCQUF3QixFQUN4QixrQkFBa0IsRUFFbEIsK0JBQStCLEVBQy9CLG1DQUFtQyxFQUNuQyxzQ0FBc0MsRUFDdEMseUNBQXlDLEVBQ3pDLDRDQUE0QyxFQUM1Qyx3Q0FBd0MsRUFDeEMsMkNBQTJDLEVBQzNDLG9DQUFvQyxFQUNwQyx1Q0FBdUMsRUFDdkMsMkNBQTJDLEVBQzNDLDhDQUE4QyxFQUM5QyxtQ0FBbUMsRUFDbkMsc0NBQXNDLEVBQ3RDLG1DQUFtQyxFQUNuQyxzQ0FBc0MsRUFDdEMsNENBQTRDLEVBQzVDLCtDQUErQyxFQUMvQyx1REFBdUQsRUFDdkQsNENBQTRDLEVBQzVDLDhDQUE4QyxFQUM5QyxnQkFBZ0IsR0FDakIsTUFBTSxxQ0FBcUMsQ0FBQztBQUM3QyxPQUFPLEVBQTJCLGFBQWEsRUFBRSwwQkFBMEIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3RHLE9BQU8sRUFBd0IsU0FBUyxFQUFFLE1BQU0s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
261
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdF9jaXJjdWl0X3Byb3Zlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0L3Rlc3RfY2lyY3VpdF9wcm92ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFJTCxpQ0FBaUMsR0FDbEMsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QixPQUFPLEVBRUwsc0JBQXNCLEVBT3RCLGVBQWUsRUFHZiw2QkFBNkIsRUFFN0Isd0JBQXdCLEVBTXhCLHNCQUFzQixFQUV0QixlQUFlLEVBSWYsaUJBQWlCLEVBR2pCLG1CQUFtQixFQUNuQixjQUFjLEVBQ2QsdUJBQXVCLEVBQ3ZCLGtCQUFrQixHQUNuQixNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzFELE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNoRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDaEQsT0FBTyxFQUNMLHdCQUF3QixFQUN4QixrQkFBa0IsRUFFbEIsK0JBQStCLEVBQy9CLG1DQUFtQyxFQUNuQyxzQ0FBc0MsRUFDdEMseUNBQXlDLEVBQ3pDLDRDQUE0QyxFQUM1Qyx3Q0FBd0MsRUFDeEMsMkNBQTJDLEVBQzNDLG9DQUFvQyxFQUNwQyx1Q0FBdUMsRUFDdkMsMkNBQTJDLEVBQzNDLDhDQUE4QyxFQUM5QyxtQ0FBbUMsRUFDbkMsc0NBQXNDLEVBQ3RDLG1DQUFtQyxFQUNuQyxzQ0FBc0MsRUFDdEMsNENBQTRDLEVBQzVDLCtDQUErQyxFQUMvQyx1REFBdUQsRUFDdkQsNkNBQTZDLEVBQzdDLCtDQUErQyxFQUMvQyw2Q0FBNkMsRUFDN0MsK0NBQStDLEVBQy9DLDRDQUE0QyxFQUM1Qyw4Q0FBOEMsRUFDOUMsZ0JBQWdCLEdBQ2pCLE1BQU0scUNBQXFDLENBQUM7QUFDN0MsT0FBTyxFQUEyQixhQUFhLEVBQUUsMEJBQTBCLEVB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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aztec/bb-prover",
3
- "version": "0.55.0",
3
+ "version": "0.56.0",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": "./dest/index.js"
@@ -59,12 +59,12 @@
59
59
  ]
60
60
  },
61
61
  "dependencies": {
62
- "@aztec/circuit-types": "0.55.0",
63
- "@aztec/circuits.js": "0.55.0",
64
- "@aztec/foundation": "0.55.0",
65
- "@aztec/noir-protocol-circuits-types": "0.55.0",
66
- "@aztec/simulator": "0.55.0",
67
- "@aztec/telemetry-client": "0.55.0",
62
+ "@aztec/circuit-types": "0.56.0",
63
+ "@aztec/circuits.js": "0.56.0",
64
+ "@aztec/foundation": "0.56.0",
65
+ "@aztec/noir-protocol-circuits-types": "0.56.0",
66
+ "@aztec/simulator": "0.56.0",
67
+ "@aztec/telemetry-client": "0.56.0",
68
68
  "@msgpack/msgpack": "^3.0.0-beta2",
69
69
  "@noir-lang/noirc_abi": "portal:../../noir/packages/noirc_abi",
70
70
  "@noir-lang/types": "portal:../../noir/packages/types",
@@ -74,6 +74,7 @@
74
74
  },
75
75
  "devDependencies": {
76
76
  "@aztec/ethereum": "workspace:^",
77
+ "@aztec/types": "workspace:^",
77
78
  "@jest/globals": "^29.5.0",
78
79
  "@types/jest": "^29.5.0",
79
80
  "@types/memdown": "^3.0.0",
package/src/honk.ts CHANGED
@@ -2,7 +2,10 @@ import { type ProtocolArtifact } from '@aztec/noir-protocol-circuits-types';
2
2
 
3
3
  export type UltraHonkFlavor = 'ultra_honk' | 'ultra_keccak_honk';
4
4
 
5
- const UltraKeccakHonkCircuits = ['BlockRootRollupArtifact'] as const;
5
+ const UltraKeccakHonkCircuits = [
6
+ 'BlockRootRollupFinalArtifact',
7
+ 'RootRollupArtifact',
8
+ ] as const satisfies ProtocolArtifact[];
6
9
  type UltraKeccakHonkCircuits = (typeof UltraKeccakHonkCircuits)[number];
7
10
  type UltraHonkCircuits = Exclude<ProtocolArtifact, UltraKeccakHonkCircuits>;
8
11
 
package/src/index.ts CHANGED
@@ -3,3 +3,5 @@ export * from './test/index.js';
3
3
  export * from './verifier/index.js';
4
4
  export * from './config.js';
5
5
  export * from './bb/execute.js';
6
+
7
+ export { type ClientProtocolCircuitVerifier } from '@aztec/circuit-types';
@@ -2,8 +2,6 @@
2
2
  import {
3
3
  type AvmProofAndVerificationKey,
4
4
  type PublicInputsAndRecursiveProof,
5
- type PublicKernelNonTailRequest,
6
- type PublicKernelTailRequest,
7
5
  type ServerCircuitProver,
8
6
  makePublicInputsAndRecursiveProof,
9
7
  } from '@aztec/circuit-types';
@@ -27,7 +25,10 @@ import {
27
25
  type PrivateKernelEmptyInputData,
28
26
  PrivateKernelEmptyInputs,
29
27
  Proof,
28
+ type PublicKernelCircuitPrivateInputs,
30
29
  type PublicKernelCircuitPublicInputs,
30
+ type PublicKernelInnerCircuitPrivateInputs,
31
+ type PublicKernelTailCircuitPrivateInputs,
31
32
  RECURSIVE_PROOF_LENGTH,
32
33
  RecursiveProof,
33
34
  RootParityInput,
@@ -36,6 +37,7 @@ import {
36
37
  type RootRollupPublicInputs,
37
38
  TUBE_PROOF_LENGTH,
38
39
  type TubeInputs,
40
+ type VMCircuitPublicInputs,
39
41
  type VerificationKeyAsFields,
40
42
  type VerificationKeyData,
41
43
  makeRecursiveProofFromBinary,
@@ -59,6 +61,10 @@ import {
59
61
  convertMergeRollupOutputsFromWitnessMap,
60
62
  convertPrivateKernelEmptyInputsToWitnessMap,
61
63
  convertPrivateKernelEmptyOutputsFromWitnessMap,
64
+ convertPublicInnerInputsToWitnessMap,
65
+ convertPublicInnerOutputFromWitnessMap,
66
+ convertPublicMergeInputsToWitnessMap,
67
+ convertPublicMergeOutputFromWitnessMap,
62
68
  convertPublicTailInputsToWitnessMap,
63
69
  convertPublicTailOutputFromWitnessMap,
64
70
  convertRootParityInputsToWitnessMap,
@@ -94,7 +100,6 @@ import {
94
100
  import type { ACVMConfig, BBConfig } from '../config.js';
95
101
  import { type UltraHonkFlavor, getUltraHonkFlavorForCircuit } from '../honk.js';
96
102
  import { ProverInstrumentation } from '../instrumentation.js';
97
- import { PublicKernelArtifactMapping } from '../mappings/mappings.js';
98
103
  import { mapProtocolArtifactNameToCircuitName } from '../stats.js';
99
104
  import { extractAvmVkData, extractVkData } from '../verification_key/verification_key_data.js';
100
105
 
@@ -206,47 +211,70 @@ export class BBNativeRollupProver implements ServerCircuitProver {
206
211
  }
207
212
 
208
213
  /**
209
- * Requests that a public kernel circuit be executed and the proof generated
214
+ * Requests that a public kernel inner circuit be executed and the proof generated
210
215
  * @param kernelRequest - The object encapsulating the request for a proof
211
216
  * @returns The requested circuit's public inputs and proof
212
217
  */
213
- @trackSpan('BBNativeRollupProver.getPublicKernelProof', kernelReq => ({
214
- [Attributes.PROTOCOL_CIRCUIT_NAME]: mapProtocolArtifactNameToCircuitName(
215
- PublicKernelArtifactMapping[kernelReq.type]!.artifact,
216
- ),
217
- }))
218
- public async getPublicKernelProof(
219
- kernelRequest: PublicKernelNonTailRequest,
218
+ @trackSpan('BBNativeRollupProver.getPublicKernelInnerProof', {
219
+ [Attributes.PROTOCOL_CIRCUIT_NAME]: 'public-kernel-inner',
220
+ })
221
+ public async getPublicKernelInnerProof(
222
+ inputs: PublicKernelInnerCircuitPrivateInputs,
223
+ ): Promise<PublicInputsAndRecursiveProof<VMCircuitPublicInputs>> {
224
+ const artifact = 'PublicKernelInnerArtifact';
225
+
226
+ const { circuitOutput, proof } = await this.createRecursiveProof(
227
+ inputs,
228
+ artifact,
229
+ NESTED_RECURSIVE_PROOF_LENGTH,
230
+ convertPublicInnerInputsToWitnessMap,
231
+ convertPublicInnerOutputFromWitnessMap,
232
+ );
233
+
234
+ const verificationKey = await this.getVerificationKeyDataForCircuit(artifact);
235
+
236
+ await this.verifyProof(artifact, proof.binaryProof);
237
+
238
+ return makePublicInputsAndRecursiveProof(circuitOutput, proof, verificationKey);
239
+ }
240
+
241
+ /**
242
+ * Requests that a public kernel merge circuit be executed and the proof generated
243
+ * @param kernelRequest - The object encapsulating the request for a proof
244
+ * @returns The requested circuit's public inputs and proof
245
+ */
246
+ @trackSpan('BBNativeRollupProver.getPublicKernelMergeProof', {
247
+ [Attributes.PROTOCOL_CIRCUIT_NAME]: 'public-kernel-merge',
248
+ })
249
+ public async getPublicKernelMergeProof(
250
+ inputs: PublicKernelCircuitPrivateInputs,
220
251
  ): Promise<PublicInputsAndRecursiveProof<PublicKernelCircuitPublicInputs>> {
221
- const kernelOps = PublicKernelArtifactMapping[kernelRequest.type];
222
- if (kernelOps === undefined) {
223
- throw new Error(`Unable to prove kernel type ${kernelRequest.type}`);
224
- }
252
+ const artifact = 'PublicKernelMergeArtifact';
225
253
 
226
254
  // We may need to convert the recursive proof into fields format
227
- kernelRequest.inputs.previousKernel.proof = await this.ensureValidProof(
228
- kernelRequest.inputs.previousKernel.proof,
229
- kernelOps.artifact,
230
- kernelRequest.inputs.previousKernel.vk,
255
+ inputs.previousKernel.proof = await this.ensureValidProof(
256
+ inputs.previousKernel.proof,
257
+ artifact,
258
+ inputs.previousKernel.vk,
231
259
  );
232
260
 
233
261
  await this.verifyWithKey(
234
- getUltraHonkFlavorForCircuit(kernelOps.artifact),
235
- kernelRequest.inputs.previousKernel.vk,
236
- kernelRequest.inputs.previousKernel.proof.binaryProof,
262
+ getUltraHonkFlavorForCircuit(artifact),
263
+ inputs.previousKernel.vk,
264
+ inputs.previousKernel.proof.binaryProof,
237
265
  );
238
266
 
239
267
  const { circuitOutput, proof } = await this.createRecursiveProof(
240
- kernelRequest.inputs,
241
- kernelOps.artifact,
268
+ inputs,
269
+ artifact,
242
270
  NESTED_RECURSIVE_PROOF_LENGTH,
243
- kernelOps.convertInputs,
244
- kernelOps.convertOutputs,
271
+ convertPublicMergeInputsToWitnessMap,
272
+ convertPublicMergeOutputFromWitnessMap,
245
273
  );
246
274
 
247
- const verificationKey = await this.getVerificationKeyDataForCircuit(kernelOps.artifact);
275
+ const verificationKey = await this.getVerificationKeyDataForCircuit(artifact);
248
276
 
249
- await this.verifyProof(kernelOps.artifact, proof.binaryProof);
277
+ await this.verifyProof(artifact, proof.binaryProof);
250
278
 
251
279
  return makePublicInputsAndRecursiveProof(circuitOutput, proof, verificationKey);
252
280
  }
@@ -257,10 +285,10 @@ export class BBNativeRollupProver implements ServerCircuitProver {
257
285
  * @returns The requested circuit's public inputs and proof
258
286
  */
259
287
  public async getPublicTailProof(
260
- kernelRequest: PublicKernelTailRequest,
288
+ inputs: PublicKernelTailCircuitPrivateInputs,
261
289
  ): Promise<PublicInputsAndRecursiveProof<KernelCircuitPublicInputs>> {
262
290
  const { circuitOutput, proof } = await this.createRecursiveProof(
263
- kernelRequest.inputs,
291
+ inputs,
264
292
  'PublicKernelTailArtifact',
265
293
  NESTED_RECURSIVE_PROOF_LENGTH,
266
294
  convertPublicTailInputsToWitnessMap,
@@ -337,20 +365,43 @@ export class BBNativeRollupProver implements ServerCircuitProver {
337
365
  public async getBlockRootRollupProof(
338
366
  input: BlockRootRollupInputs,
339
367
  ): Promise<PublicInputsAndRecursiveProof<BlockRootOrBlockMergePublicInputs>> {
340
- // TODO(#7346): When batch rollups are integrated, we probably want the below to be this.createRecursiveProof
341
- // since we will no longer be verifying it directly on L1
342
- const { circuitOutput, proof } = await this.createProof(
368
+ const { circuitOutput, proof } = await this.createRecursiveProof(
343
369
  input,
344
370
  'BlockRootRollupArtifact',
371
+ NESTED_RECURSIVE_PROOF_LENGTH,
372
+ convertBlockRootRollupInputsToWitnessMap,
373
+ convertBlockRootRollupOutputsFromWitnessMap,
374
+ );
375
+
376
+ const verificationKey = await this.getVerificationKeyDataForCircuit('BlockRootRollupArtifact');
377
+
378
+ await this.verifyProof('BlockRootRollupArtifact', proof.binaryProof);
379
+
380
+ return makePublicInputsAndRecursiveProof(circuitOutput, proof, verificationKey);
381
+ }
382
+
383
+ /**
384
+ * Simulates the block root rollup circuit from its inputs.
385
+ * Returns a non-recursive proof to verify on L1.
386
+ * @dev TODO(palla/prover): This is a temporary workaround to get the proof to L1 with the old block flow.
387
+ * @param input - Inputs to the circuit.
388
+ * @returns The public inputs as outputs of the simulation.
389
+ */
390
+ public async getBlockRootRollupFinalProof(
391
+ input: BlockRootRollupInputs,
392
+ ): Promise<PublicInputsAndRecursiveProof<BlockRootOrBlockMergePublicInputs>> {
393
+ const { circuitOutput, proof } = await this.createProof(
394
+ input,
395
+ 'BlockRootRollupFinalArtifact',
345
396
  convertBlockRootRollupInputsToWitnessMap,
346
397
  convertBlockRootRollupOutputsFromWitnessMap,
347
398
  );
348
399
 
349
400
  const recursiveProof = makeRecursiveProofFromBinary(proof, NESTED_RECURSIVE_PROOF_LENGTH);
350
401
 
351
- const verificationKey = await this.getVerificationKeyDataForCircuit('BlockRootRollupArtifact');
402
+ const verificationKey = await this.getVerificationKeyDataForCircuit('BlockRootRollupFinalArtifact');
352
403
 
353
- await this.verifyProof('BlockRootRollupArtifact', proof);
404
+ await this.verifyProof('BlockRootRollupFinalArtifact', proof);
354
405
 
355
406
  return makePublicInputsAndRecursiveProof(circuitOutput, recursiveProof, verificationKey);
356
407
  }
package/src/stats.ts CHANGED
@@ -1,8 +1,6 @@
1
1
  import type { CircuitName } from '@aztec/circuit-types/stats';
2
2
  import { type ClientProtocolArtifact, type ServerProtocolArtifact } from '@aztec/noir-protocol-circuits-types';
3
3
 
4
- export { mapPublicKernelToCircuitName } from '@aztec/circuit-types';
5
-
6
4
  export function mapProtocolArtifactNameToCircuitName(
7
5
  artifact: ServerProtocolArtifact | ClientProtocolArtifact,
8
6
  ): CircuitName {
@@ -21,12 +19,10 @@ export function mapProtocolArtifactNameToCircuitName(
21
19
  return 'block-merge-rollup';
22
20
  case 'RootRollupArtifact':
23
21
  return 'root-rollup';
24
- case 'PublicKernelSetupArtifact':
25
- return 'public-kernel-setup';
26
- case 'PublicKernelAppLogicArtifact':
27
- return 'public-kernel-app-logic';
28
- case 'PublicKernelTeardownArtifact':
29
- return 'public-kernel-teardown';
22
+ case 'PublicKernelInnerArtifact':
23
+ return 'public-kernel-inner';
24
+ case 'PublicKernelMergeArtifact':
25
+ return 'public-kernel-merge';
30
26
  case 'PublicKernelTailArtifact':
31
27
  return 'public-kernel-tail';
32
28
  case 'PrivateKernelInitArtifact':
@@ -53,6 +49,8 @@ export function mapProtocolArtifactNameToCircuitName(
53
49
  return 'empty-nested';
54
50
  case 'PrivateKernelEmptyArtifact':
55
51
  return 'private-kernel-empty';
52
+ case 'BlockRootRollupFinalArtifact':
53
+ return 'block-root-rollup-final';
56
54
  default: {
57
55
  const _foo: never = artifact;
58
56
  throw new Error(`Unknown circuit type: ${artifact}`);
package/src/test/index.ts CHANGED
@@ -1,2 +1,3 @@
1
1
  export * from './test_circuit_prover.js';
2
2
  export * from './test_verifier.js';
3
+ export * from './test_avm.js';
@@ -0,0 +1,85 @@
1
+ import {
2
+ AztecAddress,
3
+ ContractStorageRead,
4
+ ContractStorageUpdateRequest,
5
+ Gas,
6
+ GlobalVariables,
7
+ Header,
8
+ L2ToL1Message,
9
+ LogHash,
10
+ MAX_L1_TO_L2_MSG_READ_REQUESTS_PER_CALL,
11
+ MAX_L2_TO_L1_MSGS_PER_CALL,
12
+ MAX_NOTE_HASHES_PER_CALL,
13
+ MAX_NOTE_HASH_READ_REQUESTS_PER_CALL,
14
+ MAX_NULLIFIERS_PER_CALL,
15
+ MAX_NULLIFIER_NON_EXISTENT_READ_REQUESTS_PER_CALL,
16
+ MAX_NULLIFIER_READ_REQUESTS_PER_CALL,
17
+ MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL,
18
+ MAX_PUBLIC_DATA_READS_PER_CALL,
19
+ MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_CALL,
20
+ MAX_UNENCRYPTED_LOGS_PER_CALL,
21
+ NoteHash,
22
+ Nullifier,
23
+ PublicCircuitPublicInputs,
24
+ PublicInnerCallRequest,
25
+ ReadRequest,
26
+ RevertCode,
27
+ TreeLeafReadRequest,
28
+ } from '@aztec/circuits.js';
29
+ import { computeVarArgsHash } from '@aztec/circuits.js/hash';
30
+ import { padArrayEnd } from '@aztec/foundation/collection';
31
+ import { type PublicExecutionResult } from '@aztec/simulator';
32
+
33
+ // TODO: pub somewhere more usable - copied from abstract phase manager
34
+ export function getPublicInputs(result: PublicExecutionResult): PublicCircuitPublicInputs {
35
+ return PublicCircuitPublicInputs.from({
36
+ callContext: result.executionRequest.callContext,
37
+ proverAddress: AztecAddress.ZERO,
38
+ argsHash: computeVarArgsHash(result.executionRequest.args),
39
+ noteHashes: padArrayEnd(result.noteHashes, NoteHash.empty(), MAX_NOTE_HASHES_PER_CALL),
40
+ nullifiers: padArrayEnd(result.nullifiers, Nullifier.empty(), MAX_NULLIFIERS_PER_CALL),
41
+ l2ToL1Msgs: padArrayEnd(result.l2ToL1Messages, L2ToL1Message.empty(), MAX_L2_TO_L1_MSGS_PER_CALL),
42
+ startSideEffectCounter: result.startSideEffectCounter,
43
+ endSideEffectCounter: result.endSideEffectCounter,
44
+ returnsHash: computeVarArgsHash(result.returnValues),
45
+ noteHashReadRequests: padArrayEnd(
46
+ result.noteHashReadRequests,
47
+ TreeLeafReadRequest.empty(),
48
+ MAX_NOTE_HASH_READ_REQUESTS_PER_CALL,
49
+ ),
50
+ nullifierReadRequests: padArrayEnd(
51
+ result.nullifierReadRequests,
52
+ ReadRequest.empty(),
53
+ MAX_NULLIFIER_READ_REQUESTS_PER_CALL,
54
+ ),
55
+ nullifierNonExistentReadRequests: padArrayEnd(
56
+ result.nullifierNonExistentReadRequests,
57
+ ReadRequest.empty(),
58
+ MAX_NULLIFIER_NON_EXISTENT_READ_REQUESTS_PER_CALL,
59
+ ),
60
+ l1ToL2MsgReadRequests: padArrayEnd(
61
+ result.l1ToL2MsgReadRequests,
62
+ TreeLeafReadRequest.empty(),
63
+ MAX_L1_TO_L2_MSG_READ_REQUESTS_PER_CALL,
64
+ ),
65
+ contractStorageReads: padArrayEnd(
66
+ result.contractStorageReads,
67
+ ContractStorageRead.empty(),
68
+ MAX_PUBLIC_DATA_READS_PER_CALL,
69
+ ),
70
+ contractStorageUpdateRequests: padArrayEnd(
71
+ result.contractStorageUpdateRequests,
72
+ ContractStorageUpdateRequest.empty(),
73
+ MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_CALL,
74
+ ),
75
+ publicCallRequests: padArrayEnd([], PublicInnerCallRequest.empty(), MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL),
76
+ unencryptedLogsHashes: padArrayEnd(result.unencryptedLogsHashes, LogHash.empty(), MAX_UNENCRYPTED_LOGS_PER_CALL),
77
+ historicalHeader: Header.empty(),
78
+ globalVariables: GlobalVariables.empty(),
79
+ startGasLeft: Gas.from(result.startGasLeft),
80
+ endGasLeft: Gas.from(result.endGasLeft),
81
+ transactionFee: result.transactionFee,
82
+ // TODO(@just-mitch): need better mapping from simulator to revert code.
83
+ revertCode: result.reverted ? RevertCode.APP_LOGIC_REVERTED : RevertCode.OK,
84
+ });
85
+ }