@aztec/prover-node 5.0.0-rc.1 → 5.0.0-rc.2

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.
@@ -1,6 +1,5 @@
1
1
  import { getEthBlobEvaluationInputs } from '@aztec/blob-lib';
2
2
  import { MAX_CHECKPOINTS_PER_EPOCH } from '@aztec/constants';
3
- import { makeTuple } from '@aztec/foundation/array';
4
3
  import { CheckpointNumber } from '@aztec/foundation/branded-types';
5
4
  import { areArraysEqual } from '@aztec/foundation/collection';
6
5
  import { Fr } from '@aztec/foundation/curves/bn254';
@@ -218,7 +217,7 @@ export class ProverNodePublisher {
218
217
  outHash: args.publicInputs.outHash.toString(),
219
218
  proverId: EthAddress.fromField(args.publicInputs.constants.proverId).toString()
220
219
  } /*_args*/ ,
221
- makeTuple(MAX_CHECKPOINTS_PER_EPOCH * 2, (i)=>i % 2 === 0 ? args.publicInputs.fees[i / 2].recipient.toField().toString() : args.publicInputs.fees[(i - 1) / 2].value.toString()),
220
+ args.headers.map((header)=>header.toViem()),
222
221
  getEthBlobEvaluationInputs(args.batchedBlobInputs)
223
222
  ];
224
223
  }
