@aztec/world-state 0.0.1-commit.d3ec352c → 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.
- 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 +21 -50
- 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 +661 -0
- package/dest/native/merkle_trees_facade.d.ts +18 -9
- package/dest/native/merkle_trees_facade.d.ts.map +1 -1
- package/dest/native/merkle_trees_facade.js +90 -113
- package/dest/native/message.d.ts +15 -222
- package/dest/native/message.d.ts.map +1 -1
- package/dest/native/message.js +1 -43
- package/dest/native/native_world_state.d.ts +26 -12
- package/dest/native/native_world_state.d.ts.map +1 -1
- package/dest/native/native_world_state.js +126 -62
- 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 -5
- package/dest/synchronizer/config.d.ts.map +1 -1
- package/dest/synchronizer/config.js +15 -18
- 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 +6 -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 +16 -10
- package/dest/synchronizer/server_world_state_synchronizer.d.ts.map +1 -1
- package/dest/synchronizer/server_world_state_synchronizer.js +170 -57
- package/dest/test/utils.d.ts +11 -17
- package/dest/test/utils.d.ts.map +1 -1
- package/dest/test/utils.js +49 -81
- package/dest/testing.d.ts +5 -4
- package/dest/testing.d.ts.map +1 -1
- package/dest/testing.js +15 -8
- package/dest/world-state-db/merkle_tree_db.d.ts +7 -18
- package/dest/world-state-db/merkle_tree_db.d.ts.map +1 -1
- package/package.json +14 -12
- package/src/index.ts +1 -0
- package/src/instrumentation/instrumentation.ts +23 -59
- package/src/native/fork_checkpoint.ts +19 -3
- package/src/native/index.ts +1 -0
- package/src/native/ipc_world_state_instance.ts +834 -0
- package/src/native/merkle_trees_facade.ts +119 -106
- package/src/native/message.ts +14 -287
- package/src/native/native_world_state.ts +159 -99
- package/src/native/native_world_state_instance.ts +94 -279
- package/src/native/world_state_operation.ts +33 -0
- package/src/synchronizer/config.ts +16 -23
- package/src/synchronizer/errors.ts +8 -0
- package/src/synchronizer/factory.ts +18 -11
- package/src/synchronizer/index.ts +1 -0
- package/src/synchronizer/server_world_state_synchronizer.ts +203 -78
- package/src/test/utils.ts +79 -128
- package/src/testing.ts +13 -11
- package/src/world-state-db/merkle_tree_db.ts +10 -22
- 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/dest/synchronizer/utils.d.ts +0 -11
- package/dest/synchronizer/utils.d.ts.map +0 -1
- package/dest/synchronizer/utils.js +0 -59
- package/src/native/world_state_ops_queue.ts +0 -190
- package/src/synchronizer/utils.ts +0 -83
|
@@ -1,54 +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';
|
|
2
3
|
import { BlockNumber } from '@aztec/foundation/branded-types';
|
|
3
4
|
import { fromEntries, padArrayEnd } from '@aztec/foundation/collection';
|
|
4
|
-
import {
|
|
5
|
-
import { Fr } from '@aztec/foundation/fields';
|
|
6
|
-
import { tryRmDir } from '@aztec/foundation/fs';
|
|
5
|
+
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
7
6
|
import { createLogger } from '@aztec/foundation/log';
|
|
8
|
-
import { DatabaseVersionManager } from '@aztec/stdlib/database-version';
|
|
7
|
+
import { DatabaseVersionManager } from '@aztec/stdlib/database-version/manager';
|
|
9
8
|
import { MerkleTreeId, NullifierLeaf, PublicDataTreeLeaf } from '@aztec/stdlib/trees';
|
|
10
|
-
import { BlockHeader, PartialStateReference, StateReference } from '@aztec/stdlib/tx';
|
|
11
|
-
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';
|
|
12
11
|
import { getTelemetryClient } from '@aztec/telemetry-client';
|
|
13
12
|
import assert from 'assert/strict';
|
|
14
|
-
import { mkdtemp, rm } from 'fs/promises';
|
|
13
|
+
import { mkdir, mkdtemp, rm } from 'fs/promises';
|
|
15
14
|
import { tmpdir } from 'os';
|
|
16
15
|
import { join } from 'path';
|
|
17
16
|
import { WorldStateInstrumentation } from '../instrumentation/instrumentation.js';
|
|
17
|
+
import { IpcWorldState } from './ipc_world_state_instance.js';
|
|
18
18
|
import { MerkleTreesFacade, MerkleTreesForkFacade, serializeLeaf } from './merkle_trees_facade.js';
|
|
19
|
-
import {
|
|
20
|
-
import { NativeWorldState } from './native_world_state_instance.js';
|
|
19
|
+
import { blockStateReference, sanitizeFullStatus, sanitizeSummary, treeStateReferenceToSnapshot } from './message.js';
|
|
21
20
|
// The current version of the world state database schema
|
|
22
21
|
// Increment this when making incompatible changes to the database schema
|
|
23
22
|
export const WORLD_STATE_DB_VERSION = 2; // The initial version
|
|
24
23
|
export const WORLD_STATE_DIR = 'world_state';
|
|
24
|
+
_computedKey = Symbol.asyncDispose;
|
|
25
25
|
export class NativeWorldStateService {
|
|
26
26
|
instance;
|
|
27
27
|
worldStateInstrumentation;
|
|
28
28
|
log;
|
|
29
|
+
genesis;
|
|
29
30
|
cleanup;
|
|
31
|
+
recreateInstance;
|
|
30
32
|
initialHeader;
|
|
31
33
|
// This is read heavily and only changes when data is persisted, so we cache it
|
|
32
34
|
cachedStatusSummary;
|
|
33
|
-
constructor(instance, worldStateInstrumentation, log =
|
|
35
|
+
constructor(instance, worldStateInstrumentation, log, genesis = EMPTY_GENESIS_DATA, cleanup = ()=>Promise.resolve(), /** Factory to recreate a fresh IpcWorldState after clear(). */ recreateInstance){
|
|
34
36
|
this.instance = instance;
|
|
35
37
|
this.worldStateInstrumentation = worldStateInstrumentation;
|
|
36
38
|
this.log = log;
|
|
39
|
+
this.genesis = genesis;
|
|
37
40
|
this.cleanup = cleanup;
|
|
41
|
+
this.recreateInstance = recreateInstance;
|
|
38
42
|
}
|
|
39
|
-
static async new(rollupAddress, dataDir, wsTreeMapSizes,
|
|
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);
|
|
40
50
|
const worldStateDirectory = join(dataDir, WORLD_STATE_DIR);
|
|
41
|
-
// Create a version manager to handle versioning
|
|
42
51
|
const versionManager = new DatabaseVersionManager({
|
|
43
52
|
schemaVersion: WORLD_STATE_DB_VERSION,
|
|
44
53
|
rollupAddress,
|
|
45
54
|
dataDirectory: worldStateDirectory,
|
|
46
|
-
onOpen: (dir)=>
|
|
47
|
-
return Promise.resolve(new NativeWorldState(dir, wsTreeMapSizes, prefilledPublicData, instrumentation));
|
|
48
|
-
}
|
|
55
|
+
onOpen: (dir)=>IpcWorldState.spawn(dir, wsTreeMapSizes, genesis, instrumentation, bindings)
|
|
49
56
|
});
|
|
50
57
|
const [instance] = await versionManager.open();
|
|
51
|
-
const
|
|
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);
|
|
52
70
|
try {
|
|
53
71
|
await worldState.init();
|
|
54
72
|
} catch (e) {
|
|
@@ -57,10 +75,14 @@ export class NativeWorldStateService {
|
|
|
57
75
|
}
|
|
58
76
|
return worldState;
|
|
59
77
|
}
|
|
60
|
-
static async tmp(
|
|
61
|
-
const log = createLogger('world-state:database');
|
|
78
|
+
static async tmp(cleanupTmpDir = true, genesis = EMPTY_GENESIS_DATA, instrumentation = new WorldStateInstrumentation(getTelemetryClient()), bindings, threads) {
|
|
79
|
+
const log = createLogger('world-state:database', bindings);
|
|
62
80
|
const dataDir = await mkdtemp(join(tmpdir(), 'aztec-world-state-'));
|
|
63
|
-
|
|
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;
|
|
64
86
|
const worldStateTreeMapSizes = {
|
|
65
87
|
archiveTreeMapSizeKb: dbMapSizeKb,
|
|
66
88
|
nullifierTreeMapSizeKb: dbMapSizeKb,
|
|
@@ -69,7 +91,7 @@ export class NativeWorldStateService {
|
|
|
69
91
|
publicDataTreeMapSizeKb: dbMapSizeKb
|
|
70
92
|
};
|
|
71
93
|
log.debug(`Created temporary world state database at: ${dataDir} with tree map size: ${dbMapSizeKb}`);
|
|
72
|
-
|
|
94
|
+
const instance = await IpcWorldState.spawn(dataDir, worldStateTreeMapSizes, genesis, instrumentation, bindings, threads);
|
|
73
95
|
const cleanup = async ()=>{
|
|
74
96
|
if (cleanupTmpDir) {
|
|
75
97
|
await rm(dataDir, {
|
|
@@ -82,7 +104,39 @@ export class NativeWorldStateService {
|
|
|
82
104
|
log.debug(`Leaving temporary world state database: ${dataDir}`);
|
|
83
105
|
}
|
|
84
106
|
};
|
|
85
|
-
|
|
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, threads);
|
|
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
|
+
// The TXE spins up one tiny, short-lived world state per test, many concurrently. Cap the wsdb thread
|
|
129
|
+
// usage to the minimum: a single tree-op thread instead of one per core (the C++ IPC dispatcher pool
|
|
130
|
+
// still floors at 2). This avoids ~32 threads per wsdb multiplied across dozens of concurrent test
|
|
131
|
+
// world states — the trees are cache-sized (see tmp's map-size note), so extra threads buy nothing.
|
|
132
|
+
return this.tmp(/*cleanupTmpDir=*/ true, genesis, instrumentation, bindings, /*threads=*/ 1);
|
|
133
|
+
}
|
|
134
|
+
static async fromIpc(wsdbBackend, instrumentation = new WorldStateInstrumentation(getTelemetryClient()), bindings, genesis = EMPTY_GENESIS_DATA, cleanup = ()=>Promise.resolve(), recreateInstance) {
|
|
135
|
+
const log = createLogger('world-state:database', bindings);
|
|
136
|
+
const instance = new IpcWorldState(wsdbBackend, instrumentation, bindings);
|
|
137
|
+
const worldState = new this(instance, instrumentation, log, genesis, cleanup, recreateInstance);
|
|
138
|
+
await worldState.init();
|
|
139
|
+
return worldState;
|
|
86
140
|
}
|
|
87
141
|
async init() {
|
|
88
142
|
const status = await this.getStatusSummary();
|
|
@@ -105,10 +159,21 @@ export class NativeWorldStateService {
|
|
|
105
159
|
assert.strictEqual(initialHeaderIndex, 0n, 'Invalid initial archive state');
|
|
106
160
|
}
|
|
107
161
|
async clear() {
|
|
162
|
+
if (!this.recreateInstance) {
|
|
163
|
+
throw new Error('clear() is not available for externally-managed IPC backends');
|
|
164
|
+
}
|
|
165
|
+
this.log.warn('Clearing world state: shutting down WSDB, deleting data, and recreating');
|
|
108
166
|
await this.instance.close();
|
|
109
167
|
this.cachedStatusSummary = undefined;
|
|
110
|
-
|
|
111
|
-
|
|
168
|
+
this.instance = await this.recreateInstance();
|
|
169
|
+
await this.init();
|
|
170
|
+
this.log.info('World state cleared and reinitialized from genesis');
|
|
171
|
+
}
|
|
172
|
+
/** Returns the IPC path of the underlying IPC backend, if available. */ getIpcPath() {
|
|
173
|
+
if (this.instance instanceof IpcWorldState) {
|
|
174
|
+
return this.instance.getIpcPath();
|
|
175
|
+
}
|
|
176
|
+
throw new Error('getIpcPath() is only available with IPC world state');
|
|
112
177
|
}
|
|
113
178
|
getCommitted() {
|
|
114
179
|
return new MerkleTreesFacade(this.instance, this.initialHeader, WorldStateRevision.empty());
|
|
@@ -116,18 +181,18 @@ export class NativeWorldStateService {
|
|
|
116
181
|
getSnapshot(blockNumber) {
|
|
117
182
|
return new MerkleTreesFacade(this.instance, this.initialHeader, new WorldStateRevision(/*forkId=*/ 0, /* blockNumber=*/ blockNumber, /* includeUncommitted=*/ false));
|
|
118
183
|
}
|
|
119
|
-
async fork(blockNumber) {
|
|
120
|
-
const
|
|
184
|
+
async fork(blockNumber, opts = {}) {
|
|
185
|
+
const forkId = await this.instance.createFork({
|
|
121
186
|
latest: blockNumber === undefined,
|
|
122
|
-
blockNumber: blockNumber ?? BlockNumber.ZERO
|
|
123
|
-
canonical: true
|
|
187
|
+
blockNumber: blockNumber ?? BlockNumber.ZERO
|
|
124
188
|
});
|
|
125
|
-
return new MerkleTreesForkFacade(this.instance, this.initialHeader, new WorldStateRevision(/*forkId=*/
|
|
189
|
+
return new MerkleTreesForkFacade(this.instance, this.initialHeader, new WorldStateRevision(/*forkId=*/ forkId, /* blockNumber=*/ WorldStateRevision.LATEST, /* includeUncommitted=*/ true), opts);
|
|
126
190
|
}
|
|
127
191
|
getInitialHeader() {
|
|
128
192
|
return this.initialHeader;
|
|
129
193
|
}
|
|
130
|
-
async handleL2BlockAndMessages(l2Block, l1ToL2Messages
|
|
194
|
+
async handleL2BlockAndMessages(l2Block, l1ToL2Messages) {
|
|
195
|
+
const isFirstBlock = l2Block.indexWithinCheckpoint === 0;
|
|
131
196
|
if (!isFirstBlock && l1ToL2Messages.length > 0) {
|
|
132
197
|
throw new Error(`L1 to L2 messages must be empty for non-first blocks, but got ${l1ToL2Messages.length} messages for block ${l2Block.number}.`);
|
|
133
198
|
}
|
|
@@ -145,29 +210,42 @@ export class NativeWorldStateService {
|
|
|
145
210
|
});
|
|
146
211
|
});
|
|
147
212
|
try {
|
|
148
|
-
|
|
213
|
+
const status = await this.instance.syncBlock({
|
|
149
214
|
blockNumber: l2Block.number,
|
|
150
|
-
blockHeaderHash: await l2Block.hash(),
|
|
215
|
+
blockHeaderHash: (await l2Block.hash()).toBuffer(),
|
|
216
|
+
// Forwarded so the native sync verifies the archive root against canonical and rejects a divergent tree.
|
|
217
|
+
expectedArchiveRoot: l2Block.archive.root.toBuffer(),
|
|
218
|
+
expectedPreviousArchiveRoot: l2Block.header.lastArchive.root.toBuffer(),
|
|
151
219
|
paddedL1ToL2Messages: paddedL1ToL2Messages.map(serializeLeaf),
|
|
152
220
|
paddedNoteHashes: paddedNoteHashes.map(serializeLeaf),
|
|
153
221
|
paddedNullifiers: paddedNullifiers.map(serializeLeaf),
|
|
154
222
|
publicDataWrites: publicDataWrites.map(serializeLeaf),
|
|
155
|
-
blockStateRef: blockStateReference(l2Block.header.state)
|
|
156
|
-
|
|
157
|
-
|
|
223
|
+
blockStateRef: blockStateReference(l2Block.header.state)
|
|
224
|
+
});
|
|
225
|
+
return this.sanitizeAndCacheSummaryFromFull(status);
|
|
158
226
|
} catch (err) {
|
|
227
|
+
this.deleteCachedSummary();
|
|
159
228
|
this.worldStateInstrumentation.incCriticalErrors('synch_pending_block');
|
|
160
229
|
throw err;
|
|
161
230
|
}
|
|
162
231
|
}
|
|
163
232
|
async close() {
|
|
164
|
-
|
|
165
|
-
|
|
233
|
+
try {
|
|
234
|
+
await this.instance.close();
|
|
235
|
+
} finally{
|
|
236
|
+
await this.cleanup();
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
async [_computedKey]() {
|
|
240
|
+
await this.close();
|
|
166
241
|
}
|
|
167
242
|
async buildInitialHeader() {
|
|
168
243
|
const state = await this.getInitialStateReference();
|
|
169
244
|
return BlockHeader.empty({
|
|
170
|
-
state
|
|
245
|
+
state,
|
|
246
|
+
globalVariables: GlobalVariables.empty({
|
|
247
|
+
timestamp: this.genesis.genesisTimestamp
|
|
248
|
+
})
|
|
171
249
|
});
|
|
172
250
|
}
|
|
173
251
|
sanitizeAndCacheSummaryFromFull(response) {
|
|
@@ -184,7 +262,7 @@ export class NativeWorldStateService {
|
|
|
184
262
|
};
|
|
185
263
|
return sanitized;
|
|
186
264
|
}
|
|
187
|
-
deleteCachedSummary(
|
|
265
|
+
deleteCachedSummary() {
|
|
188
266
|
this.cachedStatusSummary = undefined;
|
|
189
267
|
}
|
|
190
268
|
/**
|
|
@@ -193,11 +271,9 @@ export class NativeWorldStateService {
|
|
|
193
271
|
* @returns The new WorldStateStatus
|
|
194
272
|
*/ async setFinalized(toBlockNumber) {
|
|
195
273
|
try {
|
|
196
|
-
await this.instance.
|
|
197
|
-
toBlockNumber,
|
|
198
|
-
canonical: true
|
|
199
|
-
}, this.sanitizeAndCacheSummary.bind(this), this.deleteCachedSummary.bind(this));
|
|
274
|
+
this.sanitizeAndCacheSummary(await this.instance.finalizeBlocks(toBlockNumber));
|
|
200
275
|
} catch (err) {
|
|
276
|
+
this.deleteCachedSummary();
|
|
201
277
|
this.worldStateInstrumentation.incCriticalErrors('finalize_block');
|
|
202
278
|
throw err;
|
|
203
279
|
}
|
|
@@ -209,11 +285,9 @@ export class NativeWorldStateService {
|
|
|
209
285
|
* @returns The new WorldStateStatus
|
|
210
286
|
*/ async removeHistoricalBlocks(toBlockNumber) {
|
|
211
287
|
try {
|
|
212
|
-
return await this.instance.
|
|
213
|
-
toBlockNumber,
|
|
214
|
-
canonical: true
|
|
215
|
-
}, this.sanitizeAndCacheSummaryFromFull.bind(this), this.deleteCachedSummary.bind(this));
|
|
288
|
+
return this.sanitizeAndCacheSummaryFromFull(await this.instance.removeHistoricalBlocks(toBlockNumber));
|
|
216
289
|
} catch (err) {
|
|
290
|
+
this.deleteCachedSummary();
|
|
217
291
|
this.worldStateInstrumentation.incCriticalErrors('prune_historical_block');
|
|
218
292
|
throw err;
|
|
219
293
|
}
|
|
@@ -224,11 +298,9 @@ export class NativeWorldStateService {
|
|
|
224
298
|
* @returns The new WorldStateStatus
|
|
225
299
|
*/ async unwindBlocks(toBlockNumber) {
|
|
226
300
|
try {
|
|
227
|
-
return await this.instance.
|
|
228
|
-
toBlockNumber,
|
|
229
|
-
canonical: true
|
|
230
|
-
}, this.sanitizeAndCacheSummaryFromFull.bind(this), this.deleteCachedSummary.bind(this));
|
|
301
|
+
return this.sanitizeAndCacheSummaryFromFull(await this.instance.unwindBlocks(toBlockNumber));
|
|
231
302
|
} catch (err) {
|
|
303
|
+
this.deleteCachedSummary();
|
|
232
304
|
this.worldStateInstrumentation.incCriticalErrors('prune_pending_block');
|
|
233
305
|
throw err;
|
|
234
306
|
}
|
|
@@ -239,25 +311,17 @@ export class NativeWorldStateService {
|
|
|
239
311
|
...this.cachedStatusSummary
|
|
240
312
|
};
|
|
241
313
|
}
|
|
242
|
-
return await this.instance.
|
|
243
|
-
canonical: true
|
|
244
|
-
}, this.sanitizeAndCacheSummary.bind(this));
|
|
314
|
+
return this.sanitizeAndCacheSummary(await this.instance.getStatus());
|
|
245
315
|
}
|
|
246
316
|
updateLeaf(_treeId, _leaf, _index) {
|
|
247
317
|
return Promise.reject(new Error('Method not implemented'));
|
|
248
318
|
}
|
|
249
319
|
async getInitialStateReference() {
|
|
250
|
-
const
|
|
251
|
-
|
|
252
|
-
});
|
|
253
|
-
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])));
|
|
320
|
+
const state = await this.instance.getInitialStateReference();
|
|
321
|
+
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])));
|
|
254
322
|
}
|
|
255
323
|
async backupTo(dstPath, compact = true) {
|
|
256
|
-
await this.instance.
|
|
257
|
-
dstPath,
|
|
258
|
-
compact,
|
|
259
|
-
canonical: true
|
|
260
|
-
});
|
|
324
|
+
await this.instance.copyStores(dstPath, compact);
|
|
261
325
|
return fromEntries(NATIVE_WORLD_STATE_DBS.map(([name, dir])=>[
|
|
262
326
|
name,
|
|
263
327
|
join(dstPath, dir, 'data.mdb')
|
|
@@ -1,49 +1,63 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import type {
|
|
3
|
-
import type {
|
|
4
|
-
import type {
|
|
5
|
-
import
|
|
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';
|
|
7
|
+
/** Backend-agnostic handle to a running aztec-wsdb world state, accessed by the TS layer. */
|
|
6
8
|
export interface NativeWorldStateInstance {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
9
|
+
getTreeInfo(treeId: MerkleTreeId, revision: WorldStateRevision): Promise<TreeInfo>;
|
|
10
|
+
getStateReference(revision: WorldStateRevision): Promise<Record<number, TreeStateReference>>;
|
|
11
|
+
getInitialStateReference(): Promise<Record<number, TreeStateReference>>;
|
|
12
|
+
getLeafValue(treeId: MerkleTreeId, revision: WorldStateRevision, leafIndex: bigint): Promise<SerializedLeafValue | undefined>;
|
|
13
|
+
getLeafPreimage(treeId: IndexedTreeId, revision: WorldStateRevision, leafIndex: bigint): Promise<SerializedIndexedLeaf | undefined>;
|
|
14
|
+
getSiblingPath(treeId: MerkleTreeId, revision: WorldStateRevision, leafIndex: bigint): Promise<Buffer[]>;
|
|
15
|
+
getBlockNumbersForLeafIndices(treeId: MerkleTreeId, revision: WorldStateRevision, leafIndices: bigint[]): Promise<(bigint | undefined)[]>;
|
|
16
|
+
findLeafIndices(treeId: MerkleTreeId, revision: WorldStateRevision, leaves: SerializedLeafValue[], startIndex: bigint): Promise<(bigint | undefined)[]>;
|
|
17
|
+
findLowLeaf(treeId: IndexedTreeId, revision: WorldStateRevision, key: Fr): Promise<{
|
|
18
|
+
index: bigint;
|
|
19
|
+
alreadyPresent: boolean;
|
|
20
|
+
}>;
|
|
21
|
+
findSiblingPaths(treeId: MerkleTreeId, revision: WorldStateRevision, leaves: SerializedLeafValue[]): Promise<(SerializedSiblingPathAndIndex | undefined)[]>;
|
|
22
|
+
updateArchive(forkId: number, blockStateRef: BlockStateReference, blockHeaderHash: Buffer): Promise<void>;
|
|
23
|
+
appendLeaves(treeId: MerkleTreeId, forkId: number, leaves: SerializedLeafValue[]): Promise<void>;
|
|
24
|
+
batchInsert(treeId: IndexedTreeId, forkId: number, leaves: SerializedLeafValue[], subtreeDepth: number): Promise<SerializedBatchInsertionResult>;
|
|
25
|
+
sequentialInsert(treeId: IndexedTreeId, forkId: number, leaves: SerializedLeafValue[]): Promise<SerializedSequentialInsertionResult>;
|
|
26
|
+
syncBlock(input: {
|
|
27
|
+
blockNumber: BlockNumber;
|
|
28
|
+
blockStateRef: BlockStateReference;
|
|
29
|
+
blockHeaderHash: Buffer;
|
|
30
|
+
expectedArchiveRoot: Buffer;
|
|
31
|
+
expectedPreviousArchiveRoot: Buffer;
|
|
32
|
+
paddedNoteHashes: readonly SerializedLeafValue[];
|
|
33
|
+
paddedL1ToL2Messages: readonly SerializedLeafValue[];
|
|
34
|
+
paddedNullifiers: readonly SerializedLeafValue[];
|
|
35
|
+
publicDataWrites: readonly SerializedLeafValue[];
|
|
36
|
+
}): Promise<WorldStateStatusFull>;
|
|
37
|
+
createFork(input: {
|
|
38
|
+
latest: boolean;
|
|
39
|
+
blockNumber: BlockNumber;
|
|
40
|
+
}): Promise<number>;
|
|
41
|
+
deleteFork(forkId: number): Promise<void>;
|
|
42
|
+
finalizeBlocks(toBlockNumber: BlockNumber): Promise<WorldStateStatusSummary>;
|
|
43
|
+
unwindBlocks(toBlockNumber: BlockNumber): Promise<WorldStateStatusFull>;
|
|
44
|
+
removeHistoricalBlocks(toBlockNumber: BlockNumber): Promise<WorldStateStatusFull>;
|
|
45
|
+
getStatus(): Promise<WorldStateStatusSummary>;
|
|
46
|
+
createCheckpoint(forkId: number): Promise<number>;
|
|
47
|
+
commitCheckpoint(forkId: number): Promise<void>;
|
|
48
|
+
revertCheckpoint(forkId: number): Promise<void>;
|
|
49
|
+
commitAllCheckpoints(forkId: number, depth: number): Promise<void>;
|
|
50
|
+
revertAllCheckpoints(forkId: number, depth: number): Promise<void>;
|
|
51
|
+
copyStores(dstPath: string, compact: boolean): Promise<void>;
|
|
34
52
|
/**
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
* @param body - The message body
|
|
38
|
-
* @param responseHandler - A callback accepting the response, executed on the job queue
|
|
39
|
-
* @param errorHandler - A callback called on request error, executed on the job queue
|
|
40
|
-
* @returns The response to the message
|
|
53
|
+
* IPC path the underlying aztec-wsdb process listens on. The C++ AVM uses this to attach to the
|
|
54
|
+
* same world state instance the TS layer is using.
|
|
41
55
|
*/
|
|
42
|
-
|
|
56
|
+
getIpcPath(): string;
|
|
43
57
|
/**
|
|
44
|
-
*
|
|
58
|
+
* Shut down the world state instance. Cancels any in-flight queues, closes the IPC channel, and
|
|
59
|
+
* terminates the underlying aztec-wsdb process. Idempotent.
|
|
45
60
|
*/
|
|
46
61
|
close(): Promise<void>;
|
|
47
|
-
private _sendMessage;
|
|
48
62
|
}
|
|
49
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
63
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF0aXZlX3dvcmxkX3N0YXRlX2luc3RhbmNlLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbmF0aXZlL25hdGl2ZV93b3JsZF9zdGF0ZV9pbnN0YW5jZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxXQUFXLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNuRSxPQUFPLEtBQUssRUFBRSxFQUFFLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN6RCxPQUFPLEtBQUssRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDL0UsT0FBTyxLQUFLLEVBQUUsWUFBWSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDeEQsT0FBTyxLQUFLLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUVwRSxPQUFPLEtBQUssRUFDVixtQkFBbUIsRUFDbkIsOEJBQThCLEVBQzlCLHFCQUFxQixFQUNyQixtQkFBbUIsRUFDbkIsbUNBQW1DLEVBQ25DLDZCQUE2QixFQUM3QixrQkFBa0IsRUFDbEIsb0JBQW9CLEVBQ3BCLHVCQUF1QixFQUN4QixNQUFNLGNBQWMsQ0FBQztBQUV0Qiw2RkFBNkY7QUFDN0YsTUFBTSxXQUFXLHdCQUF3QjtJQUN2QyxXQUFXLENBQUMsTUFBTSxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsa0JBQWtCLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ25GLGlCQUFpQixDQUFDLFFBQVEsRUFBRSxrQkFBa0IsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxrQkFBa0IsQ0FBQyxDQUFDLENBQUM7SUFDN0Ysd0JBQXdCLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsa0JBQWtCLENBQUMsQ0FBQyxDQUFDO0lBQ3hFLFlBQVksQ0FDVixNQUFNLEVBQUUsWUFBWSxFQUNwQixRQUFRLEVBQUUsa0JBQWtCLEVBQzVC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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":"
|
|
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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"}
|