@aztec/aztec-node 0.16.0 → 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
@@ -5,7 +5,7 @@ import { P2P } from '@aztec/p2p';
5
5
  import { GlobalVariableBuilder, SequencerClient } from '@aztec/sequencer-client';
6
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.
@@ -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);
@@ -351,4 +354,4 @@ async function _AztecNodeService_syncWorldState() {
351
354
  const blockSourceHeight = await this.blockSource.getBlockNumber();
352
355
  await this.worldStateSynchronizer.syncImmediate(blockSourceHeight);
353
356
  };
354
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2F6dGVjLW5vZGUvc2VydmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFFTCxFQUFFLEVBQ0YsZUFBZSxFQUNmLGlCQUFpQixHQUdsQixNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3JFLE9BQU8sRUFBdUIsbUJBQW1CLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUUzRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsY0FBYyxFQUFPLGVBQWUsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNsRSxPQUFPLEVBRUwsc0JBQXNCLEVBQ3RCLGVBQWUsRUFDZix3QkFBd0IsR0FDekIsTUFBTSx5QkFBeUIsQ0FBQztBQUNqQyxPQUFPLEVBTUwscUJBQXFCLEVBUXJCLE9BQU8sRUFDUCxZQUFZLEdBS2IsTUFBTSxjQUFjLENBQUM7QUFDdEIsT0FBTyxFQUNMLFdBQVcsRUFDWCw0QkFBNEIsRUFHNUIsZ0JBQWdCLElBQUksbUJBQW1CLEdBQ3hDLE1BQU0sb0JBQW9CLENBQUM7QUFLNUIsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUVqQzs7R0FFRztBQUNILE1BQU0sT0FBTyxnQkFBZ0I7SUFDM0IsWUFDcUIsTUFBdUIsRUFDdkIsU0FBYyxFQUNkLFdBQTBCLEVBQzFCLG1CQUFpQyxFQUNqQyxxQkFBbUMsRUFDbkMsa0JBQXNDLEVBQ3RDLG1CQUF3QyxFQUN4QyxzQkFBOEMsRUFDOUMsU0FBc0MsRUFDdEMsT0FBZSxFQUNmLE9BQWUsRUFDZixxQkFBNEMsRUFDNUMsYUFBOEIsRUFDekMsTUFBTSxpQkFBaUIsQ0FBQyxZQUFZLENBQUM7O1FBYjFCLFdBQU0sR0FBTixNQUFNLENBQWlCO1FBQ3ZCLGNBQVMsR0FBVCxTQUFTLENBQUs7UUFDZCxnQkFBVyxHQUFYLFdBQVcsQ0FBZTtRQUMxQix3QkFBbUIsR0FBbkIsbUJBQW1CLENBQWM7UUFDakMsMEJBQXFCLEdBQXJCLHFCQUFxQixDQUFjO1FBQ25DLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBb0I7UUFDdEMsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFxQjtRQUN4QywyQkFBc0IsR0FBdEIsc0JBQXNCLENBQXdCO1FBQzlDLGNBQVMsR0FBVCxTQUFTLENBQTZCO1FBQ3RDLFlBQU8sR0FBUCxPQUFPLENBQVE7UUFDZixZQUFPLEdBQVAsT0FBTyxDQUFRO1FBQ2YsMEJBQXFCLEdBQXJCLHFCQUFxQixDQUF1QjtRQUM1QyxrQkFBYSxHQUFiLGFBQWEsQ0FBaUI7UUFDekMsUUFBRyxHQUFILEdBQUcsQ0FBa0M7UUFFN0MsTUFBTSxPQUFPLEdBQ1gsc0NBQXNDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLHNCQUFzQjtZQUNoRixXQUFXLE1BQU0sQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLFFBQVEsRUFBRSxJQUFJO1lBQzFELGFBQWEsTUFBTSxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUMsUUFBUSxFQUFFLElBQUk7WUFDOUQsVUFBVSxNQUFNLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsSUFBSTtZQUN4RCxXQUFXLE1BQU0sQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLFFBQVEsRUFBRSxJQUFJO1lBQzFELHFCQUFxQixNQUFNLENBQUMsV0FBVyxDQUFDLGdDQUFnQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUM7UUFDeEYsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNwQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLE1BQU0sQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLE1BQXVCO1FBQ3ZELE1BQU0sYUFBYSxHQUFHLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3hFLDJFQUEyRTtRQUMzRSxJQUFJLE1BQU0sQ0FBQyxPQUFPLEtBQUssYUFBYSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEVBQUU7WUFDakQsTUFBTSxJQUFJLEtBQUssQ0FDYixtQ0FBbUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxFQUFFLG9CQUFvQixNQUFNLENBQUMsT0FBTyxFQUFFLENBQ2xHLENBQUM7U0FDSDtRQUNELHFDQUFxQztRQUNyQyxNQUFNLFFBQVEsR0FBRyxNQUFNLFFBQVEsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFdEQsaUZBQWlGO1FBQ2pGLGlDQUFpQztRQUNqQyxNQUFNLENBQUMsbUJBQW1CLEdBQUcsYUFBYSxNQUFNLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDO1FBRXhGLDZFQUE2RTtRQUM3RSxNQUFNLFNBQVMsR0FBRyxNQUFNLGVBQWUsQ0FBQyxNQUFNLEVBQUUsSUFBSSxjQUFjLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUVoRiwrREFBK0Q7UUFDL0QsTUFBTSxFQUFFLEdBQUcsTUFBTSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDaEMsTUFBTSxXQUFXLEdBQUcsTUFBTSxXQUFXLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzlDLE1BQU0sZ0JBQWdCLEdBQXFCLG1CQUFtQixFQUFFLENBQUM7UUFDakUsTUFBTSxzQkFBc0IsR0FBRyxNQUFNLDRCQUE0QixDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1FBRW5ILDZEQUE2RDtRQUM3RCxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLEVBQUUsc0JBQXNCLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRXZFLDJCQUEyQjtRQUMzQixNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsZ0JBQWdCO1lBQ3ZDLENBQUMsQ0FBQyxTQUFTO1lBQ1gsQ0FBQyxDQUFDLE1BQU0sZUFBZSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLHNCQUFzQixFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFFdkcsT0FBTyxJQUFJLGdCQUFnQixDQUN6QixNQUFNLEVBQ04sU0FBUyxFQUNULFFBQVEsRUFDUixRQUFRLEVBQ1IsUUFBUSxFQUNSLFFBQVEsRUFDUixRQUFRLEVBQ1Isc0JBQXNCLEVBQ3RCLFNBQVMsRUFDVCxhQUFhLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFDMUIsTUFBTSxDQUFDLE9BQU8sRUFDZCx3QkFBd0IsQ0FBQyxNQUFNLENBQUMsRUFDaEMsRUFBRSxDQUNILENBQUM7SUFDSixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksWUFBWTtRQUNqQixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDeEIsQ0FBQztJQUVEOzs7T0FHRztJQUNJLHNCQUFzQjtRQUMzQixPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksS0FBSyxDQUFDLE9BQU87UUFDbEIsT0FBTyxDQUFDLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLEtBQUssQ0FBQztJQUNuRCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBYztRQUNsQyxPQUFPLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFZLEVBQUUsS0FBYTtRQUNoRCxPQUFPLENBQUMsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDL0QsQ0FBQztJQUVEOzs7T0FHRztJQUNJLEtBQUssQ0FBQyxjQUFjO1FBQ3pCLE9BQU8sTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQ2pELENBQUM7SUFFRDs7O09BR0c7SUFDSSxVQUFVO1FBQ2YsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksVUFBVTtRQUNmLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsdUJBQXVCLENBQUMsZUFBNkI7UUFDekQsT0FBTyxNQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyx1QkFBdUIsQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUNoRixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxLQUFLLENBQUMsZUFBZSxDQUFDLGVBQTZCO1FBQ3hELE9BQU8sTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsZUFBZSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQ3hFLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxPQUFPLENBQUMsSUFBWSxFQUFFLEtBQWEsRUFBRSxPQUFnQjtRQUMxRCxNQUFNLFNBQVMsR0FBRyxPQUFPLEtBQUssT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUM7UUFDeEcsT0FBTyxTQUFTLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxrQkFBa0IsQ0FBQyxNQUFpQjtRQUNsQyxPQUFPLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMvRCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFNO1FBQ3hCLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGVBQWUsTUFBTSxFQUFFLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3JELE1BQU0sSUFBSSxDQUFDLFNBQVUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVNLEtBQUssQ0FBQyxNQUFjO1FBQ3pCLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVEOztPQUVHO0lBQ0ksS0FBSyxDQUFDLElBQUk7UUFDZixJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMxQixNQUFNLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFDN0IsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzVCLE1BQU0sSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3pDLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUM5QixJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUMzQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksS0FBSyxDQUFDLGFBQWE7UUFDeEIsT0FBTyxNQUFNLElBQUksQ0FBQyxTQUFVLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDeEMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxLQUFLLENBQUMsa0JBQWtCLENBQUMsTUFBYztRQUM1QyxPQUFPLE1BQU0sSUFBSSxDQUFDLFNBQVUsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksS0FBSyxDQUFDLGFBQWEsQ0FBQyxNQUFvQixFQUFFLFNBQWE7UUFDNUQsTUFBTSxXQUFXLEdBQUcsTUFBTSx1QkFBQSxJQUFJLG9FQUFlLE1BQW5CLElBQUksQ0FBaUIsQ0FBQztRQUNoRCxPQUFPLFdBQVcsQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQ2pFLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksS0FBSyxDQUFDLHNCQUFzQixDQUFDLFNBQWlCO1FBQ25ELE1BQU0sV0FBVyxHQUFHLE1BQU0sdUJBQUEsSUFBSSxvRUFBZSxNQUFuQixJQUFJLENBQWlCLENBQUM7UUFDaEQsT0FBTyxXQUFXLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxhQUFhLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDM0UsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxLQUFLLENBQUMsc0JBQXNCLENBQUMsU0FBaUI7UUFDbkQsTUFBTSxXQUFXLEdBQUcsTUFBTSx1QkFBQSxJQUFJLG9FQUFlLE1BQW5CLElBQUksQ0FBaUIsQ0FBQztRQUNoRCxPQUFPLFdBQVcsQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLGNBQWMsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUM1RSxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxLQUFLLENBQUMsd0JBQXdCLENBQUMsVUFBYztRQUNsRCxxQ0FBcUM7UUFDckMsTUFBTSxLQUFLLEdBQUcsQ0FBQyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLHNCQUFzQixFQUFFLFVBQVUsQ0FBQyxDQUFFLENBQUM7UUFDM0YsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsbUJBQW1CLENBQUMseUJBQXlCLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDckYsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUkscUJBQXFCLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxLQUFLLENBQUMsMkJBQTJCLENBQUMsU0FBaUI7UUFDeEQsTUFBTSxXQUFXLEdBQUcsTUFBTSx1QkFBQSxJQUFJLG9FQUFlLE1BQW5CLElBQUksQ0FBaUIsQ0FBQztRQUNoRCxPQUFPLFdBQVcsQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLHNCQUFzQixFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ3BGLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSSxLQUFLLENBQUMsa0JBQWtCLENBQUMsUUFBc0IsRUFBRSxJQUFRO1FBQzlELE1BQU0sV0FBVyxHQUFHLE1BQU0sdUJBQUEsSUFBSSxvRUFBZSxNQUFuQixJQUFJLENBQWlCLENBQUM7UUFDaEQsTUFBTSxTQUFTLEdBQUcsMEJBQTBCLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzdELE1BQU0sS0FBSyxHQUFHLE1BQU0sV0FBVyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLEVBQUUsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzdGLE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDbEQsQ0FBQztJQUVEOzs7T0FHRztJQUNJLEtBQUssQ0FBQyxZQUFZO1FBQ3ZCLE1BQU0sV0FBVyxHQUFHLE1BQU0sdUJBQUEsSUFBSSxvRUFBZSxNQUFuQixJQUFJLENBQWlCLENBQUM7UUFDaEQsTUFBTSxXQUFXLEdBQUcsS0FBSyxFQUFFLEVBQWdCLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxNQUFNLFdBQVcsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV4RyxNQUFNLENBQUMsWUFBWSxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsa0JBQWtCLEVBQUUsVUFBVSxFQUFFLGNBQWMsQ0FBQyxHQUMvRixNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUM7WUFDaEIsV0FBVyxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUM7WUFDeEMsV0FBVyxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUM7WUFDeEMsV0FBVyxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUM7WUFDdkMsV0FBVyxDQUFDLFlBQVksQ0FBQyxzQkFBc0IsQ0FBQztZQUNoRCxXQUFXLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQztZQUNyQyxXQUFXLENBQUMsWUFBWSxDQUFDLGdCQUFnQixDQUFDO1NBQzNDLENBQUMsQ0FBQztRQUVMLE9BQU87WUFDTCxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsRUFBRSxZQUFZO1lBQzFDLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQyxFQUFFLFlBQVk7WUFDM0MsQ0FBQyxZQUFZLENBQUMsY0FBYyxDQUFDLEVBQUUsYUFBYTtZQUM1QyxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLGNBQWM7WUFDL0MsQ0FBQyxZQUFZLENBQUMsc0JBQXNCLENBQUMsRUFBRSxrQkFBa0I7WUFDekQsQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLEVBQUUsVUFBVTtTQUN2QyxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7T0FHRztJQUNJLEtBQUssQ0FBQyxvQkFBb0I7UUFDL0IsTUFBTSxXQUFXLEdBQUcsTUFBTSx1QkFBQSxJQUFJLG9FQUFlLE1BQW5CLElBQUksQ0FBaUIsQ0FBQztRQUNoRCxNQUFNLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsRUFBRSxXQUFXLENBQUMsNEJBQTRCLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFbEgsT0FBTyxJQUFJLGlCQUFpQixDQUMxQixLQUFLLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQyxFQUNsQyxLQUFLLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQyxFQUNsQyxLQUFLLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxFQUNqQyxLQUFLLENBQUMsWUFBWSxDQUFDLHNCQUFzQixDQUFDLEVBQzFDLEtBQUssQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLEVBQy9CLEVBQUUsQ0FBQyxJQUFJLEVBQ1AsS0FBSyxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxFQUNwQyxXQUFXLENBQ1osQ0FBQztJQUNKLENBQUM7SUFFRDs7O1FBR0k7SUFDRyxLQUFLLENBQUMsbUJBQW1CLENBQUMsRUFBTTtRQUNyQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsTUFBTSxFQUFFLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZELE1BQU0sV0FBVyxHQUFHLENBQUMsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2xFLE1BQU0sa0JBQWtCLEdBQUcsTUFBTSxJQUFJLENBQUMscUJBQXFCLENBQUMsb0JBQW9CLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztRQUN0RyxNQUFNLG1CQUFtQixHQUFHLENBQUMsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsZUFBZSxJQUFJLGVBQWUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUU5RyxzRkFBc0Y7UUFDdEYsMEdBQTBHO1FBQzFHLHFFQUFxRTtRQUNyRSxNQUFNLFdBQVcsR0FBRyxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNsRSxNQUFNLFdBQVcsQ0FBQyxJQUFJLENBQUM7WUFDckIsZUFBZSxFQUFFLG1CQUFtQjtTQUNyQyxDQUFDLENBQUM7UUFFSCxNQUFNLHNCQUFzQixHQUFHLElBQUksc0JBQXNCLENBQ3ZELFdBQVcsQ0FBQyxRQUFRLEVBQUUsRUFDdEIsSUFBSSxDQUFDLGtCQUFrQixFQUN2QixJQUFJLENBQUMsbUJBQW1CLENBQ3pCLENBQUM7UUFDRixNQUFNLFNBQVMsR0FBRyxNQUFNLHNCQUFzQixDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO1FBQy9GLE1BQU0sQ0FBQyxFQUFFLFNBQVMsQ0FBQyxHQUFHLE1BQU0sU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDcEQsSUFBSSxTQUFTLENBQUMsTUFBTSxFQUFFO1lBQ3BCLE1BQU0sU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztTQUMxQjtRQUNELElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGdCQUFnQixNQUFNLEVBQUUsQ0FBQyxTQUFTLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUVNLFNBQVMsQ0FBQyxNQUFnQztRQUMvQyxJQUFJLENBQUMsU0FBUyxFQUFFLHFCQUFxQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzlDLE9BQU8sT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQzNCLENBQUM7Q0F3QkY7O0FBdEJDOzs7R0FHRztBQUNILEtBQUs7SUFDSCxJQUFJO1FBQ0YsK0NBQStDO1FBQy9DLE1BQU0sdUJBQUEsSUFBSSxxRUFBZ0IsTUFBcEIsSUFBSSxDQUFrQixDQUFDO0tBQzlCO0lBQUMsT0FBTyxHQUFHLEVBQUU7UUFDWixJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyw4QkFBOEIsR0FBRyxFQUFFLENBQUMsQ0FBQztLQUNyRDtJQUNELE9BQU8sSUFBSSxDQUFDLHNCQUFzQixDQUFDLFlBQVksRUFBRSxDQUFDO0FBQ3BELENBQUM7QUFFRDs7O0dBR0c7QUFDSCxLQUFLO0lBQ0gsTUFBTSxpQkFBaUIsR0FBRyxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDbEUsTUFBTSxJQUFJLENBQUMsc0JBQXNCLENBQUMsYUFBYSxDQUFDLGlCQUFpQixDQUFDLENBQUM7QUFDckUsQ0FBQyJ9
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.16.0",
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.16.0",
37
- "@aztec/circuits.js": "0.16.0",
38
- "@aztec/ethereum": "0.16.0",
39
- "@aztec/foundation": "0.16.0",
40
- "@aztec/l1-artifacts": "0.16.0",
41
- "@aztec/merkle-tree": "0.16.0",
42
- "@aztec/p2p": "0.16.0",
43
- "@aztec/sequencer-client": "0.16.0",
44
- "@aztec/types": "0.16.0",
45
- "@aztec/world-state": "0.16.0",
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';
@@ -47,7 +47,7 @@ import {
47
47
  getConfigEnvVars as getWorldStateConfig,
48
48
  } from '@aztec/world-state';
