@aztec/aztec 0.0.1-commit.9593d84 → 0.0.1-commit.96dac018d

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 (123) hide show
  1. package/dest/bin/index.js +10 -3
  2. package/dest/cli/admin_api_key_store.d.ts +45 -0
  3. package/dest/cli/admin_api_key_store.d.ts.map +1 -0
  4. package/dest/cli/admin_api_key_store.js +98 -0
  5. package/dest/cli/aztec_start_action.d.ts +1 -1
  6. package/dest/cli/aztec_start_action.d.ts.map +1 -1
  7. package/dest/cli/aztec_start_action.js +50 -13
  8. package/dest/cli/aztec_start_options.d.ts +1 -1
  9. package/dest/cli/aztec_start_options.d.ts.map +1 -1
  10. package/dest/cli/aztec_start_options.js +39 -33
  11. package/dest/cli/cli.d.ts +1 -1
  12. package/dest/cli/cli.d.ts.map +1 -1
  13. package/dest/cli/cli.js +4 -37
  14. package/dest/cli/cmds/compile.d.ts +4 -0
  15. package/dest/cli/cmds/compile.d.ts.map +1 -0
  16. package/dest/cli/cmds/compile.js +160 -0
  17. package/dest/cli/cmds/migrate_ha_db.d.ts +3 -0
  18. package/dest/cli/cmds/migrate_ha_db.d.ts.map +1 -0
  19. package/dest/cli/cmds/migrate_ha_db.js +27 -0
  20. package/dest/cli/cmds/profile.d.ts +4 -0
  21. package/dest/cli/cmds/profile.d.ts.map +1 -0
  22. package/dest/cli/cmds/profile.js +8 -0
  23. package/dest/cli/cmds/profile_flamegraph.d.ts +4 -0
  24. package/dest/cli/cmds/profile_flamegraph.d.ts.map +1 -0
  25. package/dest/cli/cmds/profile_flamegraph.js +51 -0
  26. package/dest/cli/cmds/profile_gates.d.ts +4 -0
  27. package/dest/cli/cmds/profile_gates.d.ts.map +1 -0
  28. package/dest/cli/cmds/profile_gates.js +57 -0
  29. package/dest/cli/cmds/profile_utils.d.ts +18 -0
  30. package/dest/cli/cmds/profile_utils.d.ts.map +1 -0
  31. package/dest/cli/cmds/profile_utils.js +50 -0
  32. package/dest/cli/cmds/start_archiver.d.ts +1 -1
  33. package/dest/cli/cmds/start_archiver.d.ts.map +1 -1
  34. package/dest/cli/cmds/start_archiver.js +11 -13
  35. package/dest/cli/cmds/start_bot.d.ts +3 -3
  36. package/dest/cli/cmds/start_bot.d.ts.map +1 -1
  37. package/dest/cli/cmds/start_bot.js +10 -6
  38. package/dest/cli/cmds/start_node.d.ts +1 -1
  39. package/dest/cli/cmds/start_node.d.ts.map +1 -1
  40. package/dest/cli/cmds/start_node.js +64 -12
  41. package/dest/cli/cmds/start_p2p_bootstrap.d.ts +2 -2
  42. package/dest/cli/cmds/start_p2p_bootstrap.d.ts.map +1 -1
  43. package/dest/cli/cmds/start_p2p_bootstrap.js +2 -3
  44. package/dest/cli/cmds/start_prover_agent.d.ts +1 -1
  45. package/dest/cli/cmds/start_prover_agent.d.ts.map +1 -1
  46. package/dest/cli/cmds/start_prover_agent.js +4 -4
  47. package/dest/cli/cmds/start_prover_broker.d.ts +1 -1
  48. package/dest/cli/cmds/start_prover_broker.d.ts.map +1 -1
  49. package/dest/cli/cmds/start_prover_broker.js +4 -4
  50. package/dest/cli/cmds/utils/artifacts.d.ts +21 -0
  51. package/dest/cli/cmds/utils/artifacts.d.ts.map +1 -0
  52. package/dest/cli/cmds/utils/artifacts.js +24 -0
  53. package/dest/cli/cmds/utils/spawn.d.ts +3 -0
  54. package/dest/cli/cmds/utils/spawn.d.ts.map +1 -0
  55. package/dest/cli/cmds/utils/spawn.js +16 -0
  56. package/dest/cli/util.d.ts +8 -17
  57. package/dest/cli/util.d.ts.map +1 -1
  58. package/dest/cli/util.js +13 -8
  59. package/dest/examples/token.js +5 -5
  60. package/dest/examples/util.d.ts +2 -2
  61. package/dest/examples/util.d.ts.map +1 -1
  62. package/dest/local-network/banana_fpc.d.ts +1 -1
  63. package/dest/local-network/banana_fpc.d.ts.map +1 -1
  64. package/dest/local-network/banana_fpc.js +3 -3
  65. package/dest/local-network/local-network.d.ts +13 -14
  66. package/dest/local-network/local-network.d.ts.map +1 -1
  67. package/dest/local-network/local-network.js +68 -38
  68. package/dest/testing/anvil_test_watcher.d.ts +10 -2
  69. package/dest/testing/anvil_test_watcher.d.ts.map +1 -1
  70. package/dest/testing/anvil_test_watcher.js +53 -16
  71. package/dest/testing/cheat_codes.d.ts +3 -1
  72. package/dest/testing/cheat_codes.d.ts.map +1 -1
  73. package/dest/testing/epoch_test_settler.d.ts +19 -0
  74. package/dest/testing/epoch_test_settler.d.ts.map +1 -0
  75. package/dest/testing/epoch_test_settler.js +62 -0
  76. package/dest/testing/index.d.ts +2 -1
  77. package/dest/testing/index.d.ts.map +1 -1
  78. package/dest/testing/index.js +1 -0
  79. package/package.json +37 -35
  80. package/scripts/aztec.sh +17 -11
  81. package/scripts/init.sh +23 -13
  82. package/scripts/new.sh +17 -16
  83. package/scripts/setup_workspace.sh +124 -0
  84. package/src/bin/index.ts +11 -3
  85. package/src/cli/admin_api_key_store.ts +128 -0
  86. package/src/cli/aztec_start_action.ts +53 -8
  87. package/src/cli/aztec_start_options.ts +40 -32
  88. package/src/cli/cli.ts +4 -37
  89. package/src/cli/cmds/compile.ts +184 -0
  90. package/src/cli/cmds/migrate_ha_db.ts +43 -0
  91. package/src/cli/cmds/profile.ts +25 -0
  92. package/src/cli/cmds/profile_flamegraph.ts +63 -0
  93. package/src/cli/cmds/profile_gates.ts +67 -0
  94. package/src/cli/cmds/profile_utils.ts +58 -0
  95. package/src/cli/cmds/start_archiver.ts +7 -18
  96. package/src/cli/cmds/start_bot.ts +9 -6
  97. package/src/cli/cmds/start_node.ts +53 -11
  98. package/src/cli/cmds/start_p2p_bootstrap.ts +3 -3
  99. package/src/cli/cmds/start_prover_agent.ts +4 -12
  100. package/src/cli/cmds/start_prover_broker.ts +7 -3
  101. package/src/cli/cmds/utils/artifacts.ts +44 -0
  102. package/src/cli/cmds/utils/spawn.ts +16 -0
  103. package/src/cli/util.ts +20 -25
  104. package/src/examples/token.ts +5 -7
  105. package/src/examples/util.ts +1 -1
  106. package/src/local-network/banana_fpc.ts +11 -7
  107. package/src/local-network/local-network.ts +107 -82
  108. package/src/testing/anvil_test_watcher.ts +61 -17
  109. package/src/testing/cheat_codes.ts +3 -2
  110. package/src/testing/epoch_test_settler.ts +71 -0
  111. package/src/testing/index.ts +1 -0
  112. package/dest/cli/cmds/start_blob_sink.d.ts +0 -3
  113. package/dest/cli/cmds/start_blob_sink.d.ts.map +0 -1
  114. package/dest/cli/cmds/start_blob_sink.js +0 -33
  115. package/dest/cli/cmds/start_prover_node.d.ts +0 -7
  116. package/dest/cli/cmds/start_prover_node.d.ts.map +0 -1
  117. package/dest/cli/cmds/start_prover_node.js +0 -108
  118. package/scripts/compile.sh +0 -44
  119. package/scripts/extract_function.js +0 -47
  120. package/scripts/flamegraph.sh +0 -59
  121. package/scripts/setup_project.sh +0 -31
  122. package/src/cli/cmds/start_blob_sink.ts +0 -57
  123. package/src/cli/cmds/start_prover_node.ts +0 -124
