@aztec/prover-node 0.0.1-commit.3469e52 → 0.0.1-commit.350e0a4d

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 (75) hide show
  1. package/README.md +518 -0
  2. package/dest/actions/download-epoch-proving-job.js +1 -1
  3. package/dest/actions/rerun-epoch-proving-job.d.ts +6 -4
  4. package/dest/actions/rerun-epoch-proving-job.d.ts.map +1 -1
  5. package/dest/actions/rerun-epoch-proving-job.js +187 -27
  6. package/dest/actions/upload-epoch-proof-failure.d.ts +2 -2
  7. package/dest/actions/upload-epoch-proof-failure.d.ts.map +1 -1
  8. package/dest/bin/run-failed-epoch.js +6 -5
  9. package/dest/checkpoint-store.d.ts +87 -0
  10. package/dest/checkpoint-store.d.ts.map +1 -0
  11. package/dest/checkpoint-store.js +186 -0
  12. package/dest/config.d.ts +7 -8
  13. package/dest/config.d.ts.map +1 -1
  14. package/dest/config.js +24 -20
  15. package/dest/factory.d.ts +19 -13
  16. package/dest/factory.d.ts.map +1 -1
  17. package/dest/factory.js +41 -69
  18. package/dest/index.d.ts +2 -1
  19. package/dest/index.d.ts.map +1 -1
  20. package/dest/index.js +1 -0
  21. package/dest/job/checkpoint-prover.d.ts +134 -0
  22. package/dest/job/checkpoint-prover.d.ts.map +1 -0
  23. package/dest/job/checkpoint-prover.js +353 -0
  24. package/dest/job/epoch-session.d.ts +146 -0
  25. package/dest/job/epoch-session.d.ts.map +1 -0
  26. package/dest/job/{epoch-proving-job.js → epoch-session.js} +277 -295
  27. package/dest/job/top-tree-job.d.ts +82 -0
  28. package/dest/job/top-tree-job.d.ts.map +1 -0
  29. package/dest/job/top-tree-job.js +152 -0
  30. package/dest/metrics.d.ts +40 -3
  31. package/dest/metrics.d.ts.map +1 -1
  32. package/dest/metrics.js +112 -7
  33. package/dest/monitors/epoch-monitor.d.ts +1 -1
  34. package/dest/monitors/epoch-monitor.d.ts.map +1 -1
  35. package/dest/monitors/epoch-monitor.js +11 -9
  36. package/dest/proof-publishing-service.d.ts +161 -0
  37. package/dest/proof-publishing-service.d.ts.map +1 -0
  38. package/dest/proof-publishing-service.js +335 -0
  39. package/dest/prover-node-publisher.d.ts +28 -17
  40. package/dest/prover-node-publisher.d.ts.map +1 -1
  41. package/dest/prover-node-publisher.js +205 -65
  42. package/dest/prover-node.d.ts +118 -70
  43. package/dest/prover-node.d.ts.map +1 -1
  44. package/dest/prover-node.js +489 -226
  45. package/dest/prover-publisher-factory.d.ts +9 -5
  46. package/dest/prover-publisher-factory.d.ts.map +1 -1
  47. package/dest/prover-publisher-factory.js +8 -5
  48. package/dest/session-manager.d.ts +158 -0
  49. package/dest/session-manager.d.ts.map +1 -0
  50. package/dest/session-manager.js +452 -0
  51. package/dest/test/index.d.ts +7 -6
  52. package/dest/test/index.d.ts.map +1 -1
  53. package/package.json +23 -22
  54. package/src/actions/download-epoch-proving-job.ts +1 -1
  55. package/src/actions/rerun-epoch-proving-job.ts +117 -29
  56. package/src/actions/upload-epoch-proof-failure.ts +1 -1
  57. package/src/bin/run-failed-epoch.ts +5 -3
  58. package/src/checkpoint-store.ts +218 -0
  59. package/src/config.ts +35 -32
  60. package/src/factory.ts +69 -112
  61. package/src/index.ts +1 -0
  62. package/src/job/checkpoint-prover.ts +468 -0
  63. package/src/job/epoch-session.ts +436 -0
  64. package/src/job/top-tree-job.ts +227 -0
  65. package/src/metrics.ts +129 -12
  66. package/src/monitors/epoch-monitor.ts +5 -6
  67. package/src/proof-publishing-service.ts +427 -0
  68. package/src/prover-node-publisher.ts +241 -81
  69. package/src/prover-node.ts +563 -254
  70. package/src/prover-publisher-factory.ts +19 -10
  71. package/src/session-manager.ts +552 -0
  72. package/src/test/index.ts +6 -6
  73. package/dest/job/epoch-proving-job.d.ts +0 -62
  74. package/dest/job/epoch-proving-job.d.ts.map +0 -1
  75. package/src/job/epoch-proving-job.ts +0 -427
