@aztec/world-state 0.0.1-commit.b655e406 → 0.0.1-commit.bf2612ae

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 (54) hide show
  1. package/dest/index.d.ts +1 -1
  2. package/dest/instrumentation/instrumentation.d.ts +1 -1
  3. package/dest/instrumentation/instrumentation.d.ts.map +1 -1
  4. package/dest/instrumentation/instrumentation.js +11 -42
  5. package/dest/native/bench_metrics.d.ts +1 -1
  6. package/dest/native/bench_metrics.d.ts.map +1 -1
  7. package/dest/native/fork_checkpoint.d.ts +1 -1
  8. package/dest/native/fork_checkpoint.d.ts.map +1 -1
  9. package/dest/native/index.d.ts +1 -1
  10. package/dest/native/merkle_trees_facade.d.ts +12 -6
  11. package/dest/native/merkle_trees_facade.d.ts.map +1 -1
  12. package/dest/native/merkle_trees_facade.js +39 -8
  13. package/dest/native/message.d.ts +12 -11
  14. package/dest/native/message.d.ts.map +1 -1
  15. package/dest/native/message.js +14 -13
  16. package/dest/native/native_world_state.d.ts +11 -8
  17. package/dest/native/native_world_state.d.ts.map +1 -1
  18. package/dest/native/native_world_state.js +15 -11
  19. package/dest/native/native_world_state_instance.d.ts +10 -1
  20. package/dest/native/native_world_state_instance.d.ts.map +1 -1
  21. package/dest/native/native_world_state_instance.js +21 -0
  22. package/dest/native/world_state_ops_queue.d.ts +1 -1
  23. package/dest/native/world_state_ops_queue.d.ts.map +1 -1
  24. package/dest/synchronizer/config.d.ts +1 -3
  25. package/dest/synchronizer/config.d.ts.map +1 -1
  26. package/dest/synchronizer/config.js +1 -6
  27. package/dest/synchronizer/errors.d.ts +1 -1
  28. package/dest/synchronizer/errors.d.ts.map +1 -1
  29. package/dest/synchronizer/factory.d.ts +1 -1
  30. package/dest/synchronizer/index.d.ts +1 -1
  31. package/dest/synchronizer/server_world_state_synchronizer.d.ts +10 -27
  32. package/dest/synchronizer/server_world_state_synchronizer.d.ts.map +1 -1
  33. package/dest/synchronizer/server_world_state_synchronizer.js +79 -69
  34. package/dest/test/index.d.ts +1 -1
  35. package/dest/test/utils.d.ts +12 -5
  36. package/dest/test/utils.d.ts.map +1 -1
  37. package/dest/test/utils.js +54 -50
  38. package/dest/testing.d.ts +2 -2
  39. package/dest/testing.d.ts.map +1 -1
  40. package/dest/testing.js +1 -1
  41. package/dest/world-state-db/index.d.ts +1 -1
  42. package/dest/world-state-db/merkle_tree_db.d.ts +9 -10
  43. package/dest/world-state-db/merkle_tree_db.d.ts.map +1 -1
  44. package/package.json +13 -12
  45. package/src/instrumentation/instrumentation.ts +10 -42
  46. package/src/native/merkle_trees_facade.ts +42 -8
  47. package/src/native/message.ts +23 -22
  48. package/src/native/native_world_state.ts +35 -21
  49. package/src/native/native_world_state_instance.ts +28 -0
  50. package/src/synchronizer/config.ts +1 -14
  51. package/src/synchronizer/server_world_state_synchronizer.ts +94 -96
  52. package/src/test/utils.ts +87 -92
  53. package/src/testing.ts +1 -1
  54. package/src/world-state-db/merkle_tree_db.ts +12 -9
@@ -1,7 +1,8 @@
1
1
  import { MAX_NOTE_HASHES_PER_TX, MAX_NULLIFIERS_PER_TX, NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP } from '@aztec/constants';
2
+ import { BlockNumber } from '@aztec/foundation/branded-types';
2
3
  import { fromEntries, padArrayEnd } from '@aztec/foundation/collection';
4
+ import { Fr } from '@aztec/foundation/curves/bn254';
3
5
  import { EthAddress } from '@aztec/foundation/eth-address';
4
- import { Fr } from '@aztec/foundation/fields';
5
6
  import { tryRmDir } from '@aztec/foundation/fs';
6
7
  import { createLogger } from '@aztec/foundation/log';
7
8
  import { DatabaseVersionManager } from '@aztec/stdlib/database-version';
