@aztec/prover-client 0.0.1-commit.c80b6263 → 0.0.1-commit.cf93bcc56
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/light/lightweight_checkpoint_builder.d.ts +7 -4
- package/dest/light/lightweight_checkpoint_builder.d.ts.map +1 -1
- package/dest/light/lightweight_checkpoint_builder.js +16 -11
- package/dest/mocks/test_context.js +4 -1
- package/dest/orchestrator/block-building-helpers.d.ts +4 -4
- package/dest/orchestrator/block-building-helpers.d.ts.map +1 -1
- package/dest/orchestrator/block-building-helpers.js +4 -4
- package/dest/orchestrator/block-proving-state.d.ts +4 -1
- package/dest/orchestrator/block-proving-state.d.ts.map +1 -1
- package/dest/orchestrator/block-proving-state.js +7 -0
- package/dest/orchestrator/checkpoint-proving-state.d.ts +3 -3
- package/dest/orchestrator/checkpoint-proving-state.d.ts.map +1 -1
- package/dest/orchestrator/checkpoint-proving-state.js +3 -3
- package/dest/orchestrator/epoch-proving-state.d.ts +3 -3
- package/dest/orchestrator/epoch-proving-state.d.ts.map +1 -1
- package/dest/orchestrator/epoch-proving-state.js +5 -3
- package/dest/orchestrator/orchestrator.d.ts +2 -2
- package/dest/orchestrator/orchestrator.d.ts.map +1 -1
- package/dest/orchestrator/orchestrator.js +43 -52
- package/dest/prover-client/prover-client.d.ts +3 -3
- package/dest/prover-client/prover-client.d.ts.map +1 -1
- package/dest/prover-client/prover-client.js +8 -6
- package/dest/proving_broker/config.d.ts +9 -1
- package/dest/proving_broker/config.d.ts.map +1 -1
- package/dest/proving_broker/config.js +13 -2
- package/dest/proving_broker/proof_store/factory.d.ts +2 -5
- package/dest/proving_broker/proof_store/factory.d.ts.map +1 -1
- package/dest/proving_broker/proof_store/factory.js +7 -30
- package/dest/proving_broker/proof_store/file_store_proof_store.d.ts +18 -0
- package/dest/proving_broker/proof_store/file_store_proof_store.d.ts.map +1 -0
- package/dest/proving_broker/proof_store/file_store_proof_store.js +60 -0
- package/dest/proving_broker/proof_store/index.d.ts +2 -2
- package/dest/proving_broker/proof_store/index.d.ts.map +1 -1
- package/dest/proving_broker/proof_store/index.js +1 -1
- package/dest/proving_broker/proving_broker.d.ts +7 -4
- package/dest/proving_broker/proving_broker.d.ts.map +1 -1
- package/dest/proving_broker/proving_broker.js +29 -1
- package/dest/proving_broker/rpc.d.ts +4 -2
- package/dest/proving_broker/rpc.d.ts.map +1 -1
- package/dest/proving_broker/rpc.js +8 -0
- package/dest/test/mock_prover.d.ts +4 -4
- package/package.json +15 -15
- package/src/light/lightweight_checkpoint_builder.ts +15 -5
- package/src/mocks/test_context.ts +1 -1
- package/src/orchestrator/block-building-helpers.ts +4 -4
- package/src/orchestrator/block-proving-state.ts +9 -0
- package/src/orchestrator/checkpoint-proving-state.ts +4 -4
- package/src/orchestrator/epoch-proving-state.ts +6 -4
- package/src/orchestrator/orchestrator.ts +53 -59
- package/src/prover-client/prover-client.ts +6 -8
- package/src/proving_broker/config.ts +13 -0
- package/src/proving_broker/proof_store/factory.ts +10 -32
- package/src/proving_broker/proof_store/file_store_proof_store.ts +78 -0
- package/src/proving_broker/proof_store/index.ts +1 -1
- package/src/proving_broker/proving_broker.ts +30 -1
- package/src/proving_broker/rpc.ts +14 -0
- package/dest/proving_broker/proof_store/gcs_proof_store.d.ts +0 -14
- package/dest/proving_broker/proof_store/gcs_proof_store.d.ts.map +0 -1
- package/dest/proving_broker/proof_store/gcs_proof_store.js +0 -52
- package/src/proving_broker/proof_store/gcs_proof_store.ts +0 -76
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proving_broker.d.ts","sourceRoot":"","sources":["../../src/proving_broker/proving_broker.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"proving_broker.d.ts","sourceRoot":"","sources":["../../src/proving_broker/proving_broker.ts"],"names":[],"mappings":"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"}
|
|
@@ -51,7 +51,8 @@ import { ProvingBrokerInstrumentation } from './proving_broker_instrumentation.j
|
|
|
51
51
|
*/ epochHeight;
|
|
52
52
|
maxEpochsToKeepResultsFor;
|
|
53
53
|
started;
|
|
54
|
-
|
|
54
|
+
debugReplayEnabled;
|
|
55
|
+
constructor(database, { proverBrokerJobTimeoutMs, proverBrokerPollIntervalMs, proverBrokerJobMaxRetries, proverBrokerMaxEpochsToKeepResultsFor, proverBrokerDebugReplayEnabled } = defaultProverBrokerConfig, client = getTelemetryClient(), logger = createLogger('prover-client:proving-broker')){
|
|
55
56
|
this.database = database;
|
|
56
57
|
this.logger = logger;
|
|
57
58
|
this.queues = {
|
|
@@ -104,6 +105,7 @@ import { ProvingBrokerInstrumentation } from './proving_broker_instrumentation.j
|
|
|
104
105
|
this.jobTimeoutMs = proverBrokerJobTimeoutMs;
|
|
105
106
|
this.maxRetries = proverBrokerJobMaxRetries;
|
|
106
107
|
this.maxEpochsToKeepResultsFor = proverBrokerMaxEpochsToKeepResultsFor;
|
|
108
|
+
this.debugReplayEnabled = proverBrokerDebugReplayEnabled ?? false;
|
|
107
109
|
}
|
|
108
110
|
measureQueueDepth;
|
|
109
111
|
countActiveJobs;
|
|
@@ -163,6 +165,32 @@ import { ProvingBrokerInstrumentation } from './proving_broker_instrumentation.j
|
|
|
163
165
|
reportProvingJobProgress(id, startedAt, filter) {
|
|
164
166
|
return Promise.resolve(this.#reportProvingJobProgress(id, startedAt, filter));
|
|
165
167
|
}
|
|
168
|
+
async replayProvingJob(jobId, type, epochNumber, inputsUri) {
|
|
169
|
+
if (!this.debugReplayEnabled) {
|
|
170
|
+
throw new Error('Debug replay not enabled. Set PROVER_BROKER_DEBUG_REPLAY_ENABLED=true');
|
|
171
|
+
}
|
|
172
|
+
this.logger.info(`Replaying proving job`, {
|
|
173
|
+
provingJobId: jobId,
|
|
174
|
+
epochNumber,
|
|
175
|
+
inputsUri
|
|
176
|
+
});
|
|
177
|
+
// Clear existing state and enqueue
|
|
178
|
+
this.cleanUpProvingJobState([
|
|
179
|
+
jobId
|
|
180
|
+
]);
|
|
181
|
+
const job = {
|
|
182
|
+
id: jobId,
|
|
183
|
+
type,
|
|
184
|
+
epochNumber,
|
|
185
|
+
inputsUri
|
|
186
|
+
};
|
|
187
|
+
this.jobsCache.set(jobId, job);
|
|
188
|
+
await this.database.addProvingJob(job);
|
|
189
|
+
this.enqueueJobInternal(job);
|
|
190
|
+
return {
|
|
191
|
+
status: 'in-queue'
|
|
192
|
+
};
|
|
193
|
+
}
|
|
166
194
|
async #enqueueProvingJob(job) {
|
|
167
195
|
// We return the job status at the start of this call
|
|
168
196
|
const jobStatus = this.#getProvingJobStatus(job.id);
|
|
@@ -1,9 +1,11 @@
|
|
|
1
|
-
import { type ProvingJobBroker, type ProvingJobConsumer, type ProvingJobProducer } from '@aztec/stdlib/interfaces/server';
|
|
1
|
+
import { type ProvingJobBroker, type ProvingJobBrokerDebug, type ProvingJobConsumer, type ProvingJobProducer } from '@aztec/stdlib/interfaces/server';
|
|
2
2
|
import { type ApiSchemaFor } from '@aztec/stdlib/schemas';
|
|
3
3
|
import { type ComponentsVersions } from '@aztec/stdlib/versioning';
|
|
4
4
|
export declare const ProvingJobProducerSchema: ApiSchemaFor<ProvingJobProducer>;
|
|
5
5
|
export declare const ProvingJobConsumerSchema: ApiSchemaFor<ProvingJobConsumer>;
|
|
6
6
|
export declare const ProvingJobBrokerSchema: ApiSchemaFor<ProvingJobBroker>;
|
|
7
|
+
export declare const ProvingJobBrokerDebugSchema: ApiSchemaFor<ProvingJobBrokerDebug>;
|
|
8
|
+
export declare const ProvingJobBrokerSchemaWithDebug: ApiSchemaFor<ProvingJobBroker & ProvingJobBrokerDebug>;
|
|
7
9
|
export declare function createProvingJobBrokerClient(url: string, versions: Partial<ComponentsVersions>, fetch?: (host: string, body: unknown, extraHeaders?: Record<string, string> | undefined, noRetry?: boolean | undefined) => Promise<{
|
|
8
10
|
response: any;
|
|
9
11
|
headers: {
|
|
@@ -22,4 +24,4 @@ export declare function createProvingJobConsumerClient(url: string, versions: Pa
|
|
|
22
24
|
get: (header: string) => string | null | undefined;
|
|
23
25
|
};
|
|
24
26
|
}>): ProvingJobConsumer;
|
|
25
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
27
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnBjLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcHJvdmluZ19icm9rZXIvcnBjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFJTCxLQUFLLGdCQUFnQixFQUNyQixLQUFLLHFCQUFxQixFQUMxQixLQUFLLGtCQUFrQixFQUV2QixLQUFLLGtCQUFrQixFQUV4QixNQUFNLGlDQUFpQyxDQUFDO0FBRXpDLE9BQU8sRUFBRSxLQUFLLFlBQVksRUFBWSxNQUFNLHVCQUF1QixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxLQUFLLGtCQUFrQixFQUFnQyxNQUFNLDBCQUEwQixDQUFDO0FBY2pHLGVBQU8sTUFBTSx3QkFBd0IsRUFBRSxZQUFZLENBQUMsa0JBQWtCLENBS3JFLENBQUM7QUFFRixlQUFPLE1BQU0sd0JBQXdCLEVBQUUsWUFBWSxDQUFDLGtCQUFrQixDQWNyRSxDQUFDO0FBRUYsZUFBTyxNQUFNLHNCQUFzQixFQUFFLFlBQVksQ0FBQyxnQkFBZ0IsQ0FHakUsQ0FBQztBQUVGLGVBQU8sTUFBTSwyQkFBMkIsRUFBRSxZQUFZLENBQUMscUJBQXFCLENBSzNFLENBQUM7QUFFRixlQUFPLE1BQU0sK0JBQStCLEVBQUUsWUFBWSxDQUFDLGdCQUFnQixHQUFHLHFCQUFxQixDQUdsRyxDQUFDO0FBRUYsd0JBQWdCLDRCQUE0QixDQUMxQyxHQUFHLEVBQUUsTUFBTSxFQUNYLFFBQVEsRUFBRSxPQUFPLENBQUMsa0JBQWtCLENBQUMsRUFDckMsS0FBSzs7Ozs7RUFBb0MsR0FDeEMsZ0JBQWdCLENBTWxCO0FBRUQsd0JBQWdCLDhCQUE4QixDQUM1QyxHQUFHLEVBQUUsTUFBTSxFQUNYLFFBQVEsRUFBRSxPQUFPLENBQUMsa0JBQWtCLENBQUMsRUFDckMsS0FBSzs7Ozs7RUFBb0MsR0FDeEMsa0JBQWtCLENBTXBCO0FBRUQsd0JBQWdCLDhCQUE4QixDQUM1QyxHQUFHLEVBQUUsTUFBTSxFQUNYLFFBQVEsRUFBRSxPQUFPLENBQUMsa0JBQWtCLENBQUMsRUFDckMsS0FBSzs7Ozs7RUFBb0MsR0FDeEMsa0JBQWtCLENBTXBCIn0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rpc.d.ts","sourceRoot":"","sources":["../../src/proving_broker/rpc.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"rpc.d.ts","sourceRoot":"","sources":["../../src/proving_broker/rpc.ts"],"names":[],"mappings":"AAEA,OAAO,EAIL,KAAK,gBAAgB,EACrB,KAAK,qBAAqB,EAC1B,KAAK,kBAAkB,EAEvB,KAAK,kBAAkB,EAExB,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EAAE,KAAK,YAAY,EAAY,MAAM,uBAAuB,CAAC;AACpE,OAAO,EAAE,KAAK,kBAAkB,EAAgC,MAAM,0BAA0B,CAAC;AAcjG,eAAO,MAAM,wBAAwB,EAAE,YAAY,CAAC,kBAAkB,CAKrE,CAAC;AAEF,eAAO,MAAM,wBAAwB,EAAE,YAAY,CAAC,kBAAkB,CAcrE,CAAC;AAEF,eAAO,MAAM,sBAAsB,EAAE,YAAY,CAAC,gBAAgB,CAGjE,CAAC;AAEF,eAAO,MAAM,2BAA2B,EAAE,YAAY,CAAC,qBAAqB,CAK3E,CAAC;AAEF,eAAO,MAAM,+BAA+B,EAAE,YAAY,CAAC,gBAAgB,GAAG,qBAAqB,CAGlG,CAAC;AAEF,wBAAgB,4BAA4B,CAC1C,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,OAAO,CAAC,kBAAkB,CAAC,EACrC,KAAK;;;;;EAAoC,GACxC,gBAAgB,CAMlB;AAED,wBAAgB,8BAA8B,CAC5C,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,OAAO,CAAC,kBAAkB,CAAC,EACrC,KAAK;;;;;EAAoC,GACxC,kBAAkB,CAMpB;AAED,wBAAgB,8BAA8B,CAC5C,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,OAAO,CAAC,kBAAkB,CAAC,EACrC,KAAK;;;;;EAAoC,GACxC,kBAAkB,CAMpB"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { EpochNumberSchema } from '@aztec/foundation/branded-types';
|
|
1
2
|
import { createSafeJsonRpcClient } from '@aztec/foundation/json-rpc/client';
|
|
2
3
|
import { ProofUri, ProvingJob, ProvingJobId, ProvingJobStatus } from '@aztec/stdlib/interfaces/server';
|
|
3
4
|
import { ProvingRequestType } from '@aztec/stdlib/proofs';
|
|
@@ -28,6 +29,13 @@ export const ProvingJobBrokerSchema = {
|
|
|
28
29
|
...ProvingJobConsumerSchema,
|
|
29
30
|
...ProvingJobProducerSchema
|
|
30
31
|
};
|
|
32
|
+
export const ProvingJobBrokerDebugSchema = {
|
|
33
|
+
replayProvingJob: z.function().args(ProvingJobId, z.nativeEnum(ProvingRequestType), EpochNumberSchema, ProofUri).returns(ProvingJobStatus)
|
|
34
|
+
};
|
|
35
|
+
export const ProvingJobBrokerSchemaWithDebug = {
|
|
36
|
+
...ProvingJobBrokerSchema,
|
|
37
|
+
...ProvingJobBrokerDebugSchema
|
|
38
|
+
};
|
|
31
39
|
export function createProvingJobBrokerClient(url, versions, fetch = makeTracedFetch([
|
|
32
40
|
1,
|
|
33
41
|
2,
|
|
@@ -19,9 +19,9 @@ export declare class TestBroker implements ProvingJobProducer {
|
|
|
19
19
|
}
|
|
20
20
|
export declare class MockProver implements ServerCircuitProver {
|
|
21
21
|
constructor();
|
|
22
|
-
getAvmProof(_inputs: AvmCircuitInputs, _signal?: AbortSignal, _epochNumber?: number): Promise<import("@aztec/stdlib/proofs").RecursiveProof<
|
|
23
|
-
getBaseParityProof(_inputs: ParityBasePrivateInputs, _signal?: AbortSignal, _epochNumber?: number): Promise<PublicInputsAndRecursiveProof<import("@aztec/stdlib/parity").ParityPublicInputs,
|
|
24
|
-
getRootParityProof(_inputs: ParityRootPrivateInputs, _signal?: AbortSignal, _epochNumber?: number): Promise<PublicInputsAndRecursiveProof<import("@aztec/stdlib/parity").ParityPublicInputs,
|
|
22
|
+
getAvmProof(_inputs: AvmCircuitInputs, _signal?: AbortSignal, _epochNumber?: number): Promise<import("@aztec/stdlib/proofs").RecursiveProof<16400>>;
|
|
23
|
+
getBaseParityProof(_inputs: ParityBasePrivateInputs, _signal?: AbortSignal, _epochNumber?: number): Promise<PublicInputsAndRecursiveProof<import("@aztec/stdlib/parity").ParityPublicInputs, 449>>;
|
|
24
|
+
getRootParityProof(_inputs: ParityRootPrivateInputs, _signal?: AbortSignal, _epochNumber?: number): Promise<PublicInputsAndRecursiveProof<import("@aztec/stdlib/parity").ParityPublicInputs, 449>>;
|
|
25
25
|
getPublicChonkVerifierProof(_inputs: PublicChonkVerifierPrivateInputs, _signal?: AbortSignal, _epochNumber?: number): Promise<PublicInputsAndRecursiveProof<PublicChonkVerifierPublicInputs, typeof NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH>>;
|
|
26
26
|
getPrivateTxBaseRollupProof(_baseRollupInput: PrivateTxBaseRollupPrivateInputs, _signal?: AbortSignal, _epochNumber?: number): Promise<PublicInputsAndRecursiveProof<TxRollupPublicInputs, typeof NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH>>;
|
|
27
27
|
getPublicTxBaseRollupProof(_inputs: PublicTxBaseRollupPrivateInputs, _signal?: AbortSignal, _epochNumber?: number): Promise<PublicInputsAndRecursiveProof<TxRollupPublicInputs, typeof NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH>>;
|
|
@@ -31,7 +31,7 @@ export declare class MockProver implements ServerCircuitProver {
|
|
|
31
31
|
getBlockRootEmptyTxFirstRollupProof(_input: BlockRootEmptyTxFirstRollupPrivateInputs, _signal?: AbortSignal, _epochNumber?: number): Promise<PublicInputsAndRecursiveProof<BlockRollupPublicInputs, typeof NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH>>;
|
|
32
32
|
getBlockRootRollupProof(_input: BlockRootRollupPrivateInputs, _signal?: AbortSignal, _epochNumber?: number): Promise<PublicInputsAndRecursiveProof<BlockRollupPublicInputs, typeof NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH>>;
|
|
33
33
|
getBlockRootSingleTxRollupProof(_input: BlockRootSingleTxRollupPrivateInputs, _signal?: AbortSignal, _epochNumber?: number): Promise<PublicInputsAndRecursiveProof<BlockRollupPublicInputs, typeof NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH>>;
|
|
34
|
-
getBlockMergeRollupProof(_input: BlockMergeRollupPrivateInputs, _signal?: AbortSignal, _epochNumber?: number): Promise<PublicInputsAndRecursiveProof<BlockRollupPublicInputs,
|
|
34
|
+
getBlockMergeRollupProof(_input: BlockMergeRollupPrivateInputs, _signal?: AbortSignal, _epochNumber?: number): Promise<PublicInputsAndRecursiveProof<BlockRollupPublicInputs, 519>>;
|
|
35
35
|
getCheckpointRootRollupProof(_input: CheckpointRootRollupPrivateInputs, _signal?: AbortSignal, _epochNumber?: number): Promise<PublicInputsAndRecursiveProof<CheckpointRollupPublicInputs, typeof NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH>>;
|
|
36
36
|
getCheckpointRootSingleBlockRollupProof(_input: CheckpointRootSingleBlockRollupPrivateInputs, _signal?: AbortSignal, _epochNumber?: number): Promise<PublicInputsAndRecursiveProof<CheckpointRollupPublicInputs, typeof NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH>>;
|
|
37
37
|
getCheckpointMergeRollupProof(_input: CheckpointMergeRollupPrivateInputs, _signal?: AbortSignal, _epochNumber?: number): Promise<PublicInputsAndRecursiveProof<CheckpointRollupPublicInputs, typeof NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH>>;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/prover-client",
|
|
3
|
-
"version": "0.0.1-commit.
|
|
3
|
+
"version": "0.0.1-commit.cf93bcc56",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": "./dest/index.js",
|
|
@@ -68,19 +68,19 @@
|
|
|
68
68
|
]
|
|
69
69
|
},
|
|
70
70
|
"dependencies": {
|
|
71
|
-
"@aztec/bb-prover": "0.0.1-commit.
|
|
72
|
-
"@aztec/blob-lib": "0.0.1-commit.
|
|
73
|
-
"@aztec/constants": "0.0.1-commit.
|
|
74
|
-
"@aztec/ethereum": "0.0.1-commit.
|
|
75
|
-
"@aztec/foundation": "0.0.1-commit.
|
|
76
|
-
"@aztec/kv-store": "0.0.1-commit.
|
|
77
|
-
"@aztec/noir-protocol-circuits-types": "0.0.1-commit.
|
|
78
|
-
"@aztec/noir-types": "0.0.1-commit.
|
|
79
|
-
"@aztec/protocol-contracts": "0.0.1-commit.
|
|
80
|
-
"@aztec/simulator": "0.0.1-commit.
|
|
81
|
-
"@aztec/stdlib": "0.0.1-commit.
|
|
82
|
-
"@aztec/telemetry-client": "0.0.1-commit.
|
|
83
|
-
"@aztec/world-state": "0.0.1-commit.
|
|
71
|
+
"@aztec/bb-prover": "0.0.1-commit.cf93bcc56",
|
|
72
|
+
"@aztec/blob-lib": "0.0.1-commit.cf93bcc56",
|
|
73
|
+
"@aztec/constants": "0.0.1-commit.cf93bcc56",
|
|
74
|
+
"@aztec/ethereum": "0.0.1-commit.cf93bcc56",
|
|
75
|
+
"@aztec/foundation": "0.0.1-commit.cf93bcc56",
|
|
76
|
+
"@aztec/kv-store": "0.0.1-commit.cf93bcc56",
|
|
77
|
+
"@aztec/noir-protocol-circuits-types": "0.0.1-commit.cf93bcc56",
|
|
78
|
+
"@aztec/noir-types": "0.0.1-commit.cf93bcc56",
|
|
79
|
+
"@aztec/protocol-contracts": "0.0.1-commit.cf93bcc56",
|
|
80
|
+
"@aztec/simulator": "0.0.1-commit.cf93bcc56",
|
|
81
|
+
"@aztec/stdlib": "0.0.1-commit.cf93bcc56",
|
|
82
|
+
"@aztec/telemetry-client": "0.0.1-commit.cf93bcc56",
|
|
83
|
+
"@aztec/world-state": "0.0.1-commit.cf93bcc56",
|
|
84
84
|
"@google-cloud/storage": "^7.15.0",
|
|
85
85
|
"@iarna/toml": "^2.2.5",
|
|
86
86
|
"commander": "^12.1.0",
|
|
@@ -90,7 +90,7 @@
|
|
|
90
90
|
"zod": "^3.23.8"
|
|
91
91
|
},
|
|
92
92
|
"devDependencies": {
|
|
93
|
-
"@aztec/noir-contracts.js": "0.0.1-commit.
|
|
93
|
+
"@aztec/noir-contracts.js": "0.0.1-commit.cf93bcc56",
|
|
94
94
|
"@jest/globals": "^30.0.0",
|
|
95
95
|
"@types/jest": "^30.0.0",
|
|
96
96
|
"@types/node": "^22.15.17",
|
|
@@ -44,6 +44,7 @@ export class LightweightCheckpointBuilder {
|
|
|
44
44
|
constructor(
|
|
45
45
|
public readonly checkpointNumber: CheckpointNumber,
|
|
46
46
|
public readonly constants: CheckpointGlobalVariables,
|
|
47
|
+
public feeAssetPriceModifier: bigint,
|
|
47
48
|
public readonly l1ToL2Messages: Fr[],
|
|
48
49
|
private readonly previousCheckpointOutHashes: Fr[],
|
|
49
50
|
public readonly db: MerkleTreeWriteOperations,
|
|
@@ -54,7 +55,7 @@ export class LightweightCheckpointBuilder {
|
|
|
54
55
|
instanceId: `checkpoint-${checkpointNumber}`,
|
|
55
56
|
});
|
|
56
57
|
this.spongeBlob = SpongeBlob.init();
|
|
57
|
-
this.logger.debug('Starting new checkpoint', { constants, l1ToL2Messages });
|
|
58
|
+
this.logger.debug('Starting new checkpoint', { constants, l1ToL2Messages, feeAssetPriceModifier });
|
|
58
59
|
}
|
|
59
60
|
|
|
60
61
|
static async startNewCheckpoint(
|
|
@@ -64,6 +65,7 @@ export class LightweightCheckpointBuilder {
|
|
|
64
65
|
previousCheckpointOutHashes: Fr[],
|
|
65
66
|
db: MerkleTreeWriteOperations,
|
|
66
67
|
bindings?: LoggerBindings,
|
|
68
|
+
feeAssetPriceModifier: bigint = 0n,
|
|
67
69
|
): Promise<LightweightCheckpointBuilder> {
|
|
68
70
|
// Insert l1-to-l2 messages into the tree.
|
|
69
71
|
await db.appendLeaves(
|
|
@@ -74,6 +76,7 @@ export class LightweightCheckpointBuilder {
|
|
|
74
76
|
return new LightweightCheckpointBuilder(
|
|
75
77
|
checkpointNumber,
|
|
76
78
|
constants,
|
|
79
|
+
feeAssetPriceModifier,
|
|
77
80
|
l1ToL2Messages,
|
|
78
81
|
previousCheckpointOutHashes,
|
|
79
82
|
db,
|
|
@@ -90,6 +93,7 @@ export class LightweightCheckpointBuilder {
|
|
|
90
93
|
static async resumeCheckpoint(
|
|
91
94
|
checkpointNumber: CheckpointNumber,
|
|
92
95
|
constants: CheckpointGlobalVariables,
|
|
96
|
+
feeAssetPriceModifier: bigint,
|
|
93
97
|
l1ToL2Messages: Fr[],
|
|
94
98
|
previousCheckpointOutHashes: Fr[],
|
|
95
99
|
db: MerkleTreeWriteOperations,
|
|
@@ -99,6 +103,7 @@ export class LightweightCheckpointBuilder {
|
|
|
99
103
|
const builder = new LightweightCheckpointBuilder(
|
|
100
104
|
checkpointNumber,
|
|
101
105
|
constants,
|
|
106
|
+
feeAssetPriceModifier,
|
|
102
107
|
l1ToL2Messages,
|
|
103
108
|
previousCheckpointOutHashes,
|
|
104
109
|
db,
|
|
@@ -143,6 +148,11 @@ export class LightweightCheckpointBuilder {
|
|
|
143
148
|
return builder;
|
|
144
149
|
}
|
|
145
150
|
|
|
151
|
+
/** Returns how many blocks have been added to this checkpoint so far */
|
|
152
|
+
public getBlockCount() {
|
|
153
|
+
return this.blocks.length;
|
|
154
|
+
}
|
|
155
|
+
|
|
146
156
|
/**
|
|
147
157
|
* Adds a new block to the checkpoint. The tx effects must have already been inserted into the db if
|
|
148
158
|
* this is called after tx processing, if that's not the case, then set `insertTxsEffects` to true.
|
|
@@ -232,7 +242,7 @@ export class LightweightCheckpointBuilder {
|
|
|
232
242
|
|
|
233
243
|
const newArchive = this.lastArchives[this.lastArchives.length - 1];
|
|
234
244
|
|
|
235
|
-
const blobs = getBlobsPerL1Block(this.blobFields);
|
|
245
|
+
const blobs = await getBlobsPerL1Block(this.blobFields);
|
|
236
246
|
const blobsHash = computeBlobsHashFromBlobs(blobs);
|
|
237
247
|
|
|
238
248
|
const inHash = computeInHashFromL1ToL2Messages(this.l1ToL2Messages);
|
|
@@ -243,8 +253,7 @@ export class LightweightCheckpointBuilder {
|
|
|
243
253
|
);
|
|
244
254
|
const epochOutHash = accumulateCheckpointOutHashes([...this.previousCheckpointOutHashes, checkpointOutHash]);
|
|
245
255
|
|
|
246
|
-
//
|
|
247
|
-
// timestamp of a checkpoint is the timestamp of the last block in the checkpoint.
|
|
256
|
+
// All blocks in the checkpoint have the same timestamp
|
|
248
257
|
const timestamp = blocks[blocks.length - 1].timestamp;
|
|
249
258
|
|
|
250
259
|
const totalManaUsed = blocks.reduce((acc, block) => acc.add(block.header.totalManaUsed), Fr.ZERO);
|
|
@@ -263,13 +272,14 @@ export class LightweightCheckpointBuilder {
|
|
|
263
272
|
totalManaUsed,
|
|
264
273
|
});
|
|
265
274
|
|
|
266
|
-
return new Checkpoint(newArchive, header, blocks, this.checkpointNumber);
|
|
275
|
+
return new Checkpoint(newArchive, header, blocks, this.checkpointNumber, this.feeAssetPriceModifier);
|
|
267
276
|
}
|
|
268
277
|
|
|
269
278
|
clone() {
|
|
270
279
|
const clone = new LightweightCheckpointBuilder(
|
|
271
280
|
this.checkpointNumber,
|
|
272
281
|
this.constants,
|
|
282
|
+
this.feeAssetPriceModifier,
|
|
273
283
|
[...this.l1ToL2Messages],
|
|
274
284
|
[...this.previousCheckpointOutHashes],
|
|
275
285
|
this.db,
|
|
@@ -250,7 +250,7 @@ export class TestContext {
|
|
|
250
250
|
const previousCheckpointOutHashes = this.checkpointOutHashes;
|
|
251
251
|
const builder = await LightweightCheckpointBuilder.startNewCheckpoint(
|
|
252
252
|
checkpointNumber,
|
|
253
|
-
constants,
|
|
253
|
+
{ ...constants, timestamp },
|
|
254
254
|
l1ToL2Messages,
|
|
255
255
|
previousCheckpointOutHashes,
|
|
256
256
|
cleanFork,
|
|
@@ -97,9 +97,9 @@ export const insertSideEffectsAndBuildBaseRollupHints = runInSpan(
|
|
|
97
97
|
|
|
98
98
|
const { nullifierInsertionResult, publicDataInsertionResult } = await insertSideEffects(tx, db);
|
|
99
99
|
|
|
100
|
-
const blockHash =
|
|
100
|
+
const blockHash = await tx.data.constants.anchorBlockHeader.hash();
|
|
101
101
|
const anchorBlockArchiveSiblingPath = (
|
|
102
|
-
await getMembershipWitnessFor(blockHash, MerkleTreeId.ARCHIVE, ARCHIVE_HEIGHT, db)
|
|
102
|
+
await getMembershipWitnessFor(blockHash.toFr(), MerkleTreeId.ARCHIVE, ARCHIVE_HEIGHT, db)
|
|
103
103
|
).siblingPath;
|
|
104
104
|
|
|
105
105
|
const contractClassLogsFields = makeTuple(
|
|
@@ -253,8 +253,8 @@ export function getPublicChonkVerifierPrivateInputsFromTx(tx: Tx | ProcessedTx,
|
|
|
253
253
|
// Build "hints" as the private inputs for the checkpoint root rollup circuit.
|
|
254
254
|
// The `blobCommitments` will be accumulated and checked in the root rollup against the `finalBlobChallenges`.
|
|
255
255
|
// The `blobsHash` will be validated on L1 against the submitted blob data.
|
|
256
|
-
export const buildBlobHints = (blobFields: Fr[]) => {
|
|
257
|
-
const blobs = getBlobsPerL1Block(blobFields);
|
|
256
|
+
export const buildBlobHints = async (blobFields: Fr[]) => {
|
|
257
|
+
const blobs = await getBlobsPerL1Block(blobFields);
|
|
258
258
|
const blobCommitments = getBlobCommitmentsFromBlobs(blobs);
|
|
259
259
|
const blobsHash = computeBlobsHashFromBlobs(blobs);
|
|
260
260
|
return { blobCommitments, blobs, blobsHash };
|
|
@@ -55,6 +55,7 @@ export class BlockProvingState {
|
|
|
55
55
|
| ProofState<BlockRollupPublicInputs, typeof NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH>
|
|
56
56
|
| undefined;
|
|
57
57
|
private builtBlockHeader: BlockHeader | undefined;
|
|
58
|
+
private builtArchive: AppendOnlyTreeSnapshot | undefined;
|
|
58
59
|
private endState: StateReference | undefined;
|
|
59
60
|
private endSpongeBlob: SpongeBlob | undefined;
|
|
60
61
|
private txs: TxProvingState[] = [];
|
|
@@ -232,6 +233,14 @@ export class BlockProvingState {
|
|
|
232
233
|
return this.builtBlockHeader;
|
|
233
234
|
}
|
|
234
235
|
|
|
236
|
+
public setBuiltArchive(archive: AppendOnlyTreeSnapshot) {
|
|
237
|
+
this.builtArchive = archive;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
public getBuiltArchive() {
|
|
241
|
+
return this.builtArchive;
|
|
242
|
+
}
|
|
243
|
+
|
|
235
244
|
public getStartSpongeBlob() {
|
|
236
245
|
return this.startSpongeBlob;
|
|
237
246
|
}
|
|
@@ -85,7 +85,7 @@ export class CheckpointProvingState {
|
|
|
85
85
|
typeof L1_TO_L2_MSG_SUBTREE_ROOT_SIBLING_PATH_LENGTH
|
|
86
86
|
>,
|
|
87
87
|
public parentEpoch: EpochProvingState,
|
|
88
|
-
private onBlobAccumulatorSet: (checkpoint: CheckpointProvingState) => void
|
|
88
|
+
private onBlobAccumulatorSet: (checkpoint: CheckpointProvingState) => Promise<void>,
|
|
89
89
|
) {
|
|
90
90
|
this.blockProofs = new UnbalancedTreeStore(totalNumBlocks);
|
|
91
91
|
this.firstBlockNumber = BlockNumber(headerOfLastBlockInPreviousCheckpoint.globalVariables.blockNumber + 1);
|
|
@@ -245,7 +245,7 @@ export class CheckpointProvingState {
|
|
|
245
245
|
this.endBlobAccumulator = await accumulateBlobs(this.blobFields!, startBlobAccumulator);
|
|
246
246
|
this.startBlobAccumulator = startBlobAccumulator;
|
|
247
247
|
|
|
248
|
-
this.onBlobAccumulatorSet(this);
|
|
248
|
+
await this.onBlobAccumulatorSet(this);
|
|
249
249
|
|
|
250
250
|
return this.endBlobAccumulator;
|
|
251
251
|
}
|
|
@@ -271,7 +271,7 @@ export class CheckpointProvingState {
|
|
|
271
271
|
return this.totalNumBlocks === 1 ? 'rollup-checkpoint-root-single-block' : 'rollup-checkpoint-root';
|
|
272
272
|
}
|
|
273
273
|
|
|
274
|
-
public getCheckpointRootRollupInputs() {
|
|
274
|
+
public async getCheckpointRootRollupInputs() {
|
|
275
275
|
const proofs = this.#getChildProofsForRoot();
|
|
276
276
|
const nonEmptyProofs = proofs.filter(p => !!p);
|
|
277
277
|
if (proofs.length !== nonEmptyProofs.length) {
|
|
@@ -287,7 +287,7 @@ export class CheckpointProvingState {
|
|
|
287
287
|
// `blobFields` must've been set if `startBlobAccumulator` is set (in `accumulateBlobs`).
|
|
288
288
|
const blobFields = this.blobFields!;
|
|
289
289
|
|
|
290
|
-
const { blobCommitments, blobsHash } = buildBlobHints(blobFields);
|
|
290
|
+
const { blobCommitments, blobsHash } = await buildBlobHints(blobFields);
|
|
291
291
|
|
|
292
292
|
const hints = CheckpointRootRollupHints.from({
|
|
293
293
|
previousBlockHeader: this.headerOfLastBlockInPreviousCheckpoint,
|
|
@@ -76,7 +76,7 @@ export class EpochProvingState {
|
|
|
76
76
|
public readonly epochNumber: EpochNumber,
|
|
77
77
|
public readonly totalNumCheckpoints: number,
|
|
78
78
|
private readonly finalBlobBatchingChallenges: FinalBlobBatchingChallenges,
|
|
79
|
-
private onCheckpointBlobAccumulatorSet: (checkpoint: CheckpointProvingState) => void
|
|
79
|
+
private onCheckpointBlobAccumulatorSet: (checkpoint: CheckpointProvingState) => Promise<void>,
|
|
80
80
|
private completionCallback: (result: ProvingResult) => void,
|
|
81
81
|
private rejectionCallback: (reason: string) => void,
|
|
82
82
|
) {
|
|
@@ -254,9 +254,11 @@ export class EpochProvingState {
|
|
|
254
254
|
}
|
|
255
255
|
outHashes.push(outHash);
|
|
256
256
|
|
|
257
|
-
//
|
|
258
|
-
|
|
259
|
-
|
|
257
|
+
// If this is NOT the last checkpoint, get or create the hint for the next checkpoint.
|
|
258
|
+
if (i !== this.totalNumCheckpoints - 1) {
|
|
259
|
+
hint = checkpoint.getOutHashHintForNextCheckpoint() ?? (await computeOutHashHint(outHashes));
|
|
260
|
+
checkpoint.setOutHashHintForNextCheckpoint(hint);
|
|
261
|
+
}
|
|
260
262
|
}
|
|
261
263
|
}
|
|
262
264
|
|
|
@@ -71,11 +71,6 @@ import { EpochProvingState, type ProvingResult, type TreeSnapshots } from './epo
|
|
|
71
71
|
import { ProvingOrchestratorMetrics } from './orchestrator_metrics.js';
|
|
72
72
|
import { TxProvingState } from './tx-proving-state.js';
|
|
73
73
|
|
|
74
|
-
type WorldStateFork = {
|
|
75
|
-
fork: MerkleTreeWriteOperations;
|
|
76
|
-
cleanupPromise: Promise<void> | undefined;
|
|
77
|
-
};
|
|
78
|
-
|
|
79
74
|
/**
|
|
80
75
|
* Implements an event driven proving scheduler to build the recursive proof tree. The idea being:
|
|
81
76
|
* 1. Transactions are provided to the scheduler post simulation.
|
|
@@ -97,7 +92,7 @@ export class ProvingOrchestrator implements EpochProver {
|
|
|
97
92
|
private provingPromise: Promise<ProvingResult> | undefined = undefined;
|
|
98
93
|
private metrics: ProvingOrchestratorMetrics;
|
|
99
94
|
// eslint-disable-next-line aztec-custom/no-non-primitive-in-collections
|
|
100
|
-
private dbs: Map<BlockNumber,
|
|
95
|
+
private dbs: Map<BlockNumber, MerkleTreeWriteOperations> = new Map();
|
|
101
96
|
private logger: Logger;
|
|
102
97
|
|
|
103
98
|
constructor(
|
|
@@ -182,7 +177,7 @@ export class ProvingOrchestrator implements EpochProver {
|
|
|
182
177
|
const db = await this.dbProvider.fork(lastBlockNumber);
|
|
183
178
|
|
|
184
179
|
const firstBlockNumber = BlockNumber(lastBlockNumber + 1);
|
|
185
|
-
this.dbs.set(firstBlockNumber,
|
|
180
|
+
this.dbs.set(firstBlockNumber, db);
|
|
186
181
|
|
|
187
182
|
// Get archive sibling path before any block in this checkpoint lands.
|
|
188
183
|
const lastArchiveSiblingPath = await getLastSiblingPath(MerkleTreeId.ARCHIVE, db);
|
|
@@ -240,9 +235,9 @@ export class ProvingOrchestrator implements EpochProver {
|
|
|
240
235
|
if (!this.dbs.has(blockNumber)) {
|
|
241
236
|
// Fork world state at the end of the immediately previous block
|
|
242
237
|
const db = await this.dbProvider.fork(BlockNumber(blockNumber - 1));
|
|
243
|
-
this.dbs.set(blockNumber,
|
|
238
|
+
this.dbs.set(blockNumber, db);
|
|
244
239
|
}
|
|
245
|
-
const db = this.
|
|
240
|
+
const db = this.getDbForBlock(blockNumber);
|
|
246
241
|
|
|
247
242
|
// Get archive snapshot and sibling path before any txs in this block lands.
|
|
248
243
|
const lastArchiveTreeSnapshot = await getTreeSnapshot(MerkleTreeId.ARCHIVE, db);
|
|
@@ -317,7 +312,7 @@ export class ProvingOrchestrator implements EpochProver {
|
|
|
317
312
|
|
|
318
313
|
this.logger.info(`Adding ${txs.length} transactions to block ${blockNumber}`);
|
|
319
314
|
|
|
320
|
-
const db = this.
|
|
315
|
+
const db = this.getDbForBlock(blockNumber);
|
|
321
316
|
const lastArchive = provingState.lastArchiveTreeSnapshot;
|
|
322
317
|
const newL1ToL2MessageTreeSnapshot = provingState.newL1ToL2MessageTreeSnapshot;
|
|
323
318
|
const spongeBlobState = provingState.getStartSpongeBlob().clone();
|
|
@@ -445,14 +440,20 @@ export class ProvingOrchestrator implements EpochProver {
|
|
|
445
440
|
throw new Error('Block header mismatch');
|
|
446
441
|
}
|
|
447
442
|
|
|
448
|
-
// Get db for this block
|
|
449
|
-
const db = this.
|
|
443
|
+
// Get db for this block and remove from map — no other code should use it after this point.
|
|
444
|
+
const db = this.getDbForBlock(provingState.blockNumber);
|
|
445
|
+
this.dbs.delete(provingState.blockNumber);
|
|
450
446
|
|
|
451
|
-
// Update the archive tree,
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
447
|
+
// Update the archive tree, capture the snapshot, and close the fork deterministically.
|
|
448
|
+
try {
|
|
449
|
+
this.logger.verbose(
|
|
450
|
+
`Updating archive tree with block ${provingState.blockNumber} header ${(await header.hash()).toString()}`,
|
|
451
|
+
);
|
|
452
|
+
await db.updateArchive(header);
|
|
453
|
+
provingState.setBuiltArchive(await getTreeSnapshot(MerkleTreeId.ARCHIVE, db));
|
|
454
|
+
} finally {
|
|
455
|
+
await db.close();
|
|
456
|
+
}
|
|
456
457
|
|
|
457
458
|
await this.verifyBuiltBlockAgainstSyncedState(provingState);
|
|
458
459
|
|
|
@@ -472,6 +473,13 @@ export class ProvingOrchestrator implements EpochProver {
|
|
|
472
473
|
this.logger.debug('Block root rollup proof not built yet, skipping header check.');
|
|
473
474
|
return;
|
|
474
475
|
}
|
|
476
|
+
|
|
477
|
+
const newArchive = provingState.getBuiltArchive();
|
|
478
|
+
if (!newArchive) {
|
|
479
|
+
this.logger.debug('Archive snapshot not yet captured, skipping header check.');
|
|
480
|
+
return;
|
|
481
|
+
}
|
|
482
|
+
|
|
475
483
|
const header = await buildHeaderFromCircuitOutputs(output);
|
|
476
484
|
|
|
477
485
|
if (!(await header.hash()).equals(await builtBlockHeader.hash())) {
|
|
@@ -480,11 +488,7 @@ export class ProvingOrchestrator implements EpochProver {
|
|
|
480
488
|
return;
|
|
481
489
|
}
|
|
482
490
|
|
|
483
|
-
// Get db for this block
|
|
484
491
|
const blockNumber = provingState.blockNumber;
|
|
485
|
-
const db = this.dbs.get(blockNumber)!.fork;
|
|
486
|
-
|
|
487
|
-
const newArchive = await getTreeSnapshot(MerkleTreeId.ARCHIVE, db);
|
|
488
492
|
const syncedArchive = await getTreeSnapshot(MerkleTreeId.ARCHIVE, this.dbProvider.getSnapshot(blockNumber));
|
|
489
493
|
if (!syncedArchive.equals(newArchive)) {
|
|
490
494
|
this.logger.error(
|
|
@@ -502,12 +506,6 @@ export class ProvingOrchestrator implements EpochProver {
|
|
|
502
506
|
provingState.reject(`New archive mismatch.`);
|
|
503
507
|
return;
|
|
504
508
|
}
|
|
505
|
-
|
|
506
|
-
// TODO(palla/prover): This closes the fork only on the happy path. If this epoch orchestrator
|
|
507
|
-
// is aborted and never reaches this point, it will leak the fork. We need to add a global cleanup,
|
|
508
|
-
// but have to make sure it only runs once all operations are completed, otherwise some function here
|
|
509
|
-
// will attempt to access the fork after it was closed.
|
|
510
|
-
void this.cleanupDBFork(blockNumber);
|
|
511
509
|
}
|
|
512
510
|
|
|
513
511
|
/**
|
|
@@ -523,6 +521,19 @@ export class ProvingOrchestrator implements EpochProver {
|
|
|
523
521
|
}
|
|
524
522
|
|
|
525
523
|
this.provingState?.cancel();
|
|
524
|
+
|
|
525
|
+
for (const [blockNumber, db] of this.dbs.entries()) {
|
|
526
|
+
void db.close().catch(err => this.logger.error(`Error closing db for block ${blockNumber}`, err));
|
|
527
|
+
}
|
|
528
|
+
this.dbs.clear();
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
private getDbForBlock(blockNumber: BlockNumber): MerkleTreeWriteOperations {
|
|
532
|
+
const db = this.dbs.get(blockNumber);
|
|
533
|
+
if (!db) {
|
|
534
|
+
throw new Error(`World state fork for block ${blockNumber} not found.`);
|
|
535
|
+
}
|
|
536
|
+
return db;
|
|
526
537
|
}
|
|
527
538
|
|
|
528
539
|
/**
|
|
@@ -554,24 +565,6 @@ export class ProvingOrchestrator implements EpochProver {
|
|
|
554
565
|
return epochProofResult;
|
|
555
566
|
}
|
|
556
567
|
|
|
557
|
-
private async cleanupDBFork(blockNumber: BlockNumber): Promise<void> {
|
|
558
|
-
this.logger.debug(`Cleaning up world state fork for ${blockNumber}`);
|
|
559
|
-
const fork = this.dbs.get(blockNumber);
|
|
560
|
-
if (!fork) {
|
|
561
|
-
return;
|
|
562
|
-
}
|
|
563
|
-
|
|
564
|
-
try {
|
|
565
|
-
if (!fork.cleanupPromise) {
|
|
566
|
-
fork.cleanupPromise = fork.fork.close();
|
|
567
|
-
}
|
|
568
|
-
await fork.cleanupPromise;
|
|
569
|
-
this.dbs.delete(blockNumber);
|
|
570
|
-
} catch (err) {
|
|
571
|
-
this.logger.error(`Error closing db for block ${blockNumber}`, err);
|
|
572
|
-
}
|
|
573
|
-
}
|
|
574
|
-
|
|
575
568
|
/**
|
|
576
569
|
* Enqueue a job to be scheduled
|
|
577
570
|
* @param provingState - The proving state object being operated on
|
|
@@ -894,17 +887,15 @@ export class ProvingOrchestrator implements EpochProver {
|
|
|
894
887
|
const leafLocation = provingState.setBlockRootRollupProof(result);
|
|
895
888
|
const checkpointProvingState = provingState.parentCheckpoint;
|
|
896
889
|
|
|
897
|
-
//
|
|
890
|
+
// Verification is called from both here and setBlockCompleted. Whichever runs last
|
|
891
|
+
// will be the first to see all three pieces (header, proof output, archive) and run the checks.
|
|
898
892
|
await this.verifyBuiltBlockAgainstSyncedState(provingState);
|
|
899
893
|
|
|
900
894
|
if (checkpointProvingState.totalNumBlocks === 1) {
|
|
901
|
-
this.checkAndEnqueueCheckpointRootRollup(checkpointProvingState);
|
|
895
|
+
await this.checkAndEnqueueCheckpointRootRollup(checkpointProvingState);
|
|
902
896
|
} else {
|
|
903
|
-
this.checkAndEnqueueNextBlockMergeRollup(checkpointProvingState, leafLocation);
|
|
897
|
+
await this.checkAndEnqueueNextBlockMergeRollup(checkpointProvingState, leafLocation);
|
|
904
898
|
}
|
|
905
|
-
|
|
906
|
-
// We are finished with the block at this point, ensure the fork is cleaned up
|
|
907
|
-
void this.cleanupDBFork(provingState.blockNumber);
|
|
908
899
|
},
|
|
909
900
|
);
|
|
910
901
|
}
|
|
@@ -1009,14 +1000,14 @@ export class ProvingOrchestrator implements EpochProver {
|
|
|
1009
1000
|
},
|
|
1010
1001
|
signal => this.prover.getBlockMergeRollupProof(inputs, signal, provingState.epochNumber),
|
|
1011
1002
|
),
|
|
1012
|
-
result => {
|
|
1003
|
+
async result => {
|
|
1013
1004
|
provingState.setBlockMergeRollupProof(location, result);
|
|
1014
|
-
this.checkAndEnqueueNextBlockMergeRollup(provingState, location);
|
|
1005
|
+
await this.checkAndEnqueueNextBlockMergeRollup(provingState, location);
|
|
1015
1006
|
},
|
|
1016
1007
|
);
|
|
1017
1008
|
}
|
|
1018
1009
|
|
|
1019
|
-
private enqueueCheckpointRootRollup(provingState: CheckpointProvingState) {
|
|
1010
|
+
private async enqueueCheckpointRootRollup(provingState: CheckpointProvingState) {
|
|
1020
1011
|
if (!provingState.verifyState()) {
|
|
1021
1012
|
this.logger.debug('Not running checkpoint root rollup. State no longer valid.');
|
|
1022
1013
|
return;
|
|
@@ -1031,7 +1022,7 @@ export class ProvingOrchestrator implements EpochProver {
|
|
|
1031
1022
|
|
|
1032
1023
|
this.logger.debug(`Enqueuing ${rollupType} for checkpoint ${provingState.index}.`);
|
|
1033
1024
|
|
|
1034
|
-
const inputs = provingState.getCheckpointRootRollupInputs();
|
|
1025
|
+
const inputs = await provingState.getCheckpointRootRollupInputs();
|
|
1035
1026
|
|
|
1036
1027
|
this.deferredProving(
|
|
1037
1028
|
provingState,
|
|
@@ -1191,25 +1182,28 @@ export class ProvingOrchestrator implements EpochProver {
|
|
|
1191
1182
|
this.enqueueBlockRootRollup(provingState);
|
|
1192
1183
|
}
|
|
1193
1184
|
|
|
1194
|
-
private checkAndEnqueueNextBlockMergeRollup(
|
|
1185
|
+
private async checkAndEnqueueNextBlockMergeRollup(
|
|
1186
|
+
provingState: CheckpointProvingState,
|
|
1187
|
+
currentLocation: TreeNodeLocation,
|
|
1188
|
+
) {
|
|
1195
1189
|
if (!provingState.isReadyForBlockMerge(currentLocation)) {
|
|
1196
1190
|
return;
|
|
1197
1191
|
}
|
|
1198
1192
|
|
|
1199
1193
|
const parentLocation = provingState.getParentLocation(currentLocation);
|
|
1200
1194
|
if (parentLocation.level === 0) {
|
|
1201
|
-
this.checkAndEnqueueCheckpointRootRollup(provingState);
|
|
1195
|
+
await this.checkAndEnqueueCheckpointRootRollup(provingState);
|
|
1202
1196
|
} else {
|
|
1203
1197
|
this.enqueueBlockMergeRollup(provingState, parentLocation);
|
|
1204
1198
|
}
|
|
1205
1199
|
}
|
|
1206
1200
|
|
|
1207
|
-
private checkAndEnqueueCheckpointRootRollup(provingState: CheckpointProvingState) {
|
|
1201
|
+
private async checkAndEnqueueCheckpointRootRollup(provingState: CheckpointProvingState) {
|
|
1208
1202
|
if (!provingState.isReadyForCheckpointRoot()) {
|
|
1209
1203
|
return;
|
|
1210
1204
|
}
|
|
1211
1205
|
|
|
1212
|
-
this.enqueueCheckpointRootRollup(provingState);
|
|
1206
|
+
await this.enqueueCheckpointRootRollup(provingState);
|
|
1213
1207
|
}
|
|
1214
1208
|
|
|
1215
1209
|
private checkAndEnqueueNextCheckpointMergeRollup(provingState: EpochProvingState, currentLocation: TreeNodeLocation) {
|