49
49
 
50
- import levelup from 'levelup';
50
+ import { LevelUp } from 'levelup';
51
51
 
52
52
  import { AztecNodeConfig } from './config.js';
53
53
  import { openDb } from './db.js';
@@ -69,7 +69,7 @@ export class AztecNodeService implements AztecNode {
69
69
  protected readonly chainId: number,
70
70
  protected readonly version: number,
71
71
  protected readonly globalVariableBuilder: GlobalVariableBuilder,
72
- protected readonly merkleTreesDb: levelup.LevelUp,
72
+ protected readonly merkleTreesDb: LevelUp,
73
73
  private log = createDebugLogger('aztec:node'),
74
74
  ) {
75
75
  const message =
@@ -95,8 +95,13 @@ export class AztecNodeService implements AztecNode {
95
95
  `RPC URL configured for chain id ${ethereumChain.chainInfo.id} but expected id ${config.chainId}`,
96
96
  );
97
97
  }
98
+
99
+ const log = createDebugLogger('aztec:node');
100
+ const [nodeDb, worldStateDb] = await openDb(config, log);
101
+
98
102
  // first create and sync the archiver
99
- const archiver = await Archiver.createAndSync(config);
103
+ const archiverStore = new LMDBArchiverStore(nodeDb, config.maxLogs);
104
+ const archiver = await Archiver.createAndSync(config, archiverStore, true);
100
105
 
