@aztec/prover-client 0.0.1-commit.e3c1de76 → 0.0.1-commit.e57c76e
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 +1 -1
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +16 -2
- package/dest/light/lightweight_checkpoint_builder.d.ts +10 -5
- package/dest/light/lightweight_checkpoint_builder.d.ts.map +1 -1
- package/dest/light/lightweight_checkpoint_builder.js +53 -22
- package/dest/mocks/test_context.d.ts +3 -1
- package/dest/mocks/test_context.d.ts.map +1 -1
- package/dest/mocks/test_context.js +18 -9
- 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 +2 -2
- 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 +10 -3
- package/dest/orchestrator/checkpoint-proving-state.d.ts.map +1 -1
- package/dest/orchestrator/checkpoint-proving-state.js +13 -4
- package/dest/orchestrator/checkpoint-sub-tree-orchestrator.d.ts +107 -0
- package/dest/orchestrator/checkpoint-sub-tree-orchestrator.d.ts.map +1 -0
- package/dest/orchestrator/checkpoint-sub-tree-orchestrator.js +151 -0
- package/dest/orchestrator/epoch-proving-context.d.ts +51 -0
- package/dest/orchestrator/epoch-proving-context.d.ts.map +1 -0
- package/dest/orchestrator/epoch-proving-context.js +81 -0
- 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/index.d.ts +4 -1
- package/dest/orchestrator/index.d.ts.map +1 -1
- package/dest/orchestrator/index.js +3 -0
- package/dest/orchestrator/orchestrator.d.ts +16 -26
- package/dest/orchestrator/orchestrator.d.ts.map +1 -1
- package/dest/orchestrator/orchestrator.js +76 -206
- package/dest/orchestrator/proving-scheduler.d.ts +72 -0
- package/dest/orchestrator/proving-scheduler.d.ts.map +1 -0
- package/dest/orchestrator/proving-scheduler.js +117 -0
- package/dest/orchestrator/top-tree-orchestrator.d.ts +83 -0
- package/dest/orchestrator/top-tree-orchestrator.d.ts.map +1 -0
- package/dest/orchestrator/top-tree-orchestrator.js +182 -0
- package/dest/orchestrator/top-tree-proving-scheduler.d.ts +62 -0
- package/dest/orchestrator/top-tree-proving-scheduler.d.ts.map +1 -0
- package/dest/orchestrator/top-tree-proving-scheduler.js +73 -0
- package/dest/orchestrator/top-tree-proving-state.d.ts +61 -0
- package/dest/orchestrator/top-tree-proving-state.d.ts.map +1 -0
- package/dest/orchestrator/top-tree-proving-state.js +185 -0
- package/dest/prover-client/prover-client.d.ts +64 -5
- package/dest/prover-client/prover-client.d.ts.map +1 -1
- package/dest/prover-client/prover-client.js +58 -8
- package/dest/proving_broker/broker_prover_facade.d.ts +1 -1
- package/dest/proving_broker/broker_prover_facade.d.ts.map +1 -1
- package/dest/proving_broker/broker_prover_facade.js +13 -19
- package/dest/proving_broker/config.d.ts +11 -67
- package/dest/proving_broker/config.d.ts.map +1 -1
- package/dest/proving_broker/config.js +16 -5
- package/dest/proving_broker/index.d.ts +2 -1
- package/dest/proving_broker/index.d.ts.map +1 -1
- package/dest/proving_broker/index.js +1 -0
- 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 +8 -5
- package/dest/proving_broker/proving_broker.d.ts.map +1 -1
- package/dest/proving_broker/proving_broker.js +68 -11
- package/dest/proving_broker/proving_broker_database/persisted.js +2 -2
- package/dest/proving_broker/proving_broker_instrumentation.d.ts +3 -1
- package/dest/proving_broker/proving_broker_instrumentation.d.ts.map +1 -1
- package/dest/proving_broker/proving_broker_instrumentation.js +7 -0
- package/dest/proving_broker/rpc.d.ts +6 -2
- package/dest/proving_broker/rpc.d.ts.map +1 -1
- package/dest/proving_broker/rpc.js +87 -23
- package/dest/test/mock_prover.d.ts +4 -4
- package/package.json +18 -19
- package/src/config.ts +18 -2
- package/src/light/lightweight_checkpoint_builder.ts +56 -25
- package/src/mocks/test_context.ts +13 -10
- package/src/orchestrator/block-building-helpers.ts +2 -2
- package/src/orchestrator/block-proving-state.ts +9 -0
- package/src/orchestrator/checkpoint-proving-state.ts +18 -5
- package/src/orchestrator/checkpoint-sub-tree-orchestrator.ts +271 -0
- package/src/orchestrator/epoch-proving-context.ts +101 -0
- package/src/orchestrator/epoch-proving-state.ts +6 -4
- package/src/orchestrator/index.ts +8 -0
- package/src/orchestrator/orchestrator.ts +98 -268
- package/src/orchestrator/proving-scheduler.ts +156 -0
- package/src/orchestrator/top-tree-orchestrator.ts +314 -0
- package/src/orchestrator/top-tree-proving-scheduler.ts +154 -0
- package/src/orchestrator/top-tree-proving-state.ts +220 -0
- package/src/prover-client/prover-client.ts +132 -9
- package/src/proving_broker/broker_prover_facade.ts +17 -20
- package/src/proving_broker/config.ts +16 -2
- package/src/proving_broker/index.ts +1 -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 +64 -8
- package/src/proving_broker/proving_broker_database/persisted.ts +2 -2
- package/src/proving_broker/proving_broker_instrumentation.ts +9 -0
- package/src/proving_broker/rpc.ts +46 -20
- 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,7 +1,7 @@
|
|
|
1
1
|
import { BatchedBlob, FinalBlobBatchingChallenges } from '@aztec/blob-lib/types';
|
|
2
2
|
import { BlockNumber, EpochNumber } from '@aztec/foundation/branded-types';
|
|
3
3
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
4
|
-
import {
|
|
4
|
+
import type { LoggerBindings } from '@aztec/foundation/log';
|
|
5
5
|
import { EthAddress } from '@aztec/stdlib/block';
|
|
6
6
|
import type { EpochProver, ForkMerkleTreeOperations, ReadonlyWorldStateAccess, ServerCircuitProver } from '@aztec/stdlib/interfaces/server';
|
|
7
7
|
import type { Proof } from '@aztec/stdlib/proofs';
|
|
@@ -10,6 +10,9 @@ import type { BlockHeader, ProcessedTx, Tx } from '@aztec/stdlib/tx';
|
|
|
10
10
|
import type { UInt64 } from '@aztec/stdlib/types';
|
|
11
11
|
import { type TelemetryClient, type Tracer } from '@aztec/telemetry-client';
|
|
12
12
|
import type { BlockProvingState } from './block-proving-state.js';
|
|
13
|
+
import type { CheckpointProvingState } from './checkpoint-proving-state.js';
|
|
14
|
+
import { EpochProvingState, type ProvingResult } from './epoch-proving-state.js';
|
|
15
|
+
import { TopTreeProvingScheduler } from './top-tree-proving-scheduler.js';
|
|
13
16
|
/**
|
|
14
17
|
* Implements an event driven proving scheduler to build the recursive proof tree. The idea being:
|
|
15
18
|
* 1. Transactions are provided to the scheduler post simulation.
|
|
@@ -23,22 +26,21 @@ import type { BlockProvingState } from './block-proving-state.js';
|
|
|
23
26
|
/**
|
|
24
27
|
* The orchestrator, managing the flow of recursive proving operations required to build the rollup proof tree.
|
|
25
28
|
*/
|
|
26
|
-
export declare class ProvingOrchestrator implements EpochProver {
|
|
29
|
+
export declare class ProvingOrchestrator extends TopTreeProvingScheduler implements EpochProver {
|
|
27
30
|
private dbProvider;
|
|
28
|
-
private prover;
|
|
29
31
|
private readonly proverId;
|
|
30
32
|
private readonly cancelJobsOnStop;
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
private provingPromise;
|
|
33
|
+
protected provingState: EpochProvingState | undefined;
|
|
34
|
+
protected provingPromise: Promise<ProvingResult> | undefined;
|
|
34
35
|
private metrics;
|
|
35
36
|
private dbs;
|
|
36
|
-
|
|
37
|
-
constructor(dbProvider: ReadonlyWorldStateAccess & ForkMerkleTreeOperations, prover: ServerCircuitProver, proverId: EthAddress, cancelJobsOnStop?: boolean, telemetryClient?: TelemetryClient, bindings?: LoggerBindings);
|
|
37
|
+
constructor(dbProvider: ReadonlyWorldStateAccess & ForkMerkleTreeOperations, prover: ServerCircuitProver, proverId: EthAddress, cancelJobsOnStop: boolean | undefined, enqueueConcurrency: number, telemetryClient?: TelemetryClient, bindings?: LoggerBindings);
|
|
38
38
|
get tracer(): Tracer;
|
|
39
39
|
getProverId(): EthAddress;
|
|
40
40
|
getNumActiveForks(): number;
|
|
41
|
-
|
|
41
|
+
protected cancelInternal(): void;
|
|
42
|
+
protected wrapCircuitCall<T>(circuitName: string, fn: (signal: AbortSignal) => Promise<T>): (signal: AbortSignal) => Promise<T>;
|
|
43
|
+
protected onRootRollupComplete(state: EpochProvingState): void;
|
|
42
44
|
startNewEpoch(epochNumber: EpochNumber, totalNumCheckpoints: number, finalBlobBatchingChallenges: FinalBlobBatchingChallenges): void;
|
|
43
45
|
/**
|
|
44
46
|
* Starts a new checkpoint.
|
|
@@ -79,6 +81,7 @@ export declare class ProvingOrchestrator implements EpochProver {
|
|
|
79
81
|
* If cancelJobsOnStop is false (default), jobs remain in the broker queue and can be reused on restart/reorg.
|
|
80
82
|
*/
|
|
81
83
|
cancel(): void;
|
|
84
|
+
private getDbForBlock;
|
|
82
85
|
/**
|
|
83
86
|
* Returns the proof for the current epoch.
|
|
84
87
|
*/
|
|
@@ -87,18 +90,10 @@ export declare class ProvingOrchestrator implements EpochProver {
|
|
|
87
90
|
proof: Proof;
|
|
88
91
|
batchedBlobInputs: BatchedBlob;
|
|
89
92
|
}>;
|
|
90
|
-
private cleanupDBFork;
|
|
91
|
-
/**
|
|
92
|
-
* Enqueue a job to be scheduled
|
|
93
|
-
* @param provingState - The proving state object being operated on
|
|
94
|
-
* @param jobType - The type of job to be queued
|
|
95
|
-
* @param job - The actual job, returns a promise notifying of the job's completion
|
|
96
|
-
*/
|
|
97
|
-
private deferredProving;
|
|
98
93
|
private updateL1ToL2MessageTree;
|
|
99
94
|
private prepareBaseRollupInputs;
|
|
100
95
|
private enqueueBaseRollup;
|
|
101
|
-
|
|
96
|
+
protected getOrEnqueueChonkVerifier(provingState: BlockProvingState, txIndex: number): void;
|
|
102
97
|
private doEnqueueChonkVerifier;
|
|
103
98
|
private enqueueMergeRollup;
|
|
104
99
|
private enqueueBlockRootRollup;
|
|
@@ -107,15 +102,10 @@ export declare class ProvingOrchestrator implements EpochProver {
|
|
|
107
102
|
private enqueueRootParityCircuit;
|
|
108
103
|
private enqueueBlockMergeRollup;
|
|
109
104
|
private enqueueCheckpointRootRollup;
|
|
110
|
-
private enqueueCheckpointMergeRollup;
|
|
111
|
-
private enqueueEpochPadding;
|
|
112
|
-
private enqueueRootRollup;
|
|
113
105
|
private checkAndEnqueueNextMergeRollup;
|
|
114
106
|
private checkAndEnqueueBlockRootRollup;
|
|
115
107
|
private checkAndEnqueueNextBlockMergeRollup;
|
|
116
|
-
|
|
117
|
-
private checkAndEnqueueNextCheckpointMergeRollup;
|
|
118
|
-
private checkAndEnqueueRootRollup;
|
|
108
|
+
protected checkAndEnqueueCheckpointRootRollup(provingState: CheckpointProvingState): Promise<void>;
|
|
119
109
|
/**
|
|
120
110
|
* Executes the VM circuit for a public function, will enqueue the corresponding kernel if the
|
|
121
111
|
* previous kernel is ready
|
|
@@ -123,6 +113,6 @@ export declare class ProvingOrchestrator implements EpochProver {
|
|
|
123
113
|
* @param txIndex - The index of the transaction being proven
|
|
124
114
|
*/
|
|
125
115
|
private enqueueVM;
|
|
126
|
-
|
|
116
|
+
protected checkAndEnqueueBaseRollup(provingState: BlockProvingState, txIndex: number): void;
|
|
127
117
|
}
|
|
128
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
118
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JjaGVzdHJhdG9yLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvb3JjaGVzdHJhdG9yL29yY2hlc3RyYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsV0FBVyxFQUFFLDJCQUEyQixFQUFjLE1BQU0sdUJBQXVCLENBQUM7QUFPN0YsT0FBTyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUMzRSxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDcEQsT0FBTyxLQUFLLEVBQUUsY0FBYyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFNNUQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2pELE9BQU8sS0FBSyxFQUNWLFdBQVcsRUFDWCx3QkFBd0IsRUFHeEIsd0JBQXdCLEVBQ3hCLG1CQUFtQixFQUNwQixNQUFNLGlDQUFpQyxDQUFDO0FBRXpDLE9BQU8sS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFNTCxzQkFBc0IsRUFLdEIsc0JBQXNCLEVBQ3ZCLE1BQU0sc0JBQXNCLENBQUM7QUFHOUIsT0FBTyxLQUFLLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxFQUFFLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNyRSxPQUFPLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNsRCxPQUFPLEVBRUwsS0FBSyxlQUFlLEVBQ3BCLEtBQUssTUFBTSxFQUlaLE1BQU0seUJBQXlCLENBQUM7QUFlakMsT0FBTyxLQUFLLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNsRSxPQUFPLEtBQUssRUFBRSxzQkFBc0IsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQzVFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxLQUFLLGFBQWEsRUFBc0IsTUFBTSwwQkFB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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../src/orchestrator/orchestrator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,2BAA2B,EAAc,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../src/orchestrator/orchestrator.ts"],"names":[],"mappings":"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"}
|
|
@@ -371,16 +371,13 @@ function _apply_decs_2203_r(targetClass, memberDecs, classDecs, parentClass) {
|
|
|
371
371
|
return (_apply_decs_2203_r = applyDecs2203RFactory())(targetClass, memberDecs, classDecs, parentClass);
|
|
372
372
|
}
|
|
373
373
|
var _dec, _dec1, _dec2, _dec3, _dec4, _initProto;
|
|
374
|
-
import { L1_TO_L2_MSG_SUBTREE_HEIGHT, L1_TO_L2_MSG_SUBTREE_ROOT_SIBLING_PATH_LENGTH,
|
|
374
|
+
import { L1_TO_L2_MSG_SUBTREE_HEIGHT, L1_TO_L2_MSG_SUBTREE_ROOT_SIBLING_PATH_LENGTH, NUM_BASE_PARITY_PER_ROOT_PARITY } from '@aztec/constants';
|
|
375
375
|
import { BlockNumber } from '@aztec/foundation/branded-types';
|
|
376
|
-
import { padArrayEnd } from '@aztec/foundation/collection';
|
|
377
|
-
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
378
|
-
import { AbortError } from '@aztec/foundation/error';
|
|
379
|
-
import { createLogger } from '@aztec/foundation/log';
|
|
380
376
|
import { promiseWithResolvers } from '@aztec/foundation/promise';
|
|
381
377
|
import { assertLength } from '@aztec/foundation/serialize';
|
|
382
378
|
import { pushTestData } from '@aztec/foundation/testing';
|
|
383
379
|
import { elapsed } from '@aztec/foundation/timer';
|
|
380
|
+
import { appendL1ToL2MessagesToTree } from '@aztec/stdlib/messaging';
|
|
384
381
|
import { BlockRootEmptyTxFirstRollupPrivateInputs, BlockRootFirstRollupPrivateInputs, BlockRootSingleTxFirstRollupPrivateInputs, BlockRootSingleTxRollupPrivateInputs, CheckpointRootSingleBlockRollupPrivateInputs, PrivateTxBaseRollupPrivateInputs } from '@aztec/stdlib/rollup';
|
|
385
382
|
import { MerkleTreeId } from '@aztec/stdlib/trees';
|
|
386
383
|
import { Attributes, getTelemetryClient, trackSpan, wrapCallbackInSpan } from '@aztec/telemetry-client';
|
|
@@ -388,6 +385,7 @@ import { inspect } from 'util';
|
|
|
388
385
|
import { buildHeaderFromCircuitOutputs, getLastSiblingPath, getPublicChonkVerifierPrivateInputsFromTx, getRootTreeSiblingPath, getSubtreeSiblingPath, getTreeSnapshot, insertSideEffectsAndBuildBaseRollupHints, validatePartialState, validateTx } from './block-building-helpers.js';
|
|
389
386
|
import { EpochProvingState } from './epoch-proving-state.js';
|
|
390
387
|
import { ProvingOrchestratorMetrics } from './orchestrator_metrics.js';
|
|
388
|
+
import { TopTreeProvingScheduler } from './top-tree-proving-scheduler.js';
|
|
391
389
|
import { TxProvingState } from './tx-proving-state.js';
|
|
392
390
|
_dec = trackSpan('ProvingOrchestrator.startNewBlock', (blockNumber)=>({
|
|
393
391
|
[Attributes.BLOCK_NUMBER]: blockNumber
|
|
@@ -409,9 +407,8 @@ _dec = trackSpan('ProvingOrchestrator.startNewBlock', (blockNumber)=>({
|
|
|
409
407
|
* The proving implementation is determined by the provided prover. This could be for example a local prover or a remote prover pool.
|
|
410
408
|
*/ /**
|
|
411
409
|
* The orchestrator, managing the flow of recursive proving operations required to build the rollup proof tree.
|
|
412
|
-
*/ export class ProvingOrchestrator {
|
|
410
|
+
*/ export class ProvingOrchestrator extends TopTreeProvingScheduler {
|
|
413
411
|
dbProvider;
|
|
414
|
-
prover;
|
|
415
412
|
proverId;
|
|
416
413
|
cancelJobsOnStop;
|
|
417
414
|
static{
|
|
@@ -444,22 +441,11 @@ _dec = trackSpan('ProvingOrchestrator.startNewBlock', (blockNumber)=>({
|
|
|
444
441
|
], []));
|
|
445
442
|
}
|
|
446
443
|
provingState;
|
|
447
|
-
pendingProvingJobs;
|
|
448
444
|
provingPromise;
|
|
449
445
|
metrics;
|
|
450
|
-
// eslint-disable-next-line aztec-custom/no-non-primitive-in-collections
|
|
451
446
|
dbs;
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
this.dbProvider = dbProvider;
|
|
455
|
-
this.prover = prover;
|
|
456
|
-
this.proverId = proverId;
|
|
457
|
-
this.cancelJobsOnStop = cancelJobsOnStop;
|
|
458
|
-
this.provingState = (_initProto(this), undefined);
|
|
459
|
-
this.pendingProvingJobs = [];
|
|
460
|
-
this.provingPromise = undefined;
|
|
461
|
-
this.dbs = new Map();
|
|
462
|
-
this.logger = createLogger('prover-client:orchestrator', bindings);
|
|
447
|
+
constructor(dbProvider, prover, proverId, cancelJobsOnStop = false, enqueueConcurrency, telemetryClient = getTelemetryClient(), bindings){
|
|
448
|
+
super(prover, enqueueConcurrency, 'prover-client:orchestrator', bindings), this.dbProvider = dbProvider, this.proverId = proverId, this.cancelJobsOnStop = cancelJobsOnStop, this.provingState = (_initProto(this), undefined), this.provingPromise = undefined, this.dbs = new Map();
|
|
463
449
|
this.metrics = new ProvingOrchestratorMetrics(telemetryClient, 'ProvingOrchestrator');
|
|
464
450
|
}
|
|
465
451
|
get tracer() {
|
|
@@ -471,9 +457,18 @@ _dec = trackSpan('ProvingOrchestrator.startNewBlock', (blockNumber)=>({
|
|
|
471
457
|
getNumActiveForks() {
|
|
472
458
|
return this.dbs.size;
|
|
473
459
|
}
|
|
474
|
-
|
|
460
|
+
cancelInternal() {
|
|
475
461
|
this.cancel();
|
|
476
|
-
|
|
462
|
+
}
|
|
463
|
+
wrapCircuitCall(circuitName, fn) {
|
|
464
|
+
return wrapCallbackInSpan(this.tracer, `ProvingOrchestrator.prover.${circuitName}`, {
|
|
465
|
+
[Attributes.PROTOCOL_CIRCUIT_NAME]: circuitName
|
|
466
|
+
}, fn);
|
|
467
|
+
}
|
|
468
|
+
onRootRollupComplete(state) {
|
|
469
|
+
state.resolve({
|
|
470
|
+
status: 'success'
|
|
471
|
+
});
|
|
477
472
|
}
|
|
478
473
|
startNewEpoch(epochNumber, totalNumCheckpoints, finalBlobBatchingChallenges) {
|
|
479
474
|
if (this.provingState?.verifyState()) {
|
|
@@ -506,10 +501,7 @@ _dec = trackSpan('ProvingOrchestrator.startNewBlock', (blockNumber)=>({
|
|
|
506
501
|
const lastBlockNumber = headerOfLastBlockInPreviousCheckpoint.globalVariables.blockNumber;
|
|
507
502
|
const db = await this.dbProvider.fork(lastBlockNumber);
|
|
508
503
|
const firstBlockNumber = BlockNumber(lastBlockNumber + 1);
|
|
509
|
-
this.dbs.set(firstBlockNumber,
|
|
510
|
-
fork: db,
|
|
511
|
-
cleanupPromise: undefined
|
|
512
|
-
});
|
|
504
|
+
this.dbs.set(firstBlockNumber, db);
|
|
513
505
|
// Get archive sibling path before any block in this checkpoint lands.
|
|
514
506
|
const lastArchiveSiblingPath = await getLastSiblingPath(MerkleTreeId.ARCHIVE, db);
|
|
515
507
|
// Insert all the l1 to l2 messages into the db. And get the states before and after the insertion.
|
|
@@ -539,12 +531,9 @@ _dec = trackSpan('ProvingOrchestrator.startNewBlock', (blockNumber)=>({
|
|
|
539
531
|
if (!this.dbs.has(blockNumber)) {
|
|
540
532
|
// Fork world state at the end of the immediately previous block
|
|
541
533
|
const db = await this.dbProvider.fork(BlockNumber(blockNumber - 1));
|
|
542
|
-
this.dbs.set(blockNumber,
|
|
543
|
-
fork: db,
|
|
544
|
-
cleanupPromise: undefined
|
|
545
|
-
});
|
|
534
|
+
this.dbs.set(blockNumber, db);
|
|
546
535
|
}
|
|
547
|
-
const db = this.
|
|
536
|
+
const db = this.getDbForBlock(blockNumber);
|
|
548
537
|
// Get archive snapshot and sibling path before any txs in this block lands.
|
|
549
538
|
const lastArchiveTreeSnapshot = await getTreeSnapshot(MerkleTreeId.ARCHIVE, db);
|
|
550
539
|
const lastArchiveSiblingPath = await getRootTreeSiblingPath(MerkleTreeId.ARCHIVE, db);
|
|
@@ -594,7 +583,7 @@ _dec = trackSpan('ProvingOrchestrator.startNewBlock', (blockNumber)=>({
|
|
|
594
583
|
throw new Error(`Block ${blockNumber} has been initialized with transactions.`);
|
|
595
584
|
}
|
|
596
585
|
this.logger.info(`Adding ${txs.length} transactions to block ${blockNumber}`);
|
|
597
|
-
const db = this.
|
|
586
|
+
const db = this.getDbForBlock(blockNumber);
|
|
598
587
|
const lastArchive = provingState.lastArchiveTreeSnapshot;
|
|
599
588
|
const newL1ToL2MessageTreeSnapshot = provingState.newL1ToL2MessageTreeSnapshot;
|
|
600
589
|
const spongeBlobState = provingState.getStartSpongeBlob().clone();
|
|
@@ -683,11 +672,17 @@ _dec = trackSpan('ProvingOrchestrator.startNewBlock', (blockNumber)=>({
|
|
|
683
672
|
this.logger.error(`Block header mismatch: header=${header} expectedHeader=${expectedHeader}`);
|
|
684
673
|
throw new Error('Block header mismatch');
|
|
685
674
|
}
|
|
686
|
-
// Get db for this block
|
|
687
|
-
const db = this.
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
675
|
+
// Get db for this block and remove from map — no other code should use it after this point.
|
|
676
|
+
const db = this.getDbForBlock(provingState.blockNumber);
|
|
677
|
+
this.dbs.delete(provingState.blockNumber);
|
|
678
|
+
// Update the archive tree, capture the snapshot, and close the fork deterministically.
|
|
679
|
+
try {
|
|
680
|
+
this.logger.verbose(`Updating archive tree with block ${provingState.blockNumber} header ${(await header.hash()).toString()}`);
|
|
681
|
+
await db.updateArchive(header);
|
|
682
|
+
provingState.setBuiltArchive(await getTreeSnapshot(MerkleTreeId.ARCHIVE, db));
|
|
683
|
+
} finally{
|
|
684
|
+
await db.close();
|
|
685
|
+
}
|
|
691
686
|
await this.verifyBuiltBlockAgainstSyncedState(provingState);
|
|
692
687
|
return header;
|
|
693
688
|
}
|
|
@@ -703,16 +698,18 @@ _dec = trackSpan('ProvingOrchestrator.startNewBlock', (blockNumber)=>({
|
|
|
703
698
|
this.logger.debug('Block root rollup proof not built yet, skipping header check.');
|
|
704
699
|
return;
|
|
705
700
|
}
|
|
701
|
+
const newArchive = provingState.getBuiltArchive();
|
|
702
|
+
if (!newArchive) {
|
|
703
|
+
this.logger.debug('Archive snapshot not yet captured, skipping header check.');
|
|
704
|
+
return;
|
|
705
|
+
}
|
|
706
706
|
const header = await buildHeaderFromCircuitOutputs(output);
|
|
707
707
|
if (!(await header.hash()).equals(await builtBlockHeader.hash())) {
|
|
708
708
|
this.logger.error(`Block header mismatch.\nCircuit: ${inspect(header)}\nComputed: ${inspect(builtBlockHeader)}`);
|
|
709
709
|
provingState.reject(`Block header hash mismatch.`);
|
|
710
710
|
return;
|
|
711
711
|
}
|
|
712
|
-
// Get db for this block
|
|
713
712
|
const blockNumber = provingState.blockNumber;
|
|
714
|
-
const db = this.dbs.get(blockNumber).fork;
|
|
715
|
-
const newArchive = await getTreeSnapshot(MerkleTreeId.ARCHIVE, db);
|
|
716
713
|
const syncedArchive = await getTreeSnapshot(MerkleTreeId.ARCHIVE, this.dbProvider.getSnapshot(blockNumber));
|
|
717
714
|
if (!syncedArchive.equals(newArchive)) {
|
|
718
715
|
this.logger.error(`Archive tree mismatch for block ${blockNumber}: world state synced to ${inspect(syncedArchive)} but built ${inspect(newArchive)}`);
|
|
@@ -725,23 +722,25 @@ _dec = trackSpan('ProvingOrchestrator.startNewBlock', (blockNumber)=>({
|
|
|
725
722
|
provingState.reject(`New archive mismatch.`);
|
|
726
723
|
return;
|
|
727
724
|
}
|
|
728
|
-
// TODO(palla/prover): This closes the fork only on the happy path. If this epoch orchestrator
|
|
729
|
-
// is aborted and never reaches this point, it will leak the fork. We need to add a global cleanup,
|
|
730
|
-
// but have to make sure it only runs once all operations are completed, otherwise some function here
|
|
731
|
-
// will attempt to access the fork after it was closed.
|
|
732
|
-
void this.cleanupDBFork(blockNumber);
|
|
733
725
|
}
|
|
734
726
|
/**
|
|
735
727
|
* Cancel any further proving.
|
|
736
728
|
* If cancelJobsOnStop is true, aborts all pending jobs with the broker (which marks them as 'Aborted').
|
|
737
729
|
* If cancelJobsOnStop is false (default), jobs remain in the broker queue and can be reused on restart/reorg.
|
|
738
730
|
*/ cancel() {
|
|
739
|
-
|
|
740
|
-
for (const controller of this.pendingProvingJobs){
|
|
741
|
-
controller.abort();
|
|
742
|
-
}
|
|
743
|
-
}
|
|
731
|
+
this.resetSchedulerState(this.cancelJobsOnStop);
|
|
744
732
|
this.provingState?.cancel();
|
|
733
|
+
for (const [blockNumber, db] of this.dbs.entries()){
|
|
734
|
+
void db.close().catch((err)=>this.logger.error(`Error closing db for block ${blockNumber}`, err));
|
|
735
|
+
}
|
|
736
|
+
this.dbs.clear();
|
|
737
|
+
}
|
|
738
|
+
getDbForBlock(blockNumber) {
|
|
739
|
+
const db = this.dbs.get(blockNumber);
|
|
740
|
+
if (!db) {
|
|
741
|
+
throw new Error(`World state fork for block ${blockNumber} not found.`);
|
|
742
|
+
}
|
|
743
|
+
return db;
|
|
745
744
|
}
|
|
746
745
|
/**
|
|
747
746
|
* Returns the proof for the current epoch.
|
|
@@ -761,77 +760,11 @@ _dec = trackSpan('ProvingOrchestrator.startNewBlock', (blockNumber)=>({
|
|
|
761
760
|
});
|
|
762
761
|
return epochProofResult;
|
|
763
762
|
}
|
|
764
|
-
async cleanupDBFork(blockNumber) {
|
|
765
|
-
this.logger.debug(`Cleaning up world state fork for ${blockNumber}`);
|
|
766
|
-
const fork = this.dbs.get(blockNumber);
|
|
767
|
-
if (!fork) {
|
|
768
|
-
return;
|
|
769
|
-
}
|
|
770
|
-
try {
|
|
771
|
-
if (!fork.cleanupPromise) {
|
|
772
|
-
fork.cleanupPromise = fork.fork.close();
|
|
773
|
-
}
|
|
774
|
-
await fork.cleanupPromise;
|
|
775
|
-
this.dbs.delete(blockNumber);
|
|
776
|
-
} catch (err) {
|
|
777
|
-
this.logger.error(`Error closing db for block ${blockNumber}`, err);
|
|
778
|
-
}
|
|
779
|
-
}
|
|
780
|
-
/**
|
|
781
|
-
* Enqueue a job to be scheduled
|
|
782
|
-
* @param provingState - The proving state object being operated on
|
|
783
|
-
* @param jobType - The type of job to be queued
|
|
784
|
-
* @param job - The actual job, returns a promise notifying of the job's completion
|
|
785
|
-
*/ deferredProving(provingState, request, callback) {
|
|
786
|
-
if (!provingState.verifyState()) {
|
|
787
|
-
this.logger.debug(`Not enqueuing job, state no longer valid`);
|
|
788
|
-
return;
|
|
789
|
-
}
|
|
790
|
-
const controller = new AbortController();
|
|
791
|
-
this.pendingProvingJobs.push(controller);
|
|
792
|
-
// We use a 'safeJob'. We don't want promise rejections in the proving pool, we want to capture the error here
|
|
793
|
-
// and reject the proving job whilst keeping the event loop free of rejections
|
|
794
|
-
const safeJob = async ()=>{
|
|
795
|
-
try {
|
|
796
|
-
// there's a delay between enqueueing this job and it actually running
|
|
797
|
-
if (controller.signal.aborted) {
|
|
798
|
-
return;
|
|
799
|
-
}
|
|
800
|
-
const result = await request(controller.signal);
|
|
801
|
-
if (!provingState.verifyState()) {
|
|
802
|
-
this.logger.debug(`State no longer valid, discarding result`);
|
|
803
|
-
return;
|
|
804
|
-
}
|
|
805
|
-
// we could have been cancelled whilst waiting for the result
|
|
806
|
-
// and the prover ignored the signal. Drop the result in that case
|
|
807
|
-
if (controller.signal.aborted) {
|
|
808
|
-
return;
|
|
809
|
-
}
|
|
810
|
-
await callback(result);
|
|
811
|
-
} catch (err) {
|
|
812
|
-
if (err instanceof AbortError) {
|
|
813
|
-
// operation was cancelled, probably because the block was cancelled
|
|
814
|
-
// drop this result
|
|
815
|
-
return;
|
|
816
|
-
}
|
|
817
|
-
this.logger.error(`Error thrown when proving job`, err);
|
|
818
|
-
provingState.reject(`${err}`);
|
|
819
|
-
} finally{
|
|
820
|
-
const index = this.pendingProvingJobs.indexOf(controller);
|
|
821
|
-
if (index > -1) {
|
|
822
|
-
this.pendingProvingJobs.splice(index, 1);
|
|
823
|
-
}
|
|
824
|
-
}
|
|
825
|
-
};
|
|
826
|
-
// let the callstack unwind before adding the job to the queue
|
|
827
|
-
setImmediate(()=>void safeJob());
|
|
828
|
-
}
|
|
829
763
|
async updateL1ToL2MessageTree(l1ToL2Messages, db) {
|
|
830
|
-
const l1ToL2MessagesPadded = padArrayEnd(l1ToL2Messages, Fr.ZERO, NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP, 'Too many L1 to L2 messages');
|
|
831
764
|
const lastL1ToL2MessageTreeSnapshot = await getTreeSnapshot(MerkleTreeId.L1_TO_L2_MESSAGE_TREE, db);
|
|
832
765
|
const lastL1ToL2MessageSubtreeRootSiblingPath = assertLength(await getSubtreeSiblingPath(MerkleTreeId.L1_TO_L2_MESSAGE_TREE, L1_TO_L2_MSG_SUBTREE_HEIGHT, db), L1_TO_L2_MSG_SUBTREE_ROOT_SIBLING_PATH_LENGTH);
|
|
833
766
|
// Update the local trees to include the new l1 to l2 messages
|
|
834
|
-
await db
|
|
767
|
+
await appendL1ToL2MessagesToTree(db, l1ToL2Messages);
|
|
835
768
|
const newL1ToL2MessageTreeSnapshot = await getTreeSnapshot(MerkleTreeId.L1_TO_L2_MESSAGE_TREE, db);
|
|
836
769
|
const newL1ToL2MessageSubtreeRootSiblingPath = assertLength(await getSubtreeSiblingPath(MerkleTreeId.L1_TO_L2_MESSAGE_TREE, L1_TO_L2_MSG_SUBTREE_HEIGHT, db), L1_TO_L2_MSG_SUBTREE_ROOT_SIBLING_PATH_LENGTH);
|
|
837
770
|
return {
|
|
@@ -910,7 +843,6 @@ _dec = trackSpan('ProvingOrchestrator.startNewBlock', (blockNumber)=>({
|
|
|
910
843
|
}
|
|
911
844
|
const txProvingState = provingState.getTxProvingState(txIndex);
|
|
912
845
|
const txHash = txProvingState.processedTx.hash.toString();
|
|
913
|
-
NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH;
|
|
914
846
|
const handleResult = (result)=>{
|
|
915
847
|
this.logger.debug(`Got chonk verifier proof for tx index: ${txIndex}`, {
|
|
916
848
|
txHash
|
|
@@ -985,18 +917,21 @@ _dec = trackSpan('ProvingOrchestrator.startNewBlock', (blockNumber)=>({
|
|
|
985
917
|
return this.prover.getBlockRootRollupProof(inputs, signal, provingState.epochNumber);
|
|
986
918
|
}
|
|
987
919
|
}), async (result)=>{
|
|
988
|
-
this.logger.debug(`Completed ${rollupType} proof for block ${provingState.blockNumber}
|
|
920
|
+
this.logger.debug(`Completed ${rollupType} proof for block ${provingState.blockNumber}`, {
|
|
921
|
+
blockNumber: provingState.blockNumber,
|
|
922
|
+
checkpointIndex: provingState.parentCheckpoint.index,
|
|
923
|
+
...result.inputs.toInspect()
|
|
924
|
+
});
|
|
989
925
|
const leafLocation = provingState.setBlockRootRollupProof(result);
|
|
990
926
|
const checkpointProvingState = provingState.parentCheckpoint;
|
|
991
|
-
//
|
|
927
|
+
// Verification is called from both here and setBlockCompleted. Whichever runs last
|
|
928
|
+
// will be the first to see all three pieces (header, proof output, archive) and run the checks.
|
|
992
929
|
await this.verifyBuiltBlockAgainstSyncedState(provingState);
|
|
993
930
|
if (checkpointProvingState.totalNumBlocks === 1) {
|
|
994
|
-
this.checkAndEnqueueCheckpointRootRollup(checkpointProvingState);
|
|
931
|
+
await this.checkAndEnqueueCheckpointRootRollup(checkpointProvingState);
|
|
995
932
|
} else {
|
|
996
|
-
this.checkAndEnqueueNextBlockMergeRollup(checkpointProvingState, leafLocation);
|
|
933
|
+
await this.checkAndEnqueueNextBlockMergeRollup(checkpointProvingState, leafLocation);
|
|
997
934
|
}
|
|
998
|
-
// We are finished with the block at this point, ensure the fork is cleaned up
|
|
999
|
-
void this.cleanupDBFork(provingState.blockNumber);
|
|
1000
935
|
});
|
|
1001
936
|
}
|
|
1002
937
|
// Executes the base parity circuit and stores the intermediate state for the root parity circuit
|
|
@@ -1057,12 +992,17 @@ _dec = trackSpan('ProvingOrchestrator.startNewBlock', (blockNumber)=>({
|
|
|
1057
992
|
const inputs = provingState.getBlockMergeRollupInputs(location);
|
|
1058
993
|
this.deferredProving(provingState, wrapCallbackInSpan(this.tracer, 'ProvingOrchestrator.prover.getBlockMergeRollupProof', {
|
|
1059
994
|
[Attributes.PROTOCOL_CIRCUIT_NAME]: 'rollup-block-merge'
|
|
1060
|
-
}, (signal)=>this.prover.getBlockMergeRollupProof(inputs, signal, provingState.epochNumber)), (result)=>{
|
|
995
|
+
}, (signal)=>this.prover.getBlockMergeRollupProof(inputs, signal, provingState.epochNumber)), async (result)=>{
|
|
996
|
+
this.logger.debug(`Completed block merge rollup proof for checkpoint ${provingState.index}`, {
|
|
997
|
+
checkpointIndex: provingState.index,
|
|
998
|
+
mergeLocation: location,
|
|
999
|
+
...result.inputs.toInspect()
|
|
1000
|
+
});
|
|
1061
1001
|
provingState.setBlockMergeRollupProof(location, result);
|
|
1062
|
-
this.checkAndEnqueueNextBlockMergeRollup(provingState, location);
|
|
1002
|
+
await this.checkAndEnqueueNextBlockMergeRollup(provingState, location);
|
|
1063
1003
|
});
|
|
1064
1004
|
}
|
|
1065
|
-
enqueueCheckpointRootRollup(provingState) {
|
|
1005
|
+
async enqueueCheckpointRootRollup(provingState) {
|
|
1066
1006
|
if (!provingState.verifyState()) {
|
|
1067
1007
|
this.logger.debug('Not running checkpoint root rollup. State no longer valid.');
|
|
1068
1008
|
return;
|
|
@@ -1073,7 +1013,7 @@ _dec = trackSpan('ProvingOrchestrator.startNewBlock', (blockNumber)=>({
|
|
|
1073
1013
|
}
|
|
1074
1014
|
const rollupType = provingState.getCheckpointRootRollupType();
|
|
1075
1015
|
this.logger.debug(`Enqueuing ${rollupType} for checkpoint ${provingState.index}.`);
|
|
1076
|
-
const inputs = provingState.getCheckpointRootRollupInputs();
|
|
1016
|
+
const inputs = await provingState.getCheckpointRootRollupInputs();
|
|
1077
1017
|
this.deferredProving(provingState, wrapCallbackInSpan(this.tracer, 'ProvingOrchestrator.prover.getCheckpointRootRollupProof', {
|
|
1078
1018
|
[Attributes.PROTOCOL_CIRCUIT_NAME]: rollupType
|
|
1079
1019
|
}, (signal)=>{
|
|
@@ -1090,7 +1030,10 @@ _dec = trackSpan('ProvingOrchestrator.startNewBlock', (blockNumber)=>({
|
|
|
1090
1030
|
provingState.reject(`Blob accumulator state mismatch.`);
|
|
1091
1031
|
return;
|
|
1092
1032
|
}
|
|
1093
|
-
this.logger.debug(`Completed ${rollupType} proof for checkpoint ${provingState.index}
|
|
1033
|
+
this.logger.debug(`Completed ${rollupType} proof for checkpoint ${provingState.index}`, {
|
|
1034
|
+
checkpointIndex: provingState.index,
|
|
1035
|
+
...result.inputs.toInspect()
|
|
1036
|
+
});
|
|
1094
1037
|
const leafLocation = provingState.setCheckpointRootRollupProof(result);
|
|
1095
1038
|
const epochProvingState = provingState.parentEpoch;
|
|
1096
1039
|
if (epochProvingState.totalNumCheckpoints === 1) {
|
|
@@ -1100,61 +1043,6 @@ _dec = trackSpan('ProvingOrchestrator.startNewBlock', (blockNumber)=>({
|
|
|
1100
1043
|
}
|
|
1101
1044
|
});
|
|
1102
1045
|
}
|
|
1103
|
-
enqueueCheckpointMergeRollup(provingState, location) {
|
|
1104
|
-
if (!provingState.verifyState()) {
|
|
1105
|
-
this.logger.debug('Not running checkpoint merge rollup. State no longer valid.');
|
|
1106
|
-
return;
|
|
1107
|
-
}
|
|
1108
|
-
if (!provingState.tryStartProvingCheckpointMerge(location)) {
|
|
1109
|
-
this.logger.debug('Checkpoint merge rollup already started.');
|
|
1110
|
-
return;
|
|
1111
|
-
}
|
|
1112
|
-
const inputs = provingState.getCheckpointMergeRollupInputs(location);
|
|
1113
|
-
this.deferredProving(provingState, wrapCallbackInSpan(this.tracer, 'ProvingOrchestrator.prover.getCheckpointMergeRollupProof', {
|
|
1114
|
-
[Attributes.PROTOCOL_CIRCUIT_NAME]: 'rollup-checkpoint-merge'
|
|
1115
|
-
}, (signal)=>this.prover.getCheckpointMergeRollupProof(inputs, signal, provingState.epochNumber)), (result)=>{
|
|
1116
|
-
this.logger.debug('Completed proof for checkpoint merge rollup.');
|
|
1117
|
-
provingState.setCheckpointMergeRollupProof(location, result);
|
|
1118
|
-
this.checkAndEnqueueNextCheckpointMergeRollup(provingState, location);
|
|
1119
|
-
});
|
|
1120
|
-
}
|
|
1121
|
-
enqueueEpochPadding(provingState) {
|
|
1122
|
-
if (!provingState.verifyState()) {
|
|
1123
|
-
this.logger.debug('Not running epoch padding. State no longer valid.');
|
|
1124
|
-
return;
|
|
1125
|
-
}
|
|
1126
|
-
if (!provingState.tryStartProvingPaddingCheckpoint()) {
|
|
1127
|
-
this.logger.debug('Padding checkpoint already started.');
|
|
1128
|
-
return;
|
|
1129
|
-
}
|
|
1130
|
-
this.logger.debug('Padding epoch proof with a padding block root proof.');
|
|
1131
|
-
const inputs = provingState.getPaddingCheckpointInputs();
|
|
1132
|
-
this.deferredProving(provingState, wrapCallbackInSpan(this.tracer, 'ProvingOrchestrator.prover.getCheckpointPaddingRollupProof', {
|
|
1133
|
-
[Attributes.PROTOCOL_CIRCUIT_NAME]: 'rollup-checkpoint-padding'
|
|
1134
|
-
}, (signal)=>this.prover.getCheckpointPaddingRollupProof(inputs, signal, provingState.epochNumber)), (result)=>{
|
|
1135
|
-
this.logger.debug('Completed proof for padding checkpoint.');
|
|
1136
|
-
provingState.setCheckpointPaddingProof(result);
|
|
1137
|
-
this.checkAndEnqueueRootRollup(provingState);
|
|
1138
|
-
});
|
|
1139
|
-
}
|
|
1140
|
-
// Executes the root rollup circuit
|
|
1141
|
-
enqueueRootRollup(provingState) {
|
|
1142
|
-
if (!provingState.verifyState()) {
|
|
1143
|
-
this.logger.debug('Not running root rollup, state no longer valid');
|
|
1144
|
-
return;
|
|
1145
|
-
}
|
|
1146
|
-
this.logger.debug(`Preparing root rollup`);
|
|
1147
|
-
const inputs = provingState.getRootRollupInputs();
|
|
1148
|
-
this.deferredProving(provingState, wrapCallbackInSpan(this.tracer, 'ProvingOrchestrator.prover.getRootRollupProof', {
|
|
1149
|
-
[Attributes.PROTOCOL_CIRCUIT_NAME]: 'rollup-root'
|
|
1150
|
-
}, (signal)=>this.prover.getRootRollupProof(inputs, signal, provingState.epochNumber)), (result)=>{
|
|
1151
|
-
this.logger.verbose(`Orchestrator completed root rollup for epoch ${provingState.epochNumber}`);
|
|
1152
|
-
provingState.setRootRollupProof(result);
|
|
1153
|
-
provingState.resolve({
|
|
1154
|
-
status: 'success'
|
|
1155
|
-
});
|
|
1156
|
-
});
|
|
1157
|
-
}
|
|
1158
1046
|
checkAndEnqueueNextMergeRollup(provingState, currentLocation) {
|
|
1159
1047
|
if (!provingState.isReadyForMergeRollup(currentLocation)) {
|
|
1160
1048
|
return;
|
|
@@ -1173,40 +1061,22 @@ _dec = trackSpan('ProvingOrchestrator.startNewBlock', (blockNumber)=>({
|
|
|
1173
1061
|
}
|
|
1174
1062
|
this.enqueueBlockRootRollup(provingState);
|
|
1175
1063
|
}
|
|
1176
|
-
checkAndEnqueueNextBlockMergeRollup(provingState, currentLocation) {
|
|
1064
|
+
async checkAndEnqueueNextBlockMergeRollup(provingState, currentLocation) {
|
|
1177
1065
|
if (!provingState.isReadyForBlockMerge(currentLocation)) {
|
|
1178
1066
|
return;
|
|
1179
1067
|
}
|
|
1180
1068
|
const parentLocation = provingState.getParentLocation(currentLocation);
|
|
1181
1069
|
if (parentLocation.level === 0) {
|
|
1182
|
-
this.checkAndEnqueueCheckpointRootRollup(provingState);
|
|
1070
|
+
await this.checkAndEnqueueCheckpointRootRollup(provingState);
|
|
1183
1071
|
} else {
|
|
1184
1072
|
this.enqueueBlockMergeRollup(provingState, parentLocation);
|
|
1185
1073
|
}
|
|
1186
1074
|
}
|
|
1187
|
-
checkAndEnqueueCheckpointRootRollup(provingState) {
|
|
1075
|
+
async checkAndEnqueueCheckpointRootRollup(provingState) {
|
|
1188
1076
|
if (!provingState.isReadyForCheckpointRoot()) {
|
|
1189
1077
|
return;
|
|
1190
1078
|
}
|
|
1191
|
-
this.enqueueCheckpointRootRollup(provingState);
|
|
1192
|
-
}
|
|
1193
|
-
checkAndEnqueueNextCheckpointMergeRollup(provingState, currentLocation) {
|
|
1194
|
-
if (!provingState.isReadyForCheckpointMerge(currentLocation)) {
|
|
1195
|
-
return;
|
|
1196
|
-
}
|
|
1197
|
-
const parentLocation = provingState.getParentLocation(currentLocation);
|
|
1198
|
-
if (parentLocation.level === 0) {
|
|
1199
|
-
this.checkAndEnqueueRootRollup(provingState);
|
|
1200
|
-
} else {
|
|
1201
|
-
this.enqueueCheckpointMergeRollup(provingState, parentLocation);
|
|
1202
|
-
}
|
|
1203
|
-
}
|
|
1204
|
-
checkAndEnqueueRootRollup(provingState) {
|
|
1205
|
-
if (!provingState.isReadyForRootRollup()) {
|
|
1206
|
-
this.logger.debug('Not ready for root rollup');
|
|
1207
|
-
return;
|
|
1208
|
-
}
|
|
1209
|
-
this.enqueueRootRollup(provingState);
|
|
1079
|
+
await this.enqueueCheckpointRootRollup(provingState);
|
|
1210
1080
|
}
|
|
1211
1081
|
/**
|
|
1212
1082
|
* Executes the VM circuit for a public function, will enqueue the corresponding kernel if the
|