@aztec/world-state 0.7.9 → 0.8.6
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/README.md +3 -3
- package/dest/index.d.ts +2 -2
- package/dest/index.js +2 -2
- package/dest/merkle-tree/merkle_tree_operations_facade.d.ts +3 -3
- package/dest/merkle-tree/merkle_tree_operations_facade.d.ts.map +1 -1
- package/dest/merkle-tree/merkle_tree_operations_facade.js +2 -2
- package/dest/{synchroniser → synchronizer}/config.d.ts +3 -3
- package/dest/{synchroniser → synchronizer}/config.d.ts.map +1 -1
- package/dest/{synchroniser → synchronizer}/config.js +3 -3
- package/dest/synchronizer/index.d.ts +3 -0
- package/dest/synchronizer/index.d.ts.map +1 -0
- package/dest/{synchroniser → synchronizer}/index.js +3 -3
- package/dest/{synchroniser/server_world_state_synchroniser.d.ts → synchronizer/server_world_state_synchronizer.d.ts} +13 -6
- package/dest/synchronizer/server_world_state_synchronizer.d.ts.map +1 -0
- package/dest/synchronizer/server_world_state_synchronizer.js +203 -0
- package/dest/{synchroniser/world_state_synchroniser.d.ts → synchronizer/world_state_synchronizer.d.ts} +11 -11
- package/dest/{synchroniser/world_state_synchroniser.d.ts.map → synchronizer/world_state_synchronizer.d.ts.map} +1 -1
- package/dest/{synchroniser/world_state_synchroniser.js → synchronizer/world_state_synchronizer.js} +2 -2
- package/dest/world-state-db/index.d.ts +5 -1
- package/dest/world-state-db/index.d.ts.map +1 -1
- package/dest/world-state-db/index.js +1 -1
- package/dest/world-state-db/merkle_trees.d.ts +9 -8
- package/dest/world-state-db/merkle_trees.d.ts.map +1 -1
- package/dest/world-state-db/merkle_trees.js +55 -44
- package/package.json +56 -6
- package/src/index.ts +2 -2
- package/src/merkle-tree/merkle_tree_operations_facade.ts +10 -3
- package/src/{synchroniser → synchronizer}/config.ts +3 -3
- package/src/synchronizer/index.ts +2 -0
- package/src/{synchroniser/server_world_state_synchroniser.ts → synchronizer/server_world_state_synchronizer.ts} +60 -10
- package/src/{synchroniser/world_state_synchroniser.ts → synchronizer/world_state_synchronizer.ts} +10 -10
- package/src/world-state-db/index.ts +6 -1
- package/src/world-state-db/merkle_trees.ts +61 -46
- package/.eslintrc.cjs +0 -1
- package/.tsbuildinfo +0 -1
- package/dest/synchroniser/index.d.ts +0 -3
- package/dest/synchroniser/index.d.ts.map +0 -1
- package/dest/synchroniser/server_world_state_synchroniser.d.ts.map +0 -1
- package/dest/synchroniser/server_world_state_synchroniser.js +0 -163
- package/dest/synchroniser/server_world_state_synchroniser.test.d.ts +0 -2
- package/dest/synchroniser/server_world_state_synchroniser.test.d.ts.map +0 -1
- package/dest/synchroniser/server_world_state_synchroniser.test.js +0 -317
- package/src/synchroniser/index.ts +0 -2
- package/src/synchroniser/server_world_state_synchroniser.test.ts +0 -428
- package/tsconfig.json +0 -23
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"merkle_trees.d.ts","sourceRoot":"","sources":["../../src/world-state-db/merkle_trees.ts"],"names":[],"mappings":";AAAA,OAAO,EAGL,EAAE,EACF,eAAe,EAOhB,MAAM,oBAAoB,CAAC;AAK5B,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAGL,QAAQ,EACR,kBAAkB,EAQnB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,WAAW,
|
|
1
|
+
{"version":3,"file":"merkle_trees.d.ts","sourceRoot":"","sources":["../../src/world-state-db/merkle_trees.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,7 +4,7 @@ import { Committable } from '@aztec/foundation/committable';
|
|
|
4
4
|
import { SerialQueue } from '@aztec/foundation/fifo';
|
|
5
5
|
import { createDebugLogger } from '@aztec/foundation/log';
|
|
6
6
|
import { Pedersen, SparseTree, StandardIndexedTree, StandardTree, loadTree, newTree, } from '@aztec/merkle-tree';
|
|
7
|
-
import { MerkleTreeId
|
|
7
|
+
import { MerkleTreeId } from '@aztec/types';
|
|
8
8
|
import { MerkleTreeOperationsFacade } from '../merkle-tree/merkle_tree_operations_facade.js';
|
|
9
9
|
import { computeGlobalVariablesHash } from '../utils.js';
|
|
10
10
|
import { INITIAL_NULLIFIER_TREE_SIZE, } from './index.js';
|
|
@@ -20,21 +20,21 @@ export class MerkleTrees {
|
|
|
20
20
|
this.latestGlobalVariablesHash = new Committable(Fr.zero());
|
|
21
21
|
}
|
|
22
22
|
/**
|
|
23
|
-
*
|
|
23
|
+
* initializes the collection of Merkle Trees.
|
|
24
24
|
* @param optionalWasm - WASM instance to use for hashing (if not provided PrimitivesWasm will be used).
|
|
25
|
-
* @param fromDbOptions - Options to
|
|
25
|
+
* @param fromDbOptions - Options to initialize the trees from the database.
|
|
26
26
|
*/
|
|
27
27
|
async init(optionalWasm, fromDbOptions) {
|
|
28
28
|
const fromDb = fromDbOptions !== undefined;
|
|
29
|
-
const
|
|
29
|
+
const initializeTree = fromDb ? loadTree : newTree;
|
|
30
30
|
const wasm = optionalWasm ?? (await CircuitsWasm.get());
|
|
31
31
|
const hasher = new Pedersen(wasm);
|
|
32
|
-
const contractTree = await
|
|
33
|
-
const nullifierTree = await
|
|
34
|
-
const privateDataTree = await
|
|
35
|
-
const publicDataTree = await
|
|
36
|
-
const l1Tol2MessagesTree = await
|
|
37
|
-
const historicBlocksTree = await
|
|
32
|
+
const contractTree = await initializeTree(StandardTree, this.db, hasher, `${MerkleTreeId[MerkleTreeId.CONTRACT_TREE]}`, CONTRACT_TREE_HEIGHT);
|
|
33
|
+
const nullifierTree = await initializeTree(StandardIndexedTree, this.db, hasher, `${MerkleTreeId[MerkleTreeId.NULLIFIER_TREE]}`, NULLIFIER_TREE_HEIGHT, INITIAL_NULLIFIER_TREE_SIZE);
|
|
34
|
+
const privateDataTree = await initializeTree(StandardTree, this.db, hasher, `${MerkleTreeId[MerkleTreeId.PRIVATE_DATA_TREE]}`, PRIVATE_DATA_TREE_HEIGHT);
|
|
35
|
+
const publicDataTree = await initializeTree(SparseTree, this.db, hasher, `${MerkleTreeId[MerkleTreeId.PUBLIC_DATA_TREE]}`, PUBLIC_DATA_TREE_HEIGHT);
|
|
36
|
+
const l1Tol2MessagesTree = await initializeTree(StandardTree, this.db, hasher, `${MerkleTreeId[MerkleTreeId.L1_TO_L2_MESSAGES_TREE]}`, L1_TO_L2_MSG_TREE_HEIGHT);
|
|
37
|
+
const historicBlocksTree = await initializeTree(StandardTree, this.db, hasher, `${MerkleTreeId[MerkleTreeId.BLOCKS_TREE]}`, HISTORIC_BLOCKS_TREE_HEIGHT);
|
|
38
38
|
this.trees = [contractTree, nullifierTree, privateDataTree, publicDataTree, l1Tol2MessagesTree, historicBlocksTree];
|
|
39
39
|
this.jobQueue.start();
|
|
40
40
|
// The first leaf in the blocks tree contains the empty roots of the other trees and empty global variables.
|
|
@@ -49,10 +49,10 @@ export class MerkleTrees {
|
|
|
49
49
|
}
|
|
50
50
|
}
|
|
51
51
|
/**
|
|
52
|
-
* Method to asynchronously create and
|
|
52
|
+
* Method to asynchronously create and initialize a MerkleTrees instance.
|
|
53
53
|
* @param db - The db instance to use for data persistance.
|
|
54
54
|
* @param wasm - WASM instance to use for hashing (if not provided PrimitivesWasm will be used).
|
|
55
|
-
* @returns - A fully
|
|
55
|
+
* @returns - A fully initialized MerkleTrees instance.
|
|
56
56
|
*/
|
|
57
57
|
static async new(db, wasm) {
|
|
58
58
|
const merkleTrees = new MerkleTrees(db);
|
|
@@ -86,21 +86,21 @@ export class MerkleTrees {
|
|
|
86
86
|
* @param includeUncommitted - Indicates whether to include uncommitted data.
|
|
87
87
|
*/
|
|
88
88
|
async updateHistoricBlocksTree(globalsHash, includeUncommitted) {
|
|
89
|
-
await this.
|
|
89
|
+
await this.synchronize(() => this._updateHistoricBlocksTree(globalsHash, includeUncommitted));
|
|
90
90
|
}
|
|
91
91
|
/**
|
|
92
92
|
* Updates the latest global variables hash
|
|
93
93
|
* @param globalVariablesHash - The latest global variables hash
|
|
94
94
|
*/
|
|
95
95
|
async updateLatestGlobalVariablesHash(globalVariablesHash) {
|
|
96
|
-
return await this.
|
|
96
|
+
return await this.synchronize(() => this._updateLatestGlobalVariablesHash(globalVariablesHash));
|
|
97
97
|
}
|
|
98
98
|
/**
|
|
99
99
|
* Gets the global variables hash from the previous block
|
|
100
100
|
* @param includeUncommitted - Indicates whether to include uncommitted data.
|
|
101
101
|
*/
|
|
102
102
|
async getLatestGlobalVariablesHash(includeUncommitted) {
|
|
103
|
-
return await this.
|
|
103
|
+
return await this.synchronize(() => this._getGlobalVariablesHash(includeUncommitted));
|
|
104
104
|
}
|
|
105
105
|
/**
|
|
106
106
|
* Gets the tree info for the specified tree.
|
|
@@ -109,7 +109,7 @@ export class MerkleTrees {
|
|
|
109
109
|
* @returns The tree info for the specified tree.
|
|
110
110
|
*/
|
|
111
111
|
async getTreeInfo(treeId, includeUncommitted) {
|
|
112
|
-
return await this.
|
|
112
|
+
return await this.synchronize(() => this._getTreeInfo(treeId, includeUncommitted));
|
|
113
113
|
}
|
|
114
114
|
/**
|
|
115
115
|
* Get the current roots of the commitment trees.
|
|
@@ -117,7 +117,7 @@ export class MerkleTrees {
|
|
|
117
117
|
* @returns The current roots of the trees.
|
|
118
118
|
*/
|
|
119
119
|
async getTreeRoots(includeUncommitted) {
|
|
120
|
-
const roots = await this.
|
|
120
|
+
const roots = await this.synchronize(() => Promise.resolve(this._getAllTreeRoots(includeUncommitted)));
|
|
121
121
|
return {
|
|
122
122
|
privateDataTreeRoot: roots[0],
|
|
123
123
|
nullifierTreeRoot: roots[1],
|
|
@@ -151,7 +151,7 @@ export class MerkleTrees {
|
|
|
151
151
|
* @returns Leaf value at the given index (undefined if not found).
|
|
152
152
|
*/
|
|
153
153
|
async getLeafValue(treeId, index, includeUncommitted) {
|
|
154
|
-
return await this.
|
|
154
|
+
return await this.synchronize(() => this.trees[treeId].getLeafValue(index, includeUncommitted));
|
|
155
155
|
}
|
|
156
156
|
/**
|
|
157
157
|
* Gets the sibling path for a leaf in a tree.
|
|
@@ -161,7 +161,7 @@ export class MerkleTrees {
|
|
|
161
161
|
* @returns The sibling path for the leaf.
|
|
162
162
|
*/
|
|
163
163
|
async getSiblingPath(treeId, index, includeUncommitted) {
|
|
164
|
-
return await this.
|
|
164
|
+
return await this.synchronize(() => this._getSiblingPath(treeId, index, includeUncommitted));
|
|
165
165
|
}
|
|
166
166
|
/**
|
|
167
167
|
* Appends leaves to a tree.
|
|
@@ -170,21 +170,21 @@ export class MerkleTrees {
|
|
|
170
170
|
* @returns Empty promise.
|
|
171
171
|
*/
|
|
172
172
|
async appendLeaves(treeId, leaves) {
|
|
173
|
-
return await this.
|
|
173
|
+
return await this.synchronize(() => this._appendLeaves(treeId, leaves));
|
|
174
174
|
}
|
|
175
175
|
/**
|
|
176
176
|
* Commits all pending updates.
|
|
177
177
|
* @returns Empty promise.
|
|
178
178
|
*/
|
|
179
179
|
async commit() {
|
|
180
|
-
return await this.
|
|
180
|
+
return await this.synchronize(() => this._commit());
|
|
181
181
|
}
|
|
182
182
|
/**
|
|
183
183
|
* Rolls back all pending updates.
|
|
184
184
|
* @returns Empty promise.
|
|
185
185
|
*/
|
|
186
186
|
async rollback() {
|
|
187
|
-
return await this.
|
|
187
|
+
return await this.synchronize(() => this._rollback());
|
|
188
188
|
}
|
|
189
189
|
/**
|
|
190
190
|
* Finds the index of the largest leaf whose value is less than or equal to the provided value.
|
|
@@ -194,7 +194,7 @@ export class MerkleTrees {
|
|
|
194
194
|
* @returns The found leaf index and a flag indicating if the corresponding leaf's value is equal to `newValue`.
|
|
195
195
|
*/
|
|
196
196
|
async getPreviousValueIndex(treeId, value, includeUncommitted) {
|
|
197
|
-
return await this.
|
|
197
|
+
return await this.synchronize(() => Promise.resolve(this._getIndexedTree(treeId).findIndexOfPreviousValue(value, includeUncommitted)));
|
|
198
198
|
}
|
|
199
199
|
/**
|
|
200
200
|
* Gets the leaf data at a given index and tree.
|
|
@@ -204,7 +204,7 @@ export class MerkleTrees {
|
|
|
204
204
|
* @returns Leaf data.
|
|
205
205
|
*/
|
|
206
206
|
async getLeafData(treeId, index, includeUncommitted) {
|
|
207
|
-
return await this.
|
|
207
|
+
return await this.synchronize(() => Promise.resolve(this._getIndexedTree(treeId).getLatestLeafDataCopy(index, includeUncommitted)));
|
|
208
208
|
}
|
|
209
209
|
/**
|
|
210
210
|
* Returns the index of a leaf given its value, or undefined if no leaf with that value is found.
|
|
@@ -214,7 +214,7 @@ export class MerkleTrees {
|
|
|
214
214
|
* @returns The index of the first leaf found with a given value (undefined if not found).
|
|
215
215
|
*/
|
|
216
216
|
async findLeafIndex(treeId, value, includeUncommitted) {
|
|
217
|
-
return await this.
|
|
217
|
+
return await this.synchronize(async () => {
|
|
218
218
|
const tree = this.trees[treeId];
|
|
219
219
|
for (let i = 0n; i < tree.getNumLeaves(includeUncommitted); i++) {
|
|
220
220
|
const currentValue = await tree.getLeafValue(i, includeUncommitted);
|
|
@@ -233,14 +233,15 @@ export class MerkleTrees {
|
|
|
233
233
|
* @returns Empty promise.
|
|
234
234
|
*/
|
|
235
235
|
async updateLeaf(treeId, leaf, index) {
|
|
236
|
-
return await this.
|
|
236
|
+
return await this.synchronize(() => this._updateLeaf(treeId, leaf, index));
|
|
237
237
|
}
|
|
238
238
|
/**
|
|
239
239
|
* Handles a single L2 block (i.e. Inserts the new commitments into the merkle tree).
|
|
240
240
|
* @param block - The L2 block to handle.
|
|
241
|
+
* @returns Whether the block handled was produced by this same node.
|
|
241
242
|
*/
|
|
242
243
|
async handleL2Block(block) {
|
|
243
|
-
await this.
|
|
244
|
+
return await this.synchronize(() => this._handleL2Block(block));
|
|
244
245
|
}
|
|
245
246
|
/**
|
|
246
247
|
* Batch insert multiple leaves into the tree.
|
|
@@ -254,14 +255,14 @@ export class MerkleTrees {
|
|
|
254
255
|
if (!('batchInsert' in tree)) {
|
|
255
256
|
throw new Error('Tree does not support `batchInsert` method');
|
|
256
257
|
}
|
|
257
|
-
return await this.
|
|
258
|
+
return await this.synchronize(() => tree.batchInsert(leaves, subtreeHeight));
|
|
258
259
|
}
|
|
259
260
|
/**
|
|
260
261
|
* Waits for all jobs to finish before executing the given function.
|
|
261
262
|
* @param fn - The function to execute.
|
|
262
263
|
* @returns Promise containing the result of the function.
|
|
263
264
|
*/
|
|
264
|
-
async
|
|
265
|
+
async synchronize(fn) {
|
|
265
266
|
return await this.jobQueue.put(fn);
|
|
266
267
|
}
|
|
267
268
|
_updateLatestGlobalVariablesHash(globalVariablesHash) {
|
|
@@ -353,25 +354,25 @@ export class MerkleTrees {
|
|
|
353
354
|
* @param l2Block - The L2 block to handle.
|
|
354
355
|
*/
|
|
355
356
|
async _handleL2Block(l2Block) {
|
|
357
|
+
const treeRootWithIdPairs = [
|
|
358
|
+
[l2Block.endContractTreeSnapshot.root, MerkleTreeId.CONTRACT_TREE],
|
|
359
|
+
[l2Block.endNullifierTreeSnapshot.root, MerkleTreeId.NULLIFIER_TREE],
|
|
360
|
+
[l2Block.endPrivateDataTreeSnapshot.root, MerkleTreeId.PRIVATE_DATA_TREE],
|
|
361
|
+
[l2Block.endPublicDataTreeRoot, MerkleTreeId.PUBLIC_DATA_TREE],
|
|
362
|
+
[l2Block.endL1ToL2MessagesTreeSnapshot.root, MerkleTreeId.L1_TO_L2_MESSAGES_TREE],
|
|
363
|
+
[l2Block.endHistoricBlocksTreeSnapshot.root, MerkleTreeId.BLOCKS_TREE],
|
|
364
|
+
];
|
|
356
365
|
const compareRoot = (root, treeId) => {
|
|
357
366
|
const treeRoot = this.trees[treeId].getRoot(true);
|
|
358
367
|
return treeRoot.equals(root.toBuffer());
|
|
359
368
|
};
|
|
360
|
-
const
|
|
361
|
-
compareRoot(l2Block.endContractTreeSnapshot.root, MerkleTreeId.CONTRACT_TREE),
|
|
362
|
-
compareRoot(l2Block.endNullifierTreeSnapshot.root, MerkleTreeId.NULLIFIER_TREE),
|
|
363
|
-
compareRoot(l2Block.endPrivateDataTreeSnapshot.root, MerkleTreeId.PRIVATE_DATA_TREE),
|
|
364
|
-
compareRoot(l2Block.endPublicDataTreeRoot, MerkleTreeId.PUBLIC_DATA_TREE),
|
|
365
|
-
compareRoot(l2Block.endL1ToL2MessagesTreeSnapshot.root, MerkleTreeId.L1_TO_L2_MESSAGES_TREE),
|
|
366
|
-
compareRoot(l2Block.endHistoricBlocksTreeSnapshot.root, MerkleTreeId.BLOCKS_TREE),
|
|
367
|
-
];
|
|
368
|
-
const ourBlock = rootChecks.every(x => x);
|
|
369
|
+
const ourBlock = treeRootWithIdPairs.every(([root, id]) => compareRoot(root, id));
|
|
369
370
|
if (ourBlock) {
|
|
370
|
-
this.log(`Block ${l2Block.number} is ours, committing world state
|
|
371
|
+
this.log(`Block ${l2Block.number} is ours, committing world state`);
|
|
371
372
|
await this._commit();
|
|
372
373
|
}
|
|
373
374
|
else {
|
|
374
|
-
this.log(`Block ${l2Block.number} is not ours, rolling back world state and committing state from chain
|
|
375
|
+
this.log(`Block ${l2Block.number} is not ours, rolling back world state and committing state from chain`);
|
|
375
376
|
await this._rollback();
|
|
376
377
|
// Sync the append only trees
|
|
377
378
|
for (const [tree, leaves] of [
|
|
@@ -393,15 +394,25 @@ export class MerkleTrees {
|
|
|
393
394
|
// Sync and add the block to the historic blocks tree
|
|
394
395
|
const globalVariablesHash = await computeGlobalVariablesHash(l2Block.globalVariables);
|
|
395
396
|
await this._updateLatestGlobalVariablesHash(globalVariablesHash);
|
|
396
|
-
this.log(`Synced global variables with hash ${
|
|
397
|
+
this.log(`Synced global variables with hash ${globalVariablesHash}`);
|
|
397
398
|
const blockHash = await this._getCurrentBlockHash(globalVariablesHash, true);
|
|
398
399
|
await this._appendLeaves(MerkleTreeId.BLOCKS_TREE, [blockHash.toBuffer()]);
|
|
399
400
|
await this._commit();
|
|
400
401
|
}
|
|
401
|
-
for (const treeId of
|
|
402
|
+
for (const [root, treeId] of treeRootWithIdPairs) {
|
|
403
|
+
const treeName = MerkleTreeId[treeId];
|
|
402
404
|
const info = await this._getTreeInfo(treeId, false);
|
|
403
|
-
|
|
405
|
+
const syncedStr = '0x' + info.root.toString('hex');
|
|
406
|
+
const rootStr = root.toString();
|
|
407
|
+
// Sanity check that the rebuilt trees match the roots published by the L2 block
|
|
408
|
+
if (!info.root.equals(root.toBuffer())) {
|
|
409
|
+
throw new Error(`Synced tree root ${treeName} does not match published L2 block root: ${syncedStr} != ${rootStr}`);
|
|
410
|
+
}
|
|
411
|
+
else {
|
|
412
|
+
this.log(`Tree ${treeName} synched with size ${info.size} root ${rootStr}`);
|
|
413
|
+
}
|
|
404
414
|
}
|
|
415
|
+
return { isBlockOurs: ourBlock };
|
|
405
416
|
}
|
|
406
417
|
}
|
|
407
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVya2xlX3RyZWVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3dvcmxkLXN0YXRlLWRiL21lcmtsZV90cmVlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsb0JBQW9CLEVBQ3BCLFlBQVksRUFDWixFQUFFLEVBQ0YsZUFBZSxFQUNmLDJCQUEyQixFQUMzQix3QkFBd0IsRUFDeEIsd0JBQXdCLEVBQ3hCLHFCQUFxQixFQUNyQix3QkFBd0IsRUFDeEIsdUJBQXVCLEdBQ3hCLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDM0QsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQzVELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUUxRCxPQUFPLEVBS0wsUUFBUSxFQUNSLFVBQVUsRUFDVixtQkFBbUIsRUFDbkIsWUFBWSxFQUVaLFFBQVEsRUFDUixPQUFPLEdBQ1IsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQVcsWUFBWSxFQUFlLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUlqRixPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxpREFBaUQsQ0FBQztBQUM3RixPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDekQsT0FBTyxFQUVMLDJCQUEyQixHQU01QixNQUFNLFlBQVksQ0FBQztBQVlwQjs7R0FFRztBQUNILE1BQU0sT0FBTyxXQUFXO0lBS3RCLFlBQW9CLEVBQW1CLEVBQVUsTUFBTSxpQkFBaUIsQ0FBQyxvQkFBb0IsQ0FBQztRQUExRSxPQUFFLEdBQUYsRUFBRSxDQUFpQjtRQUFVLFFBQUcsR0FBSCxHQUFHLENBQTBDO1FBSnRGLFVBQUssR0FBd0MsRUFBRSxD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
|
|
418
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVya2xlX3RyZWVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3dvcmxkLXN0YXRlLWRiL21lcmtsZV90cmVlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsb0JBQW9CLEVBQ3BCLFlBQVksRUFDWixFQUFFLEVBQ0YsZUFBZSxFQUNmLDJCQUEyQixFQUMzQix3QkFBd0IsRUFDeEIsd0JBQXdCLEVBQ3hCLHFCQUFxQixFQUNyQix3QkFBd0IsRUFDeEIsdUJBQXVCLEdBQ3hCLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDM0QsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQzVELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUUxRCxPQUFPLEVBS0wsUUFBUSxFQUNSLFVBQVUsRUFDVixtQkFBbUIsRUFDbkIsWUFBWSxFQUVaLFFBQVEsRUFDUixPQUFPLEdBQ1IsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQVcsWUFBWSxFQUFlLE1BQU0sY0FBYyxDQUFDO0FBSWxFLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLGlEQUFpRCxDQUFDO0FBQzdGLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN6RCxPQUFPLEVBR0wsMkJBQTJCLEdBTTVCLE1BQU0sWUFBWSxDQUFDO0FBWXBCOztHQUVHO0FBQ0gsTUFBTSxPQUFPLFdBQVc7SUFLdEIsWUFBb0IsRUFBbUIsRUFBVSxNQUFNLGlCQUFpQixDQUFDLG9CQUFvQixDQUFDO1FBQTFFLE9BQUUsR0FBRixFQUFFLENBQWlCO1FBQVUsUUFBRyxHQUFILEdBQUcsQ0FBMEM7UUFKdEYsVUFBSyxHQUF3QyxFQUFFLENBQUM7UUFFaEQsYUFBUSxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7UUFHbkMsSUFBSSxDQUFDLHlCQUF5QixHQUFHLElBQUksV0FBVyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksS0FBSyxDQUFDLElBQUksQ0FBQyxZQUEwQixFQUFFLGFBQTZCO1FBQ3pFLE1BQU0sTUFBTSxHQUFHLGFBQWEsS0FBSyxTQUFTLENBQUM7UUFDM0MsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztRQUVuRCxNQUFNLElBQUksR0FBRyxZQUFZLElBQUksQ0FBQyxNQUFNLFlBQVksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQ3hELE1BQU0sTUFBTSxHQUFHLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xDLE1BQU0sWUFBWSxHQUFtQixNQUFNLGNBQWMsQ0FDdkQsWUFBWSxFQUNaLElBQUksQ0FBQyxFQUFFLEVBQ1AsTUFBTSxFQUNOLEdBQUcsWUFBWSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsRUFBRSxFQUM3QyxvQkFBb0IsQ0FDckIsQ0FBQztRQUNGLE1BQU0sYUFBYSxHQUFHLE1BQU0sY0FBYyxDQUN4QyxtQkFBbUIsRUFDbkIsSUFBSSxDQUFDLEVBQUUsRUFDUCxNQUFNLEVBQ04sR0FBRyxZQUFZLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQyxFQUFFLEVBQzlDLHFCQUFxQixFQUNyQiwyQkFBMkIsQ0FDNUIsQ0FBQztRQUNGLE1BQU0sZUFBZSxHQUFtQixNQUFNLGNBQWMsQ0FDMUQsWUFBWSxFQUNaLElBQUksQ0FBQyxFQUFFLEVBQ1AsTUFBTSxFQUNOLEdBQUcsWUFBWSxDQUFDLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLEVBQ2pELHdCQUF3QixDQUN6QixDQUFDO1FBQ0YsTUFBTSxjQUFjLEdBQW1CLE1BQU0sY0FBYyxDQUN6RCxVQUFVLEVBQ1YsSUFBSSxDQUFDLEVBQUUsRUFDUCxNQUFNLEVBQ04sR0FBRyxZQUFZLENBQUMsWUFBWSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsRUFDaEQsdUJBQXVCLENBQ3hCLENBQUM7UUFDRixNQUFNLGtCQUFrQixHQUFtQixNQUFNLGNBQWMsQ0FDN0QsWUFBWSxFQUNaLElBQUksQ0FBQyxFQUFFLEVBQ1AsTUFBTSxFQUNOLEdBQUcsWUFBWSxDQUFDLFlBQVksQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFLEVBQ3RELHdCQUF3QixDQUN6QixDQUFDO1FBQ0YsTUFBTSxrQkFBa0IsR0FBbUIsTUFBTSxjQUFjLENBQzdELFlBQVksRUFDWixJQUFJLENBQUMsRUFBRSxFQUNQLE1BQU0sRUFDTixHQUFHLFlBQVksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLEVBQUUsRUFDM0MsMkJBQTJCLENBQzVCLENBQUM7UUFDRixJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsWUFBWSxFQUFFLGFBQWEsRUFBRSxlQUFlLEVBQUUsY0FBYyxFQUFFLGtCQUFrQixFQUFFLGtCQUFrQixDQUFDLENBQUM7UUFFcEgsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUV0Qiw0R0FBNEc7UUFDNUcsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNYLE1BQU0sMEJBQTBCLEdBQUcsTUFBTSwwQkFBMEIsQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUM3RixNQUFNLElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO1lBQ3hFLE1BQU0sSUFBSSxDQUFDLHlCQUF5QixDQUFDLDBCQUEwQixFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3ZFLE1BQU0sSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1NBQ3RCO2FBQU07WUFDTCxNQUFNLElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxNQUFNLDBCQUEwQixDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDO1NBQzlHO0lBQ0gsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBbUIsRUFBRSxJQUFrQjtRQUM3RCxNQUFNLFdBQVcsR0FBRyxJQUFJLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN4QyxNQUFNLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDN0IsT0FBTyxXQUFXLENBQUM7SUFDckIsQ0FBQztJQUVEOztPQUVHO0lBQ0ksS0FBSyxDQUFDLElBQUk7UUFDZixNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVEOzs7T0FHRztJQUNJLFFBQVE7UUFDYixPQUFPLElBQUksMEJBQTBCLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRDs7O09BR0c7SUFDSSxXQUFXO1FBQ2hCLE9BQU8sSUFBSSwwQkFBMEIsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksS0FBSyxDQUFDLHdCQUF3QixDQUFDLFdBQWUsRUFBRSxrQkFBMkI7UUFDaEYsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxXQUFXLEVBQUUsa0JBQWtCLENBQUMsQ0FBQyxDQUFDO0lBQ2hHLENBQUM7SUFFRDs7O09BR0c7SUFDSSxLQUFLLENBQUMsK0JBQStCLENBQUMsbUJBQXVCO1FBQ2xFLE9BQU8sTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUM7SUFDbEcsQ0FBQztJQUVEOzs7T0FHRztJQUNJLEtBQUssQ0FBQyw0QkFBNEIsQ0FBQyxrQkFBMkI7UUFDbkUsT0FBTyxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQztJQUN4RixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxLQUFLLENBQUMsV0FBVyxDQUFDLE1BQW9CLEVBQUUsa0JBQTJCO1FBQ3hFLE9BQU8sTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLGtCQUFrQixDQUFDLENBQUMsQ0FBQztJQUNyRixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLEtBQUssQ0FBQyxZQUFZLENBQUMsa0JBQTJCO1FBQ25ELE1BQU0sS0FBSyxHQUFHLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUV2RyxPQUFPO1lBQ0wsbUJBQW1CLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUM3QixpQkFBaUIsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQzNCLG9CQUFvQixFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDOUIsc0JBQXNCLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUNoQyxrQkFBa0IsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQzVCLGNBQWMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO1NBQ3pCLENBQUM7SUFDSixDQUFDO0lBRU8sS0FBSyxDQUFDLG9CQUFvQixDQUFDLFdBQWUsRUFBRSxrQkFBMkI7UUFDN0UsTUFBTSxLQUFLLEdBQUcsQ0FBQyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ2pHLE1BQU0sSUFBSSxHQUFHLE1BQU0sWUFBWSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3RDLE9BQU8sZ0JBQWdCLENBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDL0YsQ0FBQztJQUVPLGdCQUFnQixDQUFDLGtCQUEyQjtRQUNsRCxNQUFNLEtBQUssR0FBRztZQUNaLFlBQVksQ0FBQyxpQkFBaUI7WUFDOUIsWUFBWSxDQUFDLGNBQWM7WUFDM0IsWUFBWSxDQUFDLGFBQWE7WUFDMUIsWUFBWSxDQUFDLHNCQUFzQjtZQUNuQyxZQUFZLENBQUMsZ0JBQWdCO1lBQzdCLFlBQVksQ0FBQyxXQUFXO1NBQ3pCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDO1FBRTVELE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksS0FBSyxDQUFDLFlBQVksQ0FDdkIsTUFBb0IsRUFDcEIsS0FBYSxFQUNiLGtCQUEyQjtRQUUzQixPQUFPLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsa0JBQWtCLENBQUMsQ0FBQyxDQUFDO0lBQ2xHLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxLQUFLLENBQUMsY0FBYyxDQUN6QixNQUFvQixFQUNwQixLQUFhLEVBQ2Isa0JBQTJCO1FBRTNCLE9BQU8sTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxrQkFBa0IsQ0FBQyxDQUFDLENBQUM7SUFDL0YsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksS0FBSyxDQUFDLFlBQVksQ0FBQyxNQUFvQixFQUFFLE1BQWdCO1FBQzlELE9BQU8sTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDMUUsQ0FBQztJQUVEOzs7T0FHRztJQUNJLEtBQUssQ0FBQyxNQUFNO1FBQ2pCLE9BQU8sTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFRDs7O09BR0c7SUFDSSxLQUFLLENBQUMsUUFBUTtRQUNuQixPQUFPLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksS0FBSyxDQUFDLHFCQUFxQixDQUNoQyxNQUFxQixFQUNyQixLQUFhLEVBQ2Isa0JBQTJCO1FBVzNCLE9BQU8sTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUNqQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUMsd0JBQXdCLENBQUMsS0FBSyxFQUFFLGtCQUFrQixDQUFDLENBQUMsQ0FDbEcsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxLQUFLLENBQUMsV0FBVyxDQUN0QixNQUFxQixFQUNyQixLQUFhLEVBQ2Isa0JBQTJCO1FBRTNCLE9BQU8sTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUNqQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUMscUJBQXFCLENBQUMsS0FBSyxFQUFFLGtCQUFrQixDQUFDLENBQUMsQ0FDL0YsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxLQUFLLENBQUMsYUFBYSxDQUN4QixNQUFvQixFQUNwQixLQUFhLEVBQ2Isa0JBQTJCO1FBRTNCLE9BQU8sTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssSUFBSSxFQUFFO1lBQ3ZDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDaEMsS0FBSyxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsa0JBQWtCLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDL0QsTUFBTSxZQUFZLEdBQUcsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO2dCQUNwRSxJQUFJLFlBQVksSUFBSSxZQUFZLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFO29CQUM5QyxPQUFPLENBQUMsQ0FBQztpQkFDVjthQUNGO1lBQ0QsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksS0FBSyxDQUFDLFVBQVUsQ0FBQyxNQUFvQyxFQUFFLElBQXVCLEVBQUUsS0FBYTtRQUNsRyxPQUFPLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUM3RSxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLEtBQUssQ0FBQyxhQUFhLENBQUMsS0FBYztRQUN2QyxPQUFPLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLEtBQUssQ0FBQyxXQUFXLENBS3RCLE1BQW9CLEVBQ3BCLE1BQWdCLEVBQ2hCLGFBQTRCO1FBSzVCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUF3QixDQUFDO1FBQ3ZELElBQUksQ0FBQyxDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUMsRUFBRTtZQUM1QixNQUFNLElBQUksS0FBSyxDQUFDLDRDQUE0QyxDQUFDLENBQUM7U0FDL0Q7UUFDRCxPQUFPLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDO0lBQy9FLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssS0FBSyxDQUFDLFdBQVcsQ0FBSSxFQUFvQjtRQUMvQyxPQUFPLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVPLGdDQUFnQyxDQUFDLG1CQUF1QjtRQUM5RCxJQUFJLENBQUMseUJBQXlCLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDeEQsT0FBTyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVPLHVCQUF1QixDQUFDLGtCQUEyQjtRQUN6RCxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLHlCQUF5QixDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUM7SUFDakYsQ0FBQztJQUVPLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxXQUFlLEVBQUUsa0JBQTJCO1FBQ2xGLE1BQU0sU0FBUyxHQUFHLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixDQUFDLFdBQVcsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO1FBQ25GLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM3RSxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyxZQUFZLENBQUMsTUFBb0IsRUFBRSxrQkFBMkI7UUFDcEUsTUFBTSxRQUFRLEdBQUc7WUFDZixNQUFNO1lBQ04sSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDO1lBQ3BELElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQztZQUN6RCxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLEVBQUU7U0FDekIsQ0FBQztRQUNkLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLGVBQWUsQ0FBQyxNQUFxQjtRQUMzQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFnQixDQUFDO0lBQzNDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSyxlQUFlLENBQ3JCLE1BQW9CLEVBQ3BCLEtBQWEsRUFDYixrQkFBMkI7UUFFM0IsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsY0FBYyxDQUFJLEtBQUssRUFBRSxrQkFBa0IsQ0FBQyxDQUFDLENBQUM7SUFDMUYsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ssS0FBSyxDQUFDLGFBQWEsQ0FBQyxNQUFvQixFQUFFLE1BQWdCO1FBQ2hFLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDaEMsSUFBSSxDQUFDLENBQUMsY0FBYyxJQUFJLElBQUksQ0FBQyxFQUFFO1lBQzdCLE1BQU0sSUFBSSxLQUFLLENBQUMsNkNBQTZDLENBQUMsQ0FBQztTQUNoRTtRQUNELE9BQU8sTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFTyxLQUFLLENBQUMsV0FBVyxDQUN2QixNQUFvQyxFQUNwQyxJQUF1QixFQUN2QixLQUFhO1FBRWIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNoQyxJQUFJLENBQUMsQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLEVBQUU7WUFDM0IsTUFBTSxJQUFJLEtBQUssQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO1NBQzlEO1FBQ0QsT0FBTyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFRDs7O09BR0c7SUFDSyxLQUFLLENBQUMsT0FBTztRQUNuQixLQUFLLE1BQU0sSUFBSSxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDN0IsTUFBTSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7U0FDckI7UUFDRCxJQUFJLENBQUMseUJBQXlCLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDMUMsQ0FBQztJQUVEOzs7T0FHRztJQUNLLEtBQUssQ0FBQyxTQUFTO1FBQ3JCLEtBQUssTUFBTSxJQUFJLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtZQUM3QixNQUFNLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztTQUN2QjtRQUNELElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUM1QyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssS0FBSyxDQUFDLGNBQWMsQ0FBQyxPQUFnQjtRQUMzQyxNQUFNLG1CQUFtQixHQUFHO1lBQzFCLENBQUMsT0FBTyxDQUFDLHVCQUF1QixDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsYUFBYSxDQUFDO1lBQ2xFLENBQUMsT0FBTyxDQUFDLHdCQUF3QixDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsY0FBYyxDQUFDO1lBQ3BFLENBQUMsT0FBTyxDQUFDLDBCQUEwQixDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsaUJBQWlCLENBQUM7WUFDekUsQ0FBQyxPQUFPLENBQUMscUJBQXFCLEVBQUUsWUFBWSxDQUFDLGdCQUFnQixDQUFDO1lBQzlELENBQUMsT0FBTyxDQUFDLDZCQUE2QixDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsc0JBQXNCLENBQUM7WUFDakYsQ0FBQyxPQUFPLENBQUMsNkJBQTZCLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxXQUFXLENBQUM7U0FDOUQsQ0FBQztRQUNYLE1BQU0sV0FBVyxHQUFHLENBQUMsSUFBUSxFQUFFLE1BQW9CLEVBQUUsRUFBRTtZQUNyRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNsRCxPQUFPLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDMUMsQ0FBQyxDQUFDO1FBQ0YsTUFBTSxRQUFRLEdBQUcsbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNsRixJQUFJLFFBQVEsRUFBRTtZQUNaLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxrQ0FBa0MsQ0FBQyxDQUFDO1lBQ3BFLE1BQU0sSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1NBQ3RCO2FBQU07WUFDTCxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sd0VBQXdFLENBQUMsQ0FBQztZQUMxRyxNQUFNLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUV2Qiw2QkFBNkI7WUFDN0IsS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJO2dCQUMzQixDQUFDLFlBQVksQ0FBQyxhQUFhLEVBQUUsT0FBTyxDQUFDLFlBQVksQ0FBQztnQkFDbEQsQ0FBQyxZQUFZLENBQUMsaUJBQWlCLEVBQUUsT0FBTyxDQUFDLGNBQWMsQ0FBQztnQkFDeEQsQ0FBQyxZQUFZLENBQUMsc0JBQXNCLEVBQUUsT0FBTyxDQUFDLGlCQUFpQixDQUFDO2FBQ3hELEVBQUU7Z0JBQ1YsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUN0QixJQUFJLEVBQ0osTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUNoQyxDQUFDO2FBQ0g7WUFFRCx5QkFBeUI7WUFDekIsTUFBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQXlCLENBQUMsV0FBVyxDQUNoRixPQUFPLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUM5Qyx3QkFBd0IsQ0FDekIsQ0FBQztZQUVGLDRCQUE0QjtZQUM1QixLQUFLLE1BQU0sU0FBUyxJQUFJLE9BQU8sQ0FBQyxtQkFBbUIsRUFBRTtnQkFDbkQsSUFBSSxTQUFTLENBQUMsT0FBTyxFQUFFO29CQUFFLFNBQVM7Z0JBQ2xDLE1BQU0sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLEdBQUcsU0FBUyxDQUFDO2dCQUMxQyxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLGdCQUFnQixFQUFFLFFBQVEsQ0FBQyxRQUFRLEVBQUUsRUFBRSxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDN0Y7WUFFRCxxREFBcUQ7WUFDckQsTUFBTSxtQkFBbUIsR0FBRyxNQUFNLDBCQUEwQixDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUN0RixNQUFNLElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1lBQ2pFLElBQUksQ0FBQyxHQUFHLENBQUMscUNBQXFDLG1CQUFtQixFQUFFLENBQUMsQ0FBQztZQUVyRSxNQUFNLFNBQVMsR0FBRyxNQUFNLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUM3RSxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFFM0UsTUFBTSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7U0FDdEI7UUFFRCxLQUFLLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksbUJBQW1CLEVBQUU7WUFDaEQsTUFBTSxRQUFRLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3RDLE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDcEQsTUFBTSxTQUFTLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ25ELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNoQyxnRkFBZ0Y7WUFDaEYsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFFO2dCQUN0QyxNQUFNLElBQUksS0FBSyxDQUNiLG9CQUFvQixRQUFRLDRDQUE0QyxTQUFTLE9BQU8sT0FBTyxFQUFFLENBQ2xHLENBQUM7YUFDSDtpQkFBTTtnQkFDTCxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsUUFBUSxzQkFBc0IsSUFBSSxDQUFDLElBQUksU0FBUyxPQUFPLEVBQUUsQ0FBQyxDQUFDO2FBQzdFO1NBQ0Y7UUFFRCxPQUFPLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxDQUFDO0lBQ25DLENBQUM7Q0FDRiJ9
|
package/package.json
CHANGED
|
@@ -1,16 +1,66 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/world-state",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"exports": "./dest/index.js",
|
|
3
|
+
"version": "0.8.6",
|
|
5
4
|
"type": "module",
|
|
5
|
+
"exports": "./dest/index.js",
|
|
6
|
+
"typedocOptions": {
|
|
7
|
+
"entryPoints": [
|
|
8
|
+
"./src/index.ts"
|
|
9
|
+
],
|
|
10
|
+
"name": "World State",
|
|
11
|
+
"tsconfig": "./tsconfig.json"
|
|
12
|
+
},
|
|
13
|
+
"scripts": {
|
|
14
|
+
"build": "yarn clean && tsc -b",
|
|
15
|
+
"build:dev": "tsc -b --watch",
|
|
16
|
+
"clean": "rm -rf ./dest .tsbuildinfo",
|
|
17
|
+
"formatting": "run -T prettier --check ./src && run -T eslint ./src",
|
|
18
|
+
"formatting:fix": "run -T prettier -w ./src",
|
|
19
|
+
"test": "NODE_NO_WARNINGS=1 node --experimental-vm-modules $(yarn bin jest) --passWithNoTests"
|
|
20
|
+
},
|
|
21
|
+
"inherits": [
|
|
22
|
+
"../package.common.json"
|
|
23
|
+
],
|
|
24
|
+
"jest": {
|
|
25
|
+
"preset": "ts-jest/presets/default-esm",
|
|
26
|
+
"moduleNameMapper": {
|
|
27
|
+
"^(\\.{1,2}/.*)\\.m?js$": "$1"
|
|
28
|
+
},
|
|
29
|
+
"testRegex": "./src/.*\\.test\\.(js|mjs|ts)$",
|
|
30
|
+
"rootDir": "./src"
|
|
31
|
+
},
|
|
6
32
|
"dependencies": {
|
|
7
|
-
"@aztec/circuits.js": "0.
|
|
8
|
-
"@aztec/foundation": "0.
|
|
9
|
-
"@aztec/merkle-tree": "0.
|
|
10
|
-
"@aztec/types": "0.
|
|
33
|
+
"@aztec/circuits.js": "0.8.6",
|
|
34
|
+
"@aztec/foundation": "0.8.6",
|
|
35
|
+
"@aztec/merkle-tree": "0.8.6",
|
|
36
|
+
"@aztec/types": "0.8.6",
|
|
11
37
|
"levelup": "^5.1.1",
|
|
12
38
|
"lodash.times": "^4.3.2",
|
|
13
39
|
"memdown": "^6.1.1",
|
|
14
40
|
"tslib": "^2.4.0"
|
|
41
|
+
},
|
|
42
|
+
"devDependencies": {
|
|
43
|
+
"@jest/globals": "^29.5.0",
|
|
44
|
+
"@rushstack/eslint-patch": "^1.1.4",
|
|
45
|
+
"@types/jest": "^29.5.0",
|
|
46
|
+
"@types/levelup": "^5.1.2",
|
|
47
|
+
"@types/lodash.times": "^4.3.7",
|
|
48
|
+
"@types/memdown": "^3.0.0",
|
|
49
|
+
"@types/node": "^18.7.23",
|
|
50
|
+
"jest": "^29.5.0",
|
|
51
|
+
"jest-mock-extended": "^3.0.5",
|
|
52
|
+
"memdown": "^6.1.1",
|
|
53
|
+
"ts-jest": "^29.1.0",
|
|
54
|
+
"ts-node": "^10.9.1",
|
|
55
|
+
"typescript": "^5.0.4"
|
|
56
|
+
},
|
|
57
|
+
"files": [
|
|
58
|
+
"dest",
|
|
59
|
+
"src",
|
|
60
|
+
"!*.test.*"
|
|
61
|
+
],
|
|
62
|
+
"types": "./dest/index.d.ts",
|
|
63
|
+
"engines": {
|
|
64
|
+
"node": ">=18"
|
|
15
65
|
}
|
|
16
66
|
}
|
package/src/index.ts
CHANGED
|
@@ -2,7 +2,14 @@ import { Fr } from '@aztec/foundation/fields';
|
|
|
2
2
|
import { LowLeafWitnessData } from '@aztec/merkle-tree';
|
|
3
3
|
import { L2Block, MerkleTreeId, SiblingPath } from '@aztec/types';
|
|
4
4
|
|
|
5
|
-
import {
|
|
5
|
+
import {
|
|
6
|
+
CurrentTreeRoots,
|
|
7
|
+
HandleL2BlockResult,
|
|
8
|
+
LeafData,
|
|
9
|
+
MerkleTreeDb,
|
|
10
|
+
MerkleTreeOperations,
|
|
11
|
+
TreeInfo,
|
|
12
|
+
} from '../index.js';
|
|
6
13
|
|
|
7
14
|
/**
|
|
8
15
|
* Wraps a MerkleTreeDbOperations to call all functions with a preset includeUncommitted flag.
|
|
@@ -142,9 +149,9 @@ export class MerkleTreeOperationsFacade implements MerkleTreeOperations {
|
|
|
142
149
|
/**
|
|
143
150
|
* Handles a single L2 block (i.e. Inserts the new commitments into the merkle tree).
|
|
144
151
|
* @param block - The L2 block to handle.
|
|
145
|
-
* @returns
|
|
152
|
+
* @returns Whether the block handled was produced by this same node.
|
|
146
153
|
*/
|
|
147
|
-
public handleL2Block(block: L2Block): Promise<
|
|
154
|
+
public handleL2Block(block: L2Block): Promise<HandleL2BlockResult> {
|
|
148
155
|
return this.trees.handleL2Block(block);
|
|
149
156
|
}
|
|
150
157
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* World State
|
|
2
|
+
* World State synchronizer configuration values.
|
|
3
3
|
*/
|
|
4
4
|
export interface WorldStateConfig {
|
|
5
5
|
/**
|
|
@@ -14,8 +14,8 @@ export interface WorldStateConfig {
|
|
|
14
14
|
}
|
|
15
15
|
|
|
16
16
|
/**
|
|
17
|
-
* Returns the configuration values for the world state
|
|
18
|
-
* @returns The configuration values for the world state
|
|
17
|
+
* Returns the configuration values for the world state synchronizer.
|
|
18
|
+
* @returns The configuration values for the world state synchronizer.
|
|
19
19
|
*/
|
|
20
20
|
export function getConfigEnvVars(): WorldStateConfig {
|
|
21
21
|
const { WS_BLOCK_CHECK_INTERVAL_MS, WS_L2_BLOCK_QUEUE_SIZE } = process.env;
|
|
@@ -1,18 +1,23 @@
|
|
|
1
1
|
import { SerialQueue } from '@aztec/foundation/fifo';
|
|
2
2
|
import { createDebugLogger } from '@aztec/foundation/log';
|
|
3
|
+
import { elapsed } from '@aztec/foundation/timer';
|
|
3
4
|
import { L2Block, L2BlockDownloader, L2BlockSource } from '@aztec/types';
|
|
4
5
|
|
|
5
|
-
import {
|
|
6
|
+
import { LevelUp } from 'levelup';
|
|
7
|
+
|
|
8
|
+
import { HandleL2BlockResult, MerkleTreeOperations, MerkleTrees } from '../index.js';
|
|
6
9
|
import { MerkleTreeOperationsFacade } from '../merkle-tree/merkle_tree_operations_facade.js';
|
|
7
10
|
import { WorldStateConfig } from './config.js';
|
|
8
|
-
import { WorldStateRunningState, WorldStateStatus,
|
|
11
|
+
import { WorldStateRunningState, WorldStateStatus, WorldStateSynchronizer } from './world_state_synchronizer.js';
|
|
12
|
+
|
|
13
|
+
const DB_KEY_BLOCK_NUMBER = 'latestBlockNumber';
|
|
9
14
|
|
|
10
15
|
/**
|
|
11
|
-
*
|
|
12
|
-
* The
|
|
16
|
+
* Synchronizes the world state with the L2 blocks from a L2BlockSource.
|
|
17
|
+
* The synchronizer will download the L2 blocks from the L2BlockSource and insert the new commitments into the merkle
|
|
13
18
|
* tree.
|
|
14
19
|
*/
|
|
15
|
-
export class
|
|
20
|
+
export class ServerWorldStateSynchronizer implements WorldStateSynchronizer {
|
|
16
21
|
private currentL2BlockNum = 0;
|
|
17
22
|
private latestBlockNumberAtStart = 0;
|
|
18
23
|
|
|
@@ -24,7 +29,8 @@ export class ServerWorldStateSynchroniser implements WorldStateSynchroniser {
|
|
|
24
29
|
private runningPromise: Promise<void> = Promise.resolve();
|
|
25
30
|
private currentState: WorldStateRunningState = WorldStateRunningState.IDLE;
|
|
26
31
|
|
|
27
|
-
constructor(
|
|
32
|
+
private constructor(
|
|
33
|
+
private db: LevelUp,
|
|
28
34
|
private merkleTreeDb: MerkleTrees,
|
|
29
35
|
private l2BlockSource: L2BlockSource,
|
|
30
36
|
config: WorldStateConfig,
|
|
@@ -45,9 +51,25 @@ export class ServerWorldStateSynchroniser implements WorldStateSynchroniser {
|
|
|
45
51
|
return new MerkleTreeOperationsFacade(this.merkleTreeDb, false);
|
|
46
52
|
}
|
|
47
53
|
|
|
54
|
+
public static async new(
|
|
55
|
+
db: LevelUp,
|
|
56
|
+
merkleTreeDb: MerkleTrees,
|
|
57
|
+
l2BlockSource: L2BlockSource,
|
|
58
|
+
config: WorldStateConfig,
|
|
59
|
+
log = createDebugLogger('aztec:world_state'),
|
|
60
|
+
) {
|
|
61
|
+
const server = new ServerWorldStateSynchronizer(db, merkleTreeDb, l2BlockSource, config, log);
|
|
62
|
+
await server.#init();
|
|
63
|
+
return server;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
async #init() {
|
|
67
|
+
await this.restoreCurrentL2BlockNumber();
|
|
68
|
+
}
|
|
69
|
+
|
|
48
70
|
public async start() {
|
|
49
71
|
if (this.currentState === WorldStateRunningState.STOPPED) {
|
|
50
|
-
throw new Error('
|
|
72
|
+
throw new Error('Synchronizer already stopped');
|
|
51
73
|
}
|
|
52
74
|
if (this.currentState !== WorldStateRunningState.IDLE) {
|
|
53
75
|
return this.syncPromise;
|
|
@@ -92,6 +114,7 @@ export class ServerWorldStateSynchroniser implements WorldStateSynchroniser {
|
|
|
92
114
|
await this.jobQueue.cancel();
|
|
93
115
|
await this.merkleTreeDb.stop();
|
|
94
116
|
await this.runningPromise;
|
|
117
|
+
await this.commitCurrentL2BlockNumber();
|
|
95
118
|
this.setCurrentState(WorldStateRunningState.STOPPED);
|
|
96
119
|
}
|
|
97
120
|
|
|
@@ -151,15 +174,23 @@ export class ServerWorldStateSynchroniser implements WorldStateSynchroniser {
|
|
|
151
174
|
// This request for blocks will timeout after 1 second if no blocks are received
|
|
152
175
|
const blocks = await this.l2BlockDownloader.getL2Blocks(1);
|
|
153
176
|
await this.handleL2Blocks(blocks);
|
|
177
|
+
await this.commitCurrentL2BlockNumber();
|
|
154
178
|
}
|
|
155
179
|
|
|
156
180
|
/**
|
|
157
181
|
* Handles a list of L2 blocks (i.e. Inserts the new commitments into the merkle tree).
|
|
158
182
|
* @param l2Blocks - The L2 blocks to handle.
|
|
183
|
+
* @returns Whether the block handled was produced by this same node.
|
|
159
184
|
*/
|
|
160
185
|
private async handleL2Blocks(l2Blocks: L2Block[]) {
|
|
161
186
|
for (const l2Block of l2Blocks) {
|
|
162
|
-
await this.handleL2Block(l2Block);
|
|
187
|
+
const [time, result] = await elapsed(() => this.handleL2Block(l2Block));
|
|
188
|
+
this.log(`Handled new L2 block`, {
|
|
189
|
+
eventName: 'l2-block-handled',
|
|
190
|
+
duration: time.ms(),
|
|
191
|
+
isBlockOurs: result.isBlockOurs,
|
|
192
|
+
...l2Block.getStats(),
|
|
193
|
+
});
|
|
163
194
|
}
|
|
164
195
|
}
|
|
165
196
|
|
|
@@ -167,8 +198,8 @@ export class ServerWorldStateSynchroniser implements WorldStateSynchroniser {
|
|
|
167
198
|
* Handles a single L2 block (i.e. Inserts the new commitments into the merkle tree).
|
|
168
199
|
* @param l2Block - The L2 block to handle.
|
|
169
200
|
*/
|
|
170
|
-
private async handleL2Block(l2Block: L2Block) {
|
|
171
|
-
await this.merkleTreeDb.handleL2Block(l2Block);
|
|
201
|
+
private async handleL2Block(l2Block: L2Block): Promise<HandleL2BlockResult> {
|
|
202
|
+
const result = await this.merkleTreeDb.handleL2Block(l2Block);
|
|
172
203
|
this.currentL2BlockNum = l2Block.number;
|
|
173
204
|
if (
|
|
174
205
|
this.currentState === WorldStateRunningState.SYNCHING &&
|
|
@@ -179,6 +210,7 @@ export class ServerWorldStateSynchroniser implements WorldStateSynchroniser {
|
|
|
179
210
|
this.syncResolve();
|
|
180
211
|
}
|
|
181
212
|
}
|
|
213
|
+
return result;
|
|
182
214
|
}
|
|
183
215
|
|
|
184
216
|
/**
|
|
@@ -189,4 +221,22 @@ export class ServerWorldStateSynchroniser implements WorldStateSynchroniser {
|
|
|
189
221
|
this.currentState = newState;
|
|
190
222
|
this.log(`Moved to state ${WorldStateRunningState[this.currentState]}`);
|
|
191
223
|
}
|
|
224
|
+
|
|
225
|
+
private async commitCurrentL2BlockNumber() {
|
|
226
|
+
const hex = this.currentL2BlockNum.toString(16);
|
|
227
|
+
const encoded = Buffer.from(hex.length % 2 === 1 ? '0' + hex : hex, 'hex');
|
|
228
|
+
|
|
229
|
+
await this.db.put(DB_KEY_BLOCK_NUMBER, encoded);
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
private async restoreCurrentL2BlockNumber() {
|
|
233
|
+
try {
|
|
234
|
+
const encoded: Buffer = await this.db.get(DB_KEY_BLOCK_NUMBER);
|
|
235
|
+
this.currentL2BlockNum = parseInt(encoded.toString('hex'), 16);
|
|
236
|
+
this.log.debug(`Restored current L2 block number ${this.currentL2BlockNum} from db`);
|
|
237
|
+
} catch (err) {
|
|
238
|
+
this.log.debug('No current L2 block number found in db, starting from 0');
|
|
239
|
+
this.currentL2BlockNum = 0;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
192
242
|
}
|