101
106
  // we identify the P2P transaction protocol by using the rollup contract address.
102
107
  // this may well change in future
@@ -106,10 +111,14 @@ export class AztecNodeService implements AztecNode {
106
111
  const p2pClient = await createP2PClient(config, new InMemoryTxPool(), archiver);
107
112
 
108
113
  // now create the merkle trees and the world state synchronizer
109
- const db = await openDb(config);
110
- const merkleTrees = await MerkleTrees.new(db);
114
+ const merkleTrees = await MerkleTrees.new(worldStateDb);
111
115
  const worldStateConfig: WorldStateConfig = getWorldStateConfig();
112
- const worldStateSynchronizer = await ServerWorldStateSynchronizer.new(db, merkleTrees, archiver, worldStateConfig);
116
+ const worldStateSynchronizer = await ServerWorldStateSynchronizer.new(
117
+ worldStateDb,
118
+ merkleTrees,
119
+ archiver,
120
+ worldStateConfig,
121
+ );
113
122
 
114
123
  // start both and wait for them to sync from the block source
115
124
  await Promise.all([p2pClient.start(), worldStateSynchronizer.start()]);
@@ -132,7 +141,8 @@ export class AztecNodeService implements AztecNode {
132
141
  ethereumChain.chainInfo.id,
133
142
  config.version,
134
143
  getGlobalVariableBuilder(config),
135
- db,
144
+ worldStateDb,
145
+ log,
136
146
  );
137
147
  }
138
148
 
@@ -418,8 +428,9 @@ export class AztecNodeService implements AztecNode {
418
428
  // TODO we should be able to remove this after https://github.com/AztecProtocol/aztec-packages/issues/1869
419
429
  // So simulation of public functions doesn't affect the merkle trees.
420
430
  const merkleTrees = new MerkleTrees(this.merkleTreesDb, this.log);
431
+ const globalVariablesHash = computeGlobalsHash(prevGlobalVariables);
421
432
  await merkleTrees.init({
422
- globalVariables: prevGlobalVariables,
433
+ globalVariablesHash,
423
434
  });
424
435
 
425
436
  const publicProcessorFactory = new PublicProcessorFactory(
@@ -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
+ }