@aztec/aztec 0.0.1-commit.c80b6263 → 0.0.1-commit.cd76b27

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 (42) hide show
  1. package/dest/cli/admin_api_key_store.d.ts +45 -0
  2. package/dest/cli/admin_api_key_store.d.ts.map +1 -0
  3. package/dest/cli/admin_api_key_store.js +98 -0
  4. package/dest/cli/aztec_start_action.d.ts +1 -1
  5. package/dest/cli/aztec_start_action.d.ts.map +1 -1
  6. package/dest/cli/aztec_start_action.js +44 -8
  7. package/dest/cli/aztec_start_options.d.ts +1 -1
  8. package/dest/cli/aztec_start_options.d.ts.map +1 -1
  9. package/dest/cli/aztec_start_options.js +22 -6
  10. package/dest/cli/cmds/start_bot.d.ts +3 -3
  11. package/dest/cli/cmds/start_bot.d.ts.map +1 -1
  12. package/dest/cli/cmds/start_bot.js +9 -5
  13. package/dest/cli/cmds/start_node.d.ts +1 -1
  14. package/dest/cli/cmds/start_node.d.ts.map +1 -1
  15. package/dest/cli/cmds/start_node.js +62 -10
  16. package/dest/cli/cmds/start_prover_agent.js +2 -2
  17. package/dest/cli/cmds/start_prover_broker.d.ts +1 -1
  18. package/dest/cli/cmds/start_prover_broker.d.ts.map +1 -1
  19. package/dest/cli/cmds/start_prover_broker.js +2 -2
  20. package/dest/cli/util.d.ts +5 -14
  21. package/dest/cli/util.d.ts.map +1 -1
  22. package/dest/cli/util.js +10 -5
  23. package/dest/examples/token.js +2 -2
  24. package/dest/local-network/local-network.d.ts +4 -2
  25. package/dest/local-network/local-network.d.ts.map +1 -1
  26. package/dest/local-network/local-network.js +17 -13
  27. package/package.json +34 -34
  28. package/scripts/aztec.sh +1 -2
  29. package/src/cli/admin_api_key_store.ts +128 -0
  30. package/src/cli/aztec_start_action.ts +48 -4
  31. package/src/cli/aztec_start_options.ts +24 -5
  32. package/src/cli/cmds/start_bot.ts +8 -5
  33. package/src/cli/cmds/start_node.ts +51 -9
  34. package/src/cli/cmds/start_prover_agent.ts +2 -2
  35. package/src/cli/cmds/start_prover_broker.ts +5 -1
  36. package/src/cli/util.ts +14 -19
  37. package/src/examples/token.ts +2 -2
  38. package/src/local-network/local-network.ts +25 -14
  39. package/dest/cli/cmds/start_prover_node.d.ts +0 -7
  40. package/dest/cli/cmds/start_prover_node.d.ts.map +0 -1
  41. package/dest/cli/cmds/start_prover_node.js +0 -108
  42. package/src/cli/cmds/start_prover_node.ts +0 -124
@@ -6,16 +6,19 @@ import { getL1Config } from '@aztec/cli/config';
6
6
  import { getPublicClient } from '@aztec/ethereum/client';
7
7
  import { SecretValue } from '@aztec/foundation/config';
8
8
  import type { NamespacedApiHandlers } from '@aztec/foundation/json-rpc/server';
9
+ import { Agent, makeUndiciFetch } from '@aztec/foundation/json-rpc/undici';
9
10
  import type { LogFn } from '@aztec/foundation/log';
11
+ import { ProvingJobConsumerSchema, createProvingJobBrokerClient } from '@aztec/prover-client/broker';
10
12
  import { type CliPXEOptions, type PXEConfig, allPxeConfigMappings } from '@aztec/pxe/config';
11
13
  import { AztecNodeAdminApiSchema, AztecNodeApiSchema } from '@aztec/stdlib/interfaces/client';
12
- import { P2PApiSchema } from '@aztec/stdlib/interfaces/server';
14
+ import { P2PApiSchema, ProverNodeApiSchema, type ProvingJobBroker } from '@aztec/stdlib/interfaces/server';
13
15
  import {
14
16
  type TelemetryClientConfig,
15
17
  initTelemetryClient,
18
+ makeTracedFetch,
16
19
  telemetryClientConfigMappings,
17
20
  } from '@aztec/telemetry-client';
18
- import { TestWallet } from '@aztec/test-wallet/server';
21
+ import { EmbeddedWallet } from '@aztec/wallets/embedded';
19
22
  import { getGenesisValues } from '@aztec/world-state/testing';
20
23
 
21
24
  import { createAztecNode } from '../../local-network/index.js';
