@aztec/end-to-end 2.1.7-rc.3 → 2.1.7-rc.4

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.
@@ -17,14 +17,14 @@ export interface NodeContext {
17
17
  export declare function generatePrivateKeys(startIndex: number, numberOfKeys: number): `0x${string}`[];
18
18
  export declare function createNodes(config: AztecNodeConfig & {
19
19
  dontStartSequencer?: boolean;
20
- }, dateProvider: DateProvider, bootstrapNodeEnr: string, numNodes: number, bootNodePort: number, prefilledPublicData?: PublicDataTreeLeaf[], dataDirectory?: string, metricsPort?: number, indexOffset?: number): Promise<AztecNodeService[]>;
20
+ }, dateProvider: DateProvider, bootstrapNodeEnr: string, numNodes: number, bootNodePort: number, prefilledPublicData?: PublicDataTreeLeaf[], dataDirectory?: string, metricsPort?: number, indexOffset?: number, validatorsPerNode?: number): Promise<AztecNodeService[]>;
21
21
  /** Creates a P2P enabled instance of Aztec Node Service with a validator */
22
22
  export declare function createNode(config: AztecNodeConfig & {
23
23
  dontStartSequencer?: boolean;
24
- }, dateProvider: DateProvider, tcpPort: number, bootstrapNode: string | undefined, addressIndex: number, prefilledPublicData?: PublicDataTreeLeaf[], dataDirectory?: string, metricsPort?: number, loggerIdStorage?: AsyncLocalStorage<string>): Promise<AztecNodeService>;
24
+ }, dateProvider: DateProvider, tcpPort: number, bootstrapNode: string | undefined, addressIndex: number | number[], prefilledPublicData?: PublicDataTreeLeaf[], dataDirectory?: string, metricsPort?: number, loggerIdStorage?: AsyncLocalStorage<string>): Promise<AztecNodeService>;
25
25
  /** Creates a P2P enabled instance of Aztec Node Service without a validator */
26
26
  export declare function createNonValidatorNode(baseConfig: AztecNodeConfig, dateProvider: DateProvider, tcpPort: number, bootstrapNode: string | undefined, prefilledPublicData?: PublicDataTreeLeaf[], dataDirectory?: string, metricsPort?: number, loggerIdStorage?: AsyncLocalStorage<string>): Promise<AztecNodeService>;
27
27
  export declare function createProverNode(config: AztecNodeConfig, tcpPort: number, bootstrapNode: string | undefined, addressIndex: number, proverNodeDeps: ProverNodeDeps & Required<Pick<ProverNodeDeps, 'dateProvider'>>, prefilledPublicData?: PublicDataTreeLeaf[], dataDirectory?: string, metricsPort?: number, loggerIdStorage?: AsyncLocalStorage<string>): Promise<import("@aztec/prover-node").ProverNode>;
28
28
  export declare function createP2PConfig(config: AztecNodeConfig, bootstrapNodeEnr?: string, port?: number, dataDirectory?: string): Promise<AztecNodeConfig>;
29
- export declare function createValidatorConfig(config: AztecNodeConfig, bootstrapNodeEnr?: string, port?: number, addressIndex?: number, dataDirectory?: string): Promise<AztecNodeConfig>;
29
+ export declare function createValidatorConfig(config: AztecNodeConfig, bootstrapNodeEnr?: string, port?: number, addressIndex?: number | number[], dataDirectory?: string): Promise<AztecNodeConfig>;
30
30
  //# sourceMappingURL=setup_p2p_test.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"setup_p2p_test.d.ts","sourceRoot":"","sources":["../../src/fixtures/setup_p2p_test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"setup_p2p_test.d.ts","sourceRoot":"","sources":["../../src/fixtures/setup_p2p_test.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  /**
2
2
  * Test fixtures and utilities to set up and run a test using multiple validators
3
3
  */ import { AztecNodeService } from '@aztec/aztec-node';
4
+ import { range } from '@aztec/foundation/array';
4
5
  import { SecretValue } from '@aztec/foundation/config';
5
6
  import { addLogNameHandler, removeLogNameHandler } from '@aztec/foundation/log';
6
7
  import { bufferToHex } from '@aztec/foundation/string';
@@ -21,7 +22,7 @@ export function generatePrivateKeys(startIndex, numberOfKeys) {
21
22
  }
22
23
  return privateKeys;
23
24
  }
