@aztec/world-state 0.84.0 → 0.85.0

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.
@@ -36,8 +36,13 @@ export class NativeWorldStateService {
36
36
  static async new(rollupAddress, dataDir, dbMapSizeKb, prefilledPublicData = [], instrumentation = new WorldStateInstrumentation(getTelemetryClient()), log = createLogger('world-state:database'), cleanup = ()=>Promise.resolve()) {
37
37
  const worldStateDirectory = join(dataDir, WORLD_STATE_DIR);
38
38
  // Create a version manager to handle versioning
39
- const versionManager = new DatabaseVersionManager(WORLD_STATE_DB_VERSION, rollupAddress, worldStateDirectory, (dir)=>{
40
- return Promise.resolve(new NativeWorldState(dir, dbMapSizeKb, prefilledPublicData, instrumentation));
39
+ const versionManager = new DatabaseVersionManager({
40
+ schemaVersion: WORLD_STATE_DB_VERSION,
41
+ rollupAddress,
42
+ dataDirectory: worldStateDirectory,
43
+ onOpen: (dir)=>{
44
+ return Promise.resolve(new NativeWorldState(dir, dbMapSizeKb, prefilledPublicData, instrumentation));
45
+ }
41
46
  });
42
47
  const [instance] = await versionManager.open();
43
48
  const worldState = new this(instance, instrumentation, log, cleanup);
@@ -43,10 +43,11 @@ export declare class ServerWorldStateSynchronizer implements WorldStateSynchroni
43
43
  resumeSync(): void;
44
44
  /**
45
45
  * Forces an immediate sync.
46
- * @param targetBlockNumber - The target block number that we must sync to. Will download unproven blocks if needed to reach it. Throws if cannot be reached.
46
+ * @param targetBlockNumber - The target block number that we must sync to. Will download unproven blocks if needed to reach it.
47
+ * @param skipThrowIfTargetNotReached - Whether to skip throwing if the target block number is not reached.
47
48
  * @returns A promise that resolves with the block number the world state was synced to
48
49
  */
49
- syncImmediate(targetBlockNumber?: number): Promise<number>;
50
+ syncImmediate(targetBlockNumber?: number, skipThrowIfTargetNotReached?: boolean): Promise<number>;
50
51
  /** Returns the L2 block hash for a given number. Used by the L2BlockStream for detecting reorgs. */
51
52
  getL2BlockHash(number: number): Promise<string | undefined>;
52
53
  /** Returns the latest L2 block number for each tip of the chain (latest, proven, finalized). */
@@ -1 +1 @@
1
- {"version":3,"file":"server_world_state_synchronizer.d.ts","sourceRoot":"","sources":["../../src/synchronizer/server_world_state_synchronizer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server_world_state_synchronizer.d.ts","sourceRoot":"","sources":["../../src/synchronizer/server_world_state_synchronizer.ts"],"names":[],"mappings":"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"}
@@ -125,9 +125,10 @@ import { WorldStateInstrumentation } from '../instrumentation/instrumentation.js
125
125
  }
126
126
  /**
127
127
  * Forces an immediate sync.
128
- * @param targetBlockNumber - The target block number that we must sync to. Will download unproven blocks if needed to reach it. Throws if cannot be reached.
128
+ * @param targetBlockNumber - The target block number that we must sync to. Will download unproven blocks if needed to reach it.
129
+ * @param skipThrowIfTargetNotReached - Whether to skip throwing if the target block number is not reached.
129
130
  * @returns A promise that resolves with the block number the world state was synced to
130
- */ async syncImmediate(targetBlockNumber) {
131
+ */ async syncImmediate(targetBlockNumber, skipThrowIfTargetNotReached) {
131
132
  if (this.currentState !== WorldStateRunningState.RUNNING || this.blockStream === undefined) {
132
133
  throw new Error(`World State is not running. Unable to perform sync.`);
133
134
  }
@@ -137,11 +138,19 @@ import { WorldStateInstrumentation } from '../instrumentation/instrumentation.js
137
138
  return currentBlockNumber;
138
139
  }
139
140
  this.log.debug(`World State at ${currentBlockNumber} told to sync to ${targetBlockNumber ?? 'latest'}`);
141
+ // If the archiver is behind the target block, force an archiver sync
142
+ if (targetBlockNumber) {
143
+ const archiverLatestBlock = await this.l2BlockSource.getBlockNumber();
144
+ if (archiverLatestBlock < targetBlockNumber) {
145
+ this.log.debug(`Archiver is at ${archiverLatestBlock} behind target block ${targetBlockNumber}.`);
146
+ await this.l2BlockSource.syncImmediate();
147
+ }
148
+ }
140
149
  // Force the block stream to sync against the archiver now
141
150
  await this.blockStream.sync();
142
151
  // If we have been given a block number to sync to and we have not reached that number then fail
143
152
  const updatedBlockNumber = await this.getLatestBlockNumber();
144
- if (targetBlockNumber !== undefined && targetBlockNumber > updatedBlockNumber) {
153
+ if (!skipThrowIfTargetNotReached && targetBlockNumber !== undefined && targetBlockNumber > updatedBlockNumber) {
145
154
  throw new Error(`Unable to sync to block number ${targetBlockNumber} (last synced is ${updatedBlockNumber})`);
146
155
  }
147
156
  return updatedBlockNumber;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aztec/world-state",
3
- "version": "0.84.0",
3
+ "version": "0.85.0",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": "./dest/index.js",
@@ -62,27 +62,24 @@
62
62
  ]
63
63
  },
64
64
  "dependencies": {
65
- "@aztec/constants": "0.84.0",
66
- "@aztec/foundation": "0.84.0",
67
- "@aztec/kv-store": "0.84.0",
68
- "@aztec/merkle-tree": "0.84.0",
69
- "@aztec/native": "0.84.0",
70
- "@aztec/protocol-contracts": "0.84.0",
71
- "@aztec/stdlib": "0.84.0",
72
- "@aztec/telemetry-client": "0.84.0",
65
+ "@aztec/constants": "0.85.0",
66
+ "@aztec/foundation": "0.85.0",
67
+ "@aztec/kv-store": "0.85.0",
68
+ "@aztec/merkle-tree": "0.85.0",
69
+ "@aztec/native": "0.85.0",
70
+ "@aztec/protocol-contracts": "0.85.0",
71
+ "@aztec/stdlib": "0.85.0",
72
+ "@aztec/telemetry-client": "0.85.0",
73
73
  "tslib": "^2.4.0",
74
74
  "zod": "^3.23.8"
75
75
  },
76
76
  "devDependencies": {
77
- "@aztec/archiver": "0.84.0",
77
+ "@aztec/archiver": "0.85.0",
78
78
  "@jest/globals": "^29.5.0",
79
79
  "@types/jest": "^29.5.0",
80
- "@types/levelup": "^5.1.2",
81
- "@types/memdown": "^3.0.0",
82
80
  "@types/node": "^18.7.23",
83
81
  "jest": "^29.5.0",
84
82
  "jest-mock-extended": "^3.0.5",
85
- "memdown": "^6.1.1",
86
83
  "ts-node": "^10.9.1",
87
84
  "typescript": "^5.0.4"
88
85
  },
@@ -64,14 +64,14 @@ export class NativeWorldStateService implements MerkleTreeDatabase {
64
64
  ): Promise<NativeWorldStateService> {
65
65
  const worldStateDirectory = join(dataDir, WORLD_STATE_DIR);
66
66
  // Create a version manager to handle versioning
67
- const versionManager = new DatabaseVersionManager(
68
- WORLD_STATE_DB_VERSION,
67
+ const versionManager = new DatabaseVersionManager({
68
+ schemaVersion: WORLD_STATE_DB_VERSION,
69
69
  rollupAddress,
70
- worldStateDirectory,
71
- (dir: string) => {
70
+ dataDirectory: worldStateDirectory,
71
+ onOpen: (dir: string) => {
72
72
  return Promise.resolve(new NativeWorldState(dir, dbMapSizeKb, prefilledPublicData, instrumentation));
73
73
  },
74
- );
74
+ });
75
75
 
76
76
  const [instance] = await versionManager.open();
77
77
  const worldState = new this(instance, instrumentation, log, cleanup);
@@ -171,10 +171,11 @@ export class ServerWorldStateSynchronizer
171
171
 
172
172
  /**
173
173
  * Forces an immediate sync.
174
- * @param targetBlockNumber - The target block number that we must sync to. Will download unproven blocks if needed to reach it. Throws if cannot be reached.
174
+ * @param targetBlockNumber - The target block number that we must sync to. Will download unproven blocks if needed to reach it.
175
+ * @param skipThrowIfTargetNotReached - Whether to skip throwing if the target block number is not reached.
175
176
  * @returns A promise that resolves with the block number the world state was synced to
176
177
  */
177
- public async syncImmediate(targetBlockNumber?: number): Promise<number> {
178
+ public async syncImmediate(targetBlockNumber?: number, skipThrowIfTargetNotReached?: boolean): Promise<number> {
178
179
  if (this.currentState !== WorldStateRunningState.RUNNING || this.blockStream === undefined) {
179
180
  throw new Error(`World State is not running. Unable to perform sync.`);
180
181
  }
@@ -186,12 +187,21 @@ export class ServerWorldStateSynchronizer
186
187
  }
187
188
  this.log.debug(`World State at ${currentBlockNumber} told to sync to ${targetBlockNumber ?? 'latest'}`);
188
189
 
190
+ // If the archiver is behind the target block, force an archiver sync
191
+ if (targetBlockNumber) {
192
+ const archiverLatestBlock = await this.l2BlockSource.getBlockNumber();
193
+ if (archiverLatestBlock < targetBlockNumber) {
194
+ this.log.debug(`Archiver is at ${archiverLatestBlock} behind target block ${targetBlockNumber}.`);
195
+ await this.l2BlockSource.syncImmediate();
196
+ }
197
+ }
198
+
189
199
  // Force the block stream to sync against the archiver now
190
200
  await this.blockStream.sync();
191
201
 
192
202
  // If we have been given a block number to sync to and we have not reached that number then fail
193
203
  const updatedBlockNumber = await this.getLatestBlockNumber();
194
- if (targetBlockNumber !== undefined && targetBlockNumber > updatedBlockNumber) {
204
+ if (!skipThrowIfTargetNotReached && targetBlockNumber !== undefined && targetBlockNumber > updatedBlockNumber) {
195
205
  throw new Error(`Unable to sync to block number ${targetBlockNumber} (last synced is ${updatedBlockNumber})`);
196
206
  }
197
207