@aztec/prover-node 0.0.1-commit.2ed92850 → 0.0.1-commit.3100065

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/README.md +511 -0
  2. package/dest/actions/download-epoch-proving-job.js +1 -1
  3. package/dest/actions/rerun-epoch-proving-job.d.ts +5 -4
  4. package/dest/actions/rerun-epoch-proving-job.d.ts.map +1 -1
  5. package/dest/actions/rerun-epoch-proving-job.js +102 -22
  6. package/dest/actions/upload-epoch-proof-failure.d.ts +2 -2
  7. package/dest/actions/upload-epoch-proof-failure.d.ts.map +1 -1
  8. package/dest/bin/run-failed-epoch.js +6 -5
  9. package/dest/checkpoint-store.d.ts +88 -0
  10. package/dest/checkpoint-store.d.ts.map +1 -0
  11. package/dest/checkpoint-store.js +169 -0
  12. package/dest/config.d.ts +5 -8
  13. package/dest/config.d.ts.map +1 -1
  14. package/dest/config.js +17 -20
  15. package/dest/factory.d.ts +19 -13
  16. package/dest/factory.d.ts.map +1 -1
  17. package/dest/factory.js +40 -65
  18. package/dest/index.d.ts +2 -1
  19. package/dest/index.d.ts.map +1 -1
  20. package/dest/index.js +1 -0
  21. package/dest/job/checkpoint-prover.d.ts +124 -0
  22. package/dest/job/checkpoint-prover.d.ts.map +1 -0
  23. package/dest/job/checkpoint-prover.js +330 -0
  24. package/dest/job/epoch-session.d.ts +146 -0
  25. package/dest/job/epoch-session.d.ts.map +1 -0
  26. package/dest/job/{epoch-proving-job.js → epoch-session.js} +277 -295
  27. package/dest/job/top-tree-job.d.ts +82 -0
  28. package/dest/job/top-tree-job.d.ts.map +1 -0
  29. package/dest/job/top-tree-job.js +152 -0
  30. package/dest/metrics.d.ts +40 -3
  31. package/dest/metrics.d.ts.map +1 -1
  32. package/dest/metrics.js +112 -7
  33. package/dest/monitors/epoch-monitor.d.ts +1 -1
  34. package/dest/monitors/epoch-monitor.d.ts.map +1 -1
  35. package/dest/monitors/epoch-monitor.js +11 -9
  36. package/dest/proof-publishing-service.d.ts +161 -0
  37. package/dest/proof-publishing-service.d.ts.map +1 -0
  38. package/dest/proof-publishing-service.js +335 -0
  39. package/dest/prover-node-publisher.d.ts +25 -17
  40. package/dest/prover-node-publisher.d.ts.map +1 -1
  41. package/dest/prover-node-publisher.js +201 -63
  42. package/dest/prover-node.d.ts +118 -70
  43. package/dest/prover-node.d.ts.map +1 -1
  44. package/dest/prover-node.js +487 -226
  45. package/dest/prover-publisher-factory.d.ts +7 -5
  46. package/dest/prover-publisher-factory.d.ts.map +1 -1
  47. package/dest/prover-publisher-factory.js +7 -5
  48. package/dest/session-manager.d.ts +158 -0
  49. package/dest/session-manager.d.ts.map +1 -0
  50. package/dest/session-manager.js +482 -0
  51. package/dest/test/index.d.ts +7 -6
  52. package/dest/test/index.d.ts.map +1 -1
  53. package/package.json +23 -22
  54. package/src/actions/download-epoch-proving-job.ts +1 -1
  55. package/src/actions/rerun-epoch-proving-job.ts +115 -28
  56. package/src/actions/upload-epoch-proof-failure.ts +1 -1
  57. package/src/bin/run-failed-epoch.ts +5 -3
  58. package/src/checkpoint-store.ts +194 -0
  59. package/src/config.ts +25 -32
  60. package/src/factory.ts +68 -111
  61. package/src/index.ts +1 -0
  62. package/src/job/checkpoint-prover.ts +442 -0
  63. package/src/job/epoch-session.ts +436 -0
  64. package/src/job/top-tree-job.ts +227 -0
  65. package/src/metrics.ts +129 -12
  66. package/src/monitors/epoch-monitor.ts +5 -6
  67. package/src/proof-publishing-service.ts +427 -0
  68. package/src/prover-node-publisher.ts +236 -80
  69. package/src/prover-node.ts +562 -254
  70. package/src/prover-publisher-factory.ts +16 -10
  71. package/src/session-manager.ts +583 -0
  72. package/src/test/index.ts +6 -6
  73. package/dest/job/epoch-proving-job.d.ts +0 -62
  74. package/dest/job/epoch-proving-job.d.ts.map +0 -1
  75. package/src/job/epoch-proving-job.ts +0 -430
@@ -1,8 +1,8 @@
1
1
  import { getEthBlobEvaluationInputs } from '@aztec/blob-lib';
