@aztec/prover-node 0.65.1 → 0.66.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.
- package/dest/config.d.ts +8 -1
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +19 -2
- package/dest/factory.d.ts +2 -1
- package/dest/factory.d.ts.map +1 -1
- package/dest/factory.js +11 -4
- package/dest/job/epoch-proving-job.d.ts +7 -4
- package/dest/job/epoch-proving-job.d.ts.map +1 -1
- package/dest/job/epoch-proving-job.js +25 -32
- package/dest/prover-cache/cache_manager.d.ts +15 -0
- package/dest/prover-cache/cache_manager.d.ts.map +1 -0
- package/dest/prover-cache/cache_manager.js +57 -0
- package/dest/prover-cache/kv_cache.d.ts +11 -0
- package/dest/prover-cache/kv_cache.d.ts.map +1 -0
- package/dest/prover-cache/kv_cache.js +20 -0
- package/dest/prover-node.d.ts +6 -3
- package/dest/prover-node.d.ts.map +1 -1
- package/dest/prover-node.js +12 -11
- package/package.json +16 -16
- package/src/config.ts +40 -8
- package/src/factory.ts +16 -6
- package/src/job/epoch-proving-job.ts +24 -44
- package/src/prover-cache/cache_manager.ts +69 -0
- package/src/prover-cache/kv_cache.ts +27 -0
- package/src/prover-node.ts +16 -12
package/dest/prover-node.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { EpochProofQuotePayload, tryStop, } from '@aztec/circuit-types';
|
|
2
2
|
import { compact } from '@aztec/foundation/collection';
|
|
3
|
+
import { sha256 } from '@aztec/foundation/crypto';
|
|
3
4
|
import { createDebugLogger } from '@aztec/foundation/log';
|
|
4
5
|
import { PublicProcessorFactory } from '@aztec/simulator';
|
|
5
6
|
import { EpochProvingJob } from './job/epoch-proving-job.js';
|
|
@@ -11,7 +12,7 @@ import { ProverNodeMetrics } from './metrics.js';
|
|
|
11
12
|
* proof for the epoch, and submits it to L1.
|
|
12
13
|
*/
|
|
13
14
|
export class ProverNode {
|
|
14
|
-
constructor(prover, publisher, l2BlockSource, l1ToL2MessageSource, contractDataSource, worldState, coordination, quoteProvider, quoteSigner, claimsMonitor, epochsMonitor, bondManager, telemetryClient, options = {}) {
|
|
15
|
+
constructor(prover, publisher, l2BlockSource, l1ToL2MessageSource, contractDataSource, worldState, coordination, quoteProvider, quoteSigner, claimsMonitor, epochsMonitor, bondManager, telemetryClient, proverCacheManager, options = {}) {
|
|
15
16
|
this.prover = prover;
|
|
16
17
|
this.publisher = publisher;
|
|
17
18
|
this.l2BlockSource = l2BlockSource;
|
|
@@ -25,11 +26,13 @@ export class ProverNode {
|
|
|
25
26
|
this.epochsMonitor = epochsMonitor;
|
|
26
27
|
this.bondManager = bondManager;
|
|
27
28
|
this.telemetryClient = telemetryClient;
|
|
29
|
+
this.proverCacheManager = proverCacheManager;
|
|
28
30
|
this.log = createDebugLogger('aztec:prover-node');
|
|
29
31
|
this.jobs = new Map();
|
|
30
32
|
this.options = {
|
|
31
33
|
pollingIntervalMs: 1000,
|
|
32
34
|
maxPendingJobs: 100,
|
|
35
|
+
maxParallelBlocksPerEpoch: 32,
|
|
33
36
|
...compact(options),
|
|
34
37
|
};
|
|
35
38
|
this.metrics = new ProverNodeMetrics(telemetryClient, 'ProverNode');
|
|
@@ -186,24 +189,22 @@ export class ProverNode {
|
|
|
186
189
|
// Fast forward world state to right before the target block and get a fork
|
|
187
190
|
this.log.verbose(`Creating proving job for epoch ${epochNumber} for block range ${fromBlock} to ${toBlock}`);
|
|
188
191
|
await this.worldState.syncImmediate(fromBlock - 1);
|
|
189
|
-
// NB: separated the dbs as both a block builder and public processor need to track and update tree state
|
|
190
|
-
// see public_processor.ts for context
|
|
191
|
-
const publicDb = await this.worldState.fork(fromBlock - 1);
|
|
192
|
-
const proverDb = await this.worldState.fork(fromBlock - 1);
|
|
193
192
|
// Create a processor using the forked world state
|
|
194
193
|
const publicProcessorFactory = new PublicProcessorFactory(this.contractDataSource, this.telemetryClient);
|
|
194
|
+
const epochHash = sha256(Buffer.concat(blocks.map(block => block.hash().toBuffer())));
|
|
195
|
+
const proverCache = await this.proverCacheManager.openCache(epochNumber, epochHash);
|
|
195
196
|
const cleanUp = async () => {
|
|
196
|
-
await
|
|
197
|
-
await
|
|
197
|
+
await proverCache.close();
|
|
198
|
+
await this.proverCacheManager.removeStaleCaches(epochNumber);
|
|
198
199
|
this.jobs.delete(job.getId());
|
|
199
200
|
};
|
|
200
|
-
const job = this.doCreateEpochProvingJob(epochNumber, blocks,
|
|
201
|
+
const job = this.doCreateEpochProvingJob(epochNumber, blocks, proverCache, publicProcessorFactory, cleanUp);
|
|
201
202
|
this.jobs.set(job.getId(), job);
|
|
202
203
|
return job;
|
|
203
204
|
}
|
|
204
205
|
/** Extracted for testing purposes. */
|
|
205
|
-
doCreateEpochProvingJob(epochNumber, blocks,
|
|
206
|
-
return new EpochProvingJob(
|
|
206
|
+
doCreateEpochProvingJob(epochNumber, blocks, proverCache, publicProcessorFactory, cleanUp) {
|
|
207
|
+
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);
|
|
207
208
|
}
|
|
208
209
|
/** Extracted for testing purposes. */
|
|
209
210
|
async triggerMonitors() {
|
|
@@ -211,4 +212,4 @@ export class ProverNode {
|
|
|
211
212
|
await this.claimsMonitor.work();
|
|
212
213
|
}
|
|
213
214
|
}
|
|
214
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmVyLW5vZGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcHJvdmVyLW5vZGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUdMLHNCQUFzQixFQVV0QixPQUFPLEdBQ1IsTUFBTSxzQkFBc0IsQ0FBQztBQUU5QixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFHMUQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFJMUQsT0FBTyxFQUFFLGVBQWUsRUFBNkIsTUFBTSw0QkFBNEIsQ0FBQztBQUN4RixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFXakQ7Ozs7O0dBS0c7QUFDSCxNQUFNLE9BQU8sVUFBVTtJQVFyQixZQUNtQixNQUEwQixFQUMxQixTQUFzQixFQUN0QixhQUE2QyxFQUM3QyxtQkFBd0MsRUFDeEMsa0JBQXNDLEVBQ3RDLFVBQWtDLEVBQ2xDLFlBQWlELEVBQ2pELGFBQTRCLEVBQzVCLFdBQXdCLEVBQ3hCLGFBQTRCLEVBQzVCLGFBQTJCLEVBQzNCLFdBQXdCLEVBQ3hCLGVBQWdDLEVBQ2pELFVBQXNDLEVBQUU7UUFidkIsV0FBTSxHQUFOLE1BQU0sQ0FBb0I7UUFDMUIsY0FBUyxHQUFULFNBQVMsQ0FBYTtRQUN0QixrQkFBYSxHQUFiLGFBQWEsQ0FBZ0M7UUFDN0Msd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFxQjtRQUN4Qyx1QkFBa0IsR0FBbEIsa0JBQWtCLENBQW9CO1FBQ3RDLGVBQVUsR0FBVixVQUFVLENBQXdCO1FBQ2xDLGlCQUFZLEdBQVosWUFBWSxDQUFxQztRQUNqRCxrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUM1QixnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUN4QixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUM1QixrQkFBYSxHQUFiLGFBQWEsQ0FBYztRQUMzQixnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUN4QixvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUFwQjNDLFFBQUcsR0FBRyxpQkFBaUIsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBRzdDLFNBQUksR0FBaUMsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQW9CckQsSUFBSSxDQUFDLE9BQU8sR0FBRztZQUNiLGlCQUFpQixFQUFFLElBQUs7WUFDeEIsY0FBYyxFQUFFLEdBQUc7WUFDbkIsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDO1NBQ3BCLENBQUM7UUFFRixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksaUJBQWlCLENBQUMsZUFBZSxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQ3RFLENBQUM7SUFFRCxLQUFLLENBQUMsV0FBVyxDQUFDLFVBQTJCO1FBQzNDLElBQUksVUFBVSxDQUFDLFlBQVksS0FBSyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztZQUM3RCxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxtQ0FBbUMsVUFBVSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUM7WUFDL0UsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLENBQUM7WUFDSCxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQy9DLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxVQUFVLENBQUMsWUFBWSxDQUFDO1FBQ3pELENBQUM7UUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1lBQ2IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsa0NBQWtDLFVBQVUsQ0FBQyxZQUFZLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNuRixDQUFDO1FBRUQsSUFBSSxDQUFDO1lBQ0gsZ0dBQWdHO1lBQ2hHLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUN0QyxDQUFDO1FBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNiLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLDZEQUE2RCxVQUFVLENBQUMsWUFBWSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDOUcsQ0FBQztJQUNILENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLHNCQUFzQixDQUFDLFdBQW1CO1FBQzlDLElBQUksQ0FBQztZQUNILE1BQU0sS0FBSyxHQUFHLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUNuRCxJQUFJLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxZQUFZLEdBQUcsV0FBVyxFQUFFLENBQUM7Z0JBQy9DLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQy9DLENBQUM7aUJBQU0sSUFBSSxLQUFLLElBQUksS0FBSyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLEVBQUUsQ0FBQztnQkFDakYsTUFBTSxlQUFlLEdBQUcsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLHNCQUFzQixFQUFFLENBQUM7Z0JBQzFFLElBQUksZUFBZSxLQUFLLFNBQVMsSUFBSSxlQUFlLEdBQUcsS0FBSyxDQUFDLFlBQVksRUFBRSxDQUFDO29CQUMxRSxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ2hDLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDYixJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxtQ0FBbUMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUMzRCxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxXQUFtQjtRQUM1QyxJQUFJLENBQUM7WUFDSCxrQ0FBa0M7WUFDbEMsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ3ZFLE1BQU0sWUFBWSxHQUFHLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ3BGLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDbEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsK0JBQStCLFdBQVcsRUFBRSxDQUFDLENBQUM7Z0JBQy9ELE9BQU87WUFDVCxDQUFDO1lBRUQsK0RBQStEO1lBQy9ELE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBRTNELCtCQUErQjtZQUMvQixNQUFNLEtBQUssR0FBRyxzQkFBc0IsQ0FBQyxJQUFJLENBQUM7Z0JBQ3hDLEdBQUcsWUFBWTtnQkFDZixZQUFZLEVBQUUsTUFBTSxDQUFDLFdBQVcsQ0FBQztnQkFDakMsTUFBTSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLEVBQUU7Z0JBQ3pDLGNBQWMsRUFBRSxZQUFZLENBQUMsY0FBYyxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsRUFBRSw0QkFBNEI7YUFDN0csQ0FBQyxDQUFDO1lBQ0gsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUVsRCw2QkFBNkI7WUFDN0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQ1gsMkJBQTJCLFdBQVcsZ0JBQWdCLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLE9BQU8sTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBRSxDQUFDLE1BQU0sRUFBRSxFQUNwRyxLQUFLLENBQUMsVUFBVSxFQUFFLENBQ25CLENBQUM7WUFDRixNQUFNLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMzQyxDQUFDO1FBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNiLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLGdDQUFnQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3hELENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEtBQUssQ0FBQyxLQUFLO1FBQ1QsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQy9CLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQy9CLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsSUFBSTtRQUNSLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDckMsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2hDLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNoQyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDekIsTUFBTSxPQUFPLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDM0IsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDekUsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzdCLE1BQU0sT0FBTyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNqQyxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDbEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQscURBQXFEO0lBQzlDLG1CQUFtQixDQUFDLEtBQXNCO1FBQy9DLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLHlCQUF5QixFQUFFLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNuRSxPQUFPLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRU8scUJBQXFCLENBQUMsS0FBc0I7UUFDbEQsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxLQUFLLENBQUMsV0FBNEI7UUFDN0MsTUFBTSxHQUFHLEdBQUcsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7UUFDN0QsT0FBTyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDbkIsQ0FBQztJQUVEOztPQUVHO0lBQ0ksS0FBSyxDQUFDLFVBQVUsQ0FBQyxXQUE0QjtRQUNsRCxNQUFNLEdBQUcsR0FBRyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztRQUM3RCxLQUFLLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyx1QkFBdUIsV0FBVyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUN6RixDQUFDO0lBRUQ7O09BRUc7SUFDSSxTQUFTO1FBQ2QsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3JCLENBQUM7SUFFRDs7T0FFRztJQUNJLE9BQU87UUFDWixPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEdBQUcsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ25ILENBQUM7SUFFTyx1QkFBdUI7UUFDN0IsTUFBTSxFQUFFLGNBQWMsRUFBRSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDeEMsT0FBTyxjQUFjLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLGNBQWMsQ0FBQztJQUNqRSxDQUFDO0lBRU8sS0FBSyxDQUFDLGdCQUFnQixDQUFDLFdBQW1CO1FBQ2hELElBQUksQ0FBQyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsRUFBRSxDQUFDO1lBQ3BDLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0NBQWdDLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxrQ0FBa0MsQ0FBQyxDQUFDO1FBQ2pILENBQUM7UUFFRCwrQkFBK0I7UUFDL0IsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3ZFLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN4QixNQUFNLElBQUksS0FBSyxDQUFDLDZCQUE2QixXQUFXLEVBQUUsQ0FBQyxDQUFDO1FBQzlELENBQUM7UUFDRCxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO1FBQ25DLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUUsQ0FBQyxNQUFNLENBQUM7UUFFdEMsMkVBQTJFO1FBQzNFLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLGtDQUFrQyxXQUFXLG9CQUFvQixTQUFTLE9BQU8sT0FBTyxFQUFFLENBQUMsQ0FBQztRQUM3RyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNuRCx5R0FBeUc7UUFDekcsc0NBQXNDO1FBQ3RDLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzNELE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBRTNELGtEQUFrRDtRQUNsRCxNQUFNLHNCQUFzQixHQUFHLElBQUksc0JBQXNCLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUV6RyxNQUFNLE9BQU8sR0FBRyxLQUFLLElBQUksRUFBRTtZQUN6QixNQUFNLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUN2QixNQUFNLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUN2QixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUNoQyxDQUFDLENBQUM7UUFFRixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsV0FBVyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLHNCQUFzQixFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ25ILElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNoQyxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFFRCxzQ0FBc0M7SUFDNUIsdUJBQXVCLENBQy9CLFdBQW1CLEVBQ25CLE1BQWlCLEVBQ2pCLFFBQW1DLEVBQ25DLFFBQW1DLEVBQ25DLHNCQUE4QyxFQUM5QyxPQUE0QjtRQUU1QixPQUFPLElBQUksZUFBZSxDQUN4QixRQUFRLEVBQ1IsV0FBVyxFQUNYLE1BQU0sRUFDTixJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxFQUN2QyxzQkFBc0IsRUFDdEIsSUFBSSxDQUFDLFNBQVMsRUFDZCxJQUFJLENBQUMsYUFBYSxFQUNsQixJQUFJLENBQUMsbUJBQW1CLEVBQ3hCLElBQUksQ0FBQyxZQUFZLEVBQ2pCLElBQUksQ0FBQyxPQUFPLEVBQ1osT0FBTyxDQUNSLENBQUM7SUFDSixDQUFDO0lBRUQsc0NBQXNDO0lBQzVCLEtBQUssQ0FBQyxlQUFlO1FBQzdCLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNoQyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDbEMsQ0FBQztDQUNGIn0=
|
|
215
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmVyLW5vZGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcHJvdmVyLW5vZGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUdMLHNCQUFzQixFQVV0QixPQUFPLEdBQ1IsTUFBTSxzQkFBc0IsQ0FBQztBQUU5QixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDdkQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRzFELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBSTFELE9BQU8sRUFBRSxlQUFlLEVBQTZCLE1BQU0sNEJBQTRCLENBQUM7QUFDeEYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBYWpEOzs7OztHQUtHO0FBQ0gsTUFBTSxPQUFPLFVBQVU7SUFRckIsWUFDbUIsTUFBMEIsRUFDMUIsU0FBc0IsRUFDdEIsYUFBNkMsRUFDN0MsbUJBQXdDLEVBQ3hDLGtCQUFzQyxFQUN0QyxVQUFrQyxFQUNsQyxZQUFpRCxFQUNqRCxhQUE0QixFQUM1QixXQUF3QixFQUN4QixhQUE0QixFQUM1QixhQUEyQixFQUMzQixXQUF3QixFQUN4QixlQUFnQyxFQUNoQyxrQkFBc0MsRUFDdkQsVUFBc0MsRUFBRTtRQWR2QixXQUFNLEdBQU4sTUFBTSxDQUFvQjtRQUMxQixjQUFTLEdBQVQsU0FBUyxDQUFhO1FBQ3RCLGtCQUFhLEdBQWIsYUFBYSxDQUFnQztRQUM3Qyx3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXFCO1FBQ3hDLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBb0I7UUFDdEMsZUFBVSxHQUFWLFVBQVUsQ0FBd0I7UUFDbEMsaUJBQVksR0FBWixZQUFZLENBQXFDO1FBQ2pELGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzVCLGdCQUFXLEdB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
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/prover-node",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.66.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": "./dest/index.js"
|
|
@@ -52,21 +52,21 @@
|
|
|
52
52
|
]
|
|
53
53
|
},
|
|
54
54
|
"dependencies": {
|
|
55
|
-
"@aztec/archiver": "0.
|
|
56
|
-
"@aztec/bb-prover": "0.
|
|
57
|
-
"@aztec/circuit-types": "0.
|
|
58
|
-
"@aztec/circuits.js": "0.
|
|
59
|
-
"@aztec/ethereum": "0.
|
|
60
|
-
"@aztec/foundation": "0.
|
|
61
|
-
"@aztec/kv-store": "0.
|
|
62
|
-
"@aztec/l1-artifacts": "0.
|
|
63
|
-
"@aztec/p2p": "0.
|
|
64
|
-
"@aztec/prover-client": "0.
|
|
65
|
-
"@aztec/sequencer-client": "0.
|
|
66
|
-
"@aztec/simulator": "0.
|
|
67
|
-
"@aztec/telemetry-client": "0.
|
|
68
|
-
"@aztec/types": "0.
|
|
69
|
-
"@aztec/world-state": "0.
|
|
55
|
+
"@aztec/archiver": "0.66.0",
|
|
56
|
+
"@aztec/bb-prover": "0.66.0",
|
|
57
|
+
"@aztec/circuit-types": "0.66.0",
|
|
58
|
+
"@aztec/circuits.js": "0.66.0",
|
|
59
|
+
"@aztec/ethereum": "0.66.0",
|
|
60
|
+
"@aztec/foundation": "0.66.0",
|
|
61
|
+
"@aztec/kv-store": "0.66.0",
|
|
62
|
+
"@aztec/l1-artifacts": "0.66.0",
|
|
63
|
+
"@aztec/p2p": "0.66.0",
|
|
64
|
+
"@aztec/prover-client": "0.66.0",
|
|
65
|
+
"@aztec/sequencer-client": "0.66.0",
|
|
66
|
+
"@aztec/simulator": "0.66.0",
|
|
67
|
+
"@aztec/telemetry-client": "0.66.0",
|
|
68
|
+
"@aztec/types": "0.66.0",
|
|
69
|
+
"@aztec/world-state": "0.66.0",
|
|
70
70
|
"source-map-support": "^0.5.21",
|
|
71
71
|
"tslib": "^2.4.0",
|
|
72
72
|
"viem": "^2.7.15"
|
package/src/config.ts
CHANGED
|
@@ -1,4 +1,11 @@
|
|
|
1
1
|
import { type ArchiverConfig, archiverConfigMappings, getArchiverConfigFromEnv } from '@aztec/archiver';
|
|
2
|
+
import { type ACVMConfig, type BBConfig } from '@aztec/bb-prover';
|
|
3
|
+
import {
|
|
4
|
+
type ProverAgentConfig,
|
|
5
|
+
type ProverBrokerConfig,
|
|
6
|
+
proverAgentConfigMappings,
|
|
7
|
+
proverBrokerConfigMappings,
|
|
8
|
+
} from '@aztec/circuit-types';
|
|
2
9
|
import {
|
|
3
10
|
type ConfigMappingsType,
|
|
4
11
|
bigintConfigHelper,
|
|
@@ -7,7 +14,12 @@ import {
|
|
|
7
14
|
} from '@aztec/foundation/config';
|
|
8
15
|
import { type DataStoreConfig, dataConfigMappings, getDataConfigFromEnv } from '@aztec/kv-store/config';
|
|
9
16
|
import { type P2PConfig, getP2PConfigFromEnv, p2pConfigMappings } from '@aztec/p2p';
|
|
10
|
-
import {
|
|
17
|
+
import {
|
|
18
|
+
type ProverClientConfig,
|
|
19
|
+
bbConfigMappings,
|
|
20
|
+
getProverEnvVars,
|
|
21
|
+
proverClientConfigMappings,
|
|
22
|
+
} from '@aztec/prover-client';
|
|
11
23
|
import {
|
|
12
24
|
type PublisherConfig,
|
|
13
25
|
type TxSenderConfig,
|
|
@@ -34,10 +46,14 @@ export type ProverNodeConfig = ArchiverConfig &
|
|
|
34
46
|
DataStoreConfig &
|
|
35
47
|
ProverCoordinationConfig &
|
|
36
48
|
ProverBondManagerConfig &
|
|
37
|
-
QuoteProviderConfig &
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
49
|
+
QuoteProviderConfig &
|
|
50
|
+
SpecificProverNodeConfig;
|
|
51
|
+
|
|
52
|
+
type SpecificProverNodeConfig = {
|
|
53
|
+
proverNodeMaxPendingJobs: number;
|
|
54
|
+
proverNodePollingIntervalMs: number;
|
|
55
|
+
proverNodeMaxParallelBlocksPerEpoch: number;
|
|
56
|
+
};
|
|
41
57
|
|
|
42
58
|
export type QuoteProviderConfig = {
|
|
43
59
|
quoteProviderBasisPointFee: number;
|
|
@@ -45,9 +61,7 @@ export type QuoteProviderConfig = {
|
|
|
45
61
|
quoteProviderUrl?: string;
|
|
46
62
|
};
|
|
47
63
|
|
|
48
|
-
const specificProverNodeConfigMappings: ConfigMappingsType<
|
|
49
|
-
Pick<ProverNodeConfig, 'proverNodePollingIntervalMs' | 'proverNodeMaxPendingJobs'>
|
|
50
|
-
> = {
|
|
64
|
+
const specificProverNodeConfigMappings: ConfigMappingsType<SpecificProverNodeConfig> = {
|
|
51
65
|
proverNodeMaxPendingJobs: {
|
|
52
66
|
env: 'PROVER_NODE_MAX_PENDING_JOBS',
|
|
53
67
|
description: 'The maximum number of pending jobs for the prover node',
|
|
@@ -58,6 +72,11 @@ const specificProverNodeConfigMappings: ConfigMappingsType<
|
|
|
58
72
|
description: 'The interval in milliseconds to poll for new jobs',
|
|
59
73
|
...numberConfigHelper(1000),
|
|
60
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
|
+
},
|
|
61
80
|
};
|
|
62
81
|
|
|
63
82
|
const quoteProviderConfigMappings: ConfigMappingsType<QuoteProviderConfig> = {
|
|
@@ -107,3 +126,16 @@ export function getProverNodeConfigFromEnv(): ProverNodeConfig {
|
|
|
107
126
|
...getConfigFromMappings(proverBondManagerConfigMappings),
|
|
108
127
|
};
|
|
109
128
|
}
|
|
129
|
+
|
|
130
|
+
export function getProverNodeBrokerConfigFromEnv(): ProverBrokerConfig {
|
|
131
|
+
return {
|
|
132
|
+
...getConfigFromMappings(proverBrokerConfigMappings),
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
export function getProverNodeAgentConfigFromEnv(): ProverAgentConfig & BBConfig & ACVMConfig {
|
|
137
|
+
return {
|
|
138
|
+
...getConfigFromMappings(proverAgentConfigMappings),
|
|
139
|
+
...getConfigFromMappings(bbConfigMappings),
|
|
140
|
+
};
|
|
141
|
+
}
|
package/src/factory.ts
CHANGED
|
@@ -1,24 +1,27 @@
|
|
|
1
1
|
import { type Archiver, createArchiver } from '@aztec/archiver';
|
|
2
|
-
import { type ProverCoordination } from '@aztec/circuit-types';
|
|
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
5
|
import { type DebugLogger, createDebugLogger } 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';
|
|
9
|
+
import { createAndStartProvingBroker } from '@aztec/prover-client/broker';
|
|
9
10
|
import { L1Publisher } from '@aztec/sequencer-client';
|
|
10
11
|
import { type TelemetryClient } from '@aztec/telemetry-client';
|
|
11
12
|
import { NoopTelemetryClient } from '@aztec/telemetry-client/noop';
|
|
12
13
|
import { createWorldStateSynchronizer } from '@aztec/world-state';
|
|
13
14
|
|
|
15
|
+
import { join } from 'path';
|
|
14
16
|
import { createPublicClient, getAddress, getContract, http } from 'viem';
|
|
15
17
|
|
|
16
18
|
import { createBondManager } from './bond/factory.js';
|
|
17
19
|
import { type ProverNodeConfig, type QuoteProviderConfig } from './config.js';
|
|
18
20
|
import { ClaimsMonitor } from './monitors/claims-monitor.js';
|
|
19
21
|
import { EpochMonitor } from './monitors/epoch-monitor.js';
|
|
22
|
+
import { ProverCacheManager } from './prover-cache/cache_manager.js';
|
|
20
23
|
import { createProverCoordination } from './prover-coordination/factory.js';
|
|
21
|
-
import { ProverNode } from './prover-node.js';
|
|
24
|
+
import { ProverNode, type ProverNodeOptions } from './prover-node.js';
|
|
22
25
|
import { HttpQuoteProvider } from './quote-provider/http.js';
|
|
23
26
|
import { SimpleQuoteProvider } from './quote-provider/simple.js';
|
|
24
27
|
import { QuoteSigner } from './quote-signer.js';
|
|
@@ -32,6 +35,7 @@ export async function createProverNode(
|
|
|
32
35
|
aztecNodeTxProvider?: ProverCoordination;
|
|
33
36
|
archiver?: Archiver;
|
|
34
37
|
publisher?: L1Publisher;
|
|
38
|
+
broker?: ProvingJobBroker;
|
|
35
39
|
} = {},
|
|
36
40
|
) {
|
|
37
41
|
const telemetry = deps.telemetry ?? new NoopTelemetryClient();
|
|
@@ -39,11 +43,12 @@ export async function createProverNode(
|
|
|
39
43
|
const archiver = deps.archiver ?? (await createArchiver(config, telemetry, { blockUntilSync: true }));
|
|
40
44
|
log.verbose(`Created archiver and synced to block ${await archiver.getBlockNumber()}`);
|
|
41
45
|
|
|
42
|
-
const worldStateConfig = { ...config, worldStateProvenBlocksOnly:
|
|
46
|
+
const worldStateConfig = { ...config, worldStateProvenBlocksOnly: false };
|
|
43
47
|
const worldStateSynchronizer = await createWorldStateSynchronizer(worldStateConfig, archiver, telemetry);
|
|
44
48
|
await worldStateSynchronizer.start();
|
|
45
49
|
|
|
46
|
-
const
|
|
50
|
+
const broker = deps.broker ?? (await createAndStartProvingBroker(config, telemetry));
|
|
51
|
+
const prover = await createProverClient(config, worldStateSynchronizer, broker, telemetry);
|
|
47
52
|
|
|
48
53
|
// REFACTOR: Move publisher out of sequencer package and into an L1-related package
|
|
49
54
|
const publisher = deps.publisher ?? new L1Publisher(config, telemetry);
|
|
@@ -60,9 +65,10 @@ export async function createProverNode(
|
|
|
60
65
|
const quoteProvider = createQuoteProvider(config);
|
|
61
66
|
const quoteSigner = createQuoteSigner(config);
|
|
62
67
|
|
|
63
|
-
const proverNodeConfig = {
|
|
68
|
+
const proverNodeConfig: ProverNodeOptions = {
|
|
64
69
|
maxPendingJobs: config.proverNodeMaxPendingJobs,
|
|
65
70
|
pollingIntervalMs: config.proverNodePollingIntervalMs,
|
|
71
|
+
maxParallelBlocksPerEpoch: config.proverNodeMaxParallelBlocksPerEpoch,
|
|
66
72
|
};
|
|
67
73
|
|
|
68
74
|
const claimsMonitor = new ClaimsMonitor(publisher, proverNodeConfig);
|
|
@@ -72,8 +78,11 @@ export async function createProverNode(
|
|
|
72
78
|
const walletClient = publisher.getClient();
|
|
73
79
|
const bondManager = await createBondManager(rollupContract, walletClient, config);
|
|
74
80
|
|
|
81
|
+
const cacheDir = config.cacheDir ? join(config.cacheDir, `prover_${config.proverId}`) : undefined;
|
|
82
|
+
const cacheManager = new ProverCacheManager(cacheDir);
|
|
83
|
+
|
|
75
84
|
return new ProverNode(
|
|
76
|
-
prover
|
|
85
|
+
prover,
|
|
77
86
|
publisher,
|
|
78
87
|
archiver,
|
|
79
88
|
archiver,
|
|
@@ -86,6 +95,7 @@ export async function createProverNode(
|
|
|
86
95
|
epochMonitor,
|
|
87
96
|
bondManager,
|
|
88
97
|
telemetry,
|
|
98
|
+
cacheManager,
|
|
89
99
|
proverNodeConfig,
|
|
90
100
|
);
|
|
91
101
|
}
|
|
@@ -2,17 +2,16 @@ 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 {
|
|
14
|
+
import { asyncPool } from '@aztec/foundation/async-pool';
|
|
16
15
|
import { createDebugLogger } from '@aztec/foundation/log';
|
|
17
16
|
import { promiseWithResolvers } from '@aztec/foundation/promise';
|
|
18
17
|
import { Timer } from '@aztec/foundation/timer';
|
|
@@ -36,7 +35,7 @@ export class EpochProvingJob {
|
|
|
36
35
|
private runPromise: Promise<void> | undefined;
|
|
37
36
|
|
|
38
37
|
constructor(
|
|
39
|
-
private
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
117
|
-
|
|
118
|
-
|
|
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 };
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { type ProverCache } from '@aztec/circuit-types';
|
|
2
|
+
import { createDebugLogger } from '@aztec/foundation/log';
|
|
3
|
+
import { AztecLmdbStore } from '@aztec/kv-store/lmdb';
|
|
4
|
+
import { InMemoryProverCache } from '@aztec/prover-client';
|
|
5
|
+
|
|
6
|
+
import { type Dirent } from 'fs';
|
|
7
|
+
import { mkdir, readFile, readdir, rm, writeFile } from 'fs/promises';
|
|
8
|
+
import { join } from 'path';
|
|
9
|
+
|
|
10
|
+
import { KVProverCache } from './kv_cache.js';
|
|
11
|
+
|
|
12
|
+
const EPOCH_DIR_PREFIX = 'epoch';
|
|
13
|
+
const EPOCH_DIR_SEPARATOR = '_';
|
|
14
|
+
const EPOCH_HASH_FILENAME = 'epoch_hash.txt';
|
|
15
|
+
|
|
16
|
+
export class ProverCacheManager {
|
|
17
|
+
constructor(private cacheDir?: string, private log = createDebugLogger('aztec:prover-node:cache-manager')) {}
|
|
18
|
+
|
|
19
|
+
public async openCache(epochNumber: bigint, epochHash: Buffer): Promise<ProverCache> {
|
|
20
|
+
if (!this.cacheDir) {
|
|
21
|
+
return new InMemoryProverCache();
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
const epochDir = EPOCH_DIR_PREFIX + EPOCH_DIR_SEPARATOR + epochNumber;
|
|
25
|
+
const dataDir = join(this.cacheDir, epochDir);
|
|
26
|
+
|
|
27
|
+
const storedEpochHash = await readFile(join(dataDir, EPOCH_HASH_FILENAME), 'hex').catch(() => Buffer.alloc(0));
|
|
28
|
+
if (storedEpochHash.toString() !== epochHash.toString()) {
|
|
29
|
+
await rm(dataDir, { recursive: true, force: true });
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
await mkdir(dataDir, { recursive: true });
|
|
33
|
+
await writeFile(join(dataDir, EPOCH_HASH_FILENAME), epochHash.toString('hex'));
|
|
34
|
+
|
|
35
|
+
const store = AztecLmdbStore.open(dataDir);
|
|
36
|
+
this.log.debug(`Created new database for epoch ${epochNumber} at ${dataDir}`);
|
|
37
|
+
const cleanup = () => store.close();
|
|
38
|
+
return new KVProverCache(store, cleanup);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Removes all caches for epochs older than the given epoch (including)
|
|
43
|
+
* @param upToAndIncludingEpoch - The epoch number up to which to remove caches
|
|
44
|
+
*/
|
|
45
|
+
public async removeStaleCaches(upToAndIncludingEpoch: bigint): Promise<void> {
|
|
46
|
+
if (!this.cacheDir) {
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
const entries: Dirent[] = await readdir(this.cacheDir, { withFileTypes: true }).catch(() => []);
|
|
51
|
+
|
|
52
|
+
for (const item of entries) {
|
|
53
|
+
if (!item.isDirectory()) {
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const [prefix, epochNumber] = item.name.split(EPOCH_DIR_SEPARATOR);
|
|
58
|
+
if (prefix !== EPOCH_DIR_PREFIX) {
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
const epochNumberInt = BigInt(epochNumber);
|
|
63
|
+
if (epochNumberInt <= upToAndIncludingEpoch) {
|
|
64
|
+
this.log.info(`Removing old epoch database for epoch ${epochNumberInt} at ${join(this.cacheDir, item.name)}`);
|
|
65
|
+
await rm(join(this.cacheDir, item.name), { recursive: true });
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { ProverCache, ProvingJobStatus } from '@aztec/circuit-types';
|
|
2
|
+
import type { AztecKVStore, AztecMap } from '@aztec/kv-store';
|
|
3
|
+
|
|
4
|
+
export class KVProverCache implements ProverCache {
|
|
5
|
+
private proofs: AztecMap<string, string>;
|
|
6
|
+
|
|
7
|
+
constructor(store: AztecKVStore, private cleanup?: () => Promise<void>) {
|
|
8
|
+
this.proofs = store.openMap('prover_node_proof_status');
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
getProvingJobStatus(jobId: string): Promise<ProvingJobStatus> {
|
|
12
|
+
const item = this.proofs.get(jobId);
|
|
13
|
+
if (!item) {
|
|
14
|
+
return Promise.resolve({ status: 'not-found' });
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
return Promise.resolve(JSON.parse(item));
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
setProvingJobStatus(jobId: string, status: ProvingJobStatus): Promise<void> {
|
|
21
|
+
return this.proofs.set(jobId, JSON.stringify(status));
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
async close(): Promise<void> {
|
|
25
|
+
await this.cleanup?.();
|
|
26
|
+
}
|
|
27
|
+
}
|