@aztec/prover-node 0.65.2 → 0.67.0

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 (37) hide show
  1. package/dest/bond/bond-manager.d.ts.map +1 -1
  2. package/dest/bond/bond-manager.js +3 -3
  3. package/dest/bond/token-contract.d.ts.map +1 -1
  4. package/dest/bond/token-contract.js +3 -3
  5. package/dest/config.d.ts +4 -1
  6. package/dest/config.d.ts.map +1 -1
  7. package/dest/config.js +6 -1
  8. package/dest/factory.d.ts +2 -2
  9. package/dest/factory.d.ts.map +1 -1
  10. package/dest/factory.js +7 -6
  11. package/dest/job/epoch-proving-job.d.ts +7 -4
  12. package/dest/job/epoch-proving-job.d.ts.map +1 -1
  13. package/dest/job/epoch-proving-job.js +27 -34
  14. package/dest/metrics.d.ts.map +1 -1
  15. package/dest/metrics.js +2 -5
  16. package/dest/monitors/claims-monitor.d.ts.map +1 -1
  17. package/dest/monitors/claims-monitor.js +3 -3
  18. package/dest/monitors/epoch-monitor.d.ts.map +1 -1
  19. package/dest/monitors/epoch-monitor.js +3 -3
  20. package/dest/prover-cache/cache_manager.d.ts.map +1 -1
  21. package/dest/prover-cache/cache_manager.js +3 -3
  22. package/dest/prover-coordination/factory.js +3 -3
  23. package/dest/prover-node.d.ts +5 -2
  24. package/dest/prover-node.d.ts.map +1 -1
  25. package/dest/prover-node.js +19 -13
  26. package/package.json +20 -16
  27. package/src/bond/bond-manager.ts +2 -2
  28. package/src/bond/token-contract.ts +2 -2
  29. package/src/config.ts +14 -7
  30. package/src/factory.ts +9 -8
  31. package/src/job/epoch-proving-job.ts +26 -46
  32. package/src/metrics.ts +1 -4
  33. package/src/monitors/claims-monitor.ts +2 -2
  34. package/src/monitors/epoch-monitor.ts +2 -2
  35. package/src/prover-cache/cache_manager.ts +2 -2
  36. package/src/prover-coordination/factory.ts +2 -2
  37. package/src/prover-node.ts +23 -23
@@ -1,6 +1,6 @@
1
1
  import { BBCircuitVerifier, TestCircuitVerifier } from '@aztec/bb-prover';
2
2
  import { createAztecNodeClient } from '@aztec/circuit-types';
3
- import { createDebugLogger } from '@aztec/foundation/log';
3
+ import { createLogger } from '@aztec/foundation/log';
4
4
  import { createP2PClient } from '@aztec/p2p';
5
5
  /**
6
6
  * Creates a prover coordination service.
@@ -9,7 +9,7 @@ import { createP2PClient } from '@aztec/p2p';
9
9
  * If an aztec node is provided, it is returned directly.
10
10
  */
