@aztec/world-state 0.0.1-commit.c31f2472 → 0.0.1-commit.c52d6e7
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.
- package/dest/index.d.ts +2 -1
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +1 -0
- package/dest/instrumentation/instrumentation.d.ts +4 -3
- package/dest/instrumentation/instrumentation.d.ts.map +1 -1
- package/dest/instrumentation/instrumentation.js +4 -9
- package/dest/native/fork_checkpoint.d.ts +7 -1
- package/dest/native/fork_checkpoint.d.ts.map +1 -1
- package/dest/native/fork_checkpoint.js +15 -3
- package/dest/native/index.d.ts +2 -1
- package/dest/native/index.d.ts.map +1 -1
- package/dest/native/index.js +1 -0
- package/dest/native/ipc_world_state_instance.d.ts +89 -0
- package/dest/native/ipc_world_state_instance.d.ts.map +1 -0
- package/dest/native/ipc_world_state_instance.js +670 -0
- package/dest/native/merkle_trees_facade.d.ts +12 -8
- package/dest/native/merkle_trees_facade.d.ts.map +1 -1
- package/dest/native/merkle_trees_facade.js +63 -115
- package/dest/native/message.d.ts +14 -221
- package/dest/native/message.d.ts.map +1 -1
- package/dest/native/message.js +0 -42
- package/dest/native/native_world_state.d.ts +19 -7
- package/dest/native/native_world_state.d.ts.map +1 -1
- package/dest/native/native_world_state.js +121 -59
- package/dest/native/native_world_state_instance.d.ts +56 -42
- package/dest/native/native_world_state_instance.d.ts.map +1 -1
- package/dest/native/native_world_state_instance.js +1 -203
- package/dest/native/world_state_operation.d.ts +7 -0
- package/dest/native/world_state_operation.d.ts.map +1 -0
- package/dest/native/world_state_operation.js +5 -0
- package/dest/synchronizer/config.d.ts +3 -3
- package/dest/synchronizer/config.d.ts.map +1 -1
- package/dest/synchronizer/config.js +15 -13
- package/dest/synchronizer/errors.d.ts +8 -1
- package/dest/synchronizer/errors.d.ts.map +1 -1
- package/dest/synchronizer/errors.js +8 -1
- package/dest/synchronizer/factory.d.ts +5 -5
- package/dest/synchronizer/factory.d.ts.map +1 -1
- package/dest/synchronizer/factory.js +7 -6
- package/dest/synchronizer/index.d.ts +2 -1
- package/dest/synchronizer/index.d.ts.map +1 -1
- package/dest/synchronizer/index.js +1 -0
- package/dest/synchronizer/server_world_state_synchronizer.d.ts +13 -8
- package/dest/synchronizer/server_world_state_synchronizer.d.ts.map +1 -1
- package/dest/synchronizer/server_world_state_synchronizer.js +133 -47
- package/dest/test/utils.d.ts +1 -1
- package/dest/test/utils.d.ts.map +1 -1
- package/dest/test/utils.js +6 -1
- package/dest/testing.d.ts +4 -3
- package/dest/testing.d.ts.map +1 -1
- package/dest/testing.js +22 -7
- package/dest/world-state-db/merkle_tree_db.d.ts +1 -10
- package/dest/world-state-db/merkle_tree_db.d.ts.map +1 -1
- package/package.json +13 -11
- package/src/index.ts +1 -0
- package/src/instrumentation/instrumentation.ts +6 -18
- package/src/native/fork_checkpoint.ts +19 -3
- package/src/native/index.ts +1 -0
- package/src/native/ipc_world_state_instance.ts +847 -0
- package/src/native/merkle_trees_facade.ts +89 -109
- package/src/native/message.ts +13 -286
- package/src/native/native_world_state.ts +145 -100
- package/src/native/native_world_state_instance.ts +94 -281
- package/src/native/world_state_operation.ts +33 -0
- package/src/synchronizer/config.ts +21 -15
- package/src/synchronizer/errors.ts +8 -0
- package/src/synchronizer/factory.ts +12 -11
- package/src/synchronizer/index.ts +1 -0
- package/src/synchronizer/server_world_state_synchronizer.ts +152 -42
- package/src/test/utils.ts +10 -1
- package/src/testing.ts +19 -10
- package/src/world-state-db/merkle_tree_db.ts +0 -10
- package/dest/native/world_state_ops_queue.d.ts +0 -19
- package/dest/native/world_state_ops_queue.d.ts.map +0 -1
- package/dest/native/world_state_ops_queue.js +0 -146
- 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
6
|
import { type Logger, type LoggerBindings, createLogger } from '@aztec/foundation/log';
|
|
8
7
|
import type { L2Block } from '@aztec/stdlib/block';
|
|
9
|
-
import { DatabaseVersionManager } from '@aztec/stdlib/database-version';
|
|
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 {
|
|
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,37 +49,49 @@ export class NativeWorldStateService implements MerkleTreeDatabase {
|
|
|
50
49
|
private cachedStatusSummary: WorldStateStatusSummary | undefined;
|
|
51
50
|
|
|
52
51
|
protected constructor(
|
|
53
|
-
protected instance:
|
|
52
|
+
protected instance: NativeWorldStateInstance,
|
|
54
53
|
protected readonly worldStateInstrumentation: WorldStateInstrumentation,
|
|
55
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
|
-
|
|
65
|
+
genesis: GenesisData = EMPTY_GENESIS_DATA,
|
|
64
66
|
instrumentation = new WorldStateInstrumentation(getTelemetryClient()),
|
|
65
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
|
+
|
|
68
76
|
const log = createLogger('world-state:database', bindings);
|
|
69
77
|
const worldStateDirectory = join(dataDir, WORLD_STATE_DIR);
|
|
70
|
-
|
|
78
|
+
|
|
71
79
|
const versionManager = new DatabaseVersionManager({
|
|
72
80
|
schemaVersion: WORLD_STATE_DB_VERSION,
|
|
73
81
|
rollupAddress,
|
|
74
82
|
dataDirectory: worldStateDirectory,
|
|
75
|
-
onOpen: (dir
|
|
76
|
-
return Promise.resolve(
|
|
77
|
-
new NativeWorldState(dir, wsTreeMapSizes, prefilledPublicData, instrumentation, bindings),
|
|
78
|
-
);
|
|
79
|
-
},
|
|
83
|
+
onOpen: dir => IpcWorldState.spawn(dir, wsTreeMapSizes, genesis, instrumentation, bindings),
|
|
80
84
|
});
|
|
81
85
|
|
|
82
86
|
const [instance] = await versionManager.open();
|
|
83
|
-
|
|
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);
|
|
84
95
|
try {
|
|
85
96
|
await worldState.init();
|
|
86
97
|
} catch (e) {
|
|
@@ -92,15 +103,19 @@ export class NativeWorldStateService implements MerkleTreeDatabase {
|
|
|
92
103
|
}
|
|
93
104
|
|
|
94
105
|
static async tmp(
|
|
95
|
-
rollupAddress = EthAddress.ZERO,
|
|
96
106
|
cleanupTmpDir = true,
|
|
97
|
-
|
|
107
|
+
genesis: GenesisData = EMPTY_GENESIS_DATA,
|
|
98
108
|
instrumentation = new WorldStateInstrumentation(getTelemetryClient()),
|
|
99
109
|
bindings?: LoggerBindings,
|
|
110
|
+
threads?: number,
|
|
100
111
|
): Promise<NativeWorldStateService> {
|
|
101
112
|
const log = createLogger('world-state:database', bindings);
|
|
102
113
|
const dataDir = await mkdtemp(join(tmpdir(), 'aztec-world-state-'));
|
|
103
|
-
|
|
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;
|
|
104
119
|
const worldStateTreeMapSizes: WorldStateTreeMapSizes = {
|
|
105
120
|
archiveTreeMapSizeKb: dbMapSizeKb,
|
|
106
121
|
nullifierTreeMapSizeKb: dbMapSizeKb,
|
|
@@ -110,7 +125,15 @@ export class NativeWorldStateService implements MerkleTreeDatabase {
|
|
|
110
125
|
};
|
|
111
126
|
log.debug(`Created temporary world state database at: ${dataDir} with tree map size: ${dbMapSizeKb}`);
|
|
112
127
|
|
|
113
|
-
|
|
128
|
+
const instance = await IpcWorldState.spawn(
|
|
129
|
+
dataDir,
|
|
130
|
+
worldStateTreeMapSizes,
|
|
131
|
+
genesis,
|
|
132
|
+
instrumentation,
|
|
133
|
+
bindings,
|
|
134
|
+
threads,
|
|
135
|
+
);
|
|
136
|
+
|
|
114
137
|
const cleanup = async () => {
|
|
115
138
|
if (cleanupTmpDir) {
|
|
116
139
|
await rm(dataDir, { recursive: true, force: true, maxRetries: 3 });
|
|
@@ -120,15 +143,47 @@ export class NativeWorldStateService implements MerkleTreeDatabase {
|
|
|
120
143
|
}
|
|
121
144
|
};
|
|
122
145
|
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
dataDir,
|
|
126
|
-
worldStateTreeMapSizes,
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
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;
|
|
132
187
|
}
|
|
133
188
|
|
|
134
189
|
protected async init() {
|
|
@@ -147,18 +202,29 @@ export class NativeWorldStateService implements MerkleTreeDatabase {
|
|
|
147
202
|
|
|
148
203
|
// the initial header _must_ be the first element in the archive tree
|
|
149
204
|
// if this assertion fails, check that the hashing done in Header in yarn-project matches the initial header hash done in world_state.cpp
|
|
150
|
-
const indices = await committed.findLeafIndices(MerkleTreeId.ARCHIVE, [
|
|
151
|
-
(await this.initialHeader.hash()).toField(),
|
|
152
|
-
]);
|
|
205
|
+
const indices = await committed.findLeafIndices(MerkleTreeId.ARCHIVE, [await this.initialHeader.hash()]);
|
|
153
206
|
const initialHeaderIndex = indices[0];
|
|
154
207
|
assert.strictEqual(initialHeaderIndex, 0n, 'Invalid initial archive state');
|
|
155
208
|
}
|
|
156
209
|
|
|
157
|
-
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');
|
|
158
215
|
await this.instance.close();
|
|
159
216
|
this.cachedStatusSummary = undefined;
|
|
160
|
-
|
|
161
|
-
|
|
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');
|
|
162
228
|
}
|
|
163
229
|
|
|
164
230
|
public getCommitted(): MerkleTreeReadOperations {
|
|
@@ -177,17 +243,16 @@ export class NativeWorldStateService implements MerkleTreeDatabase {
|
|
|
177
243
|
blockNumber?: BlockNumber,
|
|
178
244
|
opts: { closeDelayMs?: number } = {},
|
|
179
245
|
): Promise<MerkleTreeWriteOperations> {
|
|
180
|
-
const
|
|
246
|
+
const forkId = await this.instance.createFork({
|
|
181
247
|
latest: blockNumber === undefined,
|
|
182
248
|
blockNumber: blockNumber ?? BlockNumber.ZERO,
|
|
183
|
-
canonical: true,
|
|
184
249
|
});
|
|
185
250
|
return new MerkleTreesForkFacade(
|
|
186
251
|
this.instance,
|
|
187
252
|
this.initialHeader!,
|
|
188
253
|
new WorldStateRevision(
|
|
189
|
-
/*forkId=*/
|
|
190
|
-
/* blockNumber=*/
|
|
254
|
+
/*forkId=*/ forkId,
|
|
255
|
+
/* blockNumber=*/ WorldStateRevision.LATEST,
|
|
191
256
|
/* includeUncommitted=*/ true,
|
|
192
257
|
),
|
|
193
258
|
opts,
|
|
@@ -230,35 +295,44 @@ export class NativeWorldStateService implements MerkleTreeDatabase {
|
|
|
230
295
|
});
|
|
231
296
|
|
|
232
297
|
try {
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
this.deleteCachedSummary.bind(this),
|
|
247
|
-
);
|
|
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);
|
|
248
311
|
} catch (err) {
|
|
312
|
+
this.deleteCachedSummary();
|
|
249
313
|
this.worldStateInstrumentation.incCriticalErrors('synch_pending_block');
|
|
250
314
|
throw err;
|
|
251
315
|
}
|
|
252
316
|
}
|
|
253
317
|
|
|
254
318
|
public async close(): Promise<void> {
|
|
255
|
-
|
|
256
|
-
|
|
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();
|
|
257
328
|
}
|
|
258
329
|
|
|
259
330
|
private async buildInitialHeader(): Promise<BlockHeader> {
|
|
260
331
|
const state = await this.getInitialStateReference();
|
|
261
|
-
return BlockHeader.empty({
|
|
332
|
+
return BlockHeader.empty({
|
|
333
|
+
state,
|
|
334
|
+
globalVariables: GlobalVariables.empty({ timestamp: this.genesis.genesisTimestamp }),
|
|
335
|
+
});
|
|
262
336
|
}
|
|
263
337
|
|
|
264
338
|
private sanitizeAndCacheSummaryFromFull(response: WorldStateStatusFull) {
|
|
@@ -273,7 +347,7 @@ export class NativeWorldStateService implements MerkleTreeDatabase {
|
|
|
273
347
|
return sanitized;
|
|
274
348
|
}
|
|
275
349
|
|
|
276
|
-
private deleteCachedSummary(
|
|
350
|
+
private deleteCachedSummary() {
|
|
277
351
|
this.cachedStatusSummary = undefined;
|
|
278
352
|
}
|
|
279
353
|
|
|
@@ -284,16 +358,9 @@ export class NativeWorldStateService implements MerkleTreeDatabase {
|
|
|
284
358
|
*/
|
|
285
359
|
public async setFinalized(toBlockNumber: BlockNumber) {
|
|
286
360
|
try {
|
|
287
|
-
await this.instance.
|
|
288
|
-
WorldStateMessageType.FINALIZE_BLOCKS,
|
|
289
|
-
{
|
|
290
|
-
toBlockNumber,
|
|
291
|
-
canonical: true,
|
|
292
|
-
},
|
|
293
|
-
this.sanitizeAndCacheSummary.bind(this),
|
|
294
|
-
this.deleteCachedSummary.bind(this),
|
|
295
|
-
);
|
|
361
|
+
this.sanitizeAndCacheSummary(await this.instance.finalizeBlocks(toBlockNumber));
|
|
296
362
|
} catch (err) {
|
|
363
|
+
this.deleteCachedSummary();
|
|
297
364
|
this.worldStateInstrumentation.incCriticalErrors('finalize_block');
|
|
298
365
|
throw err;
|
|
299
366
|
}
|
|
@@ -307,16 +374,9 @@ export class NativeWorldStateService implements MerkleTreeDatabase {
|
|
|
307
374
|
*/
|
|
308
375
|
public async removeHistoricalBlocks(toBlockNumber: BlockNumber) {
|
|
309
376
|
try {
|
|
310
|
-
return await this.instance.
|
|
311
|
-
WorldStateMessageType.REMOVE_HISTORICAL_BLOCKS,
|
|
312
|
-
{
|
|
313
|
-
toBlockNumber,
|
|
314
|
-
canonical: true,
|
|
315
|
-
},
|
|
316
|
-
this.sanitizeAndCacheSummaryFromFull.bind(this),
|
|
317
|
-
this.deleteCachedSummary.bind(this),
|
|
318
|
-
);
|
|
377
|
+
return this.sanitizeAndCacheSummaryFromFull(await this.instance.removeHistoricalBlocks(toBlockNumber));
|
|
319
378
|
} catch (err) {
|
|
379
|
+
this.deleteCachedSummary();
|
|
320
380
|
this.worldStateInstrumentation.incCriticalErrors('prune_historical_block');
|
|
321
381
|
throw err;
|
|
322
382
|
}
|
|
@@ -329,16 +389,9 @@ export class NativeWorldStateService implements MerkleTreeDatabase {
|
|
|
329
389
|
*/
|
|
330
390
|
public async unwindBlocks(toBlockNumber: BlockNumber) {
|
|
331
391
|
try {
|
|
332
|
-
return await this.instance.
|
|
333
|
-
WorldStateMessageType.UNWIND_BLOCKS,
|
|
334
|
-
{
|
|
335
|
-
toBlockNumber,
|
|
336
|
-
canonical: true,
|
|
337
|
-
},
|
|
338
|
-
this.sanitizeAndCacheSummaryFromFull.bind(this),
|
|
339
|
-
this.deleteCachedSummary.bind(this),
|
|
340
|
-
);
|
|
392
|
+
return this.sanitizeAndCacheSummaryFromFull(await this.instance.unwindBlocks(toBlockNumber));
|
|
341
393
|
} catch (err) {
|
|
394
|
+
this.deleteCachedSummary();
|
|
342
395
|
this.worldStateInstrumentation.incCriticalErrors('prune_pending_block');
|
|
343
396
|
throw err;
|
|
344
397
|
}
|
|
@@ -348,11 +401,7 @@ export class NativeWorldStateService implements MerkleTreeDatabase {
|
|
|
348
401
|
if (this.cachedStatusSummary !== undefined) {
|
|
349
402
|
return { ...this.cachedStatusSummary };
|
|
350
403
|
}
|
|
351
|
-
return await this.instance.
|
|
352
|
-
WorldStateMessageType.GET_STATUS,
|
|
353
|
-
{ canonical: true },
|
|
354
|
-
this.sanitizeAndCacheSummary.bind(this),
|
|
355
|
-
);
|
|
404
|
+
return this.sanitizeAndCacheSummary(await this.instance.getStatus());
|
|
356
405
|
}
|
|
357
406
|
|
|
358
407
|
updateLeaf<ID extends IndexedTreeId>(
|
|
@@ -364,14 +413,14 @@ export class NativeWorldStateService implements MerkleTreeDatabase {
|
|
|
364
413
|
}
|
|
365
414
|
|
|
366
415
|
private async getInitialStateReference(): Promise<StateReference> {
|
|
367
|
-
const
|
|
416
|
+
const state = await this.instance.getInitialStateReference();
|
|
368
417
|
|
|
369
418
|
return new StateReference(
|
|
370
|
-
treeStateReferenceToSnapshot(
|
|
419
|
+
treeStateReferenceToSnapshot(state[MerkleTreeId.L1_TO_L2_MESSAGE_TREE]),
|
|
371
420
|
new PartialStateReference(
|
|
372
|
-
treeStateReferenceToSnapshot(
|
|
373
|
-
treeStateReferenceToSnapshot(
|
|
374
|
-
treeStateReferenceToSnapshot(
|
|
421
|
+
treeStateReferenceToSnapshot(state[MerkleTreeId.NOTE_HASH_TREE]),
|
|
422
|
+
treeStateReferenceToSnapshot(state[MerkleTreeId.NULLIFIER_TREE]),
|
|
423
|
+
treeStateReferenceToSnapshot(state[MerkleTreeId.PUBLIC_DATA_TREE]),
|
|
375
424
|
),
|
|
376
425
|
);
|
|
377
426
|
}
|
|
@@ -380,11 +429,7 @@ export class NativeWorldStateService implements MerkleTreeDatabase {
|
|
|
380
429
|
dstPath: string,
|
|
381
430
|
compact: boolean = true,
|
|
382
431
|
): Promise<Record<Exclude<SnapshotDataKeys, 'archiver'>, string>> {
|
|
383
|
-
await this.instance.
|
|
384
|
-
dstPath,
|
|
385
|
-
compact,
|
|
386
|
-
canonical: true,
|
|
387
|
-
});
|
|
432
|
+
await this.instance.copyStores(dstPath, compact);
|
|
388
433
|
return fromEntries(NATIVE_WORLD_STATE_DBS.map(([name, dir]) => [name, join(dstPath, dir, 'data.mdb')] as const));
|
|
389
434
|
}
|
|
390
435
|
}
|