@aztec/prover-client 0.55.1 → 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.
Files changed (44) hide show
  1. package/dest/mocks/fixtures.d.ts.map +1 -1
  2. package/dest/mocks/fixtures.js +6 -27
  3. package/dest/mocks/test_context.d.ts +4 -5
  4. package/dest/mocks/test_context.d.ts.map +1 -1
  5. package/dest/mocks/test_context.js +7 -9
  6. package/dest/orchestrator/block-building-helpers.d.ts +12 -3
  7. package/dest/orchestrator/block-building-helpers.d.ts.map +1 -1
  8. package/dest/orchestrator/block-building-helpers.js +34 -32
  9. package/dest/orchestrator/{proving-state.d.ts → block-proving-state.d.ts} +17 -13
  10. package/dest/orchestrator/block-proving-state.d.ts.map +1 -0
  11. package/dest/orchestrator/block-proving-state.js +170 -0
  12. package/dest/orchestrator/epoch-proving-state.d.ts +57 -0
  13. package/dest/orchestrator/epoch-proving-state.d.ts.map +1 -0
  14. package/dest/orchestrator/epoch-proving-state.js +151 -0
  15. package/dest/orchestrator/orchestrator.d.ts +32 -11
  16. package/dest/orchestrator/orchestrator.d.ts.map +1 -1
  17. package/dest/orchestrator/orchestrator.js +246 -139
  18. package/dest/orchestrator/tx-proving-state.d.ts +3 -2
  19. package/dest/orchestrator/tx-proving-state.d.ts.map +1 -1
  20. package/dest/orchestrator/tx-proving-state.js +54 -26
  21. package/dest/prover-agent/memory-proving-queue.d.ts +11 -5
  22. package/dest/prover-agent/memory-proving-queue.d.ts.map +1 -1
  23. package/dest/prover-agent/memory-proving-queue.js +16 -6
  24. package/dest/prover-agent/prover-agent.d.ts.map +1 -1
  25. package/dest/prover-agent/prover-agent.js +10 -10
  26. package/dest/prover-agent/rpc.d.ts.map +1 -1
  27. package/dest/prover-agent/rpc.js +6 -2
  28. package/dest/test/mock_prover.d.ts +4 -2
  29. package/dest/test/mock_prover.d.ts.map +1 -1
  30. package/dest/test/mock_prover.js +9 -3
  31. package/package.json +12 -11
  32. package/src/mocks/fixtures.ts +5 -49
  33. package/src/mocks/test_context.ts +7 -12
  34. package/src/orchestrator/block-building-helpers.ts +90 -57
  35. package/src/orchestrator/{proving-state.ts → block-proving-state.ts} +42 -40
  36. package/src/orchestrator/epoch-proving-state.ts +232 -0
  37. package/src/orchestrator/orchestrator.ts +410 -244
  38. package/src/orchestrator/tx-proving-state.ts +63 -27
  39. package/src/prover-agent/memory-proving-queue.ts +30 -16
  40. package/src/prover-agent/prover-agent.ts +11 -9
  41. package/src/prover-agent/rpc.ts +6 -0
  42. package/src/test/mock_prover.ts +23 -1
  43. package/dest/orchestrator/proving-state.d.ts.map +0 -1
  44. 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 {
@@ -22,7 +20,10 @@ import type {
22
20
  MergeRollupInputs,
23
21
  NESTED_RECURSIVE_PROOF_LENGTH,
24
22
  PrivateKernelEmptyInputData,
23
+ PublicKernelCircuitPrivateInputs,
25
24
  PublicKernelCircuitPublicInputs,
25
+ PublicKernelInnerCircuitPrivateInputs,
26
+ PublicKernelTailCircuitPrivateInputs,
26
27
  RECURSIVE_PROOF_LENGTH,
27
28
  RecursiveProof,
28
29
  RootParityInput,
@@ -30,6 +31,7 @@ import type {
30
31
  RootRollupInputs,
31
32
  RootRollupPublicInputs,
32
33
  TubeInputs,
34
+ VMCircuitPublicInputs,
33
35
  VerificationKeyData,
34
36
  } from '@aztec/circuits.js';
35
37
  import { randomBytes } from '@aztec/foundation/crypto';
@@ -349,6 +351,14 @@ export class MemoryProvingQueue implements ServerCircuitProver, ProvingJobSource
349
351
  return this.enqueue({ type: ProvingRequestType.BLOCK_ROOT_ROLLUP, inputs: input }, signal, epochNumber);
350
352
  }
351
353
 
354
+ getBlockRootRollupFinalProof(
355
+ input: BlockRootRollupInputs,
356
+ signal?: AbortSignal,
357
+ epochNumber?: number,
358
+ ): Promise<PublicInputsAndRecursiveProof<BlockRootOrBlockMergePublicInputs>> {
359
+ return this.enqueue({ type: ProvingRequestType.BLOCK_ROOT_ROLLUP_FINAL, inputs: input }, signal, epochNumber);
360
+ }
361
+
352
362
  /**
353
363
  * Creates a proof for the given input.
354
364
  * @param input - Input to the circuit.
@@ -374,19 +384,27 @@ export class MemoryProvingQueue implements ServerCircuitProver, ProvingJobSource
374
384
  }
375
385
 
376
386
  /**
377
- * Create a public kernel proof.
387
+ * Create a public kernel inner proof.
378
388
  * @param kernelRequest - Object containing the details of the proof required
379
389
  */
380
- getPublicKernelProof(
381
- kernelRequest: PublicKernelNonTailRequest,
390
+ getPublicKernelInnerProof(
391
+ inputs: PublicKernelInnerCircuitPrivateInputs,
392
+ signal?: AbortSignal,
393
+ epochNumber?: number,
394
+ ): Promise<PublicInputsAndRecursiveProof<VMCircuitPublicInputs>> {
395
+ return this.enqueue({ type: ProvingRequestType.PUBLIC_KERNEL_INNER, inputs }, signal, epochNumber);
396
+ }
397
+
398
+ /**
399
+ * Create a public kernel merge proof.
400
+ * @param kernelRequest - Object containing the details of the proof required
401
+ */
402
+ getPublicKernelMergeProof(
403
+ inputs: PublicKernelCircuitPrivateInputs,
382
404
  signal?: AbortSignal,
383
405
  epochNumber?: number,
384
406
  ): 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
- );
407
+ return this.enqueue({ type: ProvingRequestType.PUBLIC_KERNEL_MERGE, inputs }, signal, epochNumber);
390
408
  }
