@aztec/world-state 0.66.0 → 0.67.1-devnet

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/dest/native/merkle_trees_facade.d.ts +8 -8
  2. package/dest/native/merkle_trees_facade.d.ts.map +1 -1
  3. package/dest/native/merkle_trees_facade.js +14 -12
  4. package/dest/native/message.d.ts +9 -7
  5. package/dest/native/message.d.ts.map +1 -1
  6. package/dest/native/message.js +2 -2
  7. package/dest/native/native_world_state.d.ts +3 -3
  8. package/dest/native/native_world_state.d.ts.map +1 -1
  9. package/dest/native/native_world_state.js +9 -8
  10. package/dest/native/native_world_state_instance.d.ts.map +1 -1
  11. package/dest/native/native_world_state_instance.js +3 -15
  12. package/dest/synchronizer/factory.d.ts.map +1 -1
  13. package/dest/synchronizer/factory.js +4 -4
  14. package/dest/synchronizer/instrumentation.d.ts +9 -1
  15. package/dest/synchronizer/instrumentation.d.ts.map +1 -1
  16. package/dest/synchronizer/instrumentation.js +52 -72
  17. package/dest/synchronizer/server_world_state_synchronizer.d.ts +1 -1
  18. package/dest/synchronizer/server_world_state_synchronizer.d.ts.map +1 -1
  19. package/dest/synchronizer/server_world_state_synchronizer.js +12 -10
  20. package/dest/world-state-db/merkle_tree_operations_facade.d.ts +5 -5
  21. package/dest/world-state-db/merkle_tree_operations_facade.d.ts.map +1 -1
  22. package/dest/world-state-db/merkle_tree_operations_facade.js +5 -5
  23. package/dest/world-state-db/merkle_tree_snapshot_operations_facade.d.ts +4 -4
  24. package/dest/world-state-db/merkle_tree_snapshot_operations_facade.d.ts.map +1 -1
  25. package/dest/world-state-db/merkle_tree_snapshot_operations_facade.js +6 -6
  26. package/dest/world-state-db/merkle_trees.d.ts +5 -4
  27. package/dest/world-state-db/merkle_trees.d.ts.map +1 -1
  28. package/dest/world-state-db/merkle_trees.js +7 -7
  29. package/package.json +14 -9
  30. package/src/native/merkle_trees_facade.ts +19 -17
  31. package/src/native/message.ts +9 -7
  32. package/src/native/native_world_state.ts +11 -10
  33. package/src/native/native_world_state_instance.ts +2 -13
  34. package/src/synchronizer/factory.ts +3 -6
  35. package/src/synchronizer/instrumentation.ts +54 -84
  36. package/src/synchronizer/server_world_state_synchronizer.ts +12 -11
  37. package/src/world-state-db/merkle_tree_operations_facade.ts +14 -9
  38. package/src/world-state-db/merkle_tree_snapshot_operations_facade.ts +17 -8
  39. package/src/world-state-db/merkle_trees.ts +14 -10
