@aztec/prover-node 0.0.1-commit.a072138 → 0.0.1-commit.a4600f49

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 +5 -4
  4. package/dest/actions/rerun-epoch-proving-job.d.ts.map +1 -1
  5. package/dest/actions/rerun-epoch-proving-job.js +191 -30
  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 +22 -13
  16. package/dest/factory.d.ts.map +1 -1
  17. package/dest/factory.js +41 -65
  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} +276 -297
  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 +101 -4
  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 +25 -15
  40. package/dest/prover-node-publisher.d.ts.map +1 -1
  41. package/dest/prover-node-publisher.js +202 -63
  42. package/dest/prover-node.d.ts +120 -70
  43. package/dest/prover-node.d.ts.map +1 -1
  44. package/dest/prover-node.js +491 -226
  45. package/dest/prover-publisher-factory.d.ts +6 -4
  46. package/dest/prover-publisher-factory.d.ts.map +1 -1
  47. package/dest/prover-publisher-factory.js +4 -3
  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 +24 -22
  54. package/src/actions/download-epoch-proving-job.ts +1 -1
  55. package/src/actions/rerun-epoch-proving-job.ts +118 -30
  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 +73 -111
  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 +123 -10
  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 +237 -79
  69. package/src/prover-node.ts +566 -257
  70. package/src/prover-publisher-factory.ts +8 -5
  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 -63
  74. package/dest/job/epoch-proving-job.d.ts.map +0 -1
  75. package/src/job/epoch-proving-job.ts +0 -435
package/src/factory.ts CHANGED
@@ -1,89 +1,81 @@
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 { AvmSimulator } from '@aztec/simulator/server';
23
+ import type {
24
+ ITxProvider,
25
+ ProverConfig,
26
+ ProvingJobBroker,
27
+ Service,
28
+ WorldStateSynchronizer,
29
+ } from '@aztec/stdlib/interfaces/server';
26
30
  import { L1Metrics, type TelemetryClient, getTelemetryClient } from '@aztec/telemetry-client';
27
- import { createWorldStateSynchronizer } from '@aztec/world-state';
28
31
 
29
- import { createPublicClient, fallback, http } from 'viem';
32
+ import { createPublicClient } from 'viem';
30
33
 
31
- import { type ProverNodeConfig, createKeyStoreForProver } from './config.js';
32
- import { EpochMonitor } from './monitors/epoch-monitor.js';
34
+ import type { SpecificProverNodeConfig } from './config.js';
33
35
  import { ProverNode } from './prover-node.js';
34
36
  import { ProverPublisherFactory } from './prover-publisher-factory.js';
35
37
 
36
38
  export type ProverNodeDeps = {
37
39
  telemetry?: TelemetryClient;
38
40
  log?: Logger;
39
- aztecNodeTxProvider?: Pick<AztecNode, 'getTxsByHash'>;
40
- archiver?: Archiver;
41
+ archiver: Archiver;
41
42
  publisherFactory?: ProverPublisherFactory;
42
43
  broker?: ProvingJobBroker;
43
44
  l1TxUtils?: L1TxUtils;
44
45
  dateProvider?: DateProvider;
46
+ worldStateSynchronizer: WorldStateSynchronizer;
47
+ p2pClient: { getTxProvider(): ITxProvider } & Partial<Service>;
48
+ epochCache: EpochCacheInterface;
49
+ blobClient: BlobClientInterface;
50
+ keyStoreManager?: KeystoreManager;
51
+ /** AVM execution backend (simulator pool + CDB server) for public simulation. */
52
+ avmSimulator: AvmSimulator;
45
53
  };
46
54
 
47
- /** Creates a new prover node given a config. */
55
+ /** Creates a new prover node subsystem given a config and dependencies */
48
56
  export async function createProverNode(
49
- userConfig: ProverNodeConfig & DataStoreConfig & KeyStoreConfig,
50
- deps: ProverNodeDeps = {},
51
- options: {
52
- prefilledPublicData?: PublicDataTreeLeaf[];
53
- } = {},
57
+ userConfig: SpecificProverNodeConfig &
58
+ ProverConfig &
59
+ ProverClientUserConfig &
60
+ ProverPublisherConfig &
61
+ ProverTxSenderConfig,
62
+ deps: ProverNodeDeps,
54
63
  ) {
55
64
  const config = { ...userConfig };
56
65
  const telemetry = deps.telemetry ?? getTelemetryClient();
57
66
  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
- }
67
+ const log = deps.log ?? createLogger('prover');
73
68
 
74
- await keyStoreManager?.validateSigners();
69
+ const { p2pClient, archiver, keyStoreManager, worldStateSynchronizer } = deps;
75
70
 
76
71
  // Extract the prover signers from the key store and verify that we have one.
72
+ await keyStoreManager?.validateSigners();
77
73
  const proverSigners = keyStoreManager?.createProverSigners();
78
74
 
79
75
  if (proverSigners === undefined) {
80
76
  throw new Error('Failed to create prover key store configuration');
81
77
  } else if (proverSigners.signers.length === 0) {
82
78
  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
79
  }
88
80
 
89
81
  log.info(`Creating prover with publishers ${proverSigners.signers.map(signer => signer.address.toString()).join()}`);
@@ -95,27 +87,7 @@ export async function createProverNode(
95
87
  const proverId = proverSigners.id ?? proverIdInUserConfig ?? proverSigners.signers[0].address;
96
88
 
97
89
  // 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 worldStateSynchronizer = await createWorldStateSynchronizer(
113
- config,
114
- archiver,
115
- options.prefilledPublicData,
116
- telemetry,
117
- );
118
- await worldStateSynchronizer.start();
90
+ const proverClientConfig: ProverClientConfig = { ...config, proverId };
119
91
 