11
11
  export async function createProverCoordination(config, deps) {
12
- const log = createDebugLogger('aztec:createProverCoordination');
12
+ const log = createLogger('prover-node:prover-coordination');
13
13
  if (deps.aztecNodeTxProvider) {
14
14
  log.info('Using prover coordination via aztec node');
15
15
  return deps.aztecNodeTxProvider;
@@ -32,4 +32,4 @@ export async function createProverCoordination(config, deps) {
32
32
  throw new Error(`Aztec Node URL for Tx Provider is not set.`);
33
33
  }
34
34
  }
35
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFjdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wcm92ZXItY29vcmRpbmF0aW9uL2ZhY3RvcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLGlCQUFpQixFQUFFLG1CQUFtQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDMUUsT0FBTyxFQUF3RCxxQkFBcUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ25ILE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRTFELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFhN0M7Ozs7O0dBS0c7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLHdCQUF3QixDQUM1QyxNQUEwQyxFQUMxQyxJQUE0QjtJQUU1QixNQUFNLEdBQUcsR0FBRyxpQkFBaUIsQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO0lBRWhFLElBQUksSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFDN0IsR0FBRyxDQUFDLElBQUksQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO1FBQ3JELE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDO0lBQ2xDLENBQUM7SUFFRCxJQUFJLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUN0QixHQUFHLENBQUMsSUFBSSxDQUFDLG1DQUFtQyxDQUFDLENBQUM7UUFFOUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQyxJQUFJLENBQUMsc0JBQXNCLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDdEUsTUFBTSxJQUFJLEtBQUssQ0FBQyxrREFBa0QsQ0FBQyxDQUFDO1FBQ3RFLENBQUM7UUFFRCxNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxNQUFNLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxtQkFBbUIsRUFBRSxDQUFDO1FBQzFHLE1BQU0sU0FBUyxHQUFHLE1BQU0sZUFBZSxDQUNyQyxNQUFNLEVBQ04sSUFBSSxDQUFDLFFBQVEsRUFDYixhQUFhLEVBQ2IsSUFBSSxDQUFDLHNCQUFzQixFQUMzQixJQUFJLENBQUMsU0FBUyxDQUNmLENBQUM7UUFDRixNQUFNLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUV4QixPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQsSUFBSSxNQUFNLENBQUMseUJBQXlCLEVBQUUsQ0FBQztRQUNyQyxHQUFHLENBQUMsSUFBSSxDQUFDLHdDQUF3QyxDQUFDLENBQUM7UUFDbkQsT0FBTyxxQkFBcUIsQ0FBQyxNQUFNLENBQUMseUJBQXlCLENBQUMsQ0FBQztJQUNqRSxDQUFDO1NBQU0sQ0FBQztRQUNOLE1BQU0sSUFBSSxLQUFLLENBQUMsNENBQTRDLENBQUMsQ0FBQztJQUNoRSxDQUFDO0FBQ0gsQ0FBQyJ9
35
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFjdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wcm92ZXItY29vcmRpbmF0aW9uL2ZhY3RvcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLGlCQUFpQixFQUFFLG1CQUFtQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDMUUsT0FBTyxFQUF3RCxxQkFBcUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ25ILE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUVyRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBYTdDOzs7OztHQUtHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSx3QkFBd0IsQ0FDNUMsTUFBMEMsRUFDMUMsSUFBNEI7SUFFNUIsTUFBTSxHQUFHLEdBQUcsWUFBWSxDQUFDLGlDQUFpQyxDQUFDLENBQUM7SUFFNUQsSUFBSSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUM3QixHQUFHLENBQUMsSUFBSSxDQUFDLDBDQUEwQyxDQUFDLENBQUM7UUFDckQsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUM7SUFDbEMsQ0FBQztJQUVELElBQUksTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3RCLEdBQUcsQ0FBQyxJQUFJLENBQUMsbUNBQW1DLENBQUMsQ0FBQztRQUU5QyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUN0RSxNQUFNLElBQUksS0FBSyxDQUFDLGtEQUFrRCxDQUFDLENBQUM7UUFDdEUsQ0FBQztRQUVELE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLE1BQU0saUJBQWlCLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLG1CQUFtQixFQUFFLENBQUM7UUFDMUcsTUFBTSxTQUFTLEdBQUcsTUFBTSxlQUFlLENBQ3JDLE1BQU0sRUFDTixJQUFJLENBQUMsUUFBUSxFQUNiLGFBQWEsRUFDYixJQUFJLENBQUMsc0JBQXNCLEVBQzNCLElBQUksQ0FBQyxTQUFTLENBQ2YsQ0FBQztRQUNGLE1BQU0sU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBRXhCLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFRCxJQUFJLE1BQU0sQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO1FBQ3JDLEdBQUcsQ0FBQyxJQUFJLENBQUMsd0NBQXdDLENBQUMsQ0FBQztRQUNuRCxPQUFPLHFCQUFxQixDQUFDLE1BQU0sQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO0lBQ2pFLENBQUM7U0FBTSxDQUFDO1FBQ04sTUFBTSxJQUFJLEtBQUssQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7QUFDSCxDQUFDIn0=
@@ -1,6 +1,7 @@
1
- import { type EpochProofClaim, type EpochProofQuote, type EpochProverManager, type L1ToL2MessageSource, type L2Block, type L2BlockSource, type MerkleTreeWriteOperations, type ProverCache, type ProverCoordination, type ProverNodeApi, type Service, type WorldStateSynchronizer } from '@aztec/circuit-types';
1
+ import { type EpochProofClaim, type EpochProofQuote, type EpochProverManager, type L1ToL2MessageSource, type L2Block, type L2BlockSource, type ProverCache, type ProverCoordination, type ProverNodeApi, type Service, type WorldStateSynchronizer } from '@aztec/circuit-types';
2
2
  import { type ContractDataSource } from '@aztec/circuits.js';
3
3
  import { type Maybe } from '@aztec/foundation/types';
4
+ import { type P2P } from '@aztec/p2p';
4
5
  import { type L1Publisher } from '@aztec/sequencer-client';
5
6
  import { PublicProcessorFactory } from '@aztec/simulator';
6
7
  import { type TelemetryClient } from '@aztec/telemetry-client';
@@ -14,6 +15,7 @@ import { type QuoteSigner } from './quote-signer.js';
14
15
  export type ProverNodeOptions = {
15
16
  pollingIntervalMs: number;
16
17
  maxPendingJobs: number;
18
+ maxParallelBlocksPerEpoch: number;
17
19
  };
18
20
  /**
19
21
  * An Aztec Prover Node is a standalone process that monitors the unfinalised chain on L1 for unproven blocks,
@@ -42,6 +44,7 @@ export declare class ProverNode implements ClaimsMonitorHandler, EpochMonitorHan
42
44
  private options;
43
45
  private metrics;
44
46
  constructor(prover: EpochProverManager, publisher: L1Publisher, l2BlockSource: L2BlockSource & Maybe<Service>, l1ToL2MessageSource: L1ToL2MessageSource, contractDataSource: ContractDataSource, worldState: WorldStateSynchronizer, coordination: ProverCoordination & Maybe<Service>, quoteProvider: QuoteProvider, quoteSigner: QuoteSigner, claimsMonitor: ClaimsMonitor, epochsMonitor: EpochMonitor, bondManager: BondManager, telemetryClient: TelemetryClient, proverCacheManager: ProverCacheManager, options?: Partial<ProverNodeOptions>);
47
+ getP2P(): P2P | undefined;
45
48
  handleClaim(proofClaim: EpochProofClaim): Promise<void>;
46
49
  /**
47
50
  * Handles the epoch number to prove when the prover node starts by checking if there
@@ -89,7 +92,7 @@ export declare class ProverNode implements ClaimsMonitorHandler, EpochMonitorHan
89
92
  private checkMaximumPendingJobs;
90
93
  private createProvingJob;
91
94
  /** Extracted for testing purposes. */
92
- protected doCreateEpochProvingJob(epochNumber: bigint, blocks: L2Block[], publicDb: MerkleTreeWriteOperations, proverDb: MerkleTreeWriteOperations, proverCache: ProverCache, publicProcessorFactory: PublicProcessorFactory, cleanUp: () => Promise<void>): EpochProvingJob;
95
+ protected doCreateEpochProvingJob(epochNumber: bigint, blocks: L2Block[], proverCache: ProverCache, publicProcessorFactory: PublicProcessorFactory, cleanUp: () => Promise<void>): EpochProvingJob;
93
96
  /** Extracted for testing purposes. */
94
97
  protected triggerMonitors(): Promise<void>;
95
98
  }
