@aztec/prover-node 3.0.0-canary.a9708bd → 3.0.0-devnet.2-patch.1

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 (48) hide show
  1. package/dest/actions/download-epoch-proving-job.d.ts +4 -4
  2. package/dest/actions/index.d.ts +1 -1
  3. package/dest/actions/rerun-epoch-proving-job.d.ts +2 -2
  4. package/dest/actions/upload-epoch-proof-failure.d.ts +1 -1
  5. package/dest/bin/run-failed-epoch.d.ts +1 -1
  6. package/dest/bin/run-failed-epoch.js +1 -1
  7. package/dest/config.d.ts +4 -2
  8. package/dest/config.d.ts.map +1 -1
  9. package/dest/config.js +19 -14
  10. package/dest/factory.d.ts +2 -2
  11. package/dest/factory.d.ts.map +1 -1
  12. package/dest/factory.js +18 -7
  13. package/dest/index.d.ts +1 -1
  14. package/dest/job/epoch-proving-job-data.d.ts +8 -6
  15. package/dest/job/epoch-proving-job-data.d.ts.map +1 -1
  16. package/dest/job/epoch-proving-job-data.js +25 -18
  17. package/dest/job/epoch-proving-job.d.ts +11 -16
  18. package/dest/job/epoch-proving-job.d.ts.map +1 -1
  19. package/dest/job/epoch-proving-job.js +107 -65
  20. package/dest/metrics.d.ts +4 -3
  21. package/dest/metrics.d.ts.map +1 -1
  22. package/dest/metrics.js +9 -3
  23. package/dest/monitors/epoch-monitor.d.ts +5 -2
  24. package/dest/monitors/epoch-monitor.d.ts.map +1 -1
  25. package/dest/monitors/epoch-monitor.js +10 -1
  26. package/dest/monitors/index.d.ts +1 -1
  27. package/dest/prover-node-publisher.d.ts +9 -10
  28. package/dest/prover-node-publisher.d.ts.map +1 -1
  29. package/dest/prover-node-publisher.js +51 -52
  30. package/dest/prover-node.d.ts +8 -7
  31. package/dest/prover-node.d.ts.map +1 -1
  32. package/dest/prover-node.js +39 -32
  33. package/dest/prover-publisher-factory.d.ts +6 -2
  34. package/dest/prover-publisher-factory.d.ts.map +1 -1
  35. package/dest/prover-publisher-factory.js +6 -0
  36. package/dest/test/index.d.ts +1 -1
  37. package/dest/test/index.d.ts.map +1 -1
  38. package/package.json +26 -25
  39. package/src/bin/run-failed-epoch.ts +2 -2
  40. package/src/config.ts +30 -29
  41. package/src/factory.ts +22 -14
  42. package/src/job/epoch-proving-job-data.ts +31 -25
  43. package/src/job/epoch-proving-job.ts +138 -82
  44. package/src/metrics.ts +16 -4
  45. package/src/monitors/epoch-monitor.ts +15 -5
  46. package/src/prover-node-publisher.ts +73 -72
  47. package/src/prover-node.ts +51 -44
  48. package/src/prover-publisher-factory.ts +12 -1
@@ -4,15 +4,20 @@ function _ts_decorate(decorators, target, key, desc) {
4
4
  else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
5
  return c > 3 && r && Object.defineProperty(target, key, r), r;
6
6
  }
7
- import { BatchedBlob, Blob } from '@aztec/blob-lib';
8
7
  import { NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP } from '@aztec/constants';
9
8
  import { asyncPool } from '@aztec/foundation/async-pool';
9
+ import { BlockNumber } from '@aztec/foundation/branded-types';
10
10
  import { padArrayEnd } from '@aztec/foundation/collection';
11
- import { Fr } from '@aztec/foundation/fields';
11
+ import { Fr } from '@aztec/foundation/curves/bn254';
12
12
  import { createLogger } from '@aztec/foundation/log';
13
13
  import { RunningPromise, promiseWithResolvers } from '@aztec/foundation/promise';
14
14
  import { Timer } from '@aztec/foundation/timer';
15
+ import { getVKTreeRoot } from '@aztec/noir-protocol-circuits-types/vk-tree';
16
+ import { protocolContractsHash } from '@aztec/protocol-contracts';
17
+ import { buildFinalBlobChallenges } from '@aztec/prover-client/helpers';
18
+ import { PublicSimulatorConfig } from '@aztec/stdlib/avm';
15
19
  import { EpochProvingJobTerminalState } from '@aztec/stdlib/interfaces/server';
20
+ import { CheckpointConstantData } from '@aztec/stdlib/rollup';
16
21
  import { MerkleTreeId } from '@aztec/stdlib/trees';
17
22
  import { Attributes, trackSpan } from '@aztec/telemetry-client';
18
23
  import * as crypto from 'node:crypto';
@@ -72,8 +77,8 @@ import { validateEpochProvingJobData } from './epoch-proving-job-data.js';
72
77
  get epochNumber() {
73
78
  return this.data.epochNumber;
74
79
  }
