@aztec-labs/prover-node 6.0.0-nightly.20260829
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/README.md +573 -0
- package/dest/actions/download-epoch-proving-job.d.ts +18 -0
- package/dest/actions/download-epoch-proving-job.d.ts.map +1 -0
- package/dest/actions/download-epoch-proving-job.js +37 -0
- package/dest/actions/index.d.ts +3 -0
- package/dest/actions/index.d.ts.map +1 -0
- package/dest/actions/index.js +2 -0
- package/dest/actions/rerun-epoch-proving-job.d.ts +23 -0
- package/dest/actions/rerun-epoch-proving-job.d.ts.map +1 -0
- package/dest/actions/rerun-epoch-proving-job.js +264 -0
- package/dest/actions/upload-epoch-proof-failure.d.ts +15 -0
- package/dest/actions/upload-epoch-proof-failure.d.ts.map +1 -0
- package/dest/actions/upload-epoch-proof-failure.js +78 -0
- package/dest/bin/run-failed-epoch.d.ts +2 -0
- package/dest/bin/run-failed-epoch.d.ts.map +1 -0
- package/dest/bin/run-failed-epoch.js +68 -0
- package/dest/checkpoint-store.d.ts +95 -0
- package/dest/checkpoint-store.d.ts.map +1 -0
- package/dest/checkpoint-store.js +178 -0
- package/dest/config.d.ts +31 -0
- package/dest/config.d.ts.map +1 -0
- package/dest/config.js +143 -0
- package/dest/factory.d.ts +36 -0
- package/dest/factory.d.ts.map +1 -0
- package/dest/factory.js +105 -0
- package/dest/index.d.ts +8 -0
- package/dest/index.d.ts.map +1 -0
- package/dest/index.js +7 -0
- package/dest/job/checkpoint-prover.d.ts +169 -0
- package/dest/job/checkpoint-prover.d.ts.map +1 -0
- package/dest/job/checkpoint-prover.js +413 -0
- package/dest/job/epoch-proving-job-data.d.ts +20 -0
- package/dest/job/epoch-proving-job-data.d.ts.map +1 -0
- package/dest/job/epoch-proving-job-data.js +61 -0
- package/dest/job/epoch-session.d.ts +160 -0
- package/dest/job/epoch-session.d.ts.map +1 -0
- package/dest/job/epoch-session.js +744 -0
- package/dest/job/top-tree-job.d.ts +82 -0
- package/dest/job/top-tree-job.d.ts.map +1 -0
- package/dest/job/top-tree-job.js +152 -0
- package/dest/metrics.d.ts +88 -0
- package/dest/metrics.d.ts.map +1 -0
- package/dest/metrics.js +264 -0
- package/dest/monitors/epoch-monitor.d.ts +43 -0
- package/dest/monitors/epoch-monitor.d.ts.map +1 -0
- package/dest/monitors/epoch-monitor.js +111 -0
- package/dest/monitors/index.d.ts +2 -0
- package/dest/monitors/index.d.ts.map +1 -0
- package/dest/monitors/index.js +1 -0
- package/dest/proof-publishing-service.d.ts +161 -0
- package/dest/proof-publishing-service.d.ts.map +1 -0
- package/dest/proof-publishing-service.js +335 -0
- package/dest/prover-node-publisher.d.ts +71 -0
- package/dest/prover-node-publisher.d.ts.map +1 -0
- package/dest/prover-node-publisher.js +346 -0
- package/dest/prover-node.d.ts +185 -0
- package/dest/prover-node.d.ts.map +1 -0
- package/dest/prover-node.js +1056 -0
- package/dest/prover-publisher-factory.d.ts +27 -0
- package/dest/prover-publisher-factory.d.ts.map +1 -0
- package/dest/prover-publisher-factory.js +29 -0
- package/dest/session-manager.d.ts +158 -0
- package/dest/session-manager.d.ts.map +1 -0
- package/dest/session-manager.js +493 -0
- package/dest/test/index.d.ts +13 -0
- package/dest/test/index.d.ts.map +1 -0
- package/dest/test/index.js +3 -0
- package/package.json +102 -0
- package/src/actions/download-epoch-proving-job.ts +43 -0
- package/src/actions/index.ts +2 -0
- package/src/actions/rerun-epoch-proving-job.ts +224 -0
- package/src/actions/upload-epoch-proof-failure.ts +87 -0
- package/src/bin/run-failed-epoch.ts +78 -0
- package/src/checkpoint-store.ts +212 -0
- package/src/config.ts +208 -0
- package/src/factory.ts +191 -0
- package/src/index.ts +7 -0
- package/src/job/checkpoint-prover.ts +551 -0
- package/src/job/epoch-proving-job-data.ts +94 -0
- package/src/job/epoch-session.ts +466 -0
- package/src/job/top-tree-job.ts +227 -0
- package/src/metrics.ts +323 -0
- package/src/monitors/epoch-monitor.ts +110 -0
- package/src/monitors/index.ts +1 -0
- package/src/proof-publishing-service.ts +427 -0
- package/src/prover-node-publisher.ts +473 -0
- package/src/prover-node.ts +830 -0
- package/src/prover-publisher-factory.ts +48 -0
- package/src/session-manager.ts +593 -0
- package/src/test/index.ts +14 -0
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
import { createLogger } from '@aztec-labs/foundation/log';
|
|
2
|
+
import { getEpochAtSlot, getSlotRangeForEpoch } from '@aztec-labs/stdlib/epoch-helpers';
|
|
3
|
+
import { CheckpointProver } from './job/checkpoint-prover.js';
|
|
4
|
+
/**
|
|
5
|
+
* Prover-node-wide registry of `CheckpointProver` instances, content-addressed by
|
|
6
|
+
* `(checkpoint number, slot, checkpoint archive root)`.
|
|
7
|
+
*
|
|
8
|
+
* The store survives every epoch / session boundary. A prover lives from its first
|
|
9
|
+
* `addOrUpdate` call until either:
|
|
10
|
+
* - its checkpoint is pruned by an L1 reorg (`cancelAndRemoveAboveBlock`), or
|
|
11
|
+
* - its epoch's proof-submission window has closed (`reapExpired`), so the proof could no
|
|
12
|
+
* longer be accepted on L1 even if produced.
|
|
13
|
+
*
|
|
14
|
+
* A prover's sub-tree work forks world-state per block and does not survive a prune of a base
|
|
15
|
+
* block, so there is nothing to preserve across a reorg: a pruned prover is cancelled and
|
|
16
|
+
* dropped, and a re-add (even of identical content) constructs a fresh prover.
|
|
17
|
+
*/ export class CheckpointStore {
|
|
18
|
+
l2BlockSource;
|
|
19
|
+
proverDeps;
|
|
20
|
+
proverFactoryFn;
|
|
21
|
+
provers;
|
|
22
|
+
/**
|
|
23
|
+
* Teardowns of provers already removed from `provers` (by prune or reap), awaited on `stop()`.
|
|
24
|
+
* Keyed by a monotonic id rather than the prover's content id: a prune-then-re-add can leave two
|
|
25
|
+
* teardowns for the same content id in flight at once, which a content-id key would clobber.
|
|
26
|
+
*/ pendingTeardowns;
|
|
27
|
+
nextTeardownId;
|
|
28
|
+
/** Test-only hooks injected into every prover this store constructs. */ testHooks;
|
|
29
|
+
log;
|
|
30
|
+
constructor(l2BlockSource, proverDeps, bindings, proverFactoryFn = (args, deps)=>new CheckpointProver(args, deps)){
|
|
31
|
+
this.l2BlockSource = l2BlockSource;
|
|
32
|
+
this.proverDeps = proverDeps;
|
|
33
|
+
this.proverFactoryFn = proverFactoryFn;
|
|
34
|
+
this.provers = new Map();
|
|
35
|
+
this.pendingTeardowns = new Map();
|
|
36
|
+
this.nextTeardownId = 0;
|
|
37
|
+
this.testHooks = {};
|
|
38
|
+
this.log = createLogger('prover-node:checkpoint-store', bindings);
|
|
39
|
+
}
|
|
40
|
+
start() {
|
|
41
|
+
return Promise.resolve();
|
|
42
|
+
}
|
|
43
|
+
async stop() {
|
|
44
|
+
// Cancel every live prover, then await both their teardown and any still in flight for provers
|
|
45
|
+
// already removed by a prune or reap.
|
|
46
|
+
const provers = Array.from(this.provers.values());
|
|
47
|
+
this.provers.clear();
|
|
48
|
+
for (const prover of provers){
|
|
49
|
+
prover.cancel();
|
|
50
|
+
}
|
|
51
|
+
await Promise.allSettled([
|
|
52
|
+
...provers.map((p)=>p.whenDone()),
|
|
53
|
+
...this.pendingTeardowns.values()
|
|
54
|
+
]);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Tracks the teardown of a prover just removed from the store so `stop()` can await it. The entry
|
|
58
|
+
* removes itself once teardown settles, so the map stays bounded by the number in flight.
|
|
59
|
+
*/ trackTeardown(prover) {
|
|
60
|
+
const id = this.nextTeardownId++;
|
|
61
|
+
const done = prover.whenDone();
|
|
62
|
+
this.pendingTeardowns.set(id, done);
|
|
63
|
+
void done.finally(()=>this.pendingTeardowns.delete(id));
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Registers a checkpoint with the store. If a prover already exists for the
|
|
67
|
+
* `(number, slot, archive root)` content key it is reused (an at-least-once re-registration of
|
|
68
|
+
* still-canonical content); otherwise a new prover is constructed.
|
|
69
|
+
*/ async addOrUpdate(checkpoint, data) {
|
|
70
|
+
const l1Constants = await this.l2BlockSource.getL1Constants();
|
|
71
|
+
const epochNumber = getEpochAtSlot(checkpoint.header.slotNumber, l1Constants);
|
|
72
|
+
const id = CheckpointProver.idFor(checkpoint);
|
|
73
|
+
const existing = this.provers.get(id);
|
|
74
|
+
if (existing) {
|
|
75
|
+
return existing;
|
|
76
|
+
}
|
|
77
|
+
// At most one canonical checkpoint per slot. A different checkpoint at the same slot means the
|
|
78
|
+
// caller forgot to prune the old chain before adding the replacement — surface it rather than
|
|
79
|
+
// silently creating a parallel canonical chain. A pruned checkpoint has already been removed,
|
|
80
|
+
// so every prover still in the store is canonical.
|
|
81
|
+
for (const prover of this.provers.values()){
|
|
82
|
+
if (prover.slotNumber === checkpoint.header.slotNumber) {
|
|
83
|
+
throw new Error(`Cannot add checkpoint ${checkpoint.number} (archive ${checkpoint.archive.root}) at slot ${checkpoint.header.slotNumber}: ` + `a different checkpoint already occupies this slot. Prune it first.`);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
const prover = this.proverFactoryFn({
|
|
87
|
+
...data,
|
|
88
|
+
checkpoint,
|
|
89
|
+
epochNumber
|
|
90
|
+
}, {
|
|
91
|
+
...this.proverDeps,
|
|
92
|
+
checkpointProveOverride: this.testHooks.checkpointProveOverride,
|
|
93
|
+
log: this.log
|
|
94
|
+
});
|
|
95
|
+
this.provers.set(id, prover);
|
|
96
|
+
return prover;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Installs test-only hooks applied to every prover constructed from now on. Used by the e2e harness to
|
|
100
|
+
* force a checkpoint sub-tree failure without monkey-patching the prover factory.
|
|
101
|
+
*/ setTestHooks(hooks) {
|
|
102
|
+
this.testHooks = hooks;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Cancels and removes every prover that holds a block above the prune target. A checkpoint is orphaned by a prune to
|
|
106
|
+
* block `targetBlockNumber` iff its last block sits above the target — including a checkpoint whose range straddles
|
|
107
|
+
* the target (partially orphaned), which block-range marking catches without boundary ambiguity. Keying off the
|
|
108
|
+
* surviving block number (rather than a checkpoint number) is correct even when the source has already
|
|
109
|
+
* re-checkpointed past the divergence: the prune event reports the highest surviving block, which by construction
|
|
110
|
+
* survives on the source, whereas the source's current checkpointed tip can sit above the prune target.
|
|
111
|
+
*
|
|
112
|
+
* The prover's in-flight sub-tree work forks world-state per block and faults once its base block is pruned, so it
|
|
113
|
+
* cannot be reused; it is cancelled (aborting the fork reads) and dropped. A subsequent re-add constructs a fresh
|
|
114
|
+
* prover. Returns the removed provers.
|
|
115
|
+
*/ cancelAndRemoveAboveBlock(targetBlockNumber) {
|
|
116
|
+
const affected = [];
|
|
117
|
+
for (const [id, prover] of Array.from(this.provers.entries())){
|
|
118
|
+
const lastBlockNumber = prover.checkpoint.blocks.at(-1).number;
|
|
119
|
+
if (lastBlockNumber > targetBlockNumber) {
|
|
120
|
+
prover.cancel();
|
|
121
|
+
this.trackTeardown(prover);
|
|
122
|
+
this.provers.delete(id);
|
|
123
|
+
affected.push(prover);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return affected;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Drops provers whose epoch is at or below the supplied expired epoch. Once an epoch's
|
|
130
|
+
* proof-submission window has closed, its proof can no longer be accepted on L1, so the
|
|
131
|
+
* prover is no longer needed.
|
|
132
|
+
*/ reapExpired(expiredEpoch) {
|
|
133
|
+
const reaped = [];
|
|
134
|
+
for (const [id, prover] of Array.from(this.provers.entries())){
|
|
135
|
+
if (prover.epochNumber <= expiredEpoch) {
|
|
136
|
+
reaped.push({
|
|
137
|
+
id,
|
|
138
|
+
checkpointNumber: prover.checkpoint.number,
|
|
139
|
+
epochNumber: prover.epochNumber
|
|
140
|
+
});
|
|
141
|
+
prover.cancel({
|
|
142
|
+
routine: true
|
|
143
|
+
});
|
|
144
|
+
this.trackTeardown(prover);
|
|
145
|
+
this.provers.delete(id);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
if (reaped.length > 0) {
|
|
149
|
+
this.log.info(`Reaped ${reaped.length} expired CheckpointProver(s) for expiredEpoch ${expiredEpoch}`, {
|
|
150
|
+
expiredEpoch,
|
|
151
|
+
reapedCount: reaped.length,
|
|
152
|
+
reaped
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
/** Returns the prover with the supplied id, or undefined. */ get(id) {
|
|
157
|
+
return this.provers.get(id);
|
|
158
|
+
}
|
|
159
|
+
/** Returns the prover for the supplied checkpoint (by its content-addressed id), or undefined. */ getByCheckpoint(checkpoint) {
|
|
160
|
+
return this.provers.get(CheckpointProver.idFor(checkpoint));
|
|
161
|
+
}
|
|
162
|
+
/** Every prover currently in the store, in insertion order. */ listAll() {
|
|
163
|
+
return Array.from(this.provers.values());
|
|
164
|
+
}
|
|
165
|
+
/** Provers in the store, sorted by checkpoint number. */ list() {
|
|
166
|
+
return Array.from(this.provers.values()).sort((a, b)=>a.checkpoint.number - b.checkpoint.number);
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Provers whose slot is in the supplied epoch's slot range, sorted by checkpoint number.
|
|
170
|
+
*/ async listForEpoch(epoch) {
|
|
171
|
+
const l1Constants = await this.l2BlockSource.getL1Constants();
|
|
172
|
+
const [fromSlot, toSlot] = getSlotRangeForEpoch(epoch, l1Constants);
|
|
173
|
+
return this.listInSlotRange(fromSlot, toSlot);
|
|
174
|
+
}
|
|
175
|
+
/** Provers whose slot falls within `[fromSlot, toSlot]`, sorted by checkpoint number. */ listInSlotRange(fromSlot, toSlot) {
|
|
176
|
+
return this.list().filter((p)=>p.slotNumber >= fromSlot && p.slotNumber <= toSlot);
|
|
177
|
+
}
|
|
178
|
+
}
|
package/dest/config.d.ts
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { ACVMConfig, BBConfig } from '@aztec-labs/bb-prover/config';
|
|
2
|
+
import { type ConfigMappingsType } from '@aztec-labs/foundation/config';
|
|
3
|
+
import { EthAddress } from '@aztec-labs/foundation/eth-address';
|
|
4
|
+
import { type KeyStoreConfig } from '@aztec-labs/node-keystore/config';
|
|
5
|
+
import type { KeyStore } from '@aztec-labs/node-keystore/types';
|
|
6
|
+
import { type SharedNodeConfig } from '@aztec-labs/node-lib/config';
|
|
7
|
+
import { type ProverAgentConfig, type ProverBrokerConfig } from '@aztec-labs/prover-client/broker/config';
|
|
8
|
+
import { type ProverClientUserConfig } from '@aztec-labs/prover-client/config';
|
|
9
|
+
import { type ProverPublisherConfig, type ProverTxSenderConfig } from '@aztec-labs/sequencer-client/config';
|
|
10
|
+
import { type DataStoreConfig } from '@aztec-labs/stdlib/kv-store';
|
|
11
|
+
export type ProverNodeConfig = ProverClientUserConfig & ProverPublisherConfig & ProverTxSenderConfig & DataStoreConfig & KeyStoreConfig & SpecificProverNodeConfig & Pick<SharedNodeConfig, 'web3SignerUrl'>;
|
|
12
|
+
export type SpecificProverNodeConfig = {
|
|
13
|
+
proverNodeMaxPendingJobs: number;
|
|
14
|
+
proverNodePollingIntervalMs: number;
|
|
15
|
+
proverNodeMaxParallelBlocksPerEpoch: number;
|
|
16
|
+
proverNodeFailedEpochStore: string | undefined;
|
|
17
|
+
proverNodeEpochProvingDelayMs: number | undefined;
|
|
18
|
+
proverNodeDisableProofPublish?: boolean;
|
|
19
|
+
txGatheringTimeoutMs: number;
|
|
20
|
+
txGatheringIntervalMs: number;
|
|
21
|
+
txGatheringBatchSize: number;
|
|
22
|
+
txGatheringMaxParallelRequestsPerNode: number;
|
|
23
|
+
proofSubmissionTargetAddress?: EthAddress;
|
|
24
|
+
};
|
|
25
|
+
export declare const specificProverNodeConfigMappings: ConfigMappingsType<SpecificProverNodeConfig>;
|
|
26
|
+
export declare const proverNodeConfigMappings: ConfigMappingsType<ProverNodeConfig>;
|
|
27
|
+
export declare function getProverNodeConfigFromEnv(): ProverNodeConfig;
|
|
28
|
+
export declare function getProverNodeBrokerConfigFromEnv(): ProverBrokerConfig;
|
|
29
|
+
export declare function getProverNodeAgentConfigFromEnv(): ProverAgentConfig & BBConfig & ACVMConfig;
|
|
30
|
+
export declare function createKeyStoreForProver(config: ProverNodeConfig): KeyStore | undefined;
|
|
31
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUN6RSxPQUFPLEVBQ0wsS0FBSyxrQkFBa0IsRUFLeEIsTUFBTSwrQkFBK0IsQ0FBQztBQUN2QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDaEUsT0FBTyxFQUFFLEtBQUssY0FBYyxFQUEwQixNQUFNLGtDQUFrQyxDQUFDO0FBRS9GLE9BQU8sS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxLQUFLLGdCQUFnQixFQUE0QixNQUFNLDZCQUE2QixDQUFDO0FBQzlGLE9BQU8sRUFDTCxLQUFLLGlCQUFpQixFQUN0QixLQUFLLGtCQUFrQixFQUd4QixNQUFNLHlDQUF5QyxDQUFDO0FBQ2pELE9BQU8sRUFDTCxLQUFLLHNCQUFzQixFQUc1QixNQUFNLGtDQUFrQyxDQUFDO0FBQzFDLE9BQU8sRUFDTCxLQUFLLHFCQUFxQixFQUMxQixLQUFLLG9CQUFvQixFQUcxQixNQUFNLHFDQUFxQyxDQUFDO0FBQzdDLE9BQU8sRUFBRSxLQUFLLGVBQWUsRUFBc0IsTUFBTSw2QkFBNkIsQ0FBQztBQUV2RixNQUFNLE1BQU0sZ0JBQWdCLEdBQUcsc0JBQXNCLEdBQ25ELHFCQUFxQixHQUNyQixvQkFBb0IsR0FDcEIsZUFBZSxHQUNmLGNBQWMsR0FDZCx3QkFBd0IsR0FDeEIsSUFBSSxDQUFDLGdCQUFnQixFQUFFLGVBQWUsQ0FBQyxDQUFDO0FBRTFDLE1BQU0sTUFBTSx3QkFBd0IsR0FBRztJQUNyQyx3QkFBd0IsRUFBRSxNQUFNLENBQUM7SUFDakMsMkJBQTJCLEVBQUUsTUFBTSxDQUFDO0lBQ3BDLG1DQUFtQyxFQUFFLE1BQU0sQ0FBQztJQUM1QywwQkFBMEIsRUFBRSxNQUFNLEdBQUcsU0FBUyxDQUFDO0lBQy9DLDZCQUE2QixFQUFFLE1BQU0sR0FBRyxTQUFTLENBQUM7SUFDbEQsNkJBQTZCLENBQUMsRUFBRSxPQUFPLENBQUM7SUFDeEMsb0JBQW9CLEVBQUUsTUFBTSxDQUFDO0lBQzdCLHFCQUFxQixFQUFFLE1BQU0sQ0FBQztJQUM5QixvQkFBb0IsRUFBRSxNQUFNLENBQUM7SUFDN0IscUNBQXFDLEVBQUUsTUFBTSxDQUFDO0lBQzlDLDRCQUE0QixDQUFDLEVBQUUsVUFBVSxDQUFDO0NBQzNDLENBQUM7QUFFRixlQUFPLE1BQU0sZ0NBQWdDLEVBQUUsa0JBQWtCLENBQUMsd0JBQXdCLENBMkR6RixDQUFDO0FBRUYsZUFBTyxNQUFNLHdCQUF3QixFQUFFLGtCQUFrQixDQUFDLGdCQUFnQixDQVF6RSxDQUFDO0FBRUYsd0JBQWdCLDBCQUEwQixJQUFJLGdCQUFnQixDQUU3RDtBQUVELHdCQUFnQixnQ0FBZ0MsSUFBSSxrQkFBa0IsQ0FJckU7QUFFRCx3QkFBZ0IsK0JBQStCLElBQUksaUJBQWlCLEdBQUcsUUFBUSxHQUFHLFVBQVUsQ0FLM0Y7QUEwREQsd0JBQWdCLHVCQUF1QixDQUFDLE1BQU0sRUFBRSxnQkFBZ0IsR0FBRyxRQUFRLEdBQUcsU0FBUyxDQVN0RiJ9
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AACzE,OAAO,EACL,KAAK,kBAAkB,EAKxB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAC;AAChE,OAAO,EAAE,KAAK,cAAc,EAA0B,MAAM,kCAAkC,CAAC;AAE/F,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAE,KAAK,gBAAgB,EAA4B,MAAM,6BAA6B,CAAC;AAC9F,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EAGxB,MAAM,yCAAyC,CAAC;AACjD,OAAO,EACL,KAAK,sBAAsB,EAG5B,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EACL,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EAG1B,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EAAE,KAAK,eAAe,EAAsB,MAAM,6BAA6B,CAAC;AAEvF,MAAM,MAAM,gBAAgB,GAAG,sBAAsB,GACnD,qBAAqB,GACrB,oBAAoB,GACpB,eAAe,GACf,cAAc,GACd,wBAAwB,GACxB,IAAI,CAAC,gBAAgB,EAAE,eAAe,CAAC,CAAC;AAE1C,MAAM,MAAM,wBAAwB,GAAG;IACrC,wBAAwB,EAAE,MAAM,CAAC;IACjC,2BAA2B,EAAE,MAAM,CAAC;IACpC,mCAAmC,EAAE,MAAM,CAAC;IAC5C,0BAA0B,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/C,6BAA6B,EAAE,MAAM,GAAG,SAAS,CAAC;IAClD,6BAA6B,CAAC,EAAE,OAAO,CAAC;IACxC,oBAAoB,EAAE,MAAM,CAAC;IAC7B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,qCAAqC,EAAE,MAAM,CAAC;IAC9C,4BAA4B,CAAC,EAAE,UAAU,CAAC;CAC3C,CAAC;AAEF,eAAO,MAAM,gCAAgC,EAAE,kBAAkB,CAAC,wBAAwB,CA2DzF,CAAC;AAEF,eAAO,MAAM,wBAAwB,EAAE,kBAAkB,CAAC,gBAAgB,CAQzE,CAAC;AAEF,wBAAgB,0BAA0B,IAAI,gBAAgB,CAE7D;AAED,wBAAgB,gCAAgC,IAAI,kBAAkB,CAIrE;AAED,wBAAgB,+BAA+B,IAAI,iBAAiB,GAAG,QAAQ,GAAG,UAAU,CAK3F;AA0DD,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,gBAAgB,GAAG,QAAQ,GAAG,SAAS,CAStF"}
|
package/dest/config.js
ADDED
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { booleanConfigHelper, getConfigFromMappings, numberConfigHelper, pickConfigMappings } from '@aztec-labs/foundation/config';
|
|
2
|
+
import { EthAddress } from '@aztec-labs/foundation/eth-address';
|
|
3
|
+
import { keyStoreConfigMappings } from '@aztec-labs/node-keystore/config';
|
|
4
|
+
import { ethPrivateKeySchema } from '@aztec-labs/node-keystore/schemas';
|
|
5
|
+
import { sharedNodeConfigMappings } from '@aztec-labs/node-lib/config';
|
|
6
|
+
import { proverAgentConfigMappings, proverBrokerConfigMappings } from '@aztec-labs/prover-client/broker/config';
|
|
7
|
+
import { bbConfigMappings, proverClientConfigMappings } from '@aztec-labs/prover-client/config';
|
|
8
|
+
import { proverPublisherConfigMappings, proverTxSenderConfigMappings } from '@aztec-labs/sequencer-client/config';
|
|
9
|
+
import { dataConfigMappings } from '@aztec-labs/stdlib/kv-store';
|
|
10
|
+
export const specificProverNodeConfigMappings = {
|
|
11
|
+
proverNodeMaxPendingJobs: {
|
|
12
|
+
env: 'PROVER_NODE_MAX_PENDING_JOBS',
|
|
13
|
+
description: 'The maximum number of pending jobs for the prover node',
|
|
14
|
+
...numberConfigHelper(10)
|
|
15
|
+
},
|
|
16
|
+
proverNodePollingIntervalMs: {
|
|
17
|
+
env: 'PROVER_NODE_POLLING_INTERVAL_MS',
|
|
18
|
+
description: 'The interval in milliseconds to poll for new jobs',
|
|
19
|
+
...numberConfigHelper(1000)
|
|
20
|
+
},
|
|
21
|
+
proverNodeMaxParallelBlocksPerEpoch: {
|
|
22
|
+
env: 'PROVER_NODE_MAX_PARALLEL_BLOCKS_PER_EPOCH',
|
|
23
|
+
description: 'The Maximum number of blocks to process in parallel while proving an epoch',
|
|
24
|
+
...numberConfigHelper(0)
|
|
25
|
+
},
|
|
26
|
+
proverNodeFailedEpochStore: {
|
|
27
|
+
env: 'PROVER_NODE_FAILED_EPOCH_STORE',
|
|
28
|
+
description: 'File store where to upload node state when an epoch fails to be proven',
|
|
29
|
+
defaultValue: undefined
|
|
30
|
+
},
|
|
31
|
+
proverNodeEpochProvingDelayMs: {
|
|
32
|
+
description: 'Optional delay in milliseconds to wait for late-arriving events (e.g. reorgs) to settle before starting top-tree proving for an epoch',
|
|
33
|
+
defaultValue: undefined
|
|
34
|
+
},
|
|
35
|
+
txGatheringIntervalMs: {
|
|
36
|
+
env: 'PROVER_NODE_TX_GATHERING_INTERVAL_MS',
|
|
37
|
+
description: 'How often to check that tx data is available',
|
|
38
|
+
...numberConfigHelper(1_000)
|
|
39
|
+
},
|
|
40
|
+
txGatheringBatchSize: {
|
|
41
|
+
env: 'PROVER_NODE_TX_GATHERING_BATCH_SIZE',
|
|
42
|
+
description: 'How many transactions to gather from a node in a single request',
|
|
43
|
+
...numberConfigHelper(10)
|
|
44
|
+
},
|
|
45
|
+
txGatheringMaxParallelRequestsPerNode: {
|
|
46
|
+
env: 'PROVER_NODE_TX_GATHERING_MAX_PARALLEL_REQUESTS_PER_NODE',
|
|
47
|
+
description: 'How many tx requests to make in parallel to each node',
|
|
48
|
+
...numberConfigHelper(100)
|
|
49
|
+
},
|
|
50
|
+
txGatheringTimeoutMs: {
|
|
51
|
+
env: 'PROVER_NODE_TX_GATHERING_TIMEOUT_MS',
|
|
52
|
+
description: 'How long to wait for tx data to be available before giving up',
|
|
53
|
+
...numberConfigHelper(120_000)
|
|
54
|
+
},
|
|
55
|
+
proverNodeDisableProofPublish: {
|
|
56
|
+
env: 'PROVER_NODE_DISABLE_PROOF_PUBLISH',
|
|
57
|
+
description: 'Whether the prover node skips publishing proofs to L1',
|
|
58
|
+
...booleanConfigHelper(false)
|
|
59
|
+
},
|
|
60
|
+
proofSubmissionTargetAddress: {
|
|
61
|
+
env: 'PROVER_NODE_PROOF_SUBMISSION_TARGET_ADDRESS',
|
|
62
|
+
description: 'Optional L1 address the submitEpochRootProof tx is sent to. Must expose the identical submitEpochRootProof ABI ' + 'and forward to the rollup. Defaults to the rollup address.',
|
|
63
|
+
parseEnv: (val)=>EthAddress.fromString(val),
|
|
64
|
+
defaultValue: undefined
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
export const proverNodeConfigMappings = {
|
|
68
|
+
...dataConfigMappings,
|
|
69
|
+
...keyStoreConfigMappings,
|
|
70
|
+
...proverClientConfigMappings,
|
|
71
|
+
...proverPublisherConfigMappings,
|
|
72
|
+
...proverTxSenderConfigMappings,
|
|
73
|
+
...specificProverNodeConfigMappings,
|
|
74
|
+
...pickConfigMappings(sharedNodeConfigMappings, [
|
|
75
|
+
'web3SignerUrl'
|
|
76
|
+
])
|
|
77
|
+
};
|
|
78
|
+
export function getProverNodeConfigFromEnv() {
|
|
79
|
+
return getConfigFromMappings(proverNodeConfigMappings);
|
|
80
|
+
}
|
|
81
|
+
export function getProverNodeBrokerConfigFromEnv() {
|
|
82
|
+
return {
|
|
83
|
+
...getConfigFromMappings(proverBrokerConfigMappings)
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
export function getProverNodeAgentConfigFromEnv() {
|
|
87
|
+
return {
|
|
88
|
+
...getConfigFromMappings(proverAgentConfigMappings),
|
|
89
|
+
...getConfigFromMappings(bbConfigMappings)
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
function createKeyStoreFromWeb3Signer(config) {
|
|
93
|
+
// If we don't have a valid prover Id then we can't build a valid key store with remote signers
|
|
94
|
+
if (config.proverId === undefined) {
|
|
95
|
+
return undefined;
|
|
96
|
+
}
|
|
97
|
+
// Also, we need at least one publisher address.
|
|
98
|
+
const publishers = config.proverPublisherAddresses ?? [];
|
|
99
|
+
if (publishers.length === 0) {
|
|
100
|
+
return undefined;
|
|
101
|
+
}
|
|
102
|
+
const keyStore = {
|
|
103
|
+
schemaVersion: 1,
|
|
104
|
+
slasher: undefined,
|
|
105
|
+
prover: {
|
|
106
|
+
id: config.proverId,
|
|
107
|
+
publisher: publishers
|
|
108
|
+
},
|
|
109
|
+
remoteSigner: config.web3SignerUrl,
|
|
110
|
+
validators: undefined
|
|
111
|
+
};
|
|
112
|
+
return keyStore;
|
|
113
|
+
}
|
|
114
|
+
function createKeyStoreFromPublisherKeys(config) {
|
|
115
|
+
// Extract the publisher keys from the provided config.
|
|
116
|
+
const publisherKeys = config.proverPublisherPrivateKeys ? config.proverPublisherPrivateKeys.map((k)=>ethPrivateKeySchema.parse(k.getValue())) : [];
|
|
117
|
+
// There must be at least 1.
|
|
118
|
+
if (publisherKeys.length === 0) {
|
|
119
|
+
return undefined;
|
|
120
|
+
}
|
|
121
|
+
// If we have a valid proverId then create a prover key store of the form { id, publisher: [publisherKeys] }
|
|
122
|
+
// Otherwise create one of the form ("0x12345678....." as EthAccount).
|
|
123
|
+
const keyStore = {
|
|
124
|
+
schemaVersion: 1,
|
|
125
|
+
slasher: undefined,
|
|
126
|
+
prover: config.proverId === undefined ? publisherKeys[0] : {
|
|
127
|
+
id: config.proverId,
|
|
128
|
+
publisher: publisherKeys
|
|
129
|
+
},
|
|
130
|
+
remoteSigner: undefined,
|
|
131
|
+
validators: undefined
|
|
132
|
+
};
|
|
133
|
+
return keyStore;
|
|
134
|
+
}
|
|
135
|
+
export function createKeyStoreForProver(config) {
|
|
136
|
+
if (config.web3SignerUrl !== undefined && config.web3SignerUrl.length > 0) {
|
|
137
|
+
const keyStore = createKeyStoreFromWeb3Signer(config);
|
|
138
|
+
if (keyStore) {
|
|
139
|
+
return keyStore;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
return createKeyStoreFromPublisherKeys(config);
|
|
143
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { Archiver } from '@aztec-labs/archiver';
|
|
2
|
+
import type { BlobClientInterface } from '@aztec-labs/blob-client/client';
|
|
3
|
+
import type { EpochCacheInterface } from '@aztec-labs/epoch-cache';
|
|
4
|
+
import { L1TxUtils } from '@aztec-labs/ethereum/l1-tx-utils';
|
|
5
|
+
import { type Logger } from '@aztec-labs/foundation/log';
|
|
6
|
+
import { DateProvider } from '@aztec-labs/foundation/timer';
|
|
7
|
+
import { KeystoreManager } from '@aztec-labs/node-keystore';
|
|
8
|
+
import { type ProverClientUserConfig } from '@aztec-labs/prover-client';
|
|
9
|
+
import { type ProverPublisherConfig, type ProverTxSenderConfig } from '@aztec-labs/sequencer-client';
|
|
10
|
+
import type { AvmSimulator } from '@aztec-labs/simulator/server';
|
|
11
|
+
import type { ITxProvider, ProverConfig, ProvingJobBroker, Service, WorldStateSynchronizer } from '@aztec-labs/stdlib/interfaces/server';
|
|
12
|
+
import { type TelemetryClient } from '@aztec-labs/telemetry-client';
|
|
13
|
+
import type { SpecificProverNodeConfig } from './config.js';
|
|
14
|
+
import { ProverNode } from './prover-node.js';
|
|
15
|
+
import { ProverPublisherFactory } from './prover-publisher-factory.js';
|
|
16
|
+
export type ProverNodeDeps = {
|
|
17
|
+
telemetry?: TelemetryClient;
|
|
18
|
+
log?: Logger;
|
|
19
|
+
archiver: Archiver;
|
|
20
|
+
publisherFactory?: ProverPublisherFactory;
|
|
21
|
+
broker?: ProvingJobBroker;
|
|
22
|
+
l1TxUtils?: L1TxUtils;
|
|
23
|
+
dateProvider?: DateProvider;
|
|
24
|
+
worldStateSynchronizer: WorldStateSynchronizer;
|
|
25
|
+
p2pClient: {
|
|
26
|
+
getTxProvider(): ITxProvider;
|
|
27
|
+
} & Partial<Service>;
|
|
28
|
+
epochCache: EpochCacheInterface;
|
|
29
|
+
blobClient: BlobClientInterface;
|
|
30
|
+
keyStoreManager?: KeystoreManager;
|
|
31
|
+
/** AVM execution backend (simulator pool + CDB server) for public simulation. */
|
|
32
|
+
avmSimulator: AvmSimulator;
|
|
33
|
+
};
|
|
34
|
+
/** Creates a new prover node subsystem given a config and dependencies */
|
|
35
|
+
export declare function createProverNode(userConfig: SpecificProverNodeConfig & ProverConfig & ProverClientUserConfig & ProverPublisherConfig & ProverTxSenderConfig, deps: ProverNodeDeps): Promise<ProverNode>;
|
|
36
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFjdG9yeS5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2ZhY3RvcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDckQsT0FBTyxLQUFLLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUUxRSxPQUFPLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBSW5FLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUc3RCxPQUFPLEVBQUUsS0FBSyxNQUFNLEVBQWdCLE1BQU0sNEJBQTRCLENBQUM7QUFDdkUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzVELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUU1RCxPQUFPLEVBQTJCLEtBQUssc0JBQXNCLEVBQXNCLE1BQU0sMkJBQTJCLENBQUM7QUFFckgsT0FBTyxFQUNMLEtBQUsscUJBQXFCLEVBQzFCLEtBQUssb0JBQW9CLEVBRTFCLE1BQU0sOEJBQThCLENBQUM7QUFDdEMsT0FBTyxLQUFLLEVBQUUsWUFBWSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDakUsT0FBTyxLQUFLLEVBQ1YsV0FBVyxFQUNYLFlBQVksRUFDWixnQkFBZ0IsRUFDaEIsT0FBTyxFQUNQLHNCQUFzQixFQUN2QixNQUFNLHNDQUFzQyxDQUFDO0FBQzlDLE9BQU8sRUFBYSxLQUFLLGVBQWUsRUFBc0IsTUFBTSw4QkFBOEIsQ0FBQztBQUduRyxPQUFPLEtBQUssRUFBRSx3QkFBd0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUM1RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDOUMsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFdkUsTUFBTSxNQUFNLGNBQWMsR0FBRztJQUMzQixTQUFTLENBQUMsRUFBRSxlQUFlLENBQUM7SUFDNUIsR0FBRyxDQUFDLEVBQUUsTUFBTSxDQUFDO0lBQ2IsUUFBUSxFQUFFLFFBQVEsQ0FBQztJQUNuQixnQkFBZ0IsQ0FBQyxFQUFFLHNCQUFzQixDQUFDO0lBQzFDLE1BQU0sQ0FBQyxFQUFFLGdCQUFnQixDQUFDO0lBQzFCLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQztJQUN0QixZQUFZLENBQUMsRUFBRSxZQUFZLENBQUM7SUFDNUIsc0JBQXNCLEVBQUUsc0JBQXNCLENBQUM7SUFDL0MsU0FBUyxFQUFFO1FBQUUsYUFBYSxJQUFJLFdBQVcsQ0FBQTtLQUFFLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQy9ELFVBQVUsRUFBRSxtQkFBbUIsQ0FBQztJQUNoQyxVQUFVLEVBQUUsbUJBQW1CLENBQUM7SUFDaEMsZUFBZSxDQUFDLEVBQUUsZUFBZSxDQUFDO0lBQ2xDLGlGQUFpRjtJQUNqRixZQUFZLEVBQUUsWUFBWSxDQUFDO0NBQzVCLENBQUM7QUFFRiwwRUFBMEU7QUFDMUUsd0JBQXNCLGdCQUFnQixDQUNwQyxVQUFVLEVBQUUsd0JBQXdCLEdBQ2xDLFlBQVksR0FDWixzQkFBc0IsR0FDdEIscUJBQXFCLEdBQ3JCLG9CQUFvQixFQUN0QixJQUFJLEVBQUUsY0FBYyx1QkFrSXJCIn0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../src/factory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAE1E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAInE,OAAO,EAAE,SAAS,EAAE,MAAM,kCAAkC,CAAC;AAG7D,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,4BAA4B,CAAC;AACvE,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAE5D,OAAO,EAA2B,KAAK,sBAAsB,EAAsB,MAAM,2BAA2B,CAAC;AAErH,OAAO,EACL,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EAE1B,MAAM,8BAA8B,CAAC;AACtC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,KAAK,EACV,WAAW,EACX,YAAY,EACZ,gBAAgB,EAChB,OAAO,EACP,sBAAsB,EACvB,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAAa,KAAK,eAAe,EAAsB,MAAM,8BAA8B,CAAC;AAGnG,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAEvE,MAAM,MAAM,cAAc,GAAG;IAC3B,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,QAAQ,CAAC;IACnB,gBAAgB,CAAC,EAAE,sBAAsB,CAAC;IAC1C,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,sBAAsB,EAAE,sBAAsB,CAAC;IAC/C,SAAS,EAAE;QAAE,aAAa,IAAI,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/D,UAAU,EAAE,mBAAmB,CAAC;IAChC,UAAU,EAAE,mBAAmB,CAAC;IAChC,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,iFAAiF;IACjF,YAAY,EAAE,YAAY,CAAC;CAC5B,CAAC;AAEF,0EAA0E;AAC1E,wBAAsB,gBAAgB,CACpC,UAAU,EAAE,wBAAwB,GAClC,YAAY,GACZ,sBAAsB,GACtB,qBAAqB,GACrB,oBAAoB,EACtB,IAAI,EAAE,cAAc,uBAkIrB"}
|
package/dest/factory.js
ADDED
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { Blob } from '@aztec-labs/blob-lib';
|
|
2
|
+
import { createEthereumChain } from '@aztec-labs/ethereum/chain';
|
|
3
|
+
import { makeL1HttpTransport } from '@aztec-labs/ethereum/client';
|
|
4
|
+
import { RollupContract } from '@aztec-labs/ethereum/contracts';
|
|
5
|
+
import { PublisherManager } from '@aztec-labs/ethereum/publisher-manager';
|
|
6
|
+
import { pick } from '@aztec-labs/foundation/collection';
|
|
7
|
+
import { createLogger } from '@aztec-labs/foundation/log';
|
|
8
|
+
import { DateProvider } from '@aztec-labs/foundation/timer';
|
|
9
|
+
import { createForwarderL1TxUtilsFromSigners, createL1TxUtilsFromSigners } from '@aztec-labs/node-lib/factories';
|
|
10
|
+
import { createProverClient } from '@aztec-labs/prover-client';
|
|
11
|
+
import { createAndStartProvingBroker } from '@aztec-labs/prover-client/broker';
|
|
12
|
+
import { getPublisherConfigFromProverConfig } from '@aztec-labs/sequencer-client';
|
|
13
|
+
import { L1Metrics, getTelemetryClient } from '@aztec-labs/telemetry-client';
|
|
14
|
+
import { createPublicClient } from 'viem';
|
|
15
|
+
import { ProverNode } from './prover-node.js';
|
|
16
|
+
import { ProverPublisherFactory } from './prover-publisher-factory.js';
|
|
17
|
+
/** Creates a new prover node subsystem given a config and dependencies */ export async function createProverNode(userConfig, deps) {
|
|
18
|
+
const config = {
|
|
19
|
+
...userConfig
|
|
20
|
+
};
|
|
21
|
+
const telemetry = deps.telemetry ?? getTelemetryClient();
|
|
22
|
+
const dateProvider = deps.dateProvider ?? new DateProvider();
|
|
23
|
+
const log = deps.log ?? createLogger('prover');
|
|
24
|
+
const { p2pClient, archiver, keyStoreManager, worldStateSynchronizer } = deps;
|
|
25
|
+
// Extract the prover signers from the key store and verify that we have one.
|
|
26
|
+
await keyStoreManager?.validateSigners();
|
|
27
|
+
const proverSigners = keyStoreManager?.createProverSigners();
|
|
28
|
+
if (proverSigners === undefined) {
|
|
29
|
+
throw new Error('Failed to create prover key store configuration');
|
|
30
|
+
} else if (proverSigners.signers.length === 0) {
|
|
31
|
+
throw new Error('No prover signers found in the key store');
|
|
32
|
+
}
|
|
33
|
+
log.info(`Creating prover with publishers ${proverSigners.signers.map((signer)=>signer.address.toString()).join()}`);
|
|
34
|
+
// Only consider user provided config if it is valid
|
|
35
|
+
const proverIdInUserConfig = config.proverId === undefined || config.proverId.isZero() ? undefined : config.proverId;
|
|
36
|
+
// ProverId: Take from key store if provided, otherwise from user config if valid, otherwise address of first signer
|
|
37
|
+
const proverId = proverSigners.id ?? proverIdInUserConfig ?? proverSigners.signers[0].address;
|
|
38
|
+
// Now create the prover client configuration from this.
|
|
39
|
+
const proverClientConfig = {
|
|
40
|
+
...config,
|
|
41
|
+
proverId
|
|
42
|
+
};
|
|
43
|
+
const broker = deps.broker ?? await createAndStartProvingBroker(config, telemetry);
|
|
44
|
+
const prover = await createProverClient(proverClientConfig, worldStateSynchronizer, broker, telemetry);
|
|
45
|
+
const { l1RpcUrls: rpcUrls, l1ChainId: chainId } = config;
|
|
46
|
+
const chain = createEthereumChain(rpcUrls, chainId);
|
|
47
|
+
const publicClient = createPublicClient({
|
|
48
|
+
chain: chain.chainInfo,
|
|
49
|
+
transport: makeL1HttpTransport(config.l1RpcUrls, {
|
|
50
|
+
timeout: config.l1HttpTimeoutMS
|
|
51
|
+
}),
|
|
52
|
+
pollingInterval: config.viemPollingIntervalMS
|
|
53
|
+
});
|
|
54
|
+
const rollupContract = new RollupContract(publicClient, config.rollupAddress.toString());
|
|
55
|
+
const l1TxUtils = deps.l1TxUtils ? [
|
|
56
|
+
deps.l1TxUtils
|
|
57
|
+
] : config.proverPublisherForwarderAddress ? await createForwarderL1TxUtilsFromSigners(publicClient, proverSigners.signers, config.proverPublisherForwarderAddress, {
|
|
58
|
+
...config,
|
|
59
|
+
scope: 'prover'
|
|
60
|
+
}, {
|
|
61
|
+
telemetry,
|
|
62
|
+
logger: log.createChild('l1-tx-utils'),
|
|
63
|
+
dateProvider,
|
|
64
|
+
kzg: Blob.getViemKzgInstance()
|
|
65
|
+
}) : await createL1TxUtilsFromSigners(publicClient, proverSigners.signers, {
|
|
66
|
+
...config,
|
|
67
|
+
scope: 'prover'
|
|
68
|
+
}, {
|
|
69
|
+
telemetry,
|
|
70
|
+
logger: log.createChild('l1-tx-utils'),
|
|
71
|
+
dateProvider
|
|
72
|
+
});
|
|
73
|
+
// Create a funder L1TxUtils from the keystore funding account (if configured)
|
|
74
|
+
const fundingSigner = keyStoreManager?.createFundingSigner();
|
|
75
|
+
let funderL1TxUtils;
|
|
76
|
+
if (fundingSigner) {
|
|
77
|
+
const [funder] = await createL1TxUtilsFromSigners(publicClient, [
|
|
78
|
+
fundingSigner
|
|
79
|
+
], {
|
|
80
|
+
...config,
|
|
81
|
+
scope: 'prover'
|
|
82
|
+
}, {
|
|
83
|
+
telemetry,
|
|
84
|
+
logger: log.createChild('l1-tx-utils:funder'),
|
|
85
|
+
dateProvider
|
|
86
|
+
});
|
|
87
|
+
funderL1TxUtils = funder;
|
|
88
|
+
}
|
|
89
|
+
const publisherFactory = deps.publisherFactory ?? new ProverPublisherFactory(config, {
|
|
90
|
+
rollupContract,
|
|
91
|
+
proofSubmissionTarget: config.proofSubmissionTargetAddress,
|
|
92
|
+
publisherManager: new PublisherManager(l1TxUtils, getPublisherConfigFromProverConfig(config), {
|
|
93
|
+
bindings: log.getBindings(),
|
|
94
|
+
funder: funderL1TxUtils
|
|
95
|
+
}),
|
|
96
|
+
telemetry
|
|
97
|
+
});
|
|
98
|
+
const proverNodeConfig = {
|
|
99
|
+
...pick(config, 'proverNodeMaxPendingJobs', 'proverNodeMaxParallelBlocksPerEpoch', 'proverNodePollingIntervalMs', 'proverNodeEpochProvingDelayMs', 'txGatheringMaxParallelRequests', 'txGatheringIntervalMs', 'txGatheringTimeoutMs', 'proverNodeFailedEpochStore', 'proverNodeDisableProofPublish', 'dataDirectory', 'l1ChainId', 'rollupVersion')
|
|
100
|
+
};
|
|
101
|
+
const l1Metrics = new L1Metrics(telemetry.getMeter('ProverNodeL1Metrics'), publicClient, l1TxUtils.map((utils)=>utils.getSenderAddress()));
|
|
102
|
+
// Extract the shared delayer from the first L1TxUtils instance (all instances share the same delayer)
|
|
103
|
+
const delayer = l1TxUtils[0]?.delayer;
|
|
104
|
+
return new ProverNode(prover, publisherFactory, archiver, archiver, archiver, worldStateSynchronizer, p2pClient, rollupContract, l1Metrics, deps.avmSimulator, proverNodeConfig, telemetry, delayer, dateProvider);
|
|
105
|
+
}
|
package/dest/index.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export * from './actions/index.js';
|
|
2
|
+
export * from './config.js';
|
|
3
|
+
export * from './factory.js';
|
|
4
|
+
export * from './monitors/index.js';
|
|
5
|
+
export * from './proof-publishing-service.js';
|
|
6
|
+
export * from './prover-node-publisher.js';
|
|
7
|
+
export * from './prover-node.js';
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLG9CQUFvQixDQUFDO0FBQ25DLGNBQWMsYUFBYSxDQUFDO0FBQzVCLGNBQWMsY0FBYyxDQUFDO0FBQzdCLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYywrQkFBK0IsQ0FBQztBQUM5QyxjQUFjLDRCQUE0QixDQUFDO0FBQzNDLGNBQWMsa0JBQWtCLENBQUMifQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,qBAAqB,CAAC;AACpC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,kBAAkB,CAAC"}
|
package/dest/index.js
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export * from './actions/index.js';
|
|
2
|
+
export * from './config.js';
|
|
3
|
+
export * from './factory.js';
|
|
4
|
+
export * from './monitors/index.js';
|
|
5
|
+
export * from './proof-publishing-service.js';
|
|
6
|
+
export * from './prover-node-publisher.js';
|
|
7
|
+
export * from './prover-node.js';
|