@@ -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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"}
@@ -1,7 +1,7 @@
1
1
  import { EpochProofQuotePayload, tryStop, } from '@aztec/circuit-types';
2
2
  import { compact } from '@aztec/foundation/collection';
3
3
  import { sha256 } from '@aztec/foundation/crypto';
4
- import { createDebugLogger } from '@aztec/foundation/log';
4
+ import { createLogger } from '@aztec/foundation/log';
5
5
  import { PublicProcessorFactory } from '@aztec/simulator';
6
6
  import { EpochProvingJob } from './job/epoch-proving-job.js';
7
7
  import { ProverNodeMetrics } from './metrics.js';
@@ -27,15 +27,23 @@ export class ProverNode {
27
27
  this.bondManager = bondManager;
28
28
  this.telemetryClient = telemetryClient;
29
29
  this.proverCacheManager = proverCacheManager;
30
- this.log = createDebugLogger('aztec:prover-node');
30
+ this.log = createLogger('prover-node');
31
31
  this.jobs = new Map();
32
32
  this.options = {
33
33
  pollingIntervalMs: 1000,
34
34
  maxPendingJobs: 100,
35
+ maxParallelBlocksPerEpoch: 32,
35
36
  ...compact(options),
36
37
  };
37
38
  this.metrics = new ProverNodeMetrics(telemetryClient, 'ProverNode');
38
39
  }