package/src/factory.ts CHANGED
@@ -1,89 +1,78 @@
1
- import { type Archiver, createArchiver } from '@aztec/archiver';
2
- import { BBCircuitVerifier, QueuedIVCVerifier, TestCircuitVerifier } from '@aztec/bb-prover';
3
- import { createBlobClientWithFileStores } from '@aztec/blob-client/client';
4
- import { EpochCache } from '@aztec/epoch-cache';
1
+ import type { Archiver } from '@aztec/archiver';
2
+ import type { BlobClientInterface } from '@aztec/blob-client/client';
3
+ import { Blob } from '@aztec/blob-lib';
4
+ import type { EpochCacheInterface } from '@aztec/epoch-cache';
5
5
  import { createEthereumChain } from '@aztec/ethereum/chain';
6
+ import { makeL1HttpTransport } from '@aztec/ethereum/client';
6
7
  import { RollupContract } from '@aztec/ethereum/contracts';
7
8
  import { L1TxUtils } from '@aztec/ethereum/l1-tx-utils';
8
9
  import { PublisherManager } from '@aztec/ethereum/publisher-manager';
9
10
  import { pick } from '@aztec/foundation/collection';
10
11
  import { type Logger, createLogger } from '@aztec/foundation/log';
11
12
  import { DateProvider } from '@aztec/foundation/timer';
12
- import type { DataStoreConfig } from '@aztec/kv-store/config';
13
- import { type KeyStoreConfig, KeystoreManager, loadKeystores, mergeKeystores } from '@aztec/node-keystore';
14
- import { trySnapshotSync } from '@aztec/node-lib/actions';
15
- import {
16
- createForwarderL1TxUtilsFromEthSigner,
17
- createL1TxUtilsFromEthSignerWithStore,
18
- } from '@aztec/node-lib/factories';
19
- import { NodeRpcTxSource, createP2PClient } from '@aztec/p2p';
20
- import { type ProverClientConfig, createProverClient } from '@aztec/prover-client';
13
+ import { KeystoreManager } from '@aztec/node-keystore';
14
+ import { createForwarderL1TxUtilsFromSigners, createL1TxUtilsFromSigners } from '@aztec/node-lib/factories';
15
+ import { type ProverClientConfig, type ProverClientUserConfig, createProverClient } from '@aztec/prover-client';
21
16
  import { createAndStartProvingBroker } from '@aztec/prover-client/broker';
22
- import type { AztecNode, ProvingJobBroker } from '@aztec/stdlib/interfaces/server';
23
- import { P2PClientType } from '@aztec/stdlib/p2p';
24
- import type { PublicDataTreeLeaf } from '@aztec/stdlib/trees';
25
- import { getPackageVersion } from '@aztec/stdlib/update-checker';
17
+ import {
18
+ type ProverPublisherConfig,
19
+ type ProverTxSenderConfig,
20
+ getPublisherConfigFromProverConfig,
21
+ } from '@aztec/sequencer-client';
22
+ import type {
23
+ ITxProvider,
24
+ ProverConfig,
25
+ ProvingJobBroker,
26
+ Service,
27
+ WorldStateSynchronizer,
28
+ } from '@aztec/stdlib/interfaces/server';
26
29
  import { L1Metrics, type TelemetryClient, getTelemetryClient } from '@aztec/telemetry-client';
