@aztec/prover-node 0.76.4-devnet-test-rc3 → 0.77.0-testnet-ignition.17

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 (96) hide show
  1. package/dest/config.d.ts +5 -8
  2. package/dest/config.d.ts.map +1 -1
  3. package/dest/config.js +24 -51
  4. package/dest/factory.d.ts +6 -3
  5. package/dest/factory.d.ts.map +1 -1
  6. package/dest/factory.js +23 -45
  7. package/dest/http.d.ts +1 -1
  8. package/dest/http.d.ts.map +1 -1
  9. package/dest/http.js +2 -4
  10. package/dest/index.js +0 -1
  11. package/dest/job/epoch-proving-job.d.ts +8 -4
  12. package/dest/job/epoch-proving-job.d.ts.map +1 -1
  13. package/dest/job/epoch-proving-job.js +233 -190
  14. package/dest/metrics.d.ts +5 -2
  15. package/dest/metrics.d.ts.map +1 -1
  16. package/dest/metrics.js +50 -25
  17. package/dest/monitors/epoch-monitor.d.ts +22 -4
  18. package/dest/monitors/epoch-monitor.d.ts.map +1 -1
  19. package/dest/monitors/epoch-monitor.js +102 -48
  20. package/dest/monitors/index.d.ts +0 -1
  21. package/dest/monitors/index.d.ts.map +1 -1
  22. package/dest/monitors/index.js +0 -2
  23. package/dest/prover-coordination/config.js +2 -3
  24. package/dest/prover-coordination/factory.d.ts +5 -5
  25. package/dest/prover-coordination/factory.d.ts.map +1 -1
  26. package/dest/prover-coordination/factory.js +11 -8
  27. package/dest/prover-coordination/index.js +0 -1
  28. package/dest/prover-node-publisher.d.ts +5 -11
  29. package/dest/prover-node-publisher.d.ts.map +1 -1
  30. package/dest/prover-node-publisher.js +68 -61
  31. package/dest/prover-node.d.ts +23 -32
  32. package/dest/prover-node.d.ts.map +1 -1
  33. package/dest/prover-node.js +237 -289
  34. package/dest/test/index.d.ts +2 -2
  35. package/dest/test/index.d.ts.map +1 -1
  36. package/dest/test/index.js +2 -1
  37. package/package.json +21 -22
  38. package/src/config.ts +18 -62
  39. package/src/factory.ts +18 -47
  40. package/src/http.ts +2 -2
  41. package/src/job/epoch-proving-job.ts +15 -13
  42. package/src/metrics.ts +26 -5
  43. package/src/monitors/epoch-monitor.ts +57 -13
  44. package/src/monitors/index.ts +0 -1
  45. package/src/prover-coordination/factory.ts +9 -12
  46. package/src/prover-node-publisher.ts +29 -24
  47. package/src/prover-node.ts +53 -128
  48. package/src/test/index.ts +2 -2
  49. package/dest/bond/bond-manager.d.ts +0 -22
  50. package/dest/bond/bond-manager.d.ts.map +0 -1
  51. package/dest/bond/bond-manager.js +0 -42
  52. package/dest/bond/config.d.ts +0 -8
  53. package/dest/bond/config.d.ts.map +0 -1
  54. package/dest/bond/config.js +0 -17
  55. package/dest/bond/escrow-contract.d.ts +0 -19
  56. package/dest/bond/escrow-contract.d.ts.map +0 -1
  57. package/dest/bond/escrow-contract.js +0 -32
  58. package/dest/bond/factory.d.ts +0 -6
  59. package/dest/bond/factory.d.ts.map +0 -1
  60. package/dest/bond/factory.js +0 -17
  61. package/dest/bond/index.d.ts +0 -3
  62. package/dest/bond/index.d.ts.map +0 -1
  63. package/dest/bond/index.js +0 -3
  64. package/dest/bond/token-contract.d.ts +0 -26
  65. package/dest/bond/token-contract.d.ts.map +0 -1
  66. package/dest/bond/token-contract.js +0 -58
  67. package/dest/monitors/claims-monitor.d.ts +0 -24
  68. package/dest/monitors/claims-monitor.d.ts.map +0 -1
  69. package/dest/monitors/claims-monitor.js +0 -54
  70. package/dest/quote-provider/http.d.ts +0 -15
  71. package/dest/quote-provider/http.d.ts.map +0 -1
  72. package/dest/quote-provider/http.js +0 -33
  73. package/dest/quote-provider/index.d.ts +0 -6
  74. package/dest/quote-provider/index.d.ts.map +0 -1
  75. package/dest/quote-provider/index.js +0 -2
  76. package/dest/quote-provider/simple.d.ts +0 -9
  77. package/dest/quote-provider/simple.d.ts.map +0 -1
  78. package/dest/quote-provider/simple.js +0 -11
  79. package/dest/quote-provider/utils.d.ts +0 -4
  80. package/dest/quote-provider/utils.d.ts.map +0 -1
  81. package/dest/quote-provider/utils.js +0 -8
  82. package/dest/quote-signer.d.ts +0 -13
  83. package/dest/quote-signer.d.ts.map +0 -1
  84. package/dest/quote-signer.js +0 -18
  85. package/src/bond/bond-manager.ts +0 -48
  86. package/src/bond/config.ts +0 -25
  87. package/src/bond/escrow-contract.ts +0 -50
  88. package/src/bond/factory.ts +0 -28
  89. package/src/bond/index.ts +0 -2
  90. package/src/bond/token-contract.ts +0 -72
  91. package/src/monitors/claims-monitor.ts +0 -69
  92. package/src/quote-provider/http.ts +0 -48
  93. package/src/quote-provider/index.ts +0 -8
  94. package/src/quote-provider/simple.ts +0 -15
  95. package/src/quote-provider/utils.ts +0 -10
  96. package/src/quote-signer.ts +0 -24