40
+ getP2P() {
41
+ const asP2PClient = this.coordination;
42
+ if (typeof asP2PClient.isP2PClient === 'function' && asP2PClient.isP2PClient()) {
43
+ return asP2PClient;
44
+ }
45
+ return undefined;
46
+ }
39
47
  async handleClaim(proofClaim) {
40
48
  if (proofClaim.epochToProve === this.latestEpochWeAreProving) {
41
49
  this.log.verbose(`Already proving claim for epoch ${proofClaim.epochToProve}`);
@@ -86,9 +94,13 @@ export class ProverNode {
86
94
  try {
87
95
  // Construct a quote for the epoch
88
96
  const blocks = await this.l2BlockSource.getBlocksForEpoch(epochNumber);
97
+ if (blocks.length === 0) {
98
+ this.log.info(`No blocks found for epoch ${epochNumber}`);
99
+ return;
100
+ }
89
101
  const partialQuote = await this.quoteProvider.getQuote(Number(epochNumber), blocks);
90
102
  if (!partialQuote) {
91
- this.log.verbose(`No quote produced for epoch ${epochNumber}`);
103
+ this.log.info(`No quote produced for epoch ${epochNumber}`);
92
104
  return;
93
105
  }
94
106
  // Ensure we have deposited enough funds for sending this quote
@@ -188,28 +200,22 @@ export class ProverNode {
188
200
  // Fast forward world state to right before the target block and get a fork
189
201
  this.log.verbose(`Creating proving job for epoch ${epochNumber} for block range ${fromBlock} to ${toBlock}`);
190
202
  await this.worldState.syncImmediate(fromBlock - 1);
191
- // NB: separated the dbs as both a block builder and public processor need to track and update tree state
192
- // see public_processor.ts for context
193
- const publicDb = await this.worldState.fork(fromBlock - 1);
194
- const proverDb = await this.worldState.fork(fromBlock - 1);
195
203
  // Create a processor using the forked world state
196
204
  const publicProcessorFactory = new PublicProcessorFactory(this.contractDataSource, this.telemetryClient);
197
205
  const epochHash = sha256(Buffer.concat(blocks.map(block => block.hash().toBuffer())));
198
206
  const proverCache = await this.proverCacheManager.openCache(epochNumber, epochHash);
199
207
  const cleanUp = async () => {
200
- await publicDb.close();
201
- await proverDb.close();
202
208
  await proverCache.close();
203
209
  await this.proverCacheManager.removeStaleCaches(epochNumber);
204
210
  this.jobs.delete(job.getId());
205
211
  };
206
- const job = this.doCreateEpochProvingJob(epochNumber, blocks, publicDb, proverDb, proverCache, publicProcessorFactory, cleanUp);
212
+ const job = this.doCreateEpochProvingJob(epochNumber, blocks, proverCache, publicProcessorFactory, cleanUp);
207
213
  this.jobs.set(job.getId(), job);
208
214
  return job;
209
215
  }
210
216
  /** Extracted for testing purposes. */
211
- doCreateEpochProvingJob(epochNumber, blocks, publicDb, proverDb, proverCache, publicProcessorFactory, cleanUp) {
212
- return new EpochProvingJob(publicDb, epochNumber, blocks, this.prover.createEpochProver(proverDb, proverCache), publicProcessorFactory, this.publisher, this.l2BlockSource, this.l1ToL2MessageSource, this.coordination, this.metrics, cleanUp);
217
+ doCreateEpochProvingJob(epochNumber, blocks, proverCache, publicProcessorFactory, cleanUp) {
218
+ return new EpochProvingJob(this.worldState, epochNumber, blocks, this.prover.createEpochProver(proverCache), publicProcessorFactory, this.publisher, this.l2BlockSource, this.l1ToL2MessageSource, this.coordination, this.metrics, { parallelBlockLimit: this.options.maxParallelBlocksPerEpoch }, cleanUp);
213
219
  }
214
220
  /** Extracted for testing purposes. */
215
221
  async triggerMonitors() {
@@ -217,4 +223,4 @@ export class ProverNode {
217
223
  await this.claimsMonitor.work();
218
224
  }
219
225
  }
220
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmVyLW5vZGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcHJvdmVyLW5vZGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUdMLHNCQUFzQixFQVd0QixPQUFPLEdBQ1IsTUFBTSxzQkFBc0IsQ0FBQztBQUU5QixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDdkQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRzFELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBSTFELE9BQU8sRUFBRSxlQUFlLEVBQTZCLE1BQU0sNEJBQTRCLENBQUM7QUFDeEYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBWWpEOzs7OztHQUtHO0FBQ0gsTUFBTSxPQUFPLFVBQVU7SUFRckIsWUFDbUIsTUFBMEIsRUFDMUIsU0FBc0IsRUFDdEIsYUFBNkMsRUFDN0MsbUJBQXdDLEVBQ3hDLGtCQUFzQyxFQUN0QyxVQUFrQyxFQUNsQyxZQUFpRCxFQUNqRCxhQUE0QixFQUM1QixXQUF3QixFQUN4QixhQUE0QixFQUM1QixhQUEyQixFQUMzQixXQUF3QixFQUN4QixlQUFnQyxFQUNoQyxrQkFBc0MsRUFDdkQsVUFBc0MsRUFBRTtRQWR2QixXQUFNLEdBQU4sTUFBTSxDQUFvQjtRQUMxQixjQUFTLEdBQVQsU0FBUyxDQUFhO1FBQ3RCLGtCQUFhLEdBQWIsYUFBYSxDQUFnQztRQUM3Qyx3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXFCO1FBQ3hDLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBb0I7UUFDdEMsZUFBVSxHQUFWLFVBQVUsQ0FBd0I7UUFDbEMsaUJBQVksR0FBWixZQUFZLENBQXFDO1FBQ2pELGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzVCLGdCQUFXLEdB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
226
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmVyLW5vZGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcHJvdmVyLW5vZGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUdMLHNCQUFzQixFQVV0QixPQUFPLEdBQ1IsTUFBTSxzQkFBc0IsQ0FBQztBQUU5QixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDdkQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUlyRCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUkxRCxPQUFPLEVBQUUsZUFBZSxFQUE2QixNQUFNLDRCQUE0QixDQUFDO0FBQ3hGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQWFqRDs7Ozs7R0FLRztBQUNILE1BQU0sT0FBTyxVQUFVO0lBUXJCLFlBQ21CLE1BQTBCLEVBQzFCLFNBQXNCLEVBQ3RCLGFBQTZDLEVBQzdDLG1CQUF3QyxFQUN4QyxrQkFBc0MsRUFDdEMsVUFBa0MsRUFDbEMsWUFBaUQsRUFDakQsYUFBNEIsRUFDNUIsV0FBd0IsRUFDeEIsYUFBNEIsRUFDNUIsYUFBMkIsRUFDM0IsV0FBd0IsRUFDeEIsZUFBZ0MsRUFDaEMsa0JBQXNDLEVBQ3ZELFVBQXNDLEVBQUU7UUFkdkIsV0FBTSxHQUFOLE1BQU0sQ0FBb0I7UUFDMUIsY0FBUyxHQUFULFNBQVMsQ0FBYTtRQUN0QixrQkFBYSxHQUFiLGFBQWEsQ0FBZ0M7UUFDN0Msd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFxQjtRQUN4Qyx1QkFBa0IsR0FBbEIsa0JBQWtCLENBQW9CO1FBQ3RDLGVBQVUsR0FBVixVQUFVLENBQXdCO1FBQ2xDLGlCQUFZLEdBQVosWUFBWSxDQUFxQztRQUNqRCxrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUM1QixnQkFBVyxHQUFY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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aztec/prover-node",
3
- "version": "0.65.2",
3
+ "version": "0.67.0",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": "./dest/index.js"
@@ -49,24 +49,28 @@
49
49
  "summaryThreshold": 9999
50
50
  }
51
51
  ]
52
+ ],
53
+ "testTimeout": 30000,
54
+ "setupFiles": [
55
+ "../../foundation/src/jest/setup.mjs"
52
56
  ]
53
57
  },
54
58
  "dependencies": {
55
- "@aztec/archiver": "0.65.2",
56
- "@aztec/bb-prover": "0.65.2",
57
- "@aztec/circuit-types": "0.65.2",
58
- "@aztec/circuits.js": "0.65.2",
59
- "@aztec/ethereum": "0.65.2",
60
- "@aztec/foundation": "0.65.2",
61
- "@aztec/kv-store": "0.65.2",
62
- "@aztec/l1-artifacts": "0.65.2",
63
- "@aztec/p2p": "0.65.2",
64
- "@aztec/prover-client": "0.65.2",
65
- "@aztec/sequencer-client": "0.65.2",
66
- "@aztec/simulator": "0.65.2",
67
- "@aztec/telemetry-client": "0.65.2",
68
- "@aztec/types": "0.65.2",
69
- "@aztec/world-state": "0.65.2",
59
+ "@aztec/archiver": "0.67.0",
60
+ "@aztec/bb-prover": "0.67.0",
61
+ "@aztec/circuit-types": "0.67.0",
62
+ "@aztec/circuits.js": "0.67.0",
63
+ "@aztec/ethereum": "0.67.0",
64
+ "@aztec/foundation": "0.67.0",
65
+ "@aztec/kv-store": "0.67.0",
66
+ "@aztec/l1-artifacts": "0.67.0",
67
+ "@aztec/p2p": "0.67.0",
68
+ "@aztec/prover-client": "0.67.0",
69
+ "@aztec/sequencer-client": "0.67.0",
70
+ "@aztec/simulator": "0.67.0",
71
+ "@aztec/telemetry-client": "0.67.0",
72
+ "@aztec/types": "0.67.0",
73
+ "@aztec/world-state": "0.67.0",
70
74
  "source-map-support": "^0.5.21",
71
75
  "tslib": "^2.4.0",
72
76
  "viem": "^2.7.15"
@@ -1,10 +1,10 @@
1
- import { createDebugLogger } from '@aztec/foundation/log';
1
+ import { createLogger } from '@aztec/foundation/log';
2
2
 
3
3
  import { type EscrowContract } from './escrow-contract.js';
4
4
  import { type TokenContract } from './token-contract.js';
5
5
 
6
6
  export class BondManager {
7
- private readonly logger = createDebugLogger('aztec:prover-node:bond-manager');
7
+ private readonly logger = createLogger('prover-node:bond-manager');
8
8
 
9
9
  constructor(
10
10
  private readonly tokenContract: TokenContract,
@@ -1,5 +1,5 @@
1
1
  import { EthAddress } from '@aztec/circuits.js';
2
- import { createDebugLogger } from '@aztec/foundation/log';
2
+ import { createLogger } from '@aztec/foundation/log';
3
3
  import { IERC20Abi, TestERC20Abi } from '@aztec/l1-artifacts';
4
4
 
5
5
  import {
@@ -21,7 +21,7 @@ const MIN_ALLOWANCE = 1n << 255n;
21
21
 
22
22
  export class TokenContract {
23
23
  private token: GetContractReturnType<typeof IERC20Abi, WalletClient<HttpTransport, Chain, PrivateKeyAccount>>;
24
- private logger = createDebugLogger('aztec:prover-node:token-contract');
24
+ private logger = createLogger('prover-node:token-contract');
25
25
 
26
26
  constructor(
27
27
  private readonly client: Client<
package/src/config.ts CHANGED
@@ -46,10 +46,14 @@ export type ProverNodeConfig = ArchiverConfig &
46
46
  DataStoreConfig &
47
47
  ProverCoordinationConfig &
48
48
  ProverBondManagerConfig &
49
- QuoteProviderConfig & {
50
- proverNodeMaxPendingJobs: number;
51
- proverNodePollingIntervalMs: number;
52
- };
49
+ QuoteProviderConfig &
50
+ SpecificProverNodeConfig;
51
+
52
+ type SpecificProverNodeConfig = {
53
+ proverNodeMaxPendingJobs: number;
54
+ proverNodePollingIntervalMs: number;
55
+ proverNodeMaxParallelBlocksPerEpoch: number;
56
+ };
53
57
 
54
58
  export type QuoteProviderConfig = {
55
59
  quoteProviderBasisPointFee: number;
@@ -57,9 +61,7 @@ export type QuoteProviderConfig = {
57
61
  quoteProviderUrl?: string;
58
62
  };
59
63
 
60
- const specificProverNodeConfigMappings: ConfigMappingsType<
61
- Pick<ProverNodeConfig, 'proverNodePollingIntervalMs' | 'proverNodeMaxPendingJobs'>
62
- > = {
64
+ const specificProverNodeConfigMappings: ConfigMappingsType<SpecificProverNodeConfig> = {
63
65
  proverNodeMaxPendingJobs: {
64
66
  env: 'PROVER_NODE_MAX_PENDING_JOBS',
65
67
  description: 'The maximum number of pending jobs for the prover node',
@@ -70,6 +72,11 @@ const specificProverNodeConfigMappings: ConfigMappingsType<
70
72
  description: 'The interval in milliseconds to poll for new jobs',
71
73
  ...numberConfigHelper(1000),
72
74
  },
75
+ proverNodeMaxParallelBlocksPerEpoch: {
76
+ env: 'PROVER_NODE_MAX_PARALLEL_BLOCKS_PER_EPOCH',
77
+ description: 'The Maximum number of blocks to process in parallel while proving an epoch',
78
+ ...numberConfigHelper(32),
79
+ },
73
80
  };
74
81
 
75
82
  const quoteProviderConfigMappings: ConfigMappingsType<QuoteProviderConfig> = {
package/src/factory.ts CHANGED
@@ -2,7 +2,7 @@ import { type Archiver, createArchiver } from '@aztec/archiver';
2
2
  import { type ProverCoordination, type ProvingJobBroker } from '@aztec/circuit-types';
3
3
  import { createEthereumChain } from '@aztec/ethereum';
4
4
  import { Buffer32 } from '@aztec/foundation/buffer';
5
- import { type DebugLogger, createDebugLogger } from '@aztec/foundation/log';
5
+ import { type Logger, createLogger } from '@aztec/foundation/log';
6
6
  import { type DataStoreConfig } from '@aztec/kv-store/config';
7
7
  import { RollupAbi } from '@aztec/l1-artifacts';
8
8
  import { createProverClient } from '@aztec/prover-client';
@@ -21,7 +21,7 @@ import { ClaimsMonitor } from './monitors/claims-monitor.js';
21
21
  import { EpochMonitor } from './monitors/epoch-monitor.js';
22
22
  import { ProverCacheManager } from './prover-cache/cache_manager.js';
23
23
  import { createProverCoordination } from './prover-coordination/factory.js';
24
- import { ProverNode } from './prover-node.js';
24
+ import { ProverNode, type ProverNodeOptions } from './prover-node.js';
25
25
  import { HttpQuoteProvider } from './quote-provider/http.js';
26
26
  import { SimpleQuoteProvider } from './quote-provider/simple.js';
27
27
  import { QuoteSigner } from './quote-signer.js';
@@ -31,7 +31,7 @@ export async function createProverNode(
31
31
  config: ProverNodeConfig & DataStoreConfig,
32
32
  deps: {
33
33
  telemetry?: TelemetryClient;
34
- log?: DebugLogger;
34
+ log?: Logger;
35
35
  aztecNodeTxProvider?: ProverCoordination;
36
36
  archiver?: Archiver;
37
37
  publisher?: L1Publisher;
@@ -39,16 +39,16 @@ export async function createProverNode(
39
39
  } = {},
40
40
  ) {
41
41
  const telemetry = deps.telemetry ?? new NoopTelemetryClient();
42
- const log = deps.log ?? createDebugLogger('aztec:prover');
42
+ const log = deps.log ?? createLogger('prover-node');
43
43
  const archiver = deps.archiver ?? (await createArchiver(config, telemetry, { blockUntilSync: true }));
44
44
  log.verbose(`Created archiver and synced to block ${await archiver.getBlockNumber()}`);
45
45
 
46
- const worldStateConfig = { ...config, worldStateProvenBlocksOnly: true };
46
+ const worldStateConfig = { ...config, worldStateProvenBlocksOnly: false };
47
47
  const worldStateSynchronizer = await createWorldStateSynchronizer(worldStateConfig, archiver, telemetry);
48
48
  await worldStateSynchronizer.start();
49
49
 
50
- const broker = deps.broker ?? (await createAndStartProvingBroker(config));
51
- const prover = await createProverClient(config, broker, telemetry);
50
+ const broker = deps.broker ?? (await createAndStartProvingBroker(config, telemetry));
51
+ const prover = await createProverClient(config, worldStateSynchronizer, broker, telemetry);
52
52
 
53
53
  // REFACTOR: Move publisher out of sequencer package and into an L1-related package
54
54
  const publisher = deps.publisher ?? new L1Publisher(config, telemetry);
@@ -65,9 +65,10 @@ export async function createProverNode(
65
65
  const quoteProvider = createQuoteProvider(config);
66
66
  const quoteSigner = createQuoteSigner(config);
67
67
 
68
- const proverNodeConfig = {
68
+ const proverNodeConfig: ProverNodeOptions = {
69
69
  maxPendingJobs: config.proverNodeMaxPendingJobs,
70
70
  pollingIntervalMs: config.proverNodePollingIntervalMs,
71
+ maxParallelBlocksPerEpoch: config.proverNodeMaxParallelBlocksPerEpoch,
71
72
  };
72
73
 
73
74
  const claimsMonitor = new ClaimsMonitor(publisher, proverNodeConfig);
@@ -2,18 +2,17 @@ import {
2
2
  EmptyTxValidator,
3
3
  type EpochProver,
4
4
  type EpochProvingJobState,
5
+ type ForkMerkleTreeOperations,
5
6
  type L1ToL2MessageSource,
6
7
  type L2Block,
7
8
  type L2BlockSource,
8
- MerkleTreeId,
9
- type MerkleTreeWriteOperations,
10
9
  type ProcessedTx,
11
10
  type ProverCoordination,
12
11
  type Tx,
13
12
  type TxHash,
14
13
  } from '@aztec/circuit-types';
15
- import { KernelCircuitPublicInputs, NULLIFIER_SUBTREE_HEIGHT, PublicDataTreeLeaf } from '@aztec/circuits.js';
16
- import { createDebugLogger } from '@aztec/foundation/log';
14
+ import { asyncPool } from '@aztec/foundation/async-pool';
15
+ import { createLogger } from '@aztec/foundation/log';
17
16
  import { promiseWithResolvers } from '@aztec/foundation/promise';
18
17
  import { Timer } from '@aztec/foundation/timer';
19
18
  import { type L1Publisher } from '@aztec/sequencer-client';
@@ -30,13 +29,13 @@ import { type ProverNodeMetrics } from '../metrics.js';
30
29
  */
31
30
  export class EpochProvingJob {
32
31
  private state: EpochProvingJobState = 'initialized';
33
- private log = createDebugLogger('aztec:epoch-proving-job');
32
+ private log = createLogger('prover-node:epoch-proving-job');
34
33
  private uuid: string;
35
34
 
36
35
  private runPromise: Promise<void> | undefined;
37
36
 
38
37
  constructor(
39
- private db: MerkleTreeWriteOperations,
38
+ private dbProvider: ForkMerkleTreeOperations,
40
39
  private epochNumber: bigint,
41
40
  private blocks: L2Block[],
42
41
  private prover: EpochProver,
@@ -46,6 +45,7 @@ export class EpochProvingJob {
46
45
  private l1ToL2MessageSource: L1ToL2MessageSource,
47
46
  private coordination: ProverCoordination,
48
47
  private metrics: ProverNodeMetrics,
48
+ private config: { parallelBlockLimit: number } = { parallelBlockLimit: 32 },
49
49
  private cleanUp: (job: EpochProvingJob) => Promise<void> = () => Promise.resolve(),
50
50
  ) {
51
51
  this.uuid = crypto.randomUUID();
@@ -65,7 +65,8 @@ export class EpochProvingJob {
65
65
  public async run() {
66
66
  const epochNumber = Number(this.epochNumber);
67
67
  const epochSize = this.blocks.length;
68
- this.log.info(`Starting epoch proving job`, { epochSize, epochNumber, uuid: this.uuid });
68
+ const firstBlockNumber = this.blocks[0].number;
69
+ this.log.info(`Starting epoch proving job`, { firstBlockNumber, epochSize, epochNumber, uuid: this.uuid });
69
70
  this.state = 'processing';
70
71
  const timer = new Timer();
71
72
 
@@ -73,21 +74,15 @@ export class EpochProvingJob {
73
74
  this.runPromise = promise;
74
75
 
75
76
  try {
76
- this.prover.startNewEpoch(epochNumber, epochSize);
77
+ this.prover.startNewEpoch(epochNumber, firstBlockNumber, epochSize);
77
78
 
78
- // Get the genesis header if the first block of the epoch is the first block of the chain
79
- let previousHeader =
80
- this.blocks[0].number === 1
81
- ? this.db.getInitialHeader()
82
- : await this.l2BlockSource.getBlockHeader(this.blocks[0].number - 1);
83
-
84
- for (const block of this.blocks) {
85
- // Gather all data to prove this block
79
+ await asyncPool(this.config.parallelBlockLimit, this.blocks, async block => {
86
80
  const globalVariables = block.header.globalVariables;
87
81
  const txHashes = block.body.txEffects.map(tx => tx.txHash);
88
82
  const txCount = block.body.numberOfTxsIncludingPadded;
89
83
  const l1ToL2Messages = await this.getL1ToL2Messages(block);
90
84
  const txs = await this.getTxs(txHashes);
85
+ const previousHeader = await this.getBlockHeader(block.number - 1);
91
86
 
92
87
  this.log.verbose(`Starting block processing`, {
93
88
  number: block.number,
@@ -105,27 +100,23 @@ export class EpochProvingJob {
105
100
  await this.prover.startNewBlock(txCount, globalVariables, l1ToL2Messages);
106
101
 
107
102
  // Process public fns
108
- const publicProcessor = this.publicProcessorFactory.create(this.db, previousHeader, globalVariables);
103
+ const db = await this.dbProvider.fork(block.number - 1);
104
+ const publicProcessor = this.publicProcessorFactory.create(db, previousHeader, globalVariables);
109
105
  await this.processTxs(publicProcessor, txs, txCount);
106
+ await db.close();
110
107
  this.log.verbose(`Processed all txs for block`, {
111
108
  blockNumber: block.number,
112
109
  blockHash: block.hash().toString(),
113
110
  uuid: this.uuid,
114
111
  });
115
112
 
116
- if (txCount > txs.length) {
117
- // If this block has a padding tx, ensure that the public processor's db has its state
118
- await this.addPaddingTxState();
119
- }
120
-
121
- // Mark block as completed and update archive tree
122
- await this.prover.setBlockCompleted(block.header);
123
- previousHeader = block.header;
124
- }
113
+ // Mark block as completed to pad it
114
+ await this.prover.setBlockCompleted(block.number, block.header);
115
+ });
125
116
 
126
117
  this.state = 'awaiting-prover';
127
118
  const { publicInputs, proof } = await this.prover.finaliseEpoch();
128
- this.log.info(`Finalised proof for epoch`, { epochNumber, uuid: this.uuid });
119
+ this.log.info(`Finalised proof for epoch`, { epochNumber, uuid: this.uuid, duration: timer.ms() });
129
120
 
130
121
  this.state = 'publishing-proof';
131
122
  const [fromBlock, toBlock] = [this.blocks[0].number, this.blocks.at(-1)!.number];
@@ -150,6 +141,14 @@ export class EpochProvingJob {
150
141
  }
151
142
  }
152
143
 
144
+ /* Returns the header for the given block number, or undefined for block zero. */
145
+ private getBlockHeader(blockNumber: number) {
146
+ if (blockNumber === 0) {
147
+ return undefined;
148
+ }
149
+ return this.l2BlockSource.getBlockHeader(blockNumber);
150
+ }
151
+
153
152
  private async getTxs(txHashes: TxHash[]): Promise<Tx[]> {
154
153
  const txs = await Promise.all(
155
154
  txHashes.map(txHash => this.coordination.getTxByHash(txHash).then(tx => [txHash, tx] as const)),
@@ -185,25 +184,6 @@ export class EpochProvingJob {
185
184
 
186
185
  return processedTxs;
187
186
  }
188
-
189
- private async addPaddingTxState() {
190
- const emptyKernelOutput = KernelCircuitPublicInputs.empty();
191
- await this.db.appendLeaves(MerkleTreeId.NOTE_HASH_TREE, emptyKernelOutput.end.noteHashes);
192
- await this.db.batchInsert(
193
- MerkleTreeId.NULLIFIER_TREE,
194
- emptyKernelOutput.end.nullifiers.map(n => n.toBuffer()),
195
- NULLIFIER_SUBTREE_HEIGHT,
196
- );
197
- const allPublicDataWrites = emptyKernelOutput.end.publicDataWrites
198
- .filter(write => !write.isEmpty())
199
- .map(({ leafSlot, value }) => new PublicDataTreeLeaf(leafSlot, value));
200
-
201
- await this.db.batchInsert(
202
- MerkleTreeId.PUBLIC_DATA_TREE,
203
- allPublicDataWrites.map(x => x.toBuffer()),
204
- 0,
205
- );
206
- }
207
187
  }
208
188
 
209
189
  export { type EpochProvingJobState };
package/src/metrics.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { type Timer } from '@aztec/foundation/timer';
2
- import { type Histogram, Metrics, type TelemetryClient, ValueType, millisecondBuckets } from '@aztec/telemetry-client';
2
+ import { type Histogram, Metrics, type TelemetryClient, ValueType } from '@aztec/telemetry-client';
3
3
 
4
4
  export class ProverNodeMetrics {
5
5
  provingJobDuration: Histogram;
@@ -10,9 +10,6 @@ export class ProverNodeMetrics {
10
10
  description: 'Duration of proving job',
11
11
  unit: 'ms',
12
12
  valueType: ValueType.INT,
13
- advice: {
14
- explicitBucketBoundaries: millisecondBuckets(2), // 60 buckets spanning an interval of ~100ms to ~1hour
15
- },
16
13
  });
17
14
  }
18
15
 
@@ -1,6 +1,6 @@
1
1
  import { type EpochProofClaim } from '@aztec/circuit-types';
2
2
  import { type EthAddress } from '@aztec/circuits.js';
3
- import { createDebugLogger } from '@aztec/foundation/log';
3
+ import { createLogger } from '@aztec/foundation/log';
4
4
  import { RunningPromise } from '@aztec/foundation/running-promise';
5
5
  import { type L1Publisher } from '@aztec/sequencer-client';
6
6
 
@@ -10,7 +10,7 @@ export interface ClaimsMonitorHandler {
10
10
 
11
11
  export class ClaimsMonitor {
12
12
  private runningPromise: RunningPromise;
13
- private log = createDebugLogger('aztec:prover-node:claims-monitor');
13
+ private log = createLogger('prover-node:claims-monitor');
14
14
 
15
15
  private handler: ClaimsMonitorHandler | undefined;
16
16
  private lastClaimEpochNumber: bigint | undefined;
@@ -1,5 +1,5 @@
1
1
  import { type L2BlockSource } from '@aztec/circuit-types';
2
- import { createDebugLogger } from '@aztec/foundation/log';
2
+ import { createLogger } from '@aztec/foundation/log';
3
3
  import { RunningPromise } from '@aztec/foundation/running-promise';
4
4
 
5
5
  export interface EpochMonitorHandler {
@@ -9,7 +9,7 @@ export interface EpochMonitorHandler {
9
9
 
10
10
  export class EpochMonitor {
11
11
  private runningPromise: RunningPromise;
12
- private log = createDebugLogger('aztec:prover-node:epoch-monitor');
12
+ private log = createLogger('prover-node:epoch-monitor');
13
13
 
14
14
  private handler: EpochMonitorHandler | undefined;
15
15
 
@@ -1,5 +1,5 @@
1
1
  import { type ProverCache } from '@aztec/circuit-types';
2
- import { createDebugLogger } from '@aztec/foundation/log';
2
+ import { createLogger } from '@aztec/foundation/log';
3
3
  import { AztecLmdbStore } from '@aztec/kv-store/lmdb';
4
4
  import { InMemoryProverCache } from '@aztec/prover-client';
5
5
 
@@ -14,7 +14,7 @@ const EPOCH_DIR_SEPARATOR = '_';
14
14
  const EPOCH_HASH_FILENAME = 'epoch_hash.txt';
15
15
 
16
16
  export class ProverCacheManager {
17
- constructor(private cacheDir?: string, private log = createDebugLogger('aztec:prover-node:cache-manager')) {}
17
+ constructor(private cacheDir?: string, private log = createLogger('prover-node:cache-manager')) {}
18
18
 
19
19
  public async openCache(epochNumber: bigint, epochHash: Buffer): Promise<ProverCache> {
20
20
  if (!this.cacheDir) {