@aztec/world-state 0.0.1-commit.3469e52 → 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 +13 -11
- 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 +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 +22 -10
- package/dest/native/native_world_state.d.ts.map +1 -1
- package/dest/native/native_world_state.js +118 -59
- 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 +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 +13 -8
- package/dest/synchronizer/server_world_state_synchronizer.d.ts.map +1 -1
- package/dest/synchronizer/server_world_state_synchronizer.js +134 -49
- package/dest/test/utils.d.ts +6 -6
- package/dest/test/utils.d.ts.map +1 -1
- package/dest/test/utils.js +9 -4
- 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 +3 -12
- package/dest/world-state-db/merkle_tree_db.d.ts.map +1 -1
- package/package.json +14 -11
- package/src/instrumentation/instrumentation.ts +15 -19
- 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 +89 -109
- package/src/native/message.ts +13 -286
- package/src/native/native_world_state.ts +140 -93
- package/src/native/native_world_state_instance.ts +98 -278
- 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 +156 -51
- package/src/test/utils.ts +14 -5
- package/src/testing.ts +12 -10
- package/src/world-state-db/merkle_tree_db.ts +2 -12
- 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
|
@@ -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
5
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
5
|
-
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
6
|
-
import { tryRmDir } from '@aztec/foundation/fs';
|
|
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) {
|
|
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);
|
|
73
95
|
const cleanup = async ()=>{
|
|
74
96
|
if (cleanupTmpDir) {
|
|
75
97
|
await rm(dataDir, {
|
|
@@ -82,7 +104,35 @@ 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);
|
|
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;
|
|
86
136
|
}
|
|
87
137
|
async init() {
|
|
88
138
|
const status = await this.getStatusSummary();
|
|
@@ -105,10 +155,21 @@ export class NativeWorldStateService {
|
|
|
105
155
|
assert.strictEqual(initialHeaderIndex, 0n, 'Invalid initial archive state');
|
|
106
156
|
}
|
|
107
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');
|
|
108
162
|
await this.instance.close();
|
|
109
163
|
this.cachedStatusSummary = undefined;
|
|
110
|
-
|
|
111
|
-
|
|
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');
|
|
112
173
|
}
|
|
113
174
|
getCommitted() {
|
|
114
175
|
return new MerkleTreesFacade(this.instance, this.initialHeader, WorldStateRevision.empty());
|
|
@@ -117,12 +178,11 @@ export class NativeWorldStateService {
|
|
|
117
178
|
return new MerkleTreesFacade(this.instance, this.initialHeader, new WorldStateRevision(/*forkId=*/ 0, /* blockNumber=*/ blockNumber, /* includeUncommitted=*/ false));
|
|
118
179
|
}
|
|
119
180
|
async fork(blockNumber, opts = {}) {
|
|
120
|
-
const
|
|
181
|
+
const forkId = await this.instance.createFork({
|
|
121
182
|
latest: blockNumber === undefined,
|
|
122
|
-
blockNumber: blockNumber ?? BlockNumber.ZERO
|
|
123
|
-
canonical: true
|
|
183
|
+
blockNumber: blockNumber ?? BlockNumber.ZERO
|
|
124
184
|
});
|
|
125
|
-
return new MerkleTreesForkFacade(this.instance, this.initialHeader, new WorldStateRevision(/*forkId=*/
|
|
185
|
+
return new MerkleTreesForkFacade(this.instance, this.initialHeader, new WorldStateRevision(/*forkId=*/ forkId, /* blockNumber=*/ WorldStateRevision.LATEST, /* includeUncommitted=*/ true), opts);
|
|
126
186
|
}
|
|
127
187
|
getInitialHeader() {
|
|
128
188
|
return this.initialHeader;
|
|
@@ -146,29 +206,42 @@ export class NativeWorldStateService {
|
|
|
146
206
|
});
|
|
147
207
|
});
|
|
148
208
|
try {
|
|
149
|
-
|
|
209
|
+
const status = await this.instance.syncBlock({
|
|
150
210
|
blockNumber: l2Block.number,
|
|
151
|
-
blockHeaderHash: await l2Block.hash(),
|
|
211
|
+
blockHeaderHash: (await l2Block.hash()).toBuffer(),
|
|
212
|
+
// Forwarded so the native sync verifies the archive root against canonical and rejects a divergent tree.
|
|
213
|
+
expectedArchiveRoot: l2Block.archive.root.toBuffer(),
|
|
214
|
+
expectedPreviousArchiveRoot: l2Block.header.lastArchive.root.toBuffer(),
|
|
152
215
|
paddedL1ToL2Messages: paddedL1ToL2Messages.map(serializeLeaf),
|
|
153
216
|
paddedNoteHashes: paddedNoteHashes.map(serializeLeaf),
|
|
154
217
|
paddedNullifiers: paddedNullifiers.map(serializeLeaf),
|
|
155
218
|
publicDataWrites: publicDataWrites.map(serializeLeaf),
|
|
156
|
-
blockStateRef: blockStateReference(l2Block.header.state)
|
|
157
|
-
|
|
158
|
-
|
|
219
|
+
blockStateRef: blockStateReference(l2Block.header.state)
|
|
220
|
+
});
|
|
221
|
+
return this.sanitizeAndCacheSummaryFromFull(status);
|
|
159
222
|
} catch (err) {
|
|
223
|
+
this.deleteCachedSummary();
|
|
160
224
|
this.worldStateInstrumentation.incCriticalErrors('synch_pending_block');
|
|
161
225
|
throw err;
|
|
162
226
|
}
|
|
163
227
|
}
|
|
164
228
|
async close() {
|
|
165
|
-
|
|
166
|
-
|
|
229
|
+
try {
|
|
230
|
+
await this.instance.close();
|
|
231
|
+
} finally{
|
|
232
|
+
await this.cleanup();
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
async [_computedKey]() {
|
|
236
|
+
await this.close();
|
|
167
237
|
}
|
|
168
238
|
async buildInitialHeader() {
|
|
169
239
|
const state = await this.getInitialStateReference();
|
|
170
240
|
return BlockHeader.empty({
|
|
171
|
-
state
|
|
241
|
+
state,
|
|
242
|
+
globalVariables: GlobalVariables.empty({
|
|
243
|
+
timestamp: this.genesis.genesisTimestamp
|
|
244
|
+
})
|
|
172
245
|
});
|
|
173
246
|
}
|
|
174
247
|
sanitizeAndCacheSummaryFromFull(response) {
|
|
@@ -185,7 +258,7 @@ export class NativeWorldStateService {
|
|
|
185
258
|
};
|
|
186
259
|
return sanitized;
|
|
187
260
|
}
|
|
188
|
-
deleteCachedSummary(
|
|
261
|
+
deleteCachedSummary() {
|
|
189
262
|
this.cachedStatusSummary = undefined;
|
|
190
263
|
}
|
|
191
264
|
/**
|
|
@@ -194,11 +267,9 @@ export class NativeWorldStateService {
|
|
|
194
267
|
* @returns The new WorldStateStatus
|
|
195
268
|
*/ async setFinalized(toBlockNumber) {
|
|
196
269
|
try {
|
|
197
|
-
await this.instance.
|
|
198
|
-
toBlockNumber,
|
|
199
|
-
canonical: true
|
|
200
|
-
}, this.sanitizeAndCacheSummary.bind(this), this.deleteCachedSummary.bind(this));
|
|
270
|
+
this.sanitizeAndCacheSummary(await this.instance.finalizeBlocks(toBlockNumber));
|
|
201
271
|
} catch (err) {
|
|
272
|
+
this.deleteCachedSummary();
|
|
202
273
|
this.worldStateInstrumentation.incCriticalErrors('finalize_block');
|
|
203
274
|
throw err;
|
|
204
275
|
}
|
|
@@ -210,11 +281,9 @@ export class NativeWorldStateService {
|
|
|
210
281
|
* @returns The new WorldStateStatus
|
|
211
282
|
*/ async removeHistoricalBlocks(toBlockNumber) {
|
|
212
283
|
try {
|
|
213
|
-
return await this.instance.
|
|
214
|
-
toBlockNumber,
|
|
215
|
-
canonical: true
|
|
216
|
-
}, this.sanitizeAndCacheSummaryFromFull.bind(this), this.deleteCachedSummary.bind(this));
|
|
284
|
+
return this.sanitizeAndCacheSummaryFromFull(await this.instance.removeHistoricalBlocks(toBlockNumber));
|
|
217
285
|
} catch (err) {
|
|
286
|
+
this.deleteCachedSummary();
|
|
218
287
|
this.worldStateInstrumentation.incCriticalErrors('prune_historical_block');
|
|
219
288
|
throw err;
|
|
220
289
|
}
|
|
@@ -225,11 +294,9 @@ export class NativeWorldStateService {
|
|
|
225
294
|
* @returns The new WorldStateStatus
|
|
226
295
|
*/ async unwindBlocks(toBlockNumber) {
|
|
227
296
|
try {
|
|
228
|
-
return await this.instance.
|
|
229
|
-
toBlockNumber,
|
|
230
|
-
canonical: true
|
|
231
|
-
}, this.sanitizeAndCacheSummaryFromFull.bind(this), this.deleteCachedSummary.bind(this));
|
|
297
|
+
return this.sanitizeAndCacheSummaryFromFull(await this.instance.unwindBlocks(toBlockNumber));
|
|
232
298
|
} catch (err) {
|
|
299
|
+
this.deleteCachedSummary();
|
|
233
300
|
this.worldStateInstrumentation.incCriticalErrors('prune_pending_block');
|
|
234
301
|
throw err;
|
|
235
302
|
}
|
|
@@ -240,25 +307,17 @@ export class NativeWorldStateService {
|
|
|
240
307
|
...this.cachedStatusSummary
|
|
241
308
|
};
|
|
242
309
|
}
|
|
243
|
-
return await this.instance.
|
|
244
|
-
canonical: true
|
|
245
|
-
}, this.sanitizeAndCacheSummary.bind(this));
|
|
310
|
+
return this.sanitizeAndCacheSummary(await this.instance.getStatus());
|
|
246
311
|
}
|
|
247
312
|
updateLeaf(_treeId, _leaf, _index) {
|
|
248
313
|
return Promise.reject(new Error('Method not implemented'));
|
|
249
314
|
}
|
|
250
315
|
async getInitialStateReference() {
|
|
251
|
-
const
|
|
252
|
-
|
|
253
|
-
});
|
|
254
|
-
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])));
|
|
316
|
+
const state = await this.instance.getInitialStateReference();
|
|
317
|
+
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])));
|
|
255
318
|
}
|
|
256
319
|
async backupTo(dstPath, compact = true) {
|
|
257
|
-
await this.instance.
|
|
258
|
-
dstPath,
|
|
259
|
-
compact,
|
|
260
|
-
canonical: true
|
|
261
|
-
});
|
|
320
|
+
await this.instance.copyStores(dstPath, compact);
|
|
262
321
|
return fromEntries(NATIVE_WORLD_STATE_DBS.map(([name, dir])=>[
|
|
263
322
|
name,
|
|
264
323
|
join(dstPath, dir, 'data.mdb')
|
|
@@ -1,49 +1,68 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import type {
|
|
3
|
-
import type {
|
|
4
|
-
import type {
|
|
5
|
-
import
|
|
6
|
-
|
|
7
|
-
call<T extends WorldStateMessageType>(messageType: T, body: WorldStateRequest[T] & WorldStateRequestCategories): Promise<WorldStateResponse[T]>;
|
|
8
|
-
getHandle(): any;
|
|
9
|
-
}
|
|
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';
|
|
10
7
|
/**
|
|
11
|
-
*
|
|
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}.
|
|
12
12
|
*/
|
|
13
|
-
export
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
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
|
+
expectedArchiveRoot: Buffer;
|
|
36
|
+
expectedPreviousArchiveRoot: Buffer;
|
|
37
|
+
paddedNoteHashes: readonly SerializedLeafValue[];
|
|
38
|
+
paddedL1ToL2Messages: readonly SerializedLeafValue[];
|
|
39
|
+
paddedNullifiers: readonly SerializedLeafValue[];
|
|
40
|
+
publicDataWrites: readonly SerializedLeafValue[];
|
|
41
|
+
}): Promise<WorldStateStatusFull>;
|
|
42
|
+
createFork(input: {
|
|
43
|
+
latest: boolean;
|
|
44
|
+
blockNumber: BlockNumber;
|
|
45
|
+
}): Promise<number>;
|
|
46
|
+
deleteFork(forkId: number): Promise<void>;
|
|
47
|
+
finalizeBlocks(toBlockNumber: BlockNumber): Promise<WorldStateStatusSummary>;
|
|
48
|
+
unwindBlocks(toBlockNumber: BlockNumber): Promise<WorldStateStatusFull>;
|
|
49
|
+
removeHistoricalBlocks(toBlockNumber: BlockNumber): Promise<WorldStateStatusFull>;
|
|
50
|
+
getStatus(): Promise<WorldStateStatusSummary>;
|
|
51
|
+
createCheckpoint(forkId: number): Promise<number>;
|
|
52
|
+
commitCheckpoint(forkId: number): Promise<void>;
|
|
53
|
+
revertCheckpoint(forkId: number): Promise<void>;
|
|
54
|
+
commitAllCheckpoints(forkId: number, depth: number): Promise<void>;
|
|
55
|
+
revertAllCheckpoints(forkId: number, depth: number): Promise<void>;
|
|
56
|
+
copyStores(dstPath: string, compact: boolean): Promise<void>;
|
|
34
57
|
/**
|
|
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
|
|
58
|
+
* IPC path the underlying aztec-wsdb process listens on. The C++ AVM uses this to attach to the
|
|
59
|
+
* same world state instance the TS layer is using.
|
|
41
60
|
*/
|
|
42
|
-
|
|
61
|
+
getIpcPath(): string;
|
|
43
62
|
/**
|
|
44
|
-
*
|
|
63
|
+
* Shut down the world state instance. Cancels any in-flight queues, closes the IPC channel, and
|
|
64
|
+
* terminates the underlying aztec-wsdb process. Idempotent.
|
|
45
65
|
*/
|
|
46
66
|
close(): Promise<void>;
|
|
47
|
-
private _sendMessage;
|
|
48
67
|
}
|
|
49
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
68
|
+
//# 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":"
|
|
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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"}
|