@@ -1,12 +1,18 @@
1
- import { __esDecorate, __runInitializers } from "tslib";
2
- import { EpochProofQuotePayload, getTimestampRangeForEpoch, tryStop, } from '@aztec/circuit-types';
1
+ function _ts_decorate(decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
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
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ }
3
7
  import { compact } from '@aztec/foundation/collection';
4
8
  import { memoize } from '@aztec/foundation/decorators';
5
9
  import { createLogger } from '@aztec/foundation/log';
6
10
  import { RunningPromise } from '@aztec/foundation/running-promise';
7
11
  import { DateProvider } from '@aztec/foundation/timer';
8
12
  import { PublicProcessorFactory } from '@aztec/simulator/server';
9
- import { Attributes, getTelemetryClient, trackSpan, } from '@aztec/telemetry-client';
13
+ import { getTimestampRangeForEpoch } from '@aztec/stdlib/epoch-helpers';
14
+ import { EpochProvingJobTerminalState, tryStop } from '@aztec/stdlib/interfaces/server';
15
+ import { Attributes, getTelemetryClient, trackSpan } from '@aztec/telemetry-client';
10
16
  import { EpochProvingJob } from './job/epoch-proving-job.js';
11
17
  import { ProverNodeMetrics } from './metrics.js';
