@aztec/aztec-node 0.15.1 → 0.16.1

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.
@@ -1,5 +1,7 @@
1
+ import { LogFn } from '@aztec/foundation/log';
1
2
  import { LevelDown } from 'leveldown';
2
3
  import { LevelUp } from 'levelup';
4
+ import { RootDatabase } from 'lmdb';
3
5
  import { MemDown } from 'memdown';
4
6
  import { AztecNodeConfig } from './config.js';
5
7
  export declare const createMemDown: () => MemDown<any, any>;
@@ -10,5 +12,5 @@ export declare const createLevelDown: (path: string) => LevelDown;
10
12
  * @throws If `config.dataDirectory` is set and the directory cannot be created.
11
13
  * @returns The database for the aztec node.
12
14
  */
13
- export declare function openDb(config: AztecNodeConfig): Promise<LevelUp>;
15
+ export declare function openDb(config: AztecNodeConfig, log: LogFn): Promise<[nodeDb: RootDatabase, worldStateDb: LevelUp]>;
14
16
  //# sourceMappingURL=db.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/aztec-node/db.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAwB,MAAM,WAAW,CAAC;AAC5D,OAAO,EAAE,OAAO,EAAsB,MAAM,SAAS,CAAC;AACtD,OAAO,EAAE,OAAO,EAAsB,MAAM,SAAS,CAAC;AAItD,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,eAAO,MAAM,aAAa,yBAAgD,CAAC;AAC3E,eAAO,MAAM,eAAe,SAAU,MAAM,cAA0C,CAAC;AAevF;;;;;GAKG;AACH,wBAAsB,MAAM,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC,CAyBtE"}
1
+ {"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/aztec-node/db.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAE9C,OAAO,EAAE,SAAS,EAAwB,MAAM,WAAW,CAAC;AAC5D,OAAO,EAAE,OAAO,EAAsB,MAAM,SAAS,CAAC;AACtD,OAAO,EAAE,YAAY,EAAQ,MAAM,MAAM,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAsB,MAAM,SAAS,CAAC;AAItD,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,eAAO,MAAM,aAAa,yBAAgD,CAAC;AAC3E,eAAO,MAAM,eAAe,SAAU,MAAM,cAA0C,CAAC;AAgBvF;;;;;GAKG;AACH,wBAAsB,MAAM,CAC1B,MAAM,EAAE,eAAe,EACvB,GAAG,EAAE,KAAK,GACT,OAAO,CAAC,CAAC,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC,CA6BxD"}
@@ -1,11 +1,13 @@
1
1
  import { default as leveldown } from 'leveldown';
2
2
  import { default as levelup } from 'levelup';
3
+ import { open } from 'lmdb';
3
4
  import { default as memdown } from 'memdown';
4
5
  import { mkdir } from 'node:fs/promises';
5
6
  import { join } from 'node:path';
6
7
  export const createMemDown = () => memdown();
7
8
  export const createLevelDown = (path) => leveldown(path);
8
9
  const DB_SUBDIR = 'aztec-node';
10
+ const WORLD_STATE_SUBDIR = 'aztec-world-state';
9
11
  const NODE_METADATA_KEY = '@@aztec_node_metadata';
10
12
  /**
11
13
  * Opens the database for the aztec node. If a data directory is specified, then this attempts to create it.
@@ -13,42 +15,50 @@ const NODE_METADATA_KEY = '@@aztec_node_metadata';
13
15
  * @throws If `config.dataDirectory` is set and the directory cannot be created.
14
16
  * @returns The database for the aztec node.
15
17
  */
