@aztec/aztec 0.0.0-test.0

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 (122) hide show
  1. package/README.md +57 -0
  2. package/dest/bin/index.d.ts +3 -0
  3. package/dest/bin/index.d.ts.map +1 -0
  4. package/dest/bin/index.js +46 -0
  5. package/dest/cli/aztec_start_action.d.ts +3 -0
  6. package/dest/cli/aztec_start_action.d.ts.map +1 -0
  7. package/dest/cli/aztec_start_action.js +108 -0
  8. package/dest/cli/aztec_start_options.d.ts +15 -0
  9. package/dest/cli/aztec_start_options.d.ts.map +1 -0
  10. package/dest/cli/aztec_start_options.js +348 -0
  11. package/dest/cli/chain_l2_config.d.ts +19 -0
  12. package/dest/cli/chain_l2_config.d.ts.map +1 -0
  13. package/dest/cli/chain_l2_config.js +56 -0
  14. package/dest/cli/cli.d.ts +9 -0
  15. package/dest/cli/cli.d.ts.map +1 -0
  16. package/dest/cli/cli.js +33 -0
  17. package/dest/cli/cmds/start_archiver.d.ts +9 -0
  18. package/dest/cli/cmds/start_archiver.d.ts.map +1 -0
  19. package/dest/cli/cmds/start_archiver.js +42 -0
  20. package/dest/cli/cmds/start_blob_sink.d.ts +3 -0
  21. package/dest/cli/cmds/start_blob_sink.d.ts.map +1 -0
  22. package/dest/cli/cmds/start_blob_sink.js +17 -0
  23. package/dest/cli/cmds/start_bot.d.ts +11 -0
  24. package/dest/cli/cmds/start_bot.d.ts.map +1 -0
  25. package/dest/cli/cmds/start_bot.js +31 -0
  26. package/dest/cli/cmds/start_faucet.d.ts +4 -0
  27. package/dest/cli/cmds/start_faucet.d.ts.map +1 -0
  28. package/dest/cli/cmds/start_faucet.js +20 -0
  29. package/dest/cli/cmds/start_node.d.ts +7 -0
  30. package/dest/cli/cmds/start_node.d.ts.map +1 -0
  31. package/dest/cli/cmds/start_node.js +131 -0
  32. package/dest/cli/cmds/start_p2p_bootstrap.d.ts +6 -0
  33. package/dest/cli/cmds/start_p2p_bootstrap.d.ts.map +1 -0
  34. package/dest/cli/cmds/start_p2p_bootstrap.js +26 -0
  35. package/dest/cli/cmds/start_prover_agent.d.ts +4 -0
  36. package/dest/cli/cmds/start_prover_agent.d.ts.map +1 -0
  37. package/dest/cli/cmds/start_prover_agent.js +41 -0
  38. package/dest/cli/cmds/start_prover_broker.d.ts +9 -0
  39. package/dest/cli/cmds/start_prover_broker.d.ts.map +1 -0
  40. package/dest/cli/cmds/start_prover_broker.js +31 -0
  41. package/dest/cli/cmds/start_prover_node.d.ts +7 -0
  42. package/dest/cli/cmds/start_prover_node.d.ts.map +1 -0
  43. package/dest/cli/cmds/start_prover_node.js +110 -0
  44. package/dest/cli/cmds/start_pxe.d.ts +16 -0
  45. package/dest/cli/cmds/start_pxe.d.ts.map +1 -0
  46. package/dest/cli/cmds/start_pxe.js +95 -0
  47. package/dest/cli/cmds/start_txe.d.ts +3 -0
  48. package/dest/cli/cmds/start_txe.d.ts.map +1 -0
  49. package/dest/cli/cmds/start_txe.js +11 -0
  50. package/dest/cli/get_l1_config.d.ts +7 -0
  51. package/dest/cli/get_l1_config.d.ts.map +1 -0
  52. package/dest/cli/get_l1_config.js +13 -0
  53. package/dest/cli/index.d.ts +2 -0
  54. package/dest/cli/index.d.ts.map +1 -0
  55. package/dest/cli/index.js +1 -0
  56. package/dest/cli/util.d.ts +46 -0
  57. package/dest/cli/util.d.ts.map +1 -0
  58. package/dest/cli/util.js +154 -0
  59. package/dest/cli/versioning.d.ts +4 -0
  60. package/dest/cli/versioning.d.ts.map +1 -0
  61. package/dest/cli/versioning.js +9 -0
  62. package/dest/examples/token.d.ts +2 -0
  63. package/dest/examples/token.d.ts.map +1 -0
  64. package/dest/examples/token.js +46 -0
  65. package/dest/examples/util.d.ts +20 -0
  66. package/dest/examples/util.d.ts.map +1 -0
  67. package/dest/examples/util.js +31 -0
  68. package/dest/index.d.ts +2 -0
  69. package/dest/index.d.ts.map +1 -0
  70. package/dest/index.js +1 -0
  71. package/dest/mnemonic.d.ts +2 -0
  72. package/dest/mnemonic.d.ts.map +1 -0
  73. package/dest/mnemonic.js +1 -0
  74. package/dest/sandbox/banana_fpc.d.ts +11 -0
  75. package/dest/sandbox/banana_fpc.d.ts.map +1 -0
  76. package/dest/sandbox/banana_fpc.js +79 -0
  77. package/dest/sandbox/index.d.ts +5 -0
  78. package/dest/sandbox/index.d.ts.map +1 -0
  79. package/dest/sandbox/index.js +4 -0
  80. package/dest/sandbox/sandbox.d.ts +76 -0
  81. package/dest/sandbox/sandbox.d.ts.map +1 -0
  82. package/dest/sandbox/sandbox.js +181 -0
  83. package/dest/sandbox/sponsored_fee_payment_method.d.ts +23 -0
  84. package/dest/sandbox/sponsored_fee_payment_method.d.ts.map +1 -0
  85. package/dest/sandbox/sponsored_fee_payment_method.js +36 -0
  86. package/dest/sandbox/sponsored_fpc.d.ts +6 -0
  87. package/dest/sandbox/sponsored_fpc.d.ts.map +1 -0
  88. package/dest/sandbox/sponsored_fpc.js +26 -0
  89. package/dest/splash.d.ts +3 -0
  90. package/dest/splash.d.ts.map +1 -0
  91. package/dest/splash.js +2 -0
  92. package/package.json +118 -0
  93. package/src/bin/index.ts +54 -0
  94. package/src/cli/aztec_start_action.ts +114 -0
  95. package/src/cli/aztec_start_options.ts +371 -0
  96. package/src/cli/chain_l2_config.ts +74 -0
  97. package/src/cli/cli.ts +48 -0
  98. package/src/cli/cmds/start_archiver.ts +55 -0
  99. package/src/cli/cmds/start_blob_sink.ts +31 -0
  100. package/src/cli/cmds/start_bot.ts +49 -0
  101. package/src/cli/cmds/start_faucet.ts +34 -0
  102. package/src/cli/cmds/start_node.ts +151 -0
  103. package/src/cli/cmds/start_p2p_bootstrap.ts +29 -0
  104. package/src/cli/cmds/start_prover_agent.ts +68 -0
  105. package/src/cli/cmds/start_prover_broker.ts +46 -0
  106. package/src/cli/cmds/start_prover_node.ts +121 -0
  107. package/src/cli/cmds/start_pxe.ts +129 -0
  108. package/src/cli/cmds/start_txe.ts +15 -0
  109. package/src/cli/get_l1_config.ts +18 -0
  110. package/src/cli/index.ts +1 -0
  111. package/src/cli/util.ts +216 -0
  112. package/src/cli/versioning.ts +13 -0
  113. package/src/examples/token.ts +65 -0
  114. package/src/examples/util.ts +45 -0
  115. package/src/index.ts +7 -0
  116. package/src/mnemonic.ts +1 -0
  117. package/src/sandbox/banana_fpc.ts +83 -0
  118. package/src/sandbox/index.ts +5 -0
  119. package/src/sandbox/sandbox.ts +229 -0
  120. package/src/sandbox/sponsored_fee_payment_method.ts +46 -0
  121. package/src/sandbox/sponsored_fpc.ts +38 -0
  122. package/src/splash.ts +10 -0