12
18
  /**
@@ -14,297 +20,239 @@ import { ProverNodeMetrics } from './metrics.js';
14
20
  * submits bids for proving them, and monitors if they are accepted. If so, the prover node fetches the txs
15
21
  * from a tx source in the p2p network or an external node, re-executes their public functions, creates a rollup
16
22
  * proof for the epoch, and submits it to L1.
17
- */
18
- let ProverNode = (() => {
19
- var _a;
20
- let _instanceExtraInitializers = [];
21
- let _createProvingJob_decorators;
22
- let _getL1Constants_decorators;
23
- let _checkForTxs_decorators;
24
- let _gatherEpochData_decorators;
25
- return _a = class ProverNode {
26
- constructor(prover, publisher, l2BlockSource, l1ToL2MessageSource, contractDataSource, worldState, coordination, quoteProvider, quoteSigner, claimsMonitor, epochsMonitor, bondManager, options = {}, telemetryClient = getTelemetryClient()) {
27
- this.prover = (__runInitializers(this, _instanceExtraInitializers), prover);
28
- this.publisher = publisher;
29
- this.l2BlockSource = l2BlockSource;
30
- this.l1ToL2MessageSource = l1ToL2MessageSource;
31
- this.contractDataSource = contractDataSource;
32
- this.worldState = worldState;
33
- this.coordination = coordination;
34
- this.quoteProvider = quoteProvider;
35
- this.quoteSigner = quoteSigner;
36
- this.claimsMonitor = claimsMonitor;
37
- this.epochsMonitor = epochsMonitor;
38
- this.bondManager = bondManager;
39
- this.telemetryClient = telemetryClient;
40
- this.log = createLogger('prover-node');
41
- this.dateProvider = new DateProvider();
42
- this.jobs = new Map();
43
- this.cachedEpochData = undefined;
44
- this.options = {
45
- pollingIntervalMs: 1000,
46
- maxPendingJobs: 100,
47
- maxParallelBlocksPerEpoch: 32,
48
- txGatheringTimeoutMs: 60000,
49
- txGatheringIntervalMs: 1000,
50
- txGatheringMaxParallelRequests: 100,
51
- ...compact(options),
52
- };
53
- this.metrics = new ProverNodeMetrics(telemetryClient, 'ProverNode');
54
- this.tracer = telemetryClient.getTracer('ProverNode');
55
- this.txFetcher = new RunningPromise(() => this.checkForTxs(), this.log, this.options.txGatheringIntervalMs);
56
- }
57
- getP2P() {
58
- const asP2PClient = this.coordination;
59
- if (typeof asP2PClient.isP2PClient === 'function' && asP2PClient.isP2PClient()) {
60
- return asP2PClient;
61
- }
62
- return undefined;
63
- }
64
- async handleClaim(proofClaim) {
65
- if (proofClaim.epochToProve === this.latestEpochWeAreProving) {
66
- this.log.verbose(`Already proving claim for epoch ${proofClaim.epochToProve}`);
67
- return;
68
- }
69
- const provenEpoch = await this.l2BlockSource.getProvenL2EpochNumber();
70
- if (provenEpoch !== undefined && proofClaim.epochToProve <= provenEpoch) {
71
- this.log.verbose(`Claim for epoch ${proofClaim.epochToProve} is already proven`);
72
- return;
73
- }
74
- try {
75
- await this.startProof(proofClaim.epochToProve);
76
- this.latestEpochWeAreProving = proofClaim.epochToProve;
77
- }
78
- catch (err) {
79
- this.log.error(`Error handling claim for epoch ${proofClaim.epochToProve}`, err);
80
- }
81
- try {
82
- // Staked amounts are lowered after a claim, so this is a good time for doing a top-up if needed
83
- await this.bondManager.ensureBond();
84
- }
85
- catch (err) {
86
- this.log.error(`Error ensuring prover bond after handling claim for epoch ${proofClaim.epochToProve}`, err);
87
- }
88
- }
89
- /**
90
- * Handles the epoch number to prove when the prover node starts by checking if there
91
- * is an existing claim for it. If not, it creates and sends a quote for it.
92
- * @param epochNumber - The epoch immediately before the current one when the prover node starts.
93
- */
94
- async handleInitialEpochSync(epochNumber) {
95
- try {
96
- const claim = await this.publisher.getProofClaim();
97
- if (!claim || claim.epochToProve < epochNumber) {
98
- this.log.verbose(`Handling epoch ${epochNumber} completed as initial sync`);
99
- await this.handleEpochCompleted(epochNumber);
100
- }
101
- }
102
- catch (err) {
103
- this.log.error(`Error handling initial epoch sync`, err);
104
- }
105
- }
106
- /**
107
- * Handles an epoch being completed by sending a quote for proving it.
108
- * @param epochNumber - The epoch number that was just completed.
109
- */
110
- async handleEpochCompleted(epochNumber) {
111
- try {
112
- // Gather data for the epoch
113
- const epochData = await this.gatherEpochData(epochNumber);
114
- const { blocks } = epochData;
115
- this.cachedEpochData = { epochNumber, ...epochData };
116
- // Construct a quote for the epoch
117
- const partialQuote = await this.quoteProvider.getQuote(Number(epochNumber), blocks);
118
- if (!partialQuote) {
119
- this.log.info(`No quote produced for epoch ${epochNumber}`);
120
- return;
121
- }
122
- // Ensure we have deposited enough funds for sending this quote
123
- await this.bondManager.ensureBond(partialQuote.bondAmount);
124
- // Assemble and sign full quote
125
- const quote = EpochProofQuotePayload.from({
126
- ...partialQuote,
127
- epochToProve: BigInt(epochNumber),
128
- prover: this.publisher.getSenderAddress(),
129
- validUntilSlot: partialQuote.validUntilSlot ?? BigInt(Number.MAX_SAFE_INTEGER), // Should we constrain this?
130
- });
131
- const signed = await this.quoteSigner.sign(quote);
132
- // Send it to the coordinator
133
- this.log.info(`Sending quote for epoch ${epochNumber} with blocks ${blocks[0].number} to ${blocks.at(-1).number}`, quote.toViemArgs());
134
- await this.doSendEpochProofQuote(signed);
135
- }
136
- catch (err) {
137
- if (err instanceof EmptyEpochError) {
138
- this.log.info(`Not producing quote for ${epochNumber} since no blocks were found`);
139
- }
140
- else {
141
- this.log.error(`Error handling epoch completed`, err);
142
- }
143
- }
144
- }
145
- /**
146
- * Starts the prover node so it periodically checks for unproven epochs in the unfinalised chain from L1 and sends
147
- * quotes for them, as well as monitors the claims for the epochs it has sent quotes for and starts proving jobs.
148
- * This method returns once the prover node has deposited an initial bond into the escrow contract.
149
- */
150
- async start() {
151
- this.txFetcher.start();
152
- await this.bondManager.ensureBond();
153
- this.epochsMonitor.start(this);
154
- this.claimsMonitor.start(this);
155
- this.log.info('Started ProverNode', this.options);
156
- }
157
- /**
158
- * Stops the prover node and all its dependencies.
159
- */
160
- async stop() {
161
- this.log.info('Stopping ProverNode');
162
- await this.txFetcher.stop();
163
- await this.epochsMonitor.stop();
164
- await this.claimsMonitor.stop();
165
- await this.prover.stop();
166
- await tryStop(this.l2BlockSource);
167
- this.publisher.interrupt();
168
- await Promise.all(Array.from(this.jobs.values()).map(job => job.stop()));
169
- await this.worldState.stop();
170
- await tryStop(this.coordination);
171
- await this.telemetryClient.stop();
172
- this.log.info('Stopped ProverNode');
173
- }
174
- /** Sends an epoch proof quote to the coordinator. */
175
- sendEpochProofQuote(quote) {
176
- this.log.info(`Sending quote for epoch`, quote.toViemArgs().quote);
177
- return this.doSendEpochProofQuote(quote);
178
- }
179
- doSendEpochProofQuote(quote) {
180
- return this.coordination.addEpochProofQuote(quote);
181
- }
182
- /**
183
- * Creates a proof for a block range. Returns once the proof has been submitted to L1.
184
- */
185
- async prove(epochNumber) {
186
- const job = await this.createProvingJob(BigInt(epochNumber));
187
- return job.run();
188
- }
189
- /**
190
- * Starts a proving process and returns immediately.
191
- */
192
- async startProof(epochNumber) {
193
- const job = await this.createProvingJob(BigInt(epochNumber));
194
- void job.run().catch(err => this.log.error(`Error proving epoch ${epochNumber}`, err));
195
- }
196
- /**
197
- * Returns the prover instance.
198
- */
199
- getProver() {
200
- return this.prover;
201
- }
202
- /**
203
- * Returns an array of jobs being processed.
204
- */
205
- getJobs() {
206
- return Promise.resolve(Array.from(this.jobs.entries()).map(([uuid, job]) => ({ uuid, status: job.getState() })));
207
- }
208
- checkMaximumPendingJobs() {
209
- const { maxPendingJobs } = this.options;
210
- return maxPendingJobs === 0 || this.jobs.size < maxPendingJobs;
211
- }
212
- async createProvingJob(epochNumber) {
213
- if (!this.checkMaximumPendingJobs()) {
214
- throw new Error(`Maximum pending proving jobs ${this.options.maxPendingJobs} reached. Cannot create new job.`);
215
- }
216
- // Gather blocks for this epoch
217
- const cachedEpochData = this.cachedEpochData?.epochNumber === epochNumber ? this.cachedEpochData : undefined;
218
- const { blocks, txs } = cachedEpochData ?? (await this.gatherEpochData(epochNumber));
219
- const fromBlock = blocks[0].number;
220
- const toBlock = blocks.at(-1).number;
221
- // Fast forward world state to right before the target block and get a fork
222
- this.log.verbose(`Creating proving job for epoch ${epochNumber} for block range ${fromBlock} to ${toBlock}`);
223
- await this.worldState.syncImmediate(fromBlock - 1);
224
- // Create a processor using the forked world state
225
- const publicProcessorFactory = new PublicProcessorFactory(this.contractDataSource, this.dateProvider, this.telemetryClient);
226
- const cleanUp = () => {
227
- this.jobs.delete(job.getId());
228
- return Promise.resolve();
229
- };
230
- const [_, endTimestamp] = getTimestampRangeForEpoch(epochNumber + 1n, await this.getL1Constants());
231
- const deadline = new Date(Number(endTimestamp) * 1000);
232
- const job = this.doCreateEpochProvingJob(epochNumber, deadline, blocks, txs, publicProcessorFactory, cleanUp);
233
- this.jobs.set(job.getId(), job);
234
- return job;
235
- }
236
- getL1Constants() {
237
- return this.l2BlockSource.getL1Constants();
238
- }
239
- /** Monitors for new blocks and requests their txs from the p2p layer to ensure they are available for proving. */
240
- async checkForTxs() {
241
- const blockNumber = await this.l2BlockSource.getBlockNumber();
242
- if (this.lastBlockNumber === undefined || blockNumber > this.lastBlockNumber) {
243
- const block = await this.l2BlockSource.getBlock(blockNumber);
244
- if (!block) {
245
- return;
246
- }
247
- const txHashes = block.body.txEffects.map(tx => tx.txHash);
248
- this.log.verbose(`Fetching ${txHashes.length} for block number ${blockNumber} from coordination`);
249
- await this.coordination.getTxsByHash(txHashes); // This stores the txs in the tx pool, no need to persist them here
250
- this.lastBlockNumber = blockNumber;
251
- }
252
- }
253
- async gatherEpochData(epochNumber) {
254
- // Gather blocks for this epoch and their txs
255
- const blocks = await this.gatherBlocks(epochNumber);
256
- const txs = await this.gatherTxs(epochNumber, blocks);
257
- return { blocks, txs };
258
- }
259
- async gatherBlocks(epochNumber) {
260
- const blocks = await this.l2BlockSource.getBlocksForEpoch(epochNumber);
261
- if (blocks.length === 0) {
262
- throw new EmptyEpochError(epochNumber);
263
- }
264
- return blocks;
265
- }
266
- async gatherTxs(epochNumber, blocks) {
267
- const txsToFind = blocks.flatMap(block => block.body.txEffects.map(tx => tx.txHash));
268
- const txs = await this.coordination.getTxsByHash(txsToFind);
269
- if (txs.length === txsToFind.length) {
270
- this.log.verbose(`Gathered all ${txs.length} txs for epoch ${epochNumber}`, { epochNumber });
271
- return txs;
272
- }
273
- const txHashesFound = await Promise.all(txs.map(tx => tx.getTxHash()));
274
- const missingTxHashes = txsToFind
275
- .filter(txHashToFind => !txHashesFound.some(txHashFound => txHashToFind.equals(txHashFound)))
276
- .join(', ');
277
- throw new Error(`Txs not found for epoch ${epochNumber}: ${missingTxHashes}`);
23
+ */ export class ProverNode {
24
+ prover;
25
+ publisher;
26
+ l2BlockSource;
27
+ l1ToL2MessageSource;
28
+ contractDataSource;
29
+ worldState;
30
+ coordination;
31
+ epochsMonitor;
32
+ telemetryClient;
33
+ log;
34
+ dateProvider;
35
+ latestEpochWeAreProving;
36
+ jobs;
37
+ cachedEpochData;
38
+ options;
39
+ metrics;
40
+ txFetcher;
41
+ lastBlockNumber;
42
+ tracer;
43
+ constructor(prover, publisher, l2BlockSource, l1ToL2MessageSource, contractDataSource, worldState, coordination, epochsMonitor, options = {}, telemetryClient = getTelemetryClient()){
44
+ this.prover = prover;
45
+ this.publisher = publisher;
46
+ this.l2BlockSource = l2BlockSource;
47
+ this.l1ToL2MessageSource = l1ToL2MessageSource;
48
+ this.contractDataSource = contractDataSource;
49
+ this.worldState = worldState;
50
+ this.coordination = coordination;
51
+ this.epochsMonitor = epochsMonitor;
52
+ this.telemetryClient = telemetryClient;
53
+ this.log = createLogger('prover-node');
54
+ this.dateProvider = new DateProvider();
55
+ this.jobs = new Map();
56
+ this.cachedEpochData = undefined;
57
+ this.options = {
58
+ pollingIntervalMs: 1_000,
59
+ maxPendingJobs: 100,
60
+ maxParallelBlocksPerEpoch: 32,
61
+ txGatheringTimeoutMs: 60_000,
62
+ txGatheringIntervalMs: 1_000,
63
+ txGatheringMaxParallelRequests: 100,
64
+ ...compact(options)
65
+ };
66
+ this.metrics = new ProverNodeMetrics(telemetryClient, 'ProverNode');
67
+ this.tracer = telemetryClient.getTracer('ProverNode');
68
+ this.txFetcher = new RunningPromise(()=>this.checkForTxs(), this.log, this.options.txGatheringIntervalMs);
69
+ }
70
+ getProverId() {
71
+ return this.prover.getProverId();
72
+ }
73
+ getP2P() {
74
+ const asP2PClient = this.coordination;
75
+ if (typeof asP2PClient.isP2PClient === 'function' && asP2PClient.isP2PClient()) {
76
+ return asP2PClient;
77
+ }
78
+ return undefined;
79
+ }
80
+ /**
81
+ * Handles an epoch being completed by starting a proof for it if there are no active jobs for it.
82
+ * @param epochNumber - The epoch number that was just completed.
83
+ */ async handleEpochReadyToProve(epochNumber) {
84
+ try {
85
+ this.log.debug('jobs', JSON.stringify(this.jobs, null, 2));
86
+ const activeJobs = await this.getActiveJobsForEpoch(epochNumber);
87
+ if (activeJobs.length > 0) {
88
+ this.log.info(`Not starting proof for ${epochNumber} since there are active jobs`);
89
+ return;
278
90
  }
279
- /** Extracted for testing purposes. */
280
- doCreateEpochProvingJob(epochNumber, deadline, blocks, txs, publicProcessorFactory, cleanUp) {
281
- return new EpochProvingJob(this.worldState, epochNumber, blocks, txs, this.prover.createEpochProver(), publicProcessorFactory, this.publisher, this.l2BlockSource, this.l1ToL2MessageSource, this.metrics, deadline, { parallelBlockLimit: this.options.maxParallelBlocksPerEpoch }, cleanUp);
91
+ // TODO: we probably want to skip starting a proof if we are too far into the current epoch
92
+ await this.startProof(epochNumber);
93
+ } catch (err) {
94
+ if (err instanceof EmptyEpochError) {
95
+ this.log.info(`Not starting proof for ${epochNumber} since no blocks were found`);
96
+ } else {
97
+ this.log.error(`Error handling epoch completed`, err);
282
98
  }
283
- /** Extracted for testing purposes. */
284
- async triggerMonitors() {
285
- await this.epochsMonitor.work();
286
- await this.claimsMonitor.work();
99
+ }
100
+ }
101
+ /**
102
+ * Starts the prover node so it periodically checks for unproven epochs in the unfinalised chain from L1 and
103
+ * starts proving jobs for them.
104
+ */ start() {
105
+ this.txFetcher.start();
106
+ this.epochsMonitor.start(this);
107
+ this.log.info('Started ProverNode', this.options);
108
+ }
109
+ /**
110
+ * Stops the prover node and all its dependencies.
111
+ */ async stop() {
112
+ this.log.info('Stopping ProverNode');
113
+ await this.txFetcher.stop();
114
+ await this.epochsMonitor.stop();
115
+ await this.prover.stop();
116
+ await tryStop(this.l2BlockSource);
117
+ this.publisher.interrupt();
118
+ await Promise.all(Array.from(this.jobs.values()).map((job)=>job.stop()));
119
+ await this.worldState.stop();
120
+ await tryStop(this.coordination);
121
+ await this.telemetryClient.stop();
122
+ this.log.info('Stopped ProverNode');
123
+ }
124
+ /**
125
+ * Creates a proof for a block range. Returns once the proof has been submitted to L1.
126
+ */ async prove(epochNumber) {
127
+ const job = await this.createProvingJob(BigInt(epochNumber));
128
+ return job.run();
129
+ }
130
+ /**
131
+ * Starts a proving process and returns immediately.
132
+ */ async startProof(epochNumber) {
133
+ const job = await this.createProvingJob(BigInt(epochNumber));
134
+ void job.run().catch((err)=>this.log.error(`Error proving epoch ${epochNumber}`, err));
135
+ }
136
+ /**
137
+ * Returns the prover instance.
138
+ */ getProver() {
139
+ return this.prover;
140
+ }
141
+ /**
142
+ * Returns an array of jobs being processed.
143
+ */ getJobs() {
144
+ return Promise.resolve(Array.from(this.jobs.entries()).map(([uuid, job])=>({
145
+ uuid,
146
+ status: job.getState(),
147
+ epochNumber: Number(job.getEpochNumber())
148
+ })));
149
+ }
150
+ async getActiveJobsForEpoch(epochBigInt) {
151
+ const jobs = await this.getJobs();
152
+ const epochNumber = Number(epochBigInt);
153
+ return jobs.filter((job)=>job.epochNumber === epochNumber && !EpochProvingJobTerminalState.includes(job.status));
154
+ }
155
+ checkMaximumPendingJobs() {
156
+ const { maxPendingJobs } = this.options;
157
+ return maxPendingJobs === 0 || this.jobs.size < maxPendingJobs;
158
+ }
159
+ async createProvingJob(epochNumber) {
160
+ if (!this.checkMaximumPendingJobs()) {
161
+ throw new Error(`Maximum pending proving jobs ${this.options.maxPendingJobs} reached. Cannot create new job.`);
162
+ }
163
+ // Gather blocks for this epoch
164
+ const cachedEpochData = this.cachedEpochData?.epochNumber === epochNumber ? this.cachedEpochData : undefined;
165
+ const { blocks, txs } = cachedEpochData ?? await this.gatherEpochData(epochNumber);
166
+ const fromBlock = blocks[0].number;
167
+ const toBlock = blocks.at(-1).number;
168
+ // Fast forward world state to right before the target block and get a fork
169
+ this.log.verbose(`Creating proving job for epoch ${epochNumber} for block range ${fromBlock} to ${toBlock}`);
170
+ await this.worldState.syncImmediate(toBlock);
171
+ // Create a processor using the forked world state
172
+ const publicProcessorFactory = new PublicProcessorFactory(this.contractDataSource, this.dateProvider, this.telemetryClient);
173
+ const cleanUp = ()=>{
174
+ this.jobs.delete(job.getId());
175
+ return Promise.resolve();
176
+ };
177
+ const [_, endTimestamp] = getTimestampRangeForEpoch(epochNumber + 1n, await this.getL1Constants());
178
+ const deadline = new Date(Number(endTimestamp) * 1000);
179
+ const job = this.doCreateEpochProvingJob(epochNumber, deadline, blocks, txs, publicProcessorFactory, cleanUp);
180
+ this.jobs.set(job.getId(), job);
181
+ return job;
182
+ }
183
+ getL1Constants() {
184
+ return this.l2BlockSource.getL1Constants();
185
+ }
186
+ /** Monitors for new blocks and requests their txs from the p2p layer to ensure they are available for proving. */ async checkForTxs() {
187
+ const blockNumber = await this.l2BlockSource.getBlockNumber();
188
+ if (this.lastBlockNumber === undefined || blockNumber > this.lastBlockNumber) {
189
+ const block = await this.l2BlockSource.getBlock(blockNumber);
190
+ if (!block) {
191
+ return;
287
192
  }
288
- },
289
- (() => {
290
- const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
291
- _createProvingJob_decorators = [trackSpan('ProverNode.createProvingJob', epochNumber => ({ [Attributes.EPOCH_NUMBER]: Number(epochNumber) }))];
292
- _getL1Constants_decorators = [memoize];
293
- _checkForTxs_decorators = [trackSpan('ProverNode.checkForTxs')];
294
- _gatherEpochData_decorators = [trackSpan('ProverNode.gatherEpochData', epochNumber => ({ [Attributes.EPOCH_NUMBER]: Number(epochNumber) }))];
295
- __esDecorate(_a, null, _createProvingJob_decorators, { kind: "method", name: "createProvingJob", static: false, private: false, access: { has: obj => "createProvingJob" in obj, get: obj => obj.createProvingJob }, metadata: _metadata }, null, _instanceExtraInitializers);
296
- __esDecorate(_a, null, _getL1Constants_decorators, { kind: "method", name: "getL1Constants", static: false, private: false, access: { has: obj => "getL1Constants" in obj, get: obj => obj.getL1Constants }, metadata: _metadata }, null, _instanceExtraInitializers);
297
- __esDecorate(_a, null, _checkForTxs_decorators, { kind: "method", name: "checkForTxs", static: false, private: false, access: { has: obj => "checkForTxs" in obj, get: obj => obj.checkForTxs }, metadata: _metadata }, null, _instanceExtraInitializers);
298
- __esDecorate(_a, null, _gatherEpochData_decorators, { kind: "method", name: "gatherEpochData", static: false, private: false, access: { has: obj => "gatherEpochData" in obj, get: obj => obj.gatherEpochData }, metadata: _metadata }, null, _instanceExtraInitializers);
299
- if (_metadata) Object.defineProperty(_a, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
300
- })(),
301
- _a;
302
- })();
303
- export { ProverNode };
193
+ const txHashes = block.body.txEffects.map((tx)=>tx.txHash);
194
+ this.log.verbose(`Fetching ${txHashes.length} tx hashes for block number ${blockNumber} from coordination`);
195
+ await this.coordination.getTxsByHash(txHashes); // This stores the txs in the tx pool, no need to persist them here
196
+ this.lastBlockNumber = blockNumber;
197
+ }
198
+ }
199
+ async gatherEpochData(epochNumber) {
200
+ // Gather blocks for this epoch and their txs
201
+ const blocks = await this.gatherBlocks(epochNumber);
202
+ const txs = await this.gatherTxs(epochNumber, blocks);
203
+ return {
204
+ blocks,
205
+ txs
206
+ };
207
+ }
208
+ async gatherBlocks(epochNumber) {
209
+ const blocks = await this.l2BlockSource.getBlocksForEpoch(epochNumber);
210
+ if (blocks.length === 0) {
211
+ throw new EmptyEpochError(epochNumber);
212
+ }
213
+ return blocks;
214
+ }
215
+ async gatherTxs(epochNumber, blocks) {
216
+ const txsToFind = blocks.flatMap((block)=>block.body.txEffects.map((tx)=>tx.txHash));
217
+ const txs = await this.coordination.getTxsByHash(txsToFind);
218
+ if (txs.length === txsToFind.length) {
219
+ this.log.verbose(`Gathered all ${txs.length} txs for epoch ${epochNumber}`, {
220
+ epochNumber
221
+ });
222
+ return txs;
223
+ }
224
+ const txHashesFound = await Promise.all(txs.map((tx)=>tx.getTxHash()));
225
+ const missingTxHashes = txsToFind.filter((txHashToFind)=>!txHashesFound.some((txHashFound)=>txHashToFind.equals(txHashFound))).join(', ');
226
+ throw new Error(`Txs not found for epoch ${epochNumber}: ${missingTxHashes}`);
227
+ }
228
+ /** Extracted for testing purposes. */ doCreateEpochProvingJob(epochNumber, deadline, blocks, txs, publicProcessorFactory, cleanUp) {
229
+ return new EpochProvingJob(this.worldState, epochNumber, blocks, txs, this.prover.createEpochProver(), publicProcessorFactory, this.publisher, this.l2BlockSource, this.l1ToL2MessageSource, this.metrics, deadline, {
230
+ parallelBlockLimit: this.options.maxParallelBlocksPerEpoch
231
+ }, cleanUp);
232
+ }
233
+ /** Extracted for testing purposes. */ async triggerMonitors() {
234
+ await this.epochsMonitor.work();
235
+ }
236
+ }
237
+ _ts_decorate([
238
+ trackSpan('ProverNode.createProvingJob', (epochNumber)=>({
239
+ [Attributes.EPOCH_NUMBER]: Number(epochNumber)
240
+ }))
241
+ ], ProverNode.prototype, "createProvingJob", null);
242
+ _ts_decorate([
243
+ memoize
244
+ ], ProverNode.prototype, "getL1Constants", null);
245
+ _ts_decorate([
246
+ trackSpan('ProverNode.checkForTxs')
247
+ ], ProverNode.prototype, "checkForTxs", null);
248
+ _ts_decorate([
249
+ trackSpan('ProverNode.gatherEpochData', (epochNumber)=>({
250
+ [Attributes.EPOCH_NUMBER]: Number(epochNumber)
251
+ }))
252
+ ], ProverNode.prototype, "gatherEpochData", null);
304
253
  class EmptyEpochError extends Error {
305
- constructor(epochNumber) {
254
+ constructor(epochNumber){
306
255
  super(`No blocks found for epoch ${epochNumber}`);
307
256
  this.name = 'EmptyEpochError';
308
257
  }
309
258
  }
310
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmVyLW5vZGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcHJvdmVyLW5vZGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFHTCxzQkFBc0IsRUFZdEIseUJBQXlCLEVBQ3pCLE9BQU8sR0FDUixNQUFNLHNCQUFzQixDQUFDO0FBRTlCLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNuRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFHdkQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDakUsT0FBTyxFQUNMLFVBQVUsRUFJVixrQkFBa0IsRUFDbEIsU0FBUyxHQUNWLE1BQU0seUJBQXlCLENBQUM7QUFHakMsT0FBTyxFQUFFLGVBQWUsRUFBNkIsTUFBTSw0QkFBNEIsQ0FBQztBQUN4RixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFnQmpEOzs7OztHQUtHO0lBQ1UsVUFBVTs7Ozs7OztzQkFBVixVQUFVO1lBZXJCLFlBQ3FCLE1BQTBCLEVBQzFCLFNBQThCLEVBQzlCLGFBQTZDLEVBQzdDLG1CQUF3QyxFQUN4QyxrQkFBc0MsRUFDdEMsVUFBa0MsRUFDbEMsWUFBaUQsRUFDakQsYUFBNEIsRUFDNUIsV0FBd0IsRUFDeEIsYUFBNEIsRUFDNUIsYUFBMkIsRUFDM0IsV0FBd0IsRUFDM0MsVUFBc0MsRUFBRSxFQUNyQixrQkFBbUMsa0JBQWtCLEVBQUU7Z0JBYnZELFdBQU0sSUFoQmhCLG1EQUFVLEVBZ0JBLE1BQU0sRUFBb0I7Z0JBQzFCLGNBQVMsR0FBVCxTQUFTLENBQXFC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
@@ -1,5 +1,5 @@
1
- import { type EpochProverManager } from '@aztec/circuit-types';
2
- import { type ProverNodePublisher } from '../prover-node-publisher.js';
1
+ import type { EpochProverManager } from '@aztec/stdlib/interfaces/server';
2
+ import type { ProverNodePublisher } from '../prover-node-publisher.js';
3
3
  import { ProverNode } from '../prover-node.js';
4
4
  declare class TestProverNode_ extends ProverNode {
5
5
  prover: EpochProverManager;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/test/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE/D,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C,cAAM,eAAgB,SAAQ,UAAU;IACtB,MAAM,EAAG,kBAAkB,CAAC;IAC5B,SAAS,EAAG,mBAAmB,CAAC;CACjD;AAED,MAAM,MAAM,cAAc,GAAG,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/test/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAE1E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C,cAAM,eAAgB,SAAQ,UAAU;IACtB,MAAM,EAAG,kBAAkB,CAAC;IAC5B,SAAS,EAAG,mBAAmB,CAAC;CACjD;AAED,MAAM,MAAM,cAAc,GAAG,eAAe,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import { ProverNode } from '../prover-node.js';
2
2
  class TestProverNode_ extends ProverNode {
3
+ prover;
4
+ publisher;
3
5
  }
4
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVzdC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFL0MsTUFBTSxlQUFnQixTQUFRLFVBQVU7Q0FHdkMifQ==