27
- import { createWorldStateSynchronizer } from '@aztec/world-state';
28
30
 
29
- import { createPublicClient, fallback, http } from 'viem';
31
+ import { createPublicClient } from 'viem';
30
32
 
31
- import { type ProverNodeConfig, createKeyStoreForProver } from './config.js';
32
- import { EpochMonitor } from './monitors/epoch-monitor.js';
33
+ import type { SpecificProverNodeConfig } from './config.js';
33
34
  import { ProverNode } from './prover-node.js';
34
35
  import { ProverPublisherFactory } from './prover-publisher-factory.js';
35
36
 
36
37
  export type ProverNodeDeps = {
37
38
  telemetry?: TelemetryClient;
38
39
  log?: Logger;
39
- aztecNodeTxProvider?: Pick<AztecNode, 'getTxsByHash'>;
40
- archiver?: Archiver;
40
+ archiver: Archiver;
41
41
  publisherFactory?: ProverPublisherFactory;
42
42
  broker?: ProvingJobBroker;
43
43
  l1TxUtils?: L1TxUtils;
44
44
  dateProvider?: DateProvider;
45
+ worldStateSynchronizer: WorldStateSynchronizer;
46
+ p2pClient: { getTxProvider(): ITxProvider } & Partial<Service>;
47
+ epochCache: EpochCacheInterface;
48
+ blobClient: BlobClientInterface;
49
+ keyStoreManager?: KeystoreManager;
45
50
  };
46
51
 
