@aztec-labs/prover-node 6.0.0-nightly.20260829
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/README.md +573 -0
- package/dest/actions/download-epoch-proving-job.d.ts +18 -0
- package/dest/actions/download-epoch-proving-job.d.ts.map +1 -0
- package/dest/actions/download-epoch-proving-job.js +37 -0
- package/dest/actions/index.d.ts +3 -0
- package/dest/actions/index.d.ts.map +1 -0
- package/dest/actions/index.js +2 -0
- package/dest/actions/rerun-epoch-proving-job.d.ts +23 -0
- package/dest/actions/rerun-epoch-proving-job.d.ts.map +1 -0
- package/dest/actions/rerun-epoch-proving-job.js +264 -0
- package/dest/actions/upload-epoch-proof-failure.d.ts +15 -0
- package/dest/actions/upload-epoch-proof-failure.d.ts.map +1 -0
- package/dest/actions/upload-epoch-proof-failure.js +78 -0
- package/dest/bin/run-failed-epoch.d.ts +2 -0
- package/dest/bin/run-failed-epoch.d.ts.map +1 -0
- package/dest/bin/run-failed-epoch.js +68 -0
- package/dest/checkpoint-store.d.ts +95 -0
- package/dest/checkpoint-store.d.ts.map +1 -0
- package/dest/checkpoint-store.js +178 -0
- package/dest/config.d.ts +31 -0
- package/dest/config.d.ts.map +1 -0
- package/dest/config.js +143 -0
- package/dest/factory.d.ts +36 -0
- package/dest/factory.d.ts.map +1 -0
- package/dest/factory.js +105 -0
- package/dest/index.d.ts +8 -0
- package/dest/index.d.ts.map +1 -0
- package/dest/index.js +7 -0
- package/dest/job/checkpoint-prover.d.ts +169 -0
- package/dest/job/checkpoint-prover.d.ts.map +1 -0
- package/dest/job/checkpoint-prover.js +413 -0
- package/dest/job/epoch-proving-job-data.d.ts +20 -0
- package/dest/job/epoch-proving-job-data.d.ts.map +1 -0
- package/dest/job/epoch-proving-job-data.js +61 -0
- package/dest/job/epoch-session.d.ts +160 -0
- package/dest/job/epoch-session.d.ts.map +1 -0
- package/dest/job/epoch-session.js +744 -0
- package/dest/job/top-tree-job.d.ts +82 -0
- package/dest/job/top-tree-job.d.ts.map +1 -0
- package/dest/job/top-tree-job.js +152 -0
- package/dest/metrics.d.ts +88 -0
- package/dest/metrics.d.ts.map +1 -0
- package/dest/metrics.js +264 -0
- package/dest/monitors/epoch-monitor.d.ts +43 -0
- package/dest/monitors/epoch-monitor.d.ts.map +1 -0
- package/dest/monitors/epoch-monitor.js +111 -0
- package/dest/monitors/index.d.ts +2 -0
- package/dest/monitors/index.d.ts.map +1 -0
- package/dest/monitors/index.js +1 -0
- package/dest/proof-publishing-service.d.ts +161 -0
- package/dest/proof-publishing-service.d.ts.map +1 -0
- package/dest/proof-publishing-service.js +335 -0
- package/dest/prover-node-publisher.d.ts +71 -0
- package/dest/prover-node-publisher.d.ts.map +1 -0
- package/dest/prover-node-publisher.js +346 -0
- package/dest/prover-node.d.ts +185 -0
- package/dest/prover-node.d.ts.map +1 -0
- package/dest/prover-node.js +1056 -0
- package/dest/prover-publisher-factory.d.ts +27 -0
- package/dest/prover-publisher-factory.d.ts.map +1 -0
- package/dest/prover-publisher-factory.js +29 -0
- package/dest/session-manager.d.ts +158 -0
- package/dest/session-manager.d.ts.map +1 -0
- package/dest/session-manager.js +493 -0
- package/dest/test/index.d.ts +13 -0
- package/dest/test/index.d.ts.map +1 -0
- package/dest/test/index.js +3 -0
- package/package.json +102 -0
- package/src/actions/download-epoch-proving-job.ts +43 -0
- package/src/actions/index.ts +2 -0
- package/src/actions/rerun-epoch-proving-job.ts +224 -0
- package/src/actions/upload-epoch-proof-failure.ts +87 -0
- package/src/bin/run-failed-epoch.ts +78 -0
- package/src/checkpoint-store.ts +212 -0
- package/src/config.ts +208 -0
- package/src/factory.ts +191 -0
- package/src/index.ts +7 -0
- package/src/job/checkpoint-prover.ts +551 -0
- package/src/job/epoch-proving-job-data.ts +94 -0
- package/src/job/epoch-session.ts +466 -0
- package/src/job/top-tree-job.ts +227 -0
- package/src/metrics.ts +323 -0
- package/src/monitors/epoch-monitor.ts +110 -0
- package/src/monitors/index.ts +1 -0
- package/src/proof-publishing-service.ts +427 -0
- package/src/prover-node-publisher.ts +473 -0
- package/src/prover-node.ts +830 -0
- package/src/prover-publisher-factory.ts +48 -0
- package/src/session-manager.ts +593 -0
- package/src/test/index.ts +14 -0
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import type { BatchedBlob } from '@aztec-labs/blob-lib/types';
|
|
2
|
+
import type { CheckpointNumber, EpochNumber } from '@aztec-labs/foundation/branded-types';
|
|
3
|
+
import type { Logger } from '@aztec-labs/foundation/log';
|
|
4
|
+
import { type PromiseWithResolvers } from '@aztec-labs/foundation/promise';
|
|
5
|
+
import type { EpochProverFactory } from '@aztec-labs/prover-client';
|
|
6
|
+
import type { Proof } from '@aztec-labs/stdlib/proofs';
|
|
7
|
+
import type { RootRollupPublicInputs } from '@aztec-labs/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 `subTreeProofs` 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(abortJobs?: boolean): 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9wLXRyZWUtam9iLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvam9iL3RvcC10cmVlLWpvYi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxXQUFXLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM5RCxPQUFPLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxXQUFXLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUMxRixPQUFPLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsS0FBSyxvQkFBb0IsRUFBd0IsTUFBTSxnQ0FBZ0MsQ0FBQztBQUVqRyxPQUFPLEtBQUssRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBT3BFLE9BQU8sS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3ZELE9BQU8sS0FBSyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFeEUsT0FBTyxLQUFLLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUQsT0FBTyxLQUFLLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUUvRCwyQ0FBMkM7QUFDM0MsTUFBTSxNQUFNLFlBQVksR0FBRztJQUN6QixZQUFZLEVBQUUsc0JBQXNCLENBQUM7SUFDckMsS0FBSyxFQUFFLEtBQUssQ0FBQztJQUNiLGlCQUFpQixFQUFFLFdBQVcsQ0FBQztDQUNoQyxDQUFDO0FBRUY7OztHQUdHO0FBQ0gsTUFBTSxNQUFNLGVBQWUsR0FBRztJQUM1Qiw2REFBNkQ7SUFDN0QsV0FBVyxDQUFDLEVBQUUsTUFBTSxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3pDLGlGQUFpRjtJQUNqRixVQUFVLENBQUMsRUFBRSxNQUFNLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUM7SUFDeEM7Ozs7T0FJRztJQUNILGFBQWEsQ0FBQyxFQUFFLENBQUMsWUFBWSxFQUFFLE1BQU0sT0FBTyxDQUFDLFlBQVksQ0FBQyxLQUFLLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQztDQUN0RixDQUFDO0FBRUY7Ozs7O0dBS0c7QUFDSCxxQkFBYSxVQUFVO0lBZ0JuQixPQUFPLENBQUMsUUFBUSxDQUFDLFdBQVc7SUFFNUIsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJO0lBakJ2Qiw0RkFBNEY7SUFDNUYsUUFBUSxDQUFDLE1BQU0sRUFBRSxvQkFBb0IsQ0FBQyxZQUFZLENBQUMsQ0FBMEI7SUFFN0UsMEZBQTBGO0lBQzFGLFFBQVEsQ0FBQyxRQUFRLEVBQUUsU0FBUyxnQkFBZ0IsRUFBRSxDQUFDO0lBRS9DLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFzQjtJQUM5QyxPQUFPLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBbUI7SUFDbEQsT0FBTyxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQW1CO0lBQ2hELE9BQU8sQ0FBQyxTQUFTLENBQVM7SUFDMUIsaUZBQWlGO0lBQ2pGLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBZ0I7SUFDdEMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQWU7SUFFOUMsWUFDbUIsV0FBVyxFQUFFLFdBQVcsRUFDekMsUUFBUSxFQUFFLFNBQVMsZ0JBQWdCLEVBQUUsRUFDcEIsSUFBSSxFQUFFO1FBQ3JCLGFBQWEsRUFBRSxrQkFBa0IsQ0FBQztRQUNsQyxPQUFPLEVBQUUsb0JBQW9CLENBQUM7UUFDOUIsR0FBRyxFQUFFLE1BQU0sQ0FBQztRQUNaLEtBQUssQ0FBQyxFQUFFLGVBQWUsQ0FBQztLQUN6QixFQThCRjtJQUVELDhFQUE0RTtJQUNyRSxRQUFRLElBQUk7UUFBRSxjQUFjLEVBQUUsZ0JBQWdCLENBQUM7UUFBQyxZQUFZLEVBQUUsZ0JBQWdCLENBQUM7UUFBQyxLQUFLLEVBQUUsTUFBTSxDQUFBO0tBQUUsQ0FFckc7SUFFTSxXQUFXLElBQUksT0FBTyxDQUU1QjtJQUVELDJFQUF5RTtJQUNsRSxTQUFTLElBQUksTUFBTSxDQUV6QjtJQUVELDRGQUE0RjtJQUNyRixLQUFLLElBQUksT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUdwQztJQUVEOzs7Ozs7T0FNRztJQUNJLE1BQU0sQ0FBQyxTQUFTLFVBQU8sR0FBRyxJQUFJLENBbUJwQztJQUVELDJGQUEyRjtJQUM5RSxRQUFRLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxDQUlyQztZQUVhLFNBQVM7WUFhVCxHQUFHO0NBdURsQiJ9
|
|
@@ -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,4BAA4B,CAAC;AAC9D,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AAC1F,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,KAAK,oBAAoB,EAAwB,MAAM,gCAAgC,CAAC;AAEjG,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAOpE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AAExE,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,CAAC,SAAS,UAAO,GAAG,IAAI,CAmBpC;IAED,2FAA2F;IAC9E,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAIrC;YAEa,SAAS;YAaT,GAAG;CAuDlB"}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import { promiseWithResolvers } from '@aztec-labs/foundation/promise';
|
|
2
|
+
import { Timer } from '@aztec-labs/foundation/timer';
|
|
3
|
+
import { buildFinalBlobChallenges } from '@aztec-labs/prover-client/helpers';
|
|
4
|
+
import { TopTreeCancelledError } from '@aztec-labs/prover-client/orchestrator';
|
|
5
|
+
/**
|
|
6
|
+
* Self-contained top-tree job. Constructed from a snapshot of `CheckpointProver`s; runs
|
|
7
|
+
* `topTree.prove(...)` against their pending `subTreeProofs` 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(abortJobs = true) {
|
|
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(abortJobs).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(abortJobs) {
|
|
97
|
+
try {
|
|
98
|
+
this.topTree.cancel({
|
|
99
|
+
abortJobs
|
|
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
|
+
subTreeProofs: j.whenSubTreeProofsReady(),
|
|
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
|
+
}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import type { RollupContract } from '@aztec-labs/ethereum/contracts';
|
|
2
|
+
import type { EthAddress } from '@aztec-labs/foundation/eth-address';
|
|
3
|
+
import type { L1PublishProofStats } from '@aztec-labs/stdlib/stats';
|
|
4
|
+
import { type Gauge, type Histogram, type Meter, type TelemetryClient, type Tracer, type UpDownCounter } from '@aztec-labs/telemetry-client';
|
|
5
|
+
import type { CheckpointStore } from './checkpoint-store.js';
|
|
6
|
+
import type { SessionManager } from './session-manager.js';
|
|
7
|
+
export declare class ProverNodeJobMetrics {
|
|
8
|
+
private meter;
|
|
9
|
+
readonly tracer: Tracer;
|
|
10
|
+
private logger;
|
|
11
|
+
provingJobDuration: Histogram;
|
|
12
|
+
provingJobCheckpoints: Gauge;
|
|
13
|
+
provingJobBlocks: Gauge;
|
|
14
|
+
provingJobTransactions: Gauge;
|
|
15
|
+
private blobProcessingDuration;
|
|
16
|
+
private blockProcessingDuration;
|
|
17
|
+
private checkpointProcessingDuration;
|
|
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;
|
|
27
|
+
constructor(meter: Meter, tracer: Tracer, logger?: import("@aztec-labs/foundation/log").Logger);
|
|
28
|
+
recordProvingJob(totalTimeMs: number, numCheckpoints: number, numBlocks: number, numTxs: number): void;
|
|
29
|
+
recordBlobProcessing(durationMs: number): void;
|
|
30
|
+
recordBlockProcessing(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;
|
|
43
|
+
}
|
|
44
|
+
export declare class ProverNodeRewardsMetrics {
|
|
45
|
+
private meter;
|
|
46
|
+
private coinbase;
|
|
47
|
+
private rollup;
|
|
48
|
+
private logger;
|
|
49
|
+
private rewards;
|
|
50
|
+
private accumulatedRewards;
|
|
51
|
+
private prevEpoch;
|
|
52
|
+
private proofSubmissionEpochs;
|
|
53
|
+
constructor(meter: Meter, coinbase: EthAddress, rollup: RollupContract, logger?: import("@aztec-labs/foundation/log").Logger);
|
|
54
|
+
start(): Promise<void>;
|
|
55
|
+
stop(): void;
|
|
56
|
+
private observe;
|
|
57
|
+
}
|
|
58
|
+
export type EstimatedSubmitProofStats = {
|
|
59
|
+
gasLimit: bigint;
|
|
60
|
+
baseFeePerGas: bigint;
|
|
61
|
+
maxPriorityFeePerGas: bigint;
|
|
62
|
+
estimatedTotalFee: bigint;
|
|
63
|
+
};
|
|
64
|
+
export declare class ProverNodePublisherMetrics {
|
|
65
|
+
readonly client: TelemetryClient;
|
|
66
|
+
private logger;
|
|
67
|
+
gasPrice: Histogram;
|
|
68
|
+
txCount: UpDownCounter;
|
|
69
|
+
txDuration: Histogram;
|
|
70
|
+
txGas: Histogram;
|
|
71
|
+
txCalldataSize: Histogram;
|
|
72
|
+
txCalldataGas: Histogram;
|
|
73
|
+
txBlobDataGasUsed: Histogram;
|
|
74
|
+
txBlobDataGasCost: Histogram;
|
|
75
|
+
txTotalFee: Histogram;
|
|
76
|
+
private txGasEstimated;
|
|
77
|
+
private gasPriceEstimated;
|
|
78
|
+
private txTotalFeeEstimated;
|
|
79
|
+
private senderBalance;
|
|
80
|
+
private meter;
|
|
81
|
+
constructor(client: TelemetryClient, name?: string, logger?: import("@aztec-labs/foundation/log").Logger);
|
|
82
|
+
recordFailedTx(): void;
|
|
83
|
+
recordSubmitProof(durationMs: number, stats: L1PublishProofStats): void;
|
|
84
|
+
recordEstimatedSubmitProof(stats: EstimatedSubmitProofStats): void;
|
|
85
|
+
recordSenderBalance(wei: bigint, senderAddress: string): void;
|
|
86
|
+
private recordTx;
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0cmljcy5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL21ldHJpY3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDckUsT0FBTyxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFFckUsT0FBTyxLQUFLLEVBQUUsbUJBQW1CLEVBQWtCLE1BQU0sMEJBQTBCLENBQUM7QUFDcEYsT0FBTyxFQUdMLEtBQUssS0FBSyxFQUNWLEtBQUssU0FBUyxFQUNkLEtBQUssS0FBSyxFQUdWLEtBQUssZUFBZSxFQUNwQixLQUFLLE1BQU0sRUFDWCxLQUFLLGFBQWEsRUFFbkIsTUFBTSw4QkFBOEIsQ0FBQztBQUd0QyxPQUFPLEtBQUssRUFBRSxlQUFlLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM3RCxPQUFPLEtBQUssRUFBRSxjQUFjLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUUzRCxxQkFBYSxvQkFBb0I7SUFxQjdCLE9BQU8sQ0FBQyxLQUFLO2FBQ0csTUFBTSxFQUFFLE1BQU07SUFDOUIsT0FBTyxDQUFDLE1BQU07SUF0QmhCLGtCQUFrQixFQUFFLFNBQVMsQ0FBQztJQUM5QixxQkFBcUIsRUFBRSxLQUFLLENBQUM7SUFDN0IsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDO0lBQ3hCLHNCQUFzQixFQUFFLEtBQUssQ0FBQztJQUU5QixPQUFPLENBQUMsc0JBQXNCLENBQVE7SUFDdEMsT0FBTyxDQUFDLHVCQUF1QixDQUFZO0lBQzNDLE9BQU8sQ0FBQyw0QkFBNEIsQ0FBWTtJQUNoRCxPQUFPLENBQUMseUJBQXlCLENBQVk7SUFDN0MsT0FBTyxDQUFDLGdCQUFnQixDQUFZO0lBQ3BDLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBWTtJQUUxQzs0REFDd0Q7SUFDeEQsT0FBTyxDQUFDLGlCQUFpQixDQUE4QjtJQUN2RCxPQUFPLENBQUMsbUJBQW1C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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../src/metrics.ts"],"names":[],"mappings":"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"}
|
package/dest/metrics.js
ADDED
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
import { createLogger } from '@aztec-labs/foundation/log';
|
|
2
|
+
import { Attributes, Metrics, createUpDownCounterWithDefault } from '@aztec-labs/telemetry-client';
|
|
3
|
+
import { formatEther, formatUnits } from 'viem';
|
|
4
|
+
export class ProverNodeJobMetrics {
|
|
5
|
+
meter;
|
|
6
|
+
tracer;
|
|
7
|
+
logger;
|
|
8
|
+
provingJobDuration;
|
|
9
|
+
provingJobCheckpoints;
|
|
10
|
+
provingJobBlocks;
|
|
11
|
+
provingJobTransactions;
|
|
12
|
+
blobProcessingDuration;
|
|
13
|
+
blockProcessingDuration;
|
|
14
|
+
checkpointProcessingDuration;
|
|
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;
|
|
23
|
+
constructor(meter, tracer, logger = createLogger('prover-node:publisher:metrics')){
|
|
24
|
+
this.meter = meter;
|
|
25
|
+
this.tracer = tracer;
|
|
26
|
+
this.logger = logger;
|
|
27
|
+
this.stateObservedMetrics = [];
|
|
28
|
+
this.provingJobDuration = this.meter.createHistogram(Metrics.PROVER_NODE_JOB_DURATION);
|
|
29
|
+
this.provingJobCheckpoints = this.meter.createGauge(Metrics.PROVER_NODE_JOB_CHECKPOINTS);
|
|
30
|
+
this.provingJobBlocks = this.meter.createGauge(Metrics.PROVER_NODE_JOB_BLOCKS);
|
|
31
|
+
this.provingJobTransactions = this.meter.createGauge(Metrics.PROVER_NODE_JOB_TRANSACTIONS);
|
|
32
|
+
this.blobProcessingDuration = this.meter.createGauge(Metrics.PROVER_NODE_BLOB_PROCESSING_LAST_DURATION);
|
|
33
|
+
this.blockProcessingDuration = this.meter.createHistogram(Metrics.PROVER_NODE_BLOCK_PROCESSING_DURATION);
|
|
34
|
+
this.checkpointProcessingDuration = this.meter.createHistogram(Metrics.PROVER_NODE_CHECKPOINT_PROCESSING_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);
|
|
38
|
+
}
|
|
39
|
+
recordProvingJob(totalTimeMs, numCheckpoints, numBlocks, numTxs) {
|
|
40
|
+
this.provingJobDuration.record(totalTimeMs / 1000);
|
|
41
|
+
this.provingJobCheckpoints.record(Math.floor(numCheckpoints));
|
|
42
|
+
this.provingJobBlocks.record(Math.floor(numBlocks));
|
|
43
|
+
this.provingJobTransactions.record(Math.floor(numTxs));
|
|
44
|
+
}
|
|
45
|
+
recordBlobProcessing(durationMs) {
|
|
46
|
+
this.blobProcessingDuration.record(Math.ceil(durationMs));
|
|
47
|
+
}
|
|
48
|
+
recordBlockProcessing(durationMs) {
|
|
49
|
+
this.blockProcessingDuration.record(Math.ceil(durationMs));
|
|
50
|
+
}
|
|
51
|
+
recordCheckpointProcessing(durationMs, numBlocks, numTxs) {
|
|
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.listAll().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);
|
|
95
|
+
}
|
|
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
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
export class ProverNodeRewardsMetrics {
|
|
107
|
+
meter;
|
|
108
|
+
coinbase;
|
|
109
|
+
rollup;
|
|
110
|
+
logger;
|
|
111
|
+
rewards;
|
|
112
|
+
accumulatedRewards;
|
|
113
|
+
prevEpoch;
|
|
114
|
+
proofSubmissionEpochs;
|
|
115
|
+
constructor(meter, coinbase, rollup, logger = createLogger('prover-node:publisher:metrics')){
|
|
116
|
+
this.meter = meter;
|
|
117
|
+
this.coinbase = coinbase;
|
|
118
|
+
this.rollup = rollup;
|
|
119
|
+
this.logger = logger;
|
|
120
|
+
this.prevEpoch = -1n;
|
|
121
|
+
this.proofSubmissionEpochs = 0;
|
|
122
|
+
this.observe = async (observer)=>{
|
|
123
|
+
const epoch = await this.rollup.getCurrentEpochNumber();
|
|
124
|
+
if (epoch > this.proofSubmissionEpochs) {
|
|
125
|
+
// look at the prev epoch so that we get an accurate value, after proof submission window has closed
|
|
126
|
+
// For example, if proof submission window is 1 epoch, and we are in epoch 2, we should be looking at epoch 0.
|
|
127
|
+
// Similarly, if the proof submission window is 0, and we are in epoch 1, we should be looking at epoch 0.
|
|
128
|
+
const closedEpoch = BigInt(epoch) - BigInt(this.proofSubmissionEpochs) - 1n;
|
|
129
|
+
const rewards = await this.rollup.getSpecificProverRewardsForEpoch(closedEpoch, this.coinbase);
|
|
130
|
+
const fmt = parseFloat(formatUnits(rewards, 18));
|
|
131
|
+
observer.observe(this.rewards, fmt, {
|
|
132
|
+
[Attributes.COINBASE]: this.coinbase.toString()
|
|
133
|
+
});
|
|
134
|
+
// only accumulate once per epoch
|
|
135
|
+
if (closedEpoch > this.prevEpoch) {
|
|
136
|
+
this.prevEpoch = closedEpoch;
|
|
137
|
+
this.accumulatedRewards.add(fmt, {
|
|
138
|
+
[Attributes.COINBASE]: this.coinbase.toString()
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
};
|
|
143
|
+
this.rewards = this.meter.createObservableGauge(Metrics.PROVER_NODE_REWARDS_PER_EPOCH);
|
|
144
|
+
this.accumulatedRewards = createUpDownCounterWithDefault(this.meter, Metrics.PROVER_NODE_REWARDS_TOTAL);
|
|
145
|
+
}
|
|
146
|
+
async start() {
|
|
147
|
+
const proofSubmissionEpochs = await this.rollup.getProofSubmissionEpochs();
|
|
148
|
+
this.proofSubmissionEpochs = Number(proofSubmissionEpochs);
|
|
149
|
+
this.meter.addBatchObservableCallback(this.observe, [
|
|
150
|
+
this.rewards
|
|
151
|
+
]);
|
|
152
|
+
}
|
|
153
|
+
stop() {
|
|
154
|
+
this.meter.removeBatchObservableCallback(this.observe, [
|
|
155
|
+
this.rewards
|
|
156
|
+
]);
|
|
157
|
+
}
|
|
158
|
+
observe;
|
|
159
|
+
}
|
|
160
|
+
export class ProverNodePublisherMetrics {
|
|
161
|
+
client;
|
|
162
|
+
logger;
|
|
163
|
+
gasPrice;
|
|
164
|
+
txCount;
|
|
165
|
+
txDuration;
|
|
166
|
+
txGas;
|
|
167
|
+
txCalldataSize;
|
|
168
|
+
txCalldataGas;
|
|
169
|
+
txBlobDataGasUsed;
|
|
170
|
+
txBlobDataGasCost;
|
|
171
|
+
txTotalFee;
|
|
172
|
+
txGasEstimated;
|
|
173
|
+
gasPriceEstimated;
|
|
174
|
+
txTotalFeeEstimated;
|
|
175
|
+
senderBalance;
|
|
176
|
+
meter;
|
|
177
|
+
constructor(client, name = 'ProverNode', logger = createLogger('prover-node:publisher:metrics')){
|
|
178
|
+
this.client = client;
|
|
179
|
+
this.logger = logger;
|
|
180
|
+
this.meter = client.getMeter(name);
|
|
181
|
+
this.gasPrice = this.meter.createHistogram(Metrics.L1_PUBLISHER_GAS_PRICE);
|
|
182
|
+
this.txCount = createUpDownCounterWithDefault(this.meter, Metrics.L1_PUBLISHER_TX_COUNT, {
|
|
183
|
+
[Attributes.L1_TX_TYPE]: [
|
|
184
|
+
'submitProof'
|
|
185
|
+
],
|
|
186
|
+
[Attributes.OK]: [
|
|
187
|
+
true,
|
|
188
|
+
false
|
|
189
|
+
]
|
|
190
|
+
});
|
|
191
|
+
this.txDuration = this.meter.createHistogram(Metrics.L1_PUBLISHER_TX_DURATION);
|
|
192
|
+
this.txGas = this.meter.createHistogram(Metrics.L1_PUBLISHER_TX_GAS);
|
|
193
|
+
this.txCalldataSize = this.meter.createHistogram(Metrics.L1_PUBLISHER_TX_CALLDATA_SIZE);
|
|
194
|
+
this.txCalldataGas = this.meter.createHistogram(Metrics.L1_PUBLISHER_TX_CALLDATA_GAS);
|
|
195
|
+
this.txBlobDataGasUsed = this.meter.createHistogram(Metrics.L1_PUBLISHER_TX_BLOBDATA_GAS_USED);
|
|
196
|
+
this.txBlobDataGasCost = this.meter.createHistogram(Metrics.L1_PUBLISHER_TX_BLOBDATA_GAS_COST);
|
|
197
|
+
this.txTotalFee = this.meter.createHistogram(Metrics.L1_PUBLISHER_TX_TOTAL_FEE);
|
|
198
|
+
this.txGasEstimated = this.meter.createHistogram(Metrics.PROVER_NODE_ESTIMATED_SUBMISSION_GAS);
|
|
199
|
+
this.gasPriceEstimated = this.meter.createHistogram(Metrics.PROVER_NODE_ESTIMATED_SUBMISSION_GAS_PRICE);
|
|
200
|
+
this.txTotalFeeEstimated = this.meter.createHistogram(Metrics.PROVER_NODE_ESTIMATED_SUBMISSION_TOTAL_FEE);
|
|
201
|
+
this.senderBalance = this.meter.createGauge(Metrics.L1_PUBLISHER_BALANCE);
|
|
202
|
+
}
|
|
203
|
+
recordFailedTx() {
|
|
204
|
+
this.txCount.add(1, {
|
|
205
|
+
[Attributes.L1_TX_TYPE]: 'submitProof',
|
|
206
|
+
[Attributes.OK]: false
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
recordSubmitProof(durationMs, stats) {
|
|
210
|
+
this.recordTx(durationMs, stats);
|
|
211
|
+
}
|
|
212
|
+
recordEstimatedSubmitProof(stats) {
|
|
213
|
+
const attributes = {
|
|
214
|
+
[Attributes.L1_TX_TYPE]: 'submitProof'
|
|
215
|
+
};
|
|
216
|
+
this.txGasEstimated.record(Number(stats.gasLimit), attributes);
|
|
217
|
+
try {
|
|
218
|
+
this.gasPriceEstimated.record(parseInt(formatEther(stats.baseFeePerGas + stats.maxPriorityFeePerGas, 'gwei'), 10));
|
|
219
|
+
} catch {
|
|
220
|
+
// ignore
|
|
221
|
+
}
|
|
222
|
+
try {
|
|
223
|
+
this.txTotalFeeEstimated.record(parseFloat(formatEther(stats.estimatedTotalFee)));
|
|
224
|
+
} catch {
|
|
225
|
+
// ignore
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
recordSenderBalance(wei, senderAddress) {
|
|
229
|
+
const eth = parseFloat(formatEther(wei, 'wei'));
|
|
230
|
+
this.senderBalance.record(eth, {
|
|
231
|
+
[Attributes.SENDER_ADDRESS]: senderAddress
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
recordTx(durationMs, stats) {
|
|
235
|
+
const attributes = {
|
|
236
|
+
[Attributes.L1_TX_TYPE]: 'submitProof',
|
|
237
|
+
[Attributes.L1_SENDER]: stats.sender
|
|
238
|
+
};
|
|
239
|
+
this.txCount.add(1, {
|
|
240
|
+
...attributes,
|
|
241
|
+
[Attributes.OK]: true
|
|
242
|
+
});
|
|
243
|
+
this.txDuration.record(Math.ceil(durationMs), attributes);
|
|
244
|
+
this.txGas.record(// safe to downcast - total block limit is 30M gas which fits in a JS number
|
|
245
|
+
Number(stats.gasUsed), attributes);
|
|
246
|
+
this.txCalldataGas.record(stats.calldataGas, attributes);
|
|
247
|
+
this.txCalldataSize.record(stats.calldataSize, attributes);
|
|
248
|
+
this.txBlobDataGasCost.record(Number(stats.blobDataGas), attributes);
|
|
249
|
+
this.txBlobDataGasUsed.record(Number(stats.blobGasUsed), attributes);
|
|
250
|
+
try {
|
|
251
|
+
this.gasPrice.record(parseInt(formatEther(stats.gasPrice, 'gwei'), 10));
|
|
252
|
+
} catch {
|
|
253
|
+
// ignore
|
|
254
|
+
}
|
|
255
|
+
const executionFee = stats.gasUsed * stats.gasPrice;
|
|
256
|
+
const blobFee = stats.blobGasUsed * stats.blobDataGas;
|
|
257
|
+
const totalFee = executionFee + blobFee;
|
|
258
|
+
try {
|
|
259
|
+
this.txTotalFee.record(parseFloat(formatEther(totalFee)));
|
|
260
|
+
} catch {
|
|
261
|
+
// ignore
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { EpochNumber } from '@aztec-labs/foundation/branded-types';
|
|
2
|
+
import type { L2BlockSource } from '@aztec-labs/stdlib/block';
|
|
3
|
+
import { type L1RollupConstants } from '@aztec-labs/stdlib/epoch-helpers';
|
|
4
|
+
import { type TelemetryClient, type Traceable, type Tracer } from '@aztec-labs/telemetry-client';
|
|
5
|
+
export interface EpochMonitorHandler {
|
|
6
|
+
handleEpochReadyToProve(epochNumber: EpochNumber): Promise<boolean>;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Fires an event when a new epoch ready to prove is detected.
|
|
10
|
+
*
|
|
11
|
+
* We define an epoch as ready to prove when:
|
|
12
|
+
* - The epoch is complete
|
|
13
|
+
* - Its blocks have not been reorg'd out due to a missing L2 proof
|
|
14
|
+
* - Its first block is the immediate successor of the last proven block
|
|
15
|
+
*
|
|
16
|
+
* This class periodically hits the L2BlockSource.
|
|
17
|
+
* On start it will trigger the event for the last epoch ready to prove.
|
|
18
|
+
*/
|
|
19
|
+
export declare class EpochMonitor implements Traceable {
|
|
20
|
+
private readonly l2BlockSource;
|
|
21
|
+
private readonly l1Constants;
|
|
22
|
+
private options;
|
|
23
|
+
private runningPromise;
|
|
24
|
+
private log;
|
|
25
|
+
readonly tracer: Tracer;
|
|
26
|
+
private handler;
|
|
27
|
+
private latestEpochNumber;
|
|
28
|
+
constructor(l2BlockSource: L2BlockSource, l1Constants: Pick<L1RollupConstants, 'epochDuration'>, options: {
|
|
29
|
+
pollingIntervalMs: number;
|
|
30
|
+
provingDelayMs?: number;
|
|
31
|
+
}, telemetry?: TelemetryClient);
|
|
32
|
+
static create(l2BlockSource: L2BlockSource, options: {
|
|
33
|
+
pollingIntervalMs: number;
|
|
34
|
+
provingDelayMs?: number;
|
|
35
|
+
}, telemetry?: TelemetryClient): Promise<EpochMonitor>;
|
|
36
|
+
start(handler: EpochMonitorHandler): void;
|
|
37
|
+
/** Exposed for testing */
|
|
38
|
+
setHandler(handler: EpochMonitorHandler): void;
|
|
39
|
+
stop(): Promise<void>;
|
|
40
|
+
work(): Promise<void>;
|
|
41
|
+
private getEpochNumberToProve;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXBvY2gtbW9uaXRvci5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21vbml0b3JzL2Vwb2NoLW1vbml0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFlLFdBQVcsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBSWhGLE9BQU8sS0FBSyxFQUFFLGFBQWEsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzlELE9BQU8sRUFBRSxLQUFLLGlCQUFpQixFQUFrQixNQUFNLGtDQUFrQyxDQUFDO0FBQzFGLE9BQU8sRUFBRSxLQUFLLGVBQWUsRUFBRSxLQUFLLFNBQVMsRUFBRSxLQUFLLE1BQU0sRUFBc0IsTUFBTSw4QkFBOEIsQ0FBQztBQUVySCxNQUFNLFdBQVcsbUJBQW1CO0lBQ2xDLHVCQUF1QixDQUFDLFdBQVcsRUFBRSxXQUFXLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0NBQ3JFO0FBRUQ7Ozs7Ozs7Ozs7R0FVRztBQUNILHFCQUFhLFlBQWEsWUFBVyxTQUFTO0lBUzFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsYUFBYTtJQUM5QixPQUFPLENBQUMsUUFBUSxDQUFDLFdBQVc7SUFDNUIsT0FBTyxDQUFDLE9BQU87SUFWakIsT0FBTyxDQUFDLGNBQWMsQ0FBaUI7SUFDdkMsT0FBTyxDQUFDLEdBQUcsQ0FBNkM7SUFDeEQsU0FBZ0IsTUFBTSxFQUFFLE1BQU0sQ0FBQztJQUUvQixPQUFPLENBQUMsT0FBTyxDQUFrQztJQUNqRCxPQUFPLENBQUMsaUJBQWlCLENBQTBCO0lBRW5ELFlBQ21CLGFBQWEsRUFBRSxhQUFhLEVBQzVCLFdBQVcsRUFBRSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsZUFBZSxDQUFDLEVBQzlELE9BQU8sRUFBRTtRQUFFLGlCQUFpQixFQUFFLE1BQU0sQ0FBQztRQUFDLGNBQWMsQ0FBQyxFQUFFLE1BQU0sQ0FBQTtLQUFFLEVBQ3ZFLFNBQVMsR0FBRSxlQUFzQyxFQU9sRDtJQUVELE9BQW9CLE1BQU0sQ0FDeEIsYUFBYSxFQUFFLGFBQWEsRUFDNUIsT0FBTyxFQUFFO1FBQUUsaUJBQWlCLEVBQUUsTUFBTSxDQUFDO1FBQUMsY0FBYyxDQUFDLEVBQUUsTUFBTSxDQUFBO0tBQUUsRUFDL0QsU0FBUyxHQUFFLGVBQXNDLEdBQ2hELE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FHdkI7SUFFTSxLQUFLLENBQUMsT0FBTyxFQUFFLG1CQUFtQixRQUl4QztJQUVELDBCQUEwQjtJQUNuQixVQUFVLENBQUMsT0FBTyxFQUFFLG1CQUFtQixRQUU3QztJQUVZLElBQUksa0JBR2hCO0lBRVksSUFBSSxrQkEwQmhCO1lBRWEscUJBQXFCO0NBWXBDIn0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"epoch-monitor.d.ts","sourceRoot":"","sources":["../../src/monitors/epoch-monitor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,WAAW,EAAE,MAAM,sCAAsC,CAAC;AAIhF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,KAAK,iBAAiB,EAAkB,MAAM,kCAAkC,CAAC;AAC1F,OAAO,EAAE,KAAK,eAAe,EAAE,KAAK,SAAS,EAAE,KAAK,MAAM,EAAsB,MAAM,8BAA8B,CAAC;AAErH,MAAM,WAAW,mBAAmB;IAClC,uBAAuB,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACrE;AAED;;;;;;;;;;GAUG;AACH,qBAAa,YAAa,YAAW,SAAS;IAS1C,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,OAAO;IAVjB,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,GAAG,CAA6C;IACxD,SAAgB,MAAM,EAAE,MAAM,CAAC;IAE/B,OAAO,CAAC,OAAO,CAAkC;IACjD,OAAO,CAAC,iBAAiB,CAA0B;IAEnD,YACmB,aAAa,EAAE,aAAa,EAC5B,WAAW,EAAE,IAAI,CAAC,iBAAiB,EAAE,eAAe,CAAC,EAC9D,OAAO,EAAE;QAAE,iBAAiB,EAAE,MAAM,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,CAAA;KAAE,EACvE,SAAS,GAAE,eAAsC,EAOlD;IAED,OAAoB,MAAM,CACxB,aAAa,EAAE,aAAa,EAC5B,OAAO,EAAE;QAAE,iBAAiB,EAAE,MAAM,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,CAAA;KAAE,EAC/D,SAAS,GAAE,eAAsC,GAChD,OAAO,CAAC,YAAY,CAAC,CAGvB;IAEM,KAAK,CAAC,OAAO,EAAE,mBAAmB,QAIxC;IAED,0BAA0B;IACnB,UAAU,CAAC,OAAO,EAAE,mBAAmB,QAE7C;IAEY,IAAI,kBAGhB;IAEY,IAAI,kBA0BhB;YAEa,qBAAqB;CAYpC"}
|