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

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 (69) hide show
  1. package/dest/index.d.ts +1 -1
  2. package/dest/instrumentation/instrumentation.d.ts +4 -3
  3. package/dest/instrumentation/instrumentation.d.ts.map +1 -1
  4. package/dest/instrumentation/instrumentation.js +21 -50
  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 +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 +1 -1
  11. package/dest/native/ipc_world_state_instance.d.ts +87 -0
  12. package/dest/native/ipc_world_state_instance.d.ts.map +1 -0
  13. package/dest/native/ipc_world_state_instance.js +660 -0
  14. package/dest/native/merkle_trees_facade.d.ts +18 -8
  15. package/dest/native/merkle_trees_facade.d.ts.map +1 -1
  16. package/dest/native/merkle_trees_facade.js +90 -111
  17. package/dest/native/message.d.ts +22 -228
  18. package/dest/native/message.d.ts.map +1 -1
  19. package/dest/native/message.js +14 -55
  20. package/dest/native/native_world_state.d.ts +30 -15
  21. package/dest/native/native_world_state.d.ts.map +1 -1
  22. package/dest/native/native_world_state.js +126 -66
  23. package/dest/native/native_world_state_instance.d.ts +58 -32
  24. package/dest/native/native_world_state_instance.d.ts.map +1 -1
  25. package/dest/native/native_world_state_instance.js +5 -181
  26. package/dest/native/world_state_operation.d.ts +7 -0
  27. package/dest/native/world_state_operation.d.ts.map +1 -0
  28. package/dest/native/world_state_operation.js +5 -0
  29. package/dest/synchronizer/config.d.ts +3 -5
  30. package/dest/synchronizer/config.d.ts.map +1 -1
  31. package/dest/synchronizer/config.js +15 -18
  32. package/dest/synchronizer/errors.d.ts +1 -1
  33. package/dest/synchronizer/errors.d.ts.map +1 -1
  34. package/dest/synchronizer/factory.d.ts +6 -5
  35. package/dest/synchronizer/factory.d.ts.map +1 -1
  36. package/dest/synchronizer/factory.js +7 -6
  37. package/dest/synchronizer/index.d.ts +1 -1
  38. package/dest/synchronizer/server_world_state_synchronizer.d.ts +11 -28
  39. package/dest/synchronizer/server_world_state_synchronizer.d.ts.map +1 -1
  40. package/dest/synchronizer/server_world_state_synchronizer.js +165 -81
  41. package/dest/test/index.d.ts +1 -1
  42. package/dest/test/utils.d.ts +12 -5
  43. package/dest/test/utils.d.ts.map +1 -1
  44. package/dest/test/utils.js +54 -50
  45. package/dest/testing.d.ts +5 -4
  46. package/dest/testing.d.ts.map +1 -1
  47. package/dest/testing.js +11 -7
  48. package/dest/world-state-db/index.d.ts +1 -1
  49. package/dest/world-state-db/merkle_tree_db.d.ts +9 -19
  50. package/dest/world-state-db/merkle_tree_db.d.ts.map +1 -1
  51. package/package.json +17 -13
  52. package/src/instrumentation/instrumentation.ts +23 -59
  53. package/src/native/fork_checkpoint.ts +19 -3
  54. package/src/native/ipc_world_state_instance.ts +830 -0
  55. package/src/native/merkle_trees_facade.ts +118 -104
  56. package/src/native/message.ts +33 -305
  57. package/src/native/native_world_state.ts +164 -108
  58. package/src/native/native_world_state_instance.ts +96 -250
  59. package/src/native/world_state_operation.ts +33 -0
  60. package/src/synchronizer/config.ts +16 -23
  61. package/src/synchronizer/factory.ts +18 -11
  62. package/src/synchronizer/server_world_state_synchronizer.ts +181 -106
  63. package/src/test/utils.ts +87 -92
  64. package/src/testing.ts +9 -10
  65. package/src/world-state-db/merkle_tree_db.ts +12 -19
  66. package/dest/native/world_state_ops_queue.d.ts +0 -19
  67. package/dest/native/world_state_ops_queue.d.ts.map +0 -1
  68. package/dest/native/world_state_ops_queue.js +0 -146
  69. package/src/native/world_state_ops_queue.ts +0 -190
@@ -1,53 +1,72 @@
1
+ var _computedKey;
1
2
  import { MAX_NOTE_HASHES_PER_TX, MAX_NULLIFIERS_PER_TX, NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP } from '@aztec/constants';
