@aztec/prover-client 0.55.1 → 0.57.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 (51) hide show
  1. package/dest/index.d.ts +1 -1
  2. package/dest/index.d.ts.map +1 -1
  3. package/dest/mocks/fixtures.d.ts.map +1 -1
  4. package/dest/mocks/fixtures.js +6 -27
  5. package/dest/mocks/test_context.d.ts +9 -10
  6. package/dest/mocks/test_context.d.ts.map +1 -1
  7. package/dest/mocks/test_context.js +13 -15
  8. package/dest/orchestrator/block-building-helpers.d.ts +12 -3
  9. package/dest/orchestrator/block-building-helpers.d.ts.map +1 -1
  10. package/dest/orchestrator/block-building-helpers.js +34 -32
  11. package/dest/orchestrator/{proving-state.d.ts → block-proving-state.d.ts} +19 -16
  12. package/dest/orchestrator/block-proving-state.d.ts.map +1 -0
  13. package/dest/orchestrator/block-proving-state.js +147 -0
  14. package/dest/orchestrator/epoch-proving-state.d.ts +63 -0
  15. package/dest/orchestrator/epoch-proving-state.d.ts.map +1 -0
  16. package/dest/orchestrator/epoch-proving-state.js +143 -0
  17. package/dest/orchestrator/orchestrator.d.ts +33 -15
  18. package/dest/orchestrator/orchestrator.d.ts.map +1 -1
  19. package/dest/orchestrator/orchestrator.js +315 -172
  20. package/dest/orchestrator/tx-proving-state.d.ts +3 -2
  21. package/dest/orchestrator/tx-proving-state.d.ts.map +1 -1
  22. package/dest/orchestrator/tx-proving-state.js +54 -26
  23. package/dest/prover-agent/memory-proving-queue.d.ts +11 -5
  24. package/dest/prover-agent/memory-proving-queue.d.ts.map +1 -1
  25. package/dest/prover-agent/memory-proving-queue.js +16 -6
  26. package/dest/prover-agent/prover-agent.d.ts.map +1 -1
  27. package/dest/prover-agent/prover-agent.js +10 -10
  28. package/dest/prover-agent/rpc.d.ts.map +1 -1
  29. package/dest/prover-agent/rpc.js +8 -2
  30. package/dest/test/mock_prover.d.ts +6 -4
  31. package/dest/test/mock_prover.d.ts.map +1 -1
  32. package/dest/test/mock_prover.js +9 -3
  33. package/dest/tx-prover/tx-prover.d.ts +3 -3
  34. package/dest/tx-prover/tx-prover.d.ts.map +1 -1
  35. package/dest/tx-prover/tx-prover.js +1 -1
  36. package/package.json +15 -11
  37. package/src/index.ts +1 -1
  38. package/src/mocks/fixtures.ts +5 -49
  39. package/src/mocks/test_context.ts +15 -20
  40. package/src/orchestrator/block-building-helpers.ts +90 -57
  41. package/src/orchestrator/{proving-state.ts → block-proving-state.ts} +29 -53
  42. package/src/orchestrator/epoch-proving-state.ts +221 -0
  43. package/src/orchestrator/orchestrator.ts +494 -292
  44. package/src/orchestrator/tx-proving-state.ts +63 -27
  45. package/src/prover-agent/memory-proving-queue.ts +31 -16
  46. package/src/prover-agent/prover-agent.ts +11 -9
  47. package/src/prover-agent/rpc.ts +9 -0
  48. package/src/test/mock_prover.ts +23 -1
  49. package/src/tx-prover/tx-prover.ts +4 -4
  50. package/dest/orchestrator/proving-state.d.ts.map +0 -1
  51. package/dest/orchestrator/proving-state.js +0 -170
@@ -3,8 +3,8 @@ import {
3
3
  type AvmProvingRequest,
4
4
  type MerkleTreeId,
5
5
  type ProcessedTx,
6
+ ProvingRequestType,
6
7
  type PublicKernelRequest,
7
- PublicKernelType,
8
8
  } from '@aztec/circuit-types';
