@aztec/world-state 0.0.1-commit.d431d1c → 0.0.1-commit.d58ff9d0

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 (76) hide show
  1. package/dest/index.d.ts +2 -1
  2. package/dest/index.d.ts.map +1 -1
  3. package/dest/index.js +1 -0
  4. package/dest/instrumentation/instrumentation.d.ts +4 -3
  5. package/dest/instrumentation/instrumentation.d.ts.map +1 -1
  6. package/dest/instrumentation/instrumentation.js +13 -11
  7. package/dest/native/fork_checkpoint.d.ts +7 -1
  8. package/dest/native/fork_checkpoint.d.ts.map +1 -1
  9. package/dest/native/fork_checkpoint.js +15 -3
  10. package/dest/native/index.d.ts +2 -1
  11. package/dest/native/index.d.ts.map +1 -1
  12. package/dest/native/index.js +1 -0
  13. package/dest/native/ipc_world_state_instance.d.ts +89 -0
  14. package/dest/native/ipc_world_state_instance.d.ts.map +1 -0
  15. package/dest/native/ipc_world_state_instance.js +661 -0
  16. package/dest/native/merkle_trees_facade.d.ts +12 -8
  17. package/dest/native/merkle_trees_facade.d.ts.map +1 -1
  18. package/dest/native/merkle_trees_facade.js +63 -115
  19. package/dest/native/message.d.ts +14 -221
  20. package/dest/native/message.d.ts.map +1 -1
  21. package/dest/native/message.js +0 -42
  22. package/dest/native/native_world_state.d.ts +22 -10
  23. package/dest/native/native_world_state.d.ts.map +1 -1
  24. package/dest/native/native_world_state.js +122 -59
  25. package/dest/native/native_world_state_instance.d.ts +56 -42
  26. package/dest/native/native_world_state_instance.d.ts.map +1 -1
  27. package/dest/native/native_world_state_instance.js +1 -203
  28. package/dest/native/world_state_operation.d.ts +7 -0
  29. package/dest/native/world_state_operation.d.ts.map +1 -0
  30. package/dest/native/world_state_operation.js +5 -0
  31. package/dest/synchronizer/config.d.ts +3 -5
  32. package/dest/synchronizer/config.d.ts.map +1 -1
  33. package/dest/synchronizer/config.js +15 -18
  34. package/dest/synchronizer/errors.d.ts +8 -1
  35. package/dest/synchronizer/errors.d.ts.map +1 -1
  36. package/dest/synchronizer/errors.js +8 -1
  37. package/dest/synchronizer/factory.d.ts +6 -5
  38. package/dest/synchronizer/factory.d.ts.map +1 -1
  39. package/dest/synchronizer/factory.js +7 -6
  40. package/dest/synchronizer/index.d.ts +2 -1
  41. package/dest/synchronizer/index.d.ts.map +1 -1
  42. package/dest/synchronizer/index.js +1 -0
  43. package/dest/synchronizer/server_world_state_synchronizer.d.ts +13 -8
  44. package/dest/synchronizer/server_world_state_synchronizer.d.ts.map +1 -1
  45. package/dest/synchronizer/server_world_state_synchronizer.js +134 -49
  46. package/dest/test/utils.d.ts +6 -6
  47. package/dest/test/utils.d.ts.map +1 -1
  48. package/dest/test/utils.js +9 -4
  49. package/dest/testing.d.ts +4 -3
  50. package/dest/testing.d.ts.map +1 -1
  51. package/dest/testing.js +14 -7
  52. package/dest/world-state-db/merkle_tree_db.d.ts +3 -12
  53. package/dest/world-state-db/merkle_tree_db.d.ts.map +1 -1
  54. package/package.json +13 -11
  55. package/src/index.ts +1 -0
  56. package/src/instrumentation/instrumentation.ts +15 -19
  57. package/src/native/fork_checkpoint.ts +19 -3
  58. package/src/native/index.ts +1 -0
  59. package/src/native/ipc_world_state_instance.ts +834 -0
  60. package/src/native/merkle_trees_facade.ts +89 -109
  61. package/src/native/message.ts +13 -286
  62. package/src/native/native_world_state.ts +152 -93
  63. package/src/native/native_world_state_instance.ts +94 -279
  64. package/src/native/world_state_operation.ts +33 -0
  65. package/src/synchronizer/config.ts +16 -23
  66. package/src/synchronizer/errors.ts +8 -0
  67. package/src/synchronizer/factory.ts +18 -11
  68. package/src/synchronizer/index.ts +1 -0
  69. package/src/synchronizer/server_world_state_synchronizer.ts +156 -51
  70. package/src/test/utils.ts +14 -5
  71. package/src/testing.ts +12 -10
  72. package/src/world-state-db/merkle_tree_db.ts +2 -12
  73. package/dest/native/world_state_ops_queue.d.ts +0 -19
  74. package/dest/native/world_state_ops_queue.d.ts.map +0 -1
  75. package/dest/native/world_state_ops_queue.js +0 -146
  76. package/src/native/world_state_ops_queue.ts +0 -190
