@aztec/prover-client 0.0.1-commit.b2a5d0dd1 → 0.0.1-commit.b3d3157a
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 +4 -0
- package/dest/light/lightweight_checkpoint_builder.d.ts +1 -1
- package/dest/light/lightweight_checkpoint_builder.d.ts.map +1 -1
- package/dest/light/lightweight_checkpoint_builder.js +12 -4
- 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 +3 -1
- package/dest/orchestrator/block-building-helpers.d.ts +1 -1
- package/dest/orchestrator/checkpoint-proving-state.d.ts +8 -1
- package/dest/orchestrator/checkpoint-proving-state.d.ts.map +1 -1
- package/dest/orchestrator/checkpoint-proving-state.js +10 -1
- 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/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 +14 -26
- package/dest/orchestrator/orchestrator.d.ts.map +1 -1
- package/dest/orchestrator/orchestrator.js +32 -169
- 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 +61 -2
- package/dest/prover-client/prover-client.d.ts.map +1 -1
- package/dest/prover-client/prover-client.js +49 -1
- package/dest/proving_broker/config.d.ts +8 -72
- package/dest/proving_broker/config.d.ts.map +1 -1
- package/dest/proving_broker/config.js +2 -2
- 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/proving_broker.d.ts +2 -2
- package/dest/proving_broker/proving_broker.d.ts.map +1 -1
- package/dest/proving_broker/proving_broker.js +5 -3
- package/dest/proving_broker/proving_broker_database/persisted.js +2 -2
- package/dest/proving_broker/rpc.d.ts +1 -1
- package/dest/proving_broker/rpc.d.ts.map +1 -1
- package/dest/proving_broker/rpc.js +64 -9
- package/package.json +17 -17
- package/src/config.ts +5 -0
- package/src/light/lightweight_checkpoint_builder.ts +14 -6
- package/src/mocks/test_context.ts +3 -1
- package/src/orchestrator/checkpoint-proving-state.ts +14 -1
- package/src/orchestrator/checkpoint-sub-tree-orchestrator.ts +271 -0
- package/src/orchestrator/epoch-proving-context.ts +101 -0
- package/src/orchestrator/index.ts +8 -0
- package/src/orchestrator/orchestrator.ts +46 -225
- 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 +125 -1
- package/src/proving_broker/config.ts +2 -1
- package/src/proving_broker/index.ts +1 -0
- package/src/proving_broker/proving_broker.ts +5 -3
- package/src/proving_broker/proving_broker_database/persisted.ts +2 -2
- package/src/proving_broker/rpc.ts +24 -21
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { createLogger } from '@aztec/foundation/log';
|
|
2
|
+
/**
|
|
3
|
+
* Per-epoch state shared across every `CheckpointSubTreeOrchestrator` constructed for
|
|
4
|
+
* the same epoch. Owns the chonk-verifier proof cache so a tx whose checkpoint is
|
|
5
|
+
* reorged out and re-appears in a replacement checkpoint does not have to re-prove
|
|
6
|
+
* its chonk circuit.
|
|
7
|
+
*
|
|
8
|
+
* The context's chonk-verifier broker jobs are deliberately submitted **outside** the
|
|
9
|
+
* sub-tree's deferred-proving queue. The sub-tree's `cancel()` therefore does not abort
|
|
10
|
+
* them — by design, because their result is tx-scoped, not sub-tree-scoped, and a
|
|
11
|
+
* replacement sub-tree should be able to consume the cached proof.
|
|
12
|
+
*
|
|
13
|
+
* Callers (`EpochProvingJob`, or unit tests) construct one context per epoch and pass
|
|
14
|
+
* it into every sub-tree they create. `stop()` aborts every in-flight chonk job.
|
|
15
|
+
*/ export class EpochProvingContext {
|
|
16
|
+
prover;
|
|
17
|
+
epochNumber;
|
|
18
|
+
cache;
|
|
19
|
+
/** Abort controllers for in-flight chonk jobs, keyed by tx hash. */ pending;
|
|
20
|
+
log;
|
|
21
|
+
stopped;
|
|
22
|
+
constructor(prover, epochNumber, bindings){
|
|
23
|
+
this.prover = prover;
|
|
24
|
+
this.epochNumber = epochNumber;
|
|
25
|
+
this.cache = new Map();
|
|
26
|
+
this.pending = new Map();
|
|
27
|
+
this.stopped = false;
|
|
28
|
+
this.log = createLogger('prover-client:epoch-proving-context', bindings);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Returns the cached chonk-verifier proof promise for the given tx hash, or
|
|
32
|
+
* `undefined` if none has been enqueued yet. Non-mutating.
|
|
33
|
+
*/ getCached(txHash) {
|
|
34
|
+
return this.cache.get(txHash);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Enqueues a chonk-verifier proof for the given tx hash, returning the promise (or
|
|
38
|
+
* the already-cached one if already enqueued). The promise resolves when the broker
|
|
39
|
+
* delivers the result; on rejection (including `stop()`), the cache entry is removed
|
|
40
|
+
* so a subsequent caller can re-enqueue.
|
|
41
|
+
*/ enqueue(txHash, inputs) {
|
|
42
|
+
if (this.stopped) {
|
|
43
|
+
return Promise.reject(new Error('EpochProvingContext is stopped'));
|
|
44
|
+
}
|
|
45
|
+
const cached = this.cache.get(txHash);
|
|
46
|
+
if (cached) {
|
|
47
|
+
return cached;
|
|
48
|
+
}
|
|
49
|
+
const controller = new AbortController();
|
|
50
|
+
this.pending.set(txHash, controller);
|
|
51
|
+
this.log.debug(`Enqueueing chonk-verifier circuit`, {
|
|
52
|
+
txHash,
|
|
53
|
+
epochNumber: this.epochNumber
|
|
54
|
+
});
|
|
55
|
+
const promise = this.prover.getPublicChonkVerifierProof(inputs, controller.signal, this.epochNumber).finally(()=>this.pending.delete(txHash));
|
|
56
|
+
// Self-clean on rejection so a future caller can re-enqueue. Mark the rejection
|
|
57
|
+
// path as observed to silence unhandled-rejection warnings when no consumer
|
|
58
|
+
// awaits the promise (e.g. when the only `.then` chain belonged to a cancelled
|
|
59
|
+
// sub-tree's tx-proving state).
|
|
60
|
+
promise.catch((err)=>{
|
|
61
|
+
this.cache.delete(txHash);
|
|
62
|
+
this.log.debug(`Chonk-verifier proof failed; evicted from cache`, {
|
|
63
|
+
txHash,
|
|
64
|
+
error: `${err}`
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
this.cache.set(txHash, promise);
|
|
68
|
+
return promise;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Aborts every in-flight chonk-verifier broker job and clears the cache. Called by
|
|
72
|
+
* the owning `EpochProvingJob` when the job stops.
|
|
73
|
+
*/ stop() {
|
|
74
|
+
this.stopped = true;
|
|
75
|
+
for (const controller of this.pending.values()){
|
|
76
|
+
controller.abort();
|
|
77
|
+
}
|
|
78
|
+
this.pending.clear();
|
|
79
|
+
this.cache.clear();
|
|
80
|
+
}
|
|
81
|
+
}
|
|
@@ -1,2 +1,5 @@
|
|
|
1
1
|
export { ProvingOrchestrator } from './orchestrator.js';
|
|
2
|
-
|
|
2
|
+
export { CheckpointSubTreeOrchestrator, type SubTreeResult } from './checkpoint-sub-tree-orchestrator.js';
|
|
3
|
+
export { EpochProvingContext, type ChonkVerifierProofResult } from './epoch-proving-context.js';
|
|
4
|
+
export { TopTreeOrchestrator, TopTreeCancelledError, type CheckpointTopTreeData, type TopTreeResult, } from './top-tree-orchestrator.js';
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9vcmNoZXN0cmF0b3IvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDeEQsT0FBTyxFQUFFLDZCQUE2QixFQUFFLEtBQUssYUFBYSxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDMUcsT0FBTyxFQUFFLG1CQUFtQixFQUFFLEtBQUssd0JBQXdCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRyxPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLHFCQUFxQixFQUNyQixLQUFLLHFCQUFxQixFQUMxQixLQUFLLGFBQWEsR0FDbkIsTUFBTSw0QkFBNEIsQ0FBQyJ9
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/orchestrator/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/orchestrator/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,6BAA6B,EAAE,KAAK,aAAa,EAAE,MAAM,uCAAuC,CAAC;AAC1G,OAAO,EAAE,mBAAmB,EAAE,KAAK,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAChG,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,KAAK,qBAAqB,EAC1B,KAAK,aAAa,GACnB,MAAM,4BAA4B,CAAC"}
|
|
@@ -1 +1,4 @@
|
|
|
1
1
|
export { ProvingOrchestrator } from './orchestrator.js';
|
|
2
|
+
export { CheckpointSubTreeOrchestrator } from './checkpoint-sub-tree-orchestrator.js';
|
|
3
|
+
export { EpochProvingContext } from './epoch-proving-context.js';
|
|
4
|
+
export { TopTreeOrchestrator, TopTreeCancelledError } from './top-tree-orchestrator.js';
|
|
@@ -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,24 +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 pendingProvingJobs;
|
|
34
|
-
private provingPromise;
|
|
33
|
+
protected provingState: EpochProvingState | undefined;
|
|
34
|
+
protected provingPromise: Promise<ProvingResult> | undefined;
|
|
35
35
|
private metrics;
|
|
36
36
|
private dbs;
|
|
37
|
-
private logger;
|
|
38
|
-
private deferredJobQueue;
|
|
39
37
|
constructor(dbProvider: ReadonlyWorldStateAccess & ForkMerkleTreeOperations, prover: ServerCircuitProver, proverId: EthAddress, cancelJobsOnStop: boolean | undefined, enqueueConcurrency: number, telemetryClient?: TelemetryClient, bindings?: LoggerBindings);
|
|
40
38
|
get tracer(): Tracer;
|
|
41
39
|
getProverId(): EthAddress;
|
|
42
40
|
getNumActiveForks(): number;
|
|
43
|
-
|
|
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;
|
|
44
44
|
startNewEpoch(epochNumber: EpochNumber, totalNumCheckpoints: number, finalBlobBatchingChallenges: FinalBlobBatchingChallenges): void;
|
|
45
45
|
/**
|
|
46
46
|
* Starts a new checkpoint.
|
|
@@ -90,17 +90,10 @@ export declare class ProvingOrchestrator implements EpochProver {
|
|
|
90
90
|
proof: Proof;
|
|
91
91
|
batchedBlobInputs: BatchedBlob;
|
|
92
92
|
}>;
|
|
93
|
-
/**
|
|
94
|
-
* Enqueue a job to be scheduled
|
|
95
|
-
* @param provingState - The proving state object being operated on
|
|
96
|
-
* @param jobType - The type of job to be queued
|
|
97
|
-
* @param job - The actual job, returns a promise notifying of the job's completion
|
|
98
|
-
*/
|
|
99
|
-
private deferredProving;
|
|
100
93
|
private updateL1ToL2MessageTree;
|
|
101
94
|
private prepareBaseRollupInputs;
|
|
102
95
|
private enqueueBaseRollup;
|
|
103
|
-
|
|
96
|
+
protected getOrEnqueueChonkVerifier(provingState: BlockProvingState, txIndex: number): void;
|
|
104
97
|
private doEnqueueChonkVerifier;
|
|
105
98
|
private enqueueMergeRollup;
|
|
106
99
|
private enqueueBlockRootRollup;
|
|
@@ -109,15 +102,10 @@ export declare class ProvingOrchestrator implements EpochProver {
|
|
|
109
102
|
private enqueueRootParityCircuit;
|
|
110
103
|
private enqueueBlockMergeRollup;
|
|
111
104
|
private enqueueCheckpointRootRollup;
|
|
112
|
-
private enqueueCheckpointMergeRollup;
|
|
113
|
-
private enqueueEpochPadding;
|
|
114
|
-
private enqueueRootRollup;
|
|
115
105
|
private checkAndEnqueueNextMergeRollup;
|
|
116
106
|
private checkAndEnqueueBlockRootRollup;
|
|
117
107
|
private checkAndEnqueueNextBlockMergeRollup;
|
|
118
|
-
|
|
119
|
-
private checkAndEnqueueNextCheckpointMergeRollup;
|
|
120
|
-
private checkAndEnqueueRootRollup;
|
|
108
|
+
protected checkAndEnqueueCheckpointRootRollup(provingState: CheckpointProvingState): Promise<void>;
|
|
121
109
|
/**
|
|
122
110
|
* Executes the VM circuit for a public function, will enqueue the corresponding kernel if the
|
|
123
111
|
* previous kernel is ready
|
|
@@ -125,6 +113,6 @@ export declare class ProvingOrchestrator implements EpochProver {
|
|
|
125
113
|
* @param txIndex - The index of the transaction being proven
|
|
126
114
|
*/
|
|
127
115
|
private enqueueVM;
|
|
128
|
-
|
|
116
|
+
protected checkAndEnqueueBaseRollup(provingState: BlockProvingState, txIndex: number): void;
|
|
129
117
|
}
|
|
130
|
-
//# 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,18 +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
|
-
import { SerialQueue } from '@aztec/foundation/queue';
|
|
382
377
|
import { assertLength } from '@aztec/foundation/serialize';
|
|
383
|
-
import { sleep } from '@aztec/foundation/sleep';
|
|
384
378
|
import { pushTestData } from '@aztec/foundation/testing';
|
|
385
379
|
import { elapsed } from '@aztec/foundation/timer';
|
|
380
|
+
import { appendL1ToL2MessagesToTree } from '@aztec/stdlib/messaging';
|
|
386
381
|
import { BlockRootEmptyTxFirstRollupPrivateInputs, BlockRootFirstRollupPrivateInputs, BlockRootSingleTxFirstRollupPrivateInputs, BlockRootSingleTxRollupPrivateInputs, CheckpointRootSingleBlockRollupPrivateInputs, PrivateTxBaseRollupPrivateInputs } from '@aztec/stdlib/rollup';
|
|
387
382
|
import { MerkleTreeId } from '@aztec/stdlib/trees';
|
|
388
383
|
import { Attributes, getTelemetryClient, trackSpan, wrapCallbackInSpan } from '@aztec/telemetry-client';
|
|
@@ -390,6 +385,7 @@ import { inspect } from 'util';
|
|
|
390
385
|
import { buildHeaderFromCircuitOutputs, getLastSiblingPath, getPublicChonkVerifierPrivateInputsFromTx, getRootTreeSiblingPath, getSubtreeSiblingPath, getTreeSnapshot, insertSideEffectsAndBuildBaseRollupHints, validatePartialState, validateTx } from './block-building-helpers.js';
|
|
391
386
|
import { EpochProvingState } from './epoch-proving-state.js';
|
|
392
387
|
import { ProvingOrchestratorMetrics } from './orchestrator_metrics.js';
|
|
388
|
+
import { TopTreeProvingScheduler } from './top-tree-proving-scheduler.js';
|
|
393
389
|
import { TxProvingState } from './tx-proving-state.js';
|
|
394
390
|
_dec = trackSpan('ProvingOrchestrator.startNewBlock', (blockNumber)=>({
|
|
395
391
|
[Attributes.BLOCK_NUMBER]: blockNumber
|
|
@@ -411,12 +407,10 @@ _dec = trackSpan('ProvingOrchestrator.startNewBlock', (blockNumber)=>({
|
|
|
411
407
|
* The proving implementation is determined by the provided prover. This could be for example a local prover or a remote prover pool.
|
|
412
408
|
*/ /**
|
|
413
409
|
* The orchestrator, managing the flow of recursive proving operations required to build the rollup proof tree.
|
|
414
|
-
*/ export class ProvingOrchestrator {
|
|
410
|
+
*/ export class ProvingOrchestrator extends TopTreeProvingScheduler {
|
|
415
411
|
dbProvider;
|
|
416
|
-
prover;
|
|
417
412
|
proverId;
|
|
418
413
|
cancelJobsOnStop;
|
|
419
|
-
enqueueConcurrency;
|
|
420
414
|
static{
|
|
421
415
|
({ e: [_initProto] } = _apply_decs_2203_r(this, [
|
|
422
416
|
[
|
|
@@ -447,27 +441,12 @@ _dec = trackSpan('ProvingOrchestrator.startNewBlock', (blockNumber)=>({
|
|
|
447
441
|
], []));
|
|
448
442
|
}
|
|
449
443
|
provingState;
|
|
450
|
-
pendingProvingJobs;
|
|
451
444
|
provingPromise;
|
|
452
445
|
metrics;
|
|
453
|
-
// eslint-disable-next-line aztec-custom/no-non-primitive-in-collections
|
|
454
446
|
dbs;
|
|
455
|
-
logger;
|
|
456
|
-
deferredJobQueue;
|
|
457
447
|
constructor(dbProvider, prover, proverId, cancelJobsOnStop = false, enqueueConcurrency, telemetryClient = getTelemetryClient(), bindings){
|
|
458
|
-
this.dbProvider = dbProvider;
|
|
459
|
-
this.prover = prover;
|
|
460
|
-
this.proverId = proverId;
|
|
461
|
-
this.cancelJobsOnStop = cancelJobsOnStop;
|
|
462
|
-
this.enqueueConcurrency = enqueueConcurrency;
|
|
463
|
-
this.provingState = (_initProto(this), undefined);
|
|
464
|
-
this.pendingProvingJobs = [];
|
|
465
|
-
this.provingPromise = undefined;
|
|
466
|
-
this.dbs = new Map();
|
|
467
|
-
this.deferredJobQueue = new SerialQueue();
|
|
468
|
-
this.logger = createLogger('prover-client:orchestrator', 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();
|
|
469
449
|
this.metrics = new ProvingOrchestratorMetrics(telemetryClient, 'ProvingOrchestrator');
|
|
470
|
-
this.deferredJobQueue.start(this.enqueueConcurrency);
|
|
471
450
|
}
|
|
472
451
|
get tracer() {
|
|
473
452
|
return this.metrics.tracer;
|
|
@@ -478,11 +457,18 @@ _dec = trackSpan('ProvingOrchestrator.startNewBlock', (blockNumber)=>({
|
|
|
478
457
|
getNumActiveForks() {
|
|
479
458
|
return this.dbs.size;
|
|
480
459
|
}
|
|
481
|
-
|
|
482
|
-
// Grab the old queue before cancel() replaces it, so we can await its draining.
|
|
483
|
-
const oldQueue = this.deferredJobQueue;
|
|
460
|
+
cancelInternal() {
|
|
484
461
|
this.cancel();
|
|
485
|
-
|
|
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
|
+
});
|
|
486
472
|
}
|
|
487
473
|
startNewEpoch(epochNumber, totalNumCheckpoints, finalBlobBatchingChallenges) {
|
|
488
474
|
if (this.provingState?.verifyState()) {
|
|
@@ -742,15 +728,7 @@ _dec = trackSpan('ProvingOrchestrator.startNewBlock', (blockNumber)=>({
|
|
|
742
728
|
* If cancelJobsOnStop is true, aborts all pending jobs with the broker (which marks them as 'Aborted').
|
|
743
729
|
* If cancelJobsOnStop is false (default), jobs remain in the broker queue and can be reused on restart/reorg.
|
|
744
730
|
*/ cancel() {
|
|
745
|
-
|
|
746
|
-
// Recreate the queue so it can accept jobs for subsequent epochs.
|
|
747
|
-
this.deferredJobQueue = new SerialQueue();
|
|
748
|
-
this.deferredJobQueue.start(this.enqueueConcurrency);
|
|
749
|
-
if (this.cancelJobsOnStop) {
|
|
750
|
-
for (const controller of this.pendingProvingJobs){
|
|
751
|
-
controller.abort();
|
|
752
|
-
}
|
|
753
|
-
}
|
|
731
|
+
this.resetSchedulerState(this.cancelJobsOnStop);
|
|
754
732
|
this.provingState?.cancel();
|
|
755
733
|
for (const [blockNumber, db] of this.dbs.entries()){
|
|
756
734
|
void db.close().catch((err)=>this.logger.error(`Error closing db for block ${blockNumber}`, err));
|
|
@@ -782,64 +760,11 @@ _dec = trackSpan('ProvingOrchestrator.startNewBlock', (blockNumber)=>({
|
|
|
782
760
|
});
|
|
783
761
|
return epochProofResult;
|
|
784
762
|
}
|
|
785
|
-
/**
|
|
786
|
-
* Enqueue a job to be scheduled
|
|
787
|
-
* @param provingState - The proving state object being operated on
|
|
788
|
-
* @param jobType - The type of job to be queued
|
|
789
|
-
* @param job - The actual job, returns a promise notifying of the job's completion
|
|
790
|
-
*/ deferredProving(provingState, request, callback) {
|
|
791
|
-
if (!provingState.verifyState()) {
|
|
792
|
-
this.logger.debug(`Not enqueuing job, state no longer valid`);
|
|
793
|
-
return;
|
|
794
|
-
}
|
|
795
|
-
const controller = new AbortController();
|
|
796
|
-
this.pendingProvingJobs.push(controller);
|
|
797
|
-
// We use a 'safeJob'. We don't want promise rejections in the proving pool, we want to capture the error here
|
|
798
|
-
// and reject the proving job whilst keeping the event loop free of rejections
|
|
799
|
-
const safeJob = async ()=>{
|
|
800
|
-
try {
|
|
801
|
-
// there's a delay between enqueueing this job and it actually running
|
|
802
|
-
if (controller.signal.aborted) {
|
|
803
|
-
return;
|
|
804
|
-
}
|
|
805
|
-
const result = await request(controller.signal);
|
|
806
|
-
if (!provingState.verifyState()) {
|
|
807
|
-
this.logger.debug(`State no longer valid, discarding result`);
|
|
808
|
-
return;
|
|
809
|
-
}
|
|
810
|
-
// we could have been cancelled whilst waiting for the result
|
|
811
|
-
// and the prover ignored the signal. Drop the result in that case
|
|
812
|
-
if (controller.signal.aborted) {
|
|
813
|
-
return;
|
|
814
|
-
}
|
|
815
|
-
await callback(result);
|
|
816
|
-
} catch (err) {
|
|
817
|
-
if (err instanceof AbortError) {
|
|
818
|
-
// operation was cancelled, probably because the block was cancelled
|
|
819
|
-
// drop this result
|
|
820
|
-
return;
|
|
821
|
-
}
|
|
822
|
-
this.logger.error(`Error thrown when proving job`, err);
|
|
823
|
-
provingState.reject(`${err}`);
|
|
824
|
-
} finally{
|
|
825
|
-
const index = this.pendingProvingJobs.indexOf(controller);
|
|
826
|
-
if (index > -1) {
|
|
827
|
-
this.pendingProvingJobs.splice(index, 1);
|
|
828
|
-
}
|
|
829
|
-
}
|
|
830
|
-
};
|
|
831
|
-
void this.deferredJobQueue.put(async ()=>{
|
|
832
|
-
void safeJob();
|
|
833
|
-
// we yield here to the macro task queue such to give Nodejs a chance to run other operatoins in between enqueues
|
|
834
|
-
await sleep(0);
|
|
835
|
-
});
|
|
836
|
-
}
|
|
837
763
|
async updateL1ToL2MessageTree(l1ToL2Messages, db) {
|
|
838
|
-
const l1ToL2MessagesPadded = padArrayEnd(l1ToL2Messages, Fr.ZERO, NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP, 'Too many L1 to L2 messages');
|
|
839
764
|
const lastL1ToL2MessageTreeSnapshot = await getTreeSnapshot(MerkleTreeId.L1_TO_L2_MESSAGE_TREE, db);
|
|
840
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);
|
|
841
766
|
// Update the local trees to include the new l1 to l2 messages
|
|
842
|
-
await db
|
|
767
|
+
await appendL1ToL2MessagesToTree(db, l1ToL2Messages);
|
|
843
768
|
const newL1ToL2MessageTreeSnapshot = await getTreeSnapshot(MerkleTreeId.L1_TO_L2_MESSAGE_TREE, db);
|
|
844
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);
|
|
845
770
|
return {
|
|
@@ -918,7 +843,6 @@ _dec = trackSpan('ProvingOrchestrator.startNewBlock', (blockNumber)=>({
|
|
|
918
843
|
}
|
|
919
844
|
const txProvingState = provingState.getTxProvingState(txIndex);
|
|
920
845
|
const txHash = txProvingState.processedTx.hash.toString();
|
|
921
|
-
NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH;
|
|
922
846
|
const handleResult = (result)=>{
|
|
923
847
|
this.logger.debug(`Got chonk verifier proof for tx index: ${txIndex}`, {
|
|
924
848
|
txHash
|
|
@@ -993,7 +917,11 @@ _dec = trackSpan('ProvingOrchestrator.startNewBlock', (blockNumber)=>({
|
|
|
993
917
|
return this.prover.getBlockRootRollupProof(inputs, signal, provingState.epochNumber);
|
|
994
918
|
}
|
|
995
919
|
}), async (result)=>{
|
|
996
|
-
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
|
+
});
|
|
997
925
|
const leafLocation = provingState.setBlockRootRollupProof(result);
|
|
998
926
|
const checkpointProvingState = provingState.parentCheckpoint;
|
|
999
927
|
// Verification is called from both here and setBlockCompleted. Whichever runs last
|
|
@@ -1065,6 +993,11 @@ _dec = trackSpan('ProvingOrchestrator.startNewBlock', (blockNumber)=>({
|
|
|
1065
993
|
this.deferredProving(provingState, wrapCallbackInSpan(this.tracer, 'ProvingOrchestrator.prover.getBlockMergeRollupProof', {
|
|
1066
994
|
[Attributes.PROTOCOL_CIRCUIT_NAME]: 'rollup-block-merge'
|
|
1067
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
|
+
});
|
|
1068
1001
|
provingState.setBlockMergeRollupProof(location, result);
|
|
1069
1002
|
await this.checkAndEnqueueNextBlockMergeRollup(provingState, location);
|
|
1070
1003
|
});
|
|
@@ -1097,7 +1030,10 @@ _dec = trackSpan('ProvingOrchestrator.startNewBlock', (blockNumber)=>({
|
|
|
1097
1030
|
provingState.reject(`Blob accumulator state mismatch.`);
|
|
1098
1031
|
return;
|
|
1099
1032
|
}
|
|
1100
|
-
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
|
+
});
|
|
1101
1037
|
const leafLocation = provingState.setCheckpointRootRollupProof(result);
|
|
1102
1038
|
const epochProvingState = provingState.parentEpoch;
|
|
1103
1039
|
if (epochProvingState.totalNumCheckpoints === 1) {
|
|
@@ -1107,61 +1043,6 @@ _dec = trackSpan('ProvingOrchestrator.startNewBlock', (blockNumber)=>({
|
|
|
1107
1043
|
}
|
|
1108
1044
|
});
|
|
1109
1045
|
}
|
|
1110
|
-
enqueueCheckpointMergeRollup(provingState, location) {
|
|
1111
|
-
if (!provingState.verifyState()) {
|
|
1112
|
-
this.logger.debug('Not running checkpoint merge rollup. State no longer valid.');
|
|
1113
|
-
return;
|
|
1114
|
-
}
|
|
1115
|
-
if (!provingState.tryStartProvingCheckpointMerge(location)) {
|
|
1116
|
-
this.logger.debug('Checkpoint merge rollup already started.');
|
|
1117
|
-
return;
|
|
1118
|
-
}
|
|
1119
|
-
const inputs = provingState.getCheckpointMergeRollupInputs(location);
|
|
1120
|
-
this.deferredProving(provingState, wrapCallbackInSpan(this.tracer, 'ProvingOrchestrator.prover.getCheckpointMergeRollupProof', {
|
|
1121
|
-
[Attributes.PROTOCOL_CIRCUIT_NAME]: 'rollup-checkpoint-merge'
|
|
1122
|
-
}, (signal)=>this.prover.getCheckpointMergeRollupProof(inputs, signal, provingState.epochNumber)), (result)=>{
|
|
1123
|
-
this.logger.debug('Completed proof for checkpoint merge rollup.');
|
|
1124
|
-
provingState.setCheckpointMergeRollupProof(location, result);
|
|
1125
|
-
this.checkAndEnqueueNextCheckpointMergeRollup(provingState, location);
|
|
1126
|
-
});
|
|
1127
|
-
}
|
|
1128
|
-
enqueueEpochPadding(provingState) {
|
|
1129
|
-
if (!provingState.verifyState()) {
|
|
1130
|
-
this.logger.debug('Not running epoch padding. State no longer valid.');
|
|
1131
|
-
return;
|
|
1132
|
-
}
|
|
1133
|
-
if (!provingState.tryStartProvingPaddingCheckpoint()) {
|
|
1134
|
-
this.logger.debug('Padding checkpoint already started.');
|
|
1135
|
-
return;
|
|
1136
|
-
}
|
|
1137
|
-
this.logger.debug('Padding epoch proof with a padding block root proof.');
|
|
1138
|
-
const inputs = provingState.getPaddingCheckpointInputs();
|
|
1139
|
-
this.deferredProving(provingState, wrapCallbackInSpan(this.tracer, 'ProvingOrchestrator.prover.getCheckpointPaddingRollupProof', {
|
|
1140
|
-
[Attributes.PROTOCOL_CIRCUIT_NAME]: 'rollup-checkpoint-padding'
|
|
1141
|
-
}, (signal)=>this.prover.getCheckpointPaddingRollupProof(inputs, signal, provingState.epochNumber)), (result)=>{
|
|
1142
|
-
this.logger.debug('Completed proof for padding checkpoint.');
|
|
1143
|
-
provingState.setCheckpointPaddingProof(result);
|
|
1144
|
-
this.checkAndEnqueueRootRollup(provingState);
|
|
1145
|
-
});
|
|
1146
|
-
}
|
|
1147
|
-
// Executes the root rollup circuit
|
|
1148
|
-
enqueueRootRollup(provingState) {
|
|
1149
|
-
if (!provingState.verifyState()) {
|
|
1150
|
-
this.logger.debug('Not running root rollup, state no longer valid');
|
|
1151
|
-
return;
|
|
1152
|
-
}
|
|
1153
|
-
this.logger.debug(`Preparing root rollup`);
|
|
1154
|
-
const inputs = provingState.getRootRollupInputs();
|
|
1155
|
-
this.deferredProving(provingState, wrapCallbackInSpan(this.tracer, 'ProvingOrchestrator.prover.getRootRollupProof', {
|
|
1156
|
-
[Attributes.PROTOCOL_CIRCUIT_NAME]: 'rollup-root'
|
|
1157
|
-
}, (signal)=>this.prover.getRootRollupProof(inputs, signal, provingState.epochNumber)), (result)=>{
|
|
1158
|
-
this.logger.verbose(`Orchestrator completed root rollup for epoch ${provingState.epochNumber}`);
|
|
1159
|
-
provingState.setRootRollupProof(result);
|
|
1160
|
-
provingState.resolve({
|
|
1161
|
-
status: 'success'
|
|
1162
|
-
});
|
|
1163
|
-
});
|
|
1164
|
-
}
|
|
1165
1046
|
checkAndEnqueueNextMergeRollup(provingState, currentLocation) {
|
|
1166
1047
|
if (!provingState.isReadyForMergeRollup(currentLocation)) {
|
|
1167
1048
|
return;
|
|
@@ -1197,24 +1078,6 @@ _dec = trackSpan('ProvingOrchestrator.startNewBlock', (blockNumber)=>({
|
|
|
1197
1078
|
}
|
|
1198
1079
|
await this.enqueueCheckpointRootRollup(provingState);
|
|
1199
1080
|
}
|
|
1200
|
-
checkAndEnqueueNextCheckpointMergeRollup(provingState, currentLocation) {
|
|
1201
|
-
if (!provingState.isReadyForCheckpointMerge(currentLocation)) {
|
|
1202
|
-
return;
|
|
1203
|
-
}
|
|
1204
|
-
const parentLocation = provingState.getParentLocation(currentLocation);
|
|
1205
|
-
if (parentLocation.level === 0) {
|
|
1206
|
-
this.checkAndEnqueueRootRollup(provingState);
|
|
1207
|
-
} else {
|
|
1208
|
-
this.enqueueCheckpointMergeRollup(provingState, parentLocation);
|
|
1209
|
-
}
|
|
1210
|
-
}
|
|
1211
|
-
checkAndEnqueueRootRollup(provingState) {
|
|
1212
|
-
if (!provingState.isReadyForRootRollup()) {
|
|
1213
|
-
this.logger.debug('Not ready for root rollup');
|
|
1214
|
-
return;
|
|
1215
|
-
}
|
|
1216
|
-
this.enqueueRootRollup(provingState);
|
|
1217
|
-
}
|
|
1218
1081
|
/**
|
|
1219
1082
|
* Executes the VM circuit for a public function, will enqueue the corresponding kernel if the
|
|
1220
1083
|
* previous kernel is ready
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { type Logger, type LoggerBindings } from '@aztec/foundation/log';
|
|
2
|
+
/**
|
|
3
|
+
* Minimal surface a deferred-proving state must expose. Both `EpochProvingState` /
|
|
4
|
+
* `CheckpointProvingState` / `BlockProvingState` (used by `ProvingOrchestrator`) and
|
|
5
|
+
* `TopTreeProvingState` (used by `TopTreeOrchestrator`) satisfy it.
|
|
6
|
+
*/
|
|
7
|
+
export interface ProvingStateLike {
|
|
8
|
+
/** Returns false once the state has been cancelled or otherwise invalidated. */
|
|
9
|
+
verifyState(): boolean;
|
|
10
|
+
/** Surfaces a proving error to the state's owner. */
|
|
11
|
+
reject(reason: string): void;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Common scheduling infrastructure shared by every orchestrator that drives broker
|
|
15
|
+
* proving jobs:
|
|
16
|
+
*
|
|
17
|
+
* - One `SerialQueue` (`deferredJobQueue`) acting as the enqueue-throttle.
|
|
18
|
+
* - A list of `AbortController`s (`pendingProvingJobs`) so a `cancel()` can abort
|
|
19
|
+
* in-flight broker jobs when needed.
|
|
20
|
+
* - A `deferredProving<T>(state, request, callback, isCancelled?)` method that wraps
|
|
21
|
+
* a broker request in the standard "submit, drop result if state invalidated, push
|
|
22
|
+
* errors to state.reject" envelope.
|
|
23
|
+
*
|
|
24
|
+
* Subclasses own their own concrete proving state and define `cancelInternal()` for
|
|
25
|
+
* the rest of the cleanup work (closing world-state forks, marking sub-trees
|
|
26
|
+
* cancelled, etc.). `stop()` lives on the base class and follows the standard pattern
|
|
27
|
+
* of grabbing the old queue, calling `cancelInternal()` (which recreates the queue),
|
|
28
|
+
* and awaiting the old queue's drain.
|
|
29
|
+
*/
|
|
30
|
+
export declare abstract class ProvingScheduler {
|
|
31
|
+
private readonly enqueueConcurrency;
|
|
32
|
+
protected pendingProvingJobs: AbortController[];
|
|
33
|
+
protected logger: Logger;
|
|
34
|
+
private deferredJobQueue;
|
|
35
|
+
constructor(enqueueConcurrency: number, loggerName?: string, bindings?: LoggerBindings);
|
|
36
|
+
/** Number of broker jobs currently in flight. */
|
|
37
|
+
getNumPendingProvingJobs(): number;
|
|
38
|
+
/**
|
|
39
|
+
* Drains the deferred-job queue, recreates it (so the subclass can be reused), and
|
|
40
|
+
* optionally aborts every in-flight broker job. Aborting is the right choice on
|
|
41
|
+
* reorg-driven cancel (where the in-flight inputs are no longer valid) and the
|
|
42
|
+
* wrong choice on shutdown (where leaving jobs in the broker queue lets a restart
|
|
43
|
+
* pick them up).
|
|
44
|
+
*/
|
|
45
|
+
protected resetSchedulerState(abortJobs: boolean): void;
|
|
46
|
+
/**
|
|
47
|
+
* Subclass-defined cancellation. Implementations call `resetSchedulerState(...)`
|
|
48
|
+
* and then do their own cleanup (close world-state forks, propagate cancel into
|
|
49
|
+
* the proving state, etc.).
|
|
50
|
+
*/
|
|
51
|
+
protected abstract cancelInternal(): void;
|
|
52
|
+
/**
|
|
53
|
+
* Standard stop: grab the old queue, cancel (which recreates the queue), then
|
|
54
|
+
* await the old queue's drain so any final job tear-down has unwound before we
|
|
55
|
+
* return.
|
|
56
|
+
*/
|
|
57
|
+
stop(): Promise<void>;
|
|
58
|
+
/**
|
|
59
|
+
* Submits a broker request. The returned-via-callback result is dropped if the
|
|
60
|
+
* state has become invalid (re-org, cancellation) by the time it lands. Errors
|
|
61
|
+
* are routed to `state.reject` unless they are abort-driven or the state is
|
|
62
|
+
* already invalid (in which case they're a stale echo of the cancel).
|
|
63
|
+
*
|
|
64
|
+
* @param state - Object exposing `verifyState()` and `reject()`.
|
|
65
|
+
* @param request - The broker call. Receives the controller's signal.
|
|
66
|
+
* @param callback - Runs on success, after `verifyState()` is checked.
|
|
67
|
+
* @param isCancelled - Optional extra cancellation predicate (e.g. a `cancelled`
|
|
68
|
+
* flag the subclass maintains independently of the state). Defaults to never.
|
|
69
|
+
*/
|
|
70
|
+
protected deferredProving<S extends ProvingStateLike, T>(state: S, request: (signal: AbortSignal) => Promise<T>, callback: (result: T) => void | Promise<void>, isCancelled?: () => boolean): void;
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmluZy1zY2hlZHVsZXIuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9vcmNoZXN0cmF0b3IvcHJvdmluZy1zY2hlZHVsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLEtBQUssTUFBTSxFQUFFLEtBQUssY0FBYyxFQUFnQixNQUFNLHVCQUF1QixDQUFDO0FBSXZGOzs7O0dBSUc7QUFDSCxNQUFNLFdBQVcsZ0JBQWdCO0lBQy9CLGdGQUFnRjtJQUNoRixXQUFXLElBQUksT0FBTyxDQUFDO0lBQ3ZCLHFEQUFxRDtJQUNyRCxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sR0FBRyxJQUFJLENBQUM7Q0FDOUI7QUFFRDs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUNILDhCQUFzQixnQkFBZ0I7SUFNbEMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxrQkFBa0I7SUFMckMsU0FBUyxDQUFDLGtCQUFrQixFQUFFLGVBQWUsRUFBRSxDQUFNO0lBQ3JELFNBQVMsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDO0lBQ3pCLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBYztJQUV0QyxZQUNtQixrQkFBa0IsRUFBRSxNQUFNLEVBQzNDLFVBQVUsU0FBb0MsRUFDOUMsUUFBUSxDQUFDLEVBQUUsY0FBYyxFQUsxQjtJQUVELGlEQUFpRDtJQUMxQyx3QkFBd0IsSUFBSSxNQUFNLENBRXhDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsU0FBUyxDQUFDLG1CQUFtQixDQUFDLFNBQVMsRUFBRSxPQUFPLEdBQUcsSUFBSSxDQVN0RDtJQUVEOzs7O09BSUc7SUFDSCxTQUFTLENBQUMsUUFBUSxDQUFDLGNBQWMsSUFBSSxJQUFJLENBQUM7SUFFMUM7Ozs7T0FJRztJQUNVLElBQUksSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLENBSWpDO0lBRUQ7Ozs7Ozs7Ozs7O09BV0c7SUFDSCxTQUFTLENBQUMsZUFBZSxDQUFDLENBQUMsU0FBUyxnQkFBZ0IsRUFBRSxDQUFDLEVBQ3JELEtBQUssRUFBRSxDQUFDLEVBQ1IsT0FBTyxFQUFFLENBQUMsTUFBTSxFQUFFLFdBQVcsS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQzVDLFFBQVEsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLEtBQUssSUFBSSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFDN0MsV0FBVyxHQUFFLE1BQU0sT0FBcUIsR0FDdkMsSUFBSSxDQStDTjtDQUNGIn0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proving-scheduler.d.ts","sourceRoot":"","sources":["../../src/orchestrator/proving-scheduler.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,MAAM,EAAE,KAAK,cAAc,EAAgB,MAAM,uBAAuB,CAAC;AAIvF;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAC/B,gFAAgF;IAChF,WAAW,IAAI,OAAO,CAAC;IACvB,qDAAqD;IACrD,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,8BAAsB,gBAAgB;IAMlC,OAAO,CAAC,QAAQ,CAAC,kBAAkB;IALrC,SAAS,CAAC,kBAAkB,EAAE,eAAe,EAAE,CAAM;IACrD,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,gBAAgB,CAAc;IAEtC,YACmB,kBAAkB,EAAE,MAAM,EAC3C,UAAU,SAAoC,EAC9C,QAAQ,CAAC,EAAE,cAAc,EAK1B;IAED,iDAAiD;IAC1C,wBAAwB,IAAI,MAAM,CAExC;IAED;;;;;;OAMG;IACH,SAAS,CAAC,mBAAmB,CAAC,SAAS,EAAE,OAAO,GAAG,IAAI,CAStD;IAED;;;;OAIG;IACH,SAAS,CAAC,QAAQ,CAAC,cAAc,IAAI,IAAI,CAAC;IAE1C;;;;OAIG;IACU,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAIjC;IAED;;;;;;;;;;;OAWG;IACH,SAAS,CAAC,eAAe,CAAC,CAAC,SAAS,gBAAgB,EAAE,CAAC,EACrD,KAAK,EAAE,CAAC,EACR,OAAO,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,CAAC,CAAC,EAC5C,QAAQ,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,EAC7C,WAAW,GAAE,MAAM,OAAqB,GACvC,IAAI,CA+CN;CACF"}
|