@aztec/aztec-node 0.1.0-alpha43 → 0.1.0-alpha44

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.
@@ -4,7 +4,7 @@ import { AztecAddress } from '@aztec/foundation/aztec-address';
4
4
  import { P2P } from '@aztec/p2p';
5
5
  import { SequencerClient } from '@aztec/sequencer-client';
6
6
  import { AztecNode, ContractData, ContractDataAndBytecode, ContractDataSource, L1ToL2MessageAndIndex, L1ToL2MessageSource, L2Block, L2BlockL2Logs, L2BlockSource, L2LogsSource, LogType, MerkleTreeId, SiblingPath, Tx, TxHash } from '@aztec/types';
7
- import { MerkleTrees, WorldStateSynchroniser } from '@aztec/world-state';
7
+ import { WorldStateSynchroniser } from '@aztec/world-state';
8
8
  import { MemDown } from 'memdown';
9
9
  import { AztecNodeConfig } from './config.js';
10
10
  export declare const createMemDown: () => MemDown<any, any>;
@@ -18,13 +18,12 @@ export declare class AztecNodeService implements AztecNode {
18
18
  protected unencryptedLogsSource: L2LogsSource;
19
19
  protected contractDataSource: ContractDataSource;
20
20
  protected l1ToL2MessageSource: L1ToL2MessageSource;
21
- protected merkleTreeDB: MerkleTrees;
22
21
  protected worldStateSynchroniser: WorldStateSynchroniser;
23
22
  protected sequencer: SequencerClient;
24
23
  protected chainId: number;
25
24
  protected version: number;
26
25
  private log;
27
- constructor(p2pClient: P2P, blockSource: L2BlockSource, encryptedLogsSource: L2LogsSource, unencryptedLogsSource: L2LogsSource, contractDataSource: ContractDataSource, l1ToL2MessageSource: L1ToL2MessageSource, merkleTreeDB: MerkleTrees, worldStateSynchroniser: WorldStateSynchroniser, sequencer: SequencerClient, chainId: number, version: number, log?: import("@aztec/foundation/log").DebugLogger);
26
+ constructor(p2pClient: P2P, blockSource: L2BlockSource, encryptedLogsSource: L2LogsSource, unencryptedLogsSource: L2LogsSource, contractDataSource: ContractDataSource, l1ToL2MessageSource: L1ToL2MessageSource, worldStateSynchroniser: WorldStateSynchroniser, sequencer: SequencerClient, chainId: number, version: number, log?: import("@aztec/foundation/log").DebugLogger);
28
27
  /**
29
28
  * Initialises the Aztec Node, wait for component to sync.
30
29
  * @param config - The configuration to be used by the aztec node.
@@ -166,5 +165,15 @@ export declare class AztecNodeService implements AztecNode {
166
165
  * @returns The current committed block data.
167
166
  */
168
167
  getHistoricBlockData(): Promise<HistoricBlockData>;
168
+ /**
169
+ * Returns an instance of MerkleTreeOperations having first ensured the world state is fully synched
170
+ * @returns An instance of a committed MerkleTreeOperations
171
+ */
172
+ private getWorldState;
173
+ /**
174
+ * Ensure we fully sync the world state
175
+ * @returns A promise that fulfils once the world state is synced
176
+ */
177
+ private syncWorldState;
169
178
  }
170
179
  //# 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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"}
@@ -4,7 +4,7 @@ import { createDebugLogger } from '@aztec/foundation/log';
4
4
  import { InMemoryTxPool, createP2PClient } from '@aztec/p2p';
5
5
  import { SequencerClient } from '@aztec/sequencer-client';
6
6
  import { LogType, MerkleTreeId, } from '@aztec/types';
7
- import { MerkleTrees, ServerWorldStateSynchroniser, computePublicDataTreeLeafIndex, } from '@aztec/world-state';
7
+ import { MerkleTrees, ServerWorldStateSynchroniser, computePublicDataTreeLeafIndex, getConfigEnvVars as getWorldStateConfig, } from '@aztec/world-state';
8
8
  import { default as levelup } from 'levelup';
9
9
  import { default as memdown } from 'memdown';
10
10
  export const createMemDown = () => memdown();
@@ -12,14 +12,13 @@ export const createMemDown = () => memdown();
12
12
  * The aztec node.
13
13
  */
