@aztec/world-state 0.0.1-commit.343b43af6 → 0.0.1-commit.350e0a4d
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/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/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 +662 -0
- package/dest/native/merkle_trees_facade.d.ts +11 -7
- package/dest/native/merkle_trees_facade.d.ts.map +1 -1
- package/dest/native/merkle_trees_facade.js +62 -114
- package/dest/native/message.d.ts +14 -222
- 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 +116 -58
- package/dest/native/native_world_state_instance.d.ts +60 -41
- package/dest/native/native_world_state_instance.d.ts.map +1 -1
- package/dest/native/native_world_state_instance.js +5 -202
- 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 +1 -1
- package/dest/synchronizer/config.d.ts.map +1 -1
- package/dest/synchronizer/config.js +9 -10
- 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 +4 -4
- 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 +108 -44
- 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 +14 -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 +14 -11
- package/src/instrumentation/instrumentation.ts +6 -18
- package/src/native/fork_checkpoint.ts +19 -3
- package/src/native/ipc_world_state_instance.ts +834 -0
- package/src/native/merkle_trees_facade.ts +88 -108
- package/src/native/message.ts +13 -287
- package/src/native/native_world_state.ts +132 -97
- package/src/native/native_world_state_instance.ts +98 -280
- package/src/native/world_state_operation.ts +33 -0
- package/src/synchronizer/config.ts +14 -10
- package/src/synchronizer/errors.ts +8 -0
- package/src/synchronizer/factory.ts +11 -10
- package/src/synchronizer/index.ts +1 -0
- package/src/synchronizer/server_world_state_synchronizer.ts +126 -43
- package/src/test/utils.ts +10 -1
- package/src/testing.ts +12 -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,7 +3,6 @@ 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
8
|
import { DatabaseVersionManager } from '@aztec/stdlib/database-version/manager';
|
|
@@ -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,18 @@ 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,
|
|
100
110
|
): Promise<NativeWorldStateService> {
|
|
101
111
|
const log = createLogger('world-state:database', bindings);
|
|
102
112
|
const dataDir = await mkdtemp(join(tmpdir(), 'aztec-world-state-'));
|
|
103
|
-
|
|
113
|
+
// Temporary (test/dev) world states are small and short-lived. Keep the LMDB
|
|
114
|
+
// map sizes in the MB range: with the IPC backend each tmp() spawns a separate
|
|
115
|
+
// aztec-wsdb that maps these per tree, and oversized maps add real cold-start
|
|
116
|
+
// I/O under parallel CI load. 256 MB/tree is ample for tests.
|
|
117
|
+
const dbMapSizeKb = 256 * 1024;
|
|
104
118
|
const worldStateTreeMapSizes: WorldStateTreeMapSizes = {
|
|
105
119
|
archiveTreeMapSizeKb: dbMapSizeKb,
|
|
106
120
|
nullifierTreeMapSizeKb: dbMapSizeKb,
|
|
@@ -110,7 +124,8 @@ export class NativeWorldStateService implements MerkleTreeDatabase {
|
|
|
110
124
|
};
|
|
111
125
|
log.debug(`Created temporary world state database at: ${dataDir} with tree map size: ${dbMapSizeKb}`);
|
|
112
126
|
|
|
113
|
-
|
|
127
|
+
const instance = await IpcWorldState.spawn(dataDir, worldStateTreeMapSizes, genesis, instrumentation, bindings);
|
|
128
|
+
|
|
114
129
|
const cleanup = async () => {
|
|
115
130
|
if (cleanupTmpDir) {
|
|
116
131
|
await rm(dataDir, { recursive: true, force: true, maxRetries: 3 });
|
|
@@ -120,15 +135,43 @@ export class NativeWorldStateService implements MerkleTreeDatabase {
|
|
|
120
135
|
}
|
|
121
136
|
};
|
|
122
137
|
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
dataDir,
|
|
126
|
-
worldStateTreeMapSizes,
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
138
|
+
const recreateInstance = async () => {
|
|
139
|
+
await rm(dataDir, { recursive: true, force: true, maxRetries: 3 });
|
|
140
|
+
await mkdir(dataDir, { recursive: true });
|
|
141
|
+
return IpcWorldState.spawn(dataDir, worldStateTreeMapSizes, genesis, instrumentation, bindings);
|
|
142
|
+
};
|
|
143
|
+
|
|
144
|
+
const worldState = new this(instance, instrumentation, log, genesis, cleanup, recreateInstance);
|
|
145
|
+
try {
|
|
146
|
+
await worldState.init();
|
|
147
|
+
} catch (e) {
|
|
148
|
+
log.error(`Error initializing tmp world state: ${e}`);
|
|
149
|
+
throw e;
|
|
150
|
+
}
|
|
151
|
+
return worldState;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
static ephemeral(
|
|
155
|
+
genesis: GenesisData = EMPTY_GENESIS_DATA,
|
|
156
|
+
instrumentation = new WorldStateInstrumentation(getTelemetryClient()),
|
|
157
|
+
bindings?: LoggerBindings,
|
|
158
|
+
): Promise<NativeWorldStateService> {
|
|
159
|
+
return this.tmp(/*cleanupTmpDir=*/ true, genesis, instrumentation, bindings);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
static async fromIpc(
|
|
163
|
+
wsdbBackend: ConstructorParameters<typeof IpcWorldState>[0],
|
|
164
|
+
instrumentation = new WorldStateInstrumentation(getTelemetryClient()),
|
|
165
|
+
bindings?: LoggerBindings,
|
|
166
|
+
genesis: GenesisData = EMPTY_GENESIS_DATA,
|
|
167
|
+
cleanup = () => Promise.resolve(),
|
|
168
|
+
recreateInstance?: () => Promise<NativeWorldStateInstance>,
|
|
169
|
+
): Promise<NativeWorldStateService> {
|
|
170
|
+
const log = createLogger('world-state:database', bindings);
|
|
171
|
+
const instance = new IpcWorldState(wsdbBackend, instrumentation, bindings);
|
|
172
|
+
const worldState = new this(instance, instrumentation, log, genesis, cleanup, recreateInstance);
|
|
173
|
+
await worldState.init();
|
|
174
|
+
return worldState;
|
|
132
175
|
}
|
|
133
176
|
|
|
134
177
|
protected async init() {
|
|
@@ -147,16 +190,29 @@ export class NativeWorldStateService implements MerkleTreeDatabase {
|
|
|
147
190
|
|
|
148
191
|
// the initial header _must_ be the first element in the archive tree
|
|
149
192
|
// 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, [
|
|
193
|
+
const indices = await committed.findLeafIndices(MerkleTreeId.ARCHIVE, [await this.initialHeader.hash()]);
|
|
151
194
|
const initialHeaderIndex = indices[0];
|
|
152
195
|
assert.strictEqual(initialHeaderIndex, 0n, 'Invalid initial archive state');
|
|
153
196
|
}
|
|
154
197
|
|
|
155
|
-
public async clear() {
|
|
198
|
+
public async clear(): Promise<void> {
|
|
199
|
+
if (!this.recreateInstance) {
|
|
200
|
+
throw new Error('clear() is not available for externally-managed IPC backends');
|
|
201
|
+
}
|
|
202
|
+
this.log.warn('Clearing world state: shutting down WSDB, deleting data, and recreating');
|
|
156
203
|
await this.instance.close();
|
|
157
204
|
this.cachedStatusSummary = undefined;
|
|
158
|
-
|
|
159
|
-
|
|
205
|
+
this.instance = await this.recreateInstance();
|
|
206
|
+
await this.init();
|
|
207
|
+
this.log.info('World state cleared and reinitialized from genesis');
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
/** Returns the IPC path of the underlying IPC backend, if available. */
|
|
211
|
+
public getIpcPath(): string {
|
|
212
|
+
if (this.instance instanceof IpcWorldState) {
|
|
213
|
+
return this.instance.getIpcPath();
|
|
214
|
+
}
|
|
215
|
+
throw new Error('getIpcPath() is only available with IPC world state');
|
|
160
216
|
}
|
|
161
217
|
|
|
162
218
|
public getCommitted(): MerkleTreeReadOperations {
|
|
@@ -175,17 +231,16 @@ export class NativeWorldStateService implements MerkleTreeDatabase {
|
|
|
175
231
|
blockNumber?: BlockNumber,
|
|
176
232
|
opts: { closeDelayMs?: number } = {},
|
|
177
233
|
): Promise<MerkleTreeWriteOperations> {
|
|
178
|
-
const
|
|
234
|
+
const forkId = await this.instance.createFork({
|
|
179
235
|
latest: blockNumber === undefined,
|
|
180
236
|
blockNumber: blockNumber ?? BlockNumber.ZERO,
|
|
181
|
-
canonical: true,
|
|
182
237
|
});
|
|
183
238
|
return new MerkleTreesForkFacade(
|
|
184
239
|
this.instance,
|
|
185
240
|
this.initialHeader!,
|
|
186
241
|
new WorldStateRevision(
|
|
187
|
-
/*forkId=*/
|
|
188
|
-
/* blockNumber=*/
|
|
242
|
+
/*forkId=*/ forkId,
|
|
243
|
+
/* blockNumber=*/ WorldStateRevision.LATEST,
|
|
189
244
|
/* includeUncommitted=*/ true,
|
|
190
245
|
),
|
|
191
246
|
opts,
|
|
@@ -228,35 +283,44 @@ export class NativeWorldStateService implements MerkleTreeDatabase {
|
|
|
228
283
|
});
|
|
229
284
|
|
|
230
285
|
try {
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
this.deleteCachedSummary.bind(this),
|
|
245
|
-
);
|
|
286
|
+
const status = await this.instance.syncBlock({
|
|
287
|
+
blockNumber: l2Block.number,
|
|
288
|
+
blockHeaderHash: (await l2Block.hash()).toBuffer(),
|
|
289
|
+
// Forwarded so the native sync verifies the archive root against canonical and rejects a divergent tree.
|
|
290
|
+
expectedArchiveRoot: l2Block.archive.root.toBuffer(),
|
|
291
|
+
expectedPreviousArchiveRoot: l2Block.header.lastArchive.root.toBuffer(),
|
|
292
|
+
paddedL1ToL2Messages: paddedL1ToL2Messages.map(serializeLeaf),
|
|
293
|
+
paddedNoteHashes: paddedNoteHashes.map(serializeLeaf),
|
|
294
|
+
paddedNullifiers: paddedNullifiers.map(serializeLeaf),
|
|
295
|
+
publicDataWrites: publicDataWrites.map(serializeLeaf),
|
|
296
|
+
blockStateRef: blockStateReference(l2Block.header.state),
|
|
297
|
+
});
|
|
298
|
+
return this.sanitizeAndCacheSummaryFromFull(status);
|
|
246
299
|
} catch (err) {
|
|
300
|
+
this.deleteCachedSummary();
|
|
247
301
|
this.worldStateInstrumentation.incCriticalErrors('synch_pending_block');
|
|
248
302
|
throw err;
|
|
249
303
|
}
|
|
250
304
|
}
|
|
251
305
|
|
|
252
306
|
public async close(): Promise<void> {
|
|
253
|
-
|
|
254
|
-
|
|
307
|
+
try {
|
|
308
|
+
await this.instance.close();
|
|
309
|
+
} finally {
|
|
310
|
+
await this.cleanup();
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
async [Symbol.asyncDispose](): Promise<void> {
|
|
315
|
+
await this.close();
|
|
255
316
|
}
|
|
256
317
|
|
|
257
318
|
private async buildInitialHeader(): Promise<BlockHeader> {
|
|
258
319
|
const state = await this.getInitialStateReference();
|
|
259
|
-
return BlockHeader.empty({
|
|
320
|
+
return BlockHeader.empty({
|
|
321
|
+
state,
|
|
322
|
+
globalVariables: GlobalVariables.empty({ timestamp: this.genesis.genesisTimestamp }),
|
|
323
|
+
});
|
|
260
324
|
}
|
|
261
325
|
|
|
262
326
|
private sanitizeAndCacheSummaryFromFull(response: WorldStateStatusFull) {
|
|
@@ -271,7 +335,7 @@ export class NativeWorldStateService implements MerkleTreeDatabase {
|
|
|
271
335
|
return sanitized;
|
|
272
336
|
}
|
|
273
337
|
|
|
274
|
-
private deleteCachedSummary(
|
|
338
|
+
private deleteCachedSummary() {
|
|
275
339
|
this.cachedStatusSummary = undefined;
|
|
276
340
|
}
|
|
277
341
|
|
|
@@ -282,16 +346,9 @@ export class NativeWorldStateService implements MerkleTreeDatabase {
|
|
|
282
346
|
*/
|
|
283
347
|
public async setFinalized(toBlockNumber: BlockNumber) {
|
|
284
348
|
try {
|
|
285
|
-
await this.instance.
|
|
286
|
-
WorldStateMessageType.FINALIZE_BLOCKS,
|
|
287
|
-
{
|
|
288
|
-
toBlockNumber,
|
|
289
|
-
canonical: true,
|
|
290
|
-
},
|
|
291
|
-
this.sanitizeAndCacheSummary.bind(this),
|
|
292
|
-
this.deleteCachedSummary.bind(this),
|
|
293
|
-
);
|
|
349
|
+
this.sanitizeAndCacheSummary(await this.instance.finalizeBlocks(toBlockNumber));
|
|
294
350
|
} catch (err) {
|
|
351
|
+
this.deleteCachedSummary();
|
|
295
352
|
this.worldStateInstrumentation.incCriticalErrors('finalize_block');
|
|
296
353
|
throw err;
|
|
297
354
|
}
|
|
@@ -305,16 +362,9 @@ export class NativeWorldStateService implements MerkleTreeDatabase {
|
|
|
305
362
|
*/
|
|
306
363
|
public async removeHistoricalBlocks(toBlockNumber: BlockNumber) {
|
|
307
364
|
try {
|
|
308
|
-
return await this.instance.
|
|
309
|
-
WorldStateMessageType.REMOVE_HISTORICAL_BLOCKS,
|
|
310
|
-
{
|
|
311
|
-
toBlockNumber,
|
|
312
|
-
canonical: true,
|
|
313
|
-
},
|
|
314
|
-
this.sanitizeAndCacheSummaryFromFull.bind(this),
|
|
315
|
-
this.deleteCachedSummary.bind(this),
|
|
316
|
-
);
|
|
365
|
+
return this.sanitizeAndCacheSummaryFromFull(await this.instance.removeHistoricalBlocks(toBlockNumber));
|
|
317
366
|
} catch (err) {
|
|
367
|
+
this.deleteCachedSummary();
|
|
318
368
|
this.worldStateInstrumentation.incCriticalErrors('prune_historical_block');
|
|
319
369
|
throw err;
|
|
320
370
|
}
|
|
@@ -327,16 +377,9 @@ export class NativeWorldStateService implements MerkleTreeDatabase {
|
|
|
327
377
|
*/
|
|
328
378
|
public async unwindBlocks(toBlockNumber: BlockNumber) {
|
|
329
379
|
try {
|
|
330
|
-
return await this.instance.
|
|
331
|
-
WorldStateMessageType.UNWIND_BLOCKS,
|
|
332
|
-
{
|
|
333
|
-
toBlockNumber,
|
|
334
|
-
canonical: true,
|
|
335
|
-
},
|
|
336
|
-
this.sanitizeAndCacheSummaryFromFull.bind(this),
|
|
337
|
-
this.deleteCachedSummary.bind(this),
|
|
338
|
-
);
|
|
380
|
+
return this.sanitizeAndCacheSummaryFromFull(await this.instance.unwindBlocks(toBlockNumber));
|
|
339
381
|
} catch (err) {
|
|
382
|
+
this.deleteCachedSummary();
|
|
340
383
|
this.worldStateInstrumentation.incCriticalErrors('prune_pending_block');
|
|
341
384
|
throw err;
|
|
342
385
|
}
|
|
@@ -346,11 +389,7 @@ export class NativeWorldStateService implements MerkleTreeDatabase {
|
|
|
346
389
|
if (this.cachedStatusSummary !== undefined) {
|
|
347
390
|
return { ...this.cachedStatusSummary };
|
|
348
391
|
}
|
|
349
|
-
return await this.instance.
|
|
350
|
-
WorldStateMessageType.GET_STATUS,
|
|
351
|
-
{ canonical: true },
|
|
352
|
-
this.sanitizeAndCacheSummary.bind(this),
|
|
353
|
-
);
|
|
392
|
+
return this.sanitizeAndCacheSummary(await this.instance.getStatus());
|
|
354
393
|
}
|
|
355
394
|
|
|
356
395
|
updateLeaf<ID extends IndexedTreeId>(
|
|
@@ -362,14 +401,14 @@ export class NativeWorldStateService implements MerkleTreeDatabase {
|
|
|
362
401
|
}
|
|
363
402
|
|
|
364
403
|
private async getInitialStateReference(): Promise<StateReference> {
|
|
365
|
-
const
|
|
404
|
+
const state = await this.instance.getInitialStateReference();
|
|
366
405
|
|
|
367
406
|
return new StateReference(
|
|
368
|
-
treeStateReferenceToSnapshot(
|
|
407
|
+
treeStateReferenceToSnapshot(state[MerkleTreeId.L1_TO_L2_MESSAGE_TREE]),
|
|
369
408
|
new PartialStateReference(
|
|
370
|
-
treeStateReferenceToSnapshot(
|
|
371
|
-
treeStateReferenceToSnapshot(
|
|
372
|
-
treeStateReferenceToSnapshot(
|
|
409
|
+
treeStateReferenceToSnapshot(state[MerkleTreeId.NOTE_HASH_TREE]),
|
|
410
|
+
treeStateReferenceToSnapshot(state[MerkleTreeId.NULLIFIER_TREE]),
|
|
411
|
+
treeStateReferenceToSnapshot(state[MerkleTreeId.PUBLIC_DATA_TREE]),
|
|
373
412
|
),
|
|
374
413
|
);
|
|
375
414
|
}
|
|
@@ -378,11 +417,7 @@ export class NativeWorldStateService implements MerkleTreeDatabase {
|
|
|
378
417
|
dstPath: string,
|
|
379
418
|
compact: boolean = true,
|
|
380
419
|
): Promise<Record<Exclude<SnapshotDataKeys, 'archiver'>, string>> {
|
|
381
|
-
await this.instance.
|
|
382
|
-
dstPath,
|
|
383
|
-
compact,
|
|
384
|
-
canonical: true,
|
|
385
|
-
});
|
|
420
|
+
await this.instance.copyStores(dstPath, compact);
|
|
386
421
|
return fromEntries(NATIVE_WORLD_STATE_DBS.map(([name, dir]) => [name, join(dstPath, dir, 'data.mdb')] as const));
|
|
387
422
|
}
|
|
388
423
|
}
|