16
- export async function openDb(config) {
18
+ export async function openDb(config, log) {
17
19
  const nodeMetadata = {
18
20
  rollupContractAddress: config.l1Contracts.rollupAddress.toString(),
19
21
  };
20
- let db;
22
+ let nodeDb;
23
+ let worldStateDb;
21
24
  if (config.dataDirectory) {
22
- const dbDir = join(config.dataDirectory, DB_SUBDIR);
25
+ const nodeDir = join(config.dataDirectory, DB_SUBDIR);
26
+ const worldStateDir = join(config.dataDirectory, WORLD_STATE_SUBDIR);
23
27
  // this throws if we don't have permissions to create the directory
24
- await mkdir(dbDir, { recursive: true });
25
- db = levelup(createLevelDown(dbDir));
28
+ await mkdir(nodeDir, { recursive: true });
29
+ await mkdir(worldStateDir, { recursive: true });
30
+ log(`Opening aztec-node database at ${nodeDir}`);
31
+ nodeDb = open(nodeDir, {});
32
+ log(`Opening world-state database at ${worldStateDir}`);
33
+ worldStateDb = levelup(createLevelDown(worldStateDir));
26
34
  }
27
35
  else {
28
- db = levelup(createMemDown());
36
+ log('Opening temporary databases');
37
+ // not passing a path will use a temp file that gets deleted when the process exits
38
+ nodeDb = open({});
39
+ worldStateDb = levelup(createMemDown());
29
40
  }
30
- const prevNodeMetadata = await getNodeMetadata(db);
31
- // if the rollup addresses are different, wipe the local database and start over
32
- if (nodeMetadata.rollupContractAddress !== prevNodeMetadata.rollupContractAddress) {
33
- await db.clear();
34
- }
35
- await db.put(NODE_METADATA_KEY, JSON.stringify(nodeMetadata));
36
- return db;
41
+ await checkNodeMetadataAndClear(nodeDb, worldStateDb, nodeMetadata, log);
42
+ return [nodeDb, worldStateDb];
37
43
  }
38
44
  /**
39
- * Gets the metadata for the aztec node.
40
- * @param db - The database for the aztec node.
41
- * @returns Node metadata.
45
+ * Checks the node metadata and clears the database if the rollup contract address has changed.
46
+ * @param nodeDb - The database for the aztec node.
47
+ * @param nodeMetadata - The metadata for the aztec node.
42
48
  */
43
- async function getNodeMetadata(db) {
49
+ async function checkNodeMetadataAndClear(nodeDb, worldStateDb, nodeMetadata, log) {
50
+ const metadataDB = nodeDb.openDB('metadata', {});
44
51
  try {
45
- const value = await db.get(NODE_METADATA_KEY);
46
- return JSON.parse(value.toString('utf-8'));
52
+ const existing = metadataDB.get(NODE_METADATA_KEY);
53
+ // if the rollup addresses are different, wipe the local database and start over
54
+ if (!existing || existing.rollupContractAddress !== nodeMetadata.rollupContractAddress) {
55
+ log('Rollup contract address has changed, clearing databases');
56
+ await Promise.all([nodeDb.clearAsync(), worldStateDb.clear()]);
57
+ }
58
+ await metadataDB.put(NODE_METADATA_KEY, nodeMetadata);
47
59
  }
48
- catch {
49
- return {
50
- rollupContractAddress: '',
51
- };
60
+ finally {
61
+ await metadataDB.close();
52
62
  }
53
63
  }
54
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXp0ZWMtbm9kZS9kYi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWEsT0FBTyxJQUFJLFNBQVMsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUM1RCxPQUFPLEVBQVcsT0FBTyxJQUFJLE9BQU8sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUN0RCxPQUFPLEVBQVcsT0FBTyxJQUFJLE9BQU8sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUN0RCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDekMsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUlqQyxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUcsR0FBRyxFQUFFLENBQUUsT0FBZSxFQUF1QixDQUFDO0FBQzNFLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxDQUFDLElBQVksRUFBRSxFQUFFLENBQUUsU0FBaUIsQ0FBQyxJQUFJLENBQWMsQ0FBQztBQUV2RixNQUFNLFNBQVMsR0FBRyxZQUFZLENBQUM7QUFDL0IsTUFBTSxpQkFBaUIsR0FBRyx1QkFBdUIsQ0FBQztBQVlsRDs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsTUFBTSxDQUFDLE1BQXVCO0lBQ2xELE1BQU0sWUFBWSxHQUFpQjtRQUNqQyxxQkFBcUIsRUFBRSxNQUFNLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUU7S0FDbkUsQ0FBQztJQUVGLElBQUksRUFBVyxDQUFDO0lBRWhCLElBQUksTUFBTSxDQUFDLGFBQWEsRUFBRTtRQUN4QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNwRCxtRUFBbUU7UUFDbkUsTUFBTSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDeEMsRUFBRSxHQUFHLE9BQU8sQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztLQUN0QztTQUFNO1FBQ0wsRUFBRSxHQUFHLE9BQU8sQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDO0tBQy9CO0lBRUQsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLGVBQWUsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUVuRCxnRkFBZ0Y7SUFDaEYsSUFBSSxZQUFZLENBQUMscUJBQXFCLEtBQUssZ0JBQWdCLENBQUMscUJBQXFCLEVBQUU7UUFDakYsTUFBTSxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7S0FDbEI7SUFFRCxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO0lBQzlELE9BQU8sRUFBRSxDQUFDO0FBQ1osQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxLQUFLLFVBQVUsZUFBZSxDQUFDLEVBQVc7SUFDeEMsSUFBSTtRQUNGLE1BQU0sS0FBSyxHQUFXLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ3RELE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7S0FDNUM7SUFBQyxNQUFNO1FBQ04sT0FBTztZQUNMLHFCQUFxQixFQUFFLEVBQUU7U0FDMUIsQ0FBQztLQUNIO0FBQ0gsQ0FBQyJ9
64
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXp0ZWMtbm9kZS9kYi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQWEsT0FBTyxJQUFJLFNBQVMsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUM1RCxPQUFPLEVBQVcsT0FBTyxJQUFJLE9BQU8sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUN0RCxPQUFPLEVBQWdCLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMxQyxPQUFPLEVBQVcsT0FBTyxJQUFJLE9BQU8sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUN0RCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDekMsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUlqQyxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUcsR0FBRyxFQUFFLENBQUUsT0FBZSxFQUF1QixDQUFDO0FBQzNFLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxDQUFDLElBQVksRUFBRSxFQUFFLENBQUUsU0FBaUIsQ0FBQyxJQUFJLENBQWMsQ0FBQztBQUV2RixNQUFNLFNBQVMsR0FBRyxZQUFZLENBQUM7QUFDL0IsTUFBTSxrQkFBa0IsR0FBRyxtQkFBbUIsQ0FBQztBQUMvQyxNQUFNLGlCQUFpQixHQUFHLHVCQUF1QixDQUFDO0FBWWxEOzs7OztHQUtHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxNQUFNLENBQzFCLE1BQXVCLEVBQ3ZCLEdBQVU7SUFFVixNQUFNLFlBQVksR0FBaUI7UUFDakMscUJBQXFCLEVBQUUsTUFBTSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFO0tBQ25FLENBQUM7SUFFRixJQUFJLE1BQW9CLENBQUM7SUFDekIsSUFBSSxZQUFxQixDQUFDO0lBRTFCLElBQUksTUFBTSxDQUFDLGFBQWEsRUFBRTtRQUN4QixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUN0RCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO1FBQ3JFLG1FQUFtRTtRQUNuRSxNQUFNLEtBQUssQ0FBQyxPQUFPLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUMxQyxNQUFNLEtBQUssQ0FBQyxhQUFhLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUVoRCxHQUFHLENBQUMsa0NBQWtDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDakQsTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFM0IsR0FBRyxDQUFDLG1DQUFtQyxhQUFhLEVBQUUsQ0FBQyxDQUFDO1FBQ3hELFlBQVksR0FBRyxPQUFPLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7S0FDeEQ7U0FBTTtRQUNMLEdBQUcsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO1FBQ25DLG1GQUFtRjtRQUNuRixNQUFNLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2xCLFlBQVksR0FBRyxPQUFPLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQztLQUN6QztJQUVELE1BQU0seUJBQXlCLENBQUMsTUFBTSxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDekUsT0FBTyxDQUFDLE1BQU0sRUFBRSxZQUFZLENBQUMsQ0FBQztBQUNoQyxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILEtBQUssVUFBVSx5QkFBeUIsQ0FDdEMsTUFBb0IsRUFDcEIsWUFBcUIsRUFDckIsWUFBMEIsRUFDMUIsR0FBVTtJQUVWLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQXVCLFVBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUN2RSxJQUFJO1FBQ0YsTUFBTSxRQUFRLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ25ELGdGQUFnRjtRQUNoRixJQUFJLENBQUMsUUFBUSxJQUFJLFFBQVEsQ0FBQyxxQkFBcUIsS0FBSyxZQUFZLENBQUMscUJBQXFCLEVBQUU7WUFDdEYsR0FBRyxDQUFDLHlEQUF5RCxDQUFDLENBQUM7WUFDL0QsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxFQUFFLFlBQVksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDaEU7UUFDRCxNQUFNLFVBQVUsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLEVBQUUsWUFBWSxDQUFDLENBQUM7S0FDdkQ7WUFBUztRQUNSLE1BQU0sVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDO0tBQzFCO0FBQ0gsQ0FBQyJ9
@@ -3,9 +3,9 @@ import { L1ContractAddresses } from '@aztec/ethereum';
3
3
  import { AztecAddress } from '@aztec/foundation/aztec-address';
4
4
  import { P2P } from '@aztec/p2p';
5
5
  import { GlobalVariableBuilder, SequencerClient } from '@aztec/sequencer-client';
6
- import { AztecNode, ContractData, ContractDataSource, ExtendedContractData, GetUnencryptedLogsResponse, L1ToL2MessageAndIndex, L1ToL2MessageSource, L2Block, L2BlockL2Logs, L2BlockSource, L2LogsSource, L2Tx, LogFilter, LogType, MerkleTreeId, SiblingPath, Tx, TxHash } from '@aztec/types';
6
+ import { AztecNode, ContractData, ContractDataSource, ExtendedContractData, GetUnencryptedLogsResponse, L1ToL2MessageAndIndex, L1ToL2MessageSource, L2Block, L2BlockL2Logs, L2BlockSource, L2LogsSource, L2Tx, LogFilter, LogType, MerkleTreeId, SequencerConfig, SiblingPath, Tx, TxHash } from '@aztec/types';
7
7
  import { WorldStateSynchronizer } from '@aztec/world-state';
8
- import levelup from 'levelup';
8
+ import { LevelUp } from 'levelup';
9
9
  import { AztecNodeConfig } from './config.js';
10
10
  /**
11
11
  * The aztec node.
@@ -24,9 +24,9 @@ export declare class AztecNodeService implements AztecNode {
24
24
  protected readonly chainId: number;
25
25
  protected readonly version: number;
26
26
  protected readonly globalVariableBuilder: GlobalVariableBuilder;
27
- protected readonly merkleTreesDb: levelup.LevelUp;
27
+ protected readonly merkleTreesDb: LevelUp;
28
28
  private log;
29
- constructor(config: AztecNodeConfig, p2pClient: P2P, blockSource: L2BlockSource, encryptedLogsSource: L2LogsSource, unencryptedLogsSource: L2LogsSource, contractDataSource: ContractDataSource, l1ToL2MessageSource: L1ToL2MessageSource, worldStateSynchronizer: WorldStateSynchronizer, sequencer: SequencerClient | undefined, chainId: number, version: number, globalVariableBuilder: GlobalVariableBuilder, merkleTreesDb: levelup.LevelUp, log?: import("@aztec/foundation/log").DebugLogger);
29
+ constructor(config: AztecNodeConfig, p2pClient: P2P, blockSource: L2BlockSource, encryptedLogsSource: L2LogsSource, unencryptedLogsSource: L2LogsSource, contractDataSource: ContractDataSource, l1ToL2MessageSource: L1ToL2MessageSource, worldStateSynchronizer: WorldStateSynchronizer, sequencer: SequencerClient | undefined, chainId: number, version: number, globalVariableBuilder: GlobalVariableBuilder, merkleTreesDb: LevelUp, log?: import("@aztec/foundation/log").DebugLogger);
30
30
  /**
31
31
  * initializes the Aztec Node, wait for component to sync.
32
32
  * @param config - The configuration to be used by the aztec node.
@@ -182,5 +182,6 @@ export declare class AztecNodeService implements AztecNode {
182
182
  * @param tx - The transaction to simulate.
183
183
  **/
184
184
  simulatePublicCalls(tx: Tx): Promise<void>;
185
+ setConfig(config: Partial<SequencerConfig>): Promise<void>;
185
186
  }
186
187
  //# sourceMappingURL=server.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/aztec-node/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/aztec-node/server.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,8 @@
1
1
  var _AztecNodeService_instances, _AztecNodeService_getWorldState, _AztecNodeService_syncWorldState;
2
2
  import { __classPrivateFieldGet } from "tslib";
3
- import { Archiver } from '@aztec/archiver';
3
+ import { Archiver, LMDBArchiverStore } from '@aztec/archiver';
4
4
  import { Fr, GlobalVariables, HistoricBlockData, } from '@aztec/circuits.js';
5
- import { computePublicDataTreeIndex } from '@aztec/circuits.js/abis';
5
+ import { computeGlobalsHash, computePublicDataTreeIndex } from '@aztec/circuits.js/abis';
6
6
  import { createEthereumChain } from '@aztec/ethereum';
7
7
  import { createDebugLogger } from '@aztec/foundation/log';
8
8
  import { InMemoryTxPool, createP2PClient } from '@aztec/p2p';
@@ -49,25 +49,27 @@ export class AztecNodeService {
49
49
  if (config.chainId !== ethereumChain.chainInfo.id) {
50
50
  throw new Error(`RPC URL configured for chain id ${ethereumChain.chainInfo.id} but expected id ${config.chainId}`);
51
51
  }
52
+ const log = createDebugLogger('aztec:node');
53
+ const [nodeDb, worldStateDb] = await openDb(config, log);
52
54
  // first create and sync the archiver
53
- const archiver = await Archiver.createAndSync(config);
55
+ const archiverStore = new LMDBArchiverStore(nodeDb, config.maxLogs);
56
+ const archiver = await Archiver.createAndSync(config, archiverStore, true);
54
57
  // we identify the P2P transaction protocol by using the rollup contract address.
55
58
  // this may well change in future
56
59
  config.transactionProtocol = `/aztec/tx/${config.l1Contracts.rollupAddress.toString()}`;
57
60
  // create the tx pool and the p2p client, which will need the l2 block source
58
61
  const p2pClient = await createP2PClient(config, new InMemoryTxPool(), archiver);
59
62
  // now create the merkle trees and the world state synchronizer
60
- const db = await openDb(config);
61
- const merkleTrees = await MerkleTrees.new(db);
63
+ const merkleTrees = await MerkleTrees.new(worldStateDb);
62
64
  const worldStateConfig = getWorldStateConfig();
63
- const worldStateSynchronizer = await ServerWorldStateSynchronizer.new(db, merkleTrees, archiver, worldStateConfig);
65
+ const worldStateSynchronizer = await ServerWorldStateSynchronizer.new(worldStateDb, merkleTrees, archiver, worldStateConfig);
64
66
  // start both and wait for them to sync from the block source
65
67
  await Promise.all([p2pClient.start(), worldStateSynchronizer.start()]);
66
68
  // now create the sequencer
67
69
  const sequencer = config.disableSequencer
68
70
  ? undefined
69
71
  : await SequencerClient.new(config, p2pClient, worldStateSynchronizer, archiver, archiver, archiver);
70
- return new AztecNodeService(config, p2pClient, archiver, archiver, archiver, archiver, archiver, worldStateSynchronizer, sequencer, ethereumChain.chainInfo.id, config.version, getGlobalVariableBuilder(config), db);
72
+ return new AztecNodeService(config, p2pClient, archiver, archiver, archiver, archiver, archiver, worldStateSynchronizer, sequencer, ethereumChain.chainInfo.id, config.version, getGlobalVariableBuilder(config), worldStateDb, log);
71
73
  }
72
74
  /**
73
75
  * Returns the sequencer client instance.
@@ -312,8 +314,9 @@ export class AztecNodeService {
312
314
  // TODO we should be able to remove this after https://github.com/AztecProtocol/aztec-packages/issues/1869
313
315
  // So simulation of public functions doesn't affect the merkle trees.
314
316
  const merkleTrees = new MerkleTrees(this.merkleTreesDb, this.log);
317
+ const globalVariablesHash = computeGlobalsHash(prevGlobalVariables);
315
318
  await merkleTrees.init({
316
- globalVariables: prevGlobalVariables,
319
+ globalVariablesHash,
317
320
  });
318
321
  const publicProcessorFactory = new PublicProcessorFactory(merkleTrees.asLatest(), this.contractDataSource, this.l1ToL2MessageSource);
319
322
  const processor = await publicProcessorFactory.create(prevGlobalVariables, newGlobalVariables);
@@ -323,6 +326,10 @@ export class AztecNodeService {
323
326
  }
324
327
  this.log.info(`Simulated tx ${await tx.getTxHash()} succeeds`);
325
328
  }
329
+ setConfig(config) {
330
+ this.sequencer?.updateSequencerConfig(config);
331
+ return Promise.resolve();
332
+ }
326
333
  }
327
334
  _AztecNodeService_instances = new WeakSet(), _AztecNodeService_getWorldState =
328
335
  /**
@@ -347,4 +354,4 @@ async function _AztecNodeService_syncWorldState() {
347
354
  const blockSourceHeight = await this.blockSource.getBlockNumber();
348
355
  await this.worldStateSynchronizer.syncImmediate(blockSourceHeight);
349
356
  };
350
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2F6dGVjLW5vZGUvc2VydmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFFTCxFQUFFLEVBQ0YsZUFBZSxFQUNmLGlCQUFpQixHQUdsQixNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3JFLE9BQU8sRUFBdUIsbUJBQW1CLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUUzRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsY0FBYyxFQUFPLGVBQWUsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNsRSxPQUFPLEVBRUwsc0JBQXNCLEVBQ3RCLGVBQWUsRUFDZix3QkFBd0IsR0FDekIsTUFBTSx5QkFBeUIsQ0FBQztBQUNqQyxPQUFPLEVBTUwscUJBQXFCLEVBUXJCLE9BQU8sRUFDUCxZQUFZLEdBSWIsTUFBTSxjQUFjLENBQUM7QUFDdEIsT0FBTyxFQUNMLFdBQVcsRUFDWCw0QkFBNEIsRUFHNUIsZ0JBQWdCLElBQUksbUJBQW1CLEdBQ3hDLE1BQU0sb0JBQW9CLENBQUM7QUFLNUIsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUVqQzs7R0FFRztBQUNILE1BQU0sT0FBTyxnQkFBZ0I7SUFDM0IsWUFDcUIsTUFBdUIsRUFDdkIsU0FBYyxFQUNkLFdBQTBCLEVBQzFCLG1CQUFpQyxFQUNqQyxxQkFBbUMsRUFDbkMsa0JBQXNDLEVBQ3RDLG1CQUF3QyxFQUN4QyxzQkFBOEMsRUFDOUMsU0FBc0MsRUFDdEMsT0FBZSxFQUNmLE9BQWUsRUFDZixxQkFBNEMsRUFDNUMsYUFBOEIsRUFDekMsTUFBTSxpQkFBaUIsQ0FBQyxZQUFZLENBQUM7O1FB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
357
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2F6dGVjLW5vZGUvc2VydmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzlELE9BQU8sRUFFTCxFQUFFLEVBQ0YsZUFBZSxFQUNmLGlCQUFpQixHQUdsQixNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSwwQkFBMEIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3pGLE9BQU8sRUFBdUIsbUJBQW1CLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUUzRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsY0FBYyxFQUFPLGVBQWUsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNsRSxPQUFPLEVBRUwsc0JBQXNCLEVBQ3RCLGVBQWUsRUFDZix3QkFBd0IsR0FDekIsTUFBTSx5QkFBeUIsQ0FBQztBQUNqQyxPQUFPLEVBTUwscUJBQXFCLEVBUXJCLE9BQU8sRUFDUCxZQUFZLEdBS2IsTUFBTSxjQUFjLENBQUM7QUFDdEIsT0FBTyxFQUNMLFdBQVcsRUFDWCw0QkFBNEIsRUFHNUIsZ0JBQWdCLElBQUksbUJBQW1CLEdBQ3hDLE1BQU0sb0JBQW9CLENBQUM7QUFLNUIsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUVqQzs7R0FFRztBQUNILE1BQU0sT0FBTyxnQkFBZ0I7SUFDM0IsWUFDcUIsTUFBdUIsRUFDdkIsU0FBYyxFQUNkLFdBQTBCLEVBQzFCLG1CQUFpQyxFQUNqQyxxQkFBbUMsRUFDbkMsa0JBQXNDLEVBQ3RDLG1CQUF3QyxFQUN4QyxzQkFBOEMsRUFDOUMsU0FBc0MsRUFDdEMsT0FBZSxFQUNmLE9BQWUsRUFDZixxQkFBNEMsRUFDNUMsYUFBc0IsRUFDakMsTUFBTSxp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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aztec/aztec-node",
3
- "version": "0.15.1",
3
+ "version": "0.16.1",
4
4
  "main": "dest/index.js",
5
5
  "type": "module",
6
6
  "exports": "./dest/index.js",
@@ -33,19 +33,20 @@
33
33
  "rootDir": "./src"
34
34
  },
35
35
  "dependencies": {
36
- "@aztec/archiver": "0.15.1",
37
- "@aztec/circuits.js": "0.15.1",
38
- "@aztec/ethereum": "0.15.1",
39
- "@aztec/foundation": "0.15.1",
40
- "@aztec/l1-artifacts": "0.15.1",
41
- "@aztec/merkle-tree": "0.15.1",
42
- "@aztec/p2p": "0.15.1",
43
- "@aztec/sequencer-client": "0.15.1",
44
- "@aztec/types": "0.15.1",
45
- "@aztec/world-state": "0.15.1",
36
+ "@aztec/archiver": "0.16.1",
37
+ "@aztec/circuits.js": "0.16.1",
38
+ "@aztec/ethereum": "0.16.1",
39
+ "@aztec/foundation": "0.16.1",
40
+ "@aztec/l1-artifacts": "0.16.1",
41
+ "@aztec/merkle-tree": "0.16.1",
42
+ "@aztec/p2p": "0.16.1",
43
+ "@aztec/sequencer-client": "0.16.1",
44
+ "@aztec/types": "0.16.1",
45
+ "@aztec/world-state": "0.16.1",
46
46
  "koa": "^2.14.2",
47
47
  "koa-router": "^12.0.0",
48
48
  "levelup": "^5.1.1",
49
+ "lmdb": "^2.9.1",
49
50
  "memdown": "^6.1.1",
50
51
  "tslib": "^2.4.0"
51
52
  },
@@ -1,5 +1,8 @@
1
+ import { LogFn } from '@aztec/foundation/log';
2
+
1
3
  import { LevelDown, default as leveldown } from 'leveldown';
2
4
  import { LevelUp, default as levelup } from 'levelup';
5
+ import { RootDatabase, open } from 'lmdb';
3
6
  import { MemDown, default as memdown } from 'memdown';
4
7
  import { mkdir } from 'node:fs/promises';
5
8
  import { join } from 'node:path';
@@ -10,6 +13,7 @@ export const createMemDown = () => (memdown as any)() as MemDown<any, any>;
10
13
  export const createLevelDown = (path: string) => (leveldown as any)(path) as LevelDown;
11
14
 
12
15
  const DB_SUBDIR = 'aztec-node';
16
+ const WORLD_STATE_SUBDIR = 'aztec-world-state';
13
17
  const NODE_METADATA_KEY = '@@aztec_node_metadata';
14
18
 
15
19
  /**
@@ -28,45 +32,61 @@ type NodeMetadata = {
28
32
  * @throws If `config.dataDirectory` is set and the directory cannot be created.
29
33
  * @returns The database for the aztec node.
30
34
  */
31
- export async function openDb(config: AztecNodeConfig): Promise<LevelUp> {
35
+ export async function openDb(
36
+ config: AztecNodeConfig,
37
+ log: LogFn,
38
+ ): Promise<[nodeDb: RootDatabase, worldStateDb: LevelUp]> {
32
39
  const nodeMetadata: NodeMetadata = {
33
40
  rollupContractAddress: config.l1Contracts.rollupAddress.toString(),
34
41
  };
35
42
 
36
- let db: LevelUp;
43
+ let nodeDb: RootDatabase;
44
+ let worldStateDb: LevelUp;
37
45
 
38
46
  if (config.dataDirectory) {
39
- const dbDir = join(config.dataDirectory, DB_SUBDIR);
47
+ const nodeDir = join(config.dataDirectory, DB_SUBDIR);
48
+ const worldStateDir = join(config.dataDirectory, WORLD_STATE_SUBDIR);
40
49
  // this throws if we don't have permissions to create the directory
41
- await mkdir(dbDir, { recursive: true });
42
- db = levelup(createLevelDown(dbDir));
43
- } else {
44
- db = levelup(createMemDown());
45
- }
50
+ await mkdir(nodeDir, { recursive: true });
51
+ await mkdir(worldStateDir, { recursive: true });
46
52
 
47
- const prevNodeMetadata = await getNodeMetadata(db);
53
+ log(`Opening aztec-node database at ${nodeDir}`);
54
+ nodeDb = open(nodeDir, {});
48
55
 
49
- // if the rollup addresses are different, wipe the local database and start over
50
- if (nodeMetadata.rollupContractAddress !== prevNodeMetadata.rollupContractAddress) {
51
- await db.clear();
56
+ log(`Opening world-state database at ${worldStateDir}`);
57
+ worldStateDb = levelup(createLevelDown(worldStateDir));
58
+ } else {
59
+ log('Opening temporary databases');
60
+ // not passing a path will use a temp file that gets deleted when the process exits
61
+ nodeDb = open({});
62
+ worldStateDb = levelup(createMemDown());
52
63
  }
53
64
 
54
- await db.put(NODE_METADATA_KEY, JSON.stringify(nodeMetadata));
55
- return db;
65
+ await checkNodeMetadataAndClear(nodeDb, worldStateDb, nodeMetadata, log);
66
+ return [nodeDb, worldStateDb];
56
67
  }
57
68
 
58
69
  /**
59
- * Gets the metadata for the aztec node.
60
- * @param db - The database for the aztec node.
61
- * @returns Node metadata.
70
+ * Checks the node metadata and clears the database if the rollup contract address has changed.
71
+ * @param nodeDb - The database for the aztec node.
72
+ * @param nodeMetadata - The metadata for the aztec node.
62
73
  */
63
- async function getNodeMetadata(db: LevelUp): Promise<NodeMetadata> {
74
+ async function checkNodeMetadataAndClear(
75
+ nodeDb: RootDatabase,
76
+ worldStateDb: LevelUp,
77
+ nodeMetadata: NodeMetadata,
78
+ log: LogFn,
79
+ ): Promise<void> {
80
+ const metadataDB = nodeDb.openDB<NodeMetadata, string>('metadata', {});
64
81
  try {
65
- const value: Buffer = await db.get(NODE_METADATA_KEY);
66
- return JSON.parse(value.toString('utf-8'));
67
- } catch {
68
- return {
69
- rollupContractAddress: '',
70
- };
82
+ const existing = metadataDB.get(NODE_METADATA_KEY);
83
+ // if the rollup addresses are different, wipe the local database and start over
84
+ if (!existing || existing.rollupContractAddress !== nodeMetadata.rollupContractAddress) {
85
+ log('Rollup contract address has changed, clearing databases');
86
+ await Promise.all([nodeDb.clearAsync(), worldStateDb.clear()]);
87
+ }
88
+ await metadataDB.put(NODE_METADATA_KEY, nodeMetadata);
89
+ } finally {
90
+ await metadataDB.close();
71
91
  }
72
92
  }
@@ -1,4 +1,4 @@
1
- import { Archiver } from '@aztec/archiver';
1
+ import { Archiver, LMDBArchiverStore } from '@aztec/archiver';
2
2
  import {
3
3
  CONTRACT_TREE_HEIGHT,
4
4
  Fr,
@@ -7,7 +7,7 @@ import {
7
7
  L1_TO_L2_MSG_TREE_HEIGHT,
8
8
  NOTE_HASH_TREE_HEIGHT,
9
9
  } from '@aztec/circuits.js';
10
- import { computePublicDataTreeIndex } from '@aztec/circuits.js/abis';
10
+ import { computeGlobalsHash, computePublicDataTreeIndex } from '@aztec/circuits.js/abis';
11
11
  import { L1ContractAddresses, createEthereumChain } from '@aztec/ethereum';
12
12
  import { AztecAddress } from '@aztec/foundation/aztec-address';
13
13
  import { createDebugLogger } from '@aztec/foundation/log';
@@ -34,6 +34,7 @@ import {
34
34
  LogFilter,
35
35
  LogType,
36
36
  MerkleTreeId,
37
+ SequencerConfig,
37
38
  SiblingPath,
38
39
  Tx,
39
40
  TxHash,
@@ -46,7 +47,7 @@ import {
46
47
  getConfigEnvVars as getWorldStateConfig,
47
48
  } from '@aztec/world-state';
48
49
 
49
- import levelup from 'levelup';
50
+ import { LevelUp } from 'levelup';
50
51
 
51
52
  import { AztecNodeConfig } from './config.js';
52
53
  import { openDb } from './db.js';
@@ -68,7 +69,7 @@ export class AztecNodeService implements AztecNode {
68
69
  protected readonly chainId: number,
69
70
  protected readonly version: number,
70
71
  protected readonly globalVariableBuilder: GlobalVariableBuilder,
71
- protected readonly merkleTreesDb: levelup.LevelUp,
72
+ protected readonly merkleTreesDb: LevelUp,
72
73
  private log = createDebugLogger('aztec:node'),
73
74
  ) {
74
75
  const message =
@@ -94,8 +95,13 @@ export class AztecNodeService implements AztecNode {
94
95
  `RPC URL configured for chain id ${ethereumChain.chainInfo.id} but expected id ${config.chainId}`,
95
96
  );
96
97
  }
98
+
99
+ const log = createDebugLogger('aztec:node');
100
+ const [nodeDb, worldStateDb] = await openDb(config, log);
101
+
97
102
  // first create and sync the archiver
98
- const archiver = await Archiver.createAndSync(config);
103
+ const archiverStore = new LMDBArchiverStore(nodeDb, config.maxLogs);
104
+ const archiver = await Archiver.createAndSync(config, archiverStore, true);
99
105
 
100
106
  // we identify the P2P transaction protocol by using the rollup contract address.
101
107
  // this may well change in future
@@ -105,10 +111,14 @@ export class AztecNodeService implements AztecNode {
105
111
  const p2pClient = await createP2PClient(config, new InMemoryTxPool(), archiver);
106
112
 
107
113
  // now create the merkle trees and the world state synchronizer
108
- const db = await openDb(config);
109
- const merkleTrees = await MerkleTrees.new(db);
114
+ const merkleTrees = await MerkleTrees.new(worldStateDb);
110
115
  const worldStateConfig: WorldStateConfig = getWorldStateConfig();
111
- const worldStateSynchronizer = await ServerWorldStateSynchronizer.new(db, merkleTrees, archiver, worldStateConfig);
116
+ const worldStateSynchronizer = await ServerWorldStateSynchronizer.new(
117
+ worldStateDb,
118
+ merkleTrees,
119
+ archiver,
120
+ worldStateConfig,
121
+ );
112
122
 
113
123
  // start both and wait for them to sync from the block source
114
124
  await Promise.all([p2pClient.start(), worldStateSynchronizer.start()]);
@@ -131,7 +141,8 @@ export class AztecNodeService implements AztecNode {
131
141
  ethereumChain.chainInfo.id,
132
142
  config.version,
133
143
  getGlobalVariableBuilder(config),
134
- db,
144
+ worldStateDb,
145
+ log,
135
146
  );
136
147
  }
137
148
 
@@ -417,8 +428,9 @@ export class AztecNodeService implements AztecNode {
417
428
  // TODO we should be able to remove this after https://github.com/AztecProtocol/aztec-packages/issues/1869
418
429
  // So simulation of public functions doesn't affect the merkle trees.
419
430
  const merkleTrees = new MerkleTrees(this.merkleTreesDb, this.log);
431
+ const globalVariablesHash = computeGlobalsHash(prevGlobalVariables);
420
432
  await merkleTrees.init({
421
- globalVariables: prevGlobalVariables,
433
+ globalVariablesHash,
422
434
  });
423
435
 
424
436
  const publicProcessorFactory = new PublicProcessorFactory(
@@ -434,6 +446,11 @@ export class AztecNodeService implements AztecNode {
434
446
  this.log.info(`Simulated tx ${await tx.getTxHash()} succeeds`);
435
447
  }
436
448
 
449
+ public setConfig(config: Partial<SequencerConfig>): Promise<void> {
450
+ this.sequencer?.updateSequencerConfig(config);
451
+ return Promise.resolve();
452
+ }
453
+
437
454
  /**
438
455
  * Returns an instance of MerkleTreeOperations having first ensured the world state is fully synched
439
456
  * @returns An instance of a committed MerkleTreeOperations
@@ -0,0 +1,16 @@
1
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
2
+ import { RootDatabaseOptionsWithPath } from 'lmdb';
3
+
4
+ // The problem is this snippet `nodeDb = open({});` in src/aztec-node/db.ts
5
+ // tsc compiles this code fine, but ts-jest can't.
6
+ // This is a mixture for two bugs:
7
+ // - the first in ts-jest, it gets confused by packages with mixed CJS and ESM type exports - https://github.com/kulshekhar/ts-jest/issues/4221
8
+ // - the second in lmdb, it outputs different CJS and ESM types - https://github.com/kriszyp/lmdb-js/issues/243#issuecomment-1823585586
9
+
10
+ declare module 'lmdb' {
11
+ /* eslint-disable jsdoc/require-jsdoc */
12
+ interface RootDatabaseOptionsWithPath {
13
+ path?: string;
14
+ }
15
+ /* eslint-enable jsdoc/require-jsdoc */
16
+ }