@@ -0,0 +1,67 @@
1
+ import { asyncPool } from '@aztec/foundation/async-pool';
2
+ import type { LogFn } from '@aztec/foundation/log';
3
+
4
+ import { execFile as execFileCb } from 'child_process';
5
+ import { rm } from 'fs/promises';
6
+ import { promisify } from 'util';
7
+
8
+ import { MAX_CONCURRENT, discoverArtifacts } from './profile_utils.js';
9
+
10
+ const execFile = promisify(execFileCb);
11
+
12
+ interface GateCountResult {
13
+ name: string;
14
+ gateCount: number;
15
+ }
16
+
17
+ /** Parses circuit_size from bb gates JSON output: { "functions": [{ "circuit_size": N }] } */
18
+ function parseGateCount(stdout: string): number {
19
+ const parsed = JSON.parse(stdout);
20
+ const size = parsed?.functions?.[0]?.circuit_size;
21
+ if (typeof size !== 'number') {
22
+ throw new Error('Failed to parse circuit_size from bb gates output');
23
+ }
24
+ return size;
25
+ }
26
+
27
+ /** Runs bb gates on a single artifact file and returns the gate count. */
28
+ async function getGateCount(bb: string, artifactPath: string): Promise<number> {
29
+ const { stdout } = await execFile(bb, ['gates', '--scheme', 'chonk', '-b', artifactPath]);
30
+ return parseGateCount(stdout);
31
+ }
32
+
33
+ /** Profiles all compiled artifacts in a target directory and prints gate counts. */
34
+ export async function profileGates(targetDir: string, log: LogFn): Promise<void> {
35
+ const bb = process.env.BB ?? 'bb';
36
+ const { artifacts, tmpDir } = await discoverArtifacts(targetDir);
37
+
38
+ if (artifacts.length === 0) {
39
+ log('No artifacts found in target directory.');
40
+ return;
41
+ }
42
+
43
+ try {
44
+ const results: GateCountResult[] = await asyncPool(MAX_CONCURRENT, artifacts, async artifact => ({
45
+ name: artifact.name,
46
+ gateCount: await getGateCount(bb, artifact.filePath),
47
+ }));
48
+ results.sort((a, b) => a.name.localeCompare(b.name));
49
+
50
+ if (results.length === 0) {
51
+ log('No constrained circuits found.');
52
+ return;
53
+ }
54
+
55
+ const maxNameLen = Math.max(...results.map(r => r.name.length));
56
+ log('');
57
+ log('Gate counts:');
58
+ log('-'.repeat(maxNameLen + 16));
59
+ for (const { name, gateCount } of results) {
60
+ log(`${name.padEnd(maxNameLen)} ${gateCount.toLocaleString().padStart(12)}`);
61
+ }
62
+ log('-'.repeat(maxNameLen + 16));
63
+ log(`Total: ${results.length} circuit(s)`);
64
+ } finally {
65
+ await rm(tmpDir, { recursive: true, force: true });
66
+ }
67
+ }
@@ -0,0 +1,58 @@
1
+ import { mkdtemp, writeFile } from 'fs/promises';
2
+ import { tmpdir } from 'os';
3
+ import { join } from 'path';
4
+
5
+ import type { CompiledArtifact, ContractFunction } from './utils/artifacts.js';
6
+ import { readArtifactFiles } from './utils/artifacts.js';
7
+
8
+ export const MAX_CONCURRENT = 4;
9
+
10
+ export interface DiscoveredArtifact {
11
+ name: string;
12
+ filePath: string;
13
+ type: 'contract-function' | 'program';
14
+ }
15
+
16
+ /**
17
+ * Reads a target directory and returns a list of discovered artifacts with temp files
18
+ * created for contract functions. Caller must clean up tmpDir when done.
19
+ */
20
+ export async function discoverArtifacts(
21
+ targetDir: string,
22
+ ): Promise<{ artifacts: DiscoveredArtifact[]; tmpDir: string }> {
23
+ const files = await readArtifactFiles(targetDir);
24
+ const tmpDir = await mkdtemp(join(tmpdir(), 'aztec-profile-'));
25
+ const artifacts: DiscoveredArtifact[] = [];
26
+
27
+ for (const file of files) {
28
+ if (Array.isArray(file.content.functions)) {
29
+ for (const func of file.content.functions) {
30
+ if (!func.bytecode || func.is_unconstrained) {
31
+ continue;
32
+ }
33
+ const name = `${file.name}::${func.name}`;
34
+ const tmpPath = join(tmpDir, `${file.name}-${func.name}.json`);
35
+ await writeFile(tmpPath, makeFunctionArtifact(file.content, func));
36
+ artifacts.push({ name, filePath: tmpPath, type: 'contract-function' });
37
+ }
38
+ } else if (file.content.bytecode) {
39
+ artifacts.push({ name: file.name, filePath: file.filePath, type: 'program' });
40
+ }
41
+ }
42
+
43
+ return { artifacts, tmpDir };
44
+ }
45
+
46
+ /** Extracts a contract function as a standalone program artifact JSON string. */
47
+ export function makeFunctionArtifact(artifact: CompiledArtifact, func: ContractFunction) {
48
+ /* eslint-disable camelcase */
49
+ return JSON.stringify({
50
+ noir_version: artifact.noir_version,
51
+ hash: 0,
52
+ abi: func.abi,
53
+ bytecode: func.bytecode,
54
+ debug_symbols: func.debug_symbols,
55
+ file_map: artifact.file_map,
56
+ });
57
+ /* eslint-enable camelcase */
58
+ }
@@ -1,16 +1,9 @@
1
- import {
2
- Archiver,
3
- type ArchiverConfig,
4
- KVArchiverDataStore,
5
- archiverConfigMappings,
6
- getArchiverConfigFromEnv,
7
- } from '@aztec/archiver';
1
+ import { type ArchiverConfig, archiverConfigMappings, createArchiver, getArchiverConfigFromEnv } from '@aztec/archiver';
8
2
  import { createLogger } from '@aztec/aztec.js/log';