@@ -25,6 +28,8 @@ import {
25
28
  preloadCrsDataForVerifying,
26
29
  setupUpdateMonitor,
27
30
  } from '../util.js';
31
+ import { getVersions } from '../versioning.js';
32
+ import { startProverBroker } from './start_prover_broker.js';
28
33
 
29
34
  export async function startNode(
30
35
  options: any,
@@ -45,9 +50,32 @@ export async function startNode(
45
50
  ...relevantOptions,
46
51
  };
47
52
 
53
+ // Prover node configuration and broker setup
54
+ // REFACTOR: Move the broker setup out of here and into the prover-node factory
55
+ let broker: ProvingJobBroker | undefined = undefined;
48
56
  if (options.proverNode) {
49
- userLog(`Running a Prover Node within a Node is not yet supported`);
50
- process.exit(1);
57
+ nodeConfig.enableProverNode = true;
58
+ if (nodeConfig.proverAgentCount === 0) {
59
+ userLog(
60
+ `Running prover node without local prover agent. Connect prover agents or pass --proverAgent.proverAgentCount`,
61
+ );
62
+ }
63
+ if (nodeConfig.proverBrokerUrl) {
64
+ // at 1TPS we'd enqueue ~1k chonk verifier proofs and ~1k AVM proofs immediately
65
+ // set a lower connection limit such that we don't overload the server
66
+ // Keep retrying up to 30s
67
+ const fetch = makeTracedFetch(
68
+ [1, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3],
69
+ false,
70
+ makeUndiciFetch(new Agent({ connections: 100 })),
71
+ );
72
+ broker = createProvingJobBrokerClient(nodeConfig.proverBrokerUrl, getVersions(nodeConfig), fetch);
73
+ } else if (options.proverBroker) {
74
+ ({ broker } = await startProverBroker(options, signalHandlers, services, userLog));
75
+ } else {
76
+ userLog(`--prover-broker-url or --prover-broker is required to start a Prover Node`);
77
+ process.exit(1);
78
+ }
51
79
  }
52
80
 
53
81
  await preloadCrsDataForVerifying(nodeConfig, userLog);
@@ -101,12 +129,17 @@ export async function startNode(
101
129
  ...extractNamespacedOptions(options, 'sequencer'),
102
130
  };
103
131
  // If no publisher private keys have been given, use the first validator key
104
- if (sequencerConfig.publisherPrivateKeys === undefined || !sequencerConfig.publisherPrivateKeys.length) {
132
+ if (
133
+ sequencerConfig.sequencerPublisherPrivateKeys === undefined ||
134
+ !sequencerConfig.sequencerPublisherPrivateKeys.length
135
+ ) {
105
136
  if (sequencerConfig.validatorPrivateKeys?.getValue().length) {
106
- sequencerConfig.publisherPrivateKeys = [new SecretValue(sequencerConfig.validatorPrivateKeys.getValue()[0])];
137
+ sequencerConfig.sequencerPublisherPrivateKeys = [
138
+ new SecretValue(sequencerConfig.validatorPrivateKeys.getValue()[0]),
139
+ ];
107
140
  }
108
141
  }
109
- nodeConfig.publisherPrivateKeys = sequencerConfig.publisherPrivateKeys;
142
+ nodeConfig.sequencerPublisherPrivateKeys = sequencerConfig.sequencerPublisherPrivateKeys;
110
143
  }
111
144
 
112
145
  if (nodeConfig.p2pEnabled) {
@@ -120,13 +153,22 @@ export async function startNode(
120
153
  const telemetry = await initTelemetryClient(telemetryConfig);
121
154
 
122
155
  // Create and start Aztec Node
123
- const node = await createAztecNode(nodeConfig, { telemetry }, { prefilledPublicData });
156
+ const node = await createAztecNode(nodeConfig, { telemetry, proverBroker: broker }, { prefilledPublicData });
124
157
 
125
158
  // Add node and p2p to services list
126
159
  services.node = [node, AztecNodeApiSchema];
127
160
  services.p2p = [node.getP2P(), P2PApiSchema];
128
161
  adminServices.nodeAdmin = [node, AztecNodeAdminApiSchema];
129
162
 
163
+ // Register prover-node services if the prover node subsystem is running
164
+ const proverNode = node.getProverNode();
165
+ if (proverNode) {
166
+ services.prover = [proverNode, ProverNodeApiSchema];
167
+ if (!nodeConfig.proverBrokerUrl) {
168
+ services.provingJobSource = [proverNode.getProver().getProvingJobSource(), ProvingJobConsumerSchema];
169
+ }
170
+ }
171
+
130
172
  // Add node stop function to signal handlers
131
173
  signalHandlers.push(node.stop.bind(node));
132
174
 
@@ -135,7 +177,7 @@ export async function startNode(
135
177
  const { addBot } = await import('./start_bot.js');
136
178
 
137
179
  const pxeConfig = extractRelevantOptions<PXEConfig & CliPXEOptions>(options, allPxeConfigMappings, 'pxe');
138
- const wallet = await TestWallet.create(node, pxeConfig);
180
+ const wallet = await EmbeddedWallet.create(node, { pxeConfig });
139
181
 
140
182
  await addBot(options, signalHandlers, services, wallet, node, telemetry, undefined);
141
183
  }
@@ -4,9 +4,9 @@ import { Agent, makeUndiciFetch } from '@aztec/foundation/json-rpc/undici';
4
4
  import type { LogFn } from '@aztec/foundation/log';
5
5
  import { buildServerCircuitProver } from '@aztec/prover-client';
6
6
  import {
7
- InlineProofStore,
8
7
  type ProverAgentConfig,
9
8
  ProvingAgent,
9
+ createProofStore,
10
10
  createProvingJobBrokerClient,
11
11
  proverAgentConfigMappings,
12
12
  } from '@aztec/prover-client/broker';
@@ -55,7 +55,7 @@ export async function startProverAgent(
55
55
 
56
56
  const telemetry = await initTelemetryClient(extractRelevantOptions(options, telemetryClientConfigMappings, 'tel'));
57
57
  const prover = await buildServerCircuitProver(config, telemetry);
58
- const proofStore = new InlineProofStore();
58
+ const proofStore = await createProofStore(config.proofStore);
59
59
  const agents = times(
60
60
  config.proverAgentCount,
61
61
  () => new ProvingAgent(broker, proofStore, prover, config.proverAgentProofTypes, config.proverAgentPollIntervalMs),
@@ -5,6 +5,7 @@ import type { LogFn } from '@aztec/foundation/log';
5
5
  import {
6
6
  type ProverBrokerConfig,
7
7
  ProvingJobBrokerSchema,
8
+ ProvingJobBrokerSchemaWithDebug,
8
9
  createAndStartProvingBroker,
9
10
  proverBrokerConfigMappings,
10
11
  } from '@aztec/prover-client/broker';
@@ -59,7 +60,10 @@ export async function startProverBroker(
59
60
  );
60
61
  }
61
62
 
62
- services.proverBroker = [broker, ProvingJobBrokerSchema];
63
+ services.proverBroker = [
64
+ broker,
65
+ config.proverBrokerDebugReplayEnabled ? ProvingJobBrokerSchemaWithDebug : ProvingJobBrokerSchema,
66
+ ];
63
67
  signalHandlers.push(() => broker.stop());
64
68
 
65
69
  return { broker, config };
package/src/cli/util.ts CHANGED
@@ -2,13 +2,13 @@ import type { AztecNodeConfig } from '@aztec/aztec-node';
2
2
  import type { AccountManager } from '@aztec/aztec.js/wallet';
3
3
  import type { ViemClient } from '@aztec/ethereum/types';
4
4
  import type { ConfigMappingsType } from '@aztec/foundation/config';
5
- import { Fr } from '@aztec/foundation/curves/bn254';
6
5
  import { EthAddress } from '@aztec/foundation/eth-address';
6
+ import { jsonStringify } from '@aztec/foundation/json-rpc';
7
7
  import { type LogFn, createLogger } from '@aztec/foundation/log';
8
8
  import type { SharedNodeConfig } from '@aztec/node-lib/config';
9
9
  import type { ProverConfig } from '@aztec/stdlib/interfaces/server';
10
10
  import { getTelemetryClient } from '@aztec/telemetry-client/start';
11
- import type { TestWallet } from '@aztec/test-wallet/server';
11
+ import type { EmbeddedWallet } from '@aztec/wallets/embedded';
12
12
 
13
13
  import chalk from 'chalk';
14
14
  import type { Command } from 'commander';
@@ -68,30 +68,19 @@ export const installSignalHandlers = (logFn: LogFn, cb?: Array<() => Promise<voi
68
68
  /**
69
69
  * Creates logs for the initial accounts
70
70
  * @param accounts - The initial accounts
71
- * @param wallet - A TestWallet instance to get the registered accounts
71
+ * @param wallet - A EmbeddedWallet instance to get the registered accounts
72
72
  * @returns A string array containing the initial accounts details
73
73
  */
74
- export async function createAccountLogs(
75
- accountsWithSecretKeys: {
76
- /**
77
- * The account object
78
- */
79
- account: AccountManager;
80
- /**
81
- * The secret key of the account
82
- */
83
- secretKey: Fr;
84
- }[],
85
- wallet: TestWallet,
86
- ) {
74
+ export async function createAccountLogs(accountManagers: AccountManager[], wallet: EmbeddedWallet) {
87
75
  const registeredAccounts = await wallet.getAccounts();
88
76
  const accountLogStrings = [`Initial Accounts:\n\n`];
89
- for (const accountWithSecretKey of accountsWithSecretKeys) {
90
- const completeAddress = await accountWithSecretKey.account.getCompleteAddress();
77
+ for (const accountManager of accountManagers) {
78
+ const account = await accountManager.getAccount();
79
+ const completeAddress = account.getCompleteAddress();
91
80
  if (registeredAccounts.find(a => a.item.equals(completeAddress.address))) {
92
81
  accountLogStrings.push(` Address: ${completeAddress.address.toString()}\n`);
93
82
  accountLogStrings.push(` Partial Address: ${completeAddress.partialAddress.toString()}\n`);
94
- accountLogStrings.push(` Secret Key: ${accountWithSecretKey.secretKey.toString()}\n`);
83
+ accountLogStrings.push(` Secret Key: ${account.getSecretKey().toString()}\n`);
95
84
  accountLogStrings.push(
96
85
  ` Master nullifier public key: ${completeAddress.publicKeys.masterNullifierPublicKey.toString()}\n`,
97
86
  );
@@ -388,3 +377,9 @@ export async function setupUpdateMonitor(
388
377
 
389
378
  checker.start();
390
379
  }
380
+
381
+ export function stringifyConfig(config: object): string {
382
+ return Object.entries(config)
383
+ .map(([key, value]) => `${key}=${jsonStringify(value)}`)
384
+ .join(' ');
385
+ }
@@ -2,7 +2,7 @@ import { getInitialTestAccountsData } from '@aztec/accounts/testing';
2
2
  import { createAztecNodeClient } from '@aztec/aztec.js/node';
3
3
  import { createLogger } from '@aztec/foundation/log';
4
4
  import { TokenContract } from '@aztec/noir-contracts.js/Token';
5
- import { TestWallet } from '@aztec/test-wallet/server';
5
+ import { EmbeddedWallet } from '@aztec/wallets/embedded';
6
6
 
7
7
  const logger = createLogger('example:token');
8
8
 
@@ -19,7 +19,7 @@ const TRANSFER_AMOUNT = 33n;
19
19
  async function main() {
20
20
  logger.info('Running token contract test on HTTP interface.');
21
21
 
22
- const wallet = await TestWallet.create(node);
22
+ const wallet = await EmbeddedWallet.create(node);
23
23
 
24
24
  // During local network setup we deploy a few accounts. Below we add them to our wallet.
25
25
  const [aliceInitialAccountData, bobInitialAccountData] = await getInitialTestAccountsData();
@@ -18,13 +18,15 @@ import type { LogFn } from '@aztec/foundation/log';
18
18
  import { DateProvider, TestDateProvider } from '@aztec/foundation/timer';
19
19
  import { getVKTreeRoot } from '@aztec/noir-protocol-circuits-types/vk-tree';
20
20
  import { protocolContractsHash } from '@aztec/protocol-contracts';
21
+ import type { ProvingJobBroker } from '@aztec/stdlib/interfaces/server';
21
22
  import type { PublicDataTreeLeaf } from '@aztec/stdlib/trees';
22
23
  import {
23
24
  type TelemetryClient,
24
25
  getConfigEnvVars as getTelemetryClientConfig,
25
26
  initTelemetryClient,
26
27
  } from '@aztec/telemetry-client';
27
- import { TestWallet, deployFundedSchnorrAccounts } from '@aztec/test-wallet/server';
28
+ import { EmbeddedWallet } from '@aztec/wallets/embedded';
29
+ import { deployFundedSchnorrAccounts } from '@aztec/wallets/testing';
28
30
  import { getGenesisValues } from '@aztec/world-state/testing';
29
31
 
30
32
  import { type Hex, createPublicClient, fallback, http as httpViemTransport } from 'viem';
@@ -104,12 +106,14 @@ export async function createLocalNetwork(config: Partial<LocalNetworkConfig> = {
104
106
  };
105
107
  const hdAccount = mnemonicToAccount(config.l1Mnemonic || DefaultMnemonic);
106
108
  if (
107
- aztecNodeConfig.publisherPrivateKeys == undefined ||
108
- !aztecNodeConfig.publisherPrivateKeys.length ||
109
- aztecNodeConfig.publisherPrivateKeys[0].getValue() === NULL_KEY
109
+ aztecNodeConfig.sequencerPublisherPrivateKeys == undefined ||
110
+ !aztecNodeConfig.sequencerPublisherPrivateKeys.length ||
111
+ aztecNodeConfig.sequencerPublisherPrivateKeys[0].getValue() === NULL_KEY
110
112
  ) {
111
113
  const privKey = hdAccount.getHdKey().privateKey;
112
- aztecNodeConfig.publisherPrivateKeys = [new SecretValue(`0x${Buffer.from(privKey!).toString('hex')}` as const)];
114
+ aztecNodeConfig.sequencerPublisherPrivateKeys = [
115
+ new SecretValue(`0x${Buffer.from(privKey!).toString('hex')}` as const),
116
+ ];
113
117
  }
114
118
  if (!aztecNodeConfig.validatorPrivateKeys?.getValue().length) {
115
119
  const privKey = hdAccount.getHdKey().privateKey;
@@ -190,16 +194,14 @@ export async function createLocalNetwork(config: Partial<LocalNetworkConfig> = {
190
194
  }
191
195
 
192
196
  if (initialAccounts.length) {
193
- const PXEConfig = { proverEnabled: aztecNodeConfig.realProofs };
194
- const wallet = await TestWallet.create(node, PXEConfig);
197
+ const wallet = await EmbeddedWallet.create(node, {
198
+ pxeConfig: { proverEnabled: aztecNodeConfig.realProofs },
199
+ ephemeral: true,
200
+ });
195
201
 
196
202
  userLog('Setting up funded test accounts...');
197
203
  const accountManagers = await deployFundedSchnorrAccounts(wallet, initialAccounts);
198
- const accountsWithSecrets = accountManagers.map((manager, i) => ({
199
- account: manager,
200
- secretKey: initialAccounts[i].secret,
201
- }));
202
- const accLogs = await createAccountLogs(accountsWithSecrets, wallet);
204
+ const accLogs = await createAccountLogs(accountManagers, wallet);
203
205
  userLog(accLogs.join(''));
204
206
 
205
207
  await setupBananaFPC(initialAccounts, wallet, userLog);
@@ -225,7 +227,12 @@ export async function createLocalNetwork(config: Partial<LocalNetworkConfig> = {
225
227
  */
226
228
  export async function createAztecNode(
227
229
  config: Partial<AztecNodeConfig> = {},
228
- deps: { telemetry?: TelemetryClient; blobClient?: BlobClientInterface; dateProvider?: DateProvider } = {},
230
+ deps: {
231
+ telemetry?: TelemetryClient;
232
+ blobClient?: BlobClientInterface;
233
+ dateProvider?: DateProvider;
234
+ proverBroker?: ProvingJobBroker;
235
+ } = {},
229
236
  options: { prefilledPublicData?: PublicDataTreeLeaf[] } = {},
230
237
  ) {
231
238
  // TODO(#12272): will clean this up. This is criminal.
@@ -235,6 +242,10 @@ export async function createAztecNode(
235
242
  ...config,
236
243
  l1Contracts: { ...l1Contracts, ...config.l1Contracts },
237
244
  };
238
- const node = await AztecNodeService.createAndSync(aztecNodeConfig, deps, options);
245
+ const node = await AztecNodeService.createAndSync(
246
+ aztecNodeConfig,
247
+ { ...deps, proverNodeDeps: { broker: deps.proverBroker } },
248
+ options,
249
+ );
239
250
  return node;
240
251
  }
@@ -1,7 +0,0 @@
1
- import type { NamespacedApiHandlers } from '@aztec/foundation/json-rpc/server';
2
- import type { LogFn } from '@aztec/foundation/log';
3
- import { type ProverNodeConfig } from '@aztec/prover-node';
4
- export declare function startProverNode(options: any, signalHandlers: (() => Promise<void>)[], services: NamespacedApiHandlers, userLog: LogFn): Promise<{
5
- config: ProverNodeConfig;
6
- }>;
7
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhcnRfcHJvdmVyX25vZGUuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jbGkvY21kcy9zdGFydF9wcm92ZXJfbm9kZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFLQSxPQUFPLEtBQUssRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBRS9FLE9BQU8sS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRW5ELE9BQU8sRUFDTCxLQUFLLGdCQUFnQixFQUl0QixNQUFNLG9CQUFvQixDQUFDO0FBUzVCLHdCQUFzQixlQUFlLENBQ25DLE9BQU8sRUFBRSxHQUFHLEVBQ1osY0FBYyxFQUFFLENBQUMsTUFBTSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUN2QyxRQUFRLEVBQUUscUJBQXFCLEVBQy9CLE9BQU8sRUFBRSxLQUFLLEdBQ2IsT0FBTyxDQUFDO0lBQUUsTUFBTSxFQUFFLGdCQUFnQixDQUFBO0NBQUUsQ0FBQyxDQStGdkMifQ==
@@ -1 +0,0 @@
1
- {"version":3,"file":"start_prover_node.d.ts","sourceRoot":"","sources":["../../../src/cli/cmds/start_prover_node.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAE/E,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAEnD,OAAO,EACL,KAAK,gBAAgB,EAItB,MAAM,oBAAoB,CAAC;AAS5B,wBAAsB,eAAe,CACnC,OAAO,EAAE,GAAG,EACZ,cAAc,EAAE,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,EACvC,QAAQ,EAAE,qBAAqB,EAC/B,OAAO,EAAE,KAAK,GACb,OAAO,CAAC;IAAE,MAAM,EAAE,gBAAgB,CAAA;CAAE,CAAC,CA+FvC"}
@@ -1,108 +0,0 @@
1
- import { getInitialTestAccountsData } from '@aztec/accounts/testing';
2
- import { Fr } from '@aztec/aztec.js/fields';
3
- import { getSponsoredFPCAddress } from '@aztec/cli/cli-utils';
4
- import { getL1Config } from '@aztec/cli/config';
5
- import { getPublicClient } from '@aztec/ethereum/client';
6
- import { Agent, makeUndiciFetch } from '@aztec/foundation/json-rpc/undici';
7
- import { ProvingJobConsumerSchema, createProvingJobBrokerClient } from '@aztec/prover-client/broker';
8
- import { createProverNode, getProverNodeConfigFromEnv, proverNodeConfigMappings } from '@aztec/prover-node';
9
- import { P2PApiSchema, ProverNodeApiSchema } from '@aztec/stdlib/interfaces/server';
10
- import { initTelemetryClient, makeTracedFetch, telemetryClientConfigMappings } from '@aztec/telemetry-client';
11
- import { getGenesisValues } from '@aztec/world-state/testing';
12
- import { extractRelevantOptions, preloadCrsDataForVerifying, setupUpdateMonitor } from '../util.js';
13
- import { getVersions } from '../versioning.js';
14
- import { startProverBroker } from './start_prover_broker.js';
15
- export async function startProverNode(options, signalHandlers, services, userLog) {
16
- if (options.node || options.sequencer || options.pxe || options.p2pBootstrap || options.txe) {
17
- userLog(`Starting a prover-node with --node, --sequencer, --pxe, --p2p-bootstrap, or --txe is not supported.`);
18
- process.exit(1);
19
- }
20
- let proverConfig = {
21
- ...getProverNodeConfigFromEnv(),
22
- ...extractRelevantOptions(options, proverNodeConfigMappings, 'proverNode')
23
- };
24
- if (!proverConfig.l1Contracts.registryAddress || proverConfig.l1Contracts.registryAddress.isZero()) {
25
- throw new Error('L1 registry address is required to start a Prover Node');
26
- }
27
- const followsCanonicalRollup = typeof proverConfig.rollupVersion !== 'number';
28
- const { addresses, config } = await getL1Config(proverConfig.l1Contracts.registryAddress, proverConfig.l1RpcUrls, proverConfig.l1ChainId, proverConfig.rollupVersion);
29
- process.env.ROLLUP_CONTRACT_ADDRESS ??= addresses.rollupAddress.toString();
30
- proverConfig.l1Contracts = addresses;
31
- proverConfig = {
32
- ...proverConfig,
33
- ...config
34
- };
35
- const testAccounts = proverConfig.testAccounts ? (await getInitialTestAccountsData()).map((a)=>a.address) : [];
36
- const sponsoredFPCAccounts = proverConfig.sponsoredFPC ? [
37
- await getSponsoredFPCAddress()
38
- ] : [];
39
- const initialFundedAccounts = testAccounts.concat(sponsoredFPCAccounts);
40
- userLog(`Initial funded accounts: ${initialFundedAccounts.map((a)=>a.toString()).join(', ')}`);
41
- const { genesisArchiveRoot, prefilledPublicData } = await getGenesisValues(initialFundedAccounts);
42
- userLog(`Genesis archive root: ${genesisArchiveRoot.toString()}`);
43
- if (!Fr.fromHexString(config.genesisArchiveTreeRoot).equals(genesisArchiveRoot)) {
44
- throw new Error(`The computed genesis archive tree root ${genesisArchiveRoot} does not match the expected genesis archive tree root ${config.genesisArchiveTreeRoot} for the rollup deployed at ${addresses.rollupAddress}`);
45
- }
46
- const telemetry = await initTelemetryClient(extractRelevantOptions(options, telemetryClientConfigMappings, 'tel'));
47
- let broker;
48
- if (proverConfig.proverBrokerUrl) {
49
- // at 1TPS we'd enqueue ~1k chonk verifier proofs and ~1k AVM proofs immediately
50
- // set a lower connection limit such that we don't overload the server
51
- // Keep retrying up to 30s
52
- const fetch = makeTracedFetch([
53
- 1,
54
- 2,
55
- 3,
56
- 3,
57
- 3,
58
- 3,
59
- 3,
60
- 3,
61
- 3,
62
- 3,
63
- 3
64
- ], false, makeUndiciFetch(new Agent({
65
- connections: 100
66
- })));
67
- broker = createProvingJobBrokerClient(proverConfig.proverBrokerUrl, getVersions(proverConfig), fetch);
68
- } else if (options.proverBroker) {
69
- ({ broker } = await startProverBroker(options, signalHandlers, services, userLog));
70
- } else {
71
- userLog(`--prover-broker-url or --prover-broker is required to start a Prover Node`);
72
- process.exit(1);
73
- }
74
- if (proverConfig.proverAgentCount === 0) {
75
- userLog(`Running prover node without local prover agent. Connect one or more prover agents to this node or pass --proverAgent.proverAgentCount`);
76
- }
77
- await preloadCrsDataForVerifying(proverConfig, userLog);
78
- const proverNode = await createProverNode(proverConfig, {
79
- telemetry,
80
- broker
81
- }, {
82
- prefilledPublicData
83
- });
84
- services.proverNode = [
85
- proverNode,
86
- ProverNodeApiSchema
87
- ];
88
- if (proverNode.getP2P()) {
89
- services.p2p = [
90
- proverNode.getP2P(),
91
- P2PApiSchema
92
- ];
93
- }
94
- if (!proverConfig.proverBrokerUrl) {
95
- services.provingJobSource = [
96
- proverNode.getProver().getProvingJobSource(),
97
- ProvingJobConsumerSchema
98
- ];
99
- }
100
- signalHandlers.push(proverNode.stop.bind(proverNode));
101
- await proverNode.start();
102
- if (proverConfig.autoUpdate !== 'disabled' && proverConfig.autoUpdateUrl) {
103
- await setupUpdateMonitor(proverConfig.autoUpdate, new URL(proverConfig.autoUpdateUrl), followsCanonicalRollup, getPublicClient(proverConfig), proverConfig.l1Contracts.registryAddress, signalHandlers);
104
- }
105
- return {
106
- config: proverConfig
107
- };
108
- }
@@ -1,124 +0,0 @@
1
- import { getInitialTestAccountsData } from '@aztec/accounts/testing';
2
- import { Fr } from '@aztec/aztec.js/fields';
3
- import { getSponsoredFPCAddress } from '@aztec/cli/cli-utils';
4
- import { getL1Config } from '@aztec/cli/config';
5
- import { getPublicClient } from '@aztec/ethereum/client';
6
- import type { NamespacedApiHandlers } from '@aztec/foundation/json-rpc/server';
7
- import { Agent, makeUndiciFetch } from '@aztec/foundation/json-rpc/undici';
8
- import type { LogFn } from '@aztec/foundation/log';
9
- import { ProvingJobConsumerSchema, createProvingJobBrokerClient } from '@aztec/prover-client/broker';
10
- import {
11
- type ProverNodeConfig,
12
- createProverNode,
13
- getProverNodeConfigFromEnv,
14
- proverNodeConfigMappings,
15
- } from '@aztec/prover-node';
16
- import { P2PApiSchema, ProverNodeApiSchema, type ProvingJobBroker } from '@aztec/stdlib/interfaces/server';
17
- import { initTelemetryClient, makeTracedFetch, telemetryClientConfigMappings } from '@aztec/telemetry-client';
18
- import { getGenesisValues } from '@aztec/world-state/testing';
19
-
20
- import { extractRelevantOptions, preloadCrsDataForVerifying, setupUpdateMonitor } from '../util.js';
21
- import { getVersions } from '../versioning.js';
22
- import { startProverBroker } from './start_prover_broker.js';
23
-
24
- export async function startProverNode(
25
- options: any,
26
- signalHandlers: (() => Promise<void>)[],
27
- services: NamespacedApiHandlers,
28
- userLog: LogFn,
29
- ): Promise<{ config: ProverNodeConfig }> {
30
- if (options.node || options.sequencer || options.pxe || options.p2pBootstrap || options.txe) {
31
- userLog(`Starting a prover-node with --node, --sequencer, --pxe, --p2p-bootstrap, or --txe is not supported.`);
32
- process.exit(1);
33
- }
34
-
35
- let proverConfig = {
36
- ...getProverNodeConfigFromEnv(), // get default config from env
37
- ...extractRelevantOptions<ProverNodeConfig>(options, proverNodeConfigMappings, 'proverNode'), // override with command line options
38
- };
39
-
40
- if (!proverConfig.l1Contracts.registryAddress || proverConfig.l1Contracts.registryAddress.isZero()) {
41
- throw new Error('L1 registry address is required to start a Prover Node');
42
- }
43
-
44
- const followsCanonicalRollup = typeof proverConfig.rollupVersion !== 'number';
45
- const { addresses, config } = await getL1Config(
46
- proverConfig.l1Contracts.registryAddress,
47
- proverConfig.l1RpcUrls,
48
- proverConfig.l1ChainId,
49
- proverConfig.rollupVersion,
50
- );
51
- process.env.ROLLUP_CONTRACT_ADDRESS ??= addresses.rollupAddress.toString();
52
- proverConfig.l1Contracts = addresses;
53
- proverConfig = { ...proverConfig, ...config };
54
-
55
- const testAccounts = proverConfig.testAccounts ? (await getInitialTestAccountsData()).map(a => a.address) : [];
56
- const sponsoredFPCAccounts = proverConfig.sponsoredFPC ? [await getSponsoredFPCAddress()] : [];
57
- const initialFundedAccounts = testAccounts.concat(sponsoredFPCAccounts);
58
-
59
- userLog(`Initial funded accounts: ${initialFundedAccounts.map(a => a.toString()).join(', ')}`);
60
- const { genesisArchiveRoot, prefilledPublicData } = await getGenesisValues(initialFundedAccounts);
61
-
62
- userLog(`Genesis archive root: ${genesisArchiveRoot.toString()}`);
63
-
64
- if (!Fr.fromHexString(config.genesisArchiveTreeRoot).equals(genesisArchiveRoot)) {
65
- throw new Error(
66
- `The computed genesis archive tree root ${genesisArchiveRoot} does not match the expected genesis archive tree root ${config.genesisArchiveTreeRoot} for the rollup deployed at ${addresses.rollupAddress}`,
67
- );
68
- }
69
-
70
- const telemetry = await initTelemetryClient(extractRelevantOptions(options, telemetryClientConfigMappings, 'tel'));
71
-
72
- let broker: ProvingJobBroker;
73
- if (proverConfig.proverBrokerUrl) {
74
- // at 1TPS we'd enqueue ~1k chonk verifier proofs and ~1k AVM proofs immediately
75
- // set a lower connection limit such that we don't overload the server
76
- // Keep retrying up to 30s
77
- const fetch = makeTracedFetch(
78
- [1, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3],
79
- false,
80
- makeUndiciFetch(new Agent({ connections: 100 })),
81
- );
82
- broker = createProvingJobBrokerClient(proverConfig.proverBrokerUrl, getVersions(proverConfig), fetch);
83
- } else if (options.proverBroker) {
84
- ({ broker } = await startProverBroker(options, signalHandlers, services, userLog));
85
- } else {
86
- userLog(`--prover-broker-url or --prover-broker is required to start a Prover Node`);
87
- process.exit(1);
88
- }
89
-
90
- if (proverConfig.proverAgentCount === 0) {
91
- userLog(
92
- `Running prover node without local prover agent. Connect one or more prover agents to this node or pass --proverAgent.proverAgentCount`,
93
- );
94
- }
95
-
96
- await preloadCrsDataForVerifying(proverConfig, userLog);
97
-
98
- const proverNode = await createProverNode(proverConfig, { telemetry, broker }, { prefilledPublicData });
99
- services.proverNode = [proverNode, ProverNodeApiSchema];
100
-
101
- if (proverNode.getP2P()) {
102
- services.p2p = [proverNode.getP2P(), P2PApiSchema];
103
- }
104
-
105
- if (!proverConfig.proverBrokerUrl) {
106
- services.provingJobSource = [proverNode.getProver().getProvingJobSource(), ProvingJobConsumerSchema];
107
- }
108
-
109
- signalHandlers.push(proverNode.stop.bind(proverNode));
110
-
111
- await proverNode.start();
112
-
113
- if (proverConfig.autoUpdate !== 'disabled' && proverConfig.autoUpdateUrl) {
114
- await setupUpdateMonitor(
115
- proverConfig.autoUpdate,
116
- new URL(proverConfig.autoUpdateUrl),
117
- followsCanonicalRollup,
118
- getPublicClient(proverConfig),
119
- proverConfig.l1Contracts.registryAddress,
120
- signalHandlers,
121
- );
122
- }
123
- return { config: proverConfig };
124
- }