2
- import { AZTEC_MAX_EPOCH_DURATION } from '@aztec/constants';
3
- import { makeTuple } from '@aztec/foundation/array';
2
+ import { MAX_CHECKPOINTS_PER_EPOCH } from '@aztec/constants';
4
3
  import { CheckpointNumber } from '@aztec/foundation/branded-types';
5
4
  import { areArraysEqual } from '@aztec/foundation/collection';
5
+ import { Fr } from '@aztec/foundation/curves/bn254';
6
6
  import { EthAddress } from '@aztec/foundation/eth-address';
7
7
  import { createLogger } from '@aztec/foundation/log';
8
8
  import { Timer } from '@aztec/foundation/timer';
@@ -10,36 +10,23 @@ import { RollupAbi } from '@aztec/l1-artifacts';
10
10
  import { CommitteeAttestation, CommitteeAttestationsAndSigners } from '@aztec/stdlib/block';
11
11
  import { getTelemetryClient } from '@aztec/telemetry-client';
12
12
  import { inspect } from 'util';
13
- import { encodeFunctionData } from 'viem';
13
+ import { encodeFunctionData, formatEther, formatGwei } from 'viem';
14
14
  import { ProverNodePublisherMetrics } from './metrics.js';
15
15
  export class ProverNodePublisher {
16
- interrupted = false;
17
16
  metrics;
18
- log = createLogger('prover-node:l1-tx-publisher');
17
+ log;
19
18
  rollupContract;
20
19
  l1TxUtils;
21
- constructor(config, deps){
20
+ constructor(config, deps, bindings){
22
21
  const telemetry = deps.telemetry ?? getTelemetryClient();
23
22
  this.metrics = new ProverNodePublisherMetrics(telemetry, 'ProverNode');
23
+ this.log = createLogger('prover-node:l1-tx-publisher', bindings);
24
24
  this.rollupContract = deps.rollupContract;
25
25
  this.l1TxUtils = deps.l1TxUtils;
26
26
  }
27
27
  getRollupContract() {
28
28
  return this.rollupContract;
29
29
  }
30
- /**
31
- * Calling `interrupt` will cause any in progress call to `publishRollup` to return `false` asap.
32
- * Be warned, the call may return false even if the tx subsequently gets successfully mined.
33
- * In practice this shouldn't matter, as we'll only ever be calling `interrupt` when we know it's going to fail.
34
- * A call to `restart` is required before you can continue publishing.
35
- */ interrupt() {
36
- this.interrupted = true;
37
- this.l1TxUtils.interrupt();
38
- }
39
- /** Restarts the publisher after calling `interrupt`. */ restart() {
40
- this.interrupted = false;
41
- this.l1TxUtils.restart();
42
- }
43
30
  getSenderAddress() {
44
31
  return this.l1TxUtils.getSenderAddress();
45
32
  }
@@ -50,45 +37,42 @@ export class ProverNodePublisher {
50
37
  fromCheckpoint,
51
38
  toCheckpoint
52
39
  };
53
- if (!this.interrupted) {
54
- const timer = new Timer();
55
- // Validate epoch proof range and hashes are correct before submitting
56
- await this.validateEpochProofSubmission(args);
57
- const txReceipt = await this.sendSubmitEpochProofTx(args);
58
- if (!txReceipt) {
59
- this.log.error(`Failed to mine submitEpochProof tx`, undefined, ctx);
60
- return false;
61
- }
62
- try {
63
- this.metrics.recordSenderBalance(await this.l1TxUtils.getSenderBalance(), this.l1TxUtils.getSenderAddress().toString());
64
- } catch (err) {
65
- this.log.warn(`Failed to record the ETH balance of the prover node: ${err}`);
66
- }
67
- // Tx was mined successfully
68
- if (txReceipt.status === 'success') {
69
- const tx = await this.l1TxUtils.getTransactionStats(txReceipt.transactionHash);
70
- const stats = {
71
- gasPrice: txReceipt.effectiveGasPrice,
72
- gasUsed: txReceipt.gasUsed,
73
- transactionHash: txReceipt.transactionHash,
74
- calldataGas: tx.calldataGas,
75
- calldataSize: tx.calldataSize,
76
- sender: tx.sender,
77
- blobDataGas: 0n,
78
- blobGasUsed: 0n,
79
- eventName: 'proof-published-to-l1'
80
- };
81
- this.log.info(`Published epoch proof to L1 rollup contract`, {
82
- ...stats,
83
- ...ctx
84
- });
85
- this.metrics.recordSubmitProof(timer.ms(), stats);
86
- return true;
87
- }
88
- this.metrics.recordFailedTx();
89
- this.log.error(`Rollup submitEpochProof tx reverted ${txReceipt.transactionHash}`, undefined, ctx);
40
+ const timer = new Timer();
41
+ // Validate epoch proof range and hashes are correct before submitting
42
+ await this.validateEpochProofSubmission(args);
43
+ const txReceipt = await this.sendSubmitEpochProofTx(args);
44
+ if (!txReceipt) {
45
+ this.log.error(`Failed to mine submitEpochProof tx`, undefined, ctx);
46
+ return false;
47
+ }
48
+ try {
49
+ this.metrics.recordSenderBalance(await this.l1TxUtils.getSenderBalance(), this.l1TxUtils.getSenderAddress().toString());
50
+ } catch (err) {
51
+ this.log.warn(`Failed to record the ETH balance of the prover node: ${err}`);
90
52
  }
91
- this.log.verbose('Checkpoint data syncing interrupted', ctx);
53
+ // Tx was mined successfully
54
+ if (txReceipt.status === 'success') {
55
+ const tx = await this.l1TxUtils.getTransactionStats(txReceipt.transactionHash);
56
+ const stats = {
57
+ gasPrice: txReceipt.effectiveGasPrice,
58
+ gasUsed: txReceipt.gasUsed,
59
+ transactionHash: txReceipt.transactionHash,
60
+ calldataGas: tx.calldataGas,
61
+ calldataSize: tx.calldataSize,
62
+ sender: tx.sender,
63
+ blobDataGas: 0n,
64
+ blobGasUsed: 0n,
65
+ eventName: 'proof-published-to-l1'
66
+ };
67
+ this.log.info(`Published epoch proof to L1 rollup contract`, {
68
+ ...stats,
69
+ ...ctx
70
+ });
71
+ this.metrics.recordSubmitProof(timer.ms(), stats);
72
+ return true;
73
+ }
74
+ this.metrics.recordFailedTx();
75
+ this.log.error(`Rollup submitEpochProof tx reverted ${txReceipt.transactionHash}`, undefined, ctx);
92
76
  return false;
93
77
  }
94
78
  async validateEpochProofSubmission(args) {
@@ -101,7 +85,7 @@ export class ProverNodePublisher {
101
85
  }
102
86
  // toCheckpoint can't be greater than pending
103
87
  if (toCheckpoint > pending) {
104
- throw new Error(`Cannot submit epoch proof for ${fromCheckpoint}-${toCheckpoint} as pending checkpoint is ${pending}`);
88
+ throw new Error(`Cannot submit epoch proof for ${fromCheckpoint}-${toCheckpoint} as proposed checkpoint is ${pending}`);
105
89
  }
106
90
  // Check the archive for the immediate checkpoint before the epoch
107
91
  const checkpointLog = await this.rollupContract.getCheckpoint(CheckpointNumber(fromCheckpoint - 1));
@@ -124,10 +108,65 @@ export class ProverNodePublisher {
124
108
  ...publicInputs.toFields()
125
109
  ];
126
110
  if (!areArraysEqual(rollupPublicInputs, argsPublicInputs, (a, b)=>a.equals(b))) {
127
- const fmt = (inputs)=>inputs.map((x)=>x.toString()).join(', ');
128
- throw new Error(`Root rollup public inputs mismatch:\nRollup: ${fmt(rollupPublicInputs)}\nComputed:${fmt(argsPublicInputs)}`);
111
+ throw await reportPublicInputsMismatch({
112
+ rollupPublicInputs,
113
+ argsPublicInputs,
114
+ fromCheckpoint,
115
+ toCheckpoint,
116
+ rollupContract: this.rollupContract,
117
+ log: this.log
118
+ });
129
119
  }
130
120
  }
121
+ /**
122
+ * Estimates what submitting the epoch proof would have cost on L1 without actually sending it.
123
+ * Runs the same validation as `submitEpochProof`, encodes the calldata, estimates gas, and records metrics.
124
+ * Used when proof publishing is disabled (e.g. PROVER_NODE_DISABLE_PROOF_PUBLISH=true on mainnet).
125
+ */ async analyzeEpochProofSubmission(args) {
126
+ const { epochNumber, fromCheckpoint, toCheckpoint } = args;
127
+ await this.validateEpochProofSubmission(args);
128
+ const data = this.encodeSubmitEpochProofCalldata(args);
129
+ const senderAddress = this.l1TxUtils.getSenderAddress();
130
+ const [gasLimit, gasPrice, latestBlock] = await Promise.all([
131
+ this.l1TxUtils.estimateGas(senderAddress.toString(), {
132
+ to: this.rollupContract.address,
133
+ data
134
+ }),
135
+ this.l1TxUtils.getGasPrice(),
136
+ this.l1TxUtils.client.getBlock({
137
+ blockTag: 'latest'
138
+ })
139
+ ]);
140
+ const baseFeePerGas = latestBlock.baseFeePerGas ?? 0n;
141
+ const { maxPriorityFeePerGas } = gasPrice;
142
+ const effectiveFeePerGas = baseFeePerGas + maxPriorityFeePerGas;
143
+ const estimatedTotalFee = gasLimit * effectiveFeePerGas;
144
+ const stats = {
145
+ gasLimit,
146
+ baseFeePerGas,
147
+ maxPriorityFeePerGas,
148
+ estimatedTotalFee
149
+ };
150
+ this.log.info(`Estimated epoch proof submission cost (not submitted)`, {
151
+ epochNumber,
152
+ fromCheckpoint,
153
+ toCheckpoint,
154
+ gasLimit: gasLimit.toString(),
155
+ baseFeePerGas: formatGwei(baseFeePerGas),
156
+ maxPriorityFeePerGas: formatGwei(maxPriorityFeePerGas),
157
+ estimatedTotalFeeEth: formatEther(estimatedTotalFee)
158
+ });
159
+ this.metrics.recordEstimatedSubmitProof(stats);
160
+ }
161
+ encodeSubmitEpochProofCalldata(args) {
162
+ return encodeFunctionData({
163
+ abi: RollupAbi,
164
+ functionName: 'submitEpochRootProof',
165
+ args: [
166
+ this.getSubmitEpochProofArgs(args)
167
+ ]
168
+ });
169
+ }
131
170
  async sendSubmitEpochProofTx(args) {
132
171
  const txArgs = [
133
172
  this.getSubmitEpochProofArgs(args)
@@ -146,6 +185,8 @@ export class ProverNodePublisher {
146
185
  const { receipt } = await this.l1TxUtils.sendAndMonitorTransaction({
147
186
  to: this.rollupContract.address,
148
187
  data
188
+ }, {
189
+ txTimeoutAt: args.deadline
149
190
  });
150
191
  if (receipt.status !== 'success') {
151
192
  const errorMsg = await this.l1TxUtils.tryGetErrorFromRevertedTx(data, {
@@ -176,7 +217,7 @@ export class ProverNodePublisher {
176
217
  outHash: args.publicInputs.outHash.toString(),
177
218
  proverId: EthAddress.fromField(args.publicInputs.constants.proverId).toString()
178
219
  } /*_args*/ ,
179
- makeTuple(AZTEC_MAX_EPOCH_DURATION * 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()),
180
221
  getEthBlobEvaluationInputs(args.batchedBlobInputs)
181
222
  ];
182
223
  }
@@ -188,10 +229,107 @@ export class ProverNodePublisher {
188
229
  start: argsArray[0],
189
230
  end: argsArray[1],
190
231
  args: argsArray[2],
191
- fees: argsArray[3],
192
- attestations: new CommitteeAttestationsAndSigners(args.attestations.map((a)=>CommitteeAttestation.fromViem(a))).getPackedAttestations(),
232
+ headers: argsArray[3],
233
+ attestations: CommitteeAttestationsAndSigners.packAttestations(args.attestations.map((a)=>CommitteeAttestation.fromViem(a))),
193
234
  blobInputs: argsArray[4],
194
235
  proof: proofHex
195
236
  };
196
237
  }
197
238
  }
239
+ /**
240
+ * Decodes a `Root rollup public inputs mismatch`, fetches the on-chain CheckpointLog for any
241
+ * mismatching `checkpointHeaderHashes[i]`, emits a structured error log, and returns a thrown-ready
242
+ * Error with a human-readable summary.
243
+ *
244
+ * Layout of `RootRollupPublicInputs.toFields()`:
245
+ * [0] previousArchiveRoot
246
+ * [1] endArchiveRoot
247
+ * [2] outHash
248
+ * [3 .. 3+N-1] checkpointHeaderHashes[i] for i in 0..N-1 (N = MAX_CHECKPOINTS_PER_EPOCH)
249
+ * [3+N .. 3+3N-1] fees[i] = (recipient, value) for i in 0..N-1
250
+ * [3+3N .. 3+3N+4] EpochConstantData (chainId, version, vkTreeRoot, protocolContractsHash, proverId)
251
+ * [3+3N+5 ..] blobPublicInputs (FinalBlobAccumulator)
252
+ */ async function reportPublicInputsMismatch(input) {
253
+ const { rollupPublicInputs, argsPublicInputs, fromCheckpoint, toCheckpoint, rollupContract, log } = input;
254
+ const N = MAX_CHECKPOINTS_PER_EPOCH;
255
+ const constantsStart = 3 + 3 * N;
256
+ const blobStart = constantsStart + 5;
257
+ const constantLabels = [
258
+ 'chainId',
259
+ 'version',
260
+ 'vkTreeRoot',
261
+ 'protocolContractsHash',
262
+ 'proverId'
263
+ ];
264
+ const diffs = [];
265
+ const len = Math.max(rollupPublicInputs.length, argsPublicInputs.length);
266
+ for(let i = 0; i < len; i++){
267
+ const a = rollupPublicInputs[i] ?? Fr.ZERO;
268
+ const b = argsPublicInputs[i] ?? Fr.ZERO;
269
+ if (a.equals(b)) {
270
+ continue;
271
+ }
272
+ let label;
273
+ let checkpointIndex;
274
+ if (i === 0) {
275
+ label = 'previousArchiveRoot';
276
+ } else if (i === 1) {
277
+ label = 'endArchiveRoot';
278
+ } else if (i === 2) {
279
+ label = 'outHash';
280
+ } else if (i < 3 + N) {
281
+ checkpointIndex = i - 3;
282
+ label = `checkpointHeaderHashes[${checkpointIndex}]`;
283
+ } else if (i < 3 + 3 * N) {
284
+ const feePairIndex = i - (3 + N);
285
+ const feeIndex = Math.floor(feePairIndex / 2);
286
+ const sub = feePairIndex % 2 === 0 ? 'recipient' : 'value';
287
+ label = `fees[${feeIndex}].${sub}`;
288
+ } else if (i < blobStart) {
289
+ label = `constants.${constantLabels[i - constantsStart]}`;
290
+ } else {
291
+ label = `blobPublicInputs[${i - blobStart}]`;
292
+ }
293
+ diffs.push({
294
+ index: i,
295
+ label,
296
+ rollup: a,
297
+ computed: b,
298
+ checkpointIndex
299
+ });
300
+ }
301
+ // For each mismatching checkpointHeaderHash, fetch the L1 CheckpointLog so the operator can
302
+ // see what was published on-chain alongside the prover's recomputed hash.
303
+ const onChainCheckpoints = await Promise.all(diffs.filter((d)=>d.checkpointIndex !== undefined).map(async (d)=>{
304
+ const checkpointNumber = CheckpointNumber(fromCheckpoint + d.checkpointIndex);
305
+ try {
306
+ const cp = await rollupContract.getCheckpoint(checkpointNumber);
307
+ return {
308
+ checkpointIndex: d.checkpointIndex,
309
+ checkpointNumber,
310
+ headerHash: cp.headerHash.toString()
311
+ };
312
+ } catch (err) {
313
+ return {
314
+ checkpointIndex: d.checkpointIndex,
315
+ checkpointNumber,
316
+ error: err.message
317
+ };
318
+ }
319
+ }));
320
+ log.error(`Root rollup public inputs mismatch`, undefined, {
321
+ fromCheckpoint,
322
+ toCheckpoint,
323
+ numDiffs: diffs.length,
324
+ diffs: diffs.map((d)=>({
325
+ index: d.index,
326
+ label: d.label,
327
+ rollup: d.rollup.toString(),
328
+ computed: d.computed.toString()
329
+ })),
330
+ onChainCheckpoints
331
+ });
332
+ const fmt = (inputs)=>inputs.map((x)=>x.toString()).join(', ');
333
+ const summary = diffs.map((d)=>`[${d.index} ${d.label}] L1=${d.rollup} prover=${d.computed}`).join('\n');
334
+ return new Error(`Root rollup public inputs mismatch (${diffs.length} fields differ):\n${summary}\n` + `Rollup: ${fmt(rollupPublicInputs)}\nComputed:${fmt(argsPublicInputs)}`);
335
+ }
@@ -1,107 +1,155 @@
1
1
  import type { RollupContract } from '@aztec/ethereum/contracts';
2
- import { EpochNumber } from '@aztec/foundation/branded-types';
3
- import type { DataStoreConfig } from '@aztec/kv-store/config';
4
- import type { P2PClient } from '@aztec/p2p';
5
- import { PublicProcessorFactory } from '@aztec/simulator/server';
6
- import type { L2BlockSource } from '@aztec/stdlib/block';
2
+ import type { Delayer } from '@aztec/ethereum/l1-tx-utils';
3
+ import { BlockNumber, CheckpointNumber, EpochNumber } from '@aztec/foundation/branded-types';
4
+ import { DateProvider } from '@aztec/foundation/timer';
5
+ import type { EpochProverFactory } from '@aztec/prover-client';
6
+ import { ChonkCache } from '@aztec/prover-client/orchestrator';
7
+ import { type L2BlockSource, type L2BlockStreamEvent, type L2BlockStreamEventHandler } from '@aztec/stdlib/block';
7
8
  import type { ChainConfig } from '@aztec/stdlib/config';
8
9
  import type { ContractDataSource } from '@aztec/stdlib/contract';
9
- import { type EpochProverManager, type ProverNodeApi, type Service, type WorldStateSyncStatus, type WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server';
10
+ import { type L1RollupConstants } from '@aztec/stdlib/epoch-helpers';
11
+ import { type EpochProverManager, type EpochProvingJobState, EpochProvingJobTerminalState, type ITxProvider, type ProverNodeApi, type Service, type WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server';
12
+ import type { DataStoreConfig } from '@aztec/stdlib/kv-store';
10
13
  import type { L1ToL2MessageSource } from '@aztec/stdlib/messaging';
11
- import type { P2PClientType } from '@aztec/stdlib/p2p';
12
14
  import { L1Metrics, type TelemetryClient, type Traceable, type Tracer } from '@aztec/telemetry-client';
15
+ import { CheckpointStore } from './checkpoint-store.js';
13
16
  import type { SpecificProverNodeConfig } from './config.js';
14
- import type { EpochProvingJobData } from './job/epoch-proving-job-data.js';
15
- import { EpochProvingJob, type EpochProvingJobState } from './job/epoch-proving-job.js';
16
- import type { EpochMonitor, EpochMonitorHandler } from './monitors/epoch-monitor.js';
17
- import type { ProverNodePublisher } from './prover-node-publisher.js';
17
+ import type { EpochSession, EpochSessionHooks } from './job/epoch-session.js';
18
+ import { ProofPublishingService } from './proof-publishing-service.js';
18
19
  import type { ProverPublisherFactory } from './prover-publisher-factory.js';
20
+ import { SessionManager } from './session-manager.js';
19
21
  type ProverNodeOptions = SpecificProverNodeConfig & Partial<DataStoreOptions>;
20
22
  type DataStoreOptions = Pick<DataStoreConfig, 'dataDirectory'> & Pick<ChainConfig, 'l1ChainId' | 'rollupVersion'>;
21
23
  /**
22
- * An Aztec Prover Node is a standalone process that monitors the unfinalized chain on L1 for unproven epochs,
23
- * fetches their txs from the p2p network or external nodes, re-executes their public functions, creates a rollup
24
- * proof for the epoch, and submits it to L1.
24
+ * An Aztec Prover Node is a standalone process that monitors the chain for new checkpoints,
25
+ * starts proving them optimistically as they arrive, and submits epoch proofs to L1 once
26
+ * complete.
27
+ *
28
+ * The class is intentionally thin: it owns the long-lived collections (`CheckpointStore`,
29
+ * `ChonkCache`, `SessionManager`), the L2BlockStream, and a periodic ticker that nudges the
30
+ * manager to pick up newly-complete epochs. Every session lifecycle decision is delegated to
31
+ * the `SessionManager`. Each chain event is translated here into a single method call on it.
25
32
  */
26
- export declare class ProverNode implements EpochMonitorHandler, ProverNodeApi, Traceable {
27
- protected readonly prover: EpochProverManager;
33
+ export declare class ProverNode implements L2BlockStreamEventHandler, ProverNodeApi, Traceable {
34
+ protected readonly prover: EpochProverManager & EpochProverFactory;
28
35
  protected readonly publisherFactory: ProverPublisherFactory;
29
36
  protected readonly l2BlockSource: L2BlockSource & Partial<Service>;
30
37
  protected readonly l1ToL2MessageSource: L1ToL2MessageSource;
31
38
  protected readonly contractDataSource: ContractDataSource;
32
39
  protected readonly worldState: WorldStateSynchronizer;
33
- protected readonly p2pClient: Pick<P2PClient<P2PClientType.Prover>, 'getTxProvider'> & Partial<Service>;
34
- protected readonly epochsMonitor: EpochMonitor;
40
+ protected readonly p2pClient: {
41
+ getTxProvider(): ITxProvider;
42
+ } & Partial<Service>;
35
43
  protected readonly rollupContract: RollupContract;
36
44
  protected readonly l1Metrics: L1Metrics;
37
45
  protected readonly telemetryClient: TelemetryClient;
46
+ private delayer?;
47
+ private readonly dateProvider;
38
48
  private log;
39
- private dateProvider;
40
- private jobs;
41
- private config;
42
- private jobMetrics;
43
- private rewardsMetrics;
49
+ protected readonly checkpointStore: CheckpointStore;
50
+ protected readonly chonkCache: ChonkCache;
51
+ protected sessionManager: SessionManager | undefined;
52
+ private readonly config;
53
+ private readonly jobMetrics;
54
+ private readonly rewardsMetrics;
55
+ /** In-memory store for the L2BlockStream's local data provider. */
56
+ private tipsStore;
57
+ /** Block stream for checkpoint and reorg detection. */
58
+ private blockStream;
59
+ /**
60
+ * Highest epoch whose proof-submission window has passed. Monotonic high-water mark.
61
+ * Seeded from the last fully-proven epoch at start(); advanced on every block-stream
62
+ * event by comparing the archiver's latest synced L2 slot against each epoch's
63
+ * submission deadline. Protected so tests can verify the start() seeding.
64
+ */
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;
44
75
  readonly tracer: Tracer;
45
- protected publisher: ProverNodePublisher | undefined;
46
- constructor(prover: EpochProverManager, publisherFactory: ProverPublisherFactory, l2BlockSource: L2BlockSource & Partial<Service>, l1ToL2MessageSource: L1ToL2MessageSource, contractDataSource: ContractDataSource, worldState: WorldStateSynchronizer, p2pClient: Pick<P2PClient<P2PClientType.Prover>, 'getTxProvider'> & Partial<Service>, epochsMonitor: EpochMonitor, rollupContract: RollupContract, l1Metrics: L1Metrics, config?: Partial<ProverNodeOptions>, telemetryClient?: TelemetryClient);
76
+ protected publishingService: ProofPublishingService | undefined;
77
+ constructor(prover: EpochProverManager & EpochProverFactory, publisherFactory: ProverPublisherFactory, l2BlockSource: L2BlockSource & Partial<Service>, l1ToL2MessageSource: L1ToL2MessageSource, contractDataSource: ContractDataSource, worldState: WorldStateSynchronizer, p2pClient: {
78
+ getTxProvider(): ITxProvider;
79
+ } & Partial<Service>, rollupContract: RollupContract, l1Metrics: L1Metrics, config?: Partial<ProverNodeOptions>, telemetryClient?: TelemetryClient, delayer?: Delayer | undefined, dateProvider?: DateProvider);
47
80
  getProverId(): import("@aztec/foundation/eth-address").EthAddress;
48
- getP2P(): Pick<P2PClient<P2PClientType.Prover>, "getTxProvider"> & Partial<Service>;
81
+ getP2P(): {
82
+ getTxProvider(): ITxProvider;
83
+ } & Partial<Service>;
84
+ /** Test-only: the shared L1 tx delayer, if enabled. */
85
+ getDelayer(): Delayer | undefined;
86
+ /** Observability summary for the ProverNodeApi. */
87
+ getJobs(): Promise<{
88
+ uuid: string;
89
+ status: EpochProvingJobState;
90
+ epochNumber: EpochNumber;
91
+ }[]>;
92
+ /** Tests inspect this when validating reconcile behaviour. */
93
+ getCheckpointStore(): CheckpointStore;
94
+ /** Tests inspect this to verify chonk-cache release semantics. */
95
+ getChonkCache(): ChonkCache;
96
+ /** Tests inspect this when looking up live sessions. */
97
+ getSessionManager(): SessionManager;
98
+ /** Returns the underlying prover instance. */
99
+ getProver(): EpochProverManager & EpochProverFactory;
100
+ handleBlockStreamEvent(event: L2BlockStreamEvent): Promise<void>;
101
+ private processCheckpointJump;
102
+ private registerCheckpoint;
103
+ private collectRegisterData;
104
+ private handlePruneEvent;
105
+ private isEpochPastProofSubmissionWindow;
106
+ private checkEpochExpiry;
107
+ private expireEpoch;
49
108
  /**
50
- * Handles an epoch being completed by starting a proof for it if there are no active jobs for it.
51
- * @param epochNumber - The epoch number that was just completed.
52
- * @returns false if there is an error, true otherwise
109
+ * Schedules proving for the given epoch and returns the job id without waiting for completion.
53
110
  */
54
- handleEpochReadyToProve(epochNumber: EpochNumber): Promise<boolean>;
111
+ startProof(epochNumber: EpochNumber): Promise<string>;
112
+ start(): Promise<void>;
113
+ stop(): Promise<void>;
55
114
  /**
56
- * Starts the prover node so it periodically checks for unproven epochs in the unfinalized chain from L1 and
57
- * starts proving jobs for them.
115
+ * Constructs the session manager. Extracted so subclasses (test harness) can swap
116
+ * the implementation. Wired to `tryUploadSessionFailure` so failed sessions get
117
+ * their proving data uploaded.
58
118
  */
59
- start(): Promise<void>;
119
+ protected createSessionManager(publishingService: ProofPublishingService): SessionManager;
60
120
  /**
61
- * Stops the prover node and all its dependencies.
121
+ * Installs session hooks for the e2e harness to interpose around top-tree proving
122
+ * (gate, override, or observe it) without monkey-patching the orchestrator factory.
123
+ * Applies to every session constructed after this call.
62
124
  */
63
- stop(): Promise<void>;
64
- /** Returns world state status. */
65
- getWorldStateSyncStatus(): Promise<WorldStateSyncStatus>;
66
- /** Returns archiver status. */
67
- getL2Tips(): Promise<import("@aztec/stdlib/block").L2Tips>;
125
+ setSessionHooks(hooks: EpochSessionHooks): void;
126
+ /** Uploads failure snapshots when sessions exit with `failed`. Exposed as a method so tests can spy on it. */
127
+ tryUploadSessionFailure(session: EpochSession): Promise<string | undefined>;
128
+ private getL1Constants;
68
129
  /**
69
- * Starts a proving process and returns immediately.
130
+ * Returns true if every block in the given epoch is proven on L1. An epoch is only
131
+ * fully proven when its *last* block is proven. Protected for direct unit-test access.
70
132
  */
71
- startProof(epochNumber: EpochNumber): Promise<void>;
72
- private runJob;
73
- protected tryUploadEpochFailure(job: EpochProvingJob): Promise<string | undefined>;
133
+ protected isEpochFullyProven(epochNumber: EpochNumber, l1Constants: Pick<L1RollupConstants, 'epochDuration'>): Promise<boolean>;
134
+ /** Protected for direct unit-test access. */
135
+ protected isProvenBlockLastOfItsEpoch(provenBlockNumber: BlockNumber, provenEpoch: EpochNumber, l1Constants: Pick<L1RollupConstants, 'epochDuration'>): Promise<boolean>;
74
136
  /**
75
- * Returns the prover instance.
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).
76
141
  */
77
- getProver(): EpochProverManager;
142
+ protected resolveLastFullyProvenEpoch(): Promise<{
143
+ lastFullyProvenEpoch: EpochNumber | undefined;
144
+ }>;
78
145
  /**
79
- * Returns an array of jobs being processed.
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.
80
149
  */
81
- getJobs(): Promise<{
82
- uuid: string;
83
- status: EpochProvingJobState;
84
- epochNumber: EpochNumber;
85
- }[]>;
86
- protected getActiveJobsForEpoch(epochNumber: EpochNumber): Promise<{
87
- uuid: string;
88
- status: EpochProvingJobState;
89
- }[]>;
90
- private checkMaximumPendingJobs;
91
- private createProvingJob;
92
- private getL1Constants;
93
- private gatherEpochData;
94
- private gatherCheckpoints;
95
- private gatherTxs;
96
- private gatherMessages;
150
+ protected computeStartingCheckpoint(lastFullyProvenEpoch: EpochNumber | undefined): Promise<CheckpointNumber>;
97
151
  private gatherPreviousBlockHeader;
98
- /** Extracted for testing purposes. */
99
- protected doCreateEpochProvingJob(data: EpochProvingJobData, deadline: Date | undefined, publicProcessorFactory: PublicProcessorFactory, publisher: ProverNodePublisher, opts?: {
100
- skipEpochCheck?: boolean;
101
- }): EpochProvingJob;
102
- /** Extracted for testing purposes. */
103
- protected triggerMonitors(): Promise<void>;
104
152
  private validateConfig;
105
153
  }
106
- export {};
107
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmVyLW5vZGUuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9wcm92ZXItbm9kZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEtBQUssRUFBRSxjQUFjLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNoRSxPQUFPLEVBQWlDLFdBQVcsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBTTdGLE9BQU8sS0FBSyxFQUFFLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzlELE9BQU8sS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUM1QyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNqRSxPQUFPLEtBQUssRUFBRSxhQUFhLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUV6RCxPQUFPLEtBQUssRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN4RCxPQUFPLEtBQUssRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRWpFLE9BQU8sRUFDTCxLQUFLLGtCQUFrQixFQUV2QixLQUFLLGFBQWEsRUFDbEIsS0FBSyxPQUFPLEVBQ1osS0FBSyxvQkFBb0IsRUFDekIsS0FBSyxzQkFBc0IsRUFFNUIsTUFBTSxpQ0FBaUMsQ0FBQztBQUN6QyxPQUFPLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ25FLE9BQU8sS0FBSyxFQUFFLGFBQWEsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRXZELE9BQU8sRUFFTCxTQUFTLEVBQ1QsS0FBSyxlQUFlLEVBQ3BCLEtBQUssU0FBUyxFQUNkLEtBQUssTUFBTSxFQUdaLE1BQU0seUJBQXlCLENBQUM7QUFHakMsT0FBTyxLQUFLLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDNUQsT0FBTyxLQUFLLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUMzRSxP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
154
+ export { EpochProvingJobTerminalState };
155
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmVyLW5vZGUuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9wcm92ZXItbm9kZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEtBQUssRUFBRSxjQUFjLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNoRSxPQUFPLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsV0FBVyxFQUFFLGdCQUFnQixFQUFFLFdBQVcsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBSzdGLE9BQU8sRUFBRSxZQUFZLEVBQWtCLE1BQU0seUJBQXlCLENBQUM7QUFDdkUsT0FBTyxLQUFLLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUUvRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFFL0QsT0FBTyxFQUdMLEtBQUssYUFBYSxFQUNsQixLQUFLLGtCQUFrQixFQUN2QixLQUFLLHlCQUF5QixFQUUvQixNQUFNLHFCQUFxQixDQUFDO0FBRTdCLE9BQU8sS0FBSyxFQUFFLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3hELE9BQU8sS0FBSyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDakUsT0FBTyxFQUFFLEtBQUssaUJBQWlCLEVBQW1ELE1BQU0sNkJBQTZCLENBQUM7QUFDdEgsT0FBTyxFQUNMLEtBQUssa0JBQWtCLEVBQ3ZCLEtBQUssb0JBQW9CLEVBQ3pCLDRCQUE0QixFQUM1QixLQUFLLFdBQVcsRUFDaEIsS0FBSyxhQUFhLEVBQ2xCLEtBQUssT0FBTyxFQUNaLEtBQUssc0JBQXNCLEVBRTVCLE1BQU0saUNBQWlDLENBQUM7QUFDekMsT0FBTyxLQUFLLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDOUQsT0FBTyxLQUFLLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUVuRSxPQUFP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
@@ -1 +1 @@
1
- {"version":3,"file":"prover-node.d.ts","sourceRoot":"","sources":["../src/prover-node.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"prover-node.d.ts","sourceRoot":"","sources":["../src/prover-node.ts"],"names":[],"mappings":"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"}