120
92
  const broker = deps.broker ?? (await createAndStartProvingBroker(config, telemetry));
121
93
 
@@ -126,63 +98,54 @@ export async function createProverNode(
126
98
 
127
99
  const publicClient = createPublicClient({
128
100
  chain: chain.chainInfo,
129
- transport: fallback(config.l1RpcUrls.map((url: string) => http(url, { batch: false }))),
101
+ transport: makeL1HttpTransport(config.l1RpcUrls, { timeout: config.l1HttpTimeoutMS }),
130
102
  pollingInterval: config.viemPollingIntervalMS,
131
103
  });
132
104
 
133
- const rollupContract = new RollupContract(publicClient, config.l1Contracts.rollupAddress.toString());
105
+ const rollupContract = new RollupContract(publicClient, config.rollupAddress.toString());
134
106
 
135
107
  const l1TxUtils = deps.l1TxUtils
136
108
  ? [deps.l1TxUtils]
137
- : config.publisherForwarderAddress
138
- ? await createForwarderL1TxUtilsFromEthSigner(
109
+ : config.proverPublisherForwarderAddress
110
+ ? await createForwarderL1TxUtilsFromSigners(
139
111
  publicClient,
140
112
  proverSigners.signers,
141
- config.publisherForwarderAddress,
113
+ config.proverPublisherForwarderAddress,
142
114
  { ...config, scope: 'prover' },
143
- { telemetry, logger: log.createChild('l1-tx-utils'), dateProvider },
115
+ { telemetry, logger: log.createChild('l1-tx-utils'), dateProvider, kzg: Blob.getViemKzgInstance() },
144
116
  )
145
- : await createL1TxUtilsFromEthSignerWithStore(
117
+ : await createL1TxUtilsFromSigners(
146
118
  publicClient,
147
119
  proverSigners.signers,
148
120
  { ...config, scope: 'prover' },
149
121
  { telemetry, logger: log.createChild('l1-tx-utils'), dateProvider },
150
122
  );
151
123
 
124
+ // Create a funder L1TxUtils from the keystore funding account (if configured)
125
+ const fundingSigner = keyStoreManager?.createFundingSigner();
126
+ let funderL1TxUtils: L1TxUtils | undefined;
127
+ if (fundingSigner) {
128
+ const [funder] = await createL1TxUtilsFromSigners(
129
+ publicClient,
130
+ [fundingSigner],
131
+ { ...config, scope: 'prover' },
132
+ { telemetry, logger: log.createChild('l1-tx-utils:funder'), dateProvider },
133
+ );
134
+ funderL1TxUtils = funder;
135
+ }
136
+
152
137
  const publisherFactory =
153
138
  deps.publisherFactory ??
154
139
  new ProverPublisherFactory(config, {
155
140
  rollupContract,
156
- publisherManager: new PublisherManager(l1TxUtils, config, log.getBindings()),
141
+ proofSubmissionTarget: config.proofSubmissionTargetAddress,
142
+ publisherManager: new PublisherManager(l1TxUtils, getPublisherConfigFromProverConfig(config), {
143
+ bindings: log.getBindings(),
144
+ funder: funderL1TxUtils,
145
+ }),
157
146
  telemetry,
158
147
  });
159
148
 
160
- const proofVerifier = new QueuedIVCVerifier(
161
- config,
162
- config.realProofs || config.debugForceTxProofVerification
163
- ? await BBCircuitVerifier.new(config)
164
- : new TestCircuitVerifier(config.proverTestVerificationDelayMs),
165
- );
166
-
167
- const p2pClient = await createP2PClient(
168
- P2PClientType.Prover,
169
- config,
170
- archiver,
171
- proofVerifier,
172
- worldStateSynchronizer,
173
- epochCache,
174
- getPackageVersion() ?? '',
175
- dateProvider,
176
- telemetry,
177
- {
178
- txCollectionNodeSources: deps.aztecNodeTxProvider
179
- ? [new NodeRpcTxSource(deps.aztecNodeTxProvider, 'TestNode')]
180
- : [],
181
- },
182
- );
183
-
184
- await p2pClient.start();
185
-
186
149
  const proverNodeConfig = {
187
150
  ...pick(
188
151
  config,
@@ -201,18 +164,15 @@ export async function createProverNode(
201
164
  ),
202
165
  };
203
166
 
204
- const epochMonitor = await EpochMonitor.create(
205
- archiver,
206
- { pollingIntervalMs: config.proverNodePollingIntervalMs, provingDelayMs: config.proverNodeEpochProvingDelayMs },
207
- telemetry,
208
- );
209
-
210
167
  const l1Metrics = new L1Metrics(
211
168
  telemetry.getMeter('ProverNodeL1Metrics'),
212
169
  publicClient,
213
170
  l1TxUtils.map(utils => utils.getSenderAddress()),
214
171
  );
215
172
 
173
+ // Extract the shared delayer from the first L1TxUtils instance (all instances share the same delayer)
174
+ const delayer = l1TxUtils[0]?.delayer;
175
+
216
176
  return new ProverNode(
217
177
  prover,
218
178
  publisherFactory,
@@ -221,10 +181,12 @@ export async function createProverNode(
221
181
  archiver,
222
182
  worldStateSynchronizer,
223
183
  p2pClient,
224
- epochMonitor,
225
184
  rollupContract,
226
185
  l1Metrics,
186
+ deps.avmSimulator,
227
187
  proverNodeConfig,
228
188
  telemetry,
189
+ delayer,
190
+ dateProvider,
229
191
  );
230
192
  }
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';