3
+ import { BlockNumber } from '@aztec/foundation/branded-types';
2
4
  import { fromEntries, padArrayEnd } from '@aztec/foundation/collection';
3
- import { EthAddress } from '@aztec/foundation/eth-address';
4
- import { Fr } from '@aztec/foundation/fields';
5
- import { tryRmDir } from '@aztec/foundation/fs';
5
+ import { Fr } from '@aztec/foundation/curves/bn254';
6
6
  import { createLogger } from '@aztec/foundation/log';
7
- import { DatabaseVersionManager } from '@aztec/stdlib/database-version';
7
+ import { DatabaseVersionManager } from '@aztec/stdlib/database-version/manager';
8
8
  import { MerkleTreeId, NullifierLeaf, PublicDataTreeLeaf } from '@aztec/stdlib/trees';
9
- import { BlockHeader, PartialStateReference, StateReference } from '@aztec/stdlib/tx';
10
- import { WorldStateRevision } from '@aztec/stdlib/world-state';
9
+ import { BlockHeader, GlobalVariables, PartialStateReference, StateReference } from '@aztec/stdlib/tx';
10
+ import { EMPTY_GENESIS_DATA, WorldStateRevision } from '@aztec/stdlib/world-state';
11
11
  import { getTelemetryClient } from '@aztec/telemetry-client';
12
12
  import assert from 'assert/strict';
13
- import { mkdtemp, rm } from 'fs/promises';
13
+ import { mkdir, mkdtemp, rm } from 'fs/promises';
14
14
  import { tmpdir } from 'os';
15
15
  import { join } from 'path';
16
16
  import { WorldStateInstrumentation } from '../instrumentation/instrumentation.js';
17
+ import { IpcWorldState } from './ipc_world_state_instance.js';
17
18
  import { MerkleTreesFacade, MerkleTreesForkFacade, serializeLeaf } from './merkle_trees_facade.js';
18
- import { WorldStateMessageType, blockStateReference, sanitizeFullStatus, sanitizeSummary, treeStateReferenceToSnapshot } from './message.js';
19
- import { NativeWorldState } from './native_world_state_instance.js';
19
+ import { blockStateReference, sanitizeFullStatus, sanitizeSummary, treeStateReferenceToSnapshot } from './message.js';
20
20
  // The current version of the world state database schema
21
21
  // Increment this when making incompatible changes to the database schema
22
22
  export const WORLD_STATE_DB_VERSION = 2; // The initial version
23
23
  export const WORLD_STATE_DIR = 'world_state';