14
14
  export class AztecNodeService {
15
- constructor(p2pClient, blockSource, encryptedLogsSource, unencryptedLogsSource, contractDataSource, l1ToL2MessageSource, merkleTreeDB, worldStateSynchroniser, sequencer, chainId, version, log = createDebugLogger('aztec:node')) {
15
+ constructor(p2pClient, blockSource, encryptedLogsSource, unencryptedLogsSource, contractDataSource, l1ToL2MessageSource, worldStateSynchroniser, sequencer, chainId, version, log = createDebugLogger('aztec:node')) {
16
16
  this.p2pClient = p2pClient;
17
17
  this.blockSource = blockSource;
18
18
  this.encryptedLogsSource = encryptedLogsSource;
19
19
  this.unencryptedLogsSource = unencryptedLogsSource;
20
20
  this.contractDataSource = contractDataSource;
21
21
  this.l1ToL2MessageSource = l1ToL2MessageSource;
22
- this.merkleTreeDB = merkleTreeDB;
23
22
  this.worldStateSynchroniser = worldStateSynchroniser;
24
23
  this.sequencer = sequencer;
25
24
  this.chainId = chainId;
@@ -41,12 +40,13 @@ export class AztecNodeService {
41
40
  const p2pClient = await createP2PClient(config, new InMemoryTxPool(), archiver);
42
41
  // now create the merkle trees and the world state syncher
43
42
  const merkleTreeDB = await MerkleTrees.new(levelup(createMemDown()), await CircuitsWasm.get());
44
- const worldStateSynchroniser = new ServerWorldStateSynchroniser(merkleTreeDB, archiver);
43
+ const worldStateConfig = getWorldStateConfig();
44
+ const worldStateSynchroniser = new ServerWorldStateSynchroniser(merkleTreeDB, archiver, worldStateConfig);
45
45
  // start both and wait for them to sync from the block source
46
46
  await Promise.all([p2pClient.start(), worldStateSynchroniser.start()]);
47
47
  // now create the sequencer
48
48
  const sequencer = await SequencerClient.new(config, p2pClient, worldStateSynchroniser, archiver, archiver, archiver);
49
- return new AztecNodeService(p2pClient, archiver, archiver, archiver, archiver, archiver, merkleTreeDB, worldStateSynchroniser, sequencer, config.chainId, config.version);
49
+ return new AztecNodeService(p2pClient, archiver, archiver, archiver, archiver, archiver, worldStateSynchroniser, sequencer, config.chainId, config.version);
50
50
  }
51
51
  /**
52
52
  * Method to determine if the node is ready to accept transactions.
@@ -144,7 +144,6 @@ export class AztecNodeService {
144
144
  await this.sequencer.stop();
145
145
  await this.p2pClient.stop();
146
146
  await this.worldStateSynchroniser.stop();
147
- await this.merkleTreeDB.stop();
148
147
  await this.blockSource.stop();
149
148
  this.log.info(`Stopped`);
150
149
  }
@@ -168,32 +167,36 @@ export class AztecNodeService {
168
167
  * @param leafValue - The value to search for.
169
168
  * @returns The index of the given leaf in the contracts tree or undefined if not found.
170
169
  */
171
- findContractIndex(leafValue) {
172
- return this.merkleTreeDB.findLeafIndex(MerkleTreeId.CONTRACT_TREE, leafValue, false);
170
+ async findContractIndex(leafValue) {
171
+ const committedDb = await this.getWorldState();
172
+ return committedDb.findLeafIndex(MerkleTreeId.CONTRACT_TREE, leafValue);
173
173
  }
174
174
  /**
175
175
  * Returns the sibling path for the given index in the contract tree.
176
176
  * @param leafIndex - The index of the leaf for which the sibling path is required.
177
177
  * @returns The sibling path for the leaf index.
178
178
  */
179
- getContractPath(leafIndex) {
180
- return this.merkleTreeDB.getSiblingPath(MerkleTreeId.CONTRACT_TREE, leafIndex, false);
179
+ async getContractPath(leafIndex) {
180
+ const committedDb = await this.getWorldState();
181
+ return committedDb.getSiblingPath(MerkleTreeId.CONTRACT_TREE, leafIndex);
181
182
  }
182
183
  /**
183
184
  * Find the index of the given commitment.
184
185
  * @param leafValue - The value to search for.
185
186
  * @returns The index of the given leaf in the private data tree or undefined if not found.
186
187
  */
187
- findCommitmentIndex(leafValue) {
188
- return this.merkleTreeDB.findLeafIndex(MerkleTreeId.PRIVATE_DATA_TREE, leafValue, false);
188
+ async findCommitmentIndex(leafValue) {
189
+ const committedDb = await this.getWorldState();
190
+ return committedDb.findLeafIndex(MerkleTreeId.PRIVATE_DATA_TREE, leafValue);
189
191
  }
190
192
  /**
191
193
  * Returns the sibling path for the given index in the data tree.
192
194
  * @param leafIndex - The index of the leaf for which the sibling path is required.
193
195
  * @returns The sibling path for the leaf index.
194
196
  */
195
- getDataTreePath(leafIndex) {
196
- return this.merkleTreeDB.getSiblingPath(MerkleTreeId.PRIVATE_DATA_TREE, leafIndex, false);
197
+ async getDataTreePath(leafIndex) {
198
+ const committedDb = await this.getWorldState();
199
+ return committedDb.getSiblingPath(MerkleTreeId.PRIVATE_DATA_TREE, leafIndex);
197
200
  }
198
201
  /**
199
202
  * Gets a confirmed/consumed L1 to L2 message for the given message key
@@ -203,8 +206,9 @@ export class AztecNodeService {
203
206
  */
204
207
  async getL1ToL2MessageAndIndex(messageKey) {
205
208
  // todo: #697 - make this one lookup.
209
+ const committedDb = await this.getWorldState();
206
210
  const message = await this.l1ToL2MessageSource.getConfirmedL1ToL2Message(messageKey);
207
- const index = (await this.merkleTreeDB.findLeafIndex(MerkleTreeId.L1_TO_L2_MESSAGES_TREE, messageKey.toBuffer(), false));
211
+ const index = (await committedDb.findLeafIndex(MerkleTreeId.L1_TO_L2_MESSAGES_TREE, messageKey.toBuffer()));
208
212
  return Promise.resolve({ message, index });
209
213
  }
210
214
  /**
@@ -212,8 +216,9 @@ export class AztecNodeService {
212
216
  * @param leafIndex - Index of the leaf in the tree.
213
217
  * @returns The sibling path.
214
218
  */
215
- getL1ToL2MessagesTreePath(leafIndex) {
216
- return this.merkleTreeDB.getSiblingPath(MerkleTreeId.L1_TO_L2_MESSAGES_TREE, leafIndex, false);
219
+ async getL1ToL2MessagesTreePath(leafIndex) {
220
+ const committedDb = await this.getWorldState();
221
+ return committedDb.getSiblingPath(MerkleTreeId.L1_TO_L2_MESSAGES_TREE, leafIndex);
217
222
  }
218
223
  /**
219
224
  * Gets the storage value at the given contract slot.
@@ -223,22 +228,32 @@ export class AztecNodeService {
223
228
  * Note: Aztec's version of `eth_getStorageAt`.
224
229
  */
225
230
  async getPublicStorageAt(contract, slot) {
231
+ const committedDb = await this.getWorldState();
226
232
  const leafIndex = computePublicDataTreeLeafIndex(contract, new Fr(slot), await CircuitsWasm.get());
227
- return this.merkleTreeDB.getLeafValue(MerkleTreeId.PUBLIC_DATA_TREE, leafIndex, false);
233
+ return committedDb.getLeafValue(MerkleTreeId.PUBLIC_DATA_TREE, leafIndex);
228
234
  }
229
235
  /**
230
236
  * Returns the current committed roots for the data trees.
231
237
  * @returns The current committed roots for the data trees.
232
238
  */
233
239
  async getTreeRoots() {
234
- const getTreeRoot = async (id) => Fr.fromBuffer((await this.merkleTreeDB.getTreeInfo(id, false)).root);
240
+ const committedDb = await this.getWorldState();
241
+ const getTreeRoot = async (id) => Fr.fromBuffer((await committedDb.getTreeInfo(id)).root);
242
+ const [privateDataTree, nullifierTree, contractTree, l1ToL2MessagesTree, blocksTree, publicDataTree] = await Promise.all([
243
+ getTreeRoot(MerkleTreeId.PRIVATE_DATA_TREE),
244
+ getTreeRoot(MerkleTreeId.NULLIFIER_TREE),
245
+ getTreeRoot(MerkleTreeId.CONTRACT_TREE),
246
+ getTreeRoot(MerkleTreeId.L1_TO_L2_MESSAGES_TREE),
247
+ getTreeRoot(MerkleTreeId.BLOCKS_TREE),
248
+ getTreeRoot(MerkleTreeId.PUBLIC_DATA_TREE),
249
+ ]);
235
250
  return {
236
- [MerkleTreeId.CONTRACT_TREE]: await getTreeRoot(MerkleTreeId.CONTRACT_TREE),
237
- [MerkleTreeId.PRIVATE_DATA_TREE]: await getTreeRoot(MerkleTreeId.PRIVATE_DATA_TREE),
238
- [MerkleTreeId.NULLIFIER_TREE]: await getTreeRoot(MerkleTreeId.NULLIFIER_TREE),
239
- [MerkleTreeId.PUBLIC_DATA_TREE]: await getTreeRoot(MerkleTreeId.PUBLIC_DATA_TREE),
240
- [MerkleTreeId.L1_TO_L2_MESSAGES_TREE]: await getTreeRoot(MerkleTreeId.L1_TO_L2_MESSAGES_TREE),
241
- [MerkleTreeId.BLOCKS_TREE]: await getTreeRoot(MerkleTreeId.BLOCKS_TREE),
251
+ [MerkleTreeId.CONTRACT_TREE]: contractTree,
252
+ [MerkleTreeId.PRIVATE_DATA_TREE]: privateDataTree,
253
+ [MerkleTreeId.NULLIFIER_TREE]: nullifierTree,
254
+ [MerkleTreeId.PUBLIC_DATA_TREE]: publicDataTree,
255
+ [MerkleTreeId.L1_TO_L2_MESSAGES_TREE]: l1ToL2MessagesTree,
256
+ [MerkleTreeId.BLOCKS_TREE]: blocksTree,
242
257
  };
243
258
  }
244
259
  /**
@@ -246,9 +261,31 @@ export class AztecNodeService {
246
261
  * @returns The current committed block data.
247
262
  */
248
263
  async getHistoricBlockData() {
249
- const getTreeRoot = async (id) => Fr.fromBuffer((await this.merkleTreeDB.getTreeInfo(id, false)).root);
250
- const globalsHash = this.worldStateSynchroniser.latestGlobalVariablesHash;
251
- return new HistoricBlockData(await getTreeRoot(MerkleTreeId.PRIVATE_DATA_TREE), await getTreeRoot(MerkleTreeId.NULLIFIER_TREE), await getTreeRoot(MerkleTreeId.CONTRACT_TREE), await getTreeRoot(MerkleTreeId.L1_TO_L2_MESSAGES_TREE), await getTreeRoot(MerkleTreeId.BLOCKS_TREE), Fr.ZERO, await getTreeRoot(MerkleTreeId.PUBLIC_DATA_TREE), globalsHash);
264
+ const committedDb = await this.getWorldState();
265
+ const [roots, globalsHash] = await Promise.all([this.getTreeRoots(), committedDb.getLatestGlobalVariablesHash()]);
266
+ return new HistoricBlockData(roots[MerkleTreeId.PRIVATE_DATA_TREE], roots[MerkleTreeId.NULLIFIER_TREE], roots[MerkleTreeId.CONTRACT_TREE], roots[MerkleTreeId.L1_TO_L2_MESSAGES_TREE], roots[MerkleTreeId.BLOCKS_TREE], Fr.ZERO, roots[MerkleTreeId.PUBLIC_DATA_TREE], globalsHash);
267
+ }
268
+ /**
269
+ * Returns an instance of MerkleTreeOperations having first ensured the world state is fully synched
270
+ * @returns An instance of a committed MerkleTreeOperations
271
+ */
272
+ async getWorldState() {
273
+ try {
274
+ // Attempt to sync the world state if necessary
275
+ await this.syncWorldState();
276
+ }
277
+ catch (err) {
278
+ this.log.error(`Error getting world state: ${err}`);
279
+ }
280
+ return this.worldStateSynchroniser.getCommitted();
281
+ }
282
+ /**
283
+ * Ensure we fully sync the world state
284
+ * @returns A promise that fulfils once the world state is synced
285
+ */
286
+ async syncWorldState() {
287
+ const blockSourceHeight = await this.blockSource.getBlockHeight();
288
+ await this.worldStateSynchroniser.syncImmediate(blockSourceHeight);
252
289
  }
253
290
  }
254
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2F6dGVjLW5vZGUvc2VydmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBRUwsWUFBWSxFQUVaLEVBQUUsRUFDRixpQkFBaUIsR0FHbEIsTUFBTSxvQkFBb0IsQ0FBQztBQUU1QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsY0FBYyxFQUFPLGVBQWUsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNsRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDMUQsT0FBTyxFQVdMLE9BQU8sRUFDUCxZQUFZLEdBSWIsTUFBTSxjQUFjLENBQUM7QUFDdEIsT0FBTyxFQUNMLFdBQVcsRUFDWCw0QkFBNEIsRUFFNUIsOEJBQThCLEdBQy9CLE1BQU0sb0JBQW9CLENBQUM7QUFFNUIsT0FBTyxFQUFFLE9BQU8sSUFBSSxPQUFPLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDN0MsT0FBTyxFQUFXLE9BQU8sSUFBSSxPQUFPLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFJdEQsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLEdBQUcsRUFBRSxDQUFFLE9BQWUsRUFBdUIsQ0FBQztBQUUzRTs7R0FFRztBQUNILE1BQU0sT0FBTyxnQkFBZ0I7SUFDM0IsWUFDWSxTQUFjLEVBQ2QsV0FBMEIsRUFDMUIsbUJBQWlDLEVBQ2pDLHFCQUFtQyxFQUNuQyxrQkFBc0MsRUFDdEMsbUJBQXdDLEVBQ3hDLFlBQXlCLEVBQ3pCLHNCQUE4QyxFQUM5QyxTQUEwQixFQUMxQixPQUFlLEVBQ2YsT0FBZSxFQUNqQixNQUFNLGlCQUFpQixDQUFDLFlBQVksQ0FBQztRQVhuQyxjQUFTLEdBQVQsU0FBUyxDQUFLO1FBQ2QsZ0JBQVcsR0FBWCxXQUFXLENB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
291
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2F6dGVjLW5vZGUvc2VydmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBRUwsWUFBWSxFQUVaLEVBQUUsRUFDRixpQkFBaUIsR0FHbEIsTUFBTSxvQkFBb0IsQ0FBQztBQUU1QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsY0FBYyxFQUFPLGVBQWUsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNsRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDMUQsT0FBTyxFQVdMLE9BQU8sRUFDUCxZQUFZLEdBSWIsTUFBTSxjQUFjLENBQUM7QUFDdEIsT0FBTyxFQUNMLFdBQVcsRUFDWCw0QkFBNEIsRUFHNUIsOEJBQThCLEVBQzlCLGdCQUFnQixJQUFJLG1CQUFtQixHQUN4QyxNQUFNLG9CQUFvQixDQUFDO0FBRTVCLE9BQU8sRUFBRSxPQUFPLElBQUksT0FBTyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQzdDLE9BQU8sRUFBVyxPQUFPLElBQUksT0FBTyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBSXRELE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxHQUFHLEVBQUUsQ0FBRSxPQUFlLEVBQXVCLENBQUM7QUFFM0U7O0dBRUc7QUFDSCxNQUFNLE9BQU8sZ0JBQWdCO0lBQzNCLFlBQ1ksU0FBYyxFQUNkLFdBQTBCLEVBQzFCLG1CQUFpQyxFQUNqQyxxQkFBbUMsRUFDbkMsa0JBQXNDLEVBQ3RDLG1CQUF3QyxFQUN4QyxzQkFBOEMsRUFDOUMsU0FBMEIsRUFDMUIsT0FBZSxFQUNmLE9BQWUsRUFDakIsTUFBTSxpQkFBaUIsQ0FBQyxZQUFZLENBQUM7UUFWbkMsY0FBUyxHQUFULFNBQVMsQ0FBSztRQUNkLGdCQUFX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
package/package.json CHANGED
@@ -1,19 +1,19 @@
1
1
  {
2
2
  "name": "@aztec/aztec-node",
3
- "version": "0.1.0-alpha43",
3
+ "version": "0.1.0-alpha44",
4
4
  "exports": "./dest/index.js",
5
5
  "main": "dest/index.js",
6
6
  "type": "module",
7
7
  "dependencies": {
8
- "@aztec/archiver": "0.1.0-alpha43",
9
- "@aztec/circuits.js": "0.1.0-alpha43",
10
- "@aztec/foundation": "0.1.0-alpha43",
11
- "@aztec/l1-artifacts": "0.1.0-alpha43",
12
- "@aztec/merkle-tree": "0.1.0-alpha43",
13
- "@aztec/p2p": "0.1.0-alpha43",
14
- "@aztec/sequencer-client": "0.1.0-alpha43",
15
- "@aztec/types": "0.1.0-alpha43",
16
- "@aztec/world-state": "0.1.0-alpha43",
8
+ "@aztec/archiver": "0.1.0-alpha44",
9
+ "@aztec/circuits.js": "0.1.0-alpha44",
10
+ "@aztec/foundation": "0.1.0-alpha44",
11
+ "@aztec/l1-artifacts": "0.1.0-alpha44",
12
+ "@aztec/merkle-tree": "0.1.0-alpha44",
13
+ "@aztec/p2p": "0.1.0-alpha44",
14
+ "@aztec/sequencer-client": "0.1.0-alpha44",
15
+ "@aztec/types": "0.1.0-alpha44",
16
+ "@aztec/world-state": "0.1.0-alpha44",
17
17
  "tslib": "^2.4.0"
18
18
  }
19
19
  }
@@ -32,8 +32,10 @@ import {
32
32
  import {
33
33
  MerkleTrees,
34
34
  ServerWorldStateSynchroniser,
35
+ WorldStateConfig,
35
36
  WorldStateSynchroniser,
36
37
  computePublicDataTreeLeafIndex,
38
+ getConfigEnvVars as getWorldStateConfig,
37
39
  } from '@aztec/world-state';
38
40
 
39
41
  import { default as levelup } from 'levelup';
@@ -54,7 +56,6 @@ export class AztecNodeService implements AztecNode {
54
56
  protected unencryptedLogsSource: L2LogsSource,
55
57
  protected contractDataSource: ContractDataSource,
56
58
  protected l1ToL2MessageSource: L1ToL2MessageSource,
57
- protected merkleTreeDB: MerkleTrees,
58
59
  protected worldStateSynchroniser: WorldStateSynchroniser,
59
60
  protected sequencer: SequencerClient,
60
61
  protected chainId: number,
@@ -80,7 +81,8 @@ export class AztecNodeService implements AztecNode {
80
81
 
81
82
  // now create the merkle trees and the world state syncher
82
83
  const merkleTreeDB = await MerkleTrees.new(levelup(createMemDown()), await CircuitsWasm.get());
83
- const worldStateSynchroniser = new ServerWorldStateSynchroniser(merkleTreeDB, archiver);
84
+ const worldStateConfig: WorldStateConfig = getWorldStateConfig();
85
+ const worldStateSynchroniser = new ServerWorldStateSynchroniser(merkleTreeDB, archiver, worldStateConfig);
84
86
 
85
87
  // start both and wait for them to sync from the block source
86
88
  await Promise.all([p2pClient.start(), worldStateSynchroniser.start()]);
@@ -101,7 +103,6 @@ export class AztecNodeService implements AztecNode {
101
103
  archiver,
102
104
  archiver,
103
105
  archiver,
104
- merkleTreeDB,
105
106
  worldStateSynchroniser,
106
107
  sequencer,
107
108
  config.chainId,
@@ -216,7 +217,6 @@ export class AztecNodeService implements AztecNode {
216
217
  await this.sequencer.stop();
217
218
  await this.p2pClient.stop();
218
219
  await this.worldStateSynchroniser.stop();
219
- await this.merkleTreeDB.stop();
220
220
  await this.blockSource.stop();
221
221
  this.log.info(`Stopped`);
222
222
  }
@@ -243,8 +243,9 @@ export class AztecNodeService implements AztecNode {
243
243
  * @param leafValue - The value to search for.
244
244
  * @returns The index of the given leaf in the contracts tree or undefined if not found.
245
245
  */
246
- public findContractIndex(leafValue: Buffer): Promise<bigint | undefined> {
247
- return this.merkleTreeDB.findLeafIndex(MerkleTreeId.CONTRACT_TREE, leafValue, false);
246
+ public async findContractIndex(leafValue: Buffer): Promise<bigint | undefined> {
247
+ const committedDb = await this.getWorldState();
248
+ return committedDb.findLeafIndex(MerkleTreeId.CONTRACT_TREE, leafValue);
248
249
  }
249
250
 
250
251
  /**
@@ -252,8 +253,9 @@ export class AztecNodeService implements AztecNode {
252
253
  * @param leafIndex - The index of the leaf for which the sibling path is required.
253
254
  * @returns The sibling path for the leaf index.
254
255
  */
255
- public getContractPath(leafIndex: bigint): Promise<SiblingPath<typeof CONTRACT_TREE_HEIGHT>> {
256
- return this.merkleTreeDB.getSiblingPath(MerkleTreeId.CONTRACT_TREE, leafIndex, false);
256
+ public async getContractPath(leafIndex: bigint): Promise<SiblingPath<typeof CONTRACT_TREE_HEIGHT>> {
257
+ const committedDb = await this.getWorldState();
258
+ return committedDb.getSiblingPath(MerkleTreeId.CONTRACT_TREE, leafIndex);
257
259
  }
258
260
 
259
261
  /**
@@ -261,8 +263,9 @@ export class AztecNodeService implements AztecNode {
261
263
  * @param leafValue - The value to search for.
262
264
  * @returns The index of the given leaf in the private data tree or undefined if not found.
263
265
  */
264
- public findCommitmentIndex(leafValue: Buffer): Promise<bigint | undefined> {
265
- return this.merkleTreeDB.findLeafIndex(MerkleTreeId.PRIVATE_DATA_TREE, leafValue, false);
266
+ public async findCommitmentIndex(leafValue: Buffer): Promise<bigint | undefined> {
267
+ const committedDb = await this.getWorldState();
268
+ return committedDb.findLeafIndex(MerkleTreeId.PRIVATE_DATA_TREE, leafValue);
266
269
  }
267
270
 
268
271
  /**
@@ -270,8 +273,9 @@ export class AztecNodeService implements AztecNode {
270
273
  * @param leafIndex - The index of the leaf for which the sibling path is required.
271
274
  * @returns The sibling path for the leaf index.
272
275
  */
273
- public getDataTreePath(leafIndex: bigint): Promise<SiblingPath<typeof PRIVATE_DATA_TREE_HEIGHT>> {
274
- return this.merkleTreeDB.getSiblingPath(MerkleTreeId.PRIVATE_DATA_TREE, leafIndex, false);
276
+ public async getDataTreePath(leafIndex: bigint): Promise<SiblingPath<typeof PRIVATE_DATA_TREE_HEIGHT>> {
277
+ const committedDb = await this.getWorldState();
278
+ return committedDb.getSiblingPath(MerkleTreeId.PRIVATE_DATA_TREE, leafIndex);
275
279
  }
276
280
 
277
281
  /**
@@ -282,12 +286,9 @@ export class AztecNodeService implements AztecNode {
282
286
  */
283
287
  public async getL1ToL2MessageAndIndex(messageKey: Fr): Promise<L1ToL2MessageAndIndex> {
284
288
  // todo: #697 - make this one lookup.
289
+ const committedDb = await this.getWorldState();
285
290
  const message = await this.l1ToL2MessageSource.getConfirmedL1ToL2Message(messageKey);
286
- const index = (await this.merkleTreeDB.findLeafIndex(
287
- MerkleTreeId.L1_TO_L2_MESSAGES_TREE,
288
- messageKey.toBuffer(),
289
- false,
290
- ))!;
291
+ const index = (await committedDb.findLeafIndex(MerkleTreeId.L1_TO_L2_MESSAGES_TREE, messageKey.toBuffer()))!;
291
292
  return Promise.resolve({ message, index });
292
293
  }
293
294
 
@@ -296,8 +297,9 @@ export class AztecNodeService implements AztecNode {
296
297
  * @param leafIndex - Index of the leaf in the tree.
297
298
  * @returns The sibling path.
298
299
  */
299
- public getL1ToL2MessagesTreePath(leafIndex: bigint): Promise<SiblingPath<typeof L1_TO_L2_MSG_TREE_HEIGHT>> {
300
- return this.merkleTreeDB.getSiblingPath(MerkleTreeId.L1_TO_L2_MESSAGES_TREE, leafIndex, false);
300
+ public async getL1ToL2MessagesTreePath(leafIndex: bigint): Promise<SiblingPath<typeof L1_TO_L2_MSG_TREE_HEIGHT>> {
301
+ const committedDb = await this.getWorldState();
302
+ return committedDb.getSiblingPath(MerkleTreeId.L1_TO_L2_MESSAGES_TREE, leafIndex);
301
303
  }
302
304
 
303
305
  /**
@@ -308,8 +310,9 @@ export class AztecNodeService implements AztecNode {
308
310
  * Note: Aztec's version of `eth_getStorageAt`.
309
311
  */
310
312
  public async getPublicStorageAt(contract: AztecAddress, slot: bigint): Promise<Buffer | undefined> {
313
+ const committedDb = await this.getWorldState();
311
314
  const leafIndex = computePublicDataTreeLeafIndex(contract, new Fr(slot), await CircuitsWasm.get());
312
- return this.merkleTreeDB.getLeafValue(MerkleTreeId.PUBLIC_DATA_TREE, leafIndex, false);
315
+ return committedDb.getLeafValue(MerkleTreeId.PUBLIC_DATA_TREE, leafIndex);
313
316
  }
314
317
 
315
318
  /**
@@ -317,16 +320,26 @@ export class AztecNodeService implements AztecNode {
317
320
  * @returns The current committed roots for the data trees.
318
321
  */
319
322
  public async getTreeRoots(): Promise<Record<MerkleTreeId, Fr>> {
320
- const getTreeRoot = async (id: MerkleTreeId) =>
321
- Fr.fromBuffer((await this.merkleTreeDB.getTreeInfo(id, false)).root);
323
+ const committedDb = await this.getWorldState();
324
+ const getTreeRoot = async (id: MerkleTreeId) => Fr.fromBuffer((await committedDb.getTreeInfo(id)).root);
325
+
326
+ const [privateDataTree, nullifierTree, contractTree, l1ToL2MessagesTree, blocksTree, publicDataTree] =
327
+ await Promise.all([
328
+ getTreeRoot(MerkleTreeId.PRIVATE_DATA_TREE),
329
+ getTreeRoot(MerkleTreeId.NULLIFIER_TREE),
330
+ getTreeRoot(MerkleTreeId.CONTRACT_TREE),
331
+ getTreeRoot(MerkleTreeId.L1_TO_L2_MESSAGES_TREE),
332
+ getTreeRoot(MerkleTreeId.BLOCKS_TREE),
333
+ getTreeRoot(MerkleTreeId.PUBLIC_DATA_TREE),
334
+ ]);
322
335
 
323
336
  return {
324
- [MerkleTreeId.CONTRACT_TREE]: await getTreeRoot(MerkleTreeId.CONTRACT_TREE),
325
- [MerkleTreeId.PRIVATE_DATA_TREE]: await getTreeRoot(MerkleTreeId.PRIVATE_DATA_TREE),
326
- [MerkleTreeId.NULLIFIER_TREE]: await getTreeRoot(MerkleTreeId.NULLIFIER_TREE),
327
- [MerkleTreeId.PUBLIC_DATA_TREE]: await getTreeRoot(MerkleTreeId.PUBLIC_DATA_TREE),
328
- [MerkleTreeId.L1_TO_L2_MESSAGES_TREE]: await getTreeRoot(MerkleTreeId.L1_TO_L2_MESSAGES_TREE),
329
- [MerkleTreeId.BLOCKS_TREE]: await getTreeRoot(MerkleTreeId.BLOCKS_TREE),
337
+ [MerkleTreeId.CONTRACT_TREE]: contractTree,
338
+ [MerkleTreeId.PRIVATE_DATA_TREE]: privateDataTree,
339
+ [MerkleTreeId.NULLIFIER_TREE]: nullifierTree,
340
+ [MerkleTreeId.PUBLIC_DATA_TREE]: publicDataTree,
341
+ [MerkleTreeId.L1_TO_L2_MESSAGES_TREE]: l1ToL2MessagesTree,
342
+ [MerkleTreeId.BLOCKS_TREE]: blocksTree,
330
343
  };
331
344
  }
332
345
 
@@ -335,20 +348,41 @@ export class AztecNodeService implements AztecNode {
335
348
  * @returns The current committed block data.
336
349
  */
337
350
  public async getHistoricBlockData(): Promise<HistoricBlockData> {
338
- const getTreeRoot = async (id: MerkleTreeId) =>
339
- Fr.fromBuffer((await this.merkleTreeDB.getTreeInfo(id, false)).root);
340
-
341
- const globalsHash = this.worldStateSynchroniser.latestGlobalVariablesHash;
351
+ const committedDb = await this.getWorldState();
352
+ const [roots, globalsHash] = await Promise.all([this.getTreeRoots(), committedDb.getLatestGlobalVariablesHash()]);
342
353
 
343
354
  return new HistoricBlockData(
344
- await getTreeRoot(MerkleTreeId.PRIVATE_DATA_TREE),
345
- await getTreeRoot(MerkleTreeId.NULLIFIER_TREE),
346
- await getTreeRoot(MerkleTreeId.CONTRACT_TREE),
347
- await getTreeRoot(MerkleTreeId.L1_TO_L2_MESSAGES_TREE),
348
- await getTreeRoot(MerkleTreeId.BLOCKS_TREE),
355
+ roots[MerkleTreeId.PRIVATE_DATA_TREE],
356
+ roots[MerkleTreeId.NULLIFIER_TREE],
357
+ roots[MerkleTreeId.CONTRACT_TREE],
358
+ roots[MerkleTreeId.L1_TO_L2_MESSAGES_TREE],
359
+ roots[MerkleTreeId.BLOCKS_TREE],
349
360
  Fr.ZERO,
350
- await getTreeRoot(MerkleTreeId.PUBLIC_DATA_TREE),
361
+ roots[MerkleTreeId.PUBLIC_DATA_TREE],
351
362
  globalsHash,
352
363
  );
353
364
  }
365
+
366
+ /**
367
+ * Returns an instance of MerkleTreeOperations having first ensured the world state is fully synched
368
+ * @returns An instance of a committed MerkleTreeOperations
369
+ */
370
+ private async getWorldState() {
371
+ try {
372
+ // Attempt to sync the world state if necessary
373
+ await this.syncWorldState();
374
+ } catch (err) {
375
+ this.log.error(`Error getting world state: ${err}`);
376
+ }
377
+ return this.worldStateSynchroniser.getCommitted();
378
+ }
379
+
380
+ /**
381
+ * Ensure we fully sync the world state
382
+ * @returns A promise that fulfils once the world state is synced
383
+ */
384
+ private async syncWorldState() {
385
+ const blockSourceHeight = await this.blockSource.getBlockHeight();
386
+ await this.worldStateSynchroniser.syncImmediate(blockSourceHeight);
387
+ }
354
388
  }