@@ -0,0 +1,151 @@
1
+ import { getInitialTestAccounts } from '@aztec/accounts/testing';
2
+ import { type AztecNodeConfig, aztecNodeConfigMappings, getConfigEnvVars } from '@aztec/aztec-node';
3
+ import { NULL_KEY } from '@aztec/ethereum';
4
+ import type { NamespacedApiHandlers } from '@aztec/foundation/json-rpc/server';
5
+ import type { LogFn } from '@aztec/foundation/log';
6
+ import { AztecNodeApiSchema, type PXE } from '@aztec/stdlib/interfaces/client';
7
+ import { P2PApiSchema } from '@aztec/stdlib/interfaces/server';
8
+ import {
9
+ type TelemetryClientConfig,
10
+ initTelemetryClient,
11
+ telemetryClientConfigMappings,
12
+ } from '@aztec/telemetry-client';
13
+ import { getGenesisValues } from '@aztec/world-state/testing';
14
+
15
+ import { mnemonicToAccount, privateKeyToAccount } from 'viem/accounts';
16
+
17
+ import { createAztecNode, deployContractsToL1 } from '../../sandbox/index.js';
18
+ import { getL1Config } from '../get_l1_config.js';
19
+ import { extractNamespacedOptions, extractRelevantOptions } from '../util.js';
20
+
21
+ export async function startNode(
22
+ options: any,
23
+ signalHandlers: (() => Promise<void>)[],
24
+ services: NamespacedApiHandlers,
25
+ userLog: LogFn,
26
+ ): Promise<{ config: AztecNodeConfig }> {
27
+ // options specifically namespaced with --node.<option>
28
+ const nodeSpecificOptions = extractNamespacedOptions(options, 'node');
29
+ // All options that are relevant to the Aztec Node
30
+ let nodeConfig: AztecNodeConfig = {
31
+ ...getConfigEnvVars(),
32
+ ...extractRelevantOptions(options, aztecNodeConfigMappings, 'node'),
33
+ };
34
+
35
+ if (options.proverNode) {
36
+ userLog(`Running a Prover Node within a Node is not yet supported`);
37
+ process.exit(1);
38
+ }
39
+
40
+ const initialFundedAccounts = nodeConfig.testAccounts ? await getInitialTestAccounts() : [];
41
+ const { genesisBlockHash, genesisArchiveRoot, prefilledPublicData } = await getGenesisValues(
42
+ initialFundedAccounts.map(a => a.address),
43
+ );
44
+
45
+ // Deploy contracts if needed
46
+ if (nodeSpecificOptions.deployAztecContracts || nodeSpecificOptions.deployAztecContractsSalt) {
47
+ let account;
48
+ if (nodeSpecificOptions.publisherPrivateKey) {
49
+ account = privateKeyToAccount(nodeSpecificOptions.publisherPrivateKey);
50
+ } else if (options.l1Mnemonic) {
51
+ account = mnemonicToAccount(options.l1Mnemonic);
52
+ } else {
53
+ throw new Error('--node.publisherPrivateKey or --l1-mnemonic is required to deploy L1 contracts');
54
+ }
55
+ // REFACTOR: We should not be calling a method from sandbox on the prod start flow
56
+ await deployContractsToL1(nodeConfig, account!, undefined, {
57
+ assumeProvenThroughBlockNumber: nodeSpecificOptions.assumeProvenThroughBlockNumber,
58
+ salt: nodeSpecificOptions.deployAztecContractsSalt,
59
+ genesisBlockHash,
60
+ genesisArchiveRoot,
61
+ });
62
+ }
63
+ // If not deploying, validate that any addresses and config provided are correct.
64
+ else {
65
+ if (!nodeConfig.l1Contracts.registryAddress || nodeConfig.l1Contracts.registryAddress.isZero()) {
66
+ throw new Error('L1 registry address is required to start Aztec Node without --deploy-aztec-contracts option');
67
+ }
68
+ const { addresses, config } = await getL1Config(
69
+ nodeConfig.l1Contracts.registryAddress,
70
+ nodeConfig.l1RpcUrls,
71
+ nodeConfig.l1ChainId,
72
+ );
73
+
74
+ // TODO(#12272): will clean this up.
75
+ nodeConfig = {
76
+ ...nodeConfig,
77
+ l1Contracts: {
78
+ ...addresses,
79
+ slashFactoryAddress: nodeConfig.l1Contracts.slashFactoryAddress,
80
+ },
81
+ ...config,
82
+ };
83
+ }
84
+
85
+ // if no publisher private key, then use l1Mnemonic
86
+ if (!options.archiver) {
87
+ // expect archiver url in node config
88
+ const archiverUrl = nodeConfig.archiverUrl;
89
+ if (!archiverUrl) {
90
+ userLog('Archiver Service URL is required to start Aztec Node without --archiver option');
91
+ throw new Error('Archiver Service URL is required to start Aztec Node without --archiver option');
92
+ }
93
+ nodeConfig.archiverUrl = archiverUrl;
94
+ }
95
+
96
+ if (!options.sequencer) {
97
+ nodeConfig.disableValidator = true;
98
+ } else {
99
+ const sequencerConfig = extractNamespacedOptions(options, 'sequencer');
100
+ let account;
101
+ if (!sequencerConfig.publisherPrivateKey || sequencerConfig.publisherPrivateKey === NULL_KEY) {
102
+ if (!options.l1Mnemonic) {
103
+ userLog(
104
+ '--sequencer.publisherPrivateKey or --l1-mnemonic is required to start Aztec Node with --sequencer option',
105
+ );
106
+ throw new Error('Private key or Mnemonic is required to start Aztec Node with --sequencer option');
107
+ } else {
108
+ account = mnemonicToAccount(options.l1Mnemonic);
109
+ const privKey = account.getHdKey().privateKey;
110
+ nodeConfig.publisherPrivateKey = `0x${Buffer.from(privKey!).toString('hex')}`;
111
+ }
112
+ } else {
113
+ nodeConfig.publisherPrivateKey = sequencerConfig.publisherPrivateKey;
114
+ }
115
+ }
116
+
117
+ if (nodeConfig.p2pEnabled) {
118
+ // ensure bootstrapNodes is an array
119
+ if (nodeConfig.bootstrapNodes && typeof nodeConfig.bootstrapNodes === 'string') {
120
+ nodeConfig.bootstrapNodes = (nodeConfig.bootstrapNodes as string).split(',');
121
+ }
122
+ }
123
+
124
+ const telemetryConfig = extractRelevantOptions<TelemetryClientConfig>(options, telemetryClientConfigMappings, 'tel');
125
+ const telemetry = initTelemetryClient(telemetryConfig);
126
+
127
+ // Create and start Aztec Node
128
+ const node = await createAztecNode(nodeConfig, { telemetry }, { prefilledPublicData });
129
+
130
+ // Add node and p2p to services list
131
+ services.node = [node, AztecNodeApiSchema];
132
+ services.p2p = [node.getP2P(), P2PApiSchema];
133
+
134
+ // Add node stop function to signal handlers
135
+ signalHandlers.push(node.stop.bind(node));
136
+
137
+ // Add a PXE client that connects to this node if requested
138
+ let pxe: PXE | undefined;
139
+ if (options.pxe) {
140
+ const { addPXE } = await import('./start_pxe.js');
141
+ ({ pxe } = await addPXE(options, signalHandlers, services, userLog, { node }));
142
+ }
143
+
144
+ // Add a txs bot if requested
145
+ if (options.bot) {
146
+ const { addBot } = await import('./start_bot.js');
147
+ await addBot(options, signalHandlers, services, { pxe, node, telemetry });
148
+ }
149
+
150
+ return { config: nodeConfig };
151
+ }
@@ -0,0 +1,29 @@
1
+ import { jsonStringify } from '@aztec/foundation/json-rpc';
2
+ import type { NamespacedApiHandlers } from '@aztec/foundation/json-rpc/server';
3
+ import { type LogFn, createLogger } from '@aztec/foundation/log';
4
+ import { createStore } from '@aztec/kv-store/lmdb-v2';
5
+ import { type BootnodeConfig, BootstrapNode, bootnodeConfigMappings } from '@aztec/p2p';
6
+ import { emptyChainConfig } from '@aztec/stdlib/config';
7
+ import { P2PBootstrapApiSchema } from '@aztec/stdlib/interfaces/server';
8
+ import { getConfigEnvVars as getTelemetryClientConfig, initTelemetryClient } from '@aztec/telemetry-client';
9
+
10
+ import { extractRelevantOptions } from '../util.js';
11
+
12
+ export async function startP2PBootstrap(
13
+ options: any,
14
+ signalHandlers: (() => Promise<void>)[],
15
+ services: NamespacedApiHandlers,
16
+ userLog: LogFn,
17
+ ) {
18
+ // Start a P2P bootstrap node.
19
+ const config = extractRelevantOptions<BootnodeConfig>(options, bootnodeConfigMappings, 'p2p');
20
+ userLog(`Starting P2P bootstrap node with config: ${jsonStringify(config)}`);
21
+ const telemetryClient = initTelemetryClient(getTelemetryClientConfig());
22
+ const store = await createStore('p2p-bootstrap', 1, config, createLogger('p2p:bootstrap:store'));
23
+ const node = new BootstrapNode(store, telemetryClient);
24
+ await node.start(config);
25
+ signalHandlers.push(() => node.stop());
26
+ services.bootstrap = [node, P2PBootstrapApiSchema];
27
+ userLog(`P2P bootstrap node started on ${config.udpListenAddress}`);
28
+ return { config: emptyChainConfig };
29
+ }
@@ -0,0 +1,68 @@
1
+ import { times } from '@aztec/foundation/collection';
2
+ import type { NamespacedApiHandlers } from '@aztec/foundation/json-rpc/server';
3
+ import { Agent, makeUndiciFetch } from '@aztec/foundation/json-rpc/undici';
4
+ import type { LogFn } from '@aztec/foundation/log';
5
+ import { buildServerCircuitProver } from '@aztec/prover-client';
6
+ import {
7
+ InlineProofStore,
8
+ type ProverAgentConfig,
9
+ ProvingAgent,
10
+ createProvingJobBrokerClient,
11
+ proverAgentConfigMappings,
12
+ } from '@aztec/prover-client/broker';
13
+ import { getProverNodeAgentConfigFromEnv } from '@aztec/prover-node';
14
+ import { initTelemetryClient, makeTracedFetch, telemetryClientConfigMappings } from '@aztec/telemetry-client';
15
+
16
+ import { extractRelevantOptions } from '../util.js';
17
+ import { getVersions } from '../versioning.js';
18
+
19
+ export async function startProverAgent(
20
+ options: any,
21
+ signalHandlers: (() => Promise<void>)[],
22
+ services: NamespacedApiHandlers,
23
+ userLog: LogFn,
24
+ ) {
25
+ if (options.node || options.sequencer || options.pxe || options.p2pBootstrap || options.txe) {
26
+ userLog(`Starting a prover agent with --node, --sequencer, --pxe, --p2p-bootstrap, or --txe is not supported.`);
27
+ process.exit(1);
28
+ }
29
+
30
+ const config = {
31
+ ...getProverNodeAgentConfigFromEnv(), // get default config from env
32
+ ...extractRelevantOptions<ProverAgentConfig>(options, proverAgentConfigMappings, 'proverAgent'), // override with command line options
33
+ };
34
+
35
+ if (config.realProofs && (!config.bbBinaryPath || !config.acvmBinaryPath)) {
36
+ process.exit(1);
37
+ }
38
+
39
+ if (!config.proverBrokerUrl) {
40
+ process.exit(1);
41
+ }
42
+
43
+ const fetch = makeTracedFetch([1, 2, 3], false, makeUndiciFetch(new Agent({ connections: 10 })));
44
+ const broker = createProvingJobBrokerClient(config.proverBrokerUrl, getVersions(), fetch);
45
+
46
+ const telemetry = initTelemetryClient(extractRelevantOptions(options, telemetryClientConfigMappings, 'tel'));
47
+ const prover = await buildServerCircuitProver(config, telemetry);
48
+ const proofStore = new InlineProofStore();
49
+ const agents = times(
50
+ config.proverAgentCount,
51
+ () =>
52
+ new ProvingAgent(
53
+ broker,
54
+ proofStore,
55
+ prover,
56
+ config.proverAgentProofTypes,
57
+ config.proverAgentPollIntervalMs,
58
+ telemetry,
59
+ ),
60
+ );
61
+
62
+ await Promise.all(agents.map(agent => agent.start()));
63
+
64
+ signalHandlers.push(async () => {
65
+ await Promise.all(agents.map(agent => agent.stop()));
66
+ await telemetry.stop();
67
+ });
68
+ }
@@ -0,0 +1,46 @@
1
+ import type { NamespacedApiHandlers } from '@aztec/foundation/json-rpc/server';
2
+ import type { LogFn } from '@aztec/foundation/log';
3
+ import {
4
+ type ProverBrokerConfig,
5
+ ProvingJobBrokerSchema,
6
+ createAndStartProvingBroker,
7
+ proverBrokerConfigMappings,
8
+ } from '@aztec/prover-client/broker';
9
+ import { getProverNodeBrokerConfigFromEnv } from '@aztec/prover-node';
10
+ import type { ProvingJobBroker } from '@aztec/stdlib/interfaces/server';
11
+ import { getConfigEnvVars as getTelemetryClientConfig, initTelemetryClient } from '@aztec/telemetry-client';
12
+
13
+ import { getL1Config } from '../get_l1_config.js';
14
+ import { extractRelevantOptions } from '../util.js';
15
+
16
+ export async function startProverBroker(
17
+ options: any,
18
+ signalHandlers: (() => Promise<void>)[],
19
+ services: NamespacedApiHandlers,
20
+ userLog: LogFn,
21
+ ): Promise<{ broker: ProvingJobBroker; config: ProverBrokerConfig }> {
22
+ if (options.node || options.sequencer || options.pxe || options.p2pBootstrap || options.txe) {
23
+ userLog(`Starting a prover broker with --node, --sequencer, --pxe, --p2p-bootstrap, or --txe is not supported.`);
24
+ process.exit(1);
25
+ }
26
+
27
+ const config: ProverBrokerConfig = {
28
+ ...getProverNodeBrokerConfigFromEnv(), // get default config from env
29
+ ...extractRelevantOptions<ProverBrokerConfig>(options, proverBrokerConfigMappings, 'proverBroker'), // override with command line options
30
+ };
31
+
32
+ if (!config.l1Contracts.registryAddress || config.l1Contracts.registryAddress.isZero()) {
33
+ throw new Error('L1 registry address is required to start Aztec Node without --deploy-aztec-contracts option');
34
+ }
35
+
36
+ const { addresses } = await getL1Config(config.l1Contracts.registryAddress, config.l1RpcUrls, config.l1ChainId);
37
+
38
+ config.l1Contracts = addresses;
39
+
40
+ const client = initTelemetryClient(getTelemetryClientConfig());
41
+ const broker = await createAndStartProvingBroker(config, client);
42
+ services.proverBroker = [broker, ProvingJobBrokerSchema];
43
+ signalHandlers.push(() => broker.stop());
44
+
45
+ return { broker, config };
46
+ }
@@ -0,0 +1,121 @@
1
+ import { getInitialTestAccounts } from '@aztec/accounts/testing';
2
+ import { NULL_KEY } from '@aztec/ethereum';
3
+ import type { NamespacedApiHandlers } from '@aztec/foundation/json-rpc/server';
4
+ import { Agent, makeUndiciFetch } from '@aztec/foundation/json-rpc/undici';
5
+ import type { LogFn } from '@aztec/foundation/log';
6
+ import { ProvingJobConsumerSchema, createProvingJobBrokerClient } from '@aztec/prover-client/broker';
7
+ import {
8
+ type ProverNodeConfig,
9
+ createProverNode,
10
+ getProverNodeConfigFromEnv,
11
+ proverNodeConfigMappings,
12
+ } from '@aztec/prover-node';
13
+ import { createAztecNodeClient } from '@aztec/stdlib/interfaces/client';
14
+ import { P2PApiSchema, ProverNodeApiSchema, type ProvingJobBroker } from '@aztec/stdlib/interfaces/server';
15
+ import { initTelemetryClient, makeTracedFetch, telemetryClientConfigMappings } from '@aztec/telemetry-client';
16
+ import { getGenesisValues } from '@aztec/world-state/testing';
17
+
18
+ import { mnemonicToAccount } from 'viem/accounts';
19
+
20
+ import { getL1Config } from '../get_l1_config.js';
21
+ import { extractRelevantOptions } from '../util.js';
22
+ import { getVersions } from '../versioning.js';
23
+ import { startProverBroker } from './start_prover_broker.js';
24
+
25
+ export async function startProverNode(
26
+ options: any,
27
+ signalHandlers: (() => Promise<void>)[],
28
+ services: NamespacedApiHandlers,
29
+ userLog: LogFn,
30
+ ): Promise<{ config: ProverNodeConfig }> {
31
+ if (options.node || options.sequencer || options.pxe || options.p2pBootstrap || options.txe) {
32
+ userLog(`Starting a prover-node with --node, --sequencer, --pxe, --p2p-bootstrap, or --txe is not supported.`);
33
+ process.exit(1);
34
+ }
35
+
36
+ let proverConfig = {
37
+ ...getProverNodeConfigFromEnv(), // get default config from env
38
+ ...extractRelevantOptions<ProverNodeConfig>(options, proverNodeConfigMappings, 'proverNode'), // override with command line options
39
+ };
40
+
41
+ if (!options.archiver && !proverConfig.archiverUrl) {
42
+ userLog('--archiver.archiverUrl is required to start a Prover Node without --archiver option');
43
+ process.exit(1);
44
+ }
45
+
46
+ if (!proverConfig.publisherPrivateKey || proverConfig.publisherPrivateKey === NULL_KEY) {
47
+ if (!options.l1Mnemonic) {
48
+ userLog(`--l1-mnemonic is required to start a Prover Node without --node.publisherPrivateKey`);
49
+ process.exit(1);
50
+ }
51
+ const hdAccount = mnemonicToAccount(options.l1Mnemonic);
52
+ const privKey = hdAccount.getHdKey().privateKey;
53
+ proverConfig.publisherPrivateKey = `0x${Buffer.from(privKey!).toString('hex')}`;
54
+ }
55
+
56
+ // TODO(palla/prover-node) L1 contract addresses should not silently default to zero,
57
+ // they should be undefined if not set and fail loudly.
58
+ // Load l1 contract addresses from aztec node if not set.
59
+ const isRollupAddressSet =
60
+ proverConfig.l1Contracts?.rollupAddress && !proverConfig.l1Contracts.rollupAddress.isZero();
61
+ const nodeUrl = proverConfig.nodeUrl ?? proverConfig.proverCoordinationNodeUrl;
62
+ if (nodeUrl && !isRollupAddressSet) {
63
+ userLog(`Loading L1 contract addresses from aztec node at ${nodeUrl}`);
64
+ proverConfig.l1Contracts = await createAztecNodeClient(nodeUrl).getL1ContractAddresses();
65
+ }
66
+
67
+ // If we create an archiver here, validate the L1 config
68
+ if (options.archiver) {
69
+ if (!proverConfig.l1Contracts.registryAddress || proverConfig.l1Contracts.registryAddress.isZero()) {
70
+ throw new Error('L1 registry address is required to start a Prover Node with --archiver option');
71
+ }
72
+ const { addresses, config } = await getL1Config(
73
+ proverConfig.l1Contracts.registryAddress,
74
+ proverConfig.l1RpcUrls,
75
+ proverConfig.l1ChainId,
76
+ );
77
+ proverConfig.l1Contracts = addresses;
78
+ proverConfig = { ...proverConfig, ...config };
79
+ }
80
+
81
+ const telemetry = initTelemetryClient(extractRelevantOptions(options, telemetryClientConfigMappings, 'tel'));
82
+
83
+ let broker: ProvingJobBroker;
84
+ if (proverConfig.proverBrokerUrl) {
85
+ // at 1TPS we'd enqueue ~1k tube proofs and ~1k AVM proofs immediately
86
+ // set a lower connectio limit such that we don't overload the server
87
+ const fetch = makeTracedFetch([1, 2, 3], false, makeUndiciFetch(new Agent({ connections: 100 })));
88
+ broker = createProvingJobBrokerClient(proverConfig.proverBrokerUrl, getVersions(proverConfig), fetch);
89
+ } else if (options.proverBroker) {
90
+ ({ broker } = await startProverBroker(options, signalHandlers, services, userLog));
91
+ } else {
92
+ userLog(`--prover-broker-url or --prover-broker is required to start a Prover Node`);
93
+ process.exit(1);
94
+ }
95
+
96
+ if (proverConfig.proverAgentCount === 0) {
97
+ userLog(
98
+ `Running prover node without local prover agent. Connect one or more prover agents to this node or pass --proverAgent.proverAgentCount`,
99
+ );
100
+ }
101
+
102
+ const initialFundedAccounts = proverConfig.testAccounts ? await getInitialTestAccounts() : [];
103
+ const { prefilledPublicData } = await getGenesisValues(initialFundedAccounts.map(a => a.address));
104
+
105
+ const proverNode = await createProverNode(proverConfig, { telemetry, broker }, { prefilledPublicData });
106
+ services.proverNode = [proverNode, ProverNodeApiSchema];
107
+
108
+ const p2p = proverNode.getP2P();
109
+ if (p2p) {
110
+ services.p2p = [proverNode.getP2P(), P2PApiSchema];
111
+ }
112
+
113
+ if (!proverConfig.proverBrokerUrl) {
114
+ services.provingJobSource = [proverNode.getProver().getProvingJobSource(), ProvingJobConsumerSchema];
115
+ }
116
+
117
+ signalHandlers.push(proverNode.stop.bind(proverNode));
118
+
119
+ proverNode.start();
120
+ return { config: proverConfig };
121
+ }
@@ -0,0 +1,129 @@
1
+ import {
2
+ AztecAddress,
3
+ type ContractArtifact,
4
+ type ContractInstanceWithAddress,
5
+ Fr,
6
+ PublicKeys,
7
+ getContractClassFromArtifact,
8
+ } from '@aztec/aztec.js';
9
+ import { getContractArtifact } from '@aztec/cli/cli-utils';
10
+ import type { NamespacedApiHandlers } from '@aztec/foundation/json-rpc/server';
11
+ import type { LogFn } from '@aztec/foundation/log';
12
+ import {
13
+ type CliPXEOptions,
14
+ type PXEService,
15
+ type PXEServiceConfig,
16
+ allPxeConfigMappings,
17
+ createPXEService,
18
+ } from '@aztec/pxe/server';
19
+ import { type AztecNode, PXESchema, createAztecNodeClient } from '@aztec/stdlib/interfaces/client';
20
+ import { L2BasicContractsMap, Network } from '@aztec/stdlib/network';
21
+ import { makeTracedFetch } from '@aztec/telemetry-client';
22
+
23
+ import { extractRelevantOptions } from '../util.js';
24
+ import { getVersions } from '../versioning.js';
25
+
26
+ export type { PXEServiceConfig, CliPXEOptions };
27
+
28
+ const contractAddressesUrl = 'http://static.aztec.network';
29
+
30
+ export async function startPXE(
31
+ options: any,
32
+ signalHandlers: (() => Promise<void>)[],
33
+ services: NamespacedApiHandlers,
34
+ userLog: LogFn,
35
+ ): Promise<{ pxe: PXEService; config: PXEServiceConfig & CliPXEOptions }> {
36
+ return await addPXE(options, signalHandlers, services, userLog, {});
37
+ }
38
+
39
+ function isValidNetwork(value: any): value is Network {
40
+ return Object.values(Network).includes(value);
41
+ }
42
+
43
+ async function fetchBasicContractAddresses(url: string) {
44
+ const response = await fetch(url);
45
+ if (!response.ok) {
46
+ throw new Error(`Failed to fetch basic contract addresses from ${url}`);
47
+ }
48
+ return response.json();
49
+ }
50
+
51
+ export async function addPXE(
52
+ options: any,
53
+ signalHandlers: (() => Promise<void>)[],
54
+ services: NamespacedApiHandlers,
55
+ userLog: LogFn,
56
+ deps: { node?: AztecNode } = {},
57
+ ): Promise<{ pxe: PXEService; config: PXEServiceConfig & CliPXEOptions }> {
58
+ const pxeConfig = extractRelevantOptions<PXEServiceConfig & CliPXEOptions>(options, allPxeConfigMappings, 'pxe');
59
+
60
+ let nodeUrl;
61
+ if (pxeConfig.network) {
62
+ if (isValidNetwork(pxeConfig.network)) {
63
+ if (!pxeConfig.apiKey && !pxeConfig.nodeUrl) {
64
+ userLog(`API Key or Aztec Node URL is required to connect to ${pxeConfig.network}`);
65
+ process.exit(1);
66
+ } else if (pxeConfig.apiKey) {
67
+ nodeUrl = `https://api.aztec.network/${pxeConfig.network}/aztec-node-1/${pxeConfig.apiKey}`;
68
+ } else if (pxeConfig.nodeUrl) {
69
+ nodeUrl = pxeConfig.nodeUrl;
70
+ }
71
+ } else {
72
+ userLog(`Network ${pxeConfig.network} is not supported`);
73
+ process.exit(1);
74
+ }
75
+ } else {
76
+ nodeUrl = pxeConfig.nodeUrl;
77
+ }
78
+ if (!nodeUrl && !deps.node && !pxeConfig.network) {
79
+ userLog('Aztec Node URL (nodeUrl | AZTEC_NODE_URL) option is required to start PXE without --node option');
80
+ process.exit(1);
81
+ }
82
+
83
+ const node = deps.node ?? createAztecNodeClient(nodeUrl!, getVersions(pxeConfig), makeTracedFetch([1, 2, 3], true));
84
+ const pxe = await createPXEService(node, pxeConfig as PXEServiceConfig);
85
+
86
+ // register basic contracts
87
+ if (pxeConfig.network) {
88
+ userLog(`Registering basic contracts for ${pxeConfig.network}`);
89
+ const basicContractsInfo = await fetchBasicContractAddresses(
90
+ `${contractAddressesUrl}/${pxeConfig.network}/basic_contracts.json`,
91
+ );
92
+ const l2Contracts: Record<
93
+ string,
94
+ { name: string; address: AztecAddress; initHash: Fr; salt: Fr; artifact: ContractArtifact }
95
+ > = {};
96
+ for (const [key, artifactName] of Object.entries(L2BasicContractsMap[pxeConfig.network as Network])) {
97
+ l2Contracts[key] = {
98
+ name: key,
99
+ address: AztecAddress.fromString(basicContractsInfo[key].address),
100
+ initHash: Fr.fromHexString(basicContractsInfo[key].initHash),
101
+ salt: Fr.fromHexString(basicContractsInfo[key].salt),
102
+ artifact: await getContractArtifact(artifactName, userLog),
103
+ };
104
+ }
105
+
106
+ await Promise.all(
107
+ Object.values(l2Contracts).map(async ({ name, address, artifact, initHash, salt }) => {
108
+ const contractClass = await getContractClassFromArtifact(artifact!);
109
+ const instance: ContractInstanceWithAddress = {
110
+ version: 1,
111
+ salt,
112
+ initializationHash: initHash,
113
+ address,
114
+ deployer: AztecAddress.ZERO,
115
+ currentContractClassId: contractClass.id,
116
+ originalContractClassId: contractClass.id,
117
+ publicKeys: PublicKeys.default(),
118
+ };
119
+ userLog(`Registering ${name} at ${address.toString()}`);
120
+ await pxe.registerContract({ artifact, instance });
121
+ }),
122
+ );
123
+ }
124
+
125
+ // Add PXE to services list
126
+ services.pxe = [pxe, PXESchema];
127
+
128
+ return { pxe, config: pxeConfig };
129
+ }
@@ -0,0 +1,15 @@
1
+ import { startHttpRpcServer } from '@aztec/foundation/json-rpc/server';
2
+ import type { Logger } from '@aztec/foundation/log';
3
+ import { createTXERpcServer } from '@aztec/txe';
4
+
5
+ export async function startTXE(options: any, debugLogger: Logger) {
6
+ debugLogger.info(`Setting up TXE...`);
7
+
8
+ const txeServer = createTXERpcServer(debugLogger);
9
+ const { port } = await startHttpRpcServer(txeServer, {
10
+ port: options.port,
11
+ timeoutMs: 1e3 * 60 * 5,
12
+ });
13
+
14
+ debugLogger.info(`TXE listening on port ${port}`);
15
+ }
@@ -0,0 +1,18 @@
1
+ import { type L1ContractAddresses, RegistryContract, getL1ContractsConfig, getPublicClient } from '@aztec/ethereum';
2
+ import type { EthAddress } from '@aztec/foundation/eth-address';
3
+
4
+ export async function getL1Config(
5
+ registryAddress: EthAddress,
6
+ l1RpcUrls: string[],
7
+ l1ChainId: number,
8
+ ): Promise<{ addresses: L1ContractAddresses; config: Awaited<ReturnType<typeof getL1ContractsConfig>> }> {
9
+ const publicClient = getPublicClient({ l1RpcUrls, l1ChainId });
10
+ const addresses = await RegistryContract.collectAddresses(publicClient, registryAddress, 'canonical');
11
+
12
+ const config = await getL1ContractsConfig(publicClient, addresses);
13
+
14
+ return {
15
+ addresses,
16
+ config,
17
+ };
18
+ }
@@ -0,0 +1 @@
1
+ export * from './cli.js';