@aztec/end-to-end 3.0.0-rc.5 → 4.0.0-nightly.20260107

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 (41) hide show
  1. package/dest/bench/client_flows/data_extractor.js +3 -1
  2. package/dest/bench/utils.d.ts +2 -2
  3. package/dest/bench/utils.d.ts.map +1 -1
  4. package/dest/bench/utils.js +10 -6
  5. package/dest/e2e_epochs/epochs_test.d.ts +2 -1
  6. package/dest/e2e_epochs/epochs_test.d.ts.map +1 -1
  7. package/dest/e2e_epochs/epochs_test.js +8 -5
  8. package/dest/e2e_fees/fees_test.d.ts +3 -1
  9. package/dest/e2e_fees/fees_test.d.ts.map +1 -1
  10. package/dest/e2e_fees/fees_test.js +4 -2
  11. package/dest/e2e_p2p/p2p_network.js +1 -1
  12. package/dest/e2e_p2p/shared.d.ts +1 -1
  13. package/dest/e2e_p2p/shared.d.ts.map +1 -1
  14. package/dest/e2e_p2p/shared.js +4 -4
  15. package/dest/fixtures/e2e_prover_test.d.ts +1 -3
  16. package/dest/fixtures/e2e_prover_test.d.ts.map +1 -1
  17. package/dest/fixtures/e2e_prover_test.js +6 -9
  18. package/dest/fixtures/fixtures.d.ts +2 -3
  19. package/dest/fixtures/fixtures.d.ts.map +1 -1
  20. package/dest/fixtures/fixtures.js +1 -2
  21. package/dest/fixtures/snapshot_manager.d.ts +1 -3
  22. package/dest/fixtures/snapshot_manager.d.ts.map +1 -1
  23. package/dest/fixtures/snapshot_manager.js +5 -32
  24. package/dest/fixtures/utils.d.ts +7 -4
  25. package/dest/fixtures/utils.d.ts.map +1 -1
  26. package/dest/fixtures/utils.js +16 -24
  27. package/dest/spartan/utils.d.ts +37 -6
  28. package/dest/spartan/utils.d.ts.map +1 -1
  29. package/dest/spartan/utils.js +137 -27
  30. package/package.json +38 -38
  31. package/src/bench/client_flows/data_extractor.ts +1 -1
  32. package/src/bench/utils.ts +11 -7
  33. package/src/e2e_epochs/epochs_test.ts +20 -7
  34. package/src/e2e_fees/fees_test.ts +5 -4
  35. package/src/e2e_p2p/p2p_network.ts +1 -1
  36. package/src/e2e_p2p/shared.ts +6 -5
  37. package/src/fixtures/e2e_prover_test.ts +4 -7
  38. package/src/fixtures/fixtures.ts +1 -3
  39. package/src/fixtures/snapshot_manager.ts +7 -41
  40. package/src/fixtures/utils.ts +15 -28
  41. package/src/spartan/utils.ts +192 -18
@@ -11,8 +11,7 @@ import {
11
11
  TestCircuitVerifier,
12
12
  } from '@aztec/bb-prover';
13
13
  import { BackendType, Barretenberg } from '@aztec/bb.js';
14
- import { createBlobSinkClient } from '@aztec/blob-sink/client';
15
- import type { BlobSinkServer } from '@aztec/blob-sink/server';
14
+ import { createBlobClientWithFileStores } from '@aztec/blob-client/client';
16
15
  import type { DeployAztecL1ContractsReturnType } from '@aztec/ethereum/deploy-aztec-l1-contracts';
17
16
  import { Buffer32 } from '@aztec/foundation/buffer';
18
17
  import { SecretValue } from '@aztec/foundation/config';
@@ -69,7 +68,6 @@ export class FullProverTest {
69
68
  aztecNode!: AztecNode;
70
69
  aztecNodeAdmin!: AztecNodeAdmin;
71
70
  cheatCodes!: CheatCodes;
72
- blobSink!: BlobSinkServer;
73
71
  private provenComponents: ProvenSetup[] = [];
74
72
  private bbConfigCleanup?: () => Promise<void>;
75
73
  private acvmConfigCleanup?: () => Promise<void>;
@@ -169,11 +167,11 @@ export class FullProverTest {
169
167
  aztecNode: this.aztecNode,
170
168
  deployL1ContractsValues: this.l1Contracts,
171
169
  cheatCodes: this.cheatCodes,
172
- blobSink: this.blobSink,
173
170
  } = this.context);
174
171
  this.aztecNodeAdmin = this.context.aztecNode;