@@ -3,7 +3,7 @@ import {
3
3
  type L2Block,
4
4
  type L2BlockId,
5
5
  type L2BlockSource,
6
- L2BlockStream,
6
+ type L2BlockStream,
7
7
  type L2BlockStreamEvent,
8
8
  type L2BlockStreamEventHandler,
9
9
  type L2BlockStreamLocalDataProvider,
@@ -19,11 +19,11 @@ import { type L2BlockHandledStats } from '@aztec/circuit-types/stats';
19
19
  import { MerkleTreeCalculator } from '@aztec/circuits.js';
20
20
  import { L1_TO_L2_MSG_SUBTREE_HEIGHT } from '@aztec/circuits.js/constants';
21
21
  import { type Fr } from '@aztec/foundation/fields';
22
- import { createDebugLogger } from '@aztec/foundation/log';
22
+ import { createLogger } from '@aztec/foundation/log';
23
23
  import { promiseWithResolvers } from '@aztec/foundation/promise';
24
24
  import { elapsed } from '@aztec/foundation/timer';
25
25
  import { SHA256Trunc } from '@aztec/merkle-tree';
26
- import { type TelemetryClient } from '@aztec/telemetry-client';
26
+ import { type TelemetryClient, TraceableL2BlockStream } from '@aztec/telemetry-client';
27
27
 
28
28
  import { type WorldStateStatusFull } from '../native/message.js';
29
29
  import { type MerkleTreeAdminDatabase } from '../world-state-db/merkle_tree_db.js';
@@ -54,7 +54,7 @@ export class ServerWorldStateSynchronizer
54
54
  private readonly l2BlockSource: L2BlockSource & L1ToL2MessageSource,
55
55
  private readonly config: WorldStateConfig,
56
56
  telemetry: TelemetryClient,
57
- private readonly log = createDebugLogger('aztec:world_state'),
57
+ private readonly log = createLogger('world_state'),
58
58
  ) {
59
59
  this.instrumentation = new WorldStateInstrumentation(telemetry);
60
60
  this.merkleTreeCommitted = this.merkleTreeDb.getCommitted();
@@ -110,8 +110,10 @@ export class ServerWorldStateSynchronizer
110
110
  return this.syncPromise.promise;
111
111
  }
112
112
 
