@aztec/prover-node 0.0.1-commit.d3ec352c → 0.0.1-commit.d58ff9d0

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