@@ -98,7 +99,7 @@ export class NativeWorldStateService {
98
99
  // the initial header _must_ be the first element in the archive tree
99
100
  // if this assertion fails, check that the hashing done in Header in yarn-project matches the initial header hash done in world_state.cpp
100
101
  const indices = await committed.findLeafIndices(MerkleTreeId.ARCHIVE, [
101
- await this.initialHeader.hash()
102
+ (await this.initialHeader.hash()).toField()
102
103
  ]);
103
104
  const initialHeaderIndex = indices[0];
104
105
  assert.strictEqual(initialHeaderIndex, 0n, 'Invalid initial archive state');
@@ -115,23 +116,26 @@ export class NativeWorldStateService {
115
116
  getSnapshot(blockNumber) {
116
117
  return new MerkleTreesFacade(this.instance, this.initialHeader, new WorldStateRevision(/*forkId=*/ 0, /* blockNumber=*/ blockNumber, /* includeUncommitted=*/ false));
117
118
  }
118
- async fork(blockNumber) {
119
+ async fork(blockNumber, opts = {}) {
119
120
  const resp = await this.instance.call(WorldStateMessageType.CREATE_FORK, {
120
121
  latest: blockNumber === undefined,
121
- blockNumber: blockNumber ?? 0,
122
+ blockNumber: blockNumber ?? BlockNumber.ZERO,
122
123
  canonical: true
123
124
  });
124
- return new MerkleTreesForkFacade(this.instance, this.initialHeader, new WorldStateRevision(/*forkId=*/ resp.forkId, /* blockNumber=*/ 0, /* includeUncommitted=*/ true));
125
+ return new MerkleTreesForkFacade(this.instance, this.initialHeader, new WorldStateRevision(/*forkId=*/ resp.forkId, /* blockNumber=*/ BlockNumber.ZERO, /* includeUncommitted=*/ true), opts);
125
126
  }
126
127
  getInitialHeader() {
127
128
  return this.initialHeader;
128
129
  }
129
- async handleL2BlockAndMessages(l2Block, l1ToL2Messages, // TODO(#17027)
130
- // Temporary hack to only insert l1 to l2 messages for the first block in a checkpoint.
131
- isFirstBlock = true) {
132
- // We have to pad both the values within tx effects because that's how the trees are built by circuits.
133
- const paddedNoteHashes = l2Block.body.txEffects.flatMap((txEffect)=>padArrayEnd(txEffect.noteHashes, Fr.ZERO, MAX_NOTE_HASHES_PER_TX));
130
+ async handleL2BlockAndMessages(l2Block, l1ToL2Messages) {
131
+ const isFirstBlock = l2Block.indexWithinCheckpoint === 0;
132
+ if (!isFirstBlock && l1ToL2Messages.length > 0) {
133
+ throw new Error(`L1 to L2 messages must be empty for non-first blocks, but got ${l1ToL2Messages.length} messages for block ${l2Block.number}.`);
134
+ }
135
+ // We have to pad the given l1 to l2 messages, and the note hashes and nullifiers within tx effects, because that's
136
+ // how the trees are built by circuits.
134
137
  const paddedL1ToL2Messages = isFirstBlock ? padArrayEnd(l1ToL2Messages, Fr.ZERO, NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP) : [];
138
+ const paddedNoteHashes = l2Block.body.txEffects.flatMap((txEffect)=>padArrayEnd(txEffect.noteHashes, Fr.ZERO, MAX_NOTE_HASHES_PER_TX));
135
139
  const paddedNullifiers = l2Block.body.txEffects.flatMap((txEffect)=>padArrayEnd(txEffect.nullifiers, Fr.ZERO, MAX_NULLIFIERS_PER_TX)).map((nullifier)=>new NullifierLeaf(nullifier));
136
140
  const publicDataWrites = l2Block.body.txEffects.flatMap((txEffect)=>{
137
141
  return txEffect.publicDataWrites.map((write)=>{
@@ -144,7 +148,7 @@ export class NativeWorldStateService {
144
148
  try {
145
149
  return await this.instance.call(WorldStateMessageType.SYNC_BLOCK, {
146
150
  blockNumber: l2Block.number,
147
- blockHeaderHash: await l2Block.getBlockHeader().hash(),
151
+ blockHeaderHash: await l2Block.hash(),
148
152
  paddedL1ToL2Messages: paddedL1ToL2Messages.map(serializeLeaf),
149
153
  paddedNoteHashes: paddedNoteHashes.map(serializeLeaf),
150
154
  paddedNullifiers: paddedNullifiers.map(serializeLeaf),
@@ -5,6 +5,7 @@ import type { WorldStateTreeMapSizes } from '../synchronizer/factory.js';
5
5
  import { WorldStateMessageType, type WorldStateRequest, type WorldStateRequestCategories, type WorldStateResponse } from './message.js';
6
6
  export interface NativeWorldStateInstance {
7
7
  call<T extends WorldStateMessageType>(messageType: T, body: WorldStateRequest[T] & WorldStateRequestCategories): Promise<WorldStateResponse[T]>;
8
+ getHandle(): any;
8
9
  }
9
10
  /**
10
11
  * Strongly-typed interface to access the WorldState class in the native world_state_napi module.
@@ -22,6 +23,14 @@ export declare class NativeWorldState implements NativeWorldStateInstance {
22
23
  constructor(dataDir: string, wsTreeMapSizes: WorldStateTreeMapSizes, prefilledPublicData: PublicDataTreeLeaf[] | undefined, instrumentation: WorldStateInstrumentation, log?: Logger);
23
24
  getDataDir(): string;
24
25
  clone(): NativeWorldState;
26
+ /**
27
+ * Gets the native WorldState handle from the underlying native instance.
28
+ * We call the getHandle() method on the native WorldState to get a NAPI External
29
+ * that wraps the underlying C++ WorldState pointer.
30
+ * @returns The NAPI External handle to the native WorldState instance,since
31
+ * the NAPI external type is opaque, we return any (we could also use an opaque symbol type)
32
+ */
33
+ getHandle(): any;
25
34
  /**
26
35
  * Sends a message to the native instance and returns the response.
27
36
  * @param messageType - The type of message to send
@@ -37,4 +46,4 @@ export declare class NativeWorldState implements NativeWorldStateInstance {
37
46
  close(): Promise<void>;
38
47
  private _sendMessage;
39
48
  }
40
- //# sourceMappingURL=native_world_state_instance.d.ts.map
49
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF0aXZlX3dvcmxkX3N0YXRlX2luc3RhbmNlLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbmF0aXZlL25hdGl2ZV93b3JsZF9zdGF0ZV9pbnN0YW5jZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFVQSxPQUFPLEVBQUUsS0FBSyxNQUFNLEVBQWdCLE1BQU0sdUJBQXVCLENBQUM7QUFHbEUsT0FBTyxLQUFLLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUs5RCxPQUFPLEtBQUssRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQ3ZGLE9BQU8sS0FBSyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDekUsT0FBTyxFQUNMLHFCQUFxQixFQUNyQixLQUFLLGlCQUFpQixFQUN0QixLQUFLLDJCQUEyQixFQUNoQyxLQUFLLGtCQUFrQixFQUl4QixNQUFNLGNBQWMsQ0FBQztBQUt0QixNQUFNLFdBQVcsd0JBQXdCO0lBQ3ZDLElBQUksQ0FBQyxDQUFDLFNBQVMscUJBQXFCLEVBQ2xDLFdBQVcsRUFBRSxDQUFDLEVBQ2QsSUFBSSxFQUFFLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxHQUFHLDJCQUEyQixHQUN2RCxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUVsQyxTQUFTLElBQUksR0FBRyxDQUFDO0NBQ2xCO0FBRUQ7O0dBRUc7QUFDSCxxQkFBYSxnQkFBaUIsWUFBVyx3QkFBd0I7SUFVN0QsT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPO0lBQ3hCLE9BQU8sQ0FBQyxRQUFRLENBQUMsY0FBYztJQUMvQixPQUFPLENBQUMsUUFBUSxDQUFDLG1CQUFtQjtJQUNwQyxPQUFPLENBQUMsUUFBUSxDQUFDLGVBQWU7SUFDaEMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHO0lBYnRCLE9BQU8sQ0FBQyxJQUFJLENBQVE7SUFHcEIsT0FBTyxDQUFDLE1BQU0sQ0FBeUM7SUFFdkQsT0FBTyxDQUFDLFFBQVEsQ0FBK0U7SUFFL0YsK0NBQStDO0lBQy9DLFlBQ21CLE9BQU8sRUFBRSxNQUFNLEVBQ2YsY0FBYyxFQUFFLHNCQUFzQixFQUN0QyxtQkFBbUIsa0NBQTJCLEVBQzlDLGVBQWUsRUFBRSx5QkFBeUIsRUFDMUMsR0FBRyxHQUFFLE1BQTZDLEVBb0NwRTtJQUVNLFVBQVUsV0FFaEI7SUFFTSxLQUFLLHFCQVFYO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksU0FBUyxJQUFJLEdBQUcsQ0FpQnRCO0lBRUQ7Ozs7Ozs7T0FPRztJQUNVLElBQUksQ0FBQyxDQUFDLFNBQVMscUJBQXFCLEVBQy9DLFdBQVcsRUFBRSxDQUFDLEVBQ2QsSUFBSSxFQUFFLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxHQUFHLDJCQUEyQixFQUV4RCxlQUFlLDZEQUF1RSxFQUN0RixZQUFZLHNCQUFvQixHQUMvQixPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FxRGhDO0lBRUQ7O09BRUc7SUFDVSxLQUFLLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxDQWVsQztZQUVhLFlBQVk7Q0E4RDNCIn0=
@@ -1 +1 @@
1
- {"version":3,"file":"native_world_state_instance.d.ts","sourceRoot":"","sources":["../../src/native/native_world_state_instance.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,uBAAuB,CAAC;AAGlE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAK9D,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,uCAAuC,CAAC;AACvF,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACzE,OAAO,EACL,qBAAqB,EACrB,KAAK,iBAAiB,EACtB,KAAK,2BAA2B,EAChC,KAAK,kBAAkB,EAIxB,MAAM,cAAc,CAAC;AAKtB,MAAM,WAAW,wBAAwB;IACvC,IAAI,CAAC,CAAC,SAAS,qBAAqB,EAClC,WAAW,EAAE,CAAC,EACd,IAAI,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,2BAA2B,GACvD,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC;CACnC;AAED;;GAEG;AACH,qBAAa,gBAAiB,YAAW,wBAAwB;IAU7D,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,mBAAmB;IACpC,OAAO,CAAC,QAAQ,CAAC,eAAe;IAChC,OAAO,CAAC,QAAQ,CAAC,GAAG;IAbtB,OAAO,CAAC,IAAI,CAAQ;IAGpB,OAAO,CAAC,MAAM,CAAyC;IAEvD,OAAO,CAAC,QAAQ,CAA+E;IAE/F,+CAA+C;gBAE5B,OAAO,EAAE,MAAM,EACf,cAAc,EAAE,sBAAsB,EACtC,mBAAmB,EAAE,kBAAkB,EAAE,YAAK,EAC9C,eAAe,EAAE,yBAAyB,EAC1C,GAAG,GAAE,MAA6C;IAsC9D,UAAU;IAIV,KAAK;IAUZ;;;;;;;OAOG;IACU,IAAI,CAAC,CAAC,SAAS,qBAAqB,EAC/C,WAAW,EAAE,CAAC,EACd,IAAI,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,2BAA2B,EAExD,eAAe,IAAI,UAAU,kBAAkB,CAAC,CAAC,CAAC,KAAG,kBAAkB,CAAC,CAAC,CAAa,EACtF,YAAY,IAAI,GAAG,MAAM,SAAO,GAC/B,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC;IAuDjC;;OAEG;IACU,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAiBrB,YAAY;CA8D3B"}
1
+ {"version":3,"file":"native_world_state_instance.d.ts","sourceRoot":"","sources":["../../src/native/native_world_state_instance.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,uBAAuB,CAAC;AAGlE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAK9D,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,uCAAuC,CAAC;AACvF,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACzE,OAAO,EACL,qBAAqB,EACrB,KAAK,iBAAiB,EACtB,KAAK,2BAA2B,EAChC,KAAK,kBAAkB,EAIxB,MAAM,cAAc,CAAC;AAKtB,MAAM,WAAW,wBAAwB;IACvC,IAAI,CAAC,CAAC,SAAS,qBAAqB,EAClC,WAAW,EAAE,CAAC,EACd,IAAI,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,2BAA2B,GACvD,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC;IAElC,SAAS,IAAI,GAAG,CAAC;CAClB;AAED;;GAEG;AACH,qBAAa,gBAAiB,YAAW,wBAAwB;IAU7D,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,mBAAmB;IACpC,OAAO,CAAC,QAAQ,CAAC,eAAe;IAChC,OAAO,CAAC,QAAQ,CAAC,GAAG;IAbtB,OAAO,CAAC,IAAI,CAAQ;IAGpB,OAAO,CAAC,MAAM,CAAyC;IAEvD,OAAO,CAAC,QAAQ,CAA+E;IAE/F,+CAA+C;IAC/C,YACmB,OAAO,EAAE,MAAM,EACf,cAAc,EAAE,sBAAsB,EACtC,mBAAmB,kCAA2B,EAC9C,eAAe,EAAE,yBAAyB,EAC1C,GAAG,GAAE,MAA6C,EAoCpE;IAEM,UAAU,WAEhB;IAEM,KAAK,qBAQX;IAED;;;;;;OAMG;IACI,SAAS,IAAI,GAAG,CAiBtB;IAED;;;;;;;OAOG;IACU,IAAI,CAAC,CAAC,SAAS,qBAAqB,EAC/C,WAAW,EAAE,CAAC,EACd,IAAI,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,2BAA2B,EAExD,eAAe,6DAAuE,EACtF,YAAY,sBAAoB,GAC/B,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAqDhC;IAED;;OAEG;IACU,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAelC;YAEa,YAAY;CA8D3B"}
@@ -60,6 +60,27 @@ const MAX_WORLD_STATE_THREADS = +(process.env.HARDWARE_CONCURRENCY || '16');
60
60
  return new NativeWorldState(this.dataDir, this.wsTreeMapSizes, this.prefilledPublicData, this.instrumentation, this.log);
61
61
  }
62
62
  /**
63
+ * Gets the native WorldState handle from the underlying native instance.
64
+ * We call the getHandle() method on the native WorldState to get a NAPI External
65
+ * that wraps the underlying C++ WorldState pointer.
66
+ * @returns The NAPI External handle to the native WorldState instance,since
67
+ * the NAPI external type is opaque, we return any (we could also use an opaque symbol type)
68
+ */ getHandle() {
69
+ const worldStateWrapper = this.instance.dest;
70
+ if (!worldStateWrapper) {
71
+ throw new Error('No WorldStateWrapper found');
72
+ }
73
+ if (typeof worldStateWrapper.getHandle !== 'function') {
74
+ throw new Error('WorldStateWrapper does not have getHandle method');
75
+ }
76
+ // Call getHandle() to get the NAPI External
77
+ try {
78
+ return worldStateWrapper.getHandle();
79
+ } catch (error) {
80
+ this.log.error('Failed to get native WorldState handle', error);
81
+ }
82
+ }
83
+ /**
63
84
  * Sends a message to the native instance and returns the response.
64
85
  * @param messageType - The type of message to send
65
86
  * @param body - The message body
@@ -16,4 +16,4 @@ export declare class WorldStateOpsQueue {
16
16
  private sendEnqueuedRequest;
17
17
  stop(): Promise<void>;
18
18
  }
19
- //# sourceMappingURL=world_state_ops_queue.d.ts.map
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ybGRfc3RhdGVfb3BzX3F1ZXVlLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbmF0aXZlL3dvcmxkX3N0YXRlX29wc19xdWV1ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUF5QnJELGVBQU8sTUFBTSxrQkFBa0IsNEJBZ0I3QixDQUFDO0FBR0gscUJBQWEsa0JBQWtCO0lBQzdCLE9BQU8sQ0FBQyxRQUFRLENBQXNCO0lBQ3RDLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBSztJQUNsQyxPQUFPLENBQUMsYUFBYSxDQUFLO0lBQzFCLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBZ0I7SUFDcEMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFhO0lBQ2pDLE9BQU8sQ0FBQyxTQUFTLENBQUs7SUFDdEIsT0FBTyxDQUFDLEdBQUcsQ0FBd0M7SUFJNUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxXQUFXLEVBQUUscUJBQXFCLEVBQUUsYUFBYSxFQUFFLE9BQU8sZ0JBc0JyRztJQUdELE9BQU8sQ0FBQyxlQUFlO0lBV3ZCLE9BQU8sQ0FBQyw2QkFBNkI7SUFZckMsT0FBTyxDQUFDLDJCQUEyQjtJQVVuQyxPQUFPLENBQUMsZUFBZTtJQXlDdkIsT0FBTyxDQUFDLG1CQUFtQjtJQWdCcEIsSUFBSSxrQkFnQlY7Q0FDRiJ9
@@ -1 +1 @@
1
- {"version":3,"file":"world_state_ops_queue.d.ts","sourceRoot":"","sources":["../../src/native/world_state_ops_queue.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAyBrD,eAAO,MAAM,kBAAkB,4BAgB7B,CAAC;AAGH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAsB;IACtC,OAAO,CAAC,qBAAqB,CAAK;IAClC,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,WAAW,CAAC,CAAgB;IACpC,OAAO,CAAC,WAAW,CAAC,CAAa;IACjC,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,GAAG,CAAwC;IAI5C,OAAO,CAAC,OAAO,EAAE,MAAM,OAAO,CAAC,GAAG,CAAC,EAAE,WAAW,EAAE,qBAAqB,EAAE,aAAa,EAAE,OAAO;IAyBtG,OAAO,CAAC,eAAe;IAWvB,OAAO,CAAC,6BAA6B;IAYrC,OAAO,CAAC,2BAA2B;IAUnC,OAAO,CAAC,eAAe;IAyCvB,OAAO,CAAC,mBAAmB;IAgBpB,IAAI;CAiBZ"}
1
+ {"version":3,"file":"world_state_ops_queue.d.ts","sourceRoot":"","sources":["../../src/native/world_state_ops_queue.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAyBrD,eAAO,MAAM,kBAAkB,4BAgB7B,CAAC;AAGH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAsB;IACtC,OAAO,CAAC,qBAAqB,CAAK;IAClC,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,WAAW,CAAC,CAAgB;IACpC,OAAO,CAAC,WAAW,CAAC,CAAa;IACjC,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,GAAG,CAAwC;IAI5C,OAAO,CAAC,OAAO,EAAE,MAAM,OAAO,CAAC,GAAG,CAAC,EAAE,WAAW,EAAE,qBAAqB,EAAE,aAAa,EAAE,OAAO,gBAsBrG;IAGD,OAAO,CAAC,eAAe;IAWvB,OAAO,CAAC,6BAA6B;IAYrC,OAAO,CAAC,2BAA2B;IAUnC,OAAO,CAAC,eAAe;IAyCvB,OAAO,CAAC,mBAAmB;IAgBpB,IAAI,kBAgBV;CACF"}
@@ -3,8 +3,6 @@ import { type ConfigMappingsType } from '@aztec/foundation/config';
3
3
  export interface WorldStateConfig {
4
4
  /** The frequency in which to check. */
5
5
  worldStateBlockCheckIntervalMS: number;
6
- /** Whether to follow only the proven chain. */
7
- worldStateProvenBlocksOnly: boolean;
8
6
  /** Size of the batch for each get-blocks request from the synchronizer to the archiver. */
9
7
  worldStateBlockRequestBatchSize?: number;
10
8
  /** The map size to be provided to LMDB for each world state tree DB, optional, will inherit from the general dataStoreMapSizeKb if not specified*/
@@ -30,4 +28,4 @@ export declare const worldStateConfigMappings: ConfigMappingsType<WorldStateConf
30
28
  * @returns The configuration values for the world state synchronizer.
31
29
  */
32
30
  export declare function getWorldStateConfigFromEnv(): WorldStateConfig;
33
- //# sourceMappingURL=config.d.ts.map
31
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc3luY2hyb25pemVyL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsS0FBSyxrQkFBa0IsRUFBNkMsTUFBTSwwQkFBMEIsQ0FBQztBQUU5RyxxREFBcUQ7QUFDckQsTUFBTSxXQUFXLGdCQUFnQjtJQUMvQix1Q0FBdUM7SUFDdkMsOEJBQThCLEVBQUUsTUFBTSxDQUFDO0lBRXZDLDJGQUEyRjtJQUMzRiwrQkFBK0IsQ0FBQyxFQUFFLE1BQU0sQ0FBQztJQUV6QyxtSkFBbUo7SUFDbkoscUJBQXFCLENBQUMsRUFBRSxNQUFNLENBQUM7SUFFL0IsMkpBQTJKO0lBQzNKLG9CQUFvQixDQUFDLEVBQUUsTUFBTSxDQUFDO0lBRTlCLDZKQUE2SjtJQUM3SixzQkFBc0IsQ0FBQyxFQUFFLE1BQU0sQ0FBQztJQUVoQyw2SkFBNko7SUFDN0oscUJBQXFCLENBQUMsRUFBRSxNQUFNLENBQUM7SUFFL0IsMkpBQTJKO0lBQzNKLG9CQUFvQixDQUFDLEVBQUUsTUFBTSxDQUFDO0lBRTlCLCtKQUErSjtJQUMvSix1QkFBdUIsQ0FBQyxFQUFFLE1BQU0sQ0FBQztJQUVqQywyR0FBMkc7SUFDM0csdUJBQXVCLENBQUMsRUFBRSxNQUFNLENBQUM7SUFFakMsZ0RBQWdEO0lBQ2hELHNCQUFzQixFQUFFLE1BQU0sQ0FBQztDQUNoQztBQUVELGVBQU8sTUFBTSx3QkFBd0IsRUFBRSxrQkFBa0IsQ0FBQyxnQkFBZ0IsQ0F3RHpFLENBQUM7QUFFRjs7O0dBR0c7QUFDSCx3QkFBZ0IsMEJBQTBCLElBQUksZ0JBQWdCLENBRTdEIn0=
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/synchronizer/config.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,kBAAkB,EAIxB,MAAM,0BAA0B,CAAC;AAElC,qDAAqD;AACrD,MAAM,WAAW,gBAAgB;IAC/B,uCAAuC;IACvC,8BAA8B,EAAE,MAAM,CAAC;IAEvC,+CAA+C;IAC/C,0BAA0B,EAAE,OAAO,CAAC;IAEpC,2FAA2F;IAC3F,+BAA+B,CAAC,EAAE,MAAM,CAAC;IAEzC,mJAAmJ;IACnJ,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAE/B,2JAA2J;IAC3J,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAE9B,6JAA6J;IAC7J,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAEhC,6JAA6J;IAC7J,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAE/B,2JAA2J;IAC3J,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAE9B,+JAA+J;IAC/J,uBAAuB,CAAC,EAAE,MAAM,CAAC;IAEjC,2GAA2G;IAC3G,uBAAuB,CAAC,EAAE,MAAM,CAAC;IAEjC,gDAAgD;IAChD,sBAAsB,EAAE,MAAM,CAAC;CAChC;AAED,eAAO,MAAM,wBAAwB,EAAE,kBAAkB,CAAC,gBAAgB,CA6DzE,CAAC;AAEF;;;GAGG;AACH,wBAAgB,0BAA0B,IAAI,gBAAgB,CAE7D"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/synchronizer/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,kBAAkB,EAA6C,MAAM,0BAA0B,CAAC;AAE9G,qDAAqD;AACrD,MAAM,WAAW,gBAAgB;IAC/B,uCAAuC;IACvC,8BAA8B,EAAE,MAAM,CAAC;IAEvC,2FAA2F;IAC3F,+BAA+B,CAAC,EAAE,MAAM,CAAC;IAEzC,mJAAmJ;IACnJ,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAE/B,2JAA2J;IAC3J,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAE9B,6JAA6J;IAC7J,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAEhC,6JAA6J;IAC7J,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAE/B,2JAA2J;IAC3J,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAE9B,+JAA+J;IAC/J,uBAAuB,CAAC,EAAE,MAAM,CAAC;IAEjC,2GAA2G;IAC3G,uBAAuB,CAAC,EAAE,MAAM,CAAC;IAEjC,gDAAgD;IAChD,sBAAsB,EAAE,MAAM,CAAC;CAChC;AAED,eAAO,MAAM,wBAAwB,EAAE,kBAAkB,CAAC,gBAAgB,CAwDzE,CAAC;AAEF;;;GAGG;AACH,wBAAgB,0BAA0B,IAAI,gBAAgB,CAE7D"}
@@ -1,4 +1,4 @@
1
- import { booleanConfigHelper, getConfigFromMappings, numberConfigHelper } from '@aztec/foundation/config';
1
+ import { getConfigFromMappings, numberConfigHelper } from '@aztec/foundation/config';
2
2
  export const worldStateConfigMappings = {
3
3
  worldStateBlockCheckIntervalMS: {
4
4
  env: 'WS_BLOCK_CHECK_INTERVAL_MS',
@@ -6,11 +6,6 @@ export const worldStateConfigMappings = {
6
6
  defaultValue: 100,
7
7
  description: 'The frequency in which to check.'
8
8
  },
9
- worldStateProvenBlocksOnly: {
10
- env: 'WS_PROVEN_BLOCKS_ONLY',
11
- description: 'Whether to follow only the proven chain.',
12
- ...booleanConfigHelper()
13
- },
14
9
  worldStateBlockRequestBatchSize: {
15
10
  env: 'WS_BLOCK_REQUEST_BATCH_SIZE',
16
11
  parseEnv: (val)=>val ? +val : undefined,
@@ -1,4 +1,4 @@
1
1
  export declare class WorldStateSynchronizerError extends Error {
2
2
  constructor(message: string, options?: ErrorOptions);
3
3
  }
4
- //# sourceMappingURL=errors.d.ts.map
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JzLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc3luY2hyb25pemVyL2Vycm9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxxQkFBYSwyQkFBNEIsU0FBUSxLQUFLO0lBQ3BELFlBQVksT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsRUFBRSxZQUFZLEVBRWxEO0NBQ0YifQ==
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/synchronizer/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,2BAA4B,SAAQ,KAAK;gBACxC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY;CAGpD"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/synchronizer/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,2BAA4B,SAAQ,KAAK;IACpD,YAAY,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,EAElD;CACF"}
@@ -16,4 +16,4 @@ export interface WorldStateTreeMapSizes {
16
16
  }
17
17
  export declare function createWorldStateSynchronizer(config: WorldStateConfig & DataStoreConfig, l2BlockSource: L2BlockSource & L1ToL2MessageSource, prefilledPublicData?: PublicDataTreeLeaf[], client?: TelemetryClient): Promise<ServerWorldStateSynchronizer>;
18
18
  export declare function createWorldState(config: Pick<WorldStateConfig, 'worldStateDataDirectory' | 'worldStateDbMapSizeKb' | 'archiveTreeMapSizeKb' | 'nullifierTreeMapSizeKb' | 'noteHashTreeMapSizeKb' | 'messageTreeMapSizeKb' | 'publicDataTreeMapSizeKb'> & Pick<DataStoreConfig, 'dataDirectory' | 'dataStoreMapSizeKb' | 'l1Contracts'>, prefilledPublicData?: PublicDataTreeLeaf[], instrumentation?: WorldStateInstrumentation): Promise<NativeWorldStateService>;
19
- //# sourceMappingURL=factory.d.ts.map
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFjdG9yeS5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N5bmNocm9uaXplci9mYWN0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzlELE9BQU8sS0FBSyxFQUFFLGFBQWEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3pELE9BQU8sS0FBSyxFQUFFLG1CQUFtQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDbkUsT0FBTyxLQUFLLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUM5RCxPQUFPLEVBQUUsS0FBSyxlQUFlLEVBQXNCLE1BQU0seUJBQXlCLENBQUM7QUFFbkYsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDbEYsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDMUUsT0FBTyxLQUFLLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDcEQsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFFcEYsTUFBTSxXQUFXLHNCQUFzQjtJQUNyQyxvQkFBb0IsRUFBRSxNQUFNLENBQUM7SUFDN0Isc0JBQXNCLEVBQUUsTUFBTSxDQUFDO0lBQy9CLHFCQUFxQixFQUFFLE1BQU0sQ0FBQztJQUM5QixvQkFBb0IsRUFBRSxNQUFNLENBQUM7SUFDN0IsdUJBQXVCLEVBQUUsTUFBTSxDQUFDO0NBQ2pDO0FBRUQsd0JBQXNCLDRCQUE0QixDQUNoRCxNQUFNLEVBQUUsZ0JBQWdCLEdBQUcsZUFBZSxFQUMxQyxhQUFhLEVBQUUsYUFBYSxHQUFHLG1CQUFtQixFQUNsRCxtQkFBbUIsR0FBRSxrQkFBa0IsRUFBTyxFQUM5QyxNQUFNLEdBQUUsZUFBc0MseUNBSy9DO0FBRUQsd0JBQXNCLGdCQUFnQixDQUNwQyxNQUFNLEVBQUUsSUFBSSxDQUNWLGdCQUFnQixFQUNkLHlCQUF5QixHQUN6Qix1QkFBdUIsR0FDdkIsc0JBQXNCLEdBQ3RCLHdCQUF3QixHQUN4Qix1QkFBdUIsR0FDdkIsc0JBQXNCLEdBQ3RCLHlCQUF5QixDQUM1QixHQUNDLElBQUksQ0FBQyxlQUFlLEVBQUUsZUFBZSxHQUFHLG9CQUFvQixHQUFHLGFBQWEsQ0FBQyxFQUMvRSxtQkFBbUIsR0FBRSxrQkFBa0IsRUFBTyxFQUM5QyxlQUFlLEdBQUUseUJBQStFLG9DQWdDakcifQ==
@@ -1,3 +1,3 @@
1
1
  export * from './server_world_state_synchronizer.js';
2
2
  export * from './factory.js';
3
- //# sourceMappingURL=index.d.ts.map
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zeW5jaHJvbml6ZXIvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxzQ0FBc0MsQ0FBQztBQUNyRCxjQUFjLGNBQWMsQ0FBQyJ9
@@ -1,6 +1,6 @@
1
- import type { Fr } from '@aztec/foundation/fields';
1
+ import { BlockNumber } from '@aztec/foundation/branded-types';
2
2
  import { type Logger } from '@aztec/foundation/log';
3
- import type { L2BlockSource, L2BlockStream, L2BlockStreamEvent, L2BlockStreamEventHandler, L2BlockStreamLocalDataProvider, L2Tips } from '@aztec/stdlib/block';
3
+ import { type L2BlockSource, L2BlockStream, type L2BlockStreamEvent, type L2BlockStreamEventHandler, type L2BlockStreamLocalDataProvider, type L2Tips } from '@aztec/stdlib/block';
4
4
  import { type WorldStateSynchronizer, type WorldStateSynchronizerStatus } from '@aztec/stdlib/interfaces/server';
5
5
  import type { L1ToL2MessageSource } from '@aztec/stdlib/messaging';
6
6
  import type { SnapshotDataKeys } from '@aztec/stdlib/snapshots';
@@ -24,21 +24,22 @@ export declare class ServerWorldStateSynchronizer implements WorldStateSynchroni
24
24
  private latestBlockNumberAtStart;
25
25
  private historyToKeep;
26
26
  private currentState;
27
- private latestBlockHashQuery;
28
27
  private syncPromise;
29
28
  protected blockStream: L2BlockStream | undefined;
30
29
  private provenBlockNumber;
31
30
  constructor(merkleTreeDb: MerkleTreeAdminDatabase, l2BlockSource: L2BlockSource & L1ToL2MessageSource, config: WorldStateConfig, instrumentation?: WorldStateInstrumentation, log?: Logger);
32
31
  getCommitted(): MerkleTreeReadOperations;
33
- getSnapshot(blockNumber: number): MerkleTreeReadOperations;
34
- fork(blockNumber?: number): Promise<MerkleTreeWriteOperations>;
32
+ getSnapshot(blockNumber: BlockNumber): MerkleTreeReadOperations;
33
+ fork(blockNumber?: BlockNumber, opts?: {
34
+ closeDelayMs?: number;
35
+ }): Promise<MerkleTreeWriteOperations>;
35
36
  backupTo(dstPath: string, compact?: boolean): Promise<Record<Exclude<SnapshotDataKeys, 'archiver'>, string>>;
36
37
  clear(): Promise<void>;
37
38
  start(): Promise<void | import("@aztec/foundation/promise").PromiseWithResolvers<void>>;
38
39
  protected createBlockStream(): L2BlockStream;
39
40
  stop(): Promise<void>;
40
41
  status(): Promise<WorldStateSynchronizerStatus>;
41
- getLatestBlockNumber(): Promise<number>;
42
+ getLatestBlockNumber(): Promise<BlockNumber>;
42
43
  stopSync(): Promise<void>;
43
44
  resumeSync(): void;
44
45
  /**
@@ -47,25 +48,14 @@ export declare class ServerWorldStateSynchronizer implements WorldStateSynchroni
47
48
  * @param skipThrowIfTargetNotReached - Whether to skip throwing if the target block number is not reached.
48
49
  * @returns A promise that resolves with the block number the world state was synced to
49
50
  */
50
- syncImmediate(targetBlockNumber?: number, skipThrowIfTargetNotReached?: boolean): Promise<number>;
51
+ syncImmediate(targetBlockNumber?: BlockNumber, skipThrowIfTargetNotReached?: boolean): Promise<BlockNumber>;
51
52
  /** Returns the L2 block hash for a given number. Used by the L2BlockStream for detecting reorgs. */
52
- getL2BlockHash(number: number): Promise<string | undefined>;
53
+ getL2BlockHash(number: BlockNumber): Promise<string | undefined>;
53
54
  /** Returns the latest L2 block number for each tip of the chain (latest, proven, finalized). */
54
55
  getL2Tips(): Promise<L2Tips>;
55
56
  /** Handles an event emitted by the block stream. */
56
57
  handleBlockStreamEvent(event: L2BlockStreamEvent): Promise<void>;
57
- /**
58
- * Handles a list of L2 blocks (i.e. Inserts the new note hashes into the merkle tree).
59
- * @param l2Blocks - The L2 blocks to handle.
60
- * @returns Whether the block handled was produced by this same node.
61
- */
62
58
  private handleL2Blocks;
63
- /**
64
- * Handles a single L2 block (i.e. Inserts the new note hashes into the merkle tree).
65
- * @param l2Block - The L2 block to handle.
66
- * @param l1ToL2Messages - The L1 to L2 messages for the block.
67
- * @returns Whether the block handled was produced by this same node.
68
- */
69
59
  private handleL2Block;
70
60
  private handleChainFinalized;
71
61
  private handleChainProven;
@@ -75,12 +65,5 @@ export declare class ServerWorldStateSynchronizer implements WorldStateSynchroni
75
65
  * @param newState - New state value.
76
66
  */
77
67
  private setCurrentState;
78
- /**
79
- * Verifies that the L1 to L2 messages hash to the block inHash.
80
- * @param l1ToL2Messages - The L1 to L2 messages for the block.
81
- * @param inHash - The inHash of the block.
82
- * @throws If the L1 to L2 messages do not hash to the block inHash.
83
- */
84
- protected verifyMessagesHashToInHash(l1ToL2Messages: Fr[], inHash: Fr): Promise<void>;
85
68
  }
86
- //# sourceMappingURL=server_world_state_synchronizer.d.ts.map
69
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyX3dvcmxkX3N0YXRlX3N5bmNocm9uaXplci5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N5bmNocm9uaXplci9zZXJ2ZXJfd29ybGRfc3RhdGVfc3luY2hyb25pemVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUU5RCxPQUFPLEVBQUUsS0FBSyxNQUFNLEVBQWdCLE1BQU0sdUJBQXVCLENBQUM7QUFHbEUsT0FBTyxFQUlMLEtBQUssYUFBYSxFQUNsQixhQUFhLEVBQ2IsS0FBSyxrQkFBa0IsRUFDdkIsS0FBSyx5QkFBeUIsRUFDOUIsS0FBSyw4QkFBOEIsRUFDbkMsS0FBSyxNQUFNLEVBQ1osTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBR0wsS0FBSyxzQkFBc0IsRUFDM0IsS0FBSyw0QkFBNEIsRUFDbEMsTUFBTSxpQ0FBaUMsQ0FBQztBQUN6QyxPQUFPLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ25FLE9BQU8sS0FBSyxFQUFFLGdCQUFnQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFaEUsT0FBTyxFQUFnQixLQUFLLHdCQUF3QixFQUFFLEtBQUsseUJBQXlCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUdsSCxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUVsRixPQUFPLEtBQUssRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ25GLE9BQU8sS0FBSyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBR3BELFlBQVksRUFBRSxnQkFBZ0IsRUFBRSxDQUFDO0FBRWpDOzs7O0dBSUc7QUFDSCxxQkFBYSw0QkFDWCxZQUFXLHNCQUFzQixFQUFFLDhCQUE4QixFQUFFLHlCQUF5QjtJQWdCMUYsT0FBTyxDQUFDLFFBQVEsQ0FBQyxZQUFZO0lBQzdCLE9BQU8sQ0FBQyxRQUFRLENBQUMsYUFBYTtJQUM5QixPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU07SUFDdkIsT0FBTyxDQUFDLGVBQWU7SUFDdkIsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHO0lBbEJ0QixPQUFPLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUEyQjtJQUUvRCxPQUFPLENBQUMsd0JBQXdCLENBQW9CO0lBQ3BELE9BQU8sQ0FBQyxhQUFhLENBQXFCO0lBQzFDLE9BQU8sQ0FBQyxZQUFZLENBQXVEO0lBRTNFLE9BQU8sQ0FBQyxXQUFXLENBQWdDO0lBQ25ELFNBQVMsQ0FBQyxXQUFXLEVBQUUsYUFBYSxHQUFHLFNBQVMsQ0FBQztJQUlqRCxPQUFPLENBQUMsaUJBQWlCLENBQTBCO0lBRW5ELFlBQ21CLFlBQVksRUFBRSx1QkFBdUIsRUFDckMsYUFBYSxFQUFFLGFBQWEsR0FBRyxtQkFBbUIsRUFDbEQsTUFBTSxFQUFFLGdCQUFnQixFQUNqQyxlQUFlLDRCQUFzRCxFQUM1RCxHQUFHLEdBQUUsTUFBb0MsRUFTM0Q7SUFFTSxZQUFZLElBQUksd0JBQXdCLENBRTlDO0lBRU0sV0FBVyxDQUFDLFdBQVcsRUFBRSxXQUFXLEdBQUcsd0JBQXdCLENBRXJFO0lBRU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsRUFBRTtRQUFFLFlBQVksQ0FBQyxFQUFFLE1BQU0sQ0FBQTtLQUFFLEdBQUcsT0FBTyxDQUFDLHlCQUF5QixDQUFDLENBRTNHO0lBRU0sUUFBUSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLEVBQUUsT0FBTyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGdCQUFnQixFQUFFLFVBQVUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBRWxIO0lBRU0sS0FBSyxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FFNUI7SUFFWSxLQUFLLG1GQTRCakI7SUFFRCxTQUFTLENBQUMsaUJBQWlCLElBQUksYUFBYSxDQU8zQztJQUVZLElBQUksa0JBT2hCO0lBRVksTUFBTSxJQUFJLE9BQU8sQ0FBQyw0QkFBNEIsQ0FBQyxDQWEzRDtJQUVZLG9CQUFvQix5QkFFaEM7SUFFWSxRQUFRLGtCQUlwQjtJQUVNLFVBQVUsU0FPaEI7SUFFRDs7Ozs7T0FLRztJQUNVLGFBQWEsQ0FDeEIsaUJBQWlCLENBQUMsRUFBRSxXQUFXLEVBQy9CLDJCQUEyQixDQUFDLEVBQUUsT0FBTyxHQUNwQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBNkN0QjtJQUVELG9HQUFvRztJQUN2RixjQUFjLENBQUMsTUFBTSxFQUFFLFdBQVcsR0FBRyxPQUFPLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQyxDQUs1RTtJQUVELGdHQUFnRztJQUNuRixTQUFTLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQW1DeEM7SUFFRCxvREFBb0Q7SUFDdkMsc0JBQXNCLENBQUMsS0FBSyxFQUFFLGtCQUFrQixHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FlNUU7WUFPYSxjQUFjO1lBeUNkLGFBQWE7WUFnQmIsb0JBQW9CO0lBZWxDLE9BQU8sQ0FBQyxpQkFBaUI7WUFNWCxpQkFBaUI7SUFPL0I7OztPQUdHO0lBQ0gsT0FBTyxDQUFDLGVBQWU7Q0FJeEIifQ==
@@ -1 +1 @@
1
- {"version":3,"file":"server_world_state_synchronizer.d.ts","sourceRoot":"","sources":["../../src/synchronizer/server_world_state_synchronizer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAC;AACnD,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,uBAAuB,CAAC;AAIlE,OAAO,KAAK,EAGV,aAAa,EACb,aAAa,EACb,kBAAkB,EAClB,yBAAyB,EACzB,8BAA8B,EAC9B,MAAM,EACP,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAGL,KAAK,sBAAsB,EAC3B,KAAK,4BAA4B,EAClC,MAAM,iCAAiC,CAAC;AACzC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,OAAO,EAAgB,KAAK,wBAAwB,EAAE,KAAK,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAGlH,OAAO,EAAE,yBAAyB,EAAE,MAAM,uCAAuC,CAAC;AAElF,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,qCAAqC,CAAC;AACnF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAGpD,YAAY,EAAE,gBAAgB,EAAE,CAAC;AAEjC;;;;GAIG;AACH,qBAAa,4BACX,YAAW,sBAAsB,EAAE,8BAA8B,EAAE,yBAAyB;IAiB1F,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,eAAe;IACvB,OAAO,CAAC,QAAQ,CAAC,GAAG;IAnBtB,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAA2B;IAE/D,OAAO,CAAC,wBAAwB,CAAK;IACrC,OAAO,CAAC,aAAa,CAAqB;IAC1C,OAAO,CAAC,YAAY,CAAuD;IAC3E,OAAO,CAAC,oBAAoB,CAA4E;IAExG,OAAO,CAAC,WAAW,CAAgC;IACnD,SAAS,CAAC,WAAW,EAAE,aAAa,GAAG,SAAS,CAAC;IAIjD,OAAO,CAAC,iBAAiB,CAAqB;gBAG3B,YAAY,EAAE,uBAAuB,EACrC,aAAa,EAAE,aAAa,GAAG,mBAAmB,EAClD,MAAM,EAAE,gBAAgB,EACjC,eAAe,4BAAsD,EAC5D,GAAG,GAAE,MAAoC;IAWrD,YAAY,IAAI,wBAAwB;IAIxC,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,wBAAwB;IAI1D,IAAI,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,yBAAyB,CAAC;IAI9D,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,gBAAgB,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,CAAC;IAI5G,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAIhB,KAAK;IAgClB,SAAS,CAAC,iBAAiB,IAAI,aAAa;IAU/B,IAAI;IASJ,MAAM,IAAI,OAAO,CAAC,4BAA4B,CAAC;IAe/C,oBAAoB;IAIpB,QAAQ;IAMd,UAAU;IASjB;;;;;OAKG;IACU,aAAa,CAAC,iBAAiB,CAAC,EAAE,MAAM,EAAE,2BAA2B,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;IA+C9G,oGAAoG;IACvF,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAexE,gGAAgG;IACnF,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC;IAYzC,oDAAoD;IACvC,sBAAsB,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAiB7E;;;;OAIG;YACW,cAAc;IAyB5B;;;;;OAKG;YACW,aAAa;YAuBb,oBAAoB;IAelC,OAAO,CAAC,iBAAiB;YAMX,iBAAiB;IAQ/B;;;OAGG;IACH,OAAO,CAAC,eAAe;IAKvB;;;;;OAKG;cACa,0BAA0B,CAAC,cAAc,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE;CAa5E"}
1
+ {"version":3,"file":"server_world_state_synchronizer.d.ts","sourceRoot":"","sources":["../../src/synchronizer/server_world_state_synchronizer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAE9D,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,uBAAuB,CAAC;AAGlE,OAAO,EAIL,KAAK,aAAa,EAClB,aAAa,EACb,KAAK,kBAAkB,EACvB,KAAK,yBAAyB,EAC9B,KAAK,8BAA8B,EACnC,KAAK,MAAM,EACZ,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAGL,KAAK,sBAAsB,EAC3B,KAAK,4BAA4B,EAClC,MAAM,iCAAiC,CAAC;AACzC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,OAAO,EAAgB,KAAK,wBAAwB,EAAE,KAAK,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAGlH,OAAO,EAAE,yBAAyB,EAAE,MAAM,uCAAuC,CAAC;AAElF,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,qCAAqC,CAAC;AACnF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAGpD,YAAY,EAAE,gBAAgB,EAAE,CAAC;AAEjC;;;;GAIG;AACH,qBAAa,4BACX,YAAW,sBAAsB,EAAE,8BAA8B,EAAE,yBAAyB;IAgB1F,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,eAAe;IACvB,OAAO,CAAC,QAAQ,CAAC,GAAG;IAlBtB,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAA2B;IAE/D,OAAO,CAAC,wBAAwB,CAAoB;IACpD,OAAO,CAAC,aAAa,CAAqB;IAC1C,OAAO,CAAC,YAAY,CAAuD;IAE3E,OAAO,CAAC,WAAW,CAAgC;IACnD,SAAS,CAAC,WAAW,EAAE,aAAa,GAAG,SAAS,CAAC;IAIjD,OAAO,CAAC,iBAAiB,CAA0B;IAEnD,YACmB,YAAY,EAAE,uBAAuB,EACrC,aAAa,EAAE,aAAa,GAAG,mBAAmB,EAClD,MAAM,EAAE,gBAAgB,EACjC,eAAe,4BAAsD,EAC5D,GAAG,GAAE,MAAoC,EAS3D;IAEM,YAAY,IAAI,wBAAwB,CAE9C;IAEM,WAAW,CAAC,WAAW,EAAE,WAAW,GAAG,wBAAwB,CAErE;IAEM,IAAI,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAE3G;IAEM,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,gBAAgB,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,CAAC,CAElH;IAEM,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAE5B;IAEY,KAAK,mFA4BjB;IAED,SAAS,CAAC,iBAAiB,IAAI,aAAa,CAO3C;IAEY,IAAI,kBAOhB;IAEY,MAAM,IAAI,OAAO,CAAC,4BAA4B,CAAC,CAa3D;IAEY,oBAAoB,yBAEhC;IAEY,QAAQ,kBAIpB;IAEM,UAAU,SAOhB;IAED;;;;;OAKG;IACU,aAAa,CACxB,iBAAiB,CAAC,EAAE,WAAW,EAC/B,2BAA2B,CAAC,EAAE,OAAO,GACpC,OAAO,CAAC,WAAW,CAAC,CA6CtB;IAED,oGAAoG;IACvF,cAAc,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAK5E;IAED,gGAAgG;IACnF,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,CAmCxC;IAED,oDAAoD;IACvC,sBAAsB,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAe5E;YAOa,cAAc;YAyCd,aAAa;YAgBb,oBAAoB;IAelC,OAAO,CAAC,iBAAiB;YAMX,iBAAiB;IAO/B;;;OAGG;IACH,OAAO,CAAC,eAAe;CAIxB"}
@@ -1,12 +1,12 @@
1
- import { L1_TO_L2_MSG_SUBTREE_HEIGHT } from '@aztec/constants';
2
- import { SHA256Trunc } from '@aztec/foundation/crypto';
1
+ import { GENESIS_BLOCK_HEADER_HASH, INITIAL_L2_BLOCK_NUM, INITIAL_L2_CHECKPOINT_NUM } from '@aztec/constants';
2
+ import { BlockNumber } from '@aztec/foundation/branded-types';
3
3
  import { createLogger } from '@aztec/foundation/log';
4
4
  import { promiseWithResolvers } from '@aztec/foundation/promise';
5
5
  import { elapsed } from '@aztec/foundation/timer';
6
- import { MerkleTreeCalculator } from '@aztec/foundation/trees';
6
+ import { GENESIS_CHECKPOINT_HEADER_HASH, L2BlockStream } from '@aztec/stdlib/block';
7
7
  import { WorldStateRunningState } from '@aztec/stdlib/interfaces/server';
8
8
  import { MerkleTreeId } from '@aztec/stdlib/trees';
9
- import { TraceableL2BlockStream, getTelemetryClient } from '@aztec/telemetry-client';
9
+ import { getTelemetryClient } from '@aztec/telemetry-client';
10
10
  import { WorldStateInstrumentation } from '../instrumentation/instrumentation.js';
11
11
  import { WorldStateSynchronizerError } from './errors.js';
12
12
  /**
@@ -23,7 +23,6 @@ import { WorldStateSynchronizerError } from './errors.js';
23
23
  latestBlockNumberAtStart;
24
24
  historyToKeep;
25
25
  currentState;
26
- latestBlockHashQuery;
27
26
  syncPromise;
28
27
  blockStream;
29
28
  // WorldState doesn't track the proven block number, it only tracks the latest tips of the pending chain and the finalized chain
@@ -35,9 +34,8 @@ import { WorldStateSynchronizerError } from './errors.js';
35
34
  this.config = config;
36
35
  this.instrumentation = instrumentation;
37
36
  this.log = log;
38
- this.latestBlockNumberAtStart = 0;
37
+ this.latestBlockNumberAtStart = BlockNumber.ZERO;
39
38
  this.currentState = WorldStateRunningState.IDLE;
40
- this.latestBlockHashQuery = undefined;
41
39
  this.syncPromise = promiseWithResolvers();
42
40
  this.merkleTreeCommitted = this.merkleTreeDb.getCommitted();
43
41
  this.historyToKeep = config.worldStateBlockHistory < 1 ? undefined : config.worldStateBlockHistory;
@@ -49,8 +47,8 @@ import { WorldStateSynchronizerError } from './errors.js';
49
47
  getSnapshot(blockNumber) {
50
48
  return this.merkleTreeDb.getSnapshot(blockNumber);
51
49
  }
52
- fork(blockNumber) {
53
- return this.merkleTreeDb.fork(blockNumber);
50
+ fork(blockNumber, opts) {
51
+ return this.merkleTreeDb.fork(blockNumber, opts);
54
52
  }
55
53
  backupTo(dstPath, compact) {
56
54
  return this.merkleTreeDb.backupTo(dstPath, compact);
@@ -66,7 +64,7 @@ import { WorldStateSynchronizerError } from './errors.js';
66
64
  return this.syncPromise;
67
65
  }
68
66
  // Get the current latest block number
69
- this.latestBlockNumberAtStart = await (this.config.worldStateProvenBlocksOnly ? this.l2BlockSource.getProvenBlockNumber() : this.l2BlockSource.getBlockNumber());
67
+ this.latestBlockNumberAtStart = BlockNumber(await this.l2BlockSource.getBlockNumber());
70
68
  const blockToDownloadFrom = await this.getLatestBlockNumber() + 1;
71
69
  if (blockToDownloadFrom <= this.latestBlockNumberAtStart) {
72
70
  // If there are blocks to be retrieved, go to a synching state
@@ -84,12 +82,11 @@ import { WorldStateSynchronizerError } from './errors.js';
84
82
  return this.syncPromise.promise;
85
83
  }
86
84
  createBlockStream() {
87
- const tracer = this.instrumentation.telemetry.getTracer('WorldStateL2BlockStream');
88
85
  const logger = createLogger('world-state:block_stream');
89
- return new TraceableL2BlockStream(this.l2BlockSource, this, this, tracer, 'WorldStateL2BlockStream', logger, {
90
- proven: this.config.worldStateProvenBlocksOnly,
86
+ return new L2BlockStream(this.l2BlockSource, this, this, logger, {
91
87
  pollIntervalMS: this.config.worldStateBlockCheckIntervalMS,
92
- batchSize: this.config.worldStateBlockRequestBatchSize
88
+ batchSize: this.config.worldStateBlockRequestBatchSize,
89
+ ignoreCheckpoints: true
93
90
  });
94
91
  }
95
92
  async stop() {
@@ -103,10 +100,10 @@ import { WorldStateSynchronizerError } from './errors.js';
103
100
  async status() {
104
101
  const summary = await this.merkleTreeDb.getStatusSummary();
105
102
  const status = {
106
- latestBlockNumber: Number(summary.unfinalizedBlockNumber),
107
- latestBlockHash: await this.getL2BlockHash(Number(summary.unfinalizedBlockNumber)) ?? '',
108
- finalizedBlockNumber: Number(summary.finalizedBlockNumber),
109
- oldestHistoricBlockNumber: Number(summary.oldestHistoricalBlock),
103
+ latestBlockNumber: summary.unfinalizedBlockNumber,
104
+ latestBlockHash: await this.getL2BlockHash(summary.unfinalizedBlockNumber) ?? '',
105
+ finalizedBlockNumber: summary.finalizedBlockNumber,
106
+ oldestHistoricBlockNumber: summary.oldestHistoricalBlock,
110
107
  treesAreSynched: summary.treesAreSynched
111
108
  };
112
109
  return {
@@ -115,7 +112,7 @@ import { WorldStateSynchronizerError } from './errors.js';
115
112
  };
116
113
  }
117
114
  async getLatestBlockNumber() {
118
- return (await this.getL2Tips()).latest.number;
115
+ return (await this.getL2Tips()).proposed.number;
119
116
  }
120
117
  async stopSync() {
121
118
  this.log.debug('Stopping sync...');
@@ -150,7 +147,7 @@ import { WorldStateSynchronizerError } from './errors.js';
150
147
  this.log.debug(`World State at ${currentBlockNumber} told to sync to ${targetBlockNumber ?? 'latest'}`);
151
148
  // If the archiver is behind the target block, force an archiver sync
152
149
  if (targetBlockNumber) {
153
- const archiverLatestBlock = await this.l2BlockSource.getBlockNumber();
150
+ const archiverLatestBlock = BlockNumber(await this.l2BlockSource.getBlockNumber());
154
151
  if (archiverLatestBlock < targetBlockNumber) {
155
152
  this.log.debug(`Archiver is at ${archiverLatestBlock} behind target block ${targetBlockNumber}.`);
156
153
  await this.l2BlockSource.syncImmediate();
@@ -173,40 +170,68 @@ import { WorldStateSynchronizerError } from './errors.js';
173
170
  return updatedBlockNumber;
174
171
  }
175
172
  /** Returns the L2 block hash for a given number. Used by the L2BlockStream for detecting reorgs. */ async getL2BlockHash(number) {
176
- if (number === 0) {
173
+ if (number === BlockNumber.ZERO) {
177
174
  return (await this.merkleTreeCommitted.getInitialHeader().hash()).toString();
178
175
  }
179
- if (this.latestBlockHashQuery?.hash === undefined || number !== this.latestBlockHashQuery.blockNumber) {
180
- this.latestBlockHashQuery = {
181
- hash: await this.merkleTreeCommitted.getLeafValue(MerkleTreeId.ARCHIVE, BigInt(number)).then((leaf)=>leaf?.toString()),
182
- blockNumber: number
183
- };
184
- }
185
- return this.latestBlockHashQuery.hash;
176
+ return this.merkleTreeCommitted.getLeafValue(MerkleTreeId.ARCHIVE, BigInt(number)).then((leaf)=>leaf?.toString());
186
177
  }
187
178
  /** Returns the latest L2 block number for each tip of the chain (latest, proven, finalized). */ async getL2Tips() {
188
179
  const status = await this.merkleTreeDb.getStatusSummary();
189
- const unfinalizedBlockHash = await this.getL2BlockHash(Number(status.unfinalizedBlockNumber));
180
+ const unfinalizedBlockHashPromise = this.getL2BlockHash(status.unfinalizedBlockNumber);
181
+ const finalizedBlockHashPromise = this.getL2BlockHash(status.finalizedBlockNumber);
182
+ const provenBlockNumber = this.provenBlockNumber ?? status.finalizedBlockNumber;
183
+ const provenBlockHashPromise = this.provenBlockNumber === undefined ? finalizedBlockHashPromise : this.getL2BlockHash(this.provenBlockNumber);
184
+ const [unfinalizedBlockHash, finalizedBlockHash, provenBlockHash] = await Promise.all([
185
+ unfinalizedBlockHashPromise,
186
+ finalizedBlockHashPromise,
187
+ provenBlockHashPromise
188
+ ]);
190
189
  const latestBlockId = {
191
- number: Number(status.unfinalizedBlockNumber),
190
+ number: status.unfinalizedBlockNumber,
192
191
  hash: unfinalizedBlockHash
193
192
  };
193
+ // World state doesn't track checkpointed blocks or checkpoints themselves.
194
+ // but we use a block stream so we need to provide 'local' L2Tips.
195
+ // We configure the block stream to ignore checkpoints and set checkpoint values to genesis here.
196
+ const genesisCheckpointHeaderHash = GENESIS_CHECKPOINT_HEADER_HASH.toString();
194
197
  return {
195
- latest: latestBlockId,
198
+ proposed: latestBlockId,
199
+ checkpointed: {
200
+ block: {
201
+ number: INITIAL_L2_BLOCK_NUM,
202
+ hash: GENESIS_BLOCK_HEADER_HASH.toString()
203
+ },
204
+ checkpoint: {
205
+ number: INITIAL_L2_CHECKPOINT_NUM,
206
+ hash: genesisCheckpointHeaderHash
207
+ }
208
+ },
196
209
  finalized: {
197
- number: Number(status.finalizedBlockNumber),
198
- hash: ''
210
+ block: {
211
+ number: status.finalizedBlockNumber,
212
+ hash: finalizedBlockHash ?? ''
213
+ },
214
+ checkpoint: {
215
+ number: INITIAL_L2_CHECKPOINT_NUM,
216
+ hash: genesisCheckpointHeaderHash
217
+ }
199
218
  },
200
219
  proven: {
201
- number: Number(this.provenBlockNumber ?? status.finalizedBlockNumber),
202
- hash: ''
220
+ block: {
221
+ number: provenBlockNumber,
222
+ hash: provenBlockHash ?? ''
223
+ },
224
+ checkpoint: {
225
+ number: INITIAL_L2_CHECKPOINT_NUM,
226
+ hash: genesisCheckpointHeaderHash
227
+ }
203
228
  }
204
229
  };
205
230
  }
206
231
  /** Handles an event emitted by the block stream. */ async handleBlockStreamEvent(event) {
207
232
  switch(event.type){
208
233
  case 'blocks-added':
209
- await this.handleL2Blocks(event.blocks.map((b)=>b.block));
234
+ await this.handleL2Blocks(event.blocks);
210
235
  break;
211
236
  case 'chain-pruned':
212
237
  await this.handleChainPruned(event.block.number);
@@ -225,18 +250,22 @@ import { WorldStateSynchronizerError } from './errors.js';
225
250
  * @returns Whether the block handled was produced by this same node.
226
251
  */ async handleL2Blocks(l2Blocks) {
227
252
  this.log.trace(`Handling L2 blocks ${l2Blocks[0].number} to ${l2Blocks.at(-1).number}`);
228
- const messagePromises = l2Blocks.map((block)=>this.l2BlockSource.getL1ToL2Messages(block.number));
229
- const l1ToL2Messages = await Promise.all(messagePromises);
253
+ // Fetch the L1->L2 messages for the first block in a checkpoint.
254
+ const messagesForBlocks = new Map();
255
+ await Promise.all(l2Blocks.filter((b)=>b.indexWithinCheckpoint === 0).map(async (block)=>{
256
+ const l1ToL2Messages = await this.l2BlockSource.getL1ToL2Messages(block.checkpointNumber);
257
+ messagesForBlocks.set(block.number, l1ToL2Messages);
258
+ }));
230
259
  let updateStatus = undefined;
231
- for(let i = 0; i < l2Blocks.length; i++){
232
- const [duration, result] = await elapsed(()=>this.handleL2Block(l2Blocks[i], l1ToL2Messages[i]));
233
- this.log.info(`World state updated with L2 block ${l2Blocks[i].number}`, {
260
+ for (const block of l2Blocks){
261
+ const [duration, result] = await elapsed(()=>this.handleL2Block(block, messagesForBlocks.get(block.number) ?? []));
262
+ this.log.info(`World state updated with L2 block ${block.number}`, {
234
263
  eventName: 'l2-block-handled',
235
264
  duration,
236
- unfinalizedBlockNumber: result.summary.unfinalizedBlockNumber,
237
- finalizedBlockNumber: result.summary.finalizedBlockNumber,
238
- oldestHistoricBlock: result.summary.oldestHistoricalBlock,
239
- ...l2Blocks[i].getStats()
265
+ unfinalizedBlockNumber: BigInt(result.summary.unfinalizedBlockNumber),
266
+ finalizedBlockNumber: BigInt(result.summary.finalizedBlockNumber),
267
+ oldestHistoricBlock: BigInt(result.summary.oldestHistoricalBlock),
268
+ ...block.getStats()
240
269
  });
241
270
  updateStatus = result;
242
271
  }
@@ -251,12 +280,6 @@ import { WorldStateSynchronizerError } from './errors.js';
251
280
  * @param l1ToL2Messages - The L1 to L2 messages for the block.
252
281
  * @returns Whether the block handled was produced by this same node.
253
282
  */ async handleL2Block(l2Block, l1ToL2Messages) {
254
- // First we check that the L1 to L2 messages hash to the block inHash.
255
- // Note that we cannot optimize this check by checking the root of the subtree after inserting the messages
256
- // to the real L1_TO_L2_MESSAGE_TREE (like we do in merkleTreeDb.handleL2BlockAndMessages(...)) because that
257
- // tree uses pedersen and we don't have access to the converted root.
258
- await this.verifyMessagesHashToInHash(l1ToL2Messages, l2Block.header.contentCommitment.inHash);
259
- // If the above check succeeds, we can proceed to handle the block.
260
283
  this.log.trace(`Pushing L2 block ${l2Block.number} to merkle tree db `, {
261
284
  blockNumber: l2Block.number,
262
285
  blockHash: await l2Block.hash().then((h)=>h.toString()),
@@ -271,27 +294,26 @@ import { WorldStateSynchronizerError } from './errors.js';
271
294
  }
272
295
  async handleChainFinalized(blockNumber) {
273
296
  this.log.verbose(`Finalized chain is now at block ${blockNumber}`);
274
- const summary = await this.merkleTreeDb.setFinalized(BigInt(blockNumber));
297
+ const summary = await this.merkleTreeDb.setFinalized(blockNumber);
275
298
  if (this.historyToKeep === undefined) {
276
299
  return;
277
300
  }
278
- const newHistoricBlock = summary.finalizedBlockNumber - BigInt(this.historyToKeep) + 1n;
301
+ const newHistoricBlock = summary.finalizedBlockNumber - this.historyToKeep + 1;
279
302
  if (newHistoricBlock <= 1) {
280
303
  return;
281
304
  }
282
305
  this.log.verbose(`Pruning historic blocks to ${newHistoricBlock}`);
283
- const status = await this.merkleTreeDb.removeHistoricalBlocks(newHistoricBlock);
306
+ const status = await this.merkleTreeDb.removeHistoricalBlocks(BlockNumber(newHistoricBlock));
284
307
  this.log.debug(`World state summary `, status.summary);
285
308
  }
286
309
  handleChainProven(blockNumber) {
287
- this.provenBlockNumber = BigInt(blockNumber);
310
+ this.provenBlockNumber = blockNumber;
288
311
  this.log.debug(`Proven chain is now at block ${blockNumber}`);
289
312
  return Promise.resolve();
290
313
  }
291
314
  async handleChainPruned(blockNumber) {
292
315
  this.log.warn(`Chain pruned to block ${blockNumber}`);
293
- const status = await this.merkleTreeDb.unwindBlocks(BigInt(blockNumber));
294
- this.latestBlockHashQuery = undefined;
316
+ const status = await this.merkleTreeDb.unwindBlocks(blockNumber);
295
317
  this.provenBlockNumber = undefined;
296
318
  this.instrumentation.updateWorldStateMetrics(status);
297
319
  }
@@ -302,16 +324,4 @@ import { WorldStateSynchronizerError } from './errors.js';
302
324
  this.currentState = newState;
303
325
  this.log.debug(`Moved to state ${WorldStateRunningState[this.currentState]}`);
304
326
  }
305
- /**
306
- * Verifies that the L1 to L2 messages hash to the block inHash.
307
- * @param l1ToL2Messages - The L1 to L2 messages for the block.
308
- * @param inHash - The inHash of the block.
309
- * @throws If the L1 to L2 messages do not hash to the block inHash.
310
- */ async verifyMessagesHashToInHash(l1ToL2Messages, inHash) {
311
- const treeCalculator = await MerkleTreeCalculator.create(L1_TO_L2_MSG_SUBTREE_HEIGHT, Buffer.alloc(32), (lhs, rhs)=>Promise.resolve(new SHA256Trunc().hash(lhs, rhs)));
312
- const root = await treeCalculator.computeTreeRoot(l1ToL2Messages.map((msg)=>msg.toBuffer()));
313
- if (!root.equals(inHash.toBuffer())) {
314
- throw new Error('Obtained L1 to L2 messages failed to be hashed to the block inHash');
315
- }
316
- }
317
327
  }
@@ -1,2 +1,2 @@
1
1
  export * from './utils.js';
2
- //# sourceMappingURL=index.d.ts.map
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsWUFBWSxDQUFDIn0=