@aztec/prover-node 0.0.1-commit.b9865e97 → 0.0.1-commit.be03c316

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/README.md +518 -0
  2. package/dest/actions/rerun-epoch-proving-job.d.ts +3 -3
  3. package/dest/actions/rerun-epoch-proving-job.d.ts.map +1 -1
  4. package/dest/actions/rerun-epoch-proving-job.js +102 -19
  5. package/dest/checkpoint-store.d.ts +87 -0
  6. package/dest/checkpoint-store.d.ts.map +1 -0
  7. package/dest/checkpoint-store.js +186 -0
  8. package/dest/config.d.ts +3 -1
  9. package/dest/config.d.ts.map +1 -1
  10. package/dest/config.js +8 -1
  11. package/dest/factory.d.ts +4 -1
  12. package/dest/factory.d.ts.map +1 -1
  13. package/dest/factory.js +2 -6
  14. package/dest/index.d.ts +2 -1
  15. package/dest/index.d.ts.map +1 -1
  16. package/dest/index.js +1 -0
  17. package/dest/job/checkpoint-prover.d.ts +134 -0
  18. package/dest/job/checkpoint-prover.d.ts.map +1 -0
  19. package/dest/job/checkpoint-prover.js +353 -0
  20. package/dest/job/epoch-session.d.ts +146 -0
  21. package/dest/job/epoch-session.d.ts.map +1 -0
  22. package/dest/job/epoch-session.js +720 -0
  23. package/dest/job/top-tree-job.d.ts +82 -0
  24. package/dest/job/top-tree-job.d.ts.map +1 -0
  25. package/dest/job/top-tree-job.js +152 -0
  26. package/dest/metrics.d.ts +25 -8
  27. package/dest/metrics.d.ts.map +1 -1
  28. package/dest/metrics.js +64 -14
  29. package/dest/proof-publishing-service.d.ts +161 -0
  30. package/dest/proof-publishing-service.d.ts.map +1 -0
  31. package/dest/proof-publishing-service.js +335 -0
  32. package/dest/prover-node-publisher.d.ts +10 -19
  33. package/dest/prover-node-publisher.d.ts.map +1 -1
  34. package/dest/prover-node-publisher.js +43 -99
  35. package/dest/prover-node.d.ts +107 -67
  36. package/dest/prover-node.d.ts.map +1 -1
  37. package/dest/prover-node.js +476 -261
  38. package/dest/prover-publisher-factory.d.ts +3 -1
  39. package/dest/prover-publisher-factory.d.ts.map +1 -1
  40. package/dest/prover-publisher-factory.js +1 -0
  41. package/dest/session-manager.d.ts +158 -0
  42. package/dest/session-manager.d.ts.map +1 -0
  43. package/dest/session-manager.js +452 -0
  44. package/dest/test/index.d.ts +7 -6
  45. package/dest/test/index.d.ts.map +1 -1
  46. package/package.json +24 -23
  47. package/src/actions/rerun-epoch-proving-job.ts +104 -27
  48. package/src/checkpoint-store.ts +218 -0
  49. package/src/config.ts +12 -1
  50. package/src/factory.ts +5 -8
  51. package/src/index.ts +1 -0
  52. package/src/job/checkpoint-prover.ts +468 -0
  53. package/src/job/epoch-session.ts +436 -0
  54. package/src/job/top-tree-job.ts +227 -0
  55. package/src/metrics.ts +65 -23
  56. package/src/proof-publishing-service.ts +427 -0
  57. package/src/prover-node-publisher.ts +58 -123
  58. package/src/prover-node.ts +549 -283
  59. package/src/prover-publisher-factory.ts +3 -0
  60. package/src/session-manager.ts +552 -0
  61. package/src/test/index.ts +6 -6
  62. package/dest/job/epoch-proving-job.d.ts +0 -67
  63. package/dest/job/epoch-proving-job.d.ts.map +0 -1
  64. package/dest/job/epoch-proving-job.js +0 -912
  65. package/src/job/epoch-proving-job.ts +0 -531
@@ -0,0 +1,82 @@
1
+ import type { BatchedBlob } from '@aztec/blob-lib/types';
2
+ import type { CheckpointNumber, EpochNumber } from '@aztec/foundation/branded-types';
3
+ import type { Logger } from '@aztec/foundation/log';
4
+ import { type PromiseWithResolvers } from '@aztec/foundation/promise';
5
+ import type { EpochProverFactory } from '@aztec/prover-client';
6
+ import type { Proof } from '@aztec/stdlib/proofs';
7
+ import type { RootRollupPublicInputs } from '@aztec/stdlib/rollup';
8
+ import type { ProverNodeJobMetrics } from '../metrics.js';
9
+ import type { CheckpointProver } from './checkpoint-prover.js';
10
+ /** Result of a successful top-tree run. */
11
+ export type TopTreeProof = {
12
+ publicInputs: RootRollupPublicInputs;
13
+ proof: Proof;
14
+ batchedBlobInputs: BatchedBlob;
15
+ };
16
+ /**
17
+ * Hooks for tests to interpose around the underlying `topTree.prove(...)` call without
18
+ * monkey-patching the orchestrator.
19
+ */
20
+ export type TopTreeJobHooks = {
21
+ /** Called immediately before the top tree's `prove` runs. */
22
+ beforeProve?: () => Promise<void> | void;
23
+ /** Called after `prove` returns successfully (not on failure / cancellation). */
24
+ afterProve?: () => Promise<void> | void;
25
+ /**
26
+ * If set, called instead of running the underlying prove. Receives a thunk that
27
+ * runs the real call. Lets tests substitute a synthetic proof or delay/throw without
28
+ * re-implementing the rest of the finalize flow.
29
+ */
30
+ proveOverride?: (defaultProve: () => Promise<TopTreeProof>) => Promise<TopTreeProof>;
31
+ };
32
+ /**
33
+ * Self-contained top-tree job. Constructed from a snapshot of `CheckpointProver`s; runs
34
+ * `topTree.prove(...)` against their pending `blockProofs` promises and exposes the
35
+ * final epoch proof via `result`.
36
+ *
37
+ */
38
+ export declare class TopTreeJob {
39
+ private readonly epochNumber;
40
+ private readonly deps;
41
+ /** Resolves with the final proof on success; rejects on cancellation or any prove error. */
42
+ readonly result: PromiseWithResolvers<TopTreeProof>;
43
+ /** Snapshot of checkpoint jobs the top tree is built from, in checkpoint-number order. */
44
+ readonly snapshot: readonly CheckpointProver[];
45
+ private readonly topTree;
46
+ private readonly fromCheckpoint;
47
+ private readonly toCheckpoint;
48
+ private cancelled;
49
+ /** Tracks the cancel-driven background teardown so `whenDone()` can await it. */
50
+ private cancelPromise?;
51
+ private readonly executionTimer;
52
+ constructor(epochNumber: EpochNumber, snapshot: readonly CheckpointProver[], deps: {
53
+ proverFactory: EpochProverFactory;
54
+ metrics: ProverNodeJobMetrics;
55
+ log: Logger;
56
+ hooks?: TopTreeJobHooks;
57
+ });
58
+ /** Range covered by this attempt — useful for logging and L1 submission. */
59
+ getRange(): {
60
+ fromCheckpoint: CheckpointNumber;
61
+ toCheckpoint: CheckpointNumber;
62
+ count: number;
63
+ };
64
+ isCancelled(): boolean;
65
+ /** Wall-time since construction — used by the owning job for metrics. */
66
+ elapsedMs(): number;
67
+ /** Kicks off the prove. Returns the result promise (also available as `result.promise`). */
68
+ start(): Promise<TopTreeProof>;
69
+ /**
70
+ * Cancels the in-flight prove. Idempotent. Rejects the result promise with
71
+ * `TopTreeCancelledError`, then kicks off the underlying orchestrator's teardown
72
+ * in the background so callers don't block on it. The teardown promise is exposed
73
+ * via `whenDone()` — the parent collects the cancelled job and awaits all
74
+ * pending top-tree teardowns at the end of the epoch.
75
+ */
76
+ cancel(): void;
77
+ /** Resolves once the cancel-driven teardown of the underlying orchestrator has unwound. */
78
+ whenDone(): Promise<void>;
79
+ private runCancel;
80
+ private run;
81
+ }
82
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9wLXRyZWUtam9iLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvam9iL3RvcC10cmVlLWpvYi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxXQUFXLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN6RCxPQUFPLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxXQUFXLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNyRixPQUFPLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsS0FBSyxvQkFBb0IsRUFBd0IsTUFBTSwyQkFBMkIsQ0FBQztBQUU1RixPQUFPLEtBQUssRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBTy9ELE9BQU8sS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sS0FBSyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFbkUsT0FBTyxLQUFLLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUQsT0FBTyxLQUFLLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUUvRCwyQ0FBMkM7QUFDM0MsTUFBTSxNQUFNLFlBQVksR0FBRztJQUN6QixZQUFZLEVBQUUsc0JBQXNCLENBQUM7SUFDckMsS0FBSyxFQUFFLEtBQUssQ0FBQztJQUNiLGlCQUFpQixFQUFFLFdBQVcsQ0FBQztDQUNoQyxDQUFDO0FBRUY7OztHQUdHO0FBQ0gsTUFBTSxNQUFNLGVBQWUsR0FBRztJQUM1Qiw2REFBNkQ7SUFDN0QsV0FBVyxDQUFDLEVBQUUsTUFBTSxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3pDLGlGQUFpRjtJQUNqRixVQUFVLENBQUMsRUFBRSxNQUFNLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUM7SUFDeEM7Ozs7T0FJRztJQUNILGFBQWEsQ0FBQyxFQUFFLENBQUMsWUFBWSxFQUFFLE1BQU0sT0FBTyxDQUFDLFlBQVksQ0FBQyxLQUFLLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQztDQUN0RixDQUFDO0FBRUY7Ozs7O0dBS0c7QUFDSCxxQkFBYSxVQUFVO0lBZ0JuQixPQUFPLENBQUMsUUFBUSxDQUFDLFdBQVc7SUFFNUIsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJO0lBakJ2Qiw0RkFBNEY7SUFDNUYsUUFBUSxDQUFDLE1BQU0sRUFBRSxvQkFBb0IsQ0FBQyxZQUFZLENBQUMsQ0FBMEI7SUFFN0UsMEZBQTBGO0lBQzFGLFFBQVEsQ0FBQyxRQUFRLEVBQUUsU0FBUyxnQkFBZ0IsRUFBRSxDQUFDO0lBRS9DLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFzQjtJQUM5QyxPQUFPLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBbUI7SUFDbEQsT0FBTyxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQW1CO0lBQ2hELE9BQU8sQ0FBQyxTQUFTLENBQVM7SUFDMUIsaUZBQWlGO0lBQ2pGLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBZ0I7SUFDdEMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQWU7SUFFOUMsWUFDbUIsV0FBVyxFQUFFLFdBQVcsRUFDekMsUUFBUSxFQUFFLFNBQVMsZ0JBQWdCLEVBQUUsRUFDcEIsSUFBSSxFQUFFO1FBQ3JCLGFBQWEsRUFBRSxrQkFBa0IsQ0FBQztRQUNsQyxPQUFPLEVBQUUsb0JBQW9CLENBQUM7UUFDOUIsR0FBRyxFQUFFLE1BQU0sQ0FBQztRQUNaLEtBQUssQ0FBQyxFQUFFLGVBQWUsQ0FBQztLQUN6QixFQThCRjtJQUVELDhFQUE0RTtJQUNyRSxRQUFRLElBQUk7UUFBRSxjQUFjLEVBQUUsZ0JBQWdCLENBQUM7UUFBQyxZQUFZLEVBQUUsZ0JBQWdCLENBQUM7UUFBQyxLQUFLLEVBQUUsTUFBTSxDQUFBO0tBQUUsQ0FFckc7SUFFTSxXQUFXLElBQUksT0FBTyxDQUU1QjtJQUVELDJFQUF5RTtJQUNsRSxTQUFTLElBQUksTUFBTSxDQUV6QjtJQUVELDRGQUE0RjtJQUNyRixLQUFLLElBQUksT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUdwQztJQUVEOzs7Ozs7T0FNRztJQUNJLE1BQU0sSUFBSSxJQUFJLENBbUJwQjtJQUVELDJGQUEyRjtJQUM5RSxRQUFRLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxDQUlyQztZQUVhLFNBQVM7WUFhVCxHQUFHO0NBdURsQiJ9
@@ -0,0 +1 @@
1
+ {"version":3,"file":"top-tree-job.d.ts","sourceRoot":"","sources":["../../src/job/top-tree-job.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AACrF,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,KAAK,oBAAoB,EAAwB,MAAM,2BAA2B,CAAC;AAE5F,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAO/D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAEnE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE/D,2CAA2C;AAC3C,MAAM,MAAM,YAAY,GAAG;IACzB,YAAY,EAAE,sBAAsB,CAAC;IACrC,KAAK,EAAE,KAAK,CAAC;IACb,iBAAiB,EAAE,WAAW,CAAC;CAChC,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B,6DAA6D;IAC7D,WAAW,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACzC,iFAAiF;IACjF,UAAU,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACxC;;;;OAIG;IACH,aAAa,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,OAAO,CAAC,YAAY,CAAC,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC;CACtF,CAAC;AAEF;;;;;GAKG;AACH,qBAAa,UAAU;IAgBnB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAE5B,OAAO,CAAC,QAAQ,CAAC,IAAI;IAjBvB,4FAA4F;IAC5F,QAAQ,CAAC,MAAM,EAAE,oBAAoB,CAAC,YAAY,CAAC,CAA0B;IAE7E,0FAA0F;IAC1F,QAAQ,CAAC,QAAQ,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAE/C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsB;IAC9C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAmB;IAClD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAmB;IAChD,OAAO,CAAC,SAAS,CAAS;IAC1B,iFAAiF;IACjF,OAAO,CAAC,aAAa,CAAC,CAAgB;IACtC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAe;IAE9C,YACmB,WAAW,EAAE,WAAW,EACzC,QAAQ,EAAE,SAAS,gBAAgB,EAAE,EACpB,IAAI,EAAE;QACrB,aAAa,EAAE,kBAAkB,CAAC;QAClC,OAAO,EAAE,oBAAoB,CAAC;QAC9B,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,CAAC,EAAE,eAAe,CAAC;KACzB,EA8BF;IAED,8EAA4E;IACrE,QAAQ,IAAI;QAAE,cAAc,EAAE,gBAAgB,CAAC;QAAC,YAAY,EAAE,gBAAgB,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAErG;IAEM,WAAW,IAAI,OAAO,CAE5B;IAED,2EAAyE;IAClE,SAAS,IAAI,MAAM,CAEzB;IAED,4FAA4F;IACrF,KAAK,IAAI,OAAO,CAAC,YAAY,CAAC,CAGpC;IAED;;;;;;OAMG;IACI,MAAM,IAAI,IAAI,CAmBpB;IAED,2FAA2F;IAC9E,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAIrC;YAEa,SAAS;YAaT,GAAG;CAuDlB"}
@@ -0,0 +1,152 @@
1
+ import { promiseWithResolvers } from '@aztec/foundation/promise';
2
+ import { Timer } from '@aztec/foundation/timer';
3
+ import { buildFinalBlobChallenges } from '@aztec/prover-client/helpers';
4
+ import { TopTreeCancelledError } from '@aztec/prover-client/orchestrator';
5
+ /**
6
+ * Self-contained top-tree job. Constructed from a snapshot of `CheckpointProver`s; runs
7
+ * `topTree.prove(...)` against their pending `blockProofs` promises and exposes the
8
+ * final epoch proof via `result`.
9
+ *
10
+ */ export class TopTreeJob {
11
+ epochNumber;
12
+ deps;
13
+ /** Resolves with the final proof on success; rejects on cancellation or any prove error. */ result;
14
+ /** Snapshot of checkpoint jobs the top tree is built from, in checkpoint-number order. */ snapshot;
15
+ topTree;
16
+ fromCheckpoint;
17
+ toCheckpoint;
18
+ cancelled;
19
+ /** Tracks the cancel-driven background teardown so `whenDone()` can await it. */ cancelPromise;
20
+ executionTimer;
21
+ constructor(epochNumber, snapshot, deps){
22
+ this.epochNumber = epochNumber;
23
+ this.deps = deps;
24
+ this.result = promiseWithResolvers();
25
+ this.cancelled = false;
26
+ this.executionTimer = new Timer();
27
+ if (snapshot.length === 0) {
28
+ throw new Error(`Cannot construct TopTreeJob for epoch ${epochNumber}: empty snapshot`);
29
+ }
30
+ for(let i = 1; i < snapshot.length; i++){
31
+ const prev = snapshot[i - 1].checkpoint.number;
32
+ const curr = snapshot[i].checkpoint.number;
33
+ if (curr !== prev + 1) {
34
+ throw new Error(`Cannot construct TopTreeJob for epoch ${epochNumber}: checkpoint numbers must be contiguous, got gap between ${prev} and ${curr}`);
35
+ }
36
+ }
37
+ this.snapshot = snapshot;
38
+ this.fromCheckpoint = snapshot[0].checkpoint.number;
39
+ this.toCheckpoint = snapshot[snapshot.length - 1].checkpoint.number;
40
+ this.topTree = deps.proverFactory.createTopTreeOrchestrator();
41
+ deps.log.info(`Created TopTreeJob for epoch ${epochNumber} covering checkpoints ${this.fromCheckpoint}..${this.toCheckpoint}`, {
42
+ epochNumber,
43
+ fromCheckpoint: this.fromCheckpoint,
44
+ toCheckpoint: this.toCheckpoint,
45
+ checkpointCount: snapshot.length
46
+ });
47
+ // Mark the result's rejection branch as observed so a cancellation before any
48
+ // consumer awaits does not surface as unhandled.
49
+ this.result.promise.catch(()=>{});
50
+ }
51
+ /** Range covered by this attempt — useful for logging and L1 submission. */ getRange() {
52
+ return {
53
+ fromCheckpoint: this.fromCheckpoint,
54
+ toCheckpoint: this.toCheckpoint,
55
+ count: this.snapshot.length
56
+ };
57
+ }
58
+ isCancelled() {
59
+ return this.cancelled;
60
+ }
61
+ /** Wall-time since construction — used by the owning job for metrics. */ elapsedMs() {
62
+ return this.executionTimer.ms();
63
+ }
64
+ /** Kicks off the prove. Returns the result promise (also available as `result.promise`). */ start() {
65
+ void this.run();
66
+ return this.result.promise;
67
+ }
68
+ /**
69
+ * Cancels the in-flight prove. Idempotent. Rejects the result promise with
70
+ * `TopTreeCancelledError`, then kicks off the underlying orchestrator's teardown
71
+ * in the background so callers don't block on it. The teardown promise is exposed
72
+ * via `whenDone()` — the parent collects the cancelled job and awaits all
73
+ * pending top-tree teardowns at the end of the epoch.
74
+ */ cancel() {
75
+ if (this.cancelled) {
76
+ return;
77
+ }
78
+ this.cancelled = true;
79
+ this.deps.log.info(`Cancelling TopTreeJob for epoch ${this.epochNumber} (checkpoints ${this.fromCheckpoint}..${this.toCheckpoint})`, {
80
+ epochNumber: this.epochNumber,
81
+ fromCheckpoint: this.fromCheckpoint,
82
+ toCheckpoint: this.toCheckpoint,
83
+ elapsedMs: this.executionTimer.ms()
84
+ });
85
+ this.result.reject(new TopTreeCancelledError());
86
+ // Fire and forget: parent awaits the cancel-driven teardown via whenDone(); the
87
+ // chained .catch swallows rejections so the unawaited promise doesn't surface
88
+ // as an unhandled rejection.
89
+ this.cancelPromise = this.runCancel().catch(()=>{});
90
+ }
91
+ /** Resolves once the cancel-driven teardown of the underlying orchestrator has unwound. */ async whenDone() {
92
+ if (this.cancelPromise) {
93
+ await this.cancelPromise;
94
+ }
95
+ }
96
+ async runCancel() {
97
+ try {
98
+ this.topTree.cancel({
99
+ abortJobs: true
100
+ });
101
+ } catch (err) {
102
+ this.deps.log.error('Error cancelling top tree', err);
103
+ }
104
+ try {
105
+ await this.topTree.stop();
106
+ } catch (err) {
107
+ this.deps.log.error('Error stopping top tree', err);
108
+ }
109
+ }
110
+ async run() {
111
+ try {
112
+ const blobTimer = new Timer();
113
+ const blobFieldsPerCheckpoint = this.snapshot.map((j)=>j.checkpoint.toBlobFields());
114
+ const finalBlobBatchingChallenges = await buildFinalBlobChallenges(blobFieldsPerCheckpoint);
115
+ this.deps.metrics.recordBlobProcessing(blobTimer.ms());
116
+ this.deps.log.verbose(`Built final blob batching challenges for epoch ${this.epochNumber} in ${blobTimer.ms()}ms`, {
117
+ epochNumber: this.epochNumber,
118
+ checkpointCount: this.snapshot.length,
119
+ durationMs: blobTimer.ms()
120
+ });
121
+ const checkpointData = this.snapshot.map((j)=>({
122
+ blockProofs: j.whenBlockProofsReady(),
123
+ l2ToL1MsgsPerBlock: j.checkpoint.blocks.map((b)=>b.body.txEffects.map((tx)=>tx.l2ToL1Msgs)),
124
+ blobFields: j.checkpoint.toBlobFields(),
125
+ previousBlockHeader: j.previousBlockHeader,
126
+ previousArchiveSiblingPath: j.previousArchiveSiblingPath
127
+ }));
128
+ const defaultProve = ()=>this.topTree.prove(this.epochNumber, this.snapshot.length, finalBlobBatchingChallenges, checkpointData);
129
+ await this.deps.hooks?.beforeProve?.();
130
+ const proveTimer = new Timer();
131
+ this.deps.log.info(`Starting top-tree prove for epoch ${this.epochNumber} (checkpoints ${this.fromCheckpoint}..${this.toCheckpoint})`, {
132
+ epochNumber: this.epochNumber,
133
+ fromCheckpoint: this.fromCheckpoint,
134
+ toCheckpoint: this.toCheckpoint,
135
+ checkpointCount: this.snapshot.length
136
+ });
137
+ const proof = await (this.deps.hooks?.proveOverride ? this.deps.hooks.proveOverride(defaultProve) : defaultProve());
138
+ await this.deps.hooks?.afterProve?.();
139
+ this.deps.log.info(`Top-tree prove succeeded for epoch ${this.epochNumber} in ${proveTimer.ms()}ms`, {
140
+ epochNumber: this.epochNumber,
141
+ fromCheckpoint: this.fromCheckpoint,
142
+ toCheckpoint: this.toCheckpoint,
143
+ durationMs: proveTimer.ms(),
144
+ totalElapsedMs: this.executionTimer.ms()
145
+ });
146
+ this.result.resolve(proof);
147
+ } catch (err) {
148
+ // Cancel paths surface as TopTreeCancelledError; everything else propagates as-is.
149
+ this.result.reject(err);
150
+ }
151
+ }
152
+ }
package/dest/metrics.d.ts CHANGED
@@ -2,27 +2,44 @@ import type { RollupContract } from '@aztec/ethereum/contracts';
2
2
  import type { EthAddress } from '@aztec/foundation/eth-address';
3
3
  import type { L1PublishProofStats } from '@aztec/stdlib/stats';
4
4
  import { type Gauge, type Histogram, type Meter, type TelemetryClient, type Tracer, type UpDownCounter } from '@aztec/telemetry-client';
5
+ import type { CheckpointStore } from './checkpoint-store.js';
6
+ import type { SessionManager } from './session-manager.js';
5
7
  export declare class ProverNodeJobMetrics {
6
8
  private meter;
7
9
  readonly tracer: Tracer;
8
10
  private logger;
9
- proverEpochExecutionDuration: Histogram;
10
11
  provingJobDuration: Histogram;
11
12
  provingJobCheckpoints: Gauge;
12
13
  provingJobBlocks: Gauge;
13
14
  provingJobTransactions: Gauge;
14
15
  private blobProcessingDuration;
15
- private chonkVerifierDuration;
16
16
  private blockProcessingDuration;
17
17
  private checkpointProcessingDuration;
18
- private allCheckpointsProcessingDuration;
18
+ private checkpointProvingDuration;
19
+ private checkpointBlocks;
20
+ private checkpointTransactions;
21
+ /** Observable gauges for live state. Registered via `observeState(...)` once the
22
+ * CheckpointStore and SessionManager are available. */
23
+ private activeCheckpoints;
24
+ private activeEpochSessions;
25
+ private stateObserver;
26
+ private stateObservedMetrics;
19
27
  constructor(meter: Meter, tracer: Tracer, logger?: import("@aztec/foundation/log").Logger);
20
- recordProvingJob(executionTimeMs: number, totalTimeMs: number, numCheckpoints: number, numBlocks: number, numTxs: number): void;
28
+ recordProvingJob(totalTimeMs: number, numCheckpoints: number, numBlocks: number, numTxs: number): void;
21
29
  recordBlobProcessing(durationMs: number): void;
22
- recordChonkVerifier(durationMs: number): void;
23
30
  recordBlockProcessing(durationMs: number): void;
24
- recordCheckpointProcessing(durationMs: number): void;
25
- recordAllCheckpointsProcessing(durationMs: number): void;
31
+ recordCheckpointProcessing(durationMs: number, numBlocks: number, numTxs: number): void;
32
+ recordCheckpointProving(durationMs: number): void;
33
+ /**
34
+ * Registers observable gauges for the prover-node's live state: how many canonical
35
+ * checkpoint provers are in the store, and how many epoch sessions are live (broken
36
+ * down by kind). Idempotent — repeated calls re-arm with the latest references.
37
+ *
38
+ * Call this once the `SessionManager` has been constructed (i.e. inside `ProverNode.start()`).
39
+ */
40
+ observeState(checkpointStore: CheckpointStore, sessionManager: SessionManager): void;
41
+ /** Tears down the observable callback registered by `observeState`. Idempotent. */
42
+ stopObservingState(): void;
26
43
  }
27
44
  export declare class ProverNodeRewardsMetrics {
28
45
  private meter;
@@ -68,4 +85,4 @@ export declare class ProverNodePublisherMetrics {
68
85
  recordSenderBalance(wei: bigint, senderAddress: string): void;
69
86
  private recordTx;
70
87
  }
71
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0cmljcy5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL21ldHJpY3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsY0FBYyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDaEUsT0FBTyxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFaEUsT0FBTyxLQUFLLEVBQUUsbUJBQW1CLEVBQWtCLE1BQU0scUJBQXFCLENBQUM7QUFDL0UsT0FBTyxFQUdMLEtBQUssS0FBSyxFQUNWLEtBQUssU0FBUyxFQUNkLEtBQUssS0FBSyxFQUdWLEtBQUssZUFBZSxFQUNwQixLQUFLLE1BQU0sRUFDWCxLQUFLLGFBQWEsRUFFbkIsTUFBTSx5QkFBeUIsQ0FBQztBQUlqQyxxQkFBYSxvQkFBb0I7SUFjN0IsT0FBTyxDQUFDLEtBQUs7YUFDRyxNQUFNLEVBQUUsTUFBTTtJQUM5QixPQUFPLENBQUMsTUFBTTtJQWZoQiw0QkFBNEIsRUFBRSxTQUFTLENBQUM7SUFDeEMsa0JBQWtCLEVBQUUsU0FBUyxDQUFDO0lBQzlCLHFCQUFxQixFQUFFLEtBQUssQ0FBQztJQUM3QixnQkFBZ0IsRUFBRSxLQUFLLENBQUM7SUFDeEIsc0JBQXNCLEVBQUUsS0FBSyxDQUFDO0lBRTlCLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBUTtJQUN0QyxPQUFPLENBQUMscUJBQXFCLENBQVE7SUFDckMsT0FBTyxDQUFDLHVCQUF1QixDQUFZO0lBQzNDLE9BQU8sQ0FBQyw0QkFBNEIsQ0FBWTtJQUNoRCxPQUFPLENBQUMsZ0NBQWdDLENBQVE7SUFFaEQsWUFDVSxLQUFLLEVBQUUsS0FBSyxFQUNKLE1BQU0sRUFBRSxNQUFNLEVBQ3RCLE1BQU0seUNBQWdELEVBZS9EO0lBRU0sZ0JBQWdCLENBQ3JCLGVBQWUsRUFBRSxNQUFNLEVBQ3ZCLFdBQVcsRUFBRSxNQUFNLEVBQ25CLGNBQWMsRUFBRSxNQUFNLEVBQ3RCLFNBQVMsRUFBRSxNQUFNLEVBQ2pCLE1BQU0sRUFBRSxNQUFNLFFBT2Y7SUFFTSxvQkFBb0IsQ0FBQyxVQUFVLEVBQUUsTUFBTSxRQUU3QztJQUVNLG1CQUFtQixDQUFDLFVBQVUsRUFBRSxNQUFNLFFBRTVDO0lBRU0scUJBQXFCLENBQUMsVUFBVSxFQUFFLE1BQU0sUUFFOUM7SUFFTSwwQkFBMEIsQ0FBQyxVQUFVLEVBQUUsTUFBTSxRQUVuRDtJQUVNLDhCQUE4QixDQUFDLFVBQVUsRUFBRSxNQUFNLFFBRXZEO0NBQ0Y7QUFFRCxxQkFBYSx3QkFBd0I7SUFPakMsT0FBTyxDQUFDLEtBQUs7SUFDYixPQUFPLENBQUMsUUFBUTtJQUNoQixPQUFPLENBQUMsTUFBTTtJQUNkLE9BQU8sQ0FBQyxNQUFNO0lBVGhCLE9BQU8sQ0FBQyxPQUFPLENBQWtCO0lBQ2pDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBZ0I7SUFDMUMsT0FBTyxDQUFDLFNBQVMsQ0FBTztJQUN4QixPQUFPLENBQUMscUJBQXFCLENBQUs7SUFFbEMsWUFDVSxLQUFLLEVBQUUsS0FBSyxFQUNaLFFBQVEsRUFBRSxVQUFVLEVBQ3BCLE1BQU0sRUFBRSxjQUFjLEVBQ3RCLE1BQU0seUNBQWdELEVBSy9EO0lBRVksS0FBSyxrQkFJakI7SUFFTSxJQUFJLFNBRVY7SUFFRCxPQUFPLENBQUMsT0FBTyxDQXdCYjtDQUNIO0FBRUQsTUFBTSxNQUFNLHlCQUF5QixHQUFHO0lBQ3RDLFFBQVEsRUFBRSxNQUFNLENBQUM7SUFDakIsYUFBYSxFQUFFLE1BQU0sQ0FBQztJQUN0QixvQkFBb0IsRUFBRSxNQUFNLENBQUM7SUFDN0IsaUJBQWlCLEVBQUUsTUFBTSxDQUFDO0NBQzNCLENBQUM7QUFFRixxQkFBYSwwQkFBMEI7YUFtQm5CLE1BQU0sRUFBRSxlQUFlO0lBRXZDLE9BQU8sQ0FBQyxNQUFNO0lBcEJoQixRQUFRLEVBQUUsU0FBUyxDQUFDO0lBQ3BCLE9BQU8sRUFBRSxhQUFhLENBQUM7SUFDdkIsVUFBVSxFQUFFLFNBQVMsQ0FBQztJQUN0QixLQUFLLEVBQUUsU0FBUyxDQUFDO0lBQ2pCLGNBQWMsRUFBRSxTQUFTLENBQUM7SUFDMUIsYUFBYSxFQUFFLFNBQVMsQ0FBQztJQUN6QixpQkFBaUIsRUFBRSxTQUFTLENBQUM7SUFDN0IsaUJBQWlCLEVBQUUsU0FBUyxDQUFDO0lBQzdCLFVBQVUsRUFBRSxTQUFTLENBQUM7SUFFdEIsT0FBTyxDQUFDLGNBQWMsQ0FBWTtJQUNsQyxPQUFPLENBQUMsaUJBQWlCLENBQVk7SUFDckMsT0FBTyxDQUFDLG1CQUFtQixDQUFZO0lBRXZDLE9BQU8sQ0FBQyxhQUFhLENBQVE7SUFDN0IsT0FBTyxDQUFDLEtBQUssQ0FBUTtJQUVyQixZQUNrQixNQUFNLEVBQUUsZUFBZSxFQUN2QyxJQUFJLFNBQWUsRUFDWCxNQUFNLHlDQUFnRCxFQWdDL0Q7SUFFRCxjQUFjLFNBS2I7SUFFRCxpQkFBaUIsQ0FBQyxVQUFVLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxtQkFBbUIsUUFFL0Q7SUFFTSwwQkFBMEIsQ0FBQyxLQUFLLEVBQUUseUJBQXlCLFFBa0JqRTtJQUVNLG1CQUFtQixDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLE1BQU0sUUFLNUQ7SUFFRCxPQUFPLENBQUMsUUFBUTtDQXVDakIifQ==
88
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0cmljcy5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL21ldHJpY3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsY0FBYyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDaEUsT0FBTyxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFaEUsT0FBTyxLQUFLLEVBQUUsbUJBQW1CLEVBQWtCLE1BQU0scUJBQXFCLENBQUM7QUFDL0UsT0FBTyxFQUdMLEtBQUssS0FBSyxFQUNWLEtBQUssU0FBUyxFQUNkLEtBQUssS0FBSyxFQUdWLEtBQUssZUFBZSxFQUNwQixLQUFLLE1BQU0sRUFDWCxLQUFLLGFBQWEsRUFFbkIsTUFBTSx5QkFBeUIsQ0FBQztBQUlqQyxPQUFPLEtBQUssRUFBRSxlQUFlLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM3RCxPQUFPLEtBQUssRUFBRSxjQUFjLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUUzRCxxQkFBYSxvQkFBb0I7SUFxQjdCLE9BQU8sQ0FBQyxLQUFLO2FBQ0csTUFBTSxFQUFFLE1BQU07SUFDOUIsT0FBTyxDQUFDLE1BQU07SUF0QmhCLGtCQUFrQixFQUFFLFNBQVMsQ0FBQztJQUM5QixxQkFBcUIsRUFBRSxLQUFLLENBQUM7SUFDN0IsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDO0lBQ3hCLHNCQUFzQixFQUFFLEtBQUssQ0FBQztJQUU5QixPQUFPLENBQUMsc0JBQXNCLENBQVE7SUFDdEMsT0FBTyxDQUFDLHVCQUF1QixDQUFZO0lBQzNDLE9BQU8sQ0FBQyw0QkFBNEIsQ0FBWTtJQUNoRCxPQUFPLENBQUMseUJBQXlCLENBQVk7SUFDN0MsT0FBTyxDQUFDLGdCQUFnQixDQUFZO0lBQ3BDLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBWTtJQUUxQzs0REFDd0Q7SUFDeEQsT0FBTyxDQUFDLGlCQUFpQixDQUE4QjtJQUN2RCxPQUFPLENBQUMsbUJBQW1C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
@@ -1 +1 @@
1
- {"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../src/metrics.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../src/metrics.ts"],"names":[],"mappings":"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"}
package/dest/metrics.js CHANGED
@@ -5,33 +5,38 @@ export class ProverNodeJobMetrics {
5
5
  meter;
6
6
  tracer;
7
7
  logger;
8
- proverEpochExecutionDuration;
9
8
  provingJobDuration;
10
9
  provingJobCheckpoints;
11
10
  provingJobBlocks;
12
11
  provingJobTransactions;
13
12
  blobProcessingDuration;
14
- chonkVerifierDuration;
15
13
  blockProcessingDuration;
16
14
  checkpointProcessingDuration;
17
- allCheckpointsProcessingDuration;
15
+ checkpointProvingDuration;
16
+ checkpointBlocks;
17
+ checkpointTransactions;
18
+ /** Observable gauges for live state. Registered via `observeState(...)` once the
19
+ * CheckpointStore and SessionManager are available. */ activeCheckpoints;
20
+ activeEpochSessions;
21
+ stateObserver;
22
+ stateObservedMetrics;
18
23
  constructor(meter, tracer, logger = createLogger('prover-node:publisher:metrics')){
19
24
  this.meter = meter;
20
25
  this.tracer = tracer;
21
26
  this.logger = logger;
22
- this.proverEpochExecutionDuration = this.meter.createHistogram(Metrics.PROVER_NODE_EXECUTION_DURATION);
27
+ this.stateObservedMetrics = [];
23
28
  this.provingJobDuration = this.meter.createHistogram(Metrics.PROVER_NODE_JOB_DURATION);
24
29
  this.provingJobCheckpoints = this.meter.createGauge(Metrics.PROVER_NODE_JOB_CHECKPOINTS);
25
30
  this.provingJobBlocks = this.meter.createGauge(Metrics.PROVER_NODE_JOB_BLOCKS);
26
31
  this.provingJobTransactions = this.meter.createGauge(Metrics.PROVER_NODE_JOB_TRANSACTIONS);
27
32
  this.blobProcessingDuration = this.meter.createGauge(Metrics.PROVER_NODE_BLOB_PROCESSING_LAST_DURATION);
28
- this.chonkVerifierDuration = this.meter.createGauge(Metrics.PROVER_NODE_CHONK_VERIFIER_LAST_DURATION);
29
33
  this.blockProcessingDuration = this.meter.createHistogram(Metrics.PROVER_NODE_BLOCK_PROCESSING_DURATION);
30
34
  this.checkpointProcessingDuration = this.meter.createHistogram(Metrics.PROVER_NODE_CHECKPOINT_PROCESSING_DURATION);
31
- this.allCheckpointsProcessingDuration = this.meter.createGauge(Metrics.PROVER_NODE_ALL_CHECKPOINTS_PROCESSING_LAST_DURATION);
35
+ this.checkpointProvingDuration = this.meter.createHistogram(Metrics.PROVER_NODE_CHECKPOINT_PROVING_DURATION);
36
+ this.checkpointBlocks = this.meter.createHistogram(Metrics.PROVER_NODE_CHECKPOINT_BLOCKS);
37
+ this.checkpointTransactions = this.meter.createHistogram(Metrics.PROVER_NODE_CHECKPOINT_TRANSACTIONS);
32
38
  }
33
- recordProvingJob(executionTimeMs, totalTimeMs, numCheckpoints, numBlocks, numTxs) {
34
- this.proverEpochExecutionDuration.record(Math.ceil(executionTimeMs));
39
+ recordProvingJob(totalTimeMs, numCheckpoints, numBlocks, numTxs) {
35
40
  this.provingJobDuration.record(totalTimeMs / 1000);
36
41
  this.provingJobCheckpoints.record(Math.floor(numCheckpoints));
37
42
  this.provingJobBlocks.record(Math.floor(numBlocks));
@@ -40,17 +45,62 @@ export class ProverNodeJobMetrics {
40
45
  recordBlobProcessing(durationMs) {
41
46
  this.blobProcessingDuration.record(Math.ceil(durationMs));
42
47
  }
43
- recordChonkVerifier(durationMs) {
44
- this.chonkVerifierDuration.record(Math.ceil(durationMs));
45
- }
46
48
  recordBlockProcessing(durationMs) {
47
49
  this.blockProcessingDuration.record(Math.ceil(durationMs));
48
50
  }
49
- recordCheckpointProcessing(durationMs) {
51
+ recordCheckpointProcessing(durationMs, numBlocks, numTxs) {
50
52
  this.checkpointProcessingDuration.record(Math.ceil(durationMs));
53
+ this.checkpointBlocks.record(Math.floor(numBlocks));
54
+ this.checkpointTransactions.record(Math.floor(numTxs));
55
+ }
56
+ recordCheckpointProving(durationMs) {
57
+ this.checkpointProvingDuration.record(Math.ceil(durationMs));
58
+ }
59
+ /**
60
+ * Registers observable gauges for the prover-node's live state: how many canonical
61
+ * checkpoint provers are in the store, and how many epoch sessions are live (broken
62
+ * down by kind). Idempotent — repeated calls re-arm with the latest references.
63
+ *
64
+ * Call this once the `SessionManager` has been constructed (i.e. inside `ProverNode.start()`).
65
+ */ observeState(checkpointStore, sessionManager) {
66
+ this.stopObservingState();
67
+ this.activeCheckpoints = this.meter.createObservableGauge(Metrics.PROVER_NODE_ACTIVE_CHECKPOINTS);
68
+ this.activeEpochSessions = this.meter.createObservableGauge(Metrics.PROVER_NODE_ACTIVE_EPOCH_SESSIONS);
69
+ this.stateObserver = (observer)=>{
70
+ observer.observe(this.activeCheckpoints, checkpointStore.listCanonical().length);
71
+ let full = 0;
72
+ let partial = 0;
73
+ for (const session of sessionManager.allSessions()){
74
+ if (session.isTerminal()) {
75
+ continue;
76
+ }
77
+ if (session.getKind() === 'full') {
78
+ full++;
79
+ } else {
80
+ partial++;
81
+ }
82
+ }
83
+ observer.observe(this.activeEpochSessions, full, {
84
+ [Attributes.EPOCH_SESSION_KIND]: 'full'
85
+ });
86
+ observer.observe(this.activeEpochSessions, partial, {
87
+ [Attributes.EPOCH_SESSION_KIND]: 'partial'
88
+ });
89
+ };
90
+ this.stateObservedMetrics = [
91
+ this.activeCheckpoints,
92
+ this.activeEpochSessions
93
+ ];
94
+ this.meter.addBatchObservableCallback(this.stateObserver, this.stateObservedMetrics);
51
95
  }
52
- recordAllCheckpointsProcessing(durationMs) {
53
- this.allCheckpointsProcessingDuration.record(Math.ceil(durationMs));
96
+ /** Tears down the observable callback registered by `observeState`. Idempotent. */ stopObservingState() {
97
+ if (this.stateObserver) {
98
+ this.meter.removeBatchObservableCallback(this.stateObserver, this.stateObservedMetrics);
99
+ this.stateObserver = undefined;
100
+ this.stateObservedMetrics = [];
101
+ this.activeCheckpoints = undefined;
102
+ this.activeEpochSessions = undefined;
103
+ }
54
104
  }
55
105
  }
56
106
  export class ProverNodeRewardsMetrics {
@@ -0,0 +1,161 @@
1
+ import type { BatchedBlob } from '@aztec/blob-lib';
2
+ import type { ViemCommitteeAttestation } from '@aztec/ethereum/contracts';
3
+ import { BlockNumber, type CheckpointNumber, type EpochNumber } from '@aztec/foundation/branded-types';
4
+ import { type LoggerBindings } from '@aztec/foundation/log';
5
+ import { SerialQueue } from '@aztec/foundation/queue';
6
+ import type { DateProvider } from '@aztec/foundation/timer';
7
+ import type { L2BlockSource } from '@aztec/stdlib/block';
8
+ import type { Proof } from '@aztec/stdlib/proofs';
9
+ import type { CheckpointHeader, RootRollupPublicInputs } from '@aztec/stdlib/rollup';
10
+ import type { ProverNodePublisher } from './prover-node-publisher.js';
11
+ import type { ProverPublisherFactory } from './prover-publisher-factory.js';
12
+ /** A single proof candidate offered to the publishing service by an `EpochSession`. */
13
+ export type PublishCandidate = {
14
+ /** Stable id; matches the originating session so `withdraw` can target this entry. */
15
+ id: string;
16
+ epoch: EpochNumber;
17
+ /**
18
+ * Full vs partial. A `partial` candidate is an early-finish optimisation: if the chain's
19
+ * proven tip catches up to or past its `endBlock` before it publishes, it's superseded —
20
+ * publishing would be wasted L1 gas. A `full` candidate covers the entire epoch and is
21
+ * useful to publish even after some other prover-node has already submitted (the rollup
22
+ * contract records the submission per prover-id), so it is never auto-superseded by the
23
+ * proven tip alone.
24
+ */
25
+ kind: 'full' | 'partial';
26
+ /** First L2 block in the candidate's range. */
27
+ startBlock: BlockNumber;
28
+ /** Last L2 block in the candidate's range. */
29
+ endBlock: BlockNumber;
30
+ /**
31
+ * Wall-clock time after which the candidate is no longer worth publishing — typically
32
+ * the L1 proof-submission window deadline. If the candidate is still queued at this
33
+ * time it resolves as `'expired'`. If it's already in flight, the publish runs to
34
+ * completion (the L1 tx may still mine; the deadline only governs whether the service
35
+ * will start a publish). `undefined` disables the per-candidate timer.
36
+ */
37
+ deadline: Date | undefined;
38
+ /** Everything `ProverNodePublisher.submitEpochProof` needs. */
39
+ fromCheckpoint: CheckpointNumber;
40
+ toCheckpoint: CheckpointNumber;
41
+ publicInputs: RootRollupPublicInputs;
42
+ proof: Proof;
43
+ batchedBlobInputs: BatchedBlob;
44
+ attestations: ViemCommitteeAttestation[];
45
+ /** Committee-attested checkpoint headers for the range, supplying the L1-verified fee recipient/value. */
46
+ headers: CheckpointHeader[];
47
+ };
48
+ /** Terminal outcome for a candidate. The promise from `submit()` resolves with one of these. */
49
+ export type PublishOutcome = 'published' | 'superseded' | 'failed' | 'withdrawn' | 'expired';
50
+ /** Subset of `ProverPublisherFactory` the service uses — single async `create()` call. */
51
+ export type PublisherFactoryLike = Pick<ProverPublisherFactory, 'create'>;
52
+ /** Subset of `ProverNodePublisher` the service drives — one publish per fresh publisher. */
53
+ export type PublisherLike = Pick<ProverNodePublisher, 'submitEpochProof' | 'analyzeEpochProofSubmission'>;
54
+ /** Config for the publishing service. */
55
+ export type ProofPublishingServiceConfig = {
56
+ /** When true, submitting a candidate runs `analyzeEpochProofSubmission` instead of publishing. */
57
+ skipSubmitProof: boolean;
58
+ };
59
+ export type ProofPublishingServiceDeps = {
60
+ publisherFactory: PublisherFactoryLike;
61
+ l2BlockSource: Pick<L2BlockSource, 'getBlockNumber'>;
62
+ dateProvider: DateProvider;
63
+ config: ProofPublishingServiceConfig;
64
+ bindings?: LoggerBindings;
65
+ };
66
+ /**
67
+ * Central owner of L1 proof submission. Sessions offer their proofs here as
68
+ * `PublishCandidate`s; the service serialises one publish at a time, picks the
69
+ * longest candidate per epoch as the winner, and resolves the rest as
70
+ * `'superseded'` without spending L1 gas.
71
+ *
72
+ * Construction-time invariants:
73
+ * - Every publish runs against a freshly-created `ProverNodePublisher` from the factory.
74
+ * - Only one publish is ever in flight (`SerialQueue` drain) — no defensive locks.
75
+ * - Once an L1 publish starts, it runs to completion. `withdraw` is a queue-only
76
+ * operation: it removes a candidate that has not yet started publishing. An in-flight
77
+ * candidate is left alone and its outcome (`'published'` / `'failed'`) is reported as
78
+ * usual — the originating session has already moved to a terminal state via `cancel()`
79
+ * and ignores the late outcome.
80
+ *
81
+ * Eligibility for publication is decided against the proven block number read inside
82
+ * the drain (so the value is consistent with the publish that runs on the same drain
83
+ * pass): a candidate is eligible when its predecessor block is proven and (for partial
84
+ * candidates) the candidate's range extends past the proven tip. `onChainProven` is a
85
+ * wake-up signal; it does not pass state into the drain.
86
+ */
87
+ export declare class ProofPublishingService {
88
+ private readonly deps;
89
+ private readonly log;
90
+ private readonly epochs;
91
+ /**
92
+ * One drain task at a time. Submits, withdrawals, chain-proven advances, and prunes
93
+ * all schedule a `drain` here, so the eligibility re-check and the L1 publish never
94
+ * interleave.
95
+ *
96
+ * Protected so unit tests can `await drainQueue.syncPoint()` to wait for pending
97
+ * drain work to settle deterministically (no sleeps).
98
+ */
99
+ protected readonly drainQueue: SerialQueue;
100
+ /** Tracks the candidate currently being published. Set while drain is awaiting the L1 publish. */
101
+ private inFlight;
102
+ private stopped;
103
+ constructor(deps: ProofPublishingServiceDeps);
104
+ /**
105
+ * Offers a proof candidate to the service. The returned promise resolves once the
106
+ * service settles the candidate's fate: `'published'` if it wins and L1 accepts it,
107
+ * `'superseded'` if a longer candidate for the same epoch wins, `'failed'` if the
108
+ * L1 submission errored, `'withdrawn'` if the originating session cancelled,
109
+ * `'expired'` if the candidate's `deadline` elapsed before publishing started.
110
+ */
111
+ submit(candidate: PublishCandidate): Promise<PublishOutcome>;
112
+ /**
113
+ * Pulls a queued candidate from the bucket and resolves its promise as `'withdrawn'`.
114
+ * If the candidate is already being published, the publish runs to completion and the
115
+ * outcome reports whatever L1 returned — callers that cancelled mid-publish must rely
116
+ * on their own terminal-state check to ignore the late outcome. No-op if the candidate
117
+ * is unknown.
118
+ */
119
+ withdraw(candidateId: string): void;
120
+ /**
121
+ * Signals that the L1 proven tip has advanced and the queue should be re-evaluated.
122
+ * The drain reads the proven block number from `l2BlockSource` itself rather than
123
+ * relying on the value passed here — that way the eligibility check uses a value read
124
+ * inside the serial drain, not one captured by a concurrent caller of `onChainProven`.
125
+ */
126
+ onChainProven(_provenBlock: BlockNumber): void;
127
+ /**
128
+ * Stops accepting new submissions, waits for any in-flight publish to settle, and
129
+ * resolves remaining queued candidates as `'withdrawn'`.
130
+ */
131
+ stop(): Promise<void>;
132
+ private scheduleDrain;
133
+ private drain;
134
+ /**
135
+ * Picks the winning candidate for a given epoch. Partial candidates whose `endBlock` is
136
+ * already proven on-chain resolve `'superseded'`.
137
+ * Full candidates are never auto-superseded by the proven tip — multiple prover-nodes
138
+ * legitimately submit redundant full epoch proofs (one per prover-id) and L1 records each.
139
+ * Among the remaining candidates with their predecessor proven, the one with the highest
140
+ * `endBlock` wins; the others resolve `'superseded'`.
141
+ */
142
+ private pickEpochWinner;
143
+ private publishWinner;
144
+ private runPublish;
145
+ private resolveCandidate;
146
+ /**
147
+ * Arms a per-candidate expiry timer if the candidate carries a deadline. When the timer
148
+ * fires, the candidate resolves as `'expired'` — unless it is already in flight, in
149
+ * which case the publish runs to completion (the timer becomes a no-op). The timer is
150
+ * cleared by `resolveCandidate` whenever the candidate settles for any other reason.
151
+ */
152
+ private scheduleExpiry;
153
+ /**
154
+ * Protected so unit tests can drive the deadline path without waiting on the real
155
+ * `setTimeout` to fire. Production code calls this only via the per-candidate timer
156
+ * armed in `scheduleExpiry`.
157
+ */
158
+ protected handleExpiry(candidateId: string): void;
159
+ private readProvenBlockNumber;
160
+ }
161
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvb2YtcHVibGlzaGluZy1zZXJ2aWNlLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcHJvb2YtcHVibGlzaGluZy1zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLFdBQVcsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ25ELE9BQU8sS0FBSyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDMUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxLQUFLLGdCQUFnQixFQUFFLEtBQUssV0FBVyxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDdkcsT0FBTyxFQUFlLEtBQUssY0FBYyxFQUFnQixNQUFNLHVCQUF1QixDQUFDO0FBRXZGLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN0RCxPQUFPLEtBQUssRUFBRSxZQUFZLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUM1RCxPQUFPLEtBQUssRUFBRSxhQUFhLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN6RCxPQUFPLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRCxPQUFPLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRXJGLE9BQU8sS0FBSyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDdEUsT0FBTyxLQUFLLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUU1RSx1RkFBdUY7QUFDdkYsTUFBTSxNQUFNLGdCQUFnQixHQUFHO0lBQzdCLHNGQUFzRjtJQUN0RixFQUFFLEVBQUUsTUFBTSxDQUFDO0lBQ1gsS0FBSyxFQUFFLFdBQVcsQ0FBQztJQUNuQjs7Ozs7OztPQU9HO0lBQ0gsSUFBSSxFQUFFLE1BQU0sR0FBRyxTQUFTLENBQUM7SUFDekIsK0NBQStDO0lBQy9DLFVBQVUsRUFBRSxXQUFX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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proof-publishing-service.d.ts","sourceRoot":"","sources":["../src/proof-publishing-service.ts"],"names":[],"mappings":"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"}