24
+ _computedKey = Symbol.asyncDispose;
24
25
  export class NativeWorldStateService {
25
26
  instance;
26
27
  worldStateInstrumentation;
27
28
  log;
29
+ genesis;
28
30
  cleanup;
31
+ recreateInstance;
29
32
  initialHeader;
30
33
  // This is read heavily and only changes when data is persisted, so we cache it
31
34
  cachedStatusSummary;
32
- constructor(instance, worldStateInstrumentation, log = createLogger('world-state:database'), cleanup = ()=>Promise.resolve()){
35
+ constructor(instance, worldStateInstrumentation, log, genesis = EMPTY_GENESIS_DATA, cleanup = ()=>Promise.resolve(), /** Factory to recreate a fresh IpcWorldState after clear(). */ recreateInstance){
33
36
  this.instance = instance;
34
37
  this.worldStateInstrumentation = worldStateInstrumentation;
35
38
  this.log = log;
39
+ this.genesis = genesis;
36
40
  this.cleanup = cleanup;
41
+ this.recreateInstance = recreateInstance;
37
42
  }
38
- static async new(rollupAddress, dataDir, wsTreeMapSizes, prefilledPublicData = [], instrumentation = new WorldStateInstrumentation(getTelemetryClient()), log = createLogger('world-state:database'), cleanup = ()=>Promise.resolve()) {
43
+ static async new(rollupAddress, dataDir, wsTreeMapSizes, genesis = EMPTY_GENESIS_DATA, instrumentation = new WorldStateInstrumentation(getTelemetryClient()), bindings, cleanup = ()=>Promise.resolve()) {
44
+ for (const [key, value] of Object.entries(wsTreeMapSizes)){
45
+ if (value <= 0) {
46
+ throw new Error(`Map size must be a positive number, got ${value} for ${key}`);
47
+ }
48
+ }
49
+ const log = createLogger('world-state:database', bindings);
39
50
  const worldStateDirectory = join(dataDir, WORLD_STATE_DIR);
40
- // Create a version manager to handle versioning
41
51
  const versionManager = new DatabaseVersionManager({
42
52
  schemaVersion: WORLD_STATE_DB_VERSION,
43
53
  rollupAddress,
44
54
  dataDirectory: worldStateDirectory,
45
- onOpen: (dir)=>{
46
- return Promise.resolve(new NativeWorldState(dir, wsTreeMapSizes, prefilledPublicData, instrumentation));
47
- }
55
+ onOpen: (dir)=>IpcWorldState.spawn(dir, wsTreeMapSizes, genesis, instrumentation, bindings)
48
56
  });
49
57
  const [instance] = await versionManager.open();
50
- const worldState = new this(instance, instrumentation, log, cleanup);
58
+ const recreateInstance = async ()=>{
59
+ await rm(worldStateDirectory, {
60
+ recursive: true,
61
+ force: true,
62
+ maxRetries: 3
63
+ });
64
+ await mkdir(worldStateDirectory, {
65
+ recursive: true
66
+ });
67
+ return IpcWorldState.spawn(worldStateDirectory, wsTreeMapSizes, genesis, instrumentation, bindings);
68
+ };
69
+ const worldState = new this(instance, instrumentation, log, genesis, cleanup, recreateInstance);
51
70
  try {
52
71
  await worldState.init();
53
72
  } catch (e) {
@@ -56,10 +75,14 @@ export class NativeWorldStateService {
56
75
  }
57
76
  return worldState;
58
77
  }
59
- static async tmp(rollupAddress = EthAddress.ZERO, cleanupTmpDir = true, prefilledPublicData = [], instrumentation = new WorldStateInstrumentation(getTelemetryClient())) {
60
- const log = createLogger('world-state:database');
78
+ static async tmp(cleanupTmpDir = true, genesis = EMPTY_GENESIS_DATA, instrumentation = new WorldStateInstrumentation(getTelemetryClient()), bindings) {
79
+ const log = createLogger('world-state:database', bindings);
61
80
  const dataDir = await mkdtemp(join(tmpdir(), 'aztec-world-state-'));
62
- const dbMapSizeKb = 10 * 1024 * 1024;
81
+ // Temporary (test/dev) world states are small and short-lived. Keep the LMDB
82
+ // map sizes in the MB range: with the IPC backend each tmp() spawns a separate
83
+ // aztec-wsdb that maps these per tree, and oversized maps add real cold-start
84
+ // I/O under parallel CI load. 256 MB/tree is ample for tests.
85
+ const dbMapSizeKb = 256 * 1024;
63
86
  const worldStateTreeMapSizes = {
64
87
  archiveTreeMapSizeKb: dbMapSizeKb,
65
88
  nullifierTreeMapSizeKb: dbMapSizeKb,
@@ -68,7 +91,7 @@ export class NativeWorldStateService {
68
91
  publicDataTreeMapSizeKb: dbMapSizeKb
69
92
  };
70
93
  log.debug(`Created temporary world state database at: ${dataDir} with tree map size: ${dbMapSizeKb}`);
71
- // pass a cleanup callback because process.on('beforeExit', cleanup) does not work under Jest
94
+ const instance = await IpcWorldState.spawn(dataDir, worldStateTreeMapSizes, genesis, instrumentation, bindings);
72
95
  const cleanup = async ()=>{
73
96
  if (cleanupTmpDir) {
74
97
  await rm(dataDir, {
@@ -81,7 +104,35 @@ export class NativeWorldStateService {
81
104
  log.debug(`Leaving temporary world state database: ${dataDir}`);
82
105
  }
83
106
  };
84
- return this.new(rollupAddress, dataDir, worldStateTreeMapSizes, prefilledPublicData, instrumentation, log, cleanup);
107
+ const recreateInstance = async ()=>{
108
+ await rm(dataDir, {
109
+ recursive: true,
110
+ force: true,
111
+ maxRetries: 3
112
+ });
113
+ await mkdir(dataDir, {
114
+ recursive: true
115
+ });
116
+ return IpcWorldState.spawn(dataDir, worldStateTreeMapSizes, genesis, instrumentation, bindings);
117
+ };
118
+ const worldState = new this(instance, instrumentation, log, genesis, cleanup, recreateInstance);
119
+ try {
120
+ await worldState.init();
121
+ } catch (e) {
122
+ log.error(`Error initializing tmp world state: ${e}`);
123
+ throw e;
124
+ }
125
+ return worldState;
126
+ }
127
+ static ephemeral(genesis = EMPTY_GENESIS_DATA, instrumentation = new WorldStateInstrumentation(getTelemetryClient()), bindings) {
128
+ return this.tmp(/*cleanupTmpDir=*/ true, genesis, instrumentation, bindings);
129
+ }
130
+ static async fromIpc(wsdbBackend, instrumentation = new WorldStateInstrumentation(getTelemetryClient()), bindings, genesis = EMPTY_GENESIS_DATA, cleanup = ()=>Promise.resolve(), recreateInstance) {
131
+ const log = createLogger('world-state:database', bindings);
132
+ const instance = new IpcWorldState(wsdbBackend, instrumentation, bindings);
133
+ const worldState = new this(instance, instrumentation, log, genesis, cleanup, recreateInstance);
134
+ await worldState.init();
135
+ return worldState;
85
136
  }
86
137
  async init() {
87
138
  const status = await this.getStatusSummary();
@@ -104,10 +155,21 @@ export class NativeWorldStateService {
104
155
  assert.strictEqual(initialHeaderIndex, 0n, 'Invalid initial archive state');
105
156
  }
106
157
  async clear() {
158
+ if (!this.recreateInstance) {
159
+ throw new Error('clear() is not available for externally-managed IPC backends');
160
+ }
161
+ this.log.warn('Clearing world state: shutting down WSDB, deleting data, and recreating');
107
162
  await this.instance.close();
108
163
  this.cachedStatusSummary = undefined;
109
- await tryRmDir(this.instance.getDataDir(), this.log);
110
- this.instance = this.instance.clone();
164
+ this.instance = await this.recreateInstance();
165
+ await this.init();
166
+ this.log.info('World state cleared and reinitialized from genesis');
167
+ }
168
+ /** Returns the IPC path of the underlying IPC backend, if available. */ getIpcPath() {
169
+ if (this.instance instanceof IpcWorldState) {
170
+ return this.instance.getIpcPath();
171
+ }
172
+ throw new Error('getIpcPath() is only available with IPC world state');
111
173
  }
112
174
  getCommitted() {
113
175
  return new MerkleTreesFacade(this.instance, this.initialHeader, WorldStateRevision.empty());
@@ -115,23 +177,25 @@ export class NativeWorldStateService {
115
177
  getSnapshot(blockNumber) {
116
178
  return new MerkleTreesFacade(this.instance, this.initialHeader, new WorldStateRevision(/*forkId=*/ 0, /* blockNumber=*/ blockNumber, /* includeUncommitted=*/ false));
117
179
  }
118
- async fork(blockNumber) {
119
- const resp = await this.instance.call(WorldStateMessageType.CREATE_FORK, {
180
+ async fork(blockNumber, opts = {}) {
181
+ const forkId = await this.instance.createFork({
120
182
  latest: blockNumber === undefined,
121
- blockNumber: blockNumber ?? 0,
122
- canonical: true
183
+ blockNumber: blockNumber ?? BlockNumber.ZERO
123
184
  });
124
- return new MerkleTreesForkFacade(this.instance, this.initialHeader, new WorldStateRevision(/*forkId=*/ resp.forkId, /* blockNumber=*/ 0, /* includeUncommitted=*/ true));
185
+ return new MerkleTreesForkFacade(this.instance, this.initialHeader, new WorldStateRevision(/*forkId=*/ forkId, /* blockNumber=*/ WorldStateRevision.LATEST, /* includeUncommitted=*/ true), opts);
125
186
  }
126
187
  getInitialHeader() {
127
188
  return this.initialHeader;
128
189
  }
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));
190
+ async handleL2BlockAndMessages(l2Block, l1ToL2Messages) {
191
+ const isFirstBlock = l2Block.indexWithinCheckpoint === 0;
192
+ if (!isFirstBlock && l1ToL2Messages.length > 0) {
193
+ throw new Error(`L1 to L2 messages must be empty for non-first blocks, but got ${l1ToL2Messages.length} messages for block ${l2Block.number}.`);
194
+ }
195
+ // We have to pad the given l1 to l2 messages, and the note hashes and nullifiers within tx effects, because that's
196
+ // how the trees are built by circuits.
134
197
  const paddedL1ToL2Messages = isFirstBlock ? padArrayEnd(l1ToL2Messages, Fr.ZERO, NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP) : [];
198
+ const paddedNoteHashes = l2Block.body.txEffects.flatMap((txEffect)=>padArrayEnd(txEffect.noteHashes, Fr.ZERO, MAX_NOTE_HASHES_PER_TX));
135
199
  const paddedNullifiers = l2Block.body.txEffects.flatMap((txEffect)=>padArrayEnd(txEffect.nullifiers, Fr.ZERO, MAX_NULLIFIERS_PER_TX)).map((nullifier)=>new NullifierLeaf(nullifier));
136
200
  const publicDataWrites = l2Block.body.txEffects.flatMap((txEffect)=>{
137
201
  return txEffect.publicDataWrites.map((write)=>{
@@ -142,29 +206,39 @@ export class NativeWorldStateService {
142
206
  });
143
207
  });
144
208
  try {
145
- return await this.instance.call(WorldStateMessageType.SYNC_BLOCK, {
209
+ const status = await this.instance.syncBlock({
146
210
  blockNumber: l2Block.number,
147
- blockHeaderHash: await l2Block.getBlockHeader().hash(),
211
+ blockHeaderHash: (await l2Block.hash()).toBuffer(),
148
212
  paddedL1ToL2Messages: paddedL1ToL2Messages.map(serializeLeaf),
149
213
  paddedNoteHashes: paddedNoteHashes.map(serializeLeaf),
150
214
  paddedNullifiers: paddedNullifiers.map(serializeLeaf),
151
215
  publicDataWrites: publicDataWrites.map(serializeLeaf),
152
- blockStateRef: blockStateReference(l2Block.header.state),
153
- canonical: true
154
- }, this.sanitizeAndCacheSummaryFromFull.bind(this), this.deleteCachedSummary.bind(this));
216
+ blockStateRef: blockStateReference(l2Block.header.state)
217
+ });
218
+ return this.sanitizeAndCacheSummaryFromFull(status);
155
219
  } catch (err) {
220
+ this.deleteCachedSummary();
156
221
  this.worldStateInstrumentation.incCriticalErrors('synch_pending_block');
157
222
  throw err;
158
223
  }
159
224
  }
160
225
  async close() {
161
- await this.instance.close();
162
- await this.cleanup();
226
+ try {
227
+ await this.instance.close();
228
+ } finally{
229
+ await this.cleanup();
230
+ }
231
+ }
232
+ async [_computedKey]() {
233
+ await this.close();
163
234
  }
164
235
  async buildInitialHeader() {
165
236
  const state = await this.getInitialStateReference();
166
237
  return BlockHeader.empty({
167
- state
238
+ state,
239
+ globalVariables: GlobalVariables.empty({
240
+ timestamp: this.genesis.genesisTimestamp
241
+ })
168
242
  });
169
243
  }
170
244
  sanitizeAndCacheSummaryFromFull(response) {
@@ -181,7 +255,7 @@ export class NativeWorldStateService {
181
255
  };
182
256
  return sanitized;
183
257
  }
184
- deleteCachedSummary(_) {
258
+ deleteCachedSummary() {
185
259
  this.cachedStatusSummary = undefined;
186
260
  }
187
261
  /**
@@ -190,11 +264,9 @@ export class NativeWorldStateService {
190
264
  * @returns The new WorldStateStatus
191
265
  */ async setFinalized(toBlockNumber) {
192
266
  try {
193
- await this.instance.call(WorldStateMessageType.FINALIZE_BLOCKS, {
194
- toBlockNumber,
195
- canonical: true
196
- }, this.sanitizeAndCacheSummary.bind(this), this.deleteCachedSummary.bind(this));
267
+ this.sanitizeAndCacheSummary(await this.instance.finalizeBlocks(toBlockNumber));
197
268
  } catch (err) {
269
+ this.deleteCachedSummary();
198
270
  this.worldStateInstrumentation.incCriticalErrors('finalize_block');
199
271
  throw err;
200
272
  }
@@ -206,11 +278,9 @@ export class NativeWorldStateService {
206
278
  * @returns The new WorldStateStatus
207
279
  */ async removeHistoricalBlocks(toBlockNumber) {
208
280
  try {
209
- return await this.instance.call(WorldStateMessageType.REMOVE_HISTORICAL_BLOCKS, {
210
- toBlockNumber,
211
- canonical: true
212
- }, this.sanitizeAndCacheSummaryFromFull.bind(this), this.deleteCachedSummary.bind(this));
281
+ return this.sanitizeAndCacheSummaryFromFull(await this.instance.removeHistoricalBlocks(toBlockNumber));
213
282
  } catch (err) {
283
+ this.deleteCachedSummary();
214
284
  this.worldStateInstrumentation.incCriticalErrors('prune_historical_block');
215
285
  throw err;
216
286
  }
@@ -221,11 +291,9 @@ export class NativeWorldStateService {
221
291
  * @returns The new WorldStateStatus
222
292
  */ async unwindBlocks(toBlockNumber) {
223
293
  try {
224
- return await this.instance.call(WorldStateMessageType.UNWIND_BLOCKS, {
225
- toBlockNumber,
226
- canonical: true
227
- }, this.sanitizeAndCacheSummaryFromFull.bind(this), this.deleteCachedSummary.bind(this));
294
+ return this.sanitizeAndCacheSummaryFromFull(await this.instance.unwindBlocks(toBlockNumber));
228
295
  } catch (err) {
296
+ this.deleteCachedSummary();
229
297
  this.worldStateInstrumentation.incCriticalErrors('prune_pending_block');
230
298
  throw err;
231
299
  }
@@ -236,25 +304,17 @@ export class NativeWorldStateService {
236
304
  ...this.cachedStatusSummary
237
305
  };
238
306
  }
239
- return await this.instance.call(WorldStateMessageType.GET_STATUS, {
240
- canonical: true
241
- }, this.sanitizeAndCacheSummary.bind(this));
307
+ return this.sanitizeAndCacheSummary(await this.instance.getStatus());
242
308
  }
243
309
  updateLeaf(_treeId, _leaf, _index) {
244
310
  return Promise.reject(new Error('Method not implemented'));
245
311
  }
246
312
  async getInitialStateReference() {
247
- const resp = await this.instance.call(WorldStateMessageType.GET_INITIAL_STATE_REFERENCE, {
248
- canonical: true
249
- });
250
- return new StateReference(treeStateReferenceToSnapshot(resp.state[MerkleTreeId.L1_TO_L2_MESSAGE_TREE]), new PartialStateReference(treeStateReferenceToSnapshot(resp.state[MerkleTreeId.NOTE_HASH_TREE]), treeStateReferenceToSnapshot(resp.state[MerkleTreeId.NULLIFIER_TREE]), treeStateReferenceToSnapshot(resp.state[MerkleTreeId.PUBLIC_DATA_TREE])));
313
+ const state = await this.instance.getInitialStateReference();
314
+ return new StateReference(treeStateReferenceToSnapshot(state[MerkleTreeId.L1_TO_L2_MESSAGE_TREE]), new PartialStateReference(treeStateReferenceToSnapshot(state[MerkleTreeId.NOTE_HASH_TREE]), treeStateReferenceToSnapshot(state[MerkleTreeId.NULLIFIER_TREE]), treeStateReferenceToSnapshot(state[MerkleTreeId.PUBLIC_DATA_TREE])));
251
315
  }
252
316
  async backupTo(dstPath, compact = true) {
253
- await this.instance.call(WorldStateMessageType.COPY_STORES, {
254
- dstPath,
255
- compact,
256
- canonical: true
257
- });
317
+ await this.instance.copyStores(dstPath, compact);
258
318
  return fromEntries(NATIVE_WORLD_STATE_DBS.map(([name, dir])=>[
259
319
  name,
260
320
  join(dstPath, dir, 'data.mdb')
@@ -1,40 +1,66 @@
1
- import { type Logger } from '@aztec/foundation/log';
2
- import type { PublicDataTreeLeaf } from '@aztec/stdlib/trees';
3
- import type { WorldStateInstrumentation } from '../instrumentation/instrumentation.js';
4
- import type { WorldStateTreeMapSizes } from '../synchronizer/factory.js';
5
- import { WorldStateMessageType, type WorldStateRequest, type WorldStateRequestCategories, type WorldStateResponse } from './message.js';
6
- export interface NativeWorldStateInstance {
7
- call<T extends WorldStateMessageType>(messageType: T, body: WorldStateRequest[T] & WorldStateRequestCategories): Promise<WorldStateResponse[T]>;
8
- }
1
+ import type { BlockNumber } from '@aztec/foundation/branded-types';
2
+ import type { Fr } from '@aztec/foundation/curves/bn254';
3
+ import type { IndexedTreeId, TreeInfo } from '@aztec/stdlib/interfaces/server';
4
+ import type { MerkleTreeId } from '@aztec/stdlib/trees';
5
+ import type { WorldStateRevision } from '@aztec/stdlib/world-state';
6
+ import type { BlockStateReference, SerializedBatchInsertionResult, SerializedIndexedLeaf, SerializedLeafValue, SerializedSequentialInsertionResult, SerializedSiblingPathAndIndex, TreeStateReference, WorldStateStatusFull, WorldStateStatusSummary } from './message.js';
9
7
  /**
10
- * Strongly-typed interface to access the WorldState class in the native world_state_napi module.
8
+ * Backend-agnostic handle to a running aztec-wsdb world state, accessed by the TS layer.
9
+ *
10
+ * The legacy in-process NAPI implementation has been removed; the C++ AVM (NAPI) now connects to
11
+ * the same aztec-wsdb process using the IPC path returned by {@link getIpcPath}.
11
12
  */
12
- export declare class NativeWorldState implements NativeWorldStateInstance {
13
- private readonly dataDir;
14
- private readonly wsTreeMapSizes;
15
- private readonly prefilledPublicData;
16
- private readonly instrumentation;
17
- private readonly log;
18
- private open;
19
- private queues;
20
- private instance;
21
- /** Creates a new native WorldState instance */
22
- constructor(dataDir: string, wsTreeMapSizes: WorldStateTreeMapSizes, prefilledPublicData: PublicDataTreeLeaf[] | undefined, instrumentation: WorldStateInstrumentation, log?: Logger);
23
- getDataDir(): string;
24
- clone(): NativeWorldState;
13
+ export interface NativeWorldStateInstance {
14
+ getTreeInfo(treeId: MerkleTreeId, revision: WorldStateRevision): Promise<TreeInfo>;
15
+ getStateReference(revision: WorldStateRevision): Promise<Record<number, TreeStateReference>>;
16
+ getInitialStateReference(): Promise<Record<number, TreeStateReference>>;
17
+ getLeafValue(treeId: MerkleTreeId, revision: WorldStateRevision, leafIndex: bigint): Promise<SerializedLeafValue | undefined>;
18
+ getLeafPreimage(treeId: IndexedTreeId, revision: WorldStateRevision, leafIndex: bigint): Promise<SerializedIndexedLeaf | undefined>;
19
+ getSiblingPath(treeId: MerkleTreeId, revision: WorldStateRevision, leafIndex: bigint): Promise<Buffer[]>;
20
+ getBlockNumbersForLeafIndices(treeId: MerkleTreeId, revision: WorldStateRevision, leafIndices: bigint[]): Promise<(bigint | undefined)[]>;
21
+ findLeafIndices(treeId: MerkleTreeId, revision: WorldStateRevision, leaves: SerializedLeafValue[], startIndex: bigint): Promise<(bigint | undefined)[]>;
22
+ findLowLeaf(treeId: IndexedTreeId, revision: WorldStateRevision, key: Fr): Promise<{
23
+ index: bigint;
24
+ alreadyPresent: boolean;
25
+ }>;
26
+ findSiblingPaths(treeId: MerkleTreeId, revision: WorldStateRevision, leaves: SerializedLeafValue[]): Promise<(SerializedSiblingPathAndIndex | undefined)[]>;
27
+ updateArchive(forkId: number, blockStateRef: BlockStateReference, blockHeaderHash: Buffer): Promise<void>;
28
+ appendLeaves(treeId: MerkleTreeId, forkId: number, leaves: SerializedLeafValue[]): Promise<void>;
29
+ batchInsert(treeId: IndexedTreeId, forkId: number, leaves: SerializedLeafValue[], subtreeDepth: number): Promise<SerializedBatchInsertionResult>;
30
+ sequentialInsert(treeId: IndexedTreeId, forkId: number, leaves: SerializedLeafValue[]): Promise<SerializedSequentialInsertionResult>;
31
+ syncBlock(input: {
32
+ blockNumber: BlockNumber;
33
+ blockStateRef: BlockStateReference;
34
+ blockHeaderHash: Buffer;
35
+ paddedNoteHashes: readonly SerializedLeafValue[];
36
+ paddedL1ToL2Messages: readonly SerializedLeafValue[];
37
+ paddedNullifiers: readonly SerializedLeafValue[];
38
+ publicDataWrites: readonly SerializedLeafValue[];
39
+ }): Promise<WorldStateStatusFull>;
40
+ createFork(input: {
41
+ latest: boolean;
42
+ blockNumber: BlockNumber;
43
+ }): Promise<number>;
44
+ deleteFork(forkId: number): Promise<void>;
45
+ finalizeBlocks(toBlockNumber: BlockNumber): Promise<WorldStateStatusSummary>;
46
+ unwindBlocks(toBlockNumber: BlockNumber): Promise<WorldStateStatusFull>;
47
+ removeHistoricalBlocks(toBlockNumber: BlockNumber): Promise<WorldStateStatusFull>;
48
+ getStatus(): Promise<WorldStateStatusSummary>;
49
+ createCheckpoint(forkId: number): Promise<number>;
50
+ commitCheckpoint(forkId: number): Promise<void>;
51
+ revertCheckpoint(forkId: number): Promise<void>;
52
+ commitAllCheckpoints(forkId: number, depth: number): Promise<void>;
53
+ revertAllCheckpoints(forkId: number, depth: number): Promise<void>;
54
+ copyStores(dstPath: string, compact: boolean): Promise<void>;
25
55
  /**
26
- * Sends a message to the native instance and returns the response.
27
- * @param messageType - The type of message to send
28
- * @param body - The message body
29
- * @param responseHandler - A callback accepting the response, executed on the job queue
30
- * @param errorHandler - A callback called on request error, executed on the job queue
31
- * @returns The response to the message
56
+ * IPC path the underlying aztec-wsdb process listens on. The C++ AVM uses this to attach to the
57
+ * same world state instance the TS layer is using.
32
58
  */
33
- call<T extends WorldStateMessageType>(messageType: T, body: WorldStateRequest[T] & WorldStateRequestCategories, responseHandler?: (response: WorldStateResponse[T]) => WorldStateResponse[T], errorHandler?: (_: string) => void): Promise<WorldStateResponse[T]>;
59
+ getIpcPath(): string;
34
60
  /**
35
- * Stops the native instance.
61
+ * Shut down the world state instance. Cancels any in-flight queues, closes the IPC channel, and
62
+ * terminates the underlying aztec-wsdb process. Idempotent.
36
63
  */
37
64
  close(): Promise<void>;
38
- private _sendMessage;
39
65
  }
40
- //# sourceMappingURL=native_world_state_instance.d.ts.map
66
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF0aXZlX3dvcmxkX3N0YXRlX2luc3RhbmNlLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbmF0aXZlL25hdGl2ZV93b3JsZF9zdGF0ZV9pbnN0YW5jZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxXQUFXLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNuRSxPQUFPLEtBQUssRUFBRSxFQUFFLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN6RCxPQUFPLEtBQUssRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDL0UsT0FBTyxLQUFLLEVBQUUsWUFBWSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDeEQsT0FBTyxLQUFLLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUVwRSxPQUFPLEtBQUssRUFDVixtQkFBbUIsRUFDbkIsOEJBQThCLEVBQzlCLHFCQUFxQixFQUNyQixtQkFBbUIsRUFDbkIsbUNBQW1DLEVBQ25DLDZCQUE2QixFQUM3QixrQkFBa0IsRUFDbEIsb0JBQW9CLEVBQ3BCLHVCQUF1QixFQUN4QixNQUFNLGNBQWMsQ0FBQztBQUV0Qjs7Ozs7R0FLRztBQUNILE1BQU0sV0FBVyx3QkFBd0I7SUFDdkMsV0FBVyxDQUFDLE1BQU0sRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLGtCQUFrQixHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNuRixpQkFBaUIsQ0FBQyxRQUFRLEVBQUUsa0JBQWtCLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsa0JBQWtCLENBQUMsQ0FBQyxDQUFDO0lBQzdGLHdCQUF3QixJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLGtCQUFrQixDQUFDLENBQUMsQ0FBQztJQUN4RSxZQUFZLENBQ1YsTUFBTSxFQUFFLFlBQVksRUFDcEIsUUFBUSxFQUFFLGtCQUFrQixFQUM1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
@@ -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":"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"}