175
172
 
176
- const blobSinkClient = createBlobSinkClient({ blobSinkUrl: `http://localhost:${this.blobSink.port}` });
173
+ const config = this.context.aztecNodeConfig;
174
+ const blobClient = await createBlobClientWithFileStores(config, this.logger);
177
175
 
178
176
  // Configure a full prover PXE
179
177
  let acvmConfig: Awaited<ReturnType<typeof getACVMConfig>> | undefined;
@@ -243,7 +241,7 @@ export class FullProverTest {
243
241
  this.logger.verbose('Starting archiver for new prover node');
244
242
  const archiver = await createArchiver(
245
243
  { ...this.context.aztecNodeConfig, dataDirectory: undefined },
246
- { blobSinkClient, dateProvider: this.context.dateProvider },
244
+ { blobClient, dateProvider: this.context.dateProvider },
247
245
  { blockUntilSync: true },
248
246
  );
249
247
 
@@ -283,7 +281,6 @@ export class FullProverTest {
283
281
  {
284
282
  aztecNodeTxProvider: this.aztecNode,
285
283
  archiver: archiver as Archiver,
286
- blobSinkClient,
287
284
  },
288
285
  { prefilledPublicData },
289
286
  );
@@ -8,7 +8,7 @@ export const shouldCollectMetrics = () => {
8
8
  };
9
9
 
10
10
  export const TEST_PEER_CHECK_INTERVAL_MS = 1000;
11
- export const TEST_MAX_TX_POOL_SIZE = 2 * 1024 * 1024 * 1024; // 2GB
11
+ export const TEST_MAX_PENDING_TX_POOL_COUNT = 10_000; // Number of max pending TXs ~ 1.56GB
12
12
 
13
13
  export const MNEMONIC = 'test test test test test test test test test test test junk';
14
14
  export const privateKey = Buffer.from('ac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80', 'hex');
@@ -24,5 +24,3 @@ export const NO_L1_TO_L2_MSG_ERROR =
24
24
  /No non-nullified L1 to L2 message found for message hash|Tried to consume nonexistent L1-to-L2 message/;
25
25
  export const STATIC_CALL_STATE_MODIFICATION_ERROR = /Static call cannot update the state.*/;
26
26
  export const STATIC_CONTEXT_ASSERTION_ERROR = /Assertion failed: Function .* can only be called statically.*/;
27
-
28
- export const DEFAULT_BLOB_SINK_PORT = '5052';
@@ -9,7 +9,6 @@ import type { Logger } from '@aztec/aztec.js/log';
9
9
  import type { AztecNode } from '@aztec/aztec.js/node';
10
10
  import type { Wallet } from '@aztec/aztec.js/wallet';
11
11
  import { AnvilTestWatcher, CheatCodes } from '@aztec/aztec/testing';
12
- import { type BlobSinkServer, createBlobSinkServer } from '@aztec/blob-sink/server';
13
12
  import { createExtendedL1Client } from '@aztec/ethereum/client';
14
13
  import { getL1ContractsConfigEnvVars } from '@aztec/ethereum/config';
15
14
  import { deployMulticall3 } from '@aztec/ethereum/contracts';
@@ -40,14 +39,13 @@ import type { Anvil } from '@viem/anvil';
40
39
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';
41
40
  import { copySync, removeSync } from 'fs-extra/esm';
42
41
  import fs from 'fs/promises';
43
- import getPort from 'get-port';
44
42
  import { tmpdir } from 'os';
45
43
  import path, { join } from 'path';
46
44
  import type { Hex } from 'viem';
47
45
  import { mnemonicToAccount } from 'viem/accounts';
48
46
  import { foundry } from 'viem/chains';
49
47
 
50
- import { MNEMONIC, TEST_MAX_TX_POOL_SIZE, TEST_PEER_CHECK_INTERVAL_MS } from './fixtures.js';
48
+ import { MNEMONIC, TEST_MAX_PENDING_TX_POOL_COUNT, TEST_PEER_CHECK_INTERVAL_MS } from './fixtures.js';
51
49
  import { getACVMConfig } from './get_acvm_config.js';
52
50
  import { getBBConfig } from './get_bb_config.js';
53
51
  import {
@@ -56,6 +54,7 @@ import {
56
54
  getLogger,
57
55
  getPrivateKeyFromIndex,
58
56
  getSponsoredFPCAddress,
57
+ setupSharedBlobStorage,
59
58
  } from './utils.js';
60
59
  import { getEndToEndTestTelemetryClient } from './with_telemetry_utils.js';
61
60
 
@@ -72,7 +71,6 @@ export type SubsystemsContext = {
72
71
  cheatCodes: CheatCodes;
73
72
  sequencer: SequencerClient;
74
73
  dateProvider: TestDateProvider;
75
- blobSink: BlobSinkServer;
76
74
  initialFundedAccounts: InitialAccountData[];
77
75
  directoryToCleanup?: string;
78
76
  };
@@ -275,7 +273,6 @@ async function teardown(context: SubsystemsContext | undefined) {
275
273
  await context.bbConfig?.cleanup();
276
274
  await tryStop(context.anvil);
277
275
  await tryStop(context.watcher);
278
- await tryStop(context.blobSink);
279
276
  await tryRmDir(context.directoryToCleanup, logger);
280
277
  } catch (err) {
281
278
  logger.error('Error during teardown', err);
@@ -297,8 +294,6 @@ async function setupFromFresh(
297
294
  ): Promise<SubsystemsContext> {
298
295
  logger.verbose(`Initializing state...`);
299
296
 
300
- const blobSinkPort = await getPort();
301
-
302
297
  // Default to no slashing
303
298
  opts.slasherFlavor ??= 'none';
304
299
  deployL1ContractsArgs.slasherFlavor ??= opts.slasherFlavor;
@@ -307,7 +302,7 @@ async function setupFromFresh(
307
302
  // TODO: For some reason this is currently the union of a bunch of subsystems. That needs fixing.
308
303
  const aztecNodeConfig: AztecNodeConfig & SetupOptions = { ...getConfigEnvVars(), ...opts };
309
304
  aztecNodeConfig.peerCheckIntervalMS = TEST_PEER_CHECK_INTERVAL_MS;
310
- aztecNodeConfig.maxTxPoolSize = opts.maxTxPoolSize ?? TEST_MAX_TX_POOL_SIZE;
305
+ aztecNodeConfig.maxPendingTxCount = opts.maxPendingTxCount ?? TEST_MAX_PENDING_TX_POOL_COUNT;
311
306
  // Only enable proving if specifically requested.
312
307
  aztecNodeConfig.realProofs = !!opts.realProofs;
313
308
  // Only enforce the time table if requested
@@ -326,7 +321,8 @@ async function setupFromFresh(
326
321
  } else {
327
322
  aztecNodeConfig.dataDirectory = statePath;
328
323
  }
329
- aztecNodeConfig.blobSinkUrl = `http://127.0.0.1:${blobSinkPort}`;
324
+
325
+ await setupSharedBlobStorage(aztecNodeConfig);
330
326
 
331
327
  const hdAccount = mnemonicToAccount(MNEMONIC, { addressIndex: 0 });
332
328
  const publisherPrivKeyRaw = hdAccount.getHdKey().privateKey;
@@ -413,20 +409,6 @@ async function setupFromFresh(
413
409
 
414
410
  const telemetry = await getEndToEndTestTelemetryClient(opts.metricsPort);
415
411
 
416
- // Setup blob sink service
417
- const blobSink = await createBlobSinkServer(
418
- {
419
- l1ChainId: aztecNodeConfig.l1ChainId,
420
- l1RpcUrls: aztecNodeConfig.l1RpcUrls,
421
- l1Contracts: aztecNodeConfig.l1Contracts,
422
- port: blobSinkPort,
423
- dataDirectory: aztecNodeConfig.dataDirectory,
424
- dataStoreMapSizeKb: aztecNodeConfig.dataStoreMapSizeKb,
425
- },
426
- telemetry,
427
- );
428
- await blobSink.start();
429
-
430
412
  logger.info('Creating and synching an aztec node...');
431
413
  const aztecNode = await AztecNodeService.createAndSync(
432
414
  aztecNodeConfig,
@@ -476,7 +458,6 @@ async function setupFromFresh(
476
458
  watcher,
477
459
  cheatCodes,
478
460
  dateProvider,
479
- blobSink,
480
461
  initialFundedAccounts,
481
462
  directoryToCleanup,
482
463
  };
@@ -491,18 +472,16 @@ async function setupFromState(statePath: string, logger: Logger): Promise<Subsys
491
472
  const directoryToCleanup = path.join(tmpdir(), randomBytes(8).toString('hex'));
492
473
  await fs.mkdir(directoryToCleanup, { recursive: true });
493
474
 
494
- // Run the blob sink on a random port
495
- const blobSinkPort = await getPort();
496
-
497
475
  // TODO: For some reason this is currently the union of a bunch of subsystems. That needs fixing.
498
476
  const aztecNodeConfig: AztecNodeConfig & SetupOptions = JSON.parse(
499
477
  readFileSync(`${statePath}/aztec_node_config.json`, 'utf-8'),
500
478
  reviver,
501
479
  );
502
480
  aztecNodeConfig.dataDirectory = statePath;
503
- aztecNodeConfig.blobSinkUrl = `http://127.0.0.1:${blobSinkPort}`;
504
481
  aztecNodeConfig.listenAddress = '127.0.0.1';
505
482
 
483
+ await setupSharedBlobStorage(aztecNodeConfig);
484
+
506
485
  const initialFundedAccounts: InitialAccountData[] =
507
486
  JSON.parse(readFileSync(`${statePath}/accounts.json`, 'utf-8'), reviver) || [];
508
487
  const { prefilledPublicData } = await getGenesisValues(initialFundedAccounts.map(a => a.address));
@@ -542,18 +521,6 @@ async function setupFromState(statePath: string, logger: Logger): Promise<Subsys
542
521
  await watcher.start();
543
522
 
544
523
  const telemetry = await initTelemetryClient(getTelemetryConfig());
545
- const blobSink = await createBlobSinkServer(
546
- {
547
- l1ChainId: aztecNodeConfig.l1ChainId,
548
- l1RpcUrls: aztecNodeConfig.l1RpcUrls,
549
- l1Contracts: aztecNodeConfig.l1Contracts,
550
- port: blobSinkPort,
551
- dataDirectory: statePath,
552
- dataStoreMapSizeKb: aztecNodeConfig.dataStoreMapSizeKb,
553
- },
554
- telemetry,
555
- );
556
- await blobSink.start();
557
524
 
558
525
  logger.verbose('Creating aztec node...');
559
526
  const aztecNode = await AztecNodeService.createAndSync(
@@ -603,7 +570,6 @@ async function setupFromState(statePath: string, logger: Logger): Promise<Subsys
603
570
  watcher,
604
571
  cheatCodes,
605
572
  dateProvider,
606
- blobSink,
607
573
  initialFundedAccounts,
608
574
  directoryToCleanup,
609
575
  };
@@ -10,8 +10,7 @@ import { type Logger, createLogger } from '@aztec/aztec.js/log';
10
10
  import { type AztecNode, createAztecNodeClient, waitForNode } from '@aztec/aztec.js/node';
11
11
  import type { Wallet } from '@aztec/aztec.js/wallet';
12
12
  import { AnvilTestWatcher, CheatCodes } from '@aztec/aztec/testing';
13
- import { createBlobSinkClient } from '@aztec/blob-sink/client';
14
- import { type BlobSinkServer, createBlobSinkServer } from '@aztec/blob-sink/server';
13
+ import { createBlobClientWithFileStores } from '@aztec/blob-client/client';
15
14
  import { SPONSORED_FPC_SALT } from '@aztec/constants';
16
15
  import { isAnvilTestChain } from '@aztec/ethereum/chain';
17
16
  import { createExtendedL1Client } from '@aztec/ethereum/client';
@@ -70,7 +69,6 @@ import { getGenesisValues } from '@aztec/world-state/testing';
70
69
  import type { Anvil } from '@viem/anvil';
71
70
  import { randomBytes } from 'crypto';
72
71
  import fs from 'fs/promises';
73
- import getPort from 'get-port';
74
72
  import { tmpdir } from 'os';
75
73
  import * as path from 'path';
76
74
  import type { Hex } from 'viem';
@@ -91,6 +89,16 @@ import { isMetricsLoggingRequested, setupMetricsLogger } from './logging.js';
91
89
  export { deployAndInitializeTokenAndBridgeContracts } from '../shared/cross_chain_test_harness.js';
92
90
  export { startAnvil };
93
91
 
92
+ /**
93
+ * Sets up shared blob storage using FileStore in the data directory.
94
+ */
95
+ export async function setupSharedBlobStorage(config: { dataDirectory?: string } & Record<string, any>): Promise<void> {
96
+ const sharedBlobPath = path.join(config.dataDirectory!, 'shared-blobs');
97
+ await fs.mkdir(sharedBlobPath, { recursive: true });
98
+ config.blobFileStoreUrls = [`file://${sharedBlobPath}`];
99
+ config.blobFileStoreUploadUrl = `file://${sharedBlobPath}`;
100
+ }
101
+
94
102
  const { AZTEC_NODE_URL = '' } = process.env;
95
103
  const getAztecUrl = () => AZTEC_NODE_URL;
96
104
 
@@ -232,7 +240,6 @@ async function setupWithRemoteEnvironment(
232
240
  mockGossipSubNetwork: undefined,
233
241
  watcher: undefined,
234
242
  dateProvider: undefined,
235
- blobSink: undefined,
236
243
  telemetryClient: undefined,
237
244
  teardown,
238
245
  };
@@ -312,8 +319,6 @@ export type EndToEndContext = {
312
319
  watcher: AnvilTestWatcher | undefined;
313
320
  /** Allows tweaking current system time, used by the epoch cache only (undefined if connected to remote environment) */
314
321
  dateProvider: TestDateProvider | undefined;
315
- /** The blob sink (undefined if connected to remote environment) */
316
- blobSink: BlobSinkServer | undefined;
317
322
  /** Telemetry client */
318
323
  telemetryClient: TelemetryClient | undefined;
319
324
  /** Mock gossip sub network used for gossipping messages (only if mockGossipSubNetwork was set to true in opts) */
@@ -489,21 +494,7 @@ export async function setup(
489
494
 
490
495
  const telemetry = await getTelemetryClient(opts.telemetryConfig);
491
496
 
492
- // Blob sink service - blobs get posted here and served from here
493
- const blobSinkPort = await getPort();
494
- const blobSink = await createBlobSinkServer(
495
- {
496
- l1ChainId: config.l1ChainId,
497
- l1RpcUrls: config.l1RpcUrls,
498
- l1Contracts: config.l1Contracts,
499
- port: blobSinkPort,
500
- dataDirectory: config.dataDirectory,
501
- dataStoreMapSizeKb: config.dataStoreMapSizeKb,
502
- },
503
- telemetry,
504
- );
505
- await blobSink.start();
506
- config.blobSinkUrl = `http://localhost:${blobSinkPort}`;
497
+ await setupSharedBlobStorage(config);
507
498
 
508
499
  logger.verbose('Creating and synching an aztec node', config);
509
500
 
@@ -519,8 +510,6 @@ export async function setup(
519
510
  config.bbWorkingDirectory = bbConfig.bbWorkingDirectory;
520
511
  }
521
512
 
522
- const blobSinkClient = createBlobSinkClient(config, { logger: createLogger('node:blob-sink:client') });
523
-
524
513
  let mockGossipSubNetwork: MockGossipSubNetwork | undefined;
525
514
  let p2pClientDeps: P2PClientDeps<P2PClientType.Full> | undefined = undefined;
526
515
 
@@ -559,7 +548,7 @@ export async function setup(
559
548
 
560
549
  const aztecNode = await AztecNodeService.createAndSync(
561
550
  config, // REFACTOR: createAndSync mutates this config
562
- { dateProvider, blobSinkClient, telemetry, p2pClientDeps, logger: createLogger('node:MAIN-aztec-node') },
551
+ { dateProvider, telemetry, p2pClientDeps, logger: createLogger('node:MAIN-aztec-node') },
563
552
  { prefilledPublicData },
564
553
  );
565
554
  const sequencerClient = aztecNode.getSequencer();
@@ -647,7 +636,6 @@ export async function setup(
647
636
  await tryStop(watcher, logger);
648
637
  await tryStop(anvil, logger);
649
638
 
650
- await tryStop(blobSink, logger);
651
639
  await tryRmDir(directoryToCleanup, logger);
652
640
  } catch (err) {
653
641
  logger.error(`Error during e2e test teardown`, err);
@@ -657,7 +645,6 @@ export async function setup(
657
645
  return {
658
646
  aztecNode,
659
647
  aztecNodeAdmin: aztecNode,
660
- blobSink,
661
648
  cheatCodes,
662
649
  ethCheatCodes,
663
650
  config,
@@ -852,13 +839,13 @@ export function createAndSyncProverNode(
852
839
  stop: () => Promise.resolve(),
853
840
  };
854
841
 
855
- const blobSinkClient = createBlobSinkClient(aztecNodeConfig);
842
+ const blobClient = await createBlobClientWithFileStores(aztecNodeConfig, createLogger('blob-client:prover-node'));
856
843
 
857
844
  // Creating temp store and archiver for simulated prover node
858
845
  const archiverConfig = { ...aztecNodeConfig, dataDirectory: proverNodeConfig.dataDirectory };
859
846
  const archiver = await createArchiver(
860
847
  archiverConfig,
861
- { blobSinkClient, dateProvider: proverNodeDeps.dateProvider },
848
+ { blobClient, dateProvider: proverNodeDeps.dateProvider },
862
849
  { blockUntilSync: true },
863
850
  );
864
851