@aztec/prover-client 0.0.0-test.1 → 0.0.1-commit.0b941701
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dest/config.d.ts +8 -8
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +12 -2
- package/dest/index.d.ts +1 -1
- package/dest/light/index.d.ts +2 -0
- package/dest/light/index.d.ts.map +1 -0
- package/dest/light/index.js +1 -0
- package/dest/light/lightweight_checkpoint_builder.d.ts +44 -0
- package/dest/light/lightweight_checkpoint_builder.d.ts.map +1 -0
- package/dest/light/lightweight_checkpoint_builder.js +194 -0
- package/dest/mocks/fixtures.d.ts +8 -8
- package/dest/mocks/fixtures.d.ts.map +1 -1
- package/dest/mocks/fixtures.js +34 -16
- package/dest/mocks/test_context.d.ts +43 -32
- package/dest/mocks/test_context.d.ts.map +1 -1
- package/dest/mocks/test_context.js +149 -87
- package/dest/orchestrator/block-building-helpers.d.ts +37 -30
- package/dest/orchestrator/block-building-helpers.d.ts.map +1 -1
- package/dest/orchestrator/block-building-helpers.js +170 -189
- package/dest/orchestrator/block-proving-state.d.ts +70 -48
- package/dest/orchestrator/block-proving-state.d.ts.map +1 -1
- package/dest/orchestrator/block-proving-state.js +282 -177
- package/dest/orchestrator/checkpoint-proving-state.d.ts +76 -0
- package/dest/orchestrator/checkpoint-proving-state.d.ts.map +1 -0
- package/dest/orchestrator/checkpoint-proving-state.js +243 -0
- package/dest/orchestrator/epoch-proving-state.d.ts +43 -28
- package/dest/orchestrator/epoch-proving-state.d.ts.map +1 -1
- package/dest/orchestrator/epoch-proving-state.js +177 -73
- package/dest/orchestrator/index.d.ts +1 -1
- package/dest/orchestrator/orchestrator.d.ts +51 -35
- package/dest/orchestrator/orchestrator.d.ts.map +1 -1
- package/dest/orchestrator/orchestrator.js +830 -278
- package/dest/orchestrator/orchestrator_metrics.d.ts +1 -1
- package/dest/orchestrator/orchestrator_metrics.d.ts.map +1 -1
- package/dest/orchestrator/orchestrator_metrics.js +2 -6
- package/dest/orchestrator/tx-proving-state.d.ts +15 -12
- package/dest/orchestrator/tx-proving-state.d.ts.map +1 -1
- package/dest/orchestrator/tx-proving-state.js +27 -44
- package/dest/prover-client/factory.d.ts +3 -3
- package/dest/prover-client/factory.d.ts.map +1 -1
- package/dest/prover-client/index.d.ts +1 -1
- package/dest/prover-client/prover-client.d.ts +5 -5
- package/dest/prover-client/prover-client.d.ts.map +1 -1
- package/dest/prover-client/prover-client.js +7 -6
- package/dest/prover-client/server-epoch-prover.d.ts +16 -12
- package/dest/prover-client/server-epoch-prover.d.ts.map +1 -1
- package/dest/prover-client/server-epoch-prover.js +11 -11
- package/dest/proving_broker/broker_prover_facade.d.ts +25 -17
- package/dest/proving_broker/broker_prover_facade.d.ts.map +1 -1
- package/dest/proving_broker/broker_prover_facade.js +59 -40
- package/dest/proving_broker/config.d.ts +23 -10
- package/dest/proving_broker/config.d.ts.map +1 -1
- package/dest/proving_broker/config.js +29 -6
- package/dest/proving_broker/factory.d.ts +2 -2
- package/dest/proving_broker/factory.d.ts.map +1 -1
- package/dest/proving_broker/factory.js +5 -1
- package/dest/proving_broker/fixtures.d.ts +3 -2
- package/dest/proving_broker/fixtures.d.ts.map +1 -1
- package/dest/proving_broker/fixtures.js +3 -2
- package/dest/proving_broker/index.d.ts +1 -1
- package/dest/proving_broker/proof_store/factory.d.ts +2 -2
- package/dest/proving_broker/proof_store/factory.js +1 -1
- package/dest/proving_broker/proof_store/gcs_proof_store.d.ts +1 -1
- package/dest/proving_broker/proof_store/gcs_proof_store.d.ts.map +1 -1
- package/dest/proving_broker/proof_store/gcs_proof_store.js +1 -0
- package/dest/proving_broker/proof_store/index.d.ts +2 -1
- package/dest/proving_broker/proof_store/index.d.ts.map +1 -1
- package/dest/proving_broker/proof_store/index.js +1 -0
- package/dest/proving_broker/proof_store/inline_proof_store.d.ts +1 -1
- package/dest/proving_broker/proof_store/inline_proof_store.d.ts.map +1 -1
- package/dest/proving_broker/proof_store/proof_store.d.ts +1 -1
- package/dest/proving_broker/proving_agent.d.ts +6 -11
- package/dest/proving_broker/proving_agent.d.ts.map +1 -1
- package/dest/proving_broker/proving_agent.js +84 -63
- package/dest/proving_broker/proving_broker.d.ts +13 -4
- package/dest/proving_broker/proving_broker.d.ts.map +1 -1
- package/dest/proving_broker/proving_broker.js +40 -33
- package/dest/proving_broker/proving_broker_database/memory.d.ts +3 -2
- package/dest/proving_broker/proving_broker_database/memory.d.ts.map +1 -1
- package/dest/proving_broker/proving_broker_database/memory.js +1 -1
- package/dest/proving_broker/proving_broker_database/persisted.d.ts +5 -3
- package/dest/proving_broker/proving_broker_database/persisted.d.ts.map +1 -1
- package/dest/proving_broker/proving_broker_database/persisted.js +401 -11
- package/dest/proving_broker/proving_broker_database.d.ts +3 -2
- package/dest/proving_broker/proving_broker_database.d.ts.map +1 -1
- package/dest/proving_broker/proving_broker_instrumentation.d.ts +1 -1
- package/dest/proving_broker/proving_broker_instrumentation.d.ts.map +1 -1
- package/dest/proving_broker/proving_broker_instrumentation.js +11 -35
- package/dest/proving_broker/proving_job_controller.d.ts +9 -9
- package/dest/proving_broker/proving_job_controller.d.ts.map +1 -1
- package/dest/proving_broker/proving_job_controller.js +87 -60
- package/dest/proving_broker/rpc.d.ts +4 -6
- package/dest/proving_broker/rpc.d.ts.map +1 -1
- package/dest/proving_broker/rpc.js +1 -4
- package/dest/test/mock_proof_store.d.ts +9 -0
- package/dest/test/mock_proof_store.d.ts.map +1 -0
- package/dest/test/mock_proof_store.js +10 -0
- package/dest/test/mock_prover.d.ts +23 -17
- package/dest/test/mock_prover.d.ts.map +1 -1
- package/dest/test/mock_prover.js +38 -20
- package/package.json +33 -31
- package/src/config.ts +25 -9
- package/src/light/index.ts +1 -0
- package/src/light/lightweight_checkpoint_builder.ts +274 -0
- package/src/mocks/fixtures.ts +44 -39
- package/src/mocks/test_context.ts +223 -116
- package/src/orchestrator/block-building-helpers.ts +258 -334
- package/src/orchestrator/block-proving-state.ts +325 -231
- package/src/orchestrator/checkpoint-proving-state.ts +349 -0
- package/src/orchestrator/epoch-proving-state.ts +237 -111
- package/src/orchestrator/orchestrator.ts +627 -318
- package/src/orchestrator/orchestrator_metrics.ts +2 -6
- package/src/orchestrator/tx-proving-state.ts +48 -66
- package/src/prover-client/factory.ts +6 -2
- package/src/prover-client/prover-client.ts +27 -26
- package/src/prover-client/server-epoch-prover.ts +40 -22
- package/src/proving_broker/broker_prover_facade.ts +206 -128
- package/src/proving_broker/config.ts +34 -7
- package/src/proving_broker/factory.ts +2 -1
- package/src/proving_broker/fixtures.ts +8 -3
- package/src/proving_broker/proof_store/factory.ts +1 -1
- package/src/proving_broker/proof_store/gcs_proof_store.ts +5 -1
- package/src/proving_broker/proof_store/index.ts +1 -0
- package/src/proving_broker/proof_store/inline_proof_store.ts +1 -1
- package/src/proving_broker/proving_agent.ts +90 -64
- package/src/proving_broker/proving_broker.ts +57 -41
- package/src/proving_broker/proving_broker_database/memory.ts +3 -2
- package/src/proving_broker/proving_broker_database/persisted.ts +29 -13
- package/src/proving_broker/proving_broker_database.ts +2 -1
- package/src/proving_broker/proving_broker_instrumentation.ts +10 -35
- package/src/proving_broker/proving_job_controller.ts +92 -81
- package/src/proving_broker/rpc.ts +1 -6
- package/src/test/mock_proof_store.ts +14 -0
- package/src/test/mock_prover.ts +156 -64
- package/dest/bin/get-proof-inputs.d.ts +0 -2
- package/dest/bin/get-proof-inputs.d.ts.map +0 -1
- package/dest/bin/get-proof-inputs.js +0 -51
- package/dest/block_builder/index.d.ts +0 -6
- package/dest/block_builder/index.d.ts.map +0 -1
- package/dest/block_builder/index.js +0 -1
- package/dest/block_builder/light.d.ts +0 -33
- package/dest/block_builder/light.d.ts.map +0 -1
- package/dest/block_builder/light.js +0 -82
- package/dest/proving_broker/proving_agent_instrumentation.d.ts +0 -8
- package/dest/proving_broker/proving_agent_instrumentation.d.ts.map +0 -1
- package/dest/proving_broker/proving_agent_instrumentation.js +0 -16
- package/src/bin/get-proof-inputs.ts +0 -59
- package/src/block_builder/index.ts +0 -6
- package/src/block_builder/light.ts +0 -101
- package/src/proving_broker/proving_agent_instrumentation.ts +0 -21
|
@@ -1,27 +1,37 @@
|
|
|
1
|
+
import { BatchedBlob, BatchedBlobAccumulator, type FinalBlobBatchingChallenges } from '@aztec/blob-lib';
|
|
1
2
|
import {
|
|
2
3
|
type ARCHIVE_HEIGHT,
|
|
3
|
-
type
|
|
4
|
+
type L1_TO_L2_MSG_SUBTREE_ROOT_SIBLING_PATH_LENGTH,
|
|
5
|
+
type NESTED_RECURSIVE_PROOF_LENGTH,
|
|
4
6
|
type NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH,
|
|
5
|
-
|
|
6
|
-
VK_TREE_HEIGHT,
|
|
7
|
+
OUT_HASH_TREE_HEIGHT,
|
|
7
8
|
} from '@aztec/constants';
|
|
8
|
-
import
|
|
9
|
+
import { BlockNumber, EpochNumber } from '@aztec/foundation/branded-types';
|
|
10
|
+
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
9
11
|
import type { Tuple } from '@aztec/foundation/serialize';
|
|
10
|
-
import {
|
|
11
|
-
|
|
12
|
-
|
|
12
|
+
import {
|
|
13
|
+
MerkleTreeCalculator,
|
|
14
|
+
type TreeNodeLocation,
|
|
15
|
+
UnbalancedTreeStore,
|
|
16
|
+
shaMerkleHash,
|
|
17
|
+
} from '@aztec/foundation/trees';
|
|
18
|
+
import type { PublicInputsAndRecursiveProof } from '@aztec/stdlib/interfaces/server';
|
|
13
19
|
import type { Proof } from '@aztec/stdlib/proofs';
|
|
14
20
|
import {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
21
|
+
CheckpointConstantData,
|
|
22
|
+
CheckpointMergeRollupPrivateInputs,
|
|
23
|
+
CheckpointPaddingRollupPrivateInputs,
|
|
24
|
+
CheckpointRollupPublicInputs,
|
|
25
|
+
PublicChonkVerifierPublicInputs,
|
|
26
|
+
RootRollupPrivateInputs,
|
|
19
27
|
type RootRollupPublicInputs,
|
|
20
28
|
} from '@aztec/stdlib/rollup';
|
|
21
|
-
import
|
|
22
|
-
import type { BlockHeader
|
|
29
|
+
import { AppendOnlyTreeSnapshot, type MerkleTreeId } from '@aztec/stdlib/trees';
|
|
30
|
+
import type { BlockHeader } from '@aztec/stdlib/tx';
|
|
23
31
|
|
|
24
|
-
import {
|
|
32
|
+
import { toProofData } from './block-building-helpers.js';
|
|
33
|
+
import type { ProofState } from './block-proving-state.js';
|
|
34
|
+
import { CheckpointProvingState } from './checkpoint-proving-state.js';
|
|
25
35
|
|
|
26
36
|
export type TreeSnapshots = Map<MerkleTreeId, AppendOnlyTreeSnapshot>;
|
|
27
37
|
|
|
@@ -41,58 +51,98 @@ export type ProvingResult = { status: 'success' } | { status: 'failure'; reason:
|
|
|
41
51
|
* Captures resolve and reject callbacks to provide a promise base interface to the consumer of our proving.
|
|
42
52
|
*/
|
|
43
53
|
export class EpochProvingState {
|
|
44
|
-
private
|
|
45
|
-
|
|
54
|
+
private checkpointProofs: UnbalancedTreeStore<
|
|
55
|
+
ProofState<CheckpointRollupPublicInputs, typeof NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH>
|
|
46
56
|
>;
|
|
47
|
-
private
|
|
48
|
-
|
|
|
57
|
+
private checkpointPaddingProof:
|
|
58
|
+
| ProofState<CheckpointRollupPublicInputs, typeof NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH>
|
|
49
59
|
| undefined;
|
|
50
|
-
private
|
|
60
|
+
private rootRollupProof: ProofState<RootRollupPublicInputs, typeof NESTED_RECURSIVE_PROOF_LENGTH> | undefined;
|
|
61
|
+
private checkpoints: (CheckpointProvingState | undefined)[] = [];
|
|
62
|
+
private startBlobAccumulator: BatchedBlobAccumulator;
|
|
63
|
+
private endBlobAccumulator: BatchedBlobAccumulator | undefined;
|
|
64
|
+
private finalBatchedBlob: BatchedBlob | undefined;
|
|
51
65
|
private provingStateLifecycle = PROVING_STATE_LIFECYCLE.PROVING_STATE_CREATED;
|
|
52
66
|
|
|
53
|
-
// Map from tx hash to
|
|
54
|
-
public readonly
|
|
55
|
-
|
|
56
|
-
|
|
67
|
+
// Map from tx hash to chonk verifier proof promise. Used when kickstarting chonk verifier proofs before tx processing.
|
|
68
|
+
public readonly cachedChonkVerifierProofs = new Map<
|
|
69
|
+
string,
|
|
70
|
+
Promise<
|
|
71
|
+
PublicInputsAndRecursiveProof<PublicChonkVerifierPublicInputs, typeof NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH>
|
|
72
|
+
>
|
|
73
|
+
>();
|
|
57
74
|
|
|
58
75
|
constructor(
|
|
59
|
-
public readonly epochNumber:
|
|
60
|
-
public readonly
|
|
61
|
-
|
|
76
|
+
public readonly epochNumber: EpochNumber,
|
|
77
|
+
public readonly totalNumCheckpoints: number,
|
|
78
|
+
private readonly finalBlobBatchingChallenges: FinalBlobBatchingChallenges,
|
|
79
|
+
private onCheckpointBlobAccumulatorSet: (checkpoint: CheckpointProvingState) => void,
|
|
62
80
|
private completionCallback: (result: ProvingResult) => void,
|
|
63
81
|
private rejectionCallback: (reason: string) => void,
|
|
64
82
|
) {
|
|
65
|
-
this.
|
|
83
|
+
this.checkpointProofs = new UnbalancedTreeStore(totalNumCheckpoints);
|
|
84
|
+
this.startBlobAccumulator = BatchedBlobAccumulator.newWithChallenges(finalBlobBatchingChallenges);
|
|
66
85
|
}
|
|
67
86
|
|
|
68
87
|
// Adds a block to the proving state, returns its index
|
|
69
88
|
// Will update the proving life cycle if this is the last block
|
|
70
|
-
public
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
l1ToL2MessageTreeSnapshotAfterInsertion: AppendOnlyTreeSnapshot,
|
|
75
|
-
lastArchiveSnapshot: AppendOnlyTreeSnapshot,
|
|
76
|
-
newArchiveSiblingPath: Tuple<Fr, typeof ARCHIVE_HEIGHT>,
|
|
89
|
+
public startNewCheckpoint(
|
|
90
|
+
checkpointIndex: number,
|
|
91
|
+
constants: CheckpointConstantData,
|
|
92
|
+
totalNumBlocks: number,
|
|
77
93
|
previousBlockHeader: BlockHeader,
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
94
|
+
lastArchiveSiblingPath: Tuple<Fr, typeof ARCHIVE_HEIGHT>,
|
|
95
|
+
l1ToL2Messages: Fr[],
|
|
96
|
+
lastL1ToL2MessageTreeSnapshot: AppendOnlyTreeSnapshot,
|
|
97
|
+
lastL1ToL2MessageSubtreeRootSiblingPath: Tuple<Fr, typeof L1_TO_L2_MSG_SUBTREE_ROOT_SIBLING_PATH_LENGTH>,
|
|
98
|
+
newL1ToL2MessageTreeSnapshot: AppendOnlyTreeSnapshot,
|
|
99
|
+
newL1ToL2MessageSubtreeRootSiblingPath: Tuple<Fr, typeof L1_TO_L2_MSG_SUBTREE_ROOT_SIBLING_PATH_LENGTH>,
|
|
100
|
+
): CheckpointProvingState {
|
|
101
|
+
if (checkpointIndex >= this.totalNumCheckpoints) {
|
|
102
|
+
throw new Error(
|
|
103
|
+
`Unable to start a new checkpoint at index ${checkpointIndex}. Expected at most ${this.totalNumCheckpoints} checkpoints.`,
|
|
104
|
+
);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
const checkpoint = new CheckpointProvingState(
|
|
108
|
+
checkpointIndex,
|
|
109
|
+
constants,
|
|
110
|
+
totalNumBlocks,
|
|
111
|
+
this.finalBlobBatchingChallenges,
|
|
88
112
|
previousBlockHeader,
|
|
113
|
+
lastArchiveSiblingPath,
|
|
114
|
+
l1ToL2Messages,
|
|
115
|
+
lastL1ToL2MessageTreeSnapshot,
|
|
116
|
+
lastL1ToL2MessageSubtreeRootSiblingPath,
|
|
117
|
+
newL1ToL2MessageTreeSnapshot,
|
|
118
|
+
newL1ToL2MessageSubtreeRootSiblingPath,
|
|
89
119
|
this,
|
|
120
|
+
this.onCheckpointBlobAccumulatorSet,
|
|
90
121
|
);
|
|
91
|
-
this.
|
|
92
|
-
|
|
122
|
+
this.checkpoints[checkpointIndex] = checkpoint;
|
|
123
|
+
|
|
124
|
+
if (this.checkpoints.filter(c => !!c).length === this.totalNumCheckpoints) {
|
|
93
125
|
this.provingStateLifecycle = PROVING_STATE_LIFECYCLE.PROVING_STATE_FULL;
|
|
94
126
|
}
|
|
95
|
-
|
|
127
|
+
|
|
128
|
+
return checkpoint;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
public getCheckpointProvingState(index: number) {
|
|
132
|
+
return this.checkpoints[index];
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
public getCheckpointProvingStateByBlockNumber(blockNumber: BlockNumber) {
|
|
136
|
+
return this.checkpoints.find(
|
|
137
|
+
c =>
|
|
138
|
+
c &&
|
|
139
|
+
Number(blockNumber) >= Number(c.firstBlockNumber) &&
|
|
140
|
+
Number(blockNumber) < Number(c.firstBlockNumber) + c.totalNumBlocks,
|
|
141
|
+
);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
public getBlockProvingStateByBlockNumber(blockNumber: BlockNumber) {
|
|
145
|
+
return this.getCheckpointProvingStateByBlockNumber(blockNumber)?.getBlockProvingStateByBlockNumber(blockNumber);
|
|
96
146
|
}
|
|
97
147
|
|
|
98
148
|
// Returns true if this proving state is still valid, false otherwise
|
|
@@ -103,95 +153,188 @@ export class EpochProvingState {
|
|
|
103
153
|
);
|
|
104
154
|
}
|
|
105
155
|
|
|
106
|
-
// Returns true if we are still able to accept
|
|
107
|
-
public
|
|
108
|
-
return this.
|
|
156
|
+
// Returns true if we are still able to accept checkpoints, false otherwise.
|
|
157
|
+
public isAcceptingCheckpoints() {
|
|
158
|
+
return this.checkpoints.filter(c => !!c).length < this.totalNumCheckpoints;
|
|
109
159
|
}
|
|
110
160
|
|
|
111
|
-
public
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
161
|
+
public setCheckpointRootRollupProof(
|
|
162
|
+
checkpointIndex: number,
|
|
163
|
+
provingOutput: PublicInputsAndRecursiveProof<
|
|
164
|
+
CheckpointRollupPublicInputs,
|
|
115
165
|
typeof NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH
|
|
116
166
|
>,
|
|
117
167
|
): TreeNodeLocation {
|
|
118
|
-
return this.
|
|
168
|
+
return this.checkpointProofs.setLeaf(checkpointIndex, { provingOutput });
|
|
119
169
|
}
|
|
120
170
|
|
|
121
|
-
public
|
|
171
|
+
public tryStartProvingCheckpointMerge(location: TreeNodeLocation) {
|
|
172
|
+
if (this.checkpointProofs.getNode(location)?.isProving) {
|
|
173
|
+
return false;
|
|
174
|
+
} else {
|
|
175
|
+
this.checkpointProofs.setNode(location, { isProving: true });
|
|
176
|
+
return true;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
public setCheckpointMergeRollupProof(
|
|
122
181
|
location: TreeNodeLocation,
|
|
123
|
-
|
|
124
|
-
|
|
182
|
+
provingOutput: PublicInputsAndRecursiveProof<
|
|
183
|
+
CheckpointRollupPublicInputs,
|
|
125
184
|
typeof NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH
|
|
126
185
|
>,
|
|
127
186
|
) {
|
|
128
|
-
this.
|
|
187
|
+
this.checkpointProofs.setNode(location, { provingOutput });
|
|
129
188
|
}
|
|
130
189
|
|
|
131
|
-
public
|
|
132
|
-
this.
|
|
190
|
+
public tryStartProvingRootRollup() {
|
|
191
|
+
if (this.rootRollupProof?.isProving) {
|
|
192
|
+
return false;
|
|
193
|
+
} else {
|
|
194
|
+
this.rootRollupProof = { isProving: true };
|
|
195
|
+
return true;
|
|
196
|
+
}
|
|
133
197
|
}
|
|
134
198
|
|
|
135
|
-
public
|
|
136
|
-
|
|
137
|
-
|
|
199
|
+
public setRootRollupProof(provingOutput: PublicInputsAndRecursiveProof<RootRollupPublicInputs>) {
|
|
200
|
+
this.rootRollupProof = { provingOutput };
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
public tryStartProvingPaddingCheckpoint() {
|
|
204
|
+
if (this.checkpointPaddingProof?.isProving) {
|
|
205
|
+
return false;
|
|
206
|
+
} else {
|
|
207
|
+
this.checkpointPaddingProof = { isProving: true };
|
|
208
|
+
return true;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
public setCheckpointPaddingProof(
|
|
213
|
+
provingOutput: PublicInputsAndRecursiveProof<
|
|
214
|
+
CheckpointRollupPublicInputs,
|
|
138
215
|
typeof NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH
|
|
139
216
|
>,
|
|
140
217
|
) {
|
|
141
|
-
this.
|
|
218
|
+
this.checkpointPaddingProof = { provingOutput };
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
public async accumulateCheckpointOutHashes() {
|
|
222
|
+
const treeCalculator = await MerkleTreeCalculator.create(OUT_HASH_TREE_HEIGHT, undefined, (left, right) =>
|
|
223
|
+
Promise.resolve(shaMerkleHash(left, right)),
|
|
224
|
+
);
|
|
225
|
+
|
|
226
|
+
const computeOutHashHint = async (leaves: Fr[]) => {
|
|
227
|
+
const tree = await treeCalculator.computeTree(leaves.map(l => l.toBuffer()));
|
|
228
|
+
const nextAvailableLeafIndex = leaves.length;
|
|
229
|
+
return {
|
|
230
|
+
treeSnapshot: new AppendOnlyTreeSnapshot(Fr.fromBuffer(tree.root), nextAvailableLeafIndex),
|
|
231
|
+
siblingPath: tree.getSiblingPath(nextAvailableLeafIndex).map(Fr.fromBuffer) as Tuple<
|
|
232
|
+
Fr,
|
|
233
|
+
typeof OUT_HASH_TREE_HEIGHT
|
|
234
|
+
>,
|
|
235
|
+
};
|
|
236
|
+
};
|
|
237
|
+
|
|
238
|
+
let hint = this.checkpoints[0]?.getOutHashHint();
|
|
239
|
+
const outHashes = [];
|
|
240
|
+
for (let i = 0; i < this.totalNumCheckpoints; i++) {
|
|
241
|
+
const checkpoint = this.checkpoints[i];
|
|
242
|
+
if (!checkpoint) {
|
|
243
|
+
break;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
// If hints are not set yet, it must be the first checkpoint. Compute the hints with an empty tree.
|
|
247
|
+
hint ??= await computeOutHashHint([]);
|
|
248
|
+
checkpoint.setOutHashHint(hint);
|
|
249
|
+
|
|
250
|
+
// Get the out hash for this checkpoint.
|
|
251
|
+
const outHash = checkpoint.accumulateBlockOutHashes();
|
|
252
|
+
if (!outHash) {
|
|
253
|
+
break;
|
|
254
|
+
}
|
|
255
|
+
outHashes.push(outHash);
|
|
256
|
+
|
|
257
|
+
// Get or create hints for the next checkpoint.
|
|
258
|
+
hint = checkpoint.getOutHashHintForNextCheckpoint() ?? (await computeOutHashHint(outHashes));
|
|
259
|
+
checkpoint.setOutHashHintForNextCheckpoint(hint);
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
public async setBlobAccumulators() {
|
|
264
|
+
let previousAccumulator = this.startBlobAccumulator;
|
|
265
|
+
// Accumulate blobs as far as we can for this epoch.
|
|
266
|
+
for (let i = 0; i < this.totalNumCheckpoints; i++) {
|
|
267
|
+
const checkpoint = this.checkpoints[i];
|
|
268
|
+
if (!checkpoint) {
|
|
269
|
+
break;
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
const endAccumulator =
|
|
273
|
+
checkpoint.getEndBlobAccumulator() || (await checkpoint.accumulateBlobs(previousAccumulator));
|
|
274
|
+
if (!endAccumulator) {
|
|
275
|
+
break;
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
previousAccumulator = endAccumulator;
|
|
279
|
+
|
|
280
|
+
// If this is the last checkpoint, set the end blob accumulator.
|
|
281
|
+
if (i === this.totalNumCheckpoints - 1) {
|
|
282
|
+
this.endBlobAccumulator = endAccumulator;
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
public async finalizeBatchedBlob() {
|
|
288
|
+
if (!this.endBlobAccumulator) {
|
|
289
|
+
throw new Error('End blob accumulator not ready.');
|
|
290
|
+
}
|
|
291
|
+
this.finalBatchedBlob = await this.endBlobAccumulator.finalize(true /* verifyProof */);
|
|
142
292
|
}
|
|
143
293
|
|
|
144
294
|
public getParentLocation(location: TreeNodeLocation) {
|
|
145
|
-
return this.
|
|
295
|
+
return this.checkpointProofs.getParentLocation(location);
|
|
146
296
|
}
|
|
147
297
|
|
|
148
|
-
public
|
|
149
|
-
const [left, right] = this.
|
|
298
|
+
public getCheckpointMergeRollupInputs(mergeLocation: TreeNodeLocation) {
|
|
299
|
+
const [left, right] = this.checkpointProofs.getChildren(mergeLocation).map(c => c?.provingOutput);
|
|
150
300
|
if (!left || !right) {
|
|
151
|
-
throw new Error('At
|
|
301
|
+
throw new Error('At least one child is not ready for the checkpoint merge rollup.');
|
|
152
302
|
}
|
|
153
303
|
|
|
154
|
-
return new
|
|
304
|
+
return new CheckpointMergeRollupPrivateInputs([toProofData(left), toProofData(right)]);
|
|
155
305
|
}
|
|
156
306
|
|
|
157
|
-
public getRootRollupInputs(
|
|
307
|
+
public getRootRollupInputs() {
|
|
158
308
|
const [left, right] = this.#getChildProofsForRoot();
|
|
159
309
|
if (!left || !right) {
|
|
160
|
-
throw new Error('At
|
|
310
|
+
throw new Error('At least one child is not ready for the root rollup.');
|
|
161
311
|
}
|
|
162
312
|
|
|
163
|
-
return
|
|
164
|
-
|
|
165
|
-
proverId,
|
|
313
|
+
return RootRollupPrivateInputs.from({
|
|
314
|
+
previousRollups: [toProofData(left), toProofData(right)],
|
|
166
315
|
});
|
|
167
316
|
}
|
|
168
317
|
|
|
169
|
-
public
|
|
170
|
-
|
|
171
|
-
throw new Error('Epoch needs one completed block in order to be padded.');
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
return this.blocks[0].getPaddingBlockRootInputs(proverId);
|
|
318
|
+
public getPaddingCheckpointInputs() {
|
|
319
|
+
return new CheckpointPaddingRollupPrivateInputs();
|
|
175
320
|
}
|
|
176
321
|
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
return this.blocks.find(block => block?.blockNumber === blockNumber);
|
|
180
|
-
}
|
|
322
|
+
public getEpochProofResult(): { proof: Proof; publicInputs: RootRollupPublicInputs; batchedBlobInputs: BatchedBlob } {
|
|
323
|
+
const provingOutput = this.rootRollupProof?.provingOutput;
|
|
181
324
|
|
|
182
|
-
|
|
183
|
-
if (!this.rootRollupProvingOutput) {
|
|
325
|
+
if (!provingOutput || !this.finalBatchedBlob) {
|
|
184
326
|
throw new Error('Unable to get epoch proof result. Root rollup is not ready.');
|
|
185
327
|
}
|
|
186
328
|
|
|
187
329
|
return {
|
|
188
|
-
proof:
|
|
189
|
-
publicInputs:
|
|
330
|
+
proof: provingOutput.proof.binaryProof,
|
|
331
|
+
publicInputs: provingOutput.inputs,
|
|
332
|
+
batchedBlobInputs: this.finalBatchedBlob,
|
|
190
333
|
};
|
|
191
334
|
}
|
|
192
335
|
|
|
193
|
-
public
|
|
194
|
-
return this.
|
|
336
|
+
public isReadyForCheckpointMerge(location: TreeNodeLocation) {
|
|
337
|
+
return !!this.checkpointProofs.getSibling(location)?.provingOutput;
|
|
195
338
|
}
|
|
196
339
|
|
|
197
340
|
// Returns true if we have sufficient inputs to execute the block root rollup
|
|
@@ -228,25 +371,8 @@ export class EpochProvingState {
|
|
|
228
371
|
#getChildProofsForRoot() {
|
|
229
372
|
const rootLocation = { level: 0, index: 0 };
|
|
230
373
|
// If there's only 1 block, its block root proof will be stored at the root.
|
|
231
|
-
return this.
|
|
232
|
-
? [this.
|
|
233
|
-
: this.
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
#getPreviousRollupData({
|
|
237
|
-
inputs,
|
|
238
|
-
proof,
|
|
239
|
-
verificationKey,
|
|
240
|
-
}: PublicInputsAndRecursiveProof<
|
|
241
|
-
BlockRootOrBlockMergePublicInputs,
|
|
242
|
-
typeof NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH
|
|
243
|
-
>) {
|
|
244
|
-
const leafIndex = getVKIndex(verificationKey.keyAsFields);
|
|
245
|
-
return new PreviousRollupBlockData(
|
|
246
|
-
inputs,
|
|
247
|
-
proof,
|
|
248
|
-
verificationKey.keyAsFields,
|
|
249
|
-
new MembershipWitness(VK_TREE_HEIGHT, BigInt(leafIndex), getVKSiblingPath(leafIndex)),
|
|
250
|
-
);
|
|
374
|
+
return this.totalNumCheckpoints === 1
|
|
375
|
+
? [this.checkpointProofs.getNode(rootLocation)?.provingOutput, this.checkpointPaddingProof?.provingOutput]
|
|
376
|
+
: this.checkpointProofs.getChildren(rootLocation).map(c => c?.provingOutput);
|
|
251
377
|
}
|
|
252
378
|
}
|