391
409
 
392
410
  /**
@@ -394,15 +412,11 @@ export class MemoryProvingQueue implements ServerCircuitProver, ProvingJobSource
394
412
  * @param kernelRequest - Object containing the details of the proof required
395
413
  */
396
414
  getPublicTailProof(
397
- kernelRequest: PublicKernelTailRequest,
415
+ inputs: PublicKernelTailCircuitPrivateInputs,
398
416
  signal?: AbortSignal,
399
417
  epochNumber?: number,
400
418
  ): Promise<PublicInputsAndRecursiveProof<KernelCircuitPublicInputs>> {
401
- return this.enqueue(
402
- { type: ProvingRequestType.PUBLIC_KERNEL_TAIL, kernelType: kernelRequest.type, inputs: kernelRequest.inputs },
403
- signal,
404
- epochNumber,
405
- );
419
+ return this.enqueue({ type: ProvingRequestType.PUBLIC_KERNEL_TAIL, inputs }, signal, epochNumber);
406
420
  }
407
421
 
408
422
  /**
@@ -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: {
@@ -187,6 +185,10 @@ export class ProverAgent {
187
185
  return this.circuitProver.getBlockRootRollupProof(inputs);
188
186
  }
189
187
 
188
+ case ProvingRequestType.BLOCK_ROOT_ROLLUP_FINAL: {
189
+ return this.circuitProver.getBlockRootRollupFinalProof(inputs);
190
+ }
191
+
190
192
  case ProvingRequestType.BLOCK_MERGE_ROLLUP: {
191
193
  return this.circuitProver.getBlockMergeRollupProof(inputs);
192
194
  }
@@ -19,6 +19,7 @@ import {
19
19
  Proof,
20
20
  PublicKernelCircuitPrivateInputs,
21
21
  PublicKernelCircuitPublicInputs,
22
+ PublicKernelInnerCircuitPrivateInputs,
22
23
  PublicKernelTailCircuitPrivateInputs,
23
24
  RecursiveProof,
24
25
  RootParityInput,
@@ -26,6 +27,7 @@ import {
26
27
  RootRollupInputs,
27
28
  RootRollupPublicInputs,
28
29
  TubeInputs,
30
+ VMCircuitPublicInputs,
29
31
  VerificationKeyData,
30
32
  } from '@aztec/circuits.js';
31
33
  import { createJsonRpcClient, makeFetch } from '@aztec/foundation/json-rpc/client';
@@ -51,6 +53,8 @@ export function createProvingJobSourceServer(queue: ProvingJobSource): JsonRpcSe
51
53
  Proof,
52
54
  ProvingError,
53
55
  PrivateKernelEmptyInputData,
56
+ VMCircuitPublicInputs,
57
+ PublicKernelInnerCircuitPrivateInputs,
54
58
  PublicKernelCircuitPrivateInputs,
55
59
  PublicKernelCircuitPublicInputs,
56
60
  PublicKernelTailCircuitPrivateInputs,
@@ -90,6 +94,8 @@ export function createProvingJobSourceClient(
90
94
  Proof,
91
95
  ProvingError,
92
96
  PrivateKernelEmptyInputData,
97
+ VMCircuitPublicInputs,
98
+ PublicKernelInnerCircuitPrivateInputs,
93
99
  PublicKernelCircuitPrivateInputs,
94
100
  PublicKernelCircuitPublicInputs,
95
101
  PublicKernelTailCircuitPrivateInputs,
@@ -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 {
@@ -86,6 +88,16 @@ export class MockProver implements ServerCircuitProver {
86
88
  );
87
89
  }
88
90
 
91
+ getBlockRootRollupFinalProof(): Promise<PublicInputsAndRecursiveProof<BlockRootOrBlockMergePublicInputs>> {
92
+ return Promise.resolve(
93
+ makePublicInputsAndRecursiveProof(
94
+ makeBlockRootOrBlockMergeRollupPublicInputs(),
95
+ makeRecursiveProof(RECURSIVE_PROOF_LENGTH),
96
+ VerificationKeyData.makeFake(),
97
+ ),
98
+ );
99
+ }
100
+
89
101
  getEmptyPrivateKernelProof(): Promise<PublicInputsAndRecursiveProof<KernelCircuitPublicInputs>> {
90
102
  return Promise.resolve(
91
103
  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 +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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