75
- get blocks() {
76
- return this.data.blocks;
80
+ get checkpoints() {
81
+ return this.data.checkpoints;
77
82
  }
78
83
  get txs() {
79
84
  return this.data.txs;
@@ -89,17 +94,18 @@ import { validateEpochProvingJobData } from './epoch-proving-job-data.js';
89
94
  await this.scheduleEpochCheck();
90
95
  }
91
96
  const attestations = this.attestations.map((attestation)=>attestation.toViem());
92
- const epochNumber = Number(this.epochNumber);
93
- const epochSizeBlocks = this.blocks.length;
94
- const epochSizeTxs = this.blocks.reduce((total, current)=>total + current.body.txEffects.length, 0);
95
- const [fromBlock, toBlock] = [
96
- this.blocks[0].number,
97
- this.blocks.at(-1).number
98
- ];
99
- this.log.info(`Starting epoch ${epochNumber} proving job with blocks ${fromBlock} to ${toBlock}`, {
97
+ const epochNumber = this.epochNumber;
98
+ const epochSizeCheckpoints = this.checkpoints.length;
99
+ const epochSizeBlocks = this.checkpoints.reduce((accum, checkpoint)=>accum + checkpoint.blocks.length, 0);
100
+ const epochSizeTxs = this.checkpoints.reduce((accum, checkpoint)=>accum + checkpoint.blocks.reduce((accumC, block)=>accumC + block.body.txEffects.length, 0), 0);
101
+ const fromCheckpoint = this.checkpoints[0].number;
102
+ const toCheckpoint = this.checkpoints.at(-1).number;
103
+ const fromBlock = this.checkpoints[0].blocks[0].number;
104
+ const toBlock = this.checkpoints.at(-1).blocks.at(-1).number;
105
+ this.log.info(`Starting epoch ${epochNumber} proving job with checkpoints ${fromCheckpoint} to ${toCheckpoint}`, {
100
106
  fromBlock,
101
107
  toBlock,
102
- epochSizeBlocks,
108
+ epochSizeTxs,
103
109
  epochNumber,
104
110
  uuid: this.uuid
105
111
  });
@@ -108,42 +114,75 @@ import { validateEpochProvingJobData } from './epoch-proving-job-data.js';
108
114
  const { promise, resolve } = promiseWithResolvers();
109
115
  this.runPromise = promise;
110
116
  try {
111
- const allBlobs = (await Promise.all(this.blocks.map(async (block)=>await Blob.getBlobsPerBlock(block.body.toBlobFields())))).flat();
112
- const finalBlobBatchingChallenges = await BatchedBlob.precomputeBatchedBlobChallenges(allBlobs);
113
- this.prover.startNewEpoch(epochNumber, fromBlock, epochSizeBlocks, finalBlobBatchingChallenges);
114
- await this.prover.startTubeCircuits(Array.from(this.txs.values()));
115
- await asyncPool(this.config.parallelBlockLimit ?? 32, this.blocks, async (block)=>{
117
+ const blobFieldsPerCheckpoint = this.checkpoints.map((checkpoint)=>checkpoint.toBlobFields());
118
+ const finalBlobBatchingChallenges = await buildFinalBlobChallenges(blobFieldsPerCheckpoint);
119
+ this.prover.startNewEpoch(epochNumber, epochSizeCheckpoints, finalBlobBatchingChallenges);
120
+ await this.prover.startChonkVerifierCircuits(Array.from(this.txs.values()));
121
+ // Everything in the epoch should have the same chainId and version.
122
+ const { chainId, version } = this.checkpoints[0].blocks[0].header.globalVariables;
123
+ const previousBlockHeaders = this.gatherPreviousBlockHeaders();
124
+ await asyncPool(this.config.parallelBlockLimit ?? 32, this.checkpoints, async (checkpoint)=>{
116
125
  this.checkState();
117
- const globalVariables = block.header.globalVariables;
118
- const txs = this.getTxs(block);
119
- const l1ToL2Messages = this.getL1ToL2Messages(block);
120
- const previousHeader = this.getBlockHeader(block.number - 1);
121
- this.log.verbose(`Starting processing block ${block.number}`, {
122
- number: block.number,
123
- blockHash: (await block.hash()).toString(),
124
- lastArchive: block.header.lastArchive.root,
125
- noteHashTreeRoot: block.header.state.partial.noteHashTree.root,
126
- nullifierTreeRoot: block.header.state.partial.nullifierTree.root,
127
- publicDataTreeRoot: block.header.state.partial.publicDataTree.root,
128
- previousHeader: previousHeader.hash(),
129
- uuid: this.uuid,
130
- ...globalVariables
126
+ const checkpointIndex = checkpoint.number - fromCheckpoint;
127
+ const checkpointConstants = CheckpointConstantData.from({
128
+ chainId,
129
+ version,
130
+ vkTreeRoot: getVKTreeRoot(),
131
+ protocolContractsHash: protocolContractsHash,
132
+ proverId: this.prover.getProverId().toField(),
133
+ slotNumber: checkpoint.header.slotNumber,
134
+ coinbase: checkpoint.header.coinbase,
135
+ feeRecipient: checkpoint.header.feeRecipient,
136
+ gasFees: checkpoint.header.gasFees
131
137
  });
132
- // Start block proving
133
- await this.prover.startNewBlock(globalVariables, l1ToL2Messages, previousHeader);
134
- // Process public fns
135
- const db = await this.createFork(block.number - 1, l1ToL2Messages);
136
- const publicProcessor = this.publicProcessorFactory.create(db, globalVariables, true);
137
- const processed = await this.processTxs(publicProcessor, txs);
138
- await this.prover.addTxs(processed);
139
- await db.close();
140
- this.log.verbose(`Processed all ${txs.length} txs for block ${block.number}`, {
141
- blockNumber: block.number,
142
- blockHash: (await block.hash()).toString(),
138
+ const previousHeader = previousBlockHeaders[checkpointIndex];
139
+ const l1ToL2Messages = this.getL1ToL2Messages(checkpoint);
140
+ this.log.verbose(`Starting processing checkpoint ${checkpoint.number}`, {
141
+ number: checkpoint.number,
142
+ checkpointHash: checkpoint.hash().toString(),
143
+ lastArchive: checkpoint.header.lastArchiveRoot,
144
+ previousHeader: previousHeader.hash(),
143
145
  uuid: this.uuid
144
146
  });
145
- // Mark block as completed to pad it
146
- await this.prover.setBlockCompleted(block.number, block.header);
147
+ await this.prover.startNewCheckpoint(checkpointIndex, checkpointConstants, l1ToL2Messages, checkpoint.blocks.length, previousHeader);
148
+ for (const block of checkpoint.blocks){
149
+ const globalVariables = block.header.globalVariables;
150
+ const txs = this.getTxs(block);
151
+ this.log.verbose(`Starting processing block ${block.number}`, {
152
+ number: block.number,
153
+ blockHash: (await block.hash()).toString(),
154
+ lastArchive: block.header.lastArchive.root,
155
+ noteHashTreeRoot: block.header.state.partial.noteHashTree.root,
156
+ nullifierTreeRoot: block.header.state.partial.nullifierTree.root,
157
+ publicDataTreeRoot: block.header.state.partial.publicDataTree.root,
158
+ ...globalVariables,
159
+ numTxs: txs.length
160
+ });
161
+ // Start block proving
162
+ await this.prover.startNewBlock(block.number, globalVariables.timestamp, txs.length);
163
+ // Process public fns
164
+ const db = await this.createFork(BlockNumber(block.number - 1), l1ToL2Messages);
165
+ const config = PublicSimulatorConfig.from({
166
+ proverId: this.prover.getProverId().toField(),
167
+ skipFeeEnforcement: false,
168
+ collectDebugLogs: false,
169
+ collectHints: true,
170
+ collectPublicInputs: true,
171
+ collectStatistics: false
172
+ });
173
+ const publicProcessor = this.publicProcessorFactory.create(db, globalVariables, config);
174
+ const processed = await this.processTxs(publicProcessor, txs);
175
+ await this.prover.addTxs(processed);
176
+ await db.close();
177
+ this.log.verbose(`Processed all ${txs.length} txs for block ${block.number}`, {
178
+ blockNumber: block.number,
179
+ blockHash: (await block.hash()).toString(),
180
+ uuid: this.uuid
181
+ });
182
+ // Mark block as completed to pad it
183
+ const expectedBlockHeader = block.header;
184
+ await this.prover.setBlockCompleted(block.number, expectedBlockHeader);
185
+ }
147
186
  });
148
187
  const executionTime = timer.ms();
149
188
  this.progressState('awaiting-prover');
@@ -154,9 +193,15 @@ import { validateEpochProvingJobData } from './epoch-proving-job-data.js';
154
193
  duration: timer.ms()
155
194
  });
156
195
  this.progressState('publishing-proof');
196
+ if (this.config.skipSubmitProof) {
197
+ this.log.info(`Proof publishing is disabled. Dropping valid proof for epoch ${epochNumber} (checkpoints ${fromCheckpoint} to ${toCheckpoint})`);
198
+ this.state = 'completed';
199
+ this.metrics.recordProvingJob(executionTime, timer.ms(), epochSizeCheckpoints, epochSizeBlocks, epochSizeTxs);
200
+ return;
201
+ }
157
202
  const success = await this.publisher.submitEpochProof({
158
- fromBlock,
159
- toBlock,
203
+ fromCheckpoint,
204
+ toCheckpoint,
160
205
  epochNumber,
161
206
  publicInputs,
162
207
  proof,
@@ -166,12 +211,12 @@ import { validateEpochProvingJobData } from './epoch-proving-job-data.js';
166
211
  if (!success) {
167
212
  throw new Error('Failed to submit epoch proof to L1');
168
213
  }
169
- this.log.info(`Submitted proof for epoch ${epochNumber} (blocks ${fromBlock} to ${toBlock})`, {
214
+ this.log.info(`Submitted proof for epoch ${epochNumber} (checkpoints ${fromCheckpoint} to ${toCheckpoint})`, {
170
215
  epochNumber,
171
216
  uuid: this.uuid
172
217
  });
173
218
  this.state = 'completed';
174
- this.metrics.recordProvingJob(executionTime, timer.ms(), epochSizeBlocks, epochSizeTxs);
219
+ this.metrics.recordProvingJob(executionTime, timer.ms(), epochSizeCheckpoints, epochSizeBlocks, epochSizeTxs);
175
220
  } catch (err) {
176
221
  if (err && err.name === 'HaltExecutionError') {
177
222
  this.log.warn(`Halted execution of epoch ${epochNumber} prover job`, {
@@ -203,7 +248,7 @@ import { validateEpochProvingJobData } from './epoch-proving-job-data.js';
203
248
  const l1ToL2MessagesPadded = padArrayEnd(l1ToL2Messages, Fr.ZERO, NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP, 'Too many L1 to L2 messages');
204
249
  this.log.verbose(`Creating fork at ${blockNumber} with ${l1ToL2Messages.length} L1 to L2 messages`, {
205
250
  blockNumber,
206
- l1ToL2Messages: l1ToL2MessagesPadded.map((m)=>m.toString())
251
+ l1ToL2Messages: l1ToL2Messages.map((m)=>m.toString())
207
252
  });
208
253
  await db.appendLeaves(MerkleTreeId.L1_TO_L2_MESSAGE_TREE, l1ToL2MessagesPadded);
209
254
  return db;
@@ -220,7 +265,6 @@ import { validateEpochProvingJobData } from './epoch-proving-job-data.js';
220
265
  async stop(state = 'stopped') {
221
266
  this.state = state;
222
267
  this.prover.cancel();
223
- // TODO(palla/prover): Stop the publisher as well
224
268
  if (this.runPromise) {
225
269
  await this.runPromise;
226
270
  }
@@ -262,8 +306,9 @@ import { validateEpochProvingJobData } from './epoch-proving-job-data.js';
262
306
  this.epochCheckPromise = new RunningPromise(async ()=>{
263
307
  const blocks = await l2BlockSource.getBlockHeadersForEpoch(this.epochNumber);
264
308
  const blockHashes = await Promise.all(blocks.map((block)=>block.hash()));
265
- const thisBlockHashes = await Promise.all(this.blocks.map((block)=>block.hash()));
266
- if (blocks.length !== this.blocks.length || !blockHashes.every((block, i)=>block.equals(thisBlockHashes[i]))) {
309
+ const thisBlocks = this.checkpoints.flatMap((checkpoint)=>checkpoint.blocks);
310
+ const thisBlockHashes = await Promise.all(thisBlocks.map((block)=>block.hash()));
311
+ if (blocks.length !== thisBlocks.length || !blockHashes.every((block, i)=>block.equals(thisBlockHashes[i]))) {
267
312
  this.log.warn('Epoch blocks changed underfoot', {
268
313
  uuid: this.uuid,
269
314
  epochNumber: this.epochNumber,
@@ -275,21 +320,18 @@ import { validateEpochProvingJobData } from './epoch-proving-job-data.js';
275
320
  }, this.log, intervalMs).start();
276
321
  this.log.verbose(`Scheduled epoch check for epoch ${this.epochNumber} every ${intervalMs}ms`);
277
322
  }
278
- /* Returns the header for the given block number based on the epoch proving job data. */ getBlockHeader(blockNumber) {
279
- const block = this.blocks.find((b)=>b.number === blockNumber);
280
- if (block) {
281
- return block.header;
282
- }
283
- if (blockNumber === Number(this.data.previousBlockHeader.getBlockNumber())) {
284
- return this.data.previousBlockHeader;
285
- }
286
- throw new Error(`Block header not found for block number ${blockNumber} (got ${this.blocks.map((b)=>b.number).join(', ')} and previous header ${this.data.previousBlockHeader.getBlockNumber()})`);
323
+ /* Returns the last block header in the previous checkpoint for all checkpoints in the epoch */ gatherPreviousBlockHeaders() {
324
+ const lastBlocks = this.checkpoints.map((checkpoint)=>checkpoint.blocks.at(-1));
325
+ return [
326
+ this.data.previousBlockHeader,
327
+ ...lastBlocks.map((block)=>block.header).slice(0, -1)
328
+ ];
287
329
  }
288
330
  getTxs(block) {
289
331
  return block.body.txEffects.map((txEffect)=>this.txs.get(txEffect.txHash.toString()));
290
332
  }
291
- getL1ToL2Messages(block) {
292
- return this.data.l1ToL2Messages[block.number];
333
+ getL1ToL2Messages(checkpoint) {
334
+ return this.data.l1ToL2Messages[checkpoint.number];
293
335
  }
294
336
  async processTxs(publicProcessor, txs) {
295
337
  const { deadline } = this;
@@ -309,7 +351,7 @@ import { validateEpochProvingJobData } from './epoch-proving-job-data.js';
309
351
  _ts_decorate([
310
352
  trackSpan('EpochProvingJob.run', function() {
311
353
  return {
312
- [Attributes.EPOCH_NUMBER]: Number(this.data.epochNumber)
354
+ [Attributes.EPOCH_NUMBER]: this.data.epochNumber
313
355
  };
314
356
  })
315
357
  ], EpochProvingJob.prototype, "run", null);
package/dest/metrics.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import type { RollupContract } from '@aztec/ethereum';
1
+ import type { RollupContract } from '@aztec/ethereum/contracts';
2
2
  import type { EthAddress } from '@aztec/foundation/eth-address';
3
3
  import type { L1PublishProofStats } from '@aztec/stdlib/stats';
4
4
  import { type Gauge, type Histogram, type Meter, type TelemetryClient, type Tracer, type UpDownCounter } from '@aztec/telemetry-client';
@@ -8,10 +8,11 @@ export declare class ProverNodeJobMetrics {
8
8
  private logger;
9
9
  proverEpochExecutionDuration: Histogram;
10
10
  provingJobDuration: Histogram;
11
+ provingJobCheckpoints: Gauge;
11
12
  provingJobBlocks: Gauge;
12
13
  provingJobTransactions: Gauge;
13
14
  constructor(meter: Meter, tracer: Tracer, logger?: import("@aztec/foundation/log").Logger);
14
- recordProvingJob(executionTimeMs: number, totalTimeMs: number, numBlocks: number, numTxs: number): void;
15
+ recordProvingJob(executionTimeMs: number, totalTimeMs: number, numCheckpoints: number, numBlocks: number, numTxs: number): void;
15
16
  }
16
17
  export declare class ProverNodeRewardsMetrics {
17
18
  private meter;
@@ -47,4 +48,4 @@ export declare class ProverNodePublisherMetrics {
47
48
  recordSenderBalance(wei: bigint, senderAddress: string): void;
48
49
  private recordTx;
49
50
  }
50
- //# sourceMappingURL=metrics.d.ts.map
51
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0cmljcy5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL21ldHJpY3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsY0FBYyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDaEUsT0FBTyxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFaEUsT0FBTyxLQUFLLEVBQUUsbUJBQW1CLEVBQWtCLE1BQU0scUJBQXFCLENBQUM7QUFDL0UsT0FBTyxFQUdMLEtBQUssS0FBSyxFQUNWLEtBQUssU0FBUyxFQUNkLEtBQUssS0FBSyxFQUdWLEtBQUssZUFBZSxFQUNwQixLQUFLLE1BQU0sRUFDWCxLQUFLLGFBQWEsRUFFbkIsTUFBTSx5QkFBeUIsQ0FBQztBQUlqQyxxQkFBYSxvQkFBb0I7SUFRN0IsT0FBTyxDQUFDLEtBQUs7YUFDRyxNQUFNLEVBQUUsTUFBTTtJQUM5QixPQUFPLENBQUMsTUFBTTtJQVRoQiw0QkFBNEIsRUFBRSxTQUFTLENBQUM7SUFDeEMsa0JBQWtCLEVBQUUsU0FBUyxDQUFDO0lBQzlCLHFCQUFxQixFQUFFLEtBQUssQ0FBQztJQUM3QixnQkFBZ0IsRUFBRSxLQUFLLENBQUM7SUFDeEIsc0JBQXNCLEVBQUUsS0FBSyxDQUFDO0lBRTlCLFlBQ1UsS0FBSyxFQUFFLEtBQUssRUFDSixNQUFNLEVBQUUsTUFBTSxFQUN0QixNQUFNLHlDQUFnRCxFQXdCL0Q7SUFFTSxnQkFBZ0IsQ0FDckIsZUFBZSxFQUFFLE1BQU0sRUFDdkIsV0FBVyxFQUFFLE1BQU0sRUFDbkIsY0FBYyxFQUFFLE1BQU0sRUFDdEIsU0FBUyxFQUFFLE1BQU0sRUFDakIsTUFBTSxFQUFFLE1BQU0sUUFPZjtDQUNGO0FBRUQscUJBQWEsd0JBQXdCO0lBT2pDLE9BQU8sQ0FBQyxLQUFLO0lBQ2IsT0FBTyxDQUFDLFFBQVE7SUFDaEIsT0FBTyxDQUFDLE1BQU07SUFDZCxPQUFPLENBQUMsTUFBTTtJQVRoQixPQUFPLENBQUMsT0FBTyxDQUFrQjtJQUNqQyxPQUFPLENBQUMsa0JBQWtCLENBQWdCO0lBQzFDLE9BQU8sQ0FBQyxTQUFTLENBQU87SUFDeEIsT0FBTyxDQUFDLHFCQUFxQixDQUFLO0lBRWxDLFlBQ1UsS0FBSyxFQUFFLEtBQUssRUFDWixRQUFRLEVBQUUsVUFBVSxFQUNwQixNQUFNLEVBQUUsY0FBYyxFQUN0QixNQUFNLHlDQUFnRCxFQVcvRDtJQUVZLEtBQUssa0JBSWpCO0lBRU0sSUFBSSxTQUVWO0lBRUQsT0FBTyxDQUFDLE9BQU8sQ0F3QmI7Q0FDSDtBQUVELHFCQUFhLDBCQUEwQjthQWVuQixNQUFNLEVBQUUsZUFBZTtJQUV2QyxPQUFPLENBQUMsTUFBTTtJQWhCaEIsUUFBUSxFQUFFLFNBQVMsQ0FBQztJQUNwQixPQUFPLEVBQUUsYUFBYSxDQUFDO0lBQ3ZCLFVBQVUsRUFBRSxTQUFTLENBQUM7SUFDdEIsS0FBSyxFQUFFLFNBQVMsQ0FBQztJQUNqQixjQUFjLEVBQUUsU0FBUyxDQUFDO0lBQzFCLGFBQWEsRUFBRSxTQUFTLENBQUM7SUFDekIsaUJBQWlCLEVBQUUsU0FBUyxDQUFDO0lBQzdCLGlCQUFpQixFQUFFLFNBQVMsQ0FBQztJQUM3QixVQUFVLEVBQUUsU0FBUyxDQUFDO0lBRXRCLE9BQU8sQ0FBQyxhQUFhLENBQVE7SUFDN0IsT0FBTyxDQUFDLEtBQUssQ0FBUTtJQUVyQixZQUNrQixNQUFNLEVBQUUsZUFBZSxFQUN2QyxJQUFJLFNBQWUsRUFDWCxNQUFNLHlDQUFnRCxFQWtFL0Q7SUFFRCxjQUFjLFNBS2I7SUFFRCxpQkFBaUIsQ0FBQyxVQUFVLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxtQkFBbUIsUUFFL0Q7SUFFTSxtQkFBbUIsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxNQUFNLFFBSzVEO0lBRUQsT0FBTyxDQUFDLFFBQVE7Q0F1Q2pCIn0=
@@ -1 +1 @@
1
- {"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../src/metrics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAEhE,OAAO,KAAK,EAAE,mBAAmB,EAAkB,MAAM,qBAAqB,CAAC;AAC/E,OAAO,EAGL,KAAK,KAAK,EACV,KAAK,SAAS,EACd,KAAK,KAAK,EAGV,KAAK,eAAe,EACpB,KAAK,MAAM,EACX,KAAK,aAAa,EAEnB,MAAM,yBAAyB,CAAC;AAIjC,qBAAa,oBAAoB;IAO7B,OAAO,CAAC,KAAK;aACG,MAAM,EAAE,MAAM;IAC9B,OAAO,CAAC,MAAM;IARhB,4BAA4B,EAAE,SAAS,CAAC;IACxC,kBAAkB,EAAE,SAAS,CAAC;IAC9B,gBAAgB,EAAE,KAAK,CAAC;IACxB,sBAAsB,EAAE,KAAK,CAAC;gBAGpB,KAAK,EAAE,KAAK,EACJ,MAAM,EAAE,MAAM,EACtB,MAAM,yCAAgD;IAsBzD,gBAAgB,CAAC,eAAe,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;CAMxG;AAED,qBAAa,wBAAwB;IAOjC,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,MAAM;IAThB,OAAO,CAAC,OAAO,CAAkB;IACjC,OAAO,CAAC,kBAAkB,CAAgB;IAC1C,OAAO,CAAC,SAAS,CAAO;IACxB,OAAO,CAAC,qBAAqB,CAAK;gBAGxB,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,UAAU,EACpB,MAAM,EAAE,cAAc,EACtB,MAAM,yCAAgD;IAanD,KAAK;IAMX,IAAI;IAIX,OAAO,CAAC,OAAO,CAwBb;CACH;AAED,qBAAa,0BAA0B;aAenB,MAAM,EAAE,eAAe;IAEvC,OAAO,CAAC,MAAM;IAhBhB,QAAQ,EAAE,SAAS,CAAC;IACpB,OAAO,EAAE,aAAa,CAAC;IACvB,UAAU,EAAE,SAAS,CAAC;IACtB,KAAK,EAAE,SAAS,CAAC;IACjB,cAAc,EAAE,SAAS,CAAC;IAC1B,aAAa,EAAE,SAAS,CAAC;IACzB,iBAAiB,EAAE,SAAS,CAAC;IAC7B,iBAAiB,EAAE,SAAS,CAAC;IAC7B,UAAU,EAAE,SAAS,CAAC;IAEtB,OAAO,CAAC,aAAa,CAAQ;IAC7B,OAAO,CAAC,KAAK,CAAQ;gBAGH,MAAM,EAAE,eAAe,EACvC,IAAI,SAAe,EACX,MAAM,yCAAgD;IAoEhE,cAAc;IAOd,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,mBAAmB;IAIzD,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM;IAO7D,OAAO,CAAC,QAAQ;CAuCjB"}
1
+ {"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../src/metrics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAEhE,OAAO,KAAK,EAAE,mBAAmB,EAAkB,MAAM,qBAAqB,CAAC;AAC/E,OAAO,EAGL,KAAK,KAAK,EACV,KAAK,SAAS,EACd,KAAK,KAAK,EAGV,KAAK,eAAe,EACpB,KAAK,MAAM,EACX,KAAK,aAAa,EAEnB,MAAM,yBAAyB,CAAC;AAIjC,qBAAa,oBAAoB;IAQ7B,OAAO,CAAC,KAAK;aACG,MAAM,EAAE,MAAM;IAC9B,OAAO,CAAC,MAAM;IAThB,4BAA4B,EAAE,SAAS,CAAC;IACxC,kBAAkB,EAAE,SAAS,CAAC;IAC9B,qBAAqB,EAAE,KAAK,CAAC;IAC7B,gBAAgB,EAAE,KAAK,CAAC;IACxB,sBAAsB,EAAE,KAAK,CAAC;IAE9B,YACU,KAAK,EAAE,KAAK,EACJ,MAAM,EAAE,MAAM,EACtB,MAAM,yCAAgD,EAwB/D;IAEM,gBAAgB,CACrB,eAAe,EAAE,MAAM,EACvB,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,MAAM,EACtB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,QAOf;CACF;AAED,qBAAa,wBAAwB;IAOjC,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,MAAM;IAThB,OAAO,CAAC,OAAO,CAAkB;IACjC,OAAO,CAAC,kBAAkB,CAAgB;IAC1C,OAAO,CAAC,SAAS,CAAO;IACxB,OAAO,CAAC,qBAAqB,CAAK;IAElC,YACU,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,UAAU,EACpB,MAAM,EAAE,cAAc,EACtB,MAAM,yCAAgD,EAW/D;IAEY,KAAK,kBAIjB;IAEM,IAAI,SAEV;IAED,OAAO,CAAC,OAAO,CAwBb;CACH;AAED,qBAAa,0BAA0B;aAenB,MAAM,EAAE,eAAe;IAEvC,OAAO,CAAC,MAAM;IAhBhB,QAAQ,EAAE,SAAS,CAAC;IACpB,OAAO,EAAE,aAAa,CAAC;IACvB,UAAU,EAAE,SAAS,CAAC;IACtB,KAAK,EAAE,SAAS,CAAC;IACjB,cAAc,EAAE,SAAS,CAAC;IAC1B,aAAa,EAAE,SAAS,CAAC;IACzB,iBAAiB,EAAE,SAAS,CAAC;IAC7B,iBAAiB,EAAE,SAAS,CAAC;IAC7B,UAAU,EAAE,SAAS,CAAC;IAEtB,OAAO,CAAC,aAAa,CAAQ;IAC7B,OAAO,CAAC,KAAK,CAAQ;IAErB,YACkB,MAAM,EAAE,eAAe,EACvC,IAAI,SAAe,EACX,MAAM,yCAAgD,EAkE/D;IAED,cAAc,SAKb;IAED,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,mBAAmB,QAE/D;IAEM,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,QAK5D;IAED,OAAO,CAAC,QAAQ;CAuCjB"}
package/dest/metrics.js CHANGED
@@ -7,6 +7,7 @@ export class ProverNodeJobMetrics {
7
7
  logger;
8
8
  proverEpochExecutionDuration;
9
9
  provingJobDuration;
10
+ provingJobCheckpoints;
10
11
  provingJobBlocks;
11
12
  provingJobTransactions;
12
13
  constructor(meter, tracer, logger = createLogger('prover-node:publisher:metrics')){
@@ -23,6 +24,10 @@ export class ProverNodeJobMetrics {
23
24
  unit: 's',
24
25
  valueType: ValueType.DOUBLE
25
26
  });
27
+ this.provingJobCheckpoints = this.meter.createGauge(Metrics.PROVER_NODE_JOB_CHECKPOINTS, {
28
+ description: 'Number of checkpoints in a proven epoch',
29
+ valueType: ValueType.INT
30
+ });
26
31
  this.provingJobBlocks = this.meter.createGauge(Metrics.PROVER_NODE_JOB_BLOCKS, {
27
32
  description: 'Number of blocks in a proven epoch',
28
33
  valueType: ValueType.INT
@@ -32,9 +37,10 @@ export class ProverNodeJobMetrics {
32
37
  valueType: ValueType.INT
33
38
  });
34
39
  }
35
- recordProvingJob(executionTimeMs, totalTimeMs, numBlocks, numTxs) {
40
+ recordProvingJob(executionTimeMs, totalTimeMs, numCheckpoints, numBlocks, numTxs) {
36
41
  this.proverEpochExecutionDuration.record(Math.ceil(executionTimeMs));
37
42
  this.provingJobDuration.record(totalTimeMs / 1000);
43
+ this.provingJobCheckpoints.record(Math.floor(numCheckpoints));
38
44
  this.provingJobBlocks.record(Math.floor(numBlocks));
39
45
  this.provingJobTransactions.record(Math.floor(numTxs));
40
46
  }
@@ -56,12 +62,12 @@ export class ProverNodeRewardsMetrics {
56
62
  this.prevEpoch = -1n;
57
63
  this.proofSubmissionEpochs = 0;
58
64
  this.observe = async (observer)=>{
59
- const epoch = await this.rollup.getEpochNumber();
65
+ const epoch = await this.rollup.getCurrentEpochNumber();
60
66
  if (epoch > this.proofSubmissionEpochs) {
61
67
  // look at the prev epoch so that we get an accurate value, after proof submission window has closed
62
68
  // For example, if proof submission window is 1 epoch, and we are in epoch 2, we should be looking at epoch 0.
63
69
  // Similarly, if the proof submission window is 0, and we are in epoch 1, we should be looking at epoch 0.
64
- const closedEpoch = epoch - BigInt(this.proofSubmissionEpochs) - 1n;
70
+ const closedEpoch = BigInt(epoch) - BigInt(this.proofSubmissionEpochs) - 1n;
65
71
  const rewards = await this.rollup.getSpecificProverRewardsForEpoch(closedEpoch, this.coinbase);
66
72
  const fmt = parseFloat(formatUnits(rewards, 18));
67
73
  observer.observe(this.rewards, fmt, {
@@ -1,8 +1,9 @@
1
+ import { EpochNumber } from '@aztec/foundation/branded-types';
1
2
  import type { L2BlockSource } from '@aztec/stdlib/block';
2
3
  import { type L1RollupConstants } from '@aztec/stdlib/epoch-helpers';
3
4
  import { type TelemetryClient, type Traceable, type Tracer } from '@aztec/telemetry-client';
4
5
  export interface EpochMonitorHandler {
5
- handleEpochReadyToProve(epochNumber: bigint): Promise<boolean>;
6
+ handleEpochReadyToProve(epochNumber: EpochNumber): Promise<boolean>;
6
7
  }
7
8
  /**
8
9
  * Fires an event when a new epoch ready to prove is detected.
@@ -26,9 +27,11 @@ export declare class EpochMonitor implements Traceable {
26
27
  private latestEpochNumber;
27
28
  constructor(l2BlockSource: L2BlockSource, l1Constants: Pick<L1RollupConstants, 'epochDuration'>, options: {
28
29
  pollingIntervalMs: number;
30
+ provingDelayMs?: number;
29
31
  }, telemetry?: TelemetryClient);
30
32
  static create(l2BlockSource: L2BlockSource, options: {
31
33
  pollingIntervalMs: number;
34
+ provingDelayMs?: number;
32
35
  }, telemetry?: TelemetryClient): Promise<EpochMonitor>;
33
36
  start(handler: EpochMonitorHandler): void;
34
37
  /** Exposed for testing */
@@ -37,4 +40,4 @@ export declare class EpochMonitor implements Traceable {
37
40
  work(): Promise<void>;
38
41
  private getEpochNumberToProve;
39
42
  }
40
- //# sourceMappingURL=epoch-monitor.d.ts.map
43
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXBvY2gtbW9uaXRvci5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21vbml0b3JzL2Vwb2NoLW1vbml0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFlLFdBQVcsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBSTNFLE9BQU8sS0FBSyxFQUFFLGFBQWEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxLQUFLLGlCQUFpQixFQUFrQixNQUFNLDZCQUE2QixDQUFDO0FBQ3JGLE9BQU8sRUFDTCxLQUFLLGVBQWUsRUFDcEIsS0FBSyxTQUFTLEVBQ2QsS0FBSyxNQUFNLEVBR1osTUFBTSx5QkFBeUIsQ0FBQztBQUVqQyxNQUFNLFdBQVcsbUJBQW1CO0lBQ2xDLHVCQUF1QixDQUFDLFdBQVcsRUFBRSxXQUFXLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0NBQ3JFO0FBRUQ7Ozs7Ozs7Ozs7R0FVRztBQUNILHFCQUFhLFlBQWEsWUFBVyxTQUFTO0lBUzFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsYUFBYTtJQUM5QixPQUFPLENBQUMsUUFBUSxDQUFDLFdBQVc7SUFDNUIsT0FBTyxDQUFDLE9BQU87SUFWakIsT0FBTyxDQUFDLGNBQWMsQ0FBaUI7SUFDdkMsT0FBTyxDQUFDLEdBQUcsQ0FBNkM7SUFDeEQsU0FBZ0IsTUFBTSxFQUFFLE1BQU0sQ0FBQztJQUUvQixPQUFPLENBQUMsT0FBTyxDQUFrQztJQUNqRCxPQUFPLENBQUMsaUJBQWlCLENBQTBCO0lBRW5ELFlBQ21CLGFBQWEsRUFBRSxhQUFhLEVBQzVCLFdBQVcsRUFBRSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsZUFBZSxDQUFDLEVBQzlELE9BQU8sRUFBRTtRQUFFLGlCQUFpQixFQUFFLE1BQU0sQ0FBQztRQUFDLGNBQWMsQ0FBQyxFQUFFLE1BQU0sQ0FBQTtLQUFFLEVBQ3ZFLFNBQVMsR0FBRSxlQUFzQyxFQU9sRDtJQUVELE9BQW9CLE1BQU0sQ0FDeEIsYUFBYSxFQUFFLGFBQWEsRUFDNUIsT0FBTyxFQUFFO1FBQUUsaUJBQWlCLEVBQUUsTUFBTSxDQUFDO1FBQUMsY0FBYyxDQUFDLEVBQUUsTUFBTSxDQUFBO0tBQUUsRUFDL0QsU0FBUyxHQUFFLGVBQXNDLEdBQ2hELE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FHdkI7SUFFTSxLQUFLLENBQUMsT0FBTyxFQUFFLG1CQUFtQixRQUl4QztJQUVELDBCQUEwQjtJQUNuQixVQUFVLENBQUMsT0FBTyxFQUFFLG1CQUFtQixRQUU3QztJQUVZLElBQUksa0JBR2hCO0lBR1ksSUFBSSxrQkEyQmhCO1lBRWEscUJBQXFCO0NBWXBDIn0=
@@ -1 +1 @@
1
- {"version":3,"file":"epoch-monitor.d.ts","sourceRoot":"","sources":["../../src/monitors/epoch-monitor.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,KAAK,iBAAiB,EAAkB,MAAM,6BAA6B,CAAC;AACrF,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,SAAS,EACd,KAAK,MAAM,EAGZ,MAAM,yBAAyB,CAAC;AAEjC,MAAM,WAAW,mBAAmB;IAClC,uBAAuB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAChE;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,CAAqB;gBAG3B,aAAa,EAAE,aAAa,EAC5B,WAAW,EAAE,IAAI,CAAC,iBAAiB,EAAE,eAAe,CAAC,EAC9D,OAAO,EAAE;QAAE,iBAAiB,EAAE,MAAM,CAAA;KAAE,EAC9C,SAAS,GAAE,eAAsC;WAM/B,MAAM,CACxB,aAAa,EAAE,aAAa,EAC5B,OAAO,EAAE;QAAE,iBAAiB,EAAE,MAAM,CAAA;KAAE,EACtC,SAAS,GAAE,eAAsC,GAChD,OAAO,CAAC,YAAY,CAAC;IAKjB,KAAK,CAAC,OAAO,EAAE,mBAAmB;IAMzC,0BAA0B;IACnB,UAAU,CAAC,OAAO,EAAE,mBAAmB;IAIjC,IAAI;IAMJ,IAAI;YAwBH,qBAAqB;CAYpC"}
1
+ {"version":3,"file":"epoch-monitor.d.ts","sourceRoot":"","sources":["../../src/monitors/epoch-monitor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAI3E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,KAAK,iBAAiB,EAAkB,MAAM,6BAA6B,CAAC;AACrF,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,SAAS,EACd,KAAK,MAAM,EAGZ,MAAM,yBAAyB,CAAC;AAEjC,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;IAGY,IAAI,kBA2BhB;YAEa,qBAAqB;CAYpC"}
@@ -4,8 +4,10 @@ function _ts_decorate(decorators, target, key, desc) {
4
4
  else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
5
  return c > 3 && r && Object.defineProperty(target, key, r), r;
6
6
  }
7
+ import { BlockNumber } from '@aztec/foundation/branded-types';
7
8
  import { createLogger } from '@aztec/foundation/log';
8
9
  import { RunningPromise } from '@aztec/foundation/running-promise';
10
+ import { sleep } from '@aztec/foundation/sleep';
9
11
  import { getEpochAtSlot } from '@aztec/stdlib/epoch-helpers';
10
12
  import { getTelemetryClient, trackSpan } from '@aztec/telemetry-client';
11
13
  /**
@@ -34,6 +36,9 @@ import { getTelemetryClient, trackSpan } from '@aztec/telemetry-client';
34
36
  this.log = createLogger('prover-node:epoch-monitor');
35
37
  this.tracer = telemetry.getTracer('EpochMonitor');
36
38
  this.runningPromise = new RunningPromise(this.work.bind(this), this.log, this.options.pollingIntervalMs);
39
+ if (this.options.provingDelayMs) {
40
+ this.log.warn(`Prover node epoch monitor running with delay of ${this.options.provingDelayMs}ms`);
41
+ }
37
42
  }
38
43
  static async create(l2BlockSource, options, telemetry = getTelemetryClient()) {
39
44
  const l1Constants = await l2BlockSource.getL1Constants();
@@ -80,6 +85,10 @@ import { getTelemetryClient, trackSpan } from '@aztec/telemetry-client';
80
85
  });
81
86
  return;
82
87
  }
88
+ if (this.options.provingDelayMs) {
89
+ this.log.debug(`Waiting ${this.options.provingDelayMs}ms before proving epoch ${epochToProve}`);
90
+ await sleep(this.options.provingDelayMs);
91
+ }
83
92
  this.log.debug(`Epoch ${epochToProve} is ready to be proven`);
84
93
  if (await this.handler?.handleEpochReadyToProve(epochToProve)) {
85
94
  this.latestEpochNumber = epochToProve;
@@ -87,7 +96,7 @@ import { getTelemetryClient, trackSpan } from '@aztec/telemetry-client';
87
96
  }
88
97
  async getEpochNumberToProve() {
89
98
  const lastBlockProven = await this.l2BlockSource.getProvenBlockNumber();
90
- const firstBlockToProve = lastBlockProven + 1;
99
+ const firstBlockToProve = BlockNumber(lastBlockProven + 1);
91
100
  const firstBlockHeaderToProve = await this.l2BlockSource.getBlockHeader(firstBlockToProve);
92
101
  if (!firstBlockHeaderToProve) {
93
102
  return {
@@ -1,2 +1,2 @@
1
1
  export * from './epoch-monitor.js';
2
- //# sourceMappingURL=index.d.ts.map
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tb25pdG9ycy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLG9CQUFvQixDQUFDIn0=
@@ -1,8 +1,10 @@
1
- import { type BatchedBlob } from '@aztec/blob-lib';
1
+ import { BatchedBlob } from '@aztec/blob-lib';
2
2
  import { AZTEC_MAX_EPOCH_DURATION } from '@aztec/constants';
3
- import { type L1TxUtils, type RollupContract, type ViemCommitteeAttestation } from '@aztec/ethereum';
3
+ import type { RollupContract, ViemCommitteeAttestation } from '@aztec/ethereum/contracts';
4
+ import type { L1TxUtils } from '@aztec/ethereum/l1-tx-utils';
5
+ import { CheckpointNumber, EpochNumber } from '@aztec/foundation/branded-types';
6
+ import { Fr } from '@aztec/foundation/curves/bn254';
4
7
  import { EthAddress } from '@aztec/foundation/eth-address';
5
- import { Fr } from '@aztec/foundation/fields';
6
8
  import type { Tuple } from '@aztec/foundation/serialize';
7
9
  import type { PublisherConfig, TxSenderConfig } from '@aztec/sequencer-client';
8
10
  import type { Proof } from '@aztec/stdlib/proofs';
@@ -20,8 +22,6 @@ export type L1SubmitEpochProofArgs = {
20
22
  proof: Proof;
21
23
  };
22
24
  export declare class ProverNodePublisher {
23
- private interruptibleSleep;
24
- private sleepTimeMs;
25
25
  private interrupted;
26
26
  private metrics;
27
27
  protected log: import("@aztec/foundation/log").Logger;
@@ -44,9 +44,9 @@ export declare class ProverNodePublisher {
44
44
  restart(): void;
45
45
  getSenderAddress(): EthAddress;
46
46
  submitEpochProof(args: {
47
- epochNumber: number;
48
- fromBlock: number;
49
- toBlock: number;
47
+ epochNumber: EpochNumber;
48
+ fromCheckpoint: CheckpointNumber;
49
+ toCheckpoint: CheckpointNumber;
50
50
  publicInputs: RootRollupPublicInputs;
51
51
  proof: Proof;
52
52
  batchedBlobInputs: BatchedBlob;
@@ -56,6 +56,5 @@ export declare class ProverNodePublisher {
56
56
  private sendSubmitEpochProofTx;
57
57
  private getEpochProofPublicInputsArgs;
58
58
  private getSubmitEpochProofArgs;
59
- protected sleepOrInterrupted(): Promise<void>;
60
59
  }
61
- //# sourceMappingURL=prover-node-publisher.d.ts.map
60
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmVyLW5vZGUtcHVibGlzaGVyLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcHJvdmVyLW5vZGUtcHVibGlzaGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQThCLE1BQU0saUJBQWlCLENBQUM7QUFDMUUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDNUQsT0FBTyxLQUFLLEVBQUUsY0FBYyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDMUYsT0FBTyxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFFN0QsT0FBTyxFQUFFLGdCQUFnQixFQUFFLFdBQVcsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRWhGLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNwRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFM0QsT0FBTyxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFHekQsT0FBTyxLQUFLLEVBQUUsZUFBZSxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRS9FLE9BQU8sS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sS0FBSyxFQUFFLFlBQVksRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRWpGLE9BQU8sRUFBRSxLQUFLLGVBQWUsRUFBc0IsTUFBTSx5QkFBeUIsQ0FBQztBQU9uRixzRUFBc0U7QUFDdEUsTUFBTSxNQUFNLHNCQUFzQixHQUFHO0lBQ25DLFNBQVMsRUFBRSxNQUFNLENBQUM7SUFDbEIsZUFBZSxFQUFFLEVBQUUsQ0FBQztJQUNwQixVQUFVLEVBQUUsRUFBRSxDQUFDO0lBQ2YsWUFBWSxFQUFFLEVBQUUsQ0FBQztJQUNqQixPQUFPLEVBQUUsRUFBRSxDQUFDO0lBQ1osUUFBUSxFQUFFLEVBQUUsQ0FBQztJQUNiLElBQUksRUFBRSxLQUFLLENBQUMsWUFBWSxFQUFFLE9BQU8sd0JBQXdCLENBQUMsQ0FBQztJQUMzRCxLQUFLLEVBQUUsS0FBSyxDQUFDO0NBQ2QsQ0FBQztBQUVGLHFCQUFhLG1CQUFtQjtJQUM5QixPQUFPLENBQUMsV0FBVyxDQUFTO0lBQzVCLE9BQU8sQ0FBQyxPQUFPLENBQTZCO0lBRTVDLFNBQVMsQ0FBQyxHQUFHLHlDQUErQztJQUU1RCxTQUFTLENBQUMsY0FBYyxFQUFFLGNBQWMsQ0FBQztJQUV6QyxTQUFnQixTQUFTLEVBQUUsU0FBUyxDQUFDO0lBRXJDLFlBQ0UsTUFBTSxFQUFFLGNBQWMsR0FBRyxlQUFlLEVBQ3hDLElBQUksRUFBRTtRQUNKLGNBQWMsRUFBRSxjQUFjLENBQUM7UUFDL0IsU0FBUyxFQUFFLFNBQVMsQ0FBQztRQUNyQixTQUFTLENBQUMsRUFBRSxlQUFlLENBQUM7S0FDN0IsRUFRRjtJQUVNLGlCQUFpQixtQkFFdkI7SUFFRDs7Ozs7T0FLRztJQUNJLFNBQVMsU0FHZjtJQUVELHdEQUF3RDtJQUNqRCxPQUFPLFNBR2I7SUFFTSxnQkFBZ0IsZUFFdEI7SUFFWSxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUU7UUFDbEMsV0FBVyxFQUFFLFdBQVcsQ0FBQztRQUN6QixjQUFjLEVBQUUsZ0JBQWdCLENBQUM7UUFDakMsWUFBWSxFQUFFLGdCQUFnQixDQUFDO1FBQy9CLFlBQVksRUFBRSxzQkFBc0IsQ0FBQztRQUNyQyxLQUFLLEVBQUUsS0FBSyxDQUFDO1FBQ2IsaUJBQWlCLEVBQUUsV0FBVyxDQUFDO1FBQy9CLFlBQVksRUFBRSx3QkFBd0IsRUFBRSxDQUFDO0tBQzFDLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQWlEbkI7WUFFYSw0QkFBNEI7WUErRDVCLHNCQUFzQjtJQTRDcEMsT0FBTyxDQUFDLDZCQUE2QjtJQXlCckMsT0FBTyxDQUFDLHVCQUF1QjtDQXVCaEMifQ==
@@ -1 +1 @@
1
- {"version":3,"file":"prover-node-publisher.d.ts","sourceRoot":"","sources":["../src/prover-node-publisher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,WAAW,EAAoC,MAAM,iBAAiB,CAAC;AACrF,OAAO,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EACL,KAAK,SAAS,EACd,KAAK,cAAc,EAEnB,KAAK,wBAAwB,EAC9B,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAC3D,OAAO,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAC;AAE9C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAC;AAIzD,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC/E,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,KAAK,EAAE,YAAY,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAEjF,OAAO,EAAE,KAAK,eAAe,EAAsB,MAAM,yBAAyB,CAAC;AAOnF,sEAAsE;AACtE,MAAM,MAAM,sBAAsB,GAAG;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,EAAE,CAAC;IACpB,UAAU,EAAE,EAAE,CAAC;IACf,YAAY,EAAE,EAAE,CAAC;IACjB,OAAO,EAAE,EAAE,CAAC;IACZ,QAAQ,EAAE,EAAE,CAAC;IACb,IAAI,EAAE,KAAK,CAAC,YAAY,EAAE,OAAO,wBAAwB,CAAC,CAAC;IAC3D,KAAK,EAAE,KAAK,CAAC;CACd,CAAC;AAEF,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,kBAAkB,CAA4B;IACtD,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,OAAO,CAA6B;IAE5C,SAAS,CAAC,GAAG,yCAA+C;IAE5D,SAAS,CAAC,cAAc,EAAE,cAAc,CAAC;IAEzC,SAAgB,SAAS,EAAE,SAAS,CAAC;gBAGnC,MAAM,EAAE,cAAc,GAAG,eAAe,EACxC,IAAI,EAAE;QACJ,cAAc,EAAE,cAAc,CAAC;QAC/B,SAAS,EAAE,SAAS,CAAC;QACrB,SAAS,CAAC,EAAE,eAAe,CAAC;KAC7B;IAYI,iBAAiB;IAIxB;;;;;OAKG;IACI,SAAS;IAKhB,wDAAwD;IACjD,OAAO;IAIP,gBAAgB;IAIV,gBAAgB,CAAC,IAAI,EAAE;QAClC,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;QAChB,YAAY,EAAE,sBAAsB,CAAC;QACrC,KAAK,EAAE,KAAK,CAAC;QACb,iBAAiB,EAAE,WAAW,CAAC;QAC/B,YAAY,EAAE,wBAAwB,EAAE,CAAC;KAC1C,GAAG,OAAO,CAAC,OAAO,CAAC;YAkDN,4BAA4B;YA0D5B,sBAAsB;IAyCpC,OAAO,CAAC,6BAA6B;IAyBrC,OAAO,CAAC,uBAAuB;cAsBf,kBAAkB;CAGnC"}
1
+ {"version":3,"file":"prover-node-publisher.d.ts","sourceRoot":"","sources":["../src/prover-node-publisher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAA8B,MAAM,iBAAiB,CAAC;AAC1E,OAAO,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,KAAK,EAAE,cAAc,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAC1F,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAE7D,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAEhF,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAE3D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAC;AAGzD,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAE/E,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,KAAK,EAAE,YAAY,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAEjF,OAAO,EAAE,KAAK,eAAe,EAAsB,MAAM,yBAAyB,CAAC;AAOnF,sEAAsE;AACtE,MAAM,MAAM,sBAAsB,GAAG;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,EAAE,CAAC;IACpB,UAAU,EAAE,EAAE,CAAC;IACf,YAAY,EAAE,EAAE,CAAC;IACjB,OAAO,EAAE,EAAE,CAAC;IACZ,QAAQ,EAAE,EAAE,CAAC;IACb,IAAI,EAAE,KAAK,CAAC,YAAY,EAAE,OAAO,wBAAwB,CAAC,CAAC;IAC3D,KAAK,EAAE,KAAK,CAAC;CACd,CAAC;AAEF,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,OAAO,CAA6B;IAE5C,SAAS,CAAC,GAAG,yCAA+C;IAE5D,SAAS,CAAC,cAAc,EAAE,cAAc,CAAC;IAEzC,SAAgB,SAAS,EAAE,SAAS,CAAC;IAErC,YACE,MAAM,EAAE,cAAc,GAAG,eAAe,EACxC,IAAI,EAAE;QACJ,cAAc,EAAE,cAAc,CAAC;QAC/B,SAAS,EAAE,SAAS,CAAC;QACrB,SAAS,CAAC,EAAE,eAAe,CAAC;KAC7B,EAQF;IAEM,iBAAiB,mBAEvB;IAED;;;;;OAKG;IACI,SAAS,SAGf;IAED,wDAAwD;IACjD,OAAO,SAGb;IAEM,gBAAgB,eAEtB;IAEY,gBAAgB,CAAC,IAAI,EAAE;QAClC,WAAW,EAAE,WAAW,CAAC;QACzB,cAAc,EAAE,gBAAgB,CAAC;QACjC,YAAY,EAAE,gBAAgB,CAAC;QAC/B,YAAY,EAAE,sBAAsB,CAAC;QACrC,KAAK,EAAE,KAAK,CAAC;QACb,iBAAiB,EAAE,WAAW,CAAC;QAC/B,YAAY,EAAE,wBAAwB,EAAE,CAAC;KAC1C,GAAG,OAAO,CAAC,OAAO,CAAC,CAiDnB;YAEa,4BAA4B;YA+D5B,sBAAsB;IA4CpC,OAAO,CAAC,6BAA6B;IAyBrC,OAAO,CAAC,uBAAuB;CAuBhC"}