24
- export async function createNodes(config, dateProvider, bootstrapNodeEnr, numNodes, bootNodePort, prefilledPublicData, dataDirectory, metricsPort, indexOffset = 0) {
25
+ export async function createNodes(config, dateProvider, bootstrapNodeEnr, numNodes, bootNodePort, prefilledPublicData, dataDirectory, metricsPort, indexOffset = 0, validatorsPerNode = 1) {
25
26
  const nodePromises = [];
26
27
  const loggerIdStorage = new AsyncLocalStorage();
27
28
  const logNameHandler = (module)=>loggerIdStorage.getStore() ? `${module}:${loggerIdStorage.getStore()}` : module;
@@ -30,8 +31,11 @@ export async function createNodes(config, dateProvider, bootstrapNodeEnr, numNod
30
31
  const index = indexOffset + i;
31
32
  // We run on ports from the bootnode upwards
32
33
  const port = bootNodePort + 1 + index;
34
+ // Determine validator indices for this node
35
+ const validatorIndices = validatorsPerNode === 1 ? index : range(validatorsPerNode, validatorsPerNode * index);
36
+ // Assign data directory
33
37
  const dataDir = dataDirectory ? `${dataDirectory}-${index}` : undefined;
34
- const nodePromise = createNode(config, dateProvider, port, bootstrapNodeEnr, index, prefilledPublicData, dataDir, metricsPort, loggerIdStorage);
38
+ const nodePromise = createNode(config, dateProvider, port, bootstrapNodeEnr, validatorIndices, prefilledPublicData, dataDir, metricsPort, loggerIdStorage);
35
39
  nodePromises.push(nodePromise);
36
40
  }
37
41
  const nodes = await Promise.all(nodePromises);
@@ -109,16 +113,20 @@ export async function createP2PConfig(config, bootstrapNodeEnr, port, dataDirect
109
113
  return nodeConfig;
110
114
  }
111
115
  export async function createValidatorConfig(config, bootstrapNodeEnr, port, addressIndex = 1, dataDirectory) {
112
- const attesterPrivateKey = bufferToHex(getPrivateKeyFromIndex(ATTESTER_PRIVATE_KEYS_START_INDEX + addressIndex));
116
+ const addressIndices = Array.isArray(addressIndex) ? addressIndex : [
117
+ addressIndex
118
+ ];
119
+ if (addressIndices.length === 0) {
120
+ throw new Error('At least one address index must be provided to create a validator config');
121
+ }
122
+ const attesterPrivateKeys = addressIndices.map((index)=>bufferToHex(getPrivateKeyFromIndex(ATTESTER_PRIVATE_KEYS_START_INDEX + index)));
113
123
  const p2pConfig = await createP2PConfig(config, bootstrapNodeEnr, port, dataDirectory);
114
124
  const nodeConfig = {
115
125
  ...config,
116
126
  ...p2pConfig,
117
- validatorPrivateKeys: new SecretValue([
118
- attesterPrivateKey
119
- ]),
127
+ validatorPrivateKeys: new SecretValue(attesterPrivateKeys),
120
128
  publisherPrivateKeys: [
121
- new SecretValue(attesterPrivateKey)
129
+ new SecretValue(attesterPrivateKeys[0])
122
130
  ]
123
131
  };
124
132
  return nodeConfig;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aztec/end-to-end",
3
- "version": "2.1.7-rc.3",
3
+ "version": "2.1.7-rc.4",
4
4
  "type": "module",
5
5
  "exports": "./dest/index.js",
6
6
  "inherits": [
@@ -25,41 +25,41 @@
25
25
  "formatting": "run -T prettier --check ./src && run -T eslint ./src"
26
26
  },
27
27
  "dependencies": {
28
- "@aztec/accounts": "2.1.7-rc.3",
29
- "@aztec/archiver": "2.1.7-rc.3",
30
- "@aztec/aztec": "2.1.7-rc.3",
31
- "@aztec/aztec-node": "2.1.7-rc.3",
32
- "@aztec/aztec.js": "2.1.7-rc.3",
33
- "@aztec/bb-prover": "2.1.7-rc.3",
34
- "@aztec/blob-lib": "2.1.7-rc.3",
35
- "@aztec/blob-sink": "2.1.7-rc.3",
36
- "@aztec/bot": "2.1.7-rc.3",
37
- "@aztec/cli": "2.1.7-rc.3",
38
- "@aztec/constants": "2.1.7-rc.3",
39
- "@aztec/entrypoints": "2.1.7-rc.3",
40
- "@aztec/epoch-cache": "2.1.7-rc.3",
41
- "@aztec/ethereum": "2.1.7-rc.3",
42
- "@aztec/foundation": "2.1.7-rc.3",
43
- "@aztec/kv-store": "2.1.7-rc.3",
44
- "@aztec/l1-artifacts": "2.1.7-rc.3",
45
- "@aztec/merkle-tree": "2.1.7-rc.3",
46
- "@aztec/node-keystore": "2.1.7-rc.3",
47
- "@aztec/noir-contracts.js": "2.1.7-rc.3",
48
- "@aztec/noir-noirc_abi": "2.1.7-rc.3",
49
- "@aztec/noir-protocol-circuits-types": "2.1.7-rc.3",
50
- "@aztec/noir-test-contracts.js": "2.1.7-rc.3",
51
- "@aztec/p2p": "2.1.7-rc.3",
52
- "@aztec/protocol-contracts": "2.1.7-rc.3",
53
- "@aztec/prover-client": "2.1.7-rc.3",
54
- "@aztec/prover-node": "2.1.7-rc.3",
55
- "@aztec/pxe": "2.1.7-rc.3",
56
- "@aztec/sequencer-client": "2.1.7-rc.3",
57
- "@aztec/simulator": "2.1.7-rc.3",
58
- "@aztec/slasher": "2.1.7-rc.3",
59
- "@aztec/stdlib": "2.1.7-rc.3",
60
- "@aztec/telemetry-client": "2.1.7-rc.3",
61
- "@aztec/validator-client": "2.1.7-rc.3",
62
- "@aztec/world-state": "2.1.7-rc.3",
28
+ "@aztec/accounts": "2.1.7-rc.4",
29
+ "@aztec/archiver": "2.1.7-rc.4",
30
+ "@aztec/aztec": "2.1.7-rc.4",
31
+ "@aztec/aztec-node": "2.1.7-rc.4",
32
+ "@aztec/aztec.js": "2.1.7-rc.4",
33
+ "@aztec/bb-prover": "2.1.7-rc.4",
34
+ "@aztec/blob-lib": "2.1.7-rc.4",
35
+ "@aztec/blob-sink": "2.1.7-rc.4",
36
+ "@aztec/bot": "2.1.7-rc.4",
37
+ "@aztec/cli": "2.1.7-rc.4",
38
+ "@aztec/constants": "2.1.7-rc.4",
39
+ "@aztec/entrypoints": "2.1.7-rc.4",
40
+ "@aztec/epoch-cache": "2.1.7-rc.4",
41
+ "@aztec/ethereum": "2.1.7-rc.4",
42
+ "@aztec/foundation": "2.1.7-rc.4",
43
+ "@aztec/kv-store": "2.1.7-rc.4",
44
+ "@aztec/l1-artifacts": "2.1.7-rc.4",
45
+ "@aztec/merkle-tree": "2.1.7-rc.4",
46
+ "@aztec/node-keystore": "2.1.7-rc.4",
47
+ "@aztec/noir-contracts.js": "2.1.7-rc.4",
48
+ "@aztec/noir-noirc_abi": "2.1.7-rc.4",
49
+ "@aztec/noir-protocol-circuits-types": "2.1.7-rc.4",
50
+ "@aztec/noir-test-contracts.js": "2.1.7-rc.4",
51
+ "@aztec/p2p": "2.1.7-rc.4",
52
+ "@aztec/protocol-contracts": "2.1.7-rc.4",
53
+ "@aztec/prover-client": "2.1.7-rc.4",
54
+ "@aztec/prover-node": "2.1.7-rc.4",
55
+ "@aztec/pxe": "2.1.7-rc.4",
56
+ "@aztec/sequencer-client": "2.1.7-rc.4",
57
+ "@aztec/simulator": "2.1.7-rc.4",
58
+ "@aztec/slasher": "2.1.7-rc.4",
59
+ "@aztec/stdlib": "2.1.7-rc.4",
60
+ "@aztec/telemetry-client": "2.1.7-rc.4",
61
+ "@aztec/validator-client": "2.1.7-rc.4",
62
+ "@aztec/world-state": "2.1.7-rc.4",
63
63
  "@iarna/toml": "^2.2.5",
64
64
  "@jest/globals": "^30.0.0",
65
65
  "@noble/curves": "=1.0.0",
@@ -96,7 +96,7 @@
96
96
  "tslib": "^2.4.0",
97
97
  "typescript": "^5.3.3",
98
98
  "util": "^0.12.5",
99
- "viem": "npm:@spalladino/viem@2.38.2-eip7594.2",
99
+ "viem": "npm:@aztec/viem@2.38.2",
100
100
  "zod": "^3.23.8"
101
101
  },
102
102
  "devDependencies": {
@@ -3,6 +3,7 @@
3
3
  */
4
4
  import { type AztecNodeConfig, AztecNodeService } from '@aztec/aztec-node';
5
5
  import type { SentTx } from '@aztec/aztec.js';
6
+ import { range } from '@aztec/foundation/array';
6
7
  import { SecretValue } from '@aztec/foundation/config';
7
8
  import { addLogNameHandler, removeLogNameHandler } from '@aztec/foundation/log';
8
9
  import { bufferToHex } from '@aztec/foundation/string';
@@ -48,6 +49,7 @@ export async function createNodes(
48
49
  dataDirectory?: string,
49
50
  metricsPort?: number,
50
51
  indexOffset = 0,
52
+ validatorsPerNode = 1,
51
53
  ): Promise<AztecNodeService[]> {
52
54
  const nodePromises: Promise<AztecNodeService>[] = [];
53
55
  const loggerIdStorage = new AsyncLocalStorage<string>();
@@ -60,13 +62,18 @@ export async function createNodes(
60
62
  // We run on ports from the bootnode upwards
61
63
  const port = bootNodePort + 1 + index;
62
64
 
65
+ // Determine validator indices for this node
66
+ const validatorIndices = validatorsPerNode === 1 ? index : range(validatorsPerNode, validatorsPerNode * index);
67
+
68
+ // Assign data directory
63
69
  const dataDir = dataDirectory ? `${dataDirectory}-${index}` : undefined;
70
+
64
71
  const nodePromise = createNode(
65
72
  config,
66
73
  dateProvider,
67
74
  port,
68
75
  bootstrapNodeEnr,
69
- index,
76
+ validatorIndices,
70
77
  prefilledPublicData,
71
78
  dataDir,
72
79
  metricsPort,
@@ -92,7 +99,7 @@ export async function createNode(
92
99
  dateProvider: DateProvider,
93
100
  tcpPort: number,
94
101
  bootstrapNode: string | undefined,
95
- addressIndex: number,
102
+ addressIndex: number | number[],
96
103
  prefilledPublicData?: PublicDataTreeLeaf[],
97
104
  dataDirectory?: string,
98
105
  metricsPort?: number,
@@ -196,16 +203,23 @@ export async function createValidatorConfig(
196
203
  config: AztecNodeConfig,
197
204
  bootstrapNodeEnr?: string,
198
205
  port?: number,
199
- addressIndex: number = 1,
206
+ addressIndex: number | number[] = 1,
200
207
  dataDirectory?: string,
201
208
  ) {
202
- const attesterPrivateKey = bufferToHex(getPrivateKeyFromIndex(ATTESTER_PRIVATE_KEYS_START_INDEX + addressIndex)!);
209
+ const addressIndices = Array.isArray(addressIndex) ? addressIndex : [addressIndex];
210
+ if (addressIndices.length === 0) {
211
+ throw new Error('At least one address index must be provided to create a validator config');
212
+ }
213
+
214
+ const attesterPrivateKeys = addressIndices.map(index =>
215
+ bufferToHex(getPrivateKeyFromIndex(ATTESTER_PRIVATE_KEYS_START_INDEX + index)!),
216
+ );
203
217
  const p2pConfig = await createP2PConfig(config, bootstrapNodeEnr, port, dataDirectory);
204
218
  const nodeConfig: AztecNodeConfig = {
205
219
  ...config,
206
220
  ...p2pConfig,
207
- validatorPrivateKeys: new SecretValue([attesterPrivateKey]),
208
- publisherPrivateKeys: [new SecretValue(attesterPrivateKey)],
221
+ validatorPrivateKeys: new SecretValue(attesterPrivateKeys),
222
+ publisherPrivateKeys: [new SecretValue(attesterPrivateKeys[0])],
209
223
  };
210
224
 
211
225
  return nodeConfig;