9
9
  import {
10
10
  type AppendOnlyTreeSnapshot,
@@ -14,6 +14,7 @@ import {
14
14
  type RECURSIVE_PROOF_LENGTH,
15
15
  type RecursiveProof,
16
16
  type VerificationKeyData,
17
+ makeEmptyProof,
17
18
  } from '@aztec/circuits.js';
18
19
 
19
20
  export enum TX_PROVING_CODE {
@@ -25,7 +26,7 @@ export enum TX_PROVING_CODE {
25
26
  export type PublicFunction = {
26
27
  vmRequest: AvmProvingRequest | undefined;
27
28
  vmProof: Proof | undefined;
28
- previousProofType: PublicKernelType;
29
+ previousProofType: ProvingRequestType;
29
30
  previousKernelProven: boolean;
30
31
  publicKernelRequest: PublicKernelRequest;
31
32
  };
@@ -35,6 +36,7 @@ export type PublicFunction = {
35
36
  export type TxProvingInstruction = {
36
37
  code: TX_PROVING_CODE;
37
38
  function: PublicFunction | undefined;
39
+ functionIndex?: number;
38
40
  };
39
41
 
40
42
  /**
@@ -50,20 +52,38 @@ export class TxProvingState {
50
52
  public readonly baseRollupInputs: BaseRollupInputs,
51
53
  public readonly treeSnapshots: Map<MerkleTreeId, AppendOnlyTreeSnapshot>,
52
54
  ) {
53
- let previousProofType = PublicKernelType.NON_PUBLIC;
55
+ let previousProofType = ProvingRequestType.TUBE_PROOF;
54
56
  for (let i = 0; i < processedTx.publicProvingRequests.length; i++) {
55
57
  const provingRequest = processedTx.publicProvingRequests[i];
56
- const kernelRequest = provingRequest.type === AVM_REQUEST ? provingRequest.kernelRequest : provingRequest;
58
+ const publicKernelRequest = provingRequest.type === AVM_REQUEST ? provingRequest.kernelRequest : provingRequest;
57
59
  const vmRequest = provingRequest.type === AVM_REQUEST ? provingRequest : undefined;
60
+ // TODO(#7124): Remove this temporary hack.
61
+ // There's no previous kernel for the first inner kernel in a chain of AvmProvingRequests.
62
+ // Setting its previousKernelProven to be true so that it will be ready once the vm proof is generated.
63
+ const previousKernelProven = !!vmRequest && previousProofType !== ProvingRequestType.PUBLIC_KERNEL_INNER;
64
+ const vmProof = provingRequest.type === ProvingRequestType.PUBLIC_KERNEL_TAIL ? makeEmptyProof() : undefined;
58
65
  const publicFunction: PublicFunction = {
59
66
  vmRequest,
60
- vmProof: undefined,
67
+ vmProof,
61
68
  previousProofType,
62
- previousKernelProven: false,
63
- publicKernelRequest: kernelRequest,
69
+ previousKernelProven,
70
+ publicKernelRequest: {
71
+ type: publicKernelRequest.type,
72
+ // We take a deep copy (clone) of the inputs to be modified here and passed to the prover.
73
+ // bb-prover will also modify the inputs by reference.
74
+ inputs: publicKernelRequest.inputs.clone(),
75
+ } as PublicKernelRequest,
64
76
  };
65
77
  this.publicFunctions.push(publicFunction);
66
- previousProofType = kernelRequest.type;
78
+ previousProofType = publicKernelRequest.type;
79
+ }
80
+
81
+ if (this.publicFunctions.length > 0) {
82
+ // The first merge kernel takes the tube proof.
83
+ const firstKernelIndex = this.publicFunctions.findIndex(
84
+ fn => fn.publicKernelRequest.type === ProvingRequestType.PUBLIC_KERNEL_MERGE,
85
+ );
86
+ this.publicFunctions[firstKernelIndex].previousProofType = ProvingRequestType.TUBE_PROOF;
67
87
  }
68
88
  }
69
89
 
@@ -75,29 +95,44 @@ export class TxProvingState {
75
95
  verificationKey: VerificationKeyData,
76
96
  ): TxProvingInstruction {
77
97
  const kernelRequest = this.getPublicFunctionState(provenIndex).publicKernelRequest;
78
- const nextKernelIndex = provenIndex + 1;
79
- if (nextKernelIndex >= this.publicFunctions.length) {
98
+ const provenIsInner = kernelRequest.type === ProvingRequestType.PUBLIC_KERNEL_INNER;
99
+ // If the proven request is not an inner kernel, its next kernel should not be an inner kernel either.
100
+ const nextFunctionIndex = provenIsInner
101
+ ? provenIndex + 1
102
+ : this.publicFunctions.findIndex(
103
+ (fn, i) => i > provenIndex && fn.publicKernelRequest.type !== ProvingRequestType.PUBLIC_KERNEL_INNER,
104
+ );
105
+ if (nextFunctionIndex >= this.publicFunctions.length || nextFunctionIndex === -1) {
80
106
  // The next kernel index is greater than our set of functions, we are done!
81
107
  return { code: TX_PROVING_CODE.COMPLETED, function: undefined };
82
108
  }
83
109
 
84
110
  // There is more work to do, are we ready?
85
- const nextFunction = this.publicFunctions[nextKernelIndex];
86
-
87
- // pass both the proof and verification key forward to the next circuit
88
- nextFunction.publicKernelRequest.inputs.previousKernel.proof = proof;
89
- nextFunction.publicKernelRequest.inputs.previousKernel.vk = verificationKey;
111
+ const nextFunction = this.publicFunctions[nextFunctionIndex];
112
+
113
+ if (provenIsInner && nextFunction.publicKernelRequest.type !== ProvingRequestType.PUBLIC_KERNEL_INNER) {
114
+ // TODO(#7124): Remove this temporary hack.
115
+ // If the proven request is inner (with vm proof) and the next one is regular kernel, set the vmProof to be
116
+ // not undefined.
117
+ // This should eventually be a real vm proof of the entire enqueued call.
118
+ nextFunction.vmProof = makeEmptyProof();
119
+ } else {
120
+ // pass both the proof and verification key forward to the next circuit
121
+ nextFunction.publicKernelRequest.inputs.previousKernel.proof = proof;
122
+ nextFunction.publicKernelRequest.inputs.previousKernel.vk = verificationKey;
123
+
124
+ // We need to update this so the state machine knows this proof is ready
125
+ nextFunction.previousKernelProven = true;
126
+ nextFunction.previousProofType = kernelRequest.type;
127
+ }
90
128
 
91
- // We need to update this so the state machine knows this proof is ready
92
- nextFunction.previousKernelProven = true;
93
- nextFunction.previousProofType = kernelRequest.type;
94
- if (nextFunction.vmProof === undefined) {
129
+ if (nextFunction.vmProof === undefined || !nextFunction.previousKernelProven) {
95
130
  // The VM proof for the next function is not ready
96
131
  return { code: TX_PROVING_CODE.NOT_READY, function: undefined };
97
132
  }
98
133
 
99
134
  // The VM proof is ready, we can continue
100
- return { code: TX_PROVING_CODE.READY, function: nextFunction };
135
+ return { code: TX_PROVING_CODE.READY, function: nextFunction, functionIndex: nextFunctionIndex };
101
136
  }
102
137
 
103
138
  // Updates the transaction's proving state after completion of a tube proof
@@ -106,14 +141,16 @@ export class TxProvingState {
106
141
  proof: RecursiveProof<typeof RECURSIVE_PROOF_LENGTH>,
107
142
  verificationKey: VerificationKeyData,
108
143
  ): TxProvingInstruction {
109
- const nextKernelIndex = 0;
110
- if (nextKernelIndex >= this.publicFunctions.length) {
111
- // The next kernel index is greater than our set of functions, we are done!
144
+ const nextFunctionIndex = this.publicFunctions.findIndex(
145
+ (fn, i) => i > 0 && fn.previousProofType === ProvingRequestType.TUBE_PROOF,
146
+ );
147
+ if (nextFunctionIndex === -1) {
148
+ // There are no public functions to be processed, we are done!
112
149
  return { code: TX_PROVING_CODE.COMPLETED, function: undefined };
113
150
  }
114
151
 
115
152
  // There is more work to do, are we ready?
116
- const nextFunction = this.publicFunctions[nextKernelIndex];
153
+ const nextFunction = this.publicFunctions[nextFunctionIndex];
117
154
 
118
155
  // pass both the proof and verification key forward to the next circuit
119
156
  nextFunction.publicKernelRequest.inputs.previousKernel.proof = proof;
@@ -121,14 +158,13 @@ export class TxProvingState {
121
158
 
122
159
  // We need to update this so the state machine knows this proof is ready
123
160
  nextFunction.previousKernelProven = true;
124
- nextFunction.previousProofType = PublicKernelType.NON_PUBLIC;
125
161
  if (nextFunction.vmProof === undefined) {
126
162
  // The VM proof for the next function is not ready
127
163
  return { code: TX_PROVING_CODE.NOT_READY, function: undefined };
128
164
  }
129
165
 
130
166
  // The VM proof is ready, we can continue
131
- return { code: TX_PROVING_CODE.READY, function: nextFunction };
167
+ return { code: TX_PROVING_CODE.READY, function: nextFunction, functionIndex: nextFunctionIndex };
132
168
  }
133
169
 
134
170
  // Updates the transaction's proving state after completion of a VM proof
@@ -142,7 +178,7 @@ export class TxProvingState {
142
178
  return { code: TX_PROVING_CODE.NOT_READY, function: undefined };
143
179
  }
144
180
  // The previous kernel is ready so we can prove this kernel
145
- return { code: TX_PROVING_CODE.READY, function: provenFunction };
181
+ return { code: TX_PROVING_CODE.READY, function: provenFunction, functionIndex: provenIndex };
146
182
  }
147
183
 
148
184
  // Returns the public function state at the given index
@@ -6,8 +6,6 @@ import {
6
6
  type ProvingRequestResult,
7
7
  ProvingRequestType,
8
8
  type PublicInputsAndRecursiveProof,
9
- type PublicKernelNonTailRequest,
10
- type PublicKernelTailRequest,
11
9
  type ServerCircuitProver,
12
10
  } from '@aztec/circuit-types';
13
11
  import type {
@@ -18,11 +16,15 @@ import type {
18
16
  BlockMergeRollupInputs,
19
17
  BlockRootOrBlockMergePublicInputs,
20
18
  BlockRootRollupInputs,
19
+ EmptyBlockRootRollupInputs,
21
20
  KernelCircuitPublicInputs,
22
21
  MergeRollupInputs,
23
22
  NESTED_RECURSIVE_PROOF_LENGTH,
24
23
  PrivateKernelEmptyInputData,
24
+ PublicKernelCircuitPrivateInputs,
25
25
  PublicKernelCircuitPublicInputs,
26
+ PublicKernelInnerCircuitPrivateInputs,
27
+ PublicKernelTailCircuitPrivateInputs,
26
28
  RECURSIVE_PROOF_LENGTH,
27
29
  RecursiveProof,
28
30
  RootParityInput,
@@ -30,6 +32,7 @@ import type {
30
32
  RootRollupInputs,
31
33
  RootRollupPublicInputs,
32
34
  TubeInputs,
35
+ VMCircuitPublicInputs,
33
36
  VerificationKeyData,
34
37
  } from '@aztec/circuits.js';
35
38
  import { randomBytes } from '@aztec/foundation/crypto';
@@ -349,6 +352,14 @@ export class MemoryProvingQueue implements ServerCircuitProver, ProvingJobSource
349
352
  return this.enqueue({ type: ProvingRequestType.BLOCK_ROOT_ROLLUP, inputs: input }, signal, epochNumber);
350
353
  }
351
354
 
355
+ getEmptyBlockRootRollupProof(
356
+ input: EmptyBlockRootRollupInputs,
357
+ signal?: AbortSignal,
358
+ epochNumber?: number,
359
+ ): Promise<PublicInputsAndRecursiveProof<BlockRootOrBlockMergePublicInputs>> {
360
+ return this.enqueue({ type: ProvingRequestType.EMPTY_BLOCK_ROOT_ROLLUP, inputs: input }, signal, epochNumber);
361
+ }
362
+
352
363
  /**
353
364
  * Creates a proof for the given input.
354
365
  * @param input - Input to the circuit.
@@ -374,19 +385,27 @@ export class MemoryProvingQueue implements ServerCircuitProver, ProvingJobSource
374
385
  }
375
386
 
376
387
  /**
377
- * Create a public kernel proof.
388
+ * Create a public kernel inner proof.
389
+ * @param kernelRequest - Object containing the details of the proof required
390
+ */
391
+ getPublicKernelInnerProof(
392
+ inputs: PublicKernelInnerCircuitPrivateInputs,
393
+ signal?: AbortSignal,
394
+ epochNumber?: number,
395
+ ): Promise<PublicInputsAndRecursiveProof<VMCircuitPublicInputs>> {
396
+ return this.enqueue({ type: ProvingRequestType.PUBLIC_KERNEL_INNER, inputs }, signal, epochNumber);
397
+ }
398
+
399
+ /**
400
+ * Create a public kernel merge proof.
378
401
  * @param kernelRequest - Object containing the details of the proof required
379
402
  */
380
- getPublicKernelProof(
381
- kernelRequest: PublicKernelNonTailRequest,
403
+ getPublicKernelMergeProof(
404
+ inputs: PublicKernelCircuitPrivateInputs,
382
405
  signal?: AbortSignal,
383
406
  epochNumber?: number,
384
407
  ): Promise<PublicInputsAndRecursiveProof<PublicKernelCircuitPublicInputs>> {
385
- return this.enqueue(
386
- { type: ProvingRequestType.PUBLIC_KERNEL_NON_TAIL, kernelType: kernelRequest.type, inputs: kernelRequest.inputs },
387
- signal,
388
- epochNumber,
389
- );
408
+ return this.enqueue({ type: ProvingRequestType.PUBLIC_KERNEL_MERGE, inputs }, signal, epochNumber);
390
409
  }
391
410
 
392
411
  /**
@@ -394,15 +413,11 @@ export class MemoryProvingQueue implements ServerCircuitProver, ProvingJobSource
394
413
  * @param kernelRequest - Object containing the details of the proof required
395
414
  */
396
415
  getPublicTailProof(
397
- kernelRequest: PublicKernelTailRequest,
416
+ inputs: PublicKernelTailCircuitPrivateInputs,
398
417
  signal?: AbortSignal,
399
418
  epochNumber?: number,
400
419
  ): Promise<PublicInputsAndRecursiveProof<KernelCircuitPublicInputs>> {
401
- return this.enqueue(
402
- { type: ProvingRequestType.PUBLIC_KERNEL_TAIL, kernelType: kernelRequest.type, inputs: kernelRequest.inputs },
403
- signal,
404
- epochNumber,
405
- );
420
+ return this.enqueue({ type: ProvingRequestType.PUBLIC_KERNEL_TAIL, inputs }, signal, epochNumber);
406
421
  }
407
422
 
408
423
  /**
@@ -161,18 +161,16 @@ export class ProverAgent {
161
161
  return this.circuitProver.getAvmProof(inputs);
162
162
  }
163
163
 
164
- case ProvingRequestType.PUBLIC_KERNEL_NON_TAIL: {
165
- return this.circuitProver.getPublicKernelProof({
166
- type: request.kernelType,
167
- inputs,
168
- });
164
+ case ProvingRequestType.PUBLIC_KERNEL_INNER: {
165
+ return this.circuitProver.getPublicKernelInnerProof(inputs);
166
+ }
167
+
168
+ case ProvingRequestType.PUBLIC_KERNEL_MERGE: {
169
+ return this.circuitProver.getPublicKernelMergeProof(inputs);
169
170
  }
170
171
 
171
172
  case ProvingRequestType.PUBLIC_KERNEL_TAIL: {
172
- return this.circuitProver.getPublicTailProof({
173
- type: request.kernelType,
174
- inputs,
175
- });
173
+ return this.circuitProver.getPublicTailProof(inputs);
176
174
  }
177
175
 
178
176
  case ProvingRequestType.BASE_ROLLUP: {
@@ -183,6 +181,10 @@ export class ProverAgent {
183
181
  return this.circuitProver.getMergeRollupProof(inputs);
184
182
  }
185
183
 
184
+ case ProvingRequestType.EMPTY_BLOCK_ROOT_ROLLUP: {
185
+ return this.circuitProver.getEmptyBlockRootRollupProof(inputs);
186
+ }
187
+
186
188
  case ProvingRequestType.BLOCK_ROOT_ROLLUP: {
187
189
  return this.circuitProver.getBlockRootRollupProof(inputs);
188
190
  }
@@ -9,6 +9,7 @@ import {
9
9
  BlockMergeRollupInputs,
10
10
  BlockRootOrBlockMergePublicInputs,
11
11
  BlockRootRollupInputs,
12
+ EmptyBlockRootRollupInputs,
12
13
  EthAddress,
13
14
  Fr,
14
15
  Header,
@@ -19,6 +20,7 @@ import {
19
20
  Proof,
20
21
  PublicKernelCircuitPrivateInputs,
21
22
  PublicKernelCircuitPublicInputs,
23
+ PublicKernelInnerCircuitPrivateInputs,
22
24
  PublicKernelTailCircuitPrivateInputs,
23
25
  RecursiveProof,
24
26
  RootParityInput,
@@ -26,6 +28,7 @@ import {
26
28
  RootRollupInputs,
27
29
  RootRollupPublicInputs,
28
30
  TubeInputs,
31
+ VMCircuitPublicInputs,
29
32
  VerificationKeyData,
30
33
  } from '@aztec/circuits.js';
31
34
  import { createJsonRpcClient, makeFetch } from '@aztec/foundation/json-rpc/client';
@@ -51,6 +54,8 @@ export function createProvingJobSourceServer(queue: ProvingJobSource): JsonRpcSe
51
54
  Proof,
52
55
  ProvingError,
53
56
  PrivateKernelEmptyInputData,
57
+ VMCircuitPublicInputs,
58
+ PublicKernelInnerCircuitPrivateInputs,
54
59
  PublicKernelCircuitPrivateInputs,
55
60
  PublicKernelCircuitPublicInputs,
56
61
  PublicKernelTailCircuitPrivateInputs,
@@ -64,6 +69,7 @@ export function createProvingJobSourceServer(queue: ProvingJobSource): JsonRpcSe
64
69
  BlockRootOrBlockMergePublicInputs,
65
70
  BlockMergeRollupInputs,
66
71
  BlockRootRollupInputs,
72
+ EmptyBlockRootRollupInputs,
67
73
  },
68
74
  {},
69
75
  );
@@ -90,6 +96,8 @@ export function createProvingJobSourceClient(
90
96
  Proof,
91
97
  ProvingError,
92
98
  PrivateKernelEmptyInputData,
99
+ VMCircuitPublicInputs,
100
+ PublicKernelInnerCircuitPrivateInputs,
93
101
  PublicKernelCircuitPrivateInputs,
94
102
  PublicKernelCircuitPublicInputs,
95
103
  PublicKernelTailCircuitPrivateInputs,
@@ -103,6 +111,7 @@ export function createProvingJobSourceClient(
103
111
  BlockRootOrBlockMergePublicInputs,
104
112
  BlockMergeRollupInputs,
105
113
  BlockRootRollupInputs,
114
+ EmptyBlockRootRollupInputs,
106
115
  },
107
116
  {},
108
117
  false,
@@ -13,6 +13,7 @@ import {
13
13
  RECURSIVE_PROOF_LENGTH,
14
14
  type RecursiveProof,
15
15
  type RootRollupPublicInputs,
16
+ type VMCircuitPublicInputs,
16
17
  VerificationKeyData,
17
18
  makeEmptyProof,
18
19
  makeRecursiveProof,
@@ -24,6 +25,7 @@ import {
24
25
  makePublicKernelCircuitPublicInputs,
25
26
  makeRootParityInput,
26
27
  makeRootRollupPublicInputs,
28
+ makeVMCircuitPublicInputs,
27
29
  } from '@aztec/circuits.js/testing';
28
30
 
29
31
  export class MockProver implements ServerCircuitProver {
@@ -76,6 +78,16 @@ export class MockProver implements ServerCircuitProver {
76
78
  );
77
79
  }
78
80
 
81
+ getEmptyBlockRootRollupProof(): Promise<PublicInputsAndRecursiveProof<BlockRootOrBlockMergePublicInputs>> {
82
+ return Promise.resolve(
83
+ makePublicInputsAndRecursiveProof(
84
+ makeBlockRootOrBlockMergeRollupPublicInputs(),
85
+ makeRecursiveProof(RECURSIVE_PROOF_LENGTH),
86
+ VerificationKeyData.makeFake(),
87
+ ),
88
+ );
89
+ }
90
+
79
91
  getBlockRootRollupProof(): Promise<PublicInputsAndRecursiveProof<BlockRootOrBlockMergePublicInputs>> {
80
92
  return Promise.resolve(
81
93
  makePublicInputsAndRecursiveProof(
@@ -106,7 +118,17 @@ export class MockProver implements ServerCircuitProver {
106
118
  );
107
119
  }
108
120
 
109
- getPublicKernelProof(): Promise<PublicInputsAndRecursiveProof<PublicKernelCircuitPublicInputs>> {
121
+ getPublicKernelInnerProof(): Promise<PublicInputsAndRecursiveProof<VMCircuitPublicInputs>> {
122
+ return Promise.resolve(
123
+ makePublicInputsAndRecursiveProof(
124
+ makeVMCircuitPublicInputs(),
125
+ makeRecursiveProof(RECURSIVE_PROOF_LENGTH),
126
+ VerificationKeyData.makeFake(),
127
+ ),
128
+ );
129
+ }
130
+
131
+ getPublicKernelMergeProof(): Promise<PublicInputsAndRecursiveProof<PublicKernelCircuitPublicInputs>> {
110
132
  return Promise.resolve(
111
133
  makePublicInputsAndRecursiveProof(
112
134
  makePublicKernelCircuitPublicInputs(),
@@ -1,7 +1,7 @@
1
1
  import { BBNativeRollupProver, TestCircuitProver } from '@aztec/bb-prover';
2
2
  import {
3
- type BlockProver,
4
- type ProverClient,
3
+ type EpochProver,
4
+ type EpochProverManager,
5
5
  type ProvingJobSource,
6
6
  type ServerCircuitProver,
7
7
  } from '@aztec/circuit-types/interfaces';
@@ -19,7 +19,7 @@ import { ProverAgent } from '../prover-agent/prover-agent.js';
19
19
  * A prover factory.
20
20
  * TODO(palla/prover-node): Rename this class
21
21
  */
22
- export class TxProver implements ProverClient {
22
+ export class TxProver implements EpochProverManager {
23
23
  private queue: MemoryProvingQueue;
24
24
  private running = false;
25
25
 
@@ -33,7 +33,7 @@ export class TxProver implements ProverClient {
33
33
  this.queue = new MemoryProvingQueue(telemetry, config.proverJobTimeoutMs, config.proverJobPollIntervalMs);
34
34
  }
35
35
 
36
- public createBlockProver(db: MerkleTreeOperations): BlockProver {
36
+ public createEpochProver(db: MerkleTreeOperations): EpochProver {
37
37
  return new ProvingOrchestrator(db, this.queue, this.telemetry, this.config.proverId);
38
38
  }
39
39
 
@@ -1 +0,0 @@
1
- {"version":3,"file":"proving-state.d.ts","sourceRoot":"","sources":["../../src/orchestrator/proving-state.ts"],"names":[],"mappings":"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"}
@@ -1,170 +0,0 @@
1
- var PROVING_STATE_LIFECYCLE;
2
- (function (PROVING_STATE_LIFECYCLE) {
3
- PROVING_STATE_LIFECYCLE[PROVING_STATE_LIFECYCLE["PROVING_STATE_CREATED"] = 0] = "PROVING_STATE_CREATED";
4
- PROVING_STATE_LIFECYCLE[PROVING_STATE_LIFECYCLE["PROVING_STATE_FULL"] = 1] = "PROVING_STATE_FULL";
5
- PROVING_STATE_LIFECYCLE[PROVING_STATE_LIFECYCLE["PROVING_STATE_RESOLVED"] = 2] = "PROVING_STATE_RESOLVED";
6
- PROVING_STATE_LIFECYCLE[PROVING_STATE_LIFECYCLE["PROVING_STATE_REJECTED"] = 3] = "PROVING_STATE_REJECTED";
7
- })(PROVING_STATE_LIFECYCLE || (PROVING_STATE_LIFECYCLE = {}));
8
- /**
9
- * The current state of the proving schedule. Contains the raw inputs (txs) and intermediate state to generate every constituent proof in the tree.
10
- * Carries an identifier so we can identify if the proving state is discarded and a new one started.
11
- * Captures resolve and reject callbacks to provide a promise base interface to the consumer of our proving.
12
- */
13
- export class ProvingState {
14
- constructor(totalNumTxs, completionCallback, rejectionCallback, globalVariables, newL1ToL2Messages, numRootParityInputs, messageTreeSnapshot, messageTreeRootSiblingPath) {
15
- this.totalNumTxs = totalNumTxs;
16
- this.completionCallback = completionCallback;
17
- this.rejectionCallback = rejectionCallback;
18
- this.globalVariables = globalVariables;
19
- this.newL1ToL2Messages = newL1ToL2Messages;
20
- this.messageTreeSnapshot = messageTreeSnapshot;
21
- this.messageTreeRootSiblingPath = messageTreeRootSiblingPath;
22
- this.provingStateLifecycle = PROVING_STATE_LIFECYCLE.PROVING_STATE_CREATED;
23
- this.mergeRollupInputs = [];
24
- this.rootParityInputs = [];
25
- this.txs = [];
26
- this.rootParityInputs = Array.from({ length: numRootParityInputs }).map(_ => undefined);
27
- }
28
- // Returns the number of levels of merge rollups
29
- get numMergeLevels() {
30
- return BigInt(Math.ceil(Math.log2(this.totalNumTxs)) - 1);
31
- }
32
- // Calculates the index and level of the parent rollup circuit
33
- // Based on tree implementation in unbalanced_tree.ts -> batchInsert()
34
- findMergeLevel(currentLevel, currentIndex) {
35
- const moveUpMergeLevel = (levelSize, index, nodeToShift) => {
36
- levelSize /= 2;
37
- if (levelSize & 1) {
38
- [levelSize, nodeToShift] = nodeToShift ? [levelSize + 1, false] : [levelSize - 1, true];
39
- }
40
- index >>= 1n;
41
- return { thisLevelSize: levelSize, thisIndex: index, shiftUp: nodeToShift };
42
- };
43
- let [thisLevelSize, shiftUp] = this.totalNumTxs & 1 ? [this.totalNumTxs - 1, true] : [this.totalNumTxs, false];
44
- const maxLevel = this.numMergeLevels + 1n;
45
- let placeholder = currentIndex;
46
- for (let i = 0; i < maxLevel - currentLevel; i++) {
47
- ({ thisLevelSize, thisIndex: placeholder, shiftUp } = moveUpMergeLevel(thisLevelSize, placeholder, shiftUp));
48
- }
49
- let thisIndex = currentIndex;
50
- let mergeLevel = currentLevel;
51
- while (thisIndex >= thisLevelSize && mergeLevel != 0n) {
52
- mergeLevel -= 1n;
53
- ({ thisLevelSize, thisIndex, shiftUp } = moveUpMergeLevel(thisLevelSize, thisIndex, shiftUp));
54
- }
55
- return [mergeLevel - 1n, thisIndex >> 1n, thisIndex & 1n];
56
- }
57
- // Adds a transaction to the proving state, returns it's index
58
- // Will update the proving life cycle if this is the last transaction
59
- addNewTx(tx) {
60
- this.txs.push(tx);
61
- if (this.txs.length === this.totalNumTxs) {
62
- this.provingStateLifecycle = PROVING_STATE_LIFECYCLE.PROVING_STATE_FULL;
63
- }
64
- return this.txs.length - 1;
65
- }
66
- // Returns the number of received transactions
67
- get transactionsReceived() {
68
- return this.txs.length;
69
- }
70
- // Returns the final set of root parity inputs
71
- get finalRootParityInput() {
72
- return this.finalRootParityInputs;
73
- }
74
- // Sets the final set of root parity inputs
75
- set finalRootParityInput(input) {
76
- this.finalRootParityInputs = input;
77
- }
78
- // Returns the set of root parity inputs
79
- get rootParityInput() {
80
- return this.rootParityInputs;
81
- }
82
- // Returns true if this proving state is still valid, false otherwise
83
- verifyState() {
84
- return (this.provingStateLifecycle === PROVING_STATE_LIFECYCLE.PROVING_STATE_CREATED ||
85
- this.provingStateLifecycle === PROVING_STATE_LIFECYCLE.PROVING_STATE_FULL);
86
- }
87
- // Returns true if we are still able to accept transactions, false otherwise
88
- isAcceptingTransactions() {
89
- return this.provingStateLifecycle === PROVING_STATE_LIFECYCLE.PROVING_STATE_CREATED;
90
- }
91
- // Returns the complete set of transaction proving state objects
92
- get allTxs() {
93
- return this.txs;
94
- }
95
- /** Returns the block number as an epoch number. Used for prioritizing proof requests. */
96
- get epochNumber() {
97
- return this.globalVariables.blockNumber.toNumber();
98
- }
99
- /**
100
- * Stores the inputs to a merge circuit and determines if the circuit is ready to be executed
101
- * @param mergeInputs - The inputs to store
102
- * @param indexWithinMerge - The index in the set of inputs to this merge circuit
103
- * @param indexOfMerge - The global index of this merge circuit
104
- * @returns True if the merge circuit is ready to be executed, false otherwise
105
- */
106
- storeMergeInputs(mergeInputs, indexWithinMerge, indexOfMerge) {
107
- if (!this.mergeRollupInputs[indexOfMerge]) {
108
- const mergeInputData = {
109
- inputs: [undefined, undefined],
110
- proofs: [undefined, undefined],
111
- verificationKeys: [undefined, undefined],
112
- };
113
- mergeInputData.inputs[indexWithinMerge] = mergeInputs[0];
114
- mergeInputData.proofs[indexWithinMerge] = mergeInputs[1];
115
- mergeInputData.verificationKeys[indexWithinMerge] = mergeInputs[2];
116
- this.mergeRollupInputs[indexOfMerge] = mergeInputData;
117
- return false;
118
- }
119
- const mergeInputData = this.mergeRollupInputs[indexOfMerge];
120
- mergeInputData.inputs[indexWithinMerge] = mergeInputs[0];
121
- mergeInputData.proofs[indexWithinMerge] = mergeInputs[1];
122
- mergeInputData.verificationKeys[indexWithinMerge] = mergeInputs[2];
123
- return true;
124
- }
125
- // Returns a specific transaction proving state
126
- getTxProvingState(txIndex) {
127
- return this.txs[txIndex];
128
- }
129
- // Returns a set of merge rollup inputs
130
- getMergeInputs(indexOfMerge) {
131
- return this.mergeRollupInputs[indexOfMerge];
132
- }
133
- // Returns true if we have sufficient inputs to execute the block root rollup
134
- isReadyForBlockRootRollup() {
135
- return !(this.mergeRollupInputs[0] === undefined ||
136
- this.finalRootParityInput === undefined ||
137
- this.mergeRollupInputs[0].inputs.findIndex(p => !p) !== -1);
138
- }
139
- // Stores a set of root parity inputs at the given index
140
- setRootParityInputs(inputs, index) {
141
- this.rootParityInputs[index] = inputs;
142
- }
143
- // Returns true if we have sufficient root parity inputs to execute the root parity circuit
144
- areRootParityInputsReady() {
145
- return this.rootParityInputs.findIndex(p => !p) === -1;
146
- }
147
- // Attempts to reject the proving state promise with a reason of 'cancelled'
148
- cancel() {
149
- this.reject('Proving cancelled');
150
- }
151
- // Attempts to reject the proving state promise with the given reason
152
- // Does nothing if not in a valid state
153
- reject(reason) {
154
- if (!this.verifyState()) {
155
- return;
156
- }
157
- this.provingStateLifecycle = PROVING_STATE_LIFECYCLE.PROVING_STATE_REJECTED;
158
- this.rejectionCallback(reason);
159
- }
160
- // Attempts to resolve the proving state promise with the given result
161
- // Does nothing if not in a valid state
162
- resolve(result) {
163
- if (!this.verifyState()) {
164
- return;
165
- }
166
- this.provingStateLifecycle = PROVING_STATE_LIFECYCLE.PROVING_STATE_RESOLVED;
167
- this.completionCallback(result);
168
- }
169
- }
170
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmluZy1zdGF0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9vcmNoZXN0cmF0b3IvcHJvdmluZy1zdGF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUErQkEsSUFBSyx1QkFLSjtBQUxELFdBQUssdUJBQXVCO0lBQzFCLHVHQUFxQixDQUFBO0lBQ3JCLGlHQUFrQixDQUFBO0lBQ2xCLHlHQUFzQixDQUFBO0lBQ3RCLHlHQUFzQixDQUFBO0FBQ3hCLENBQUMsRUFMSSx1QkFBdUIsS0FBdkIsdUJBQXVCLFFBSzNCO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sT0FBTyxZQUFZO0lBU3ZCLFlBQ2tCLFdBQW1CLEVBQzNCLGtCQUFtRCxFQUNuRCxpQkFBMkMsRUFDbkMsZUFBZ0MsRUFDaEMsaUJBQXdFLEVBQ3hGLG1CQUEyQixFQUNYLG1CQUEyQyxFQUMzQywwQkFBc0Y7UUFQdEYsZ0JBQVcsR0FBWCxXQUFXLENBQVE7UUFDM0IsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFpQztRQUNuRCxzQkFBaUIsR0FBakIsaUJBQWlCLENBQTBCO1FBQ25DLG9CQUFlLEdBQWYsZUFBZSxDQUFpQjtRQUNoQyxzQkFBaUIsR0FBakIsaUJBQWlCLENBQXVEO1FBRXhFLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBd0I7UUFDM0MsK0JBQTBCLEdBQTFCLDBCQUEwQixDQUE0RDtRQWhCaEcsMEJBQXFCLEdBQUcsdUJBQXVCLENBQUMscUJBQXFCLENBQUM7UUFDdEUsc0JBQWlCLEdBQTJCLEVBQUUsQ0FBQztRQUMvQyxxQkFBZ0IsR0FBc0UsRUFBRSxDQUFDO1FBS3pGLFFBQUcsR0FBcUIsRUFBRSxDQUFDO1FBV2pDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLG1CQUFtQixFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUMxRixD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