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