@@ -230,7 +229,7 @@ export class ProverNodePublisher {
230
229
  start: argsArray[0],
231
230
  end: argsArray[1],
232
231
  args: argsArray[2],
233
- fees: argsArray[3],
232
+ headers: argsArray[3],
234
233
  attestations: CommitteeAttestationsAndSigners.packAttestations(args.attestations.map((a)=>CommitteeAttestation.fromViem(a))),
235
234
  blobInputs: argsArray[4],
236
235
  proof: proofHex
@@ -1,6 +1,6 @@
1
1
  import type { RollupContract } from '@aztec/ethereum/contracts';
2
2
  import type { Delayer } from '@aztec/ethereum/l1-tx-utils';
3
- import { BlockNumber, EpochNumber } from '@aztec/foundation/branded-types';
3
+ import { BlockNumber, CheckpointNumber, EpochNumber } from '@aztec/foundation/branded-types';
4
4
  import { DateProvider } from '@aztec/foundation/timer';
5
5
  import type { EpochProverFactory } from '@aztec/prover-client';
6
6
  import { ChonkCache } from '@aztec/prover-client/orchestrator';
@@ -8,7 +8,7 @@ import { type L2BlockSource, type L2BlockStreamEvent, type L2BlockStreamEventHan
8
8
  import type { ChainConfig } from '@aztec/stdlib/config';
9
9
  import type { ContractDataSource } from '@aztec/stdlib/contract';
10
10
  import { type L1RollupConstants } from '@aztec/stdlib/epoch-helpers';
11
- import { type EpochProverManager, type EpochProvingJobState, EpochProvingJobTerminalState, type ITxProvider, type ProverNodeApi, type Service, type WorldStateSyncStatus, type WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server';
11
+ import { type EpochProverManager, type EpochProvingJobState, EpochProvingJobTerminalState, type ITxProvider, type ProverNodeApi, type Service, type WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server';
12
12
  import type { DataStoreConfig } from '@aztec/stdlib/kv-store';
13
13
  import type { L1ToL2MessageSource } from '@aztec/stdlib/messaging';
14
14
  import { L1Metrics, type TelemetryClient, type Traceable, type Tracer } from '@aztec/telemetry-client';
@@ -63,6 +63,15 @@ export declare class ProverNode implements L2BlockStreamEventHandler, ProverNode
63
63
  * submission deadline. Protected so tests can verify the start() seeding.
64
64
  */
65
65
  protected lastExpiredEpoch: EpochNumber | undefined;
66
+ /**
67
+ * Highest checkpoint number whose proving-side handling has completed (or that was legitimately skipped).
68
+ * The catch-up loop walks from here to each `chain-checkpointed` tip event. Seeded at start() from the last
69
+ * checkpoint of the last fully-proven epoch (or 0), so a restart reprocesses the partially-proven epoch rather
70
+ * than trusting a checkpointed tip that may sit ahead of unproven checkpoints. Clamped down on a prune.
71
+ */
72
+ protected lastProcessedCheckpoint: CheckpointNumber;
73
+ /** Periodic tick that runs the epoch-expiry sweep during idle periods when no block-stream events arrive. */
74
+ private expiryTicker;
66
75
  readonly tracer: Tracer;
67
76
  protected publishingService: ProofPublishingService | undefined;
68
77
  constructor(prover: EpochProverManager & EpochProverFactory, publisherFactory: ProverPublisherFactory, l2BlockSource: L2BlockSource & Partial<Service>, l1ToL2MessageSource: L1ToL2MessageSource, contractDataSource: ContractDataSource, worldState: WorldStateSynchronizer, p2pClient: {
@@ -86,14 +95,11 @@ export declare class ProverNode implements L2BlockStreamEventHandler, ProverNode
86
95
  getChonkCache(): ChonkCache;
87
96
  /** Tests inspect this when looking up live sessions. */
88
97
  getSessionManager(): SessionManager;
89
- /** Returns world state status. */
90
- getWorldStateSyncStatus(): Promise<WorldStateSyncStatus>;
91
- /** Returns archiver status. */
92
- getL2Tips(): Promise<import("@aztec/stdlib/block").L2Tips>;
93
98
  /** Returns the underlying prover instance. */
94
99
  getProver(): EpochProverManager & EpochProverFactory;
95
100
  handleBlockStreamEvent(event: L2BlockStreamEvent): Promise<void>;
96
- private handleCheckpointEvent;
101
+ private processCheckpointJump;
102
+ private registerCheckpoint;
97
103
  private collectRegisterData;
98
104
  private handlePruneEvent;
99
105
  private isEpochPastProofSubmissionWindow;
@@ -128,18 +134,22 @@ export declare class ProverNode implements L2BlockStreamEventHandler, ProverNode
128
134
  /** Protected for direct unit-test access. */
129
135
  protected isProvenBlockLastOfItsEpoch(provenBlockNumber: BlockNumber, provenEpoch: EpochNumber, l1Constants: Pick<L1RollupConstants, 'epochDuration'>): Promise<boolean>;
130
136
  /**
131
- * Resolves the L2BlockStream's starting block and the last fully-proven epoch in one
132
- * pass. The starting block is the first block of the next unproven epoch (or the start
133
- * of the partially-proven epoch if the proven tip falls mid-epoch). The fully-proven
134
- * epoch is `provenEpoch` when the proven tip is the last block of its epoch, otherwise
135
- * `provenEpoch - 1`, or `undefined` if no block is proven yet.
137
+ * Resolves the last fully-proven epoch from L1 proven state, used to seed the catch-up cursor (via
138
+ * `computeStartingCheckpoint`) and `lastExpiredEpoch`. The fully-proven epoch is `provenEpoch` when the
139
+ * proven tip is the last block of its epoch, otherwise `provenEpoch - 1`, or `undefined` if no block is
140
+ * proven yet (so a restart reprocesses the partially-proven epoch rather than trusting a stale tip).
136
141
  */
137
- protected computeStartupState(): Promise<{
138
- startingBlock: BlockNumber;
142
+ protected resolveLastFullyProvenEpoch(): Promise<{
139
143
  lastFullyProvenEpoch: EpochNumber | undefined;
140
144
  }>;
145
+ /**
146
+ * Resolves the catch-up cursor seed: the last checkpoint of the last fully-proven epoch, or 0 if none. Seeding
147
+ * from a checkpoint (rather than a checkpointed tip) guarantees a restart reprocesses every checkpoint of the
148
+ * partially-proven epoch, since the checkpointed tip can sit ahead of the last fully-proven checkpoint.
149
+ */
150
+ protected computeStartingCheckpoint(lastFullyProvenEpoch: EpochNumber | undefined): Promise<CheckpointNumber>;
141
151
  private gatherPreviousBlockHeader;
142
152
  private validateConfig;
143
153
  }
144
154
  export { EpochProvingJobTerminalState };
145
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmVyLW5vZGUuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9wcm92ZXItbm9kZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEtBQUssRUFBRSxjQUFjLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNoRSxPQUFPLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsV0FBVyxFQUFvQixXQUFXLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUk3RixPQUFPLEVBQUUsWUFBWSxFQUFrQixNQUFNLHlCQUF5QixDQUFDO0FBQ3ZFLE9BQU8sS0FBSyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFL0QsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBRS9ELE9BQU8sRUFDTCxLQUFLLGFBQWEsRUFFbEIsS0FBSyxrQkFBa0IsRUFDdkIsS0FBSyx5QkFBeUIsRUFFL0IsTUFBTSxxQkFBcUIsQ0FBQztBQUU3QixPQUFPLEtBQUssRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN4RCxPQUFPLEtBQUssRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxLQUFLLGlCQUFpQixFQUFtRCxNQUFNLDZCQUE2QixDQUFDO0FBQ3RILE9BQU8sRUFDTCxLQUFLLGtCQUFrQixFQUN2QixLQUFLLG9CQUFvQixFQUN6Qiw0QkFBNEIsRUFDNUIsS0FBSyxXQUFXLEVBQ2hCLEtBQUssYUFBYSxFQUNsQixLQUFLLE9BQU8sRUFDWixLQUFLLG9CQUFvQixFQUN6QixLQUFLLHNCQUFzQixFQUU1QixNQUFNLGlDQUFpQyxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxFQUFFLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzlELE9BQU8sS0FBSyxFQUFFLG1CQUFtQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFF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
155
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmVyLW5vZGUuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9wcm92ZXItbm9kZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEtBQUssRUFBRSxjQUFjLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNoRSxPQUFPLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsV0FBVyxFQUFFLGdCQUFnQixFQUFFLFdBQVcsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBSzdGLE9BQU8sRUFBRSxZQUFZLEVBQWtCLE1BQU0seUJBQXlCLENBQUM7QUFDdkUsT0FBTyxLQUFLLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUUvRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFFL0QsT0FBTyxFQUVMLEtBQUssYUFBYSxFQUVsQixLQUFLLGtCQUFrQixFQUN2QixLQUFLLHlCQUF5QixFQUUvQixNQUFNLHFCQUFxQixDQUFDO0FBRTdCLE9BQU8sS0FBSyxFQUFFLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3hELE9BQU8sS0FBSyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDakUsT0FBTyxFQUFFLEtBQUssaUJBQWlCLEVBQW1ELE1BQU0sNkJBQTZCLENBQUM7QUFDdEgsT0FBTyxFQUNMLEtBQUssa0JBQWtCLEVBQ3ZCLEtBQUssb0JBQW9CLEVBQ3pCLDRCQUE0QixFQUM1QixLQUFLLFdBQVcsRUFDaEIsS0FBSyxhQUFhLEVBQ2xCLEtBQUssT0FBTyxFQUNaLEtBQUssc0JBQXNCLEVBRTVCLE1BQU0saUNBQWlDLENBQUM7QUFDekMsT0FBTyxLQUFLLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDOUQsT0FBTyxLQUFLLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUVuRSxPQUFPLEVBQ0wsU0FBUyxFQUNULEtBQUssZUFBZSxFQUNwQixLQUFLLFNBQVMsRUFDZCxLQUFLLE1BQU0sRUFFWixNQUFNLHlCQUF5QixDQUFDO0FBR2pDLE9BQU8sRUFBRSxlQUFlLEVBQStCLE1BQU0sdUJBQXVCLENBQUM7QUFDckYsT0FBTyxLQUFLLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDNUQsT0FBTyxLQUFLLEVBQUUsWUFBWSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFOUUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDdkUsT0FBTyxLQUFLLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUM1RSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFdEQsS0FBSyxpQkFBaUIsR0FBRyx3QkFBd0IsR0FBRyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztBQUM5RSxLQUFLLGdCQUFnQixHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsZUFBZSxDQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxXQUFXLEdBQUcsZUFBZSxDQUFDLENBQUM7QUFTbEg7Ozs7Ozs7OztHQVNHO0FBQ0gscUJBQWEsVUFBVyxZQUFXLHlCQUF5QixFQUFFLGFBQWEsRUFBRSxTQUFTO0lBdUNsRixTQUFTLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxrQkFBa0IsR0FBRyxrQkFBa0I7SUFDbEUsU0FBUyxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRSxzQkFBc0I7SUFDM0QsU0FBUyxDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQUUsYUFBYSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUM7SUFDbEUsU0FBUyxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsRUFBRSxtQkFBbUI7SUFDM0QsU0FBUyxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsRUFBRSxrQkFBa0I7SUFDekQsU0FBUyxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsc0JBQXNCO0lBQ3JELFNBQVMsQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFO1FBQUUsYUFBYSxJQUFJLFdBQVcsQ0FBQTtLQUFFLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQztJQUNqRixTQUFTLENBQUMsUUFBUSxDQUFDLGNBQWMsRUFBRSxjQUFjO0lBQ2pELFNBQVMsQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLFNBQVM7SUFFdkMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxlQUFlLEVBQUUsZUFBZTtJQUNuRCxPQUFPLENBQUMsT0FBTyxDQUFDO0lBQ2hCLE9BQU8sQ0FBQyxRQUFRLENBQUMsWUFBWTtJQWxEL0IsT0FBTyxDQUFDLEdBQUcsQ0FBK0I7SUFFMUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxlQUFlLEVBQUUsZUFBZSxDQUFDO0lBQ3BELFNBQVMsQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQztJQUMxQyxTQUFTLENBQUMsY0FBYyxFQUFFLGNBQWMsR0FBRyxTQUFTLENBQUM7SUFFckQsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQW9CO0lBQzNDLE9BQU8sQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUF1QjtJQUNsRCxPQUFPLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBMkI7SUFFMUQsbUVBQW1FO0lBQ25FLE9BQU8sQ0FBQyxTQUFTLENBQW9CO0lBQ3JDLHVEQUF1RDtJQUN2RCxPQUFPLENBQUMsV0FBVyxDQUE0QjtJQUMvQzs7Ozs7T0FLRztJQUNILFNBQVMsQ0FBQyxnQkFBZ0IsRUFBRSxXQUFXLEdBQUcsU0FBUyxDQUFDO0lBRXBEOzs7OztPQUtHO0lBQ0gsU0FBUyxDQUFDLHVCQUF1QixFQUFFLGdCQUFnQixDQUF5QjtJQUU1RSw2R0FBNkc7SUFDN0csT0FBTyxDQUFDLFlBQVksQ0FBNkI7SUFFakQsU0FBZ0IsTUFBTSxFQUFFLE1BQU0sQ0FBQztJQUUvQixTQUFTLENBQUMsaUJBQWlCLEVBQUUsc0JBQXNCLEdBQUcsU0FBUyxDQUFDO0lBRWhFLFlBQ3FCLE1BQU0sRUFBRSxrQkFBa0IsR0FBRyxrQkFBa0IsRUFDL0MsZ0JBQWdCLEVBQUUsc0JBQXNCLEVBQ3hDLGFBQWEsRUFBRSxhQUFhLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUMvQyxtQkFBbUIsRUFBRSxtQkFBbUIsRUFDeEMsa0JBQWtCLEVBQUUsa0JBQWtCLEVBQ3RDLFVBQVUsRUFBRSxzQkFBc0IsRUFDbEMsU0FBUyxFQUFFO1FBQUUsYUFBYSxJQUFJLFdBQVcsQ0FBQTtLQUFFLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUM5RCxjQUFjLEVBQUUsY0FBYyxFQUM5QixTQUFTLEVBQUUsU0FBUyxFQUN2QyxNQUFNLEdBQUUsT0FBTyxDQUFDLGlCQUFpQixDQUFNLEVBQ3BCLGVBQWUsR0FBRSxlQUFzQyxFQUNsRSxPQUFPLENBQUMscUJBQVMsRUFDUixZQUFZLEdBQUUsWUFBaUMsRUFnRGpFO0lBRU0sV0FBVyx1REFFakI7SUFFTSxNQUFNOzt5QkFFWjtJQUVELHVEQUF1RDtJQUNoRCxVQUFVLElBQUksT0FBTyxHQUFHLFNBQVMsQ0FFdkM7SUFFRCxtREFBbUQ7SUFDNUMsT0FBTyxJQUFJLE9BQU8sQ0FBQztRQUFFLElBQUksRUFBRSxNQUFNLENBQUM7UUFBQyxNQUFNLEVBQUUsb0JBQW9CLENBQUM7UUFBQyxXQUFXLEVBQUUsV0FBVyxDQUFBO0tBQUUsRUFBRSxDQUFDLENBRXBHO0lBRUQsOERBQThEO0lBQ3ZELGtCQUFrQixJQUFJLGVBQWUsQ0FFM0M7SUFFRCxrRUFBa0U7SUFDM0QsYUFBYSxJQUFJLFVBQVUsQ0FFakM7SUFFRCx3REFBd0Q7SUFDakQsaUJBQWlCLElBQUksY0FBYyxDQUt6QztJQUVELDhDQUE4QztJQUN2QyxTQUFTLDRDQUVmO0lBSVksc0JBQXNCLENBQUMsS0FBSyxFQUFFLGtCQUFrQixHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0E2QjVFO1lBYWEscUJBQXFCO1lBb0RyQixrQkFBa0I7WUE2QmxCLG1CQUFtQjtZQTZCbkIsZ0JBQWdCO1lBZ0RoQixnQ0FBZ0M7WUFtQmhDLGdCQUFnQjtZQTBCaEIsV0FBVztJQWN6Qjs7T0FFRztJQUNVLFVBQVUsQ0FBQyxXQUFXLEVBQUUsV0FBVyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FLakU7SUFJSyxLQUFLLGtCQXdDVjtJQUVLLElBQUksa0JBMkJUO0lBRUQ7Ozs7T0FJRztJQUNILFNBQVMsQ0FBQyxvQkFBb0IsQ0FBQyxpQkFBaUIsRUFBRSxzQkFBc0IsR0FBRyxjQUFjLENBbUJ4RjtJQUVEOzs7O09BSUc7SUFDSSxlQUFlLENBQUMsS0FBSyxFQUFFLGlCQUFpQixHQUFHLElBQUksQ0FLckQ7SUFFRCw4R0FBOEc7SUFDakcsdUJBQXVCLENBQUMsT0FBTyxFQUFFLFlBQVksR0FBRyxPQUFPLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQyxDQWN2RjtJQUtELE9BQU8sQ0FBQyxjQUFjO0lBSXRCOzs7T0FHRztJQUNILFVBQWdCLGtCQUFrQixDQUNoQyxXQUFXLEVBQUUsV0FBVyxFQUN4QixXQUFXLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixFQUFFLGVBQWUsQ0FBQyxHQUNwRCxPQUFPLENBQUMsT0FBTyxDQUFDLENBaUJsQjtJQUVELDZDQUE2QztJQUM3QyxVQUFnQiwyQkFBMkIsQ0FDekMsaUJBQWlCLEVBQUUsV0FBVyxFQUM5QixXQUFXLEVBQUUsV0FBVyxFQUN4QixXQUFXLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixFQUFFLGVBQWUsQ0FBQyxHQUNwRCxPQUFPLENBQUMsT0FBTyxDQUFDLENBTWxCO0lBRUQ7Ozs7O09BS0c7SUFDSCxVQUFnQiwyQkFBMkIsSUFBSSxPQUFPLENBQUM7UUFBRSxvQkFBb0IsRUFBRSxXQUFXLEdBQUcsU0FBUyxDQUFBO0tBQUUsQ0FBQyxDQWdCeEc7SUFFRDs7OztPQUlHO0lBQ0gsVUFBZ0IseUJBQXlCLENBQUMsb0JBQW9CLEVBQUUsV0FBVyxHQUFHLFNBQVMsR0FBRyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FNbEg7WUFFYSx5QkFBeUI7SUFRdkMsT0FBTyxDQUFDLGNBQWM7Q0FjdkI7QUFHRCxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsQ0FBQyJ9
@@ -1 +1 @@
1
- {"version":3,"file":"prover-node.d.ts","sourceRoot":"","sources":["../src/prover-node.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAoB,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAI7F,OAAO,EAAE,YAAY,EAAkB,MAAM,yBAAyB,CAAC;AACvE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE/D,OAAO,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAC;AAE/D,OAAO,EACL,KAAK,aAAa,EAElB,KAAK,kBAAkB,EACvB,KAAK,yBAAyB,EAE/B,MAAM,qBAAqB,CAAC;AAE7B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,KAAK,iBAAiB,EAAmD,MAAM,6BAA6B,CAAC;AACtH,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EACzB,4BAA4B,EAC5B,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,OAAO,EACZ,KAAK,oBAAoB,EACzB,KAAK,sBAAsB,EAE5B,MAAM,iCAAiC,CAAC;AACzC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAEnE,OAAO,EACL,SAAS,EACT,KAAK,eAAe,EACpB,KAAK,SAAS,EACd,KAAK,MAAM,EAEZ,MAAM,yBAAyB,CAAC;AAGjC,OAAO,EAAE,eAAe,EAA+B,MAAM,uBAAuB,CAAC;AACrF,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAE9E,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAC5E,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,KAAK,iBAAiB,GAAG,wBAAwB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;AAC9E,KAAK,gBAAgB,GAAG,IAAI,CAAC,eAAe,EAAE,eAAe,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,WAAW,GAAG,eAAe,CAAC,CAAC;AASlH;;;;;;;;;GASG;AACH,qBAAa,UAAW,YAAW,yBAAyB,EAAE,aAAa,EAAE,SAAS;IA4BlF,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,kBAAkB,GAAG,kBAAkB;IAClE,SAAS,CAAC,QAAQ,CAAC,gBAAgB,EAAE,sBAAsB;IAC3D,SAAS,CAAC,QAAQ,CAAC,aAAa,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC;IAClE,SAAS,CAAC,QAAQ,CAAC,mBAAmB,EAAE,mBAAmB;IAC3D,SAAS,CAAC,QAAQ,CAAC,kBAAkB,EAAE,kBAAkB;IACzD,SAAS,CAAC,QAAQ,CAAC,UAAU,EAAE,sBAAsB;IACrD,SAAS,CAAC,QAAQ,CAAC,SAAS,EAAE;QAAE,aAAa,IAAI,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC;IACjF,SAAS,CAAC,QAAQ,CAAC,cAAc,EAAE,cAAc;IACjD,SAAS,CAAC,QAAQ,CAAC,SAAS,EAAE,SAAS;IAEvC,SAAS,CAAC,QAAQ,CAAC,eAAe,EAAE,eAAe;IACnD,OAAO,CAAC,OAAO,CAAC;IAChB,OAAO,CAAC,QAAQ,CAAC,YAAY;IAvC/B,OAAO,CAAC,GAAG,CAA+B;IAE1C,SAAS,CAAC,QAAQ,CAAC,eAAe,EAAE,eAAe,CAAC;IACpD,SAAS,CAAC,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAC1C,SAAS,CAAC,cAAc,EAAE,cAAc,GAAG,SAAS,CAAC;IAErD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoB;IAC3C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAuB;IAClD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA2B;IAE1D,mEAAmE;IACnE,OAAO,CAAC,SAAS,CAAoB;IACrC,uDAAuD;IACvD,OAAO,CAAC,WAAW,CAA4B;IAC/C;;;;;OAKG;IACH,SAAS,CAAC,gBAAgB,EAAE,WAAW,GAAG,SAAS,CAAC;IAEpD,SAAgB,MAAM,EAAE,MAAM,CAAC;IAE/B,SAAS,CAAC,iBAAiB,EAAE,sBAAsB,GAAG,SAAS,CAAC;IAEhE,YACqB,MAAM,EAAE,kBAAkB,GAAG,kBAAkB,EAC/C,gBAAgB,EAAE,sBAAsB,EACxC,aAAa,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,EAC/C,mBAAmB,EAAE,mBAAmB,EACxC,kBAAkB,EAAE,kBAAkB,EACtC,UAAU,EAAE,sBAAsB,EAClC,SAAS,EAAE;QAAE,aAAa,IAAI,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC,EAC9D,cAAc,EAAE,cAAc,EAC9B,SAAS,EAAE,SAAS,EACvC,MAAM,GAAE,OAAO,CAAC,iBAAiB,CAAM,EACpB,eAAe,GAAE,eAAsC,EAClE,OAAO,CAAC,qBAAS,EACR,YAAY,GAAE,YAAiC,EAgDjE;IAEM,WAAW,uDAEjB;IAEM,MAAM;;yBAEZ;IAED,uDAAuD;IAChD,UAAU,IAAI,OAAO,GAAG,SAAS,CAEvC;IAED,mDAAmD;IAC5C,OAAO,IAAI,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,oBAAoB,CAAC;QAAC,WAAW,EAAE,WAAW,CAAA;KAAE,EAAE,CAAC,CAEpG;IAED,8DAA8D;IACvD,kBAAkB,IAAI,eAAe,CAE3C;IAED,kEAAkE;IAC3D,aAAa,IAAI,UAAU,CAEjC;IAED,wDAAwD;IACjD,iBAAiB,IAAI,cAAc,CAKzC;IAED,kCAAkC;IACrB,uBAAuB,IAAI,OAAO,CAAC,oBAAoB,CAAC,CAGpE;IAED,+BAA+B;IACxB,SAAS,kDAEf;IAED,8CAA8C;IACvC,SAAS,4CAEf;IAIY,sBAAsB,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAqB5E;YAGa,qBAAqB;YAiCrB,mBAAmB;YAuBnB,gBAAgB;YAuBhB,gCAAgC;YAmBhC,gBAAgB;YA0BhB,WAAW;IAczB;;OAEG;IACU,UAAU,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAKjE;IAIK,KAAK,kBA8BV;IAEK,IAAI,kBA0BT;IAED;;;;OAIG;IACH,SAAS,CAAC,oBAAoB,CAAC,iBAAiB,EAAE,sBAAsB,GAAG,cAAc,CAmBxF;IAED;;;;OAIG;IACI,eAAe,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI,CAKrD;IAED,8GAA8G;IACjG,uBAAuB,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAcvF;IAKD,OAAO,CAAC,cAAc;IAItB;;;OAGG;IACH,UAAgB,kBAAkB,CAChC,WAAW,EAAE,WAAW,EACxB,WAAW,EAAE,IAAI,CAAC,iBAAiB,EAAE,eAAe,CAAC,GACpD,OAAO,CAAC,OAAO,CAAC,CAiBlB;IAED,6CAA6C;IAC7C,UAAgB,2BAA2B,CACzC,iBAAiB,EAAE,WAAW,EAC9B,WAAW,EAAE,WAAW,EACxB,WAAW,EAAE,IAAI,CAAC,iBAAiB,EAAE,eAAe,CAAC,GACpD,OAAO,CAAC,OAAO,CAAC,CAMlB;IAED;;;;;;OAMG;IACH,UAAgB,mBAAmB,IAAI,OAAO,CAAC;QAC7C,aAAa,EAAE,WAAW,CAAC;QAC3B,oBAAoB,EAAE,WAAW,GAAG,SAAS,CAAC;KAC/C,CAAC,CAuBD;YAEa,yBAAyB;IAQvC,OAAO,CAAC,cAAc;CAcvB;AAGD,OAAO,EAAE,4BAA4B,EAAE,CAAC"}
1
+ {"version":3,"file":"prover-node.d.ts","sourceRoot":"","sources":["../src/prover-node.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAK7F,OAAO,EAAE,YAAY,EAAkB,MAAM,yBAAyB,CAAC;AACvE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE/D,OAAO,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAC;AAE/D,OAAO,EAEL,KAAK,aAAa,EAElB,KAAK,kBAAkB,EACvB,KAAK,yBAAyB,EAE/B,MAAM,qBAAqB,CAAC;AAE7B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,KAAK,iBAAiB,EAAmD,MAAM,6BAA6B,CAAC;AACtH,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EACzB,4BAA4B,EAC5B,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,OAAO,EACZ,KAAK,sBAAsB,EAE5B,MAAM,iCAAiC,CAAC;AACzC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAEnE,OAAO,EACL,SAAS,EACT,KAAK,eAAe,EACpB,KAAK,SAAS,EACd,KAAK,MAAM,EAEZ,MAAM,yBAAyB,CAAC;AAGjC,OAAO,EAAE,eAAe,EAA+B,MAAM,uBAAuB,CAAC;AACrF,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAE9E,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAC5E,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,KAAK,iBAAiB,GAAG,wBAAwB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;AAC9E,KAAK,gBAAgB,GAAG,IAAI,CAAC,eAAe,EAAE,eAAe,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,WAAW,GAAG,eAAe,CAAC,CAAC;AASlH;;;;;;;;;GASG;AACH,qBAAa,UAAW,YAAW,yBAAyB,EAAE,aAAa,EAAE,SAAS;IAuClF,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,kBAAkB,GAAG,kBAAkB;IAClE,SAAS,CAAC,QAAQ,CAAC,gBAAgB,EAAE,sBAAsB;IAC3D,SAAS,CAAC,QAAQ,CAAC,aAAa,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC;IAClE,SAAS,CAAC,QAAQ,CAAC,mBAAmB,EAAE,mBAAmB;IAC3D,SAAS,CAAC,QAAQ,CAAC,kBAAkB,EAAE,kBAAkB;IACzD,SAAS,CAAC,QAAQ,CAAC,UAAU,EAAE,sBAAsB;IACrD,SAAS,CAAC,QAAQ,CAAC,SAAS,EAAE;QAAE,aAAa,IAAI,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC;IACjF,SAAS,CAAC,QAAQ,CAAC,cAAc,EAAE,cAAc;IACjD,SAAS,CAAC,QAAQ,CAAC,SAAS,EAAE,SAAS;IAEvC,SAAS,CAAC,QAAQ,CAAC,eAAe,EAAE,eAAe;IACnD,OAAO,CAAC,OAAO,CAAC;IAChB,OAAO,CAAC,QAAQ,CAAC,YAAY;IAlD/B,OAAO,CAAC,GAAG,CAA+B;IAE1C,SAAS,CAAC,QAAQ,CAAC,eAAe,EAAE,eAAe,CAAC;IACpD,SAAS,CAAC,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAC1C,SAAS,CAAC,cAAc,EAAE,cAAc,GAAG,SAAS,CAAC;IAErD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoB;IAC3C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAuB;IAClD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA2B;IAE1D,mEAAmE;IACnE,OAAO,CAAC,SAAS,CAAoB;IACrC,uDAAuD;IACvD,OAAO,CAAC,WAAW,CAA4B;IAC/C;;;;;OAKG;IACH,SAAS,CAAC,gBAAgB,EAAE,WAAW,GAAG,SAAS,CAAC;IAEpD;;;;;OAKG;IACH,SAAS,CAAC,uBAAuB,EAAE,gBAAgB,CAAyB;IAE5E,6GAA6G;IAC7G,OAAO,CAAC,YAAY,CAA6B;IAEjD,SAAgB,MAAM,EAAE,MAAM,CAAC;IAE/B,SAAS,CAAC,iBAAiB,EAAE,sBAAsB,GAAG,SAAS,CAAC;IAEhE,YACqB,MAAM,EAAE,kBAAkB,GAAG,kBAAkB,EAC/C,gBAAgB,EAAE,sBAAsB,EACxC,aAAa,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,EAC/C,mBAAmB,EAAE,mBAAmB,EACxC,kBAAkB,EAAE,kBAAkB,EACtC,UAAU,EAAE,sBAAsB,EAClC,SAAS,EAAE;QAAE,aAAa,IAAI,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC,EAC9D,cAAc,EAAE,cAAc,EAC9B,SAAS,EAAE,SAAS,EACvC,MAAM,GAAE,OAAO,CAAC,iBAAiB,CAAM,EACpB,eAAe,GAAE,eAAsC,EAClE,OAAO,CAAC,qBAAS,EACR,YAAY,GAAE,YAAiC,EAgDjE;IAEM,WAAW,uDAEjB;IAEM,MAAM;;yBAEZ;IAED,uDAAuD;IAChD,UAAU,IAAI,OAAO,GAAG,SAAS,CAEvC;IAED,mDAAmD;IAC5C,OAAO,IAAI,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,oBAAoB,CAAC;QAAC,WAAW,EAAE,WAAW,CAAA;KAAE,EAAE,CAAC,CAEpG;IAED,8DAA8D;IACvD,kBAAkB,IAAI,eAAe,CAE3C;IAED,kEAAkE;IAC3D,aAAa,IAAI,UAAU,CAEjC;IAED,wDAAwD;IACjD,iBAAiB,IAAI,cAAc,CAKzC;IAED,8CAA8C;IACvC,SAAS,4CAEf;IAIY,sBAAsB,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CA6B5E;YAaa,qBAAqB;YAoDrB,kBAAkB;YA6BlB,mBAAmB;YA6BnB,gBAAgB;YAgDhB,gCAAgC;YAmBhC,gBAAgB;YA0BhB,WAAW;IAczB;;OAEG;IACU,UAAU,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAKjE;IAIK,KAAK,kBAwCV;IAEK,IAAI,kBA2BT;IAED;;;;OAIG;IACH,SAAS,CAAC,oBAAoB,CAAC,iBAAiB,EAAE,sBAAsB,GAAG,cAAc,CAmBxF;IAED;;;;OAIG;IACI,eAAe,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI,CAKrD;IAED,8GAA8G;IACjG,uBAAuB,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAcvF;IAKD,OAAO,CAAC,cAAc;IAItB;;;OAGG;IACH,UAAgB,kBAAkB,CAChC,WAAW,EAAE,WAAW,EACxB,WAAW,EAAE,IAAI,CAAC,iBAAiB,EAAE,eAAe,CAAC,GACpD,OAAO,CAAC,OAAO,CAAC,CAiBlB;IAED,6CAA6C;IAC7C,UAAgB,2BAA2B,CACzC,iBAAiB,EAAE,WAAW,EAC9B,WAAW,EAAE,WAAW,EACxB,WAAW,EAAE,IAAI,CAAC,iBAAiB,EAAE,eAAe,CAAC,GACpD,OAAO,CAAC,OAAO,CAAC,CAMlB;IAED;;;;;OAKG;IACH,UAAgB,2BAA2B,IAAI,OAAO,CAAC;QAAE,oBAAoB,EAAE,WAAW,GAAG,SAAS,CAAA;KAAE,CAAC,CAgBxG;IAED;;;;OAIG;IACH,UAAgB,yBAAyB,CAAC,oBAAoB,EAAE,WAAW,GAAG,SAAS,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAMlH;YAEa,yBAAyB;IAQvC,OAAO,CAAC,cAAc;CAcvB;AAGD,OAAO,EAAE,4BAA4B,EAAE,CAAC"}
@@ -371,10 +371,11 @@ 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 _initProto;
374
- import { BlockNumber, EpochNumber } from '@aztec/foundation/branded-types';
374
+ import { BlockNumber, CheckpointNumber, EpochNumber } from '@aztec/foundation/branded-types';
375
375
  import { assertRequired, compact, pick } from '@aztec/foundation/collection';
376
376
  import { memoize } from '@aztec/foundation/decorators';
377
377
  import { createLogger } from '@aztec/foundation/log';
378
+ import { RunningPromise } from '@aztec/foundation/running-promise';
378
379
  import { DateProvider, executeTimeout } from '@aztec/foundation/timer';
379
380
  import { getLastSiblingPath } from '@aztec/prover-client/helpers';
380
381
  import { ChonkCache } from '@aztec/prover-client/orchestrator';
@@ -440,6 +441,13 @@ import { SessionManager } from './session-manager.js';
440
441
  * event by comparing the archiver's latest synced L2 slot against each epoch's
441
442
  * submission deadline. Protected so tests can verify the start() seeding.
442
443
  */ lastExpiredEpoch;
444
+ /**
445
+ * Highest checkpoint number whose proving-side handling has completed (or that was legitimately skipped).
446
+ * The catch-up loop walks from here to each `chain-checkpointed` tip event. Seeded at start() from the last
447
+ * checkpoint of the last fully-proven epoch (or 0), so a restart reprocesses the partially-proven epoch rather
448
+ * than trusting a checkpointed tip that may sit ahead of unproven checkpoints. Clamped down on a prune.
449
+ */ lastProcessedCheckpoint;
450
+ /** Periodic tick that runs the epoch-expiry sweep during idle periods when no block-stream events arrive. */ expiryTicker;
443
451
  tracer;
444
452
  publishingService;
445
453
  constructor(prover, publisherFactory, l2BlockSource, l1ToL2MessageSource, contractDataSource, worldState, p2pClient, rollupContract, l1Metrics, config = {}, telemetryClient = getTelemetryClient(), delayer, dateProvider = new DateProvider()){
@@ -456,6 +464,7 @@ import { SessionManager } from './session-manager.js';
456
464
  this.delayer = delayer;
457
465
  this.dateProvider = dateProvider;
458
466
  this.log = (_initProto(this), createLogger('prover-node'));
467
+ this.lastProcessedCheckpoint = CheckpointNumber.ZERO;
459
468
  this.config = {
460
469
  proverNodePollingIntervalMs: 1_000,
461
470
  proverNodeMaxPendingJobs: 100,
@@ -514,13 +523,6 @@ import { SessionManager } from './session-manager.js';
514
523
  }
515
524
  return this.sessionManager;
516
525
  }
517
- /** Returns world state status. */ async getWorldStateSyncStatus() {
518
- const { syncSummary } = await this.worldState.status();
519
- return syncSummary;
520
- }
521
- /** Returns archiver status. */ getL2Tips() {
522
- return this.l2BlockSource.getL2Tips();
523
- }
524
526
  /** Returns the underlying prover instance. */ getProver() {
525
527
  return this.prover;
526
528
  }
@@ -528,17 +530,26 @@ import { SessionManager } from './session-manager.js';
528
530
  async handleBlockStreamEvent(event) {
529
531
  switch(event.type){
530
532
  case 'chain-checkpointed':
531
- await this.handleCheckpointEvent(event.checkpoint);
533
+ await this.processCheckpointJump(event.checkpoint.number);
532
534
  break;
533
535
  case 'chain-pruned':
534
- await this.handlePruneEvent(event.checkpointed.checkpoint);
536
+ await this.handlePruneEvent(event.block);
535
537
  break;
536
538
  case 'chain-proven':
537
539
  this.publishingService?.onChainProven(BlockNumber(event.block.number));
538
540
  break;
541
+ // The proposed tip drives only the tips store's walk-back history (recorded below); the prover-node
542
+ // tracks checkpoints, not proposed blocks. `blocks-added` is never emitted in tips-only mode, and
543
+ // `chain-finalized` carries nothing the prover-node acts on.
544
+ case 'chain-proposed':
539
545
  case 'chain-finalized':
540
546
  case 'blocks-added':
541
547
  break;
548
+ default:
549
+ {
550
+ const _ = event;
551
+ break;
552
+ }
542
553
  }
543
554
  // Expiry is driven by the archiver's latest synced L2 slot
544
555
  await this.checkEpochExpiry();
@@ -547,27 +558,87 @@ import { SessionManager } from './session-manager.js';
547
558
  // skips this update, so the event is re-emitted on the next poll rather than skipped (A-1041).
548
559
  await this.tipsStore.handleBlockStreamEvent(event);
549
560
  }
550
- /** Register a new checkpoint with the store and notify the session manager. */ async handleCheckpointEvent(publishedCheckpoint) {
551
- const checkpoint = publishedCheckpoint.checkpoint;
552
- const slotNumber = checkpoint.header.slotNumber;
553
- const l1Constants = await this.getL1Constants();
554
- const epochNumber = getEpochAtSlot(slotNumber, l1Constants);
555
- if (await this.isEpochFullyProven(epochNumber, l1Constants)) {
556
- this.log.debug(`Skipping checkpoint ${checkpoint.number} for already-proven epoch ${epochNumber}`);
561
+ /**
562
+ * Walks every checkpoint between the local cursor and the newly-reported checkpointed tip, registering
563
+ * each one that belongs to an epoch that can still be proven. The block stream now delivers a single thin
564
+ * `chain-checkpointed` tip event per pass rather than one fat event per checkpoint, so this drives the
565
+ * catch-up itself: light metadata first (`getCheckpointsData`) to decide relevance per epoch, then a heavy
566
+ * `getCheckpoints` fetch only for checkpoints in provable epochs.
567
+ *
568
+ * The cursor advances one checkpoint at a time and only after that checkpoint's proving-side handling has
569
+ * fully succeeded, preserving the A-1041 at-least-once semantics: a mid-jump failure leaves the cursor
570
+ * behind so the next pass retries from the first checkpoint that did not complete.
571
+ */ async processCheckpointJump(targetCheckpoint) {
572
+ if (targetCheckpoint <= this.lastProcessedCheckpoint) {
557
573
  return;
558
574
  }
559
- if (await this.isEpochPastProofSubmissionWindow(epochNumber, l1Constants)) {
560
- this.log.debug(`Skipping checkpoint ${checkpoint.number} for epoch ${epochNumber} past its proof-submission window`);
561
- return;
575
+ const l1Constants = await this.getL1Constants();
576
+ // Cap the catch-up at the `(proofSubmissionEpochs + 1) * epochDuration` most recent checkpoints.
577
+ // When the cursor is much further behind (e.g. resyncing after a long time offline), fetching the whole gap could
578
+ // load thousands of checkpoints we cannot act on: anything older than the last two epochs is already past
579
+ // its proof-submission window, so we skip it and jump the cursor forward to the start of the capped range.
580
+ const maxCheckpoints = (l1Constants.proofSubmissionEpochs + 1) * l1Constants.epochDuration;
581
+ let from = CheckpointNumber(this.lastProcessedCheckpoint + 1);
582
+ if (Number(targetCheckpoint - from) + 1 > maxCheckpoints) {
583
+ const cappedFrom = CheckpointNumber(targetCheckpoint - maxCheckpoints + 1);
584
+ this.log.warn(`Skipping unprovable checkpoints during catch-up; the prover node is far behind`, {
585
+ from,
586
+ cappedFrom,
587
+ targetCheckpoint,
588
+ maxCheckpoints
589
+ });
590
+ // Advance the cursor past the skipped checkpoints so they are never retried.
591
+ this.lastProcessedCheckpoint = CheckpointNumber(cappedFrom - 1);
592
+ from = cappedFrom;
593
+ }
594
+ const limit = Number(targetCheckpoint - from) + 1;
595
+ const metadatas = await this.l2BlockSource.getCheckpointsData({
596
+ from,
597
+ limit
598
+ });
599
+ // Per-epoch relevance is cached so a multi-checkpoint epoch resolves it once. Skipping is whole-epoch
600
+ // only: the SessionManager requires an epoch's checkpoints fully covered before it opens a session, so we
601
+ // never drop an individual checkpoint inside an epoch we will prove.
602
+ const epochSkippable = new Map();
603
+ for (const metadata of metadatas){
604
+ const epochNumber = getEpochAtSlot(metadata.header.slotNumber, l1Constants);
605
+ let skippable = epochSkippable.get(epochNumber);
606
+ if (skippable === undefined) {
607
+ skippable = await this.isEpochFullyProven(epochNumber, l1Constants) || await this.isEpochPastProofSubmissionWindow(epochNumber, l1Constants);
608
+ epochSkippable.set(epochNumber, skippable);
609
+ }
610
+ if (skippable) {
611
+ this.log.debug(`Skipping checkpoint ${metadata.checkpointNumber} for unprovable epoch ${epochNumber}`);
612
+ } else {
613
+ await this.registerCheckpoint(metadata.checkpointNumber, epochNumber);
614
+ }
615
+ // Advance only after the checkpoint's handling succeeded (or it was legitimately skipped). registerCheckpoint
616
+ // throws on failure, which leaves the cursor here for the next pass to retry (A-1041).
617
+ this.lastProcessedCheckpoint = metadata.checkpointNumber;
562
618
  }
619
+ }
620
+ /** Heavy-fetch a single checkpoint, register it with the store, and notify the session manager. */ async registerCheckpoint(checkpointNumber, epochNumber) {
621
+ const published = await this.l2BlockSource.getCheckpoint({
622
+ number: checkpointNumber
623
+ });
624
+ if (!published) {
625
+ throw new Error(`Checkpoint ${checkpointNumber} not found in block source during catch-up`);
626
+ }
627
+ const checkpoint = published.checkpoint;
563
628
  this.log.info(`New checkpoint ${checkpoint.number} for epoch ${epochNumber}`, {
564
629
  checkpointNumber: checkpoint.number,
565
630
  epochNumber,
566
- slotNumber
631
+ slotNumber: checkpoint.header.slotNumber
567
632
  });
568
- const registerData = await this.collectRegisterData(checkpoint, publishedCheckpoint.attestations);
633
+ const registerData = await this.collectRegisterData(checkpoint, published.attestations);
569
634
  await this.checkpointStore.addOrUpdate(checkpoint, registerData);
570
635
  await this.sessionManager?.onCheckpointAdded(epochNumber);
636
+ // Tips-only mode delivers no blocks, so record one witness per checkpointed block: a reorg into the checkpoint's
637
+ // range then prunes at the true divergence instead of the nearest sparse tip anchor.
638
+ await this.tipsStore.recordBlockHashes(await Promise.all(checkpoint.blocks.map(async (block)=>({
639
+ number: block.number,
640
+ hash: (await block.header.hash()).toString()
641
+ }))));
571
642
  }
572
643
  /**
573
644
  * Gathers register-time data for a checkpoint: previous block header, L1-to-L2 messages,
@@ -587,11 +658,38 @@ import { SessionManager } from './session-manager.js';
587
658
  previousArchiveSiblingPath
588
659
  };
589
660
  }
590
- /** Mark every prover above the prune threshold as pruned and notify the session manager. */ async handlePruneEvent(prunedCheckpoint) {
591
- this.log.warn(`Chain pruned to checkpoint ${prunedCheckpoint.number}`, {
592
- prunedCheckpoint
661
+ /**
662
+ * Marks every prover orphaned by the prune as pruned, clamps the catch-up cursor below the prune target's
663
+ * checkpoint, and notifies the session manager. Keyed off the prune target block (the highest surviving block)
664
+ * rather than the source's checkpointed tip, which can sit above the target after a re-checkpoint and would leave
665
+ * orphaned provers canonical. Throws (rather than warning) if the cursor floor cannot be resolved, so the pass
666
+ * fails and the prune is retried next iteration.
667
+ */ async handlePruneEvent(prunedToBlock) {
668
+ this.log.warn(`Chain pruned to block ${prunedToBlock.number}`, {
669
+ prunedToBlock
593
670
  });
594
- const affected = this.checkpointStore.markPrunedAfter(prunedCheckpoint.number);
671
+ // Resolve the cursor floor BEFORE marking provers: markPrunedAboveBlock returns only newly-marked provers, so a
672
+ // throw after marking would leave a retry pass with nothing to act on. Resolving first means a throw leaves
673
+ // everything untouched and the next pass retries the whole handler (the tips cursor only advances on success).
674
+ let cursorFloor;
675
+ if (prunedToBlock.number === 0) {
676
+ cursorFloor = CheckpointNumber.ZERO;
677
+ } else {
678
+ const targetData = await this.l2BlockSource.getBlockData({
679
+ number: prunedToBlock.number
680
+ });
681
+ if (targetData === undefined) {
682
+ throw new Error(`No block data found for prune target block ${prunedToBlock.number}; cannot clamp checkpoint cursor`);
683
+ }
684
+ // Clamp to `cpAtTarget - 1`: a mid-checkpoint target leaves that checkpoint partially orphaned and it must be
685
+ // reprocessed. Over-clamping merely re-registers a checkpoint (at-least-once by design — A-1041); under-clamping
686
+ // would permanently skip a rebuilt same-number checkpoint.
687
+ cursorFloor = CheckpointNumber(Math.max(0, Number(targetData.checkpointNumber) - 1));
688
+ }
689
+ const affected = this.checkpointStore.markPrunedAboveBlock(prunedToBlock.number);
690
+ if (this.lastProcessedCheckpoint > cursorFloor) {
691
+ this.lastProcessedCheckpoint = cursorFloor;
692
+ }
595
693
  if (affected.length === 0) {
596
694
  return;
597
695
  }
@@ -689,13 +787,18 @@ import { SessionManager } from './session-manager.js';
689
787
  this.sessionManager.start();
690
788
  // Now that the store + manager exist, arm the live-state observable gauges.
691
789
  this.jobMetrics.observeState(this.checkpointStore, this.sessionManager);
692
- const { startingBlock, lastFullyProvenEpoch } = await this.computeStartupState();
790
+ const { lastFullyProvenEpoch } = await this.resolveLastFullyProvenEpoch();
693
791
  this.lastExpiredEpoch = lastFullyProvenEpoch;
792
+ this.lastProcessedCheckpoint = await this.computeStartingCheckpoint(lastFullyProvenEpoch);
694
793
  this.blockStream = new L2BlockStream(this.l2BlockSource, this.tipsStore, this, this.log, {
695
794
  pollIntervalMS: this.config.proverNodePollingIntervalMs,
696
- startingBlock
795
+ tipsOnly: true
697
796
  });
698
797
  this.blockStream.start();
798
+ // With thin once-per-pass tip events, the expiry sweep no longer fires once per checkpoint; drive it
799
+ // from a periodic tick so epochs still expire during idle/no-event periods.
800
+ this.expiryTicker = new RunningPromise(()=>this.checkEpochExpiry(), this.log, this.config.proverNodePollingIntervalMs);
801
+ this.expiryTicker.start();
699
802
  await this.rewardsMetrics.start();
700
803
  this.l1Metrics.start();
701
804
  this.log.info(`Started Prover Node with prover id ${this.prover.getProverId().toString()}`, this.config);
@@ -704,6 +807,7 @@ import { SessionManager } from './session-manager.js';
704
807
  this.log.info('Stopping ProverNode');
705
808
  this.jobMetrics.stopObservingState();
706
809
  await this.blockStream?.stop();
810
+ await this.expiryTicker?.stop();
707
811
  if (this.sessionManager) {
708
812
  await this.sessionManager.stop();
709
813
  }
@@ -803,18 +907,16 @@ import { SessionManager } from './session-manager.js';
803
907
  return this.l2BlockSource.isEpochComplete(provenEpoch);
804
908
  }
805
909
  /**
806
- * Resolves the L2BlockStream's starting block and the last fully-proven epoch in one
807
- * pass. The starting block is the first block of the next unproven epoch (or the start
808
- * of the partially-proven epoch if the proven tip falls mid-epoch). The fully-proven
809
- * epoch is `provenEpoch` when the proven tip is the last block of its epoch, otherwise
810
- * `provenEpoch - 1`, or `undefined` if no block is proven yet.
811
- */ async computeStartupState() {
910
+ * Resolves the last fully-proven epoch from L1 proven state, used to seed the catch-up cursor (via
911
+ * `computeStartingCheckpoint`) and `lastExpiredEpoch`. The fully-proven epoch is `provenEpoch` when the
912
+ * proven tip is the last block of its epoch, otherwise `provenEpoch - 1`, or `undefined` if no block is
913
+ * proven yet (so a restart reprocesses the partially-proven epoch rather than trusting a stale tip).
914
+ */ async resolveLastFullyProvenEpoch() {
812
915
  const provenBlockNumber = await this.l2BlockSource.getBlockNumber({
813
916
  tag: 'proven'
814
917
  });
815
918
  if (!provenBlockNumber || provenBlockNumber <= 0) {
816
919
  return {
817
- startingBlock: BlockNumber(1),
818
920
  lastFullyProvenEpoch: undefined
819
921
  };
820
922
  }
@@ -824,32 +926,33 @@ import { SessionManager } from './session-manager.js';
824
926
  }))?.header;
825
927
  if (!provenHeader) {
826
928
  return {
827
- startingBlock: BlockNumber(provenBlockNumber + 1),
828
929
  lastFullyProvenEpoch: undefined
829
930
  };
830
931
  }
831
932
  const provenEpoch = getEpochAtSlot(provenHeader.getSlot(), l1Constants);
832
933
  if (await this.isProvenBlockLastOfItsEpoch(BlockNumber(provenBlockNumber), provenEpoch, l1Constants)) {
833
934
  return {
834
- startingBlock: BlockNumber(provenBlockNumber + 1),
835
935
  lastFullyProvenEpoch: provenEpoch
836
936
  };
837
937
  }
838
- const epochCheckpoints = await this.l2BlockSource.getCheckpointsData({
839
- epoch: provenEpoch
840
- });
841
- const firstBlockOfEpoch = epochCheckpoints.length > 0 ? epochCheckpoints[0].startBlock : BlockNumber(provenBlockNumber);
842
- this.log.info(`Starting L2BlockStream at block ${firstBlockOfEpoch} (start of partially-proven epoch ${provenEpoch})`, {
843
- provenBlockNumber,
844
- provenEpoch,
845
- firstBlockOfEpoch
846
- });
847
938
  const lastFullyProvenEpoch = provenEpoch > 0 ? EpochNumber(provenEpoch - 1) : undefined;
848
939
  return {
849
- startingBlock: firstBlockOfEpoch,
850
940
  lastFullyProvenEpoch
851
941
  };
852
942
  }
943
+ /**
944
+ * Resolves the catch-up cursor seed: the last checkpoint of the last fully-proven epoch, or 0 if none. Seeding
945
+ * from a checkpoint (rather than a checkpointed tip) guarantees a restart reprocesses every checkpoint of the
946
+ * partially-proven epoch, since the checkpointed tip can sit ahead of the last fully-proven checkpoint.
947
+ */ async computeStartingCheckpoint(lastFullyProvenEpoch) {
948
+ if (lastFullyProvenEpoch === undefined) {
949
+ return CheckpointNumber.ZERO;
950
+ }
951
+ const checkpoints = await this.l2BlockSource.getCheckpointsData({
952
+ epoch: lastFullyProvenEpoch
953
+ });
954
+ return checkpoints.at(-1)?.checkpointNumber ?? CheckpointNumber.ZERO;
955
+ }
853
956
  async gatherPreviousBlockHeader(previousBlockNumber) {
854
957
  const data = await this.l2BlockSource.getBlockData({
855
958
  number: BlockNumber(previousBlockNumber)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aztec/prover-node",
3
- "version": "5.0.0-rc.1",
3
+ "version": "5.0.0-rc.2",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": "./dest/index.js",
@@ -56,28 +56,28 @@
56
56
  ]
57
57
  },
58
58
  "dependencies": {
59
- "@aztec/archiver": "5.0.0-rc.1",
60
- "@aztec/bb-prover": "5.0.0-rc.1",
61
- "@aztec/blob-client": "5.0.0-rc.1",
62
- "@aztec/blob-lib": "5.0.0-rc.1",
63
- "@aztec/constants": "5.0.0-rc.1",
64
- "@aztec/epoch-cache": "5.0.0-rc.1",
65
- "@aztec/ethereum": "5.0.0-rc.1",
66
- "@aztec/foundation": "5.0.0-rc.1",
67
- "@aztec/kv-store": "5.0.0-rc.1",
68
- "@aztec/l1-artifacts": "5.0.0-rc.1",
69
- "@aztec/native": "5.0.0-rc.1",
70
- "@aztec/node-keystore": "5.0.0-rc.1",
71
- "@aztec/node-lib": "5.0.0-rc.1",
72
- "@aztec/noir-protocol-circuits-types": "5.0.0-rc.1",
73
- "@aztec/p2p": "5.0.0-rc.1",
74
- "@aztec/protocol-contracts": "5.0.0-rc.1",
75
- "@aztec/prover-client": "5.0.0-rc.1",
76
- "@aztec/sequencer-client": "5.0.0-rc.1",
77
- "@aztec/simulator": "5.0.0-rc.1",
78
- "@aztec/stdlib": "5.0.0-rc.1",
79
- "@aztec/telemetry-client": "5.0.0-rc.1",
80
- "@aztec/world-state": "5.0.0-rc.1",
59
+ "@aztec/archiver": "5.0.0-rc.2",
60
+ "@aztec/bb-prover": "5.0.0-rc.2",
61
+ "@aztec/blob-client": "5.0.0-rc.2",
62
+ "@aztec/blob-lib": "5.0.0-rc.2",
63
+ "@aztec/constants": "5.0.0-rc.2",
64
+ "@aztec/epoch-cache": "5.0.0-rc.2",
65
+ "@aztec/ethereum": "5.0.0-rc.2",
66
+ "@aztec/foundation": "5.0.0-rc.2",
67
+ "@aztec/kv-store": "5.0.0-rc.2",
68
+ "@aztec/l1-artifacts": "5.0.0-rc.2",
69
+ "@aztec/native": "5.0.0-rc.2",
70
+ "@aztec/node-keystore": "5.0.0-rc.2",
71
+ "@aztec/node-lib": "5.0.0-rc.2",
72
+ "@aztec/noir-protocol-circuits-types": "5.0.0-rc.2",
73
+ "@aztec/p2p": "5.0.0-rc.2",
74
+ "@aztec/protocol-contracts": "5.0.0-rc.2",
75
+ "@aztec/prover-client": "5.0.0-rc.2",
76
+ "@aztec/sequencer-client": "5.0.0-rc.2",
77
+ "@aztec/simulator": "5.0.0-rc.2",
78
+ "@aztec/stdlib": "5.0.0-rc.2",
79
+ "@aztec/telemetry-client": "5.0.0-rc.2",
80
+ "@aztec/world-state": "5.0.0-rc.2",
81
81
  "source-map-support": "^0.5.21",
82
82
  "tslib": "^2.4.0",
83
83
  "viem": "npm:@aztec/viem@2.38.2"
@@ -1,4 +1,4 @@
1
- import type { CheckpointNumber, EpochNumber, SlotNumber } from '@aztec/foundation/branded-types';
1
+ import type { BlockNumber, CheckpointNumber, EpochNumber, SlotNumber } from '@aztec/foundation/branded-types';
2
2
  import { type Logger, type LoggerBindings, createLogger } from '@aztec/foundation/log';
3
3
  import { RunningPromise } from '@aztec/foundation/promise';
4
4
  import type { L2BlockSource } from '@aztec/stdlib/block';
@@ -97,14 +97,19 @@ export class CheckpointStore {
97
97
  }
98
98
 
99
99
  /**
100
- * Marks every canonical prover whose checkpoint number is strictly greater than
101
- * `prunedNumber` as pruned. Sub-tree work keeps running so a re-add of the same
102
- * content can pick it up. Returns the affected provers.
100
+ * Marks every canonical prover that holds a block above the prune target as pruned. A checkpoint is orphaned by a
101
+ * prune to block `targetBlockNumber` iff its last block sits above the target — including a checkpoint whose range
102
+ * straddles the target (partially orphaned), which block-range marking catches without boundary ambiguity. Keying
103
+ * off the surviving block number (rather than a checkpoint number) is correct even when the source has already
104
+ * re-checkpointed past the divergence: the prune event reports the highest surviving block, which by construction
105
+ * survives on the source, whereas the source's current checkpointed tip can sit above the prune target.
106
+ * Sub-tree work keeps running so a re-add of the same content can pick it up. Returns the affected provers.
103
107
  */
104
- public markPrunedAfter(prunedNumber: CheckpointNumber): CheckpointProver[] {
108
+ public markPrunedAboveBlock(targetBlockNumber: BlockNumber): CheckpointProver[] {
105
109
  const affected: CheckpointProver[] = [];
106
110
  for (const prover of this.provers.values()) {
107
- if (prover.checkpoint.number > prunedNumber && !prover.isPruned()) {
111
+ const lastBlockNumber = prover.checkpoint.blocks.at(-1)!.number;
112
+ if (lastBlockNumber > targetBlockNumber && !prover.isPruned()) {
108
113
  prover.markPruned();
109
114
  affected.push(prover);
110
115
  }
@@ -277,6 +277,8 @@ export class CheckpointProver {
277
277
  checkpointNumber: this.checkpoint.number,
278
278
  blockProofCount: result.blockProofOutputs.length,
279
279
  });
280
+ // Spans processing + proving (from executeCheckpoint start, after tx gathering) to proofs ready.
281
+ this.deps.metrics.recordCheckpointProving(checkpointTimer.ms());
280
282
  this.blockProofs.resolve(result.blockProofOutputs);
281
283
  },
282
284
  err => this.blockProofs.reject(err),
@@ -344,7 +346,8 @@ export class CheckpointProver {
344
346
  }
345
347
 
346
348
  this.completed = true;
347
- this.deps.metrics.recordCheckpointProcessing(checkpointTimer.ms());
349
+ const numTxs = this.checkpoint.blocks.reduce((acc, block) => acc + block.body.txEffects.length, 0);
350
+ this.deps.metrics.recordCheckpointProcessing(checkpointTimer.ms(), this.checkpoint.blocks.length, numTxs);
348
351
  this.deps.log.info(
349
352
  `Finished enqueueing block-level proving for checkpoint ${this.checkpoint.number} in ${checkpointTimer.ms()}ms`,
350
353
  {