@@ -3,10 +3,9 @@ import { BlockNumber } from '@aztec/foundation/branded-types';
3
3
  import { fromEntries, padArrayEnd } from '@aztec/foundation/collection';
4
4
  import { Fr } from '@aztec/foundation/curves/bn254';
5
5
  import { EthAddress } from '@aztec/foundation/eth-address';
6
- import { tryRmDir } from '@aztec/foundation/fs';
7
- import { type Logger, createLogger } from '@aztec/foundation/log';
8
- import type { L2BlockNew } from '@aztec/stdlib/block';
9
- import { DatabaseVersionManager } from '@aztec/stdlib/database-version';
6
+ import { type Logger, type LoggerBindings, createLogger } from '@aztec/foundation/log';
7
+ import type { L2Block } from '@aztec/stdlib/block';
8
+ import { DatabaseVersionManager } from '@aztec/stdlib/database-version/manager';
10
9
  import type {
11
10
  IndexedTreeId,
12
11
  MerkleTreeReadOperations,
@@ -14,21 +13,21 @@ import type {
14
13
  } from '@aztec/stdlib/interfaces/server';
15
14
  import type { SnapshotDataKeys } from '@aztec/stdlib/snapshots';
16
15
  import { MerkleTreeId, NullifierLeaf, type NullifierLeafPreimage, PublicDataTreeLeaf } from '@aztec/stdlib/trees';
17
- import { BlockHeader, PartialStateReference, StateReference } from '@aztec/stdlib/tx';
18
- import { WorldStateRevision } from '@aztec/stdlib/world-state';
16
+ import { BlockHeader, GlobalVariables, PartialStateReference, StateReference } from '@aztec/stdlib/tx';
17
+ import { EMPTY_GENESIS_DATA, type GenesisData, WorldStateRevision } from '@aztec/stdlib/world-state';
19
18
  import { getTelemetryClient } from '@aztec/telemetry-client';
20
19
 
21
20
  import assert from 'assert/strict';
22
- import { mkdtemp, rm } from 'fs/promises';
21
+ import { mkdir, mkdtemp, rm } from 'fs/promises';
23
22
  import { tmpdir } from 'os';
24
23
  import { join } from 'path';
25
24
 
26
25
  import { WorldStateInstrumentation } from '../instrumentation/instrumentation.js';
27
26
  import type { WorldStateTreeMapSizes } from '../synchronizer/factory.js';
28
27
  import type { MerkleTreeAdminDatabase as MerkleTreeDatabase } from '../world-state-db/merkle_tree_db.js';
28
+ import { IpcWorldState } from './ipc_world_state_instance.js';
29
29
  import { MerkleTreesFacade, MerkleTreesForkFacade, serializeLeaf } from './merkle_trees_facade.js';
30
30
  import {
31
- WorldStateMessageType,
32
31
  type WorldStateStatusFull,
33
32
  type WorldStateStatusSummary,
34
33
  blockStateReference,
@@ -36,7 +35,7 @@ import {
36
35
  sanitizeSummary,
37
36
  treeStateReferenceToSnapshot,
38
37
  } from './message.js';
39
- import { NativeWorldState } from './native_world_state_instance.js';
38
+ import type { NativeWorldStateInstance } from './native_world_state_instance.js';
40
39
 
41
40
  // The current version of the world state database schema
42
41
  // Increment this when making incompatible changes to the database schema
@@ -50,34 +49,49 @@ export class NativeWorldStateService implements MerkleTreeDatabase {
50
49
  private cachedStatusSummary: WorldStateStatusSummary | undefined;
51
50
 
52
51
  protected constructor(
53
- protected instance: NativeWorldState,
52
+ protected instance: NativeWorldStateInstance,
54
53
  protected readonly worldStateInstrumentation: WorldStateInstrumentation,
55
- protected readonly log: Logger = createLogger('world-state:database'),
54
+ protected readonly log: Logger,
55
+ private readonly genesis: GenesisData = EMPTY_GENESIS_DATA,
56
56
  private readonly cleanup = () => Promise.resolve(),
57
+ /** Factory to recreate a fresh IpcWorldState after clear(). */
58
+ private readonly recreateInstance?: () => Promise<NativeWorldStateInstance>,
57
59
  ) {}
58
60
 
59
61
  static async new(
60
62
  rollupAddress: EthAddress,
61
63
  dataDir: string,
62
64
  wsTreeMapSizes: WorldStateTreeMapSizes,
63
- prefilledPublicData: PublicDataTreeLeaf[] = [],
65
+ genesis: GenesisData = EMPTY_GENESIS_DATA,
64
66
  instrumentation = new WorldStateInstrumentation(getTelemetryClient()),
65
- log = createLogger('world-state:database'),
67
+ bindings?: LoggerBindings,
66
68
  cleanup = () => Promise.resolve(),
67
69
  ): Promise<NativeWorldStateService> {
70
+ for (const [key, value] of Object.entries(wsTreeMapSizes)) {
71
+ if (value <= 0) {
72
+ throw new Error(`Map size must be a positive number, got ${value} for ${key}`);
73
+ }
74
+ }
75
+
76
+ const log = createLogger('world-state:database', bindings);
68
77
  const worldStateDirectory = join(dataDir, WORLD_STATE_DIR);
69
- // Create a version manager to handle versioning
78
+
70
79
  const versionManager = new DatabaseVersionManager({
71
80
  schemaVersion: WORLD_STATE_DB_VERSION,
72
81
  rollupAddress,
73
82
  dataDirectory: worldStateDirectory,
74
- onOpen: (dir: string) => {
75
- return Promise.resolve(new NativeWorldState(dir, wsTreeMapSizes, prefilledPublicData, instrumentation));
76
- },
83
+ onOpen: dir => IpcWorldState.spawn(dir, wsTreeMapSizes, genesis, instrumentation, bindings),
77
84
  });
78
85
 
79
86
  const [instance] = await versionManager.open();
80
- const worldState = new this(instance, instrumentation, log, cleanup);
87
+
88
+ const recreateInstance = async () => {
89
+ await rm(worldStateDirectory, { recursive: true, force: true, maxRetries: 3 });
90
+ await mkdir(worldStateDirectory, { recursive: true });
91
+ return IpcWorldState.spawn(worldStateDirectory, wsTreeMapSizes, genesis, instrumentation, bindings);
92
+ };
93
+
94
+ const worldState = new this(instance, instrumentation, log, genesis, cleanup, recreateInstance);
81
95
  try {
82
96
  await worldState.init();
83
97
  } catch (e) {
@@ -89,14 +103,19 @@ export class NativeWorldStateService implements MerkleTreeDatabase {
89
103
  }
90
104
 
91
105
  static async tmp(
92
- rollupAddress = EthAddress.ZERO,
93
106
  cleanupTmpDir = true,
94
- prefilledPublicData: PublicDataTreeLeaf[] = [],
107
+ genesis: GenesisData = EMPTY_GENESIS_DATA,
95
108
  instrumentation = new WorldStateInstrumentation(getTelemetryClient()),
109
+ bindings?: LoggerBindings,
110
+ threads?: number,
96
111
  ): Promise<NativeWorldStateService> {
97
- const log = createLogger('world-state:database');
112
+ const log = createLogger('world-state:database', bindings);
98
113
  const dataDir = await mkdtemp(join(tmpdir(), 'aztec-world-state-'));
99
- const dbMapSizeKb = 10 * 1024 * 1024;
114
+ // Temporary (test/dev) world states are small and short-lived. Keep the LMDB
115
+ // map sizes in the MB range: with the IPC backend each tmp() spawns a separate
116
+ // aztec-wsdb that maps these per tree, and oversized maps add real cold-start
117
+ // I/O under parallel CI load. 256 MB/tree is ample for tests.
118
+ const dbMapSizeKb = 256 * 1024;
100
119
  const worldStateTreeMapSizes: WorldStateTreeMapSizes = {
101
120
  archiveTreeMapSizeKb: dbMapSizeKb,
102
121
  nullifierTreeMapSizeKb: dbMapSizeKb,
@@ -106,7 +125,15 @@ export class NativeWorldStateService implements MerkleTreeDatabase {
106
125
  };
107
126
  log.debug(`Created temporary world state database at: ${dataDir} with tree map size: ${dbMapSizeKb}`);
108
127
 
109
- // pass a cleanup callback because process.on('beforeExit', cleanup) does not work under Jest
128
+ const instance = await IpcWorldState.spawn(
129
+ dataDir,
130
+ worldStateTreeMapSizes,
131
+ genesis,
132
+ instrumentation,
133
+ bindings,
134
+ threads,
135
+ );
136
+
110
137
  const cleanup = async () => {
111
138
  if (cleanupTmpDir) {
112
139
  await rm(dataDir, { recursive: true, force: true, maxRetries: 3 });
@@ -116,7 +143,47 @@ export class NativeWorldStateService implements MerkleTreeDatabase {
116
143
  }
117
144
  };
118
145
 
119
- return this.new(rollupAddress, dataDir, worldStateTreeMapSizes, prefilledPublicData, instrumentation, log, cleanup);
146
+ const recreateInstance = async () => {
147
+ await rm(dataDir, { recursive: true, force: true, maxRetries: 3 });
148
+ await mkdir(dataDir, { recursive: true });
149
+ return IpcWorldState.spawn(dataDir, worldStateTreeMapSizes, genesis, instrumentation, bindings, threads);
150
+ };
151
+
152
+ const worldState = new this(instance, instrumentation, log, genesis, cleanup, recreateInstance);
153
+ try {
154
+ await worldState.init();
155
+ } catch (e) {
156
+ log.error(`Error initializing tmp world state: ${e}`);
157
+ throw e;
158
+ }
159
+ return worldState;
160
+ }
161
+
162
+ static ephemeral(
163
+ genesis: GenesisData = EMPTY_GENESIS_DATA,
164
+ instrumentation = new WorldStateInstrumentation(getTelemetryClient()),
165
+ bindings?: LoggerBindings,
166
+ ): Promise<NativeWorldStateService> {
167
+ // The TXE spins up one tiny, short-lived world state per test, many concurrently. Cap the wsdb thread
168
+ // usage to the minimum: a single tree-op thread instead of one per core (the C++ IPC dispatcher pool
169
+ // still floors at 2). This avoids ~32 threads per wsdb multiplied across dozens of concurrent test
170
+ // world states — the trees are cache-sized (see tmp's map-size note), so extra threads buy nothing.
171
+ return this.tmp(/*cleanupTmpDir=*/ true, genesis, instrumentation, bindings, /*threads=*/ 1);
172
+ }
173
+
174
+ static async fromIpc(
175
+ wsdbBackend: ConstructorParameters<typeof IpcWorldState>[0],
176
+ instrumentation = new WorldStateInstrumentation(getTelemetryClient()),
177
+ bindings?: LoggerBindings,
178
+ genesis: GenesisData = EMPTY_GENESIS_DATA,
179
+ cleanup = () => Promise.resolve(),
180
+ recreateInstance?: () => Promise<NativeWorldStateInstance>,
181
+ ): Promise<NativeWorldStateService> {
182
+ const log = createLogger('world-state:database', bindings);
183
+ const instance = new IpcWorldState(wsdbBackend, instrumentation, bindings);
184
+ const worldState = new this(instance, instrumentation, log, genesis, cleanup, recreateInstance);
185
+ await worldState.init();
186
+ return worldState;
120
187
  }
121
188
 
122
189
  protected async init() {
@@ -140,11 +207,24 @@ export class NativeWorldStateService implements MerkleTreeDatabase {
140
207
  assert.strictEqual(initialHeaderIndex, 0n, 'Invalid initial archive state');
141
208
  }
142
209
 
143
- public async clear() {
210
+ public async clear(): Promise<void> {
211
+ if (!this.recreateInstance) {
212
+ throw new Error('clear() is not available for externally-managed IPC backends');
213
+ }
214
+ this.log.warn('Clearing world state: shutting down WSDB, deleting data, and recreating');
144
215
  await this.instance.close();
145
216
  this.cachedStatusSummary = undefined;
146
- await tryRmDir(this.instance.getDataDir(), this.log);
147
- this.instance = this.instance.clone();
217
+ this.instance = await this.recreateInstance();
218
+ await this.init();
219
+ this.log.info('World state cleared and reinitialized from genesis');
220
+ }
221
+
222
+ /** Returns the IPC path of the underlying IPC backend, if available. */
223
+ public getIpcPath(): string {
224
+ if (this.instance instanceof IpcWorldState) {
225
+ return this.instance.getIpcPath();
226
+ }
227
+ throw new Error('getIpcPath() is only available with IPC world state');
148
228
  }
149
229
 
150
230
  public getCommitted(): MerkleTreeReadOperations {
@@ -163,17 +243,16 @@ export class NativeWorldStateService implements MerkleTreeDatabase {
163
243
  blockNumber?: BlockNumber,
164
244
  opts: { closeDelayMs?: number } = {},
165
245
  ): Promise<MerkleTreeWriteOperations> {
166
- const resp = await this.instance.call(WorldStateMessageType.CREATE_FORK, {
246
+ const forkId = await this.instance.createFork({
167
247
  latest: blockNumber === undefined,
168
248
  blockNumber: blockNumber ?? BlockNumber.ZERO,
169
- canonical: true,
170
249
  });
171
250
  return new MerkleTreesForkFacade(
172
251
  this.instance,
173
252
  this.initialHeader!,
174
253
  new WorldStateRevision(
175
- /*forkId=*/ resp.forkId,
176
- /* blockNumber=*/ BlockNumber.ZERO,
254
+ /*forkId=*/ forkId,
255
+ /* blockNumber=*/ WorldStateRevision.LATEST,
177
256
  /* includeUncommitted=*/ true,
178
257
  ),
179
258
  opts,
@@ -184,7 +263,7 @@ export class NativeWorldStateService implements MerkleTreeDatabase {
184
263
  return this.initialHeader!;
185
264
  }
186
265
 
187
- public async handleL2BlockAndMessages(l2Block: L2BlockNew, l1ToL2Messages: Fr[]): Promise<WorldStateStatusFull> {
266
+ public async handleL2BlockAndMessages(l2Block: L2Block, l1ToL2Messages: Fr[]): Promise<WorldStateStatusFull> {
188
267
  const isFirstBlock = l2Block.indexWithinCheckpoint === 0;
189
268
  if (!isFirstBlock && l1ToL2Messages.length > 0) {
190
269
  throw new Error(
@@ -216,35 +295,44 @@ export class NativeWorldStateService implements MerkleTreeDatabase {
216
295
  });
217
296
 
218
297
  try {
219
- return await this.instance.call(
220
- WorldStateMessageType.SYNC_BLOCK,
221
- {
222
- blockNumber: l2Block.number,
223
- blockHeaderHash: await l2Block.hash(),
224
- paddedL1ToL2Messages: paddedL1ToL2Messages.map(serializeLeaf),
225
- paddedNoteHashes: paddedNoteHashes.map(serializeLeaf),
226
- paddedNullifiers: paddedNullifiers.map(serializeLeaf),
227
- publicDataWrites: publicDataWrites.map(serializeLeaf),
228
- blockStateRef: blockStateReference(l2Block.header.state),
229
- canonical: true,
230
- },
231
- this.sanitizeAndCacheSummaryFromFull.bind(this),
232
- this.deleteCachedSummary.bind(this),
233
- );
298
+ const status = await this.instance.syncBlock({
299
+ blockNumber: l2Block.number,
300
+ blockHeaderHash: (await l2Block.hash()).toBuffer(),
301
+ // Forwarded so the native sync verifies the archive root against canonical and rejects a divergent tree.
302
+ expectedArchiveRoot: l2Block.archive.root.toBuffer(),
303
+ expectedPreviousArchiveRoot: l2Block.header.lastArchive.root.toBuffer(),
304
+ paddedL1ToL2Messages: paddedL1ToL2Messages.map(serializeLeaf),
305
+ paddedNoteHashes: paddedNoteHashes.map(serializeLeaf),
306
+ paddedNullifiers: paddedNullifiers.map(serializeLeaf),
307
+ publicDataWrites: publicDataWrites.map(serializeLeaf),
308
+ blockStateRef: blockStateReference(l2Block.header.state),
309
+ });
310
+ return this.sanitizeAndCacheSummaryFromFull(status);
234
311
  } catch (err) {
312
+ this.deleteCachedSummary();
235
313
  this.worldStateInstrumentation.incCriticalErrors('synch_pending_block');
236
314
  throw err;
237
315
  }
238
316
  }
239
317
 
240
318
  public async close(): Promise<void> {
241
- await this.instance.close();
242
- await this.cleanup();
319
+ try {
320
+ await this.instance.close();
321
+ } finally {
322
+ await this.cleanup();
323
+ }
324
+ }
325
+
326
+ async [Symbol.asyncDispose](): Promise<void> {
327
+ await this.close();
243
328
  }
244
329
 
245
330
  private async buildInitialHeader(): Promise<BlockHeader> {
246
331
  const state = await this.getInitialStateReference();
247
- return BlockHeader.empty({ state });
332
+ return BlockHeader.empty({
333
+ state,
334
+ globalVariables: GlobalVariables.empty({ timestamp: this.genesis.genesisTimestamp }),
335
+ });
248
336
  }
249
337
 
250
338
  private sanitizeAndCacheSummaryFromFull(response: WorldStateStatusFull) {
@@ -259,7 +347,7 @@ export class NativeWorldStateService implements MerkleTreeDatabase {
259
347
  return sanitized;
260
348
  }
261
349
 
262
- private deleteCachedSummary(_: string) {
350
+ private deleteCachedSummary() {
263
351
  this.cachedStatusSummary = undefined;
264
352
  }
265
353
 
@@ -270,16 +358,9 @@ export class NativeWorldStateService implements MerkleTreeDatabase {
270
358
  */
271
359
  public async setFinalized(toBlockNumber: BlockNumber) {
272
360
  try {
273
- await this.instance.call(
274
- WorldStateMessageType.FINALIZE_BLOCKS,
275
- {
276
- toBlockNumber,
277
- canonical: true,
278
- },
279
- this.sanitizeAndCacheSummary.bind(this),
280
- this.deleteCachedSummary.bind(this),
281
- );
361
+ this.sanitizeAndCacheSummary(await this.instance.finalizeBlocks(toBlockNumber));
282
362
  } catch (err) {
363
+ this.deleteCachedSummary();
283
364
  this.worldStateInstrumentation.incCriticalErrors('finalize_block');
284
365
  throw err;
285
366
  }
@@ -293,16 +374,9 @@ export class NativeWorldStateService implements MerkleTreeDatabase {
293
374
  */
294
375
  public async removeHistoricalBlocks(toBlockNumber: BlockNumber) {
295
376
  try {
296
- return await this.instance.call(
297
- WorldStateMessageType.REMOVE_HISTORICAL_BLOCKS,
298
- {
299
- toBlockNumber,
300
- canonical: true,
301
- },
302
- this.sanitizeAndCacheSummaryFromFull.bind(this),
303
- this.deleteCachedSummary.bind(this),
304
- );
377
+ return this.sanitizeAndCacheSummaryFromFull(await this.instance.removeHistoricalBlocks(toBlockNumber));
305
378
  } catch (err) {
379
+ this.deleteCachedSummary();
306
380
  this.worldStateInstrumentation.incCriticalErrors('prune_historical_block');
307
381
  throw err;
308
382
  }
@@ -315,16 +389,9 @@ export class NativeWorldStateService implements MerkleTreeDatabase {
315
389
  */
316
390
  public async unwindBlocks(toBlockNumber: BlockNumber) {
317
391
  try {
318
- return await this.instance.call(
319
- WorldStateMessageType.UNWIND_BLOCKS,
320
- {
321
- toBlockNumber,
322
- canonical: true,
323
- },
324
- this.sanitizeAndCacheSummaryFromFull.bind(this),
325
- this.deleteCachedSummary.bind(this),
326
- );
392
+ return this.sanitizeAndCacheSummaryFromFull(await this.instance.unwindBlocks(toBlockNumber));
327
393
  } catch (err) {
394
+ this.deleteCachedSummary();
328
395
  this.worldStateInstrumentation.incCriticalErrors('prune_pending_block');
329
396
  throw err;
330
397
  }
@@ -334,11 +401,7 @@ export class NativeWorldStateService implements MerkleTreeDatabase {
334
401
  if (this.cachedStatusSummary !== undefined) {
335
402
  return { ...this.cachedStatusSummary };
336
403
  }
337
- return await this.instance.call(
338
- WorldStateMessageType.GET_STATUS,
339
- { canonical: true },
340
- this.sanitizeAndCacheSummary.bind(this),
341
- );
404
+ return this.sanitizeAndCacheSummary(await this.instance.getStatus());
342
405
  }
343
406
 
344
407
  updateLeaf<ID extends IndexedTreeId>(
@@ -350,14 +413,14 @@ export class NativeWorldStateService implements MerkleTreeDatabase {
350
413
  }
351
414
 
352
415
  private async getInitialStateReference(): Promise<StateReference> {
353
- const resp = await this.instance.call(WorldStateMessageType.GET_INITIAL_STATE_REFERENCE, { canonical: true });
416
+ const state = await this.instance.getInitialStateReference();
354
417
 
355
418
  return new StateReference(
356
- treeStateReferenceToSnapshot(resp.state[MerkleTreeId.L1_TO_L2_MESSAGE_TREE]),
419
+ treeStateReferenceToSnapshot(state[MerkleTreeId.L1_TO_L2_MESSAGE_TREE]),
357
420
  new PartialStateReference(
358
- treeStateReferenceToSnapshot(resp.state[MerkleTreeId.NOTE_HASH_TREE]),
359
- treeStateReferenceToSnapshot(resp.state[MerkleTreeId.NULLIFIER_TREE]),
360
- treeStateReferenceToSnapshot(resp.state[MerkleTreeId.PUBLIC_DATA_TREE]),
421
+ treeStateReferenceToSnapshot(state[MerkleTreeId.NOTE_HASH_TREE]),
422
+ treeStateReferenceToSnapshot(state[MerkleTreeId.NULLIFIER_TREE]),
423
+ treeStateReferenceToSnapshot(state[MerkleTreeId.PUBLIC_DATA_TREE]),
361
424
  ),
362
425
  );
363
426
  }
@@ -366,11 +429,7 @@ export class NativeWorldStateService implements MerkleTreeDatabase {
366
429
  dstPath: string,
367
430
  compact: boolean = true,
368
431
  ): Promise<Record<Exclude<SnapshotDataKeys, 'archiver'>, string>> {
369
- await this.instance.call(WorldStateMessageType.COPY_STORES, {
370
- dstPath,
371
- compact,
372
- canonical: true,
373
- });
432
+ await this.instance.copyStores(dstPath, compact);
374
433
  return fromEntries(NATIVE_WORLD_STATE_DBS.map(([name, dir]) => [name, join(dstPath, dir, 'data.mdb')] as const));
375
434
  }
376
435
  }