113
- protected createBlockStream() {
114
- return new L2BlockStream(this.l2BlockSource, this, this, {
113
+ protected createBlockStream(): L2BlockStream {
114
+ const tracer = this.instrumentation.telemetry.getTracer('WorldStateL2BlockStream');
115
+ const logger = createLogger('world-state:block_stream');
116
+ return new TraceableL2BlockStream(this.l2BlockSource, this, this, tracer, 'WorldStateL2BlockStream', logger, {
115
117
  proven: this.config.worldStateProvenBlocksOnly,
116
118
  pollIntervalMS: this.config.worldStateBlockCheckIntervalMS,
117
119
  batchSize: this.config.worldStateBlockRequestBatchSize,
@@ -224,14 +226,13 @@ export class ServerWorldStateSynchronizer
224
226
  * @returns Whether the block handled was produced by this same node.
225
227
  */
226
228
  private async handleL2Blocks(l2Blocks: L2Block[]) {
227
- this.log.verbose(`Handling new L2 blocks from ${l2Blocks[0].number} to ${l2Blocks[l2Blocks.length - 1].number}`);
228
229
  const messagePromises = l2Blocks.map(block => this.l2BlockSource.getL1ToL2Messages(BigInt(block.number)));
229
230
  const l1ToL2Messages: Fr[][] = await Promise.all(messagePromises);
230
231
  let updateStatus: WorldStateStatusFull | undefined = undefined;
231
232
 
232
233
  for (let i = 0; i < l2Blocks.length; i++) {
233
234
  const [duration, result] = await elapsed(() => this.handleL2Block(l2Blocks[i], l1ToL2Messages[i]));
234
- this.log.verbose(`Handled new L2 block`, {
235
+ this.log.verbose(`World state updated with L2 block ${l2Blocks[i].number}`, {
235
236
  eventName: 'l2-block-handled',
236
237
  duration,
237
238
  unfinalisedBlockNumber: result.summary.unfinalisedBlockNumber,
@@ -272,7 +273,7 @@ export class ServerWorldStateSynchronizer
272
273
  }
273
274
 
274
275
  private async handleChainFinalized(blockNumber: number) {
275
- this.log.verbose(`Chain finalized at block ${blockNumber}`);
276
+ this.log.verbose(`Finalized chain is now at block ${blockNumber}`);
276
277
  const summary = await this.merkleTreeDb.setFinalised(BigInt(blockNumber));
277
278
  if (this.historyToKeep === undefined) {
278
279
  return;
@@ -286,12 +287,12 @@ export class ServerWorldStateSynchronizer
286
287
  }
287
288
 
288
289
  private handleChainProven(blockNumber: number) {
289
- this.log.verbose(`Chain proven at block ${blockNumber}`);
290
+ this.log.debug(`Proven chain is now at block ${blockNumber}`);
290
291
  return Promise.resolve();
291
292
  }
292
293
 
293
294
  private async handleChainPruned(blockNumber: number) {
294
- this.log.info(`Chain pruned to block ${blockNumber}`);
295
+ this.log.warn(`Chain pruned to block ${blockNumber}`);
295
296
  const status = await this.merkleTreeDb.unwindBlocks(BigInt(blockNumber));
296
297
  this.latestBlockHashQuery = undefined;
297
298
  this.instrumentation.updateWorldStateMetrics(status);
@@ -6,7 +6,7 @@ import {
6
6
  type SequentialInsertionResult,
7
7
  type TreeInfo,
8
8
  } from '@aztec/circuit-types/interfaces';
9
- import { type Header, type StateReference } from '@aztec/circuits.js';
9
+ import { type BlockHeader, type StateReference } from '@aztec/circuits.js';
10
10
  import { type IndexedTreeLeafPreimage } from '@aztec/foundation/trees';
11
11
 
12
12
  import { type MerkleTrees } from './merkle_trees.js';
@@ -39,7 +39,7 @@ export class MerkleTreeReadOperationsFacade implements MerkleTreeWriteOperations
39
39
  * Returns the initial header for the chain before the first block.
40
40
  * @returns The initial header.
41
41
  */
42
- getInitialHeader(): Header {
42
+ getInitialHeader(): BlockHeader {
43
43
  return this.trees.getInitialHeader();
44
44
  }
45
45
 
@@ -110,8 +110,11 @@ export class MerkleTreeReadOperationsFacade implements MerkleTreeWriteOperations
110
110
  * @param value - The leaf value to look for.
111
111
  * @returns The index of the first leaf found with a given value (undefined if not found).
112
112
  */
113
- findLeafIndex<ID extends MerkleTreeId>(treeId: ID, value: MerkleTreeLeafType<ID>): Promise<bigint | undefined> {
114
- return this.trees.findLeafIndex(treeId, value, this.includeUncommitted);
113
+ findLeafIndices<ID extends MerkleTreeId>(
114
+ treeId: ID,
115
+ values: MerkleTreeLeafType<ID>[],
116
+ ): Promise<(bigint | undefined)[]> {
117
+ return Promise.all(values.map(leaf => this.trees.findLeafIndex(treeId, leaf, this.includeUncommitted)));
115
118
  }
116
119
 
117
120
  /**
@@ -120,12 +123,14 @@ export class MerkleTreeReadOperationsFacade implements MerkleTreeWriteOperations
120
123
  * @param value - The value to search for in the tree.
121
124
  * @param startIndex - The index to start searching from (used when skipping nullified messages)
122
125
  */
123
- findLeafIndexAfter<ID extends MerkleTreeId>(
126
+ findLeafIndicesAfter<ID extends MerkleTreeId>(
124
127
  treeId: ID,
125
- value: MerkleTreeLeafType<ID>,
128
+ values: MerkleTreeLeafType<ID>[],
126
129
  startIndex: bigint,
127
- ): Promise<bigint | undefined> {
128
- return this.trees.findLeafIndexAfter(treeId, value, startIndex, this.includeUncommitted);
130
+ ): Promise<(bigint | undefined)[]> {
131
+ return Promise.all(
132
+ values.map(leaf => this.trees.findLeafIndexAfter(treeId, leaf, startIndex, this.includeUncommitted)),
133
+ );
129
134
  }
130
135
 
131
136
  /**
@@ -149,7 +154,7 @@ export class MerkleTreeReadOperationsFacade implements MerkleTreeWriteOperations
149
154
  * This includes all of the current roots of all of the data trees and the current blocks global vars.
150
155
  * @param header - The header to insert into the archive.
151
156
  */
152
- public updateArchive(header: Header): Promise<void> {
157
+ public updateArchive(header: BlockHeader): Promise<void> {
153
158
  return this.trees.updateArchive(header);
154
159
  }
155
160
 
@@ -5,7 +5,13 @@ import {
5
5
  type MerkleTreeReadOperations,
6
6
  type TreeInfo,
7
7
  } from '@aztec/circuit-types/interfaces';
8
- import { AppendOnlyTreeSnapshot, Fr, type Header, PartialStateReference, StateReference } from '@aztec/circuits.js';
8
+ import {
9
+ AppendOnlyTreeSnapshot,
10
+ type BlockHeader,
11
+ Fr,
12
+ PartialStateReference,
13
+ StateReference,
14
+ } from '@aztec/circuits.js';
9
15
  import { type IndexedTreeLeafPreimage } from '@aztec/foundation/trees';
10
16
  import { type IndexedTreeSnapshot } from '@aztec/merkle-tree';
11
17
 
@@ -34,20 +40,23 @@ export class MerkleTreeSnapshotOperationsFacade implements MerkleTreeReadOperati
34
40
  return this.#treeSnapshots[treeId]!;
35
41
  }
36
42
 
37
- async findLeafIndex<ID extends MerkleTreeId>(treeId: ID, value: MerkleTreeLeafType<ID>): Promise<bigint | undefined> {
43
+ async findLeafIndices<ID extends MerkleTreeId>(
44
+ treeId: ID,
45
+ values: MerkleTreeLeafType<ID>[],
46
+ ): Promise<(bigint | undefined)[]> {
38
47
  const tree = await this.#getTreeSnapshot(treeId);
39
48
  // TODO #5448 fix "as any"
40
- return tree.findLeafIndex(value as any);
49
+ return values.map(leaf => tree.findLeafIndex(leaf as any));
41
50
  }
42
51
 
43
- async findLeafIndexAfter<ID extends MerkleTreeId>(
52
+ async findLeafIndicesAfter<ID extends MerkleTreeId>(
44
53
  treeId: MerkleTreeId,
45
- value: MerkleTreeLeafType<ID>,
54
+ values: MerkleTreeLeafType<ID>[],
46
55
  startIndex: bigint,
47
- ): Promise<bigint | undefined> {
56
+ ): Promise<(bigint | undefined)[]> {
48
57
  const tree = await this.#getTreeSnapshot(treeId);
49
58
  // TODO #5448 fix "as any"
50
- return tree.findLeafIndexAfter(value as any, startIndex);
59
+ return values.map(leaf => tree.findLeafIndexAfter(leaf as any, startIndex));
51
60
  }
52
61
 
53
62
  async getLeafPreimage<ID extends IndexedTreeId>(
@@ -136,7 +145,7 @@ export class MerkleTreeSnapshotOperationsFacade implements MerkleTreeReadOperati
136
145
  );
137
146
  }
138
147
 
139
- getInitialHeader(): Header {
148
+ getInitialHeader(): BlockHeader {
140
149
  throw new Error('Getting initial header not supported on snapshot.');
141
150
  }
142
151
  }
@@ -10,8 +10,8 @@ import {
10
10
  import {
11
11
  ARCHIVE_HEIGHT,
12
12
  AppendOnlyTreeSnapshot,
13
+ BlockHeader,
13
14
  Fr,
14
- Header,
15
15
  L1_TO_L2_MSG_TREE_HEIGHT,
16
16
  MAX_NOTE_HASHES_PER_TX,
17
17
  MAX_NULLIFIERS_PER_TX,
@@ -31,12 +31,12 @@ import {
31
31
  StateReference,
32
32
  } from '@aztec/circuits.js';
33
33
  import { padArrayEnd } from '@aztec/foundation/collection';
34
- import { type DebugLogger, createDebugLogger } from '@aztec/foundation/log';
34
+ import { type Logger, createLogger } from '@aztec/foundation/log';
35
35
  import { SerialQueue } from '@aztec/foundation/queue';
36
36
  import { Timer, elapsed } from '@aztec/foundation/timer';
37
37
  import { type IndexedTreeLeafPreimage } from '@aztec/foundation/trees';
38
38
  import { type AztecKVStore, type AztecSingleton } from '@aztec/kv-store';
39
- import { openTmpStore } from '@aztec/kv-store/utils';
39
+ import { openTmpStore } from '@aztec/kv-store/lmdb';
40
40
  import {
41
41
  type AppendOnlyTree,
42
42
  type IndexedTree,
@@ -111,7 +111,7 @@ export class MerkleTrees implements MerkleTreeAdminDatabase {
111
111
  private initialStateReference: AztecSingleton<Buffer>;
112
112
  private metrics: WorldStateMetrics;
113
113
 
114
- private constructor(private store: AztecKVStore, private telemetryClient: TelemetryClient, private log: DebugLogger) {
114
+ private constructor(private store: AztecKVStore, private telemetryClient: TelemetryClient, private log: Logger) {
115
115
  this.initialStateReference = store.openSingleton('merkle_trees_initial_state_reference');
116
116
  this.metrics = new WorldStateMetrics(telemetryClient);
117
117
  }
@@ -121,7 +121,11 @@ export class MerkleTrees implements MerkleTreeAdminDatabase {
121
121
  * @param store - The db instance to use for data persistance.
122
122
  * @returns - A fully initialized MerkleTrees instance.
123
123
  */
124
- public static async new(store: AztecKVStore, client: TelemetryClient, log = createDebugLogger('aztec:merkle_trees')) {
124
+ public static async new(
125
+ store: AztecKVStore,
126
+ client: TelemetryClient,
127
+ log = createLogger('world-state:merkle_trees'),
128
+ ) {
125
129
  const merkleTrees = new MerkleTrees(store, client, log);
126
130
  await merkleTrees.#init();
127
131
  return merkleTrees;
@@ -239,7 +243,7 @@ export class MerkleTrees implements MerkleTreeAdminDatabase {
239
243
  const forked = new MerkleTrees(
240
244
  this.store,
241
245
  this.telemetryClient,
242
- createDebugLogger('aztec:merkle_trees:ephemeral_fork'),
246
+ createLogger('world-state:merkle_trees:ephemeral_fork'),
243
247
  );
244
248
  await forked.#init(true);
245
249
  return new MerkleTreeReadOperationsFacade(forked, true);
@@ -249,8 +253,8 @@ export class MerkleTrees implements MerkleTreeAdminDatabase {
249
253
  await this.store.delete();
250
254
  }
251
255
 
252
- public getInitialHeader(): Header {
253
- return Header.empty({ state: this.#loadInitialStateReference() });
256
+ public getInitialHeader(): BlockHeader {
257
+ return BlockHeader.empty({ state: this.#loadInitialStateReference() });
254
258
  }
255
259
 
256
260
  /**
@@ -285,7 +289,7 @@ export class MerkleTrees implements MerkleTreeAdminDatabase {
285
289
  * @param header - The header whose hash to insert into the archive.
286
290
  * @param includeUncommitted - Indicates whether to include uncommitted data.
287
291
  */
288
- public async updateArchive(header: Header) {
292
+ public async updateArchive(header: BlockHeader) {
289
293
  await this.synchronize(() => this.#updateArchive(header));
290
294
  }
291
295
 
@@ -519,7 +523,7 @@ export class MerkleTrees implements MerkleTreeAdminDatabase {
519
523
  return StateReference.fromBuffer(serialized);
520
524
  }
521
525
 
522
- async #updateArchive(header: Header) {
526
+ async #updateArchive(header: BlockHeader) {
523
527
  const state = await this.getStateReference(true);
524
528
 
525
529
  // This method should be called only when the block builder already updated the state so we sanity check that it's