9
- import { type BlobSinkConfig, blobSinkConfigMapping, createBlobSinkClient } from '@aztec/blob-sink/client';
3
+ import { type BlobClientConfig, blobClientConfigMapping, createBlobClient } from '@aztec/blob-client/client';
10
4
  import { getL1Config } from '@aztec/cli/config';
11
5
  import type { NamespacedApiHandlers } from '@aztec/foundation/json-rpc/server';
12
6
  import { type DataStoreConfig, dataConfigMappings } from '@aztec/kv-store/config';
13
- import { createStore } from '@aztec/kv-store/lmdb-v2';
14
7
  import { ArchiverApiSchema } from '@aztec/stdlib/interfaces/server';
15
8
  import { getConfigEnvVars as getTelemetryClientConfig, initTelemetryClient } from '@aztec/telemetry-client';
16
9
 
@@ -25,9 +18,9 @@ export async function startArchiver(
25
18
  services: NamespacedApiHandlers,
26
19
  ): Promise<{ config: ArchiverConfig & DataStoreConfig }> {
27
20
  const envConfig = getArchiverConfigFromEnv();
28
- const cliOptions = extractRelevantOptions<ArchiverConfig & DataStoreConfig & BlobSinkConfig>(
21
+ const cliOptions = extractRelevantOptions<ArchiverConfig & DataStoreConfig & BlobClientConfig>(
29
22
  options,
30
- { ...archiverConfigMappings, ...dataConfigMappings, ...blobSinkConfigMapping },
23
+ { ...archiverConfigMappings, ...dataConfigMappings, ...blobClientConfigMapping },
31
24
  'archiver',
32
25
  );
33
26
 
@@ -47,13 +40,9 @@ export async function startArchiver(
47
40
  archiverConfig.l1Contracts = addresses;
48
41
  archiverConfig = { ...archiverConfig, ...l1Config };
49
42
 
50
- const storeLog = createLogger('archiver:lmdb');
51
- const store = await createStore('archiver', KVArchiverDataStore.SCHEMA_VERSION, archiverConfig, storeLog);
52
- const archiverStore = new KVArchiverDataStore(store, archiverConfig.maxLogs);
53
-
54
- const telemetry = initTelemetryClient(getTelemetryClientConfig());
55
- const blobSinkClient = createBlobSinkClient(archiverConfig, { logger: createLogger('archiver:blob-sink:client') });
56
- const archiver = await Archiver.createAndSync(archiverConfig, archiverStore, { telemetry, blobSinkClient }, true);
43
+ const telemetry = await initTelemetryClient(getTelemetryClientConfig());
44
+ const blobClient = createBlobClient(archiverConfig, { logger: createLogger('archiver:blob-client:client') });
45
+ const archiver = await createArchiver(archiverConfig, { telemetry, blobClient }, { blockUntilSync: true });
57
46
  services.archiver = [archiver, ArchiverApiSchema];
58
47
  signalHandlers.push(archiver.stop);
59
48
 
@@ -10,9 +10,9 @@ import {
10
10
  initTelemetryClient,
11
11
  makeTracedFetch,
12
12
  } from '@aztec/telemetry-client';
13
- import { TestWallet } from '@aztec/test-wallet/server';
13
+ import { EmbeddedWallet } from '@aztec/wallets/embedded';
14
14
 
15
- import { extractRelevantOptions } from '../util.js';
15
+ import { extractRelevantOptions, stringifyConfig } from '../util.js';
16
16
  import { getVersions } from '../versioning.js';
17
17
 
18
18
  export async function startBot(
@@ -38,22 +38,25 @@ export async function startBot(
38
38
  const aztecNode = createAztecNodeClient(config.nodeUrl, getVersions(), fetch);
39
39
 
40
40
  const pxeConfig = extractRelevantOptions<PXEConfig & CliPXEOptions>(options, allPxeConfigMappings, 'pxe');
41
- const wallet = await TestWallet.create(aztecNode, pxeConfig);
41
+ userLog(`Creating bot wallet with config ${stringifyConfig(pxeConfig)}`);
42
+ const wallet = await EmbeddedWallet.create(aztecNode, { pxeConfig });
42
43
 
43
- const telemetry = initTelemetryClient(getTelemetryClientConfig());
44
- await addBot(options, signalHandlers, services, wallet, aztecNode, telemetry, undefined);
44
+ const telemetry = await initTelemetryClient(getTelemetryClientConfig());
45
+ await addBot(options, signalHandlers, services, wallet, aztecNode, telemetry, undefined, userLog);
45
46
  }
46
47
 
47
48
  export async function addBot(
48
49
  options: any,
49
50
  signalHandlers: (() => Promise<void>)[],
50
51
  services: NamespacedApiHandlers,
51
- wallet: TestWallet,
52
+ wallet: EmbeddedWallet,
52
53
  aztecNode: AztecNode,
53
54
  telemetry: TelemetryClient,
54
55
  aztecNodeAdmin?: AztecNodeAdmin,
56
+ userLog?: LogFn,
55
57
  ) {
56
58
  const config = extractRelevantOptions<BotConfig>(options, botConfigMappings, 'bot');
59
+ userLog?.(`Starting bot with config ${stringifyConfig(config)}`);
57
60
 
58
61
  const db = await (config.dataDirectory
59
62
  ? createStore('bot', BotStore.SCHEMA_VERSION, config)
@@ -3,19 +3,22 @@ import { type AztecNodeConfig, aztecNodeConfigMappings, getConfigEnvVars } from
3
3
  import { Fr } from '@aztec/aztec.js/fields';
4
4
  import { getSponsoredFPCAddress } from '@aztec/cli/cli-utils';
5
5
  import { getL1Config } from '@aztec/cli/config';
6
- import { getPublicClient } from '@aztec/ethereum';
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) {
@@ -117,16 +150,25 @@ export async function startNode(
117
150
  }
118
151
 
119
152
  const telemetryConfig = extractRelevantOptions<TelemetryClientConfig>(options, telemetryClientConfigMappings, 'tel');
120
- const telemetry = initTelemetryClient(telemetryConfig);
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
  }
@@ -1,6 +1,6 @@
1
1
  import { jsonStringify } from '@aztec/foundation/json-rpc';
2
2
  import type { NamespacedApiHandlers } from '@aztec/foundation/json-rpc/server';
3
- import { type LogFn, createLogger } from '@aztec/foundation/log';
3
+ import type { LogFn } from '@aztec/foundation/log';
4
4
  import { createStore } from '@aztec/kv-store/lmdb-v2';
5
5
  import { type BootnodeConfig, BootstrapNode, bootnodeConfigMappings } from '@aztec/p2p';
6
6
  import { emptyChainConfig } from '@aztec/stdlib/config';
@@ -25,9 +25,9 @@ export async function startP2PBootstrap(
25
25
  userLog(`Starting P2P bootstrap node with config: ${jsonStringify(safeConfig)}`);
26
26
 
27
27
  const telemetryConfig = extractRelevantOptions<TelemetryClientConfig>(options, telemetryClientConfigMappings, 'tel');
28
- const telemetryClient = initTelemetryClient(telemetryConfig);
28
+ const telemetryClient = await initTelemetryClient(telemetryConfig);
29
29
 
30
- const store = await createStore('p2p-bootstrap', 1, config, createLogger('p2p:bootstrap:store'));
30
+ const store = await createStore('p2p-bootstrap', 1, config);
31
31
  const node = new BootstrapNode(store, telemetryClient);
32
32
  await node.start(config);
33
33
  signalHandlers.push(() => node.stop());
@@ -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';
@@ -53,20 +53,12 @@ export async function startProverAgent(
53
53
  );
54
54
  const broker = createProvingJobBrokerClient(config.proverBrokerUrl, getVersions(), fetch);
55
55
 
56
- const telemetry = initTelemetryClient(extractRelevantOptions(options, telemetryClientConfigMappings, 'tel'));
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
- () =>
62
- new ProvingAgent(
63
- broker,
64
- proofStore,
65
- prover,
66
- config.proverAgentProofTypes,
67
- config.proverAgentPollIntervalMs,
68
- telemetry,
69
- ),
61
+ () => new ProvingAgent(broker, proofStore, prover, config.proverAgentProofTypes, config.proverAgentPollIntervalMs),
70
62
  );
71
63
 
72
64
  // expose all agents as individual services
@@ -1,10 +1,11 @@
1
1
  import { getL1Config } from '@aztec/cli/config';
2
- import { getPublicClient } from '@aztec/ethereum';
2
+ import { getPublicClient } from '@aztec/ethereum/client';
3
3
  import type { NamespacedApiHandlers } from '@aztec/foundation/json-rpc/server';
4
4
  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';
@@ -45,7 +46,7 @@ export async function startProverBroker(
45
46
  config.l1Contracts = addresses;
46
47
  config.rollupVersion = rollupConfig.rollupVersion;
47
48
 
48
- const client = initTelemetryClient(getTelemetryClientConfig());
49
+ const client = await initTelemetryClient(getTelemetryClientConfig());
49
50
  const broker = await createAndStartProvingBroker(config, client);
50
51
 
51
52
  if (options.autoUpdate !== 'disabled' && options.autoUpdateUrl) {
@@ -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 };
@@ -0,0 +1,44 @@
1
+ import { readFile, readdir } from 'fs/promises';
2
+ import { join } from 'path';
3
+
4
+ export interface CompiledArtifact {
5
+ noir_version: string;
6
+ file_map: unknown;
7
+ functions: ContractFunction[];
8
+ bytecode?: string;
9
+ }
10
+
11
+ export interface ContractFunction {
12
+ name: string;
13
+ abi: unknown;
14
+ bytecode: string;
15
+ debug_symbols: unknown;
16
+ is_unconstrained?: boolean;
17
+ }
18
+
19
+ export interface ArtifactFile {
20
+ name: string;
21
+ filePath: string;
22
+ content: CompiledArtifact;
23
+ }
24
+
25
+ /** Reads all JSON artifact files from a target directory and returns their parsed contents. */
26
+ export async function readArtifactFiles(targetDir: string): Promise<ArtifactFile[]> {
27
+ let entries: string[];
28
+ try {
29
+ entries = (await readdir(targetDir)).filter(f => f.endsWith('.json'));
30
+ } catch (err: any) {
31
+ if (err?.code === 'ENOENT') {
32
+ throw new Error(`Target directory '${targetDir}' does not exist. Compile first with 'aztec compile'.`);
33
+ }
34
+ throw err;
35
+ }
36
+
37
+ const artifacts: ArtifactFile[] = [];
38
+ for (const file of entries) {
39
+ const filePath = join(targetDir, file);
40
+ const content = JSON.parse(await readFile(filePath, 'utf-8')) as CompiledArtifact;
41
+ artifacts.push({ name: file.replace('.json', ''), filePath, content });
42
+ }
43
+ return artifacts;
44
+ }
@@ -0,0 +1,16 @@
1
+ import { spawn } from 'child_process';
2
+
3
+ /** Spawns a command with inherited stdio and rejects on non-zero exit. */
4
+ export function run(cmd: string, args: string[]): Promise<void> {
5
+ return new Promise((resolve, reject) => {
6
+ const child = spawn(cmd, args, { stdio: 'inherit' });
7
+ child.on('error', reject);
8
+ child.on('close', code => {
9
+ if (code !== 0) {
10
+ reject(new Error(`${cmd} exited with code ${code}`));
11
+ } else {
12
+ resolve();
13
+ }
14
+ });
15
+ });
16
+ }
package/src/cli/util.ts CHANGED
@@ -1,15 +1,14 @@
1
1
  import type { AztecNodeConfig } from '@aztec/aztec-node';
2
- import { EthAddress } from '@aztec/aztec.js/addresses';
3
- import { Fr } from '@aztec/aztec.js/fields';
4
- import { AccountManager } from '@aztec/aztec.js/wallet';
5
- import type { ViemClient } from '@aztec/ethereum';
2
+ import type { AccountManager } from '@aztec/aztec.js/wallet';
3
+ import type { ViemClient } from '@aztec/ethereum/types';
6
4
  import type { ConfigMappingsType } from '@aztec/foundation/config';
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
- import { UpdateChecker } from '@aztec/stdlib/update-checker';
11
- import { getTelemetryClient } from '@aztec/telemetry-client';
12
- import type { TestWallet } from '@aztec/test-wallet/server';
10
+ import { getTelemetryClient } from '@aztec/telemetry-client/start';
11
+ import type { EmbeddedWallet } from '@aztec/wallets/embedded';
13
12
 
14
13
  import chalk from 'chalk';
15
14
  import type { Command } from 'commander';
@@ -37,7 +36,7 @@ export function shutdown(logFn: LogFn, exitCode: ExitCode, cb?: Array<() => Prom
37
36
 
38
37
  logFn('Shutting down...', { exitCode });
39
38
  if (cb) {
40
- shutdownPromise = Promise.allSettled(cb).then(() => process.exit(exitCode));
39
+ shutdownPromise = Promise.allSettled(cb.map(fn => fn())).then(() => process.exit(exitCode));
41
40
  } else {
42
41
  // synchronously shuts down the process
43
42
  // no need to set shutdownPromise on this branch of the if statement because no more code will be executed
@@ -69,30 +68,19 @@ export const installSignalHandlers = (logFn: LogFn, cb?: Array<() => Promise<voi
69
68
  /**
70
69
  * Creates logs for the initial accounts
71
70
  * @param accounts - The initial accounts
72
- * @param wallet - A TestWallet instance to get the registered accounts
71
+ * @param wallet - A EmbeddedWallet instance to get the registered accounts
73
72
  * @returns A string array containing the initial accounts details
74
73
  */
75
- export async function createAccountLogs(
76
- accountsWithSecretKeys: {
77
- /**
78
- * The account object
79
- */
80
- account: AccountManager;
81
- /**
82
- * The secret key of the account
83
- */
84
- secretKey: Fr;
85
- }[],
86
- wallet: TestWallet,
87
- ) {
74
+ export async function createAccountLogs(accountManagers: AccountManager[], wallet: EmbeddedWallet) {
88
75
  const registeredAccounts = await wallet.getAccounts();
89
76
  const accountLogStrings = [`Initial Accounts:\n\n`];
90
- for (const accountWithSecretKey of accountsWithSecretKeys) {
91
- const completeAddress = await accountWithSecretKey.account.getCompleteAddress();
77
+ for (const accountManager of accountManagers) {
78
+ const account = await accountManager.getAccount();
79
+ const completeAddress = account.getCompleteAddress();
92
80
  if (registeredAccounts.find(a => a.item.equals(completeAddress.address))) {
93
81
  accountLogStrings.push(` Address: ${completeAddress.address.toString()}\n`);
94
82
  accountLogStrings.push(` Partial Address: ${completeAddress.partialAddress.toString()}\n`);
95
- accountLogStrings.push(` Secret Key: ${accountWithSecretKey.secretKey.toString()}\n`);
83
+ accountLogStrings.push(` Secret Key: ${account.getSecretKey().toString()}\n`);
96
84
  accountLogStrings.push(
97
85
  ` Master nullifier public key: ${completeAddress.publicKeys.masterNullifierPublicKey.toString()}\n`,
98
86
  );
@@ -312,6 +300,7 @@ export async function setupUpdateMonitor(
312
300
  updateNodeConfig?: (config: object) => Promise<void>,
313
301
  ) {
314
302
  const logger = createLogger('update-check');
303
+ const { UpdateChecker } = await import('@aztec/stdlib/update-checker');
315
304
  const checker = await UpdateChecker.new({
316
305
  baseURL: updatesLocation,
317
306
  publicClient,
@@ -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();
@@ -32,14 +32,12 @@ async function main() {
32
32
  logger.info(`Fetched Alice and Bob accounts: ${alice.toString()}, ${bob.toString()}`);
33
33
 
34
34
  logger.info('Deploying Token...');
35
- const token = await TokenContract.deploy(wallet, alice, 'TokenName', 'TokenSymbol', 18)
36
- .send({ from: alice })
37
- .deployed();
35
+ const token = await TokenContract.deploy(wallet, alice, 'TokenName', 'TokenSymbol', 18).send({ from: alice });
38
36
  logger.info('Token deployed');
39
37
 
40
38
  // Mint tokens to Alice
41
39
  logger.info(`Minting ${ALICE_MINT_BALANCE} more coins to Alice...`);
42
- await token.methods.mint_to_private(alice, ALICE_MINT_BALANCE).send({ from: alice }).wait();
40
+ await token.methods.mint_to_private(alice, ALICE_MINT_BALANCE).send({ from: alice });
43
41
 
44
42
  logger.info(`${ALICE_MINT_BALANCE} tokens were successfully minted by Alice and transferred to private`);
45
43
 
@@ -48,7 +46,7 @@ async function main() {
48
46
 
49
47
  // We will now transfer tokens from Alice to Bob
50
48
  logger.info(`Transferring ${TRANSFER_AMOUNT} tokens from Alice to Bob...`);
51
- await token.methods.transfer(bob, TRANSFER_AMOUNT).send({ from: alice }).wait();
49
+ await token.methods.transfer(bob, TRANSFER_AMOUNT).send({ from: alice });
52
50
 
53
51
  // Check the new balances
54
52
  const aliceBalance = await token.methods.balance_of_private(alice).simulate({ from: alice });
@@ -1,5 +1,5 @@
1
1
  import { EthAddress } from '@aztec/aztec.js/addresses';
2
- import type { ExtendedViemWalletClient } from '@aztec/ethereum';
2
+ import type { ExtendedViemWalletClient } from '@aztec/ethereum/types';
3
3
  import { jsonStringify } from '@aztec/foundation/json-rpc';
4
4
 
5
5
  import type { Abi, Narrow } from 'abitype';