47
- /** Creates a new prover node given a config. */
52
+ /** Creates a new prover node subsystem given a config and dependencies */
48
53
  export async function createProverNode(
49
- userConfig: ProverNodeConfig & DataStoreConfig & KeyStoreConfig,
50
- deps: ProverNodeDeps = {},
51
- options: {
52
- prefilledPublicData?: PublicDataTreeLeaf[];
53
- } = {},
54
+ userConfig: SpecificProverNodeConfig &
55
+ ProverConfig &
56
+ ProverClientUserConfig &
57
+ ProverPublisherConfig &
58
+ ProverTxSenderConfig,
59
+ deps: ProverNodeDeps,
54
60
  ) {
55
61
  const config = { ...userConfig };
56
62
  const telemetry = deps.telemetry ?? getTelemetryClient();
57
63
  const dateProvider = deps.dateProvider ?? new DateProvider();
58
- const blobClient = await createBlobClientWithFileStores(config, createLogger('prover-node:blob-client:client'));
59
- const log = deps.log ?? createLogger('prover-node');
60
-
61
- // Build a key store from file if given or from environment otherwise
62
- let keyStoreManager: KeystoreManager | undefined;
63
- const keyStoreProvided = config.keyStoreDirectory !== undefined && config.keyStoreDirectory.length > 0;
64
- if (keyStoreProvided) {
65
- const keyStores = loadKeystores(config.keyStoreDirectory!);
66
- keyStoreManager = new KeystoreManager(mergeKeystores(keyStores));
67
- } else {
68
- const keyStore = createKeyStoreForProver(config);
69
- if (keyStore) {
70
- keyStoreManager = new KeystoreManager(keyStore);
71
- }
72
- }
64
+ const log = deps.log ?? createLogger('prover');
73
65
 
74
- await keyStoreManager?.validateSigners();
66
+ const { p2pClient, archiver, keyStoreManager, worldStateSynchronizer } = deps;
75
67
 
76
68
  // Extract the prover signers from the key store and verify that we have one.
69
+ await keyStoreManager?.validateSigners();
77
70
  const proverSigners = keyStoreManager?.createProverSigners();
78
71
 
79
72
  if (proverSigners === undefined) {
80
73
  throw new Error('Failed to create prover key store configuration');
81
74
  } else if (proverSigners.signers.length === 0) {
82
75
  throw new Error('No prover signers found in the key store');
83
- } else if (!keyStoreProvided) {
84
- log.warn(
85
- 'KEY STORE CREATED FROM ENVIRONMENT, IT IS RECOMMENDED TO USE A FILE-BASED KEY STORE IN PRODUCTION ENVIRONMENTS',
86
- );
87
76
  }
88
77
 
89
78
  log.info(`Creating prover with publishers ${proverSigners.signers.map(signer => signer.address.toString()).join()}`);
@@ -95,28 +84,7 @@ export async function createProverNode(
95
84
  const proverId = proverSigners.id ?? proverIdInUserConfig ?? proverSigners.signers[0].address;
96
85
 
97
86
  // Now create the prover client configuration from this.
98
- const proverClientConfig: ProverClientConfig = {
99
- ...config,
100
- proverId,
101
- };
102
-
103
- await trySnapshotSync(config, log);
104
-
105
- const epochCache = await EpochCache.create(config.l1Contracts.rollupAddress, config);
106
-
107
- const archiver =
108
- deps.archiver ??
109
- (await createArchiver(config, { blobClient, epochCache, telemetry, dateProvider }, { blockUntilSync: true }));
110
- log.verbose(`Created archiver and synced to block ${await archiver.getBlockNumber()}`);
111
-
112
- const worldStateConfig = { ...config, worldStateProvenBlocksOnly: false };
113
- const worldStateSynchronizer = await createWorldStateSynchronizer(
114
- worldStateConfig,
115
- archiver,
116
- options.prefilledPublicData,
117
- telemetry,
118
- );
119
- await worldStateSynchronizer.start();
87
+ const proverClientConfig: ProverClientConfig = { ...config, proverId };
120
88
 
121
89
  const broker = deps.broker ?? (await createAndStartProvingBroker(config, telemetry));
122
90
 
@@ -127,63 +95,54 @@ export async function createProverNode(
127
95
 
128
96
  const publicClient = createPublicClient({
129
97
  chain: chain.chainInfo,
130
- transport: fallback(config.l1RpcUrls.map((url: string) => http(url, { batch: false }))),
98
+ transport: makeL1HttpTransport(config.l1RpcUrls, { timeout: config.l1HttpTimeoutMS }),
131
99
  pollingInterval: config.viemPollingIntervalMS,
132
100
  });
133
101
 
134
- const rollupContract = new RollupContract(publicClient, config.l1Contracts.rollupAddress.toString());
102
+ const rollupContract = new RollupContract(publicClient, config.rollupAddress.toString());
135
103
 
136
104
  const l1TxUtils = deps.l1TxUtils
137
105
  ? [deps.l1TxUtils]
138
- : config.publisherForwarderAddress
139
- ? await createForwarderL1TxUtilsFromEthSigner(
106
+ : config.proverPublisherForwarderAddress
107
+ ? await createForwarderL1TxUtilsFromSigners(
140
108
  publicClient,
141
109
  proverSigners.signers,
142
- config.publisherForwarderAddress,
110
+ config.proverPublisherForwarderAddress,
143
111
  { ...config, scope: 'prover' },
144
- { telemetry, logger: log.createChild('l1-tx-utils'), dateProvider },
112
+ { telemetry, logger: log.createChild('l1-tx-utils'), dateProvider, kzg: Blob.getViemKzgInstance() },
145
113
  )
146
- : await createL1TxUtilsFromEthSignerWithStore(
114
+ : await createL1TxUtilsFromSigners(
147
115
  publicClient,
148
116
  proverSigners.signers,
149
117
  { ...config, scope: 'prover' },
150
118
  { telemetry, logger: log.createChild('l1-tx-utils'), dateProvider },
151
119
  );
152
120
 
121
+ // Create a funder L1TxUtils from the keystore funding account (if configured)
122
+ const fundingSigner = keyStoreManager?.createFundingSigner();
123
+ let funderL1TxUtils: L1TxUtils | undefined;
124
+ if (fundingSigner) {
125
+ const [funder] = await createL1TxUtilsFromSigners(
126
+ publicClient,
127
+ [fundingSigner],
128
+ { ...config, scope: 'prover' },
129
+ { telemetry, logger: log.createChild('l1-tx-utils:funder'), dateProvider },
130
+ );
131
+ funderL1TxUtils = funder;
132
+ }
133
+
153
134
  const publisherFactory =
154
135
  deps.publisherFactory ??
155
136
  new ProverPublisherFactory(config, {
156
137
  rollupContract,
157
- publisherManager: new PublisherManager(l1TxUtils, config),
138
+ proofSubmissionTarget: config.proofSubmissionTargetAddress,
139
+ publisherManager: new PublisherManager(l1TxUtils, getPublisherConfigFromProverConfig(config), {
140
+ bindings: log.getBindings(),
141
+ funder: funderL1TxUtils,
142
+ }),
158
143
  telemetry,
159
144
  });
160
145
 
161
- const proofVerifier = new QueuedIVCVerifier(
162
- config,
163
- config.realProofs || config.debugForceTxProofVerification
164
- ? await BBCircuitVerifier.new(config)
165
- : new TestCircuitVerifier(config.proverTestVerificationDelayMs),
166
- );
167
-
168
- const p2pClient = await createP2PClient(
169
- P2PClientType.Prover,
170
- config,
171
- archiver,
172
- proofVerifier,
173
- worldStateSynchronizer,
174
- epochCache,
175
- getPackageVersion() ?? '',
176
- dateProvider,
177
- telemetry,
178
- {
179
- txCollectionNodeSources: deps.aztecNodeTxProvider
180
- ? [new NodeRpcTxSource(deps.aztecNodeTxProvider, 'TestNode')]
181
- : [],
182
- },
183
- );
184
-
185
- await p2pClient.start();
186
-
187
146
  const proverNodeConfig = {
188
147
  ...pick(
189
148
  config,
@@ -202,18 +161,15 @@ export async function createProverNode(
202
161
  ),
203
162
  };
204
163
 
205
- const epochMonitor = await EpochMonitor.create(
206
- archiver,
207
- { pollingIntervalMs: config.proverNodePollingIntervalMs, provingDelayMs: config.proverNodeEpochProvingDelayMs },
208
- telemetry,
209
- );
210
-
211
164
  const l1Metrics = new L1Metrics(
212
165
  telemetry.getMeter('ProverNodeL1Metrics'),
213
166
  publicClient,
214
167
  l1TxUtils.map(utils => utils.getSenderAddress()),
215
168
  );
216
169
 
170
+ // Extract the shared delayer from the first L1TxUtils instance (all instances share the same delayer)
171
+ const delayer = l1TxUtils[0]?.delayer;
172
+
217
173
  return new ProverNode(
218
174
  prover,
219
175
  publisherFactory,
@@ -222,10 +178,11 @@ export async function createProverNode(
222
178
  archiver,
223
179
  worldStateSynchronizer,
224
180
  p2pClient,
225
- epochMonitor,
226
181
  rollupContract,
227
182
  l1Metrics,
228
183
  proverNodeConfig,
229
184
  telemetry,
185
+ delayer,
186
+ dateProvider,
230
187
  );
231
188
  }
package/src/index.ts CHANGED
@@ -2,5 +2,6 @@ export * from './actions/index.js';
2
2
  export * from './config.js';
3
3
  export * from './factory.js';
4
4
  export * from './monitors/index.js';
5
+ export * from './proof-publishing-service.js';
5
6
  export * from './prover-node-publisher.js';
6
7
  export * from './prover-node.js';