@aztec/world-state 0.1.0-alpha22 → 0.1.0-alpha39
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/.tsbuildinfo +1 -1
- package/dest/index.d.ts +1 -0
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +2 -1
- package/dest/merkle-tree/merkle_tree_operations_facade.d.ts +7 -5
- package/dest/merkle-tree/merkle_tree_operations_facade.d.ts.map +1 -1
- package/dest/merkle-tree/merkle_tree_operations_facade.js +6 -5
- package/dest/synchroniser/config.d.ts +1 -1
- package/dest/synchroniser/config.d.ts.map +1 -1
- package/dest/synchroniser/config.js +3 -3
- package/dest/synchroniser/server_world_state_synchroniser.d.ts +3 -19
- package/dest/synchroniser/server_world_state_synchroniser.d.ts.map +1 -1
- package/dest/synchroniser/server_world_state_synchroniser.js +11 -23
- package/dest/synchroniser/server_world_state_synchroniser.test.js +11 -16
- package/dest/synchroniser/world_state_synchroniser.d.ts +24 -0
- package/dest/synchroniser/world_state_synchroniser.d.ts.map +1 -1
- package/dest/synchroniser/world_state_synchroniser.js +1 -1
- package/dest/utils.d.ts +6 -0
- package/dest/utils.d.ts.map +1 -1
- package/dest/utils.js +11 -2
- package/dest/world-state-db/index.d.ts +13 -7
- package/dest/world-state-db/index.d.ts.map +1 -1
- package/dest/world-state-db/index.js +2 -2
- package/dest/world-state-db/merkle_trees.d.ts +10 -6
- package/dest/world-state-db/merkle_trees.d.ts.map +1 -1
- package/dest/world-state-db/merkle_trees.js +44 -52
- package/package.json +6 -5
- package/src/index.ts +1 -0
- package/src/merkle-tree/merkle_tree_operations_facade.ts +10 -7
- package/src/synchroniser/config.ts +3 -3
- package/src/synchroniser/server_world_state_synchroniser.test.ts +21 -15
- package/src/synchroniser/server_world_state_synchroniser.ts +17 -23
- package/src/synchroniser/world_state_synchroniser.ts +30 -0
- package/src/utils.ts +13 -2
- package/src/world-state-db/index.ts +13 -8
- package/src/world-state-db/merkle_trees.ts +54 -77
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
import { BaseRollupInputs, CONTRACT_TREE_HEIGHT,
|
|
2
|
-
import {
|
|
3
|
-
import { INITIAL_NULLIFIER_TREE_SIZE, } from './index.js';
|
|
4
|
-
import { MerkleTreeOperationsFacade } from '../merkle-tree/merkle_tree_operations_facade.js';
|
|
5
|
-
import { MerkleTreeId, merkleTreeIds } from '@aztec/types';
|
|
1
|
+
import { BaseRollupInputs, CONTRACT_TREE_HEIGHT, CircuitsWasm, Fr, GlobalVariables, HISTORIC_BLOCKS_TREE_HEIGHT, L1_TO_L2_MSG_TREE_HEIGHT, NULLIFIER_TREE_HEIGHT, PRIVATE_DATA_TREE_HEIGHT, PUBLIC_DATA_TREE_HEIGHT, } from '@aztec/circuits.js';
|
|
2
|
+
import { computeBlockHashWithGlobals } from '@aztec/circuits.js/abis';
|
|
6
3
|
import { SerialQueue } from '@aztec/foundation/fifo';
|
|
7
4
|
import { createDebugLogger } from '@aztec/foundation/log';
|
|
5
|
+
import { Pedersen, SparseTree, StandardIndexedTree, StandardTree, newTree, } from '@aztec/merkle-tree';
|
|
6
|
+
import { MerkleTreeId, merkleTreeIds } from '@aztec/types';
|
|
7
|
+
import { MerkleTreeOperationsFacade } from '../merkle-tree/merkle_tree_operations_facade.js';
|
|
8
|
+
import { INITIAL_NULLIFIER_TREE_SIZE, } from './index.js';
|
|
8
9
|
/**
|
|
9
10
|
* A convenience class for managing multiple merkle trees.
|
|
10
11
|
*/
|
|
@@ -23,28 +24,16 @@ export class MerkleTrees {
|
|
|
23
24
|
const wasm = optionalWasm ?? (await CircuitsWasm.get());
|
|
24
25
|
const hasher = new Pedersen(wasm);
|
|
25
26
|
const contractTree = await newTree(StandardTree, this.db, hasher, `${MerkleTreeId[MerkleTreeId.CONTRACT_TREE]}`, CONTRACT_TREE_HEIGHT);
|
|
26
|
-
const contractTreeRootsTree = await newTree(StandardTree, this.db, hasher, `${MerkleTreeId[MerkleTreeId.CONTRACT_TREE_ROOTS_TREE]}`, CONTRACT_TREE_ROOTS_TREE_HEIGHT);
|
|
27
27
|
const nullifierTree = await newTree(StandardIndexedTree, this.db, hasher, `${MerkleTreeId[MerkleTreeId.NULLIFIER_TREE]}`, NULLIFIER_TREE_HEIGHT, INITIAL_NULLIFIER_TREE_SIZE);
|
|
28
28
|
const privateDataTree = await newTree(StandardTree, this.db, hasher, `${MerkleTreeId[MerkleTreeId.PRIVATE_DATA_TREE]}`, PRIVATE_DATA_TREE_HEIGHT);
|
|
29
|
-
const privateDataTreeRootsTree = await newTree(StandardTree, this.db, hasher, `${MerkleTreeId[MerkleTreeId.PRIVATE_DATA_TREE_ROOTS_TREE]}`, PRIVATE_DATA_TREE_ROOTS_TREE_HEIGHT);
|
|
30
29
|
const publicDataTree = await newTree(SparseTree, this.db, hasher, `${MerkleTreeId[MerkleTreeId.PUBLIC_DATA_TREE]}`, PUBLIC_DATA_TREE_HEIGHT);
|
|
31
30
|
const l1Tol2MessagesTree = await newTree(StandardTree, this.db, hasher, `${MerkleTreeId[MerkleTreeId.L1_TO_L2_MESSAGES_TREE]}`, L1_TO_L2_MSG_TREE_HEIGHT);
|
|
32
|
-
const
|
|
33
|
-
this.trees = [
|
|
34
|
-
contractTree,
|
|
35
|
-
contractTreeRootsTree,
|
|
36
|
-
nullifierTree,
|
|
37
|
-
privateDataTree,
|
|
38
|
-
privateDataTreeRootsTree,
|
|
39
|
-
publicDataTree,
|
|
40
|
-
l1Tol2MessagesTree,
|
|
41
|
-
l1Tol2MessagesRootsTree,
|
|
42
|
-
];
|
|
31
|
+
const historicBlocksTree = await newTree(StandardTree, this.db, hasher, `${MerkleTreeId[MerkleTreeId.BLOCKS_TREE]}`, HISTORIC_BLOCKS_TREE_HEIGHT);
|
|
32
|
+
this.trees = [contractTree, nullifierTree, privateDataTree, publicDataTree, l1Tol2MessagesTree, historicBlocksTree];
|
|
43
33
|
this.jobQueue.start();
|
|
44
|
-
// The
|
|
45
|
-
await this.
|
|
46
|
-
|
|
47
|
-
await Promise.all(historicRootsTrees.map(tree => tree.commit()));
|
|
34
|
+
// The first leaf in the blocks tree contains the empty roots of the other trees and empty global variables.
|
|
35
|
+
await this.updateHistoricBlocksTree(GlobalVariables.empty(), true);
|
|
36
|
+
await historicBlocksTree.commit();
|
|
48
37
|
}
|
|
49
38
|
/**
|
|
50
39
|
* Method to asynchronously create and initialise a MerkleTrees instance.
|
|
@@ -80,17 +69,12 @@ export class MerkleTrees {
|
|
|
80
69
|
/**
|
|
81
70
|
* Inserts into the roots trees (CONTRACT_TREE_ROOTS_TREE, PRIVATE_DATA_TREE_ROOTS_TREE, L1_TO_L2_MESSAGES_TREE_ROOTS_TREE)
|
|
82
71
|
* the current roots of the corresponding trees (CONTRACT_TREE, PRIVATE_DATA_TREE, L1_TO_L2_MESSAGES_TREE).
|
|
72
|
+
* @param globals - The global variables to use for hashing.
|
|
83
73
|
* @param includeUncommitted - Indicates whether to include uncommitted data.
|
|
84
74
|
*/
|
|
85
|
-
async
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
[MerkleTreeId.CONTRACT_TREE, MerkleTreeId.CONTRACT_TREE_ROOTS_TREE],
|
|
89
|
-
[MerkleTreeId.L1_TO_L2_MESSAGES_TREE, MerkleTreeId.L1_TO_L2_MESSAGES_ROOTS_TREE],
|
|
90
|
-
]) {
|
|
91
|
-
const newTreeInfo = await this.getTreeInfo(newTree, includeUncommitted);
|
|
92
|
-
await this.appendLeaves(rootTree, [newTreeInfo.root]);
|
|
93
|
-
}
|
|
75
|
+
async updateHistoricBlocksTree(globals, includeUncommitted) {
|
|
76
|
+
const blockHash = await this.getCurrentBlockHash(globals, includeUncommitted);
|
|
77
|
+
await this.appendLeaves(MerkleTreeId.BLOCKS_TREE, [blockHash.toBuffer()]);
|
|
94
78
|
}
|
|
95
79
|
/**
|
|
96
80
|
* Gets the tree info for the specified tree.
|
|
@@ -106,19 +90,31 @@ export class MerkleTrees {
|
|
|
106
90
|
* @param includeUncommitted - Indicates whether to include uncommitted data.
|
|
107
91
|
* @returns The current roots of the trees.
|
|
108
92
|
*/
|
|
109
|
-
|
|
110
|
-
const roots =
|
|
93
|
+
getTreeRoots(includeUncommitted) {
|
|
94
|
+
const roots = this.getAllTreeRoots(includeUncommitted);
|
|
95
|
+
return {
|
|
96
|
+
privateDataTreeRoot: roots[0],
|
|
97
|
+
nullifierTreeRoot: roots[1],
|
|
98
|
+
contractDataTreeRoot: roots[2],
|
|
99
|
+
l1Tol2MessagesTreeRoot: roots[3],
|
|
100
|
+
publicDataTreeRoot: roots[4],
|
|
101
|
+
blocksTreeRoot: roots[5],
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
async getCurrentBlockHash(globals, includeUncommitted) {
|
|
105
|
+
const roots = this.getAllTreeRoots(includeUncommitted).map(root => Fr.fromBuffer(root));
|
|
106
|
+
const wasm = await CircuitsWasm.get();
|
|
107
|
+
return computeBlockHashWithGlobals(wasm, globals, roots[0], roots[1], roots[2], roots[3], roots[4]);
|
|
108
|
+
}
|
|
109
|
+
getAllTreeRoots(includeUncommitted) {
|
|
110
|
+
return [
|
|
111
111
|
MerkleTreeId.PRIVATE_DATA_TREE,
|
|
112
|
+
MerkleTreeId.NULLIFIER_TREE,
|
|
112
113
|
MerkleTreeId.CONTRACT_TREE,
|
|
113
114
|
MerkleTreeId.L1_TO_L2_MESSAGES_TREE,
|
|
114
|
-
MerkleTreeId.
|
|
115
|
+
MerkleTreeId.PUBLIC_DATA_TREE,
|
|
116
|
+
MerkleTreeId.BLOCKS_TREE,
|
|
115
117
|
].map(tree => this.trees[tree].getRoot(includeUncommitted));
|
|
116
|
-
return {
|
|
117
|
-
privateDataTreeRoot: roots[0],
|
|
118
|
-
contractDataTreeRoot: roots[1],
|
|
119
|
-
l1Tol2MessagesTreeRoot: roots[2],
|
|
120
|
-
nullifierTreeRoot: roots[3],
|
|
121
|
-
};
|
|
122
118
|
}
|
|
123
119
|
/**
|
|
124
120
|
* Gets the value at the given index.
|
|
@@ -326,10 +322,8 @@ export class MerkleTrees {
|
|
|
326
322
|
compareRoot(l2Block.endNullifierTreeSnapshot.root, MerkleTreeId.NULLIFIER_TREE),
|
|
327
323
|
compareRoot(l2Block.endPrivateDataTreeSnapshot.root, MerkleTreeId.PRIVATE_DATA_TREE),
|
|
328
324
|
compareRoot(l2Block.endPublicDataTreeRoot, MerkleTreeId.PUBLIC_DATA_TREE),
|
|
329
|
-
compareRoot(l2Block.endTreeOfHistoricContractTreeRootsSnapshot.root, MerkleTreeId.CONTRACT_TREE_ROOTS_TREE),
|
|
330
|
-
compareRoot(l2Block.endTreeOfHistoricPrivateDataTreeRootsSnapshot.root, MerkleTreeId.PRIVATE_DATA_TREE_ROOTS_TREE),
|
|
331
325
|
compareRoot(l2Block.endL1ToL2MessageTreeSnapshot.root, MerkleTreeId.L1_TO_L2_MESSAGES_TREE),
|
|
332
|
-
compareRoot(l2Block.
|
|
326
|
+
compareRoot(l2Block.endHistoricBlocksTreeSnapshot.root, MerkleTreeId.BLOCKS_TREE),
|
|
333
327
|
];
|
|
334
328
|
const ourBlock = rootChecks.every(x => x);
|
|
335
329
|
if (ourBlock) {
|
|
@@ -339,6 +333,7 @@ export class MerkleTrees {
|
|
|
339
333
|
else {
|
|
340
334
|
this.log(`Block ${l2Block.number} is not ours, rolling back world state and committing state from chain..`);
|
|
341
335
|
await this._rollback();
|
|
336
|
+
// Sync the append only trees
|
|
342
337
|
for (const [tree, leaves] of [
|
|
343
338
|
[MerkleTreeId.CONTRACT_TREE, l2Block.newContracts],
|
|
344
339
|
[MerkleTreeId.PRIVATE_DATA_TREE, l2Block.newCommitments],
|
|
@@ -346,21 +341,18 @@ export class MerkleTrees {
|
|
|
346
341
|
]) {
|
|
347
342
|
await this._appendLeaves(tree, leaves.map(fr => fr.toBuffer()));
|
|
348
343
|
}
|
|
344
|
+
// Sync the indexed trees
|
|
349
345
|
await this.trees[MerkleTreeId.NULLIFIER_TREE].batchInsert(l2Block.newNullifiers.map(fr => fr.toBuffer()), BaseRollupInputs.NULLIFIER_SUBTREE_HEIGHT);
|
|
346
|
+
// Sync the public data tree
|
|
350
347
|
for (const dataWrite of l2Block.newPublicDataWrites) {
|
|
351
348
|
if (dataWrite.isEmpty())
|
|
352
349
|
continue;
|
|
353
350
|
const { newValue, leafIndex } = dataWrite;
|
|
354
351
|
await this._updateLeaf(MerkleTreeId.PUBLIC_DATA_TREE, newValue.toBuffer(), leafIndex.value);
|
|
355
352
|
}
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
[MerkleTreeId.L1_TO_L2_MESSAGES_TREE, MerkleTreeId.L1_TO_L2_MESSAGES_ROOTS_TREE],
|
|
360
|
-
]) {
|
|
361
|
-
const newTreeRoot = this.trees[newTree].getRoot(true);
|
|
362
|
-
await this._appendLeaves(rootTree, [newTreeRoot]);
|
|
363
|
-
}
|
|
353
|
+
// Sync and add the block to the historic blocks tree
|
|
354
|
+
const blockHash = await this.getCurrentBlockHash(l2Block.globalVariables, true);
|
|
355
|
+
await this._appendLeaves(MerkleTreeId.BLOCKS_TREE, [blockHash.toBuffer()]);
|
|
364
356
|
await this._commit();
|
|
365
357
|
}
|
|
366
358
|
for (const treeId of merkleTreeIds()) {
|
|
@@ -369,4 +361,4 @@ export class MerkleTrees {
|
|
|
369
361
|
}
|
|
370
362
|
}
|
|
371
363
|
}
|
|
372
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVya2xlX3RyZWVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3dvcmxkLXN0YXRlLWRiL21lcmtsZV90cmVlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLG9CQUFvQixFQUNwQiwrQkFBK0IsRUFDL0IsWUFBWSxFQUVaLDhCQUE4QixFQUM5Qix3QkFBd0IsRUFDeEIscUJBQXFCLEVBQ3JCLHdCQUF3QixFQUN4QixtQ0FBbUMsRUFDbkMsdUJBQXVCLEdBQ3hCLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUtMLFFBQVEsRUFFUixVQUFVLEVBQ1YsbUJBQW1CLEVBQ25CLFlBQVksRUFFWixPQUFPLEdBQ1IsTUFBTSxvQkFBb0IsQ0FBQztBQUU1QixPQUFPLEVBRUwsMkJBQTJCLEdBTTVCLE1BQU0sWUFBWSxDQUFDO0FBQ3BCLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLGlEQUFpRCxDQUFDO0FBQzdGLE9BQU8sRUFBVyxZQUFZLEVBQUUsYUFBYSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUcxRDs7R0FFRztBQUNILE1BQU0sT0FBTyxXQUFXO0lBSXRCLFlBQW9CLEVBQW1CLEVBQVUsTUFBTSxpQkFBaUIsQ0FBQyxvQkFBb0IsQ0FBQztRQUExRSxPQUFFLEdBQUYsRUFBRSxDQUFpQjtRQUFVLFFBQUcsR0FBSCxHQUFHLENBQTBDO1FBSHRGLFVBQUssR0FBd0MsRUFBRSxDQUFDO1FBQ2hELGFBQVEsR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO0lBRTRELENBQUM7SUFFbEc7OztPQUdHO0lBQ0ksS0FBSyxDQUFDLElBQUksQ0FBQyxZQUEwQjtRQUMxQyxNQUFNLElBQUksR0FBRyxZQUFZLElBQUksQ0FBQyxNQUFN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
|
|
364
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVya2xlX3RyZWVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3dvcmxkLXN0YXRlLWRiL21lcmtsZV90cmVlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLG9CQUFvQixFQUNwQixZQUFZLEVBQ1osRUFBRSxFQUNGLGVBQWUsRUFDZiwyQkFBMkIsRUFDM0Isd0JBQXdCLEVBQ3hCLHFCQUFxQixFQUNyQix3QkFBd0IsRUFDeEIsdUJBQXVCLEdBQ3hCLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDdEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRTFELE9BQU8sRUFLTCxRQUFRLEVBQ1IsVUFBVSxFQUNWLG1CQUFtQixFQUNuQixZQUFZLEVBRVosT0FBTyxHQUNSLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFXLFlBQVksRUFBZSxhQUFhLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFJakYsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0saURBQWlELENBQUM7QUFDN0YsT0FBTyxFQUVMLDJCQUEyQixHQU01QixNQUFNLFlBQVksQ0FBQztBQUVwQjs7R0FFRztBQUNILE1BQU0sT0FBTyxXQUFXO0lBSXRCLFlBQW9CLEVBQW1CLEVBQVUsTUFBTSxpQkFBaUIsQ0FBQyxvQkFBb0IsQ0FBQztRQUExRSxPQUFFLEdBQUYsRUFBRSxDQUFpQjtRQUFVLFFBQUcsR0FBSCxHQUFHLENBQTBDO1FBSHRGLFVBQUssR0FBd0MsRUFBRSxDQUFDO1FBQ2hELGFBQVEsR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO0lBRTRELENBQUM7SUFFbEc7OztPQUdHO0lBQ0ksS0FBSyxDQUFDLElBQUksQ0FBQyxZQUEwQjtR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
|
package/package.json
CHANGED
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/world-state",
|
|
3
|
-
"version": "0.1.0-
|
|
3
|
+
"version": "0.1.0-alpha39",
|
|
4
4
|
"exports": "./dest/index.js",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"dependencies": {
|
|
7
|
-
"@aztec/circuits.js": "0.1.0-
|
|
8
|
-
"@aztec/foundation": "0.1.0-
|
|
9
|
-
"@aztec/merkle-tree": "0.1.0-
|
|
10
|
-
"@aztec/types": "0.1.0-
|
|
7
|
+
"@aztec/circuits.js": "0.1.0-alpha39",
|
|
8
|
+
"@aztec/foundation": "0.1.0-alpha39",
|
|
9
|
+
"@aztec/merkle-tree": "0.1.0-alpha39",
|
|
10
|
+
"@aztec/types": "0.1.0-alpha39",
|
|
11
11
|
"levelup": "^5.1.1",
|
|
12
|
+
"lodash.times": "^4.3.2",
|
|
12
13
|
"memdown": "^6.1.1",
|
|
13
14
|
"tslib": "^2.4.0"
|
|
14
15
|
}
|
package/src/index.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
1
|
+
import { GlobalVariables } from '@aztec/circuits.js';
|
|
2
|
+
import { LowLeafWitnessData } from '@aztec/merkle-tree';
|
|
3
|
+
import { L2Block, MerkleTreeId, SiblingPath } from '@aztec/types';
|
|
4
|
+
|
|
5
|
+
import { CurrentTreeRoots, LeafData, MerkleTreeDb, MerkleTreeOperations, TreeInfo } from '../index.js';
|
|
4
6
|
|
|
5
7
|
/**
|
|
6
8
|
* Wraps a MerkleTreeDbOperations to call all functions with a preset includeUncommitted flag.
|
|
@@ -22,8 +24,8 @@ export class MerkleTreeOperationsFacade implements MerkleTreeOperations {
|
|
|
22
24
|
* Get the current roots of the commitment trees.
|
|
23
25
|
* @returns The current roots of the trees.
|
|
24
26
|
*/
|
|
25
|
-
|
|
26
|
-
return this.trees.
|
|
27
|
+
getTreeRoots(): CurrentTreeRoots {
|
|
28
|
+
return this.trees.getTreeRoots(this.includeUncommitted);
|
|
27
29
|
}
|
|
28
30
|
|
|
29
31
|
/**
|
|
@@ -114,10 +116,11 @@ export class MerkleTreeOperationsFacade implements MerkleTreeOperations {
|
|
|
114
116
|
/**
|
|
115
117
|
* Inserts into the roots trees (CONTRACT_TREE_ROOTS_TREE, PRIVATE_DATA_TREE_ROOTS_TREE)
|
|
116
118
|
* the current roots of the corresponding trees (CONTRACT_TREE, PRIVATE_DATA_TREE).
|
|
119
|
+
* @param globalVariables - The current global variables to include in the block hash.
|
|
117
120
|
* @returns Empty promise.
|
|
118
121
|
*/
|
|
119
|
-
public
|
|
120
|
-
return this.trees.
|
|
122
|
+
public updateHistoricBlocksTree(globalVariables: GlobalVariables): Promise<void> {
|
|
123
|
+
return this.trees.updateHistoricBlocksTree(globalVariables, this.includeUncommitted);
|
|
121
124
|
}
|
|
122
125
|
|
|
123
126
|
/**
|
|
@@ -5,7 +5,7 @@ export interface WorldStateConfig {
|
|
|
5
5
|
/**
|
|
6
6
|
* The frequency in which to check.
|
|
7
7
|
*/
|
|
8
|
-
|
|
8
|
+
worldStateBlockCheckIntervalMS: number;
|
|
9
9
|
|
|
10
10
|
/**
|
|
11
11
|
* Size of queue of L2 blocks to store.
|
|
@@ -18,9 +18,9 @@ export interface WorldStateConfig {
|
|
|
18
18
|
* @returns The configuration values for the world state synchroniser.
|
|
19
19
|
*/
|
|
20
20
|
export function getConfigEnvVars(): WorldStateConfig {
|
|
21
|
-
const {
|
|
21
|
+
const { WS_BLOCK_CHECK_INTERVAL_MS, WS_L2_BLOCK_QUEUE_SIZE } = process.env;
|
|
22
22
|
const envVars: WorldStateConfig = {
|
|
23
|
-
|
|
23
|
+
worldStateBlockCheckIntervalMS: WS_BLOCK_CHECK_INTERVAL_MS ? +WS_BLOCK_CHECK_INTERVAL_MS : 100,
|
|
24
24
|
l2QueueSize: WS_L2_BLOCK_QUEUE_SIZE ? +WS_L2_BLOCK_QUEUE_SIZE : 1000,
|
|
25
25
|
};
|
|
26
26
|
return envVars;
|
|
@@ -1,24 +1,34 @@
|
|
|
1
1
|
import {
|
|
2
2
|
AppendOnlyTreeSnapshot,
|
|
3
3
|
CircuitsWasm,
|
|
4
|
+
Fr,
|
|
4
5
|
GlobalVariables,
|
|
5
6
|
MAX_NEW_COMMITMENTS_PER_TX,
|
|
6
7
|
MAX_NEW_CONTRACTS_PER_TX,
|
|
8
|
+
MAX_NEW_L2_TO_L1_MSGS_PER_CALL,
|
|
7
9
|
MAX_NEW_NULLIFIERS_PER_TX,
|
|
8
10
|
MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX,
|
|
9
|
-
MAX_NEW_L2_TO_L1_MSGS_PER_CALL,
|
|
10
11
|
NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP,
|
|
11
12
|
} from '@aztec/circuits.js';
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
13
|
+
import { createDebugLogger } from '@aztec/foundation/log';
|
|
14
|
+
import { sleep } from '@aztec/foundation/sleep';
|
|
15
|
+
import { INITIAL_LEAF, Pedersen } from '@aztec/merkle-tree';
|
|
16
|
+
import {
|
|
17
|
+
ContractData,
|
|
18
|
+
L2Block,
|
|
19
|
+
L2BlockL2Logs,
|
|
20
|
+
L2BlockSource,
|
|
21
|
+
MerkleTreeId,
|
|
22
|
+
PublicDataWrite,
|
|
23
|
+
SiblingPath,
|
|
24
|
+
} from '@aztec/types';
|
|
25
|
+
|
|
14
26
|
import { jest } from '@jest/globals';
|
|
27
|
+
import times from 'lodash.times';
|
|
28
|
+
|
|
15
29
|
import { MerkleTreeDb } from '../index.js';
|
|
16
30
|
import { ServerWorldStateSynchroniser } from './server_world_state_synchroniser.js';
|
|
17
31
|
import { WorldStateRunningState } from './world_state_synchroniser.js';
|
|
18
|
-
import { Fr } from '@aztec/foundation/fields';
|
|
19
|
-
import { sleep } from '@aztec/foundation/sleep';
|
|
20
|
-
import { createLogger } from '@aztec/foundation/log';
|
|
21
|
-
import times from 'lodash.times';
|
|
22
32
|
|
|
23
33
|
/**
|
|
24
34
|
* Generic mock implementation.
|
|
@@ -65,19 +75,15 @@ const getMockBlock = (blockNumber: number, newContractsCommitments?: Buffer[]) =
|
|
|
65
75
|
startPrivateDataTreeSnapshot: getMockTreeSnapshot(),
|
|
66
76
|
startNullifierTreeSnapshot: getMockTreeSnapshot(),
|
|
67
77
|
startContractTreeSnapshot: getMockTreeSnapshot(),
|
|
68
|
-
startTreeOfHistoricPrivateDataTreeRootsSnapshot: getMockTreeSnapshot(),
|
|
69
|
-
startTreeOfHistoricContractTreeRootsSnapshot: getMockTreeSnapshot(),
|
|
70
78
|
startPublicDataTreeRoot: Fr.random(),
|
|
71
79
|
startL1ToL2MessageTreeSnapshot: getMockTreeSnapshot(),
|
|
72
|
-
|
|
80
|
+
startHistoricBlocksTreeSnapshot: getMockTreeSnapshot(),
|
|
73
81
|
endPrivateDataTreeSnapshot: getMockTreeSnapshot(),
|
|
74
82
|
endNullifierTreeSnapshot: getMockTreeSnapshot(),
|
|
75
83
|
endContractTreeSnapshot: getMockTreeSnapshot(),
|
|
76
|
-
endTreeOfHistoricPrivateDataTreeRootsSnapshot: getMockTreeSnapshot(),
|
|
77
|
-
endTreeOfHistoricContractTreeRootsSnapshot: getMockTreeSnapshot(),
|
|
78
84
|
endPublicDataTreeRoot: Fr.random(),
|
|
79
85
|
endL1ToL2MessageTreeSnapshot: getMockTreeSnapshot(),
|
|
80
|
-
|
|
86
|
+
endHistoricBlocksTreeSnapshot: getMockTreeSnapshot(),
|
|
81
87
|
newCommitments: times(MAX_NEW_COMMITMENTS_PER_TX, Fr.random),
|
|
82
88
|
newNullifiers: times(MAX_NEW_NULLIFIERS_PER_TX, Fr.random),
|
|
83
89
|
newContracts: newContractsCommitments?.map(x => Fr.fromBuffer(x)) ?? [Fr.random()],
|
|
@@ -93,7 +99,7 @@ const getMockBlock = (blockNumber: number, newContractsCommitments?: Buffer[]) =
|
|
|
93
99
|
const createSynchroniser = (merkleTreeDb: any, rollupSource: any) =>
|
|
94
100
|
new ServerWorldStateSynchroniser(merkleTreeDb as MerkleTreeDb, rollupSource as L2BlockSource);
|
|
95
101
|
|
|
96
|
-
const log =
|
|
102
|
+
const log = createDebugLogger('aztec:server_world_state_synchroniser_test');
|
|
97
103
|
|
|
98
104
|
describe('server_world_state_synchroniser', () => {
|
|
99
105
|
const rollupSource: Mockify<Pick<L2BlockSource, 'getBlockHeight' | 'getL2Blocks'>> = {
|
|
@@ -116,7 +122,7 @@ describe('server_world_state_synchroniser', () => {
|
|
|
116
122
|
SiblingPath.ZERO(32, INITIAL_LEAF, pedersen);
|
|
117
123
|
}; //Promise.resolve();
|
|
118
124
|
}),
|
|
119
|
-
|
|
125
|
+
updateHistoricBlocksTree: jest.fn().mockImplementation(() => Promise.resolve()),
|
|
120
126
|
commit: jest.fn().mockImplementation(() => Promise.resolve()),
|
|
121
127
|
rollback: jest.fn().mockImplementation(() => Promise.resolve()),
|
|
122
128
|
handleL2Block: jest.fn().mockImplementation(() => Promise.resolve()),
|
|
@@ -1,9 +1,11 @@
|
|
|
1
|
+
import { Fr } from '@aztec/foundation/fields';
|
|
2
|
+
import { createDebugLogger } from '@aztec/foundation/log';
|
|
1
3
|
import { L2Block, L2BlockDownloader, L2BlockSource } from '@aztec/types';
|
|
2
|
-
|
|
4
|
+
|
|
5
|
+
import { MerkleTreeDb, MerkleTreeOperations, computeGlobalVariablesHash } from '../index.js';
|
|
3
6
|
import { MerkleTreeOperationsFacade } from '../merkle-tree/merkle_tree_operations_facade.js';
|
|
4
|
-
import { WorldStateRunningState, WorldStateStatus, WorldStateSynchroniser } from './world_state_synchroniser.js';
|
|
5
7
|
import { getConfigEnvVars } from './config.js';
|
|
6
|
-
import {
|
|
8
|
+
import { WorldStateRunningState, WorldStateStatus, WorldStateSynchroniser } from './world_state_synchroniser.js';
|
|
7
9
|
|
|
8
10
|
/**
|
|
9
11
|
* Synchronises the world state with the L2 blocks from a L2BlockSource.
|
|
@@ -13,6 +15,7 @@ import { createDebugLogger } from '@aztec/foundation/log';
|
|
|
13
15
|
export class ServerWorldStateSynchroniser implements WorldStateSynchroniser {
|
|
14
16
|
private currentL2BlockNum = 0;
|
|
15
17
|
private latestBlockNumberAtStart = 0;
|
|
18
|
+
|
|
16
19
|
private l2BlockDownloader: L2BlockDownloader;
|
|
17
20
|
private syncPromise: Promise<void> = Promise.resolve();
|
|
18
21
|
private syncResolve?: () => void = undefined;
|
|
@@ -20,35 +23,30 @@ export class ServerWorldStateSynchroniser implements WorldStateSynchroniser {
|
|
|
20
23
|
private runningPromise: Promise<void> = Promise.resolve();
|
|
21
24
|
private currentState: WorldStateRunningState = WorldStateRunningState.IDLE;
|
|
22
25
|
|
|
26
|
+
/** The latest Global Variables hash for the HEAD of the chain. */
|
|
27
|
+
public latestGlobalVariablesHash: Fr = Fr.ZERO;
|
|
28
|
+
|
|
23
29
|
constructor(
|
|
24
30
|
private merkleTreeDb: MerkleTreeDb,
|
|
25
31
|
private l2BlockSource: L2BlockSource,
|
|
26
32
|
private log = createDebugLogger('aztec:world_state'),
|
|
27
33
|
) {
|
|
28
34
|
const config = getConfigEnvVars();
|
|
29
|
-
this.l2BlockDownloader = new L2BlockDownloader(
|
|
35
|
+
this.l2BlockDownloader = new L2BlockDownloader(
|
|
36
|
+
l2BlockSource,
|
|
37
|
+
config.l2QueueSize,
|
|
38
|
+
config.worldStateBlockCheckIntervalMS,
|
|
39
|
+
);
|
|
30
40
|
}
|
|
31
41
|
|
|
32
|
-
/**
|
|
33
|
-
* Returns an instance of MerkleTreeOperations that will include uncommitted data.
|
|
34
|
-
* @returns An instance of MerkleTreeOperations that will include uncommitted data.
|
|
35
|
-
*/
|
|
36
42
|
public getLatest(): MerkleTreeOperations {
|
|
37
43
|
return new MerkleTreeOperationsFacade(this.merkleTreeDb, true);
|
|
38
44
|
}
|
|
39
45
|
|
|
40
|
-
/**
|
|
41
|
-
* Returns an instance of MerkleTreeOperations that will not include uncommitted data.
|
|
42
|
-
* @returns An instance of MerkleTreeOperations that will not include uncommitted data.
|
|
43
|
-
*/
|
|
44
46
|
public getCommitted(): MerkleTreeOperations {
|
|
45
47
|
return new MerkleTreeOperationsFacade(this.merkleTreeDb, false);
|
|
46
48
|
}
|
|
47
49
|
|
|
48
|
-
/**
|
|
49
|
-
* Starts the synchroniser.
|
|
50
|
-
* @returns A promise that resolves once the initial sync is completed.
|
|
51
|
-
*/
|
|
52
50
|
public async start() {
|
|
53
51
|
if (this.currentState === WorldStateRunningState.STOPPED) {
|
|
54
52
|
throw new Error('Synchroniser already stopped');
|
|
@@ -59,6 +57,7 @@ export class ServerWorldStateSynchroniser implements WorldStateSynchroniser {
|
|
|
59
57
|
|
|
60
58
|
// get the current latest block number
|
|
61
59
|
this.latestBlockNumberAtStart = await this.l2BlockSource.getBlockHeight();
|
|
60
|
+
this.latestGlobalVariablesHash = await computeGlobalVariablesHash();
|
|
62
61
|
|
|
63
62
|
const blockToDownloadFrom = this.currentL2BlockNum + 1;
|
|
64
63
|
|
|
@@ -89,9 +88,6 @@ export class ServerWorldStateSynchroniser implements WorldStateSynchroniser {
|
|
|
89
88
|
return this.syncPromise;
|
|
90
89
|
}
|
|
91
90
|
|
|
92
|
-
/**
|
|
93
|
-
* Stops the synchroniser.
|
|
94
|
-
*/
|
|
95
91
|
public async stop() {
|
|
96
92
|
this.log('Stopping world state...');
|
|
97
93
|
this.stopping = true;
|
|
@@ -100,10 +96,6 @@ export class ServerWorldStateSynchroniser implements WorldStateSynchroniser {
|
|
|
100
96
|
this.setCurrentState(WorldStateRunningState.STOPPED);
|
|
101
97
|
}
|
|
102
98
|
|
|
103
|
-
/**
|
|
104
|
-
* Returns the current status of the synchroniser.
|
|
105
|
-
* @returns The current status of the synchroniser.
|
|
106
|
-
*/
|
|
107
99
|
public status(): Promise<WorldStateStatus> {
|
|
108
100
|
const status = {
|
|
109
101
|
syncedToL2Block: this.currentL2BlockNum,
|
|
@@ -129,6 +121,8 @@ export class ServerWorldStateSynchroniser implements WorldStateSynchroniser {
|
|
|
129
121
|
private async handleL2Block(l2Block: L2Block) {
|
|
130
122
|
await this.merkleTreeDb.handleL2Block(l2Block);
|
|
131
123
|
this.currentL2BlockNum = l2Block.number;
|
|
124
|
+
this.latestGlobalVariablesHash = await computeGlobalVariablesHash(l2Block.globalVariables);
|
|
125
|
+
this.log(`Synced global variables with hash ${this.latestGlobalVariablesHash.toString()}`);
|
|
132
126
|
if (
|
|
133
127
|
this.currentState === WorldStateRunningState.SYNCHING &&
|
|
134
128
|
this.currentL2BlockNum >= this.latestBlockNumberAtStart
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { Fr } from '@aztec/circuits.js';
|
|
2
|
+
|
|
1
3
|
import { MerkleTreeOperations } from '../index.js';
|
|
2
4
|
|
|
3
5
|
/**
|
|
@@ -28,9 +30,37 @@ export interface WorldStateStatus {
|
|
|
28
30
|
* Defines the interface for a world state synchroniser.
|
|
29
31
|
*/
|
|
30
32
|
export interface WorldStateSynchroniser {
|
|
33
|
+
/**
|
|
34
|
+
* Starts the synchroniser.
|
|
35
|
+
* @returns A promise that resolves once the initial sync is completed.
|
|
36
|
+
*/
|
|
31
37
|
start(): void;
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Returns the current status of the synchroniser.
|
|
41
|
+
* @returns The current status of the synchroniser.
|
|
42
|
+
*/
|
|
32
43
|
status(): Promise<WorldStateStatus>;
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Stops the synchroniser.
|
|
47
|
+
*/
|
|
33
48
|
stop(): Promise<void>;
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Returns an instance of MerkleTreeOperations that will include uncommitted data.
|
|
52
|
+
* @returns An instance of MerkleTreeOperations that will include uncommitted data.
|
|
53
|
+
*/
|
|
34
54
|
getLatest(): MerkleTreeOperations;
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Returns an instance of MerkleTreeOperations that will not include uncommitted data.
|
|
58
|
+
* @returns An instance of MerkleTreeOperations that will not include uncommitted data.
|
|
59
|
+
*/
|
|
35
60
|
getCommitted(): MerkleTreeOperations;
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* The latest Global Variables hash for the HEAD of the chain.
|
|
64
|
+
*/
|
|
65
|
+
latestGlobalVariablesHash: Fr;
|
|
36
66
|
}
|
package/src/utils.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { GeneratorIndex } from '@aztec/circuits.js';
|
|
1
|
+
import { CircuitsWasm, GeneratorIndex, GlobalVariables } from '@aztec/circuits.js';
|
|
2
|
+
import { computeGlobalsHash } from '@aztec/circuits.js/abis';
|
|
2
3
|
import { pedersenCompressWithHashIndex } from '@aztec/circuits.js/barretenberg';
|
|
3
4
|
import { AztecAddress } from '@aztec/foundation/aztec-address';
|
|
4
5
|
import { Fr } from '@aztec/foundation/fields';
|
|
5
6
|
import { toBigInt } from '@aztec/foundation/serialize';
|
|
6
|
-
|
|
7
7
|
import { IWasmModule } from '@aztec/foundation/wasm';
|
|
8
8
|
|
|
9
9
|
/**
|
|
@@ -22,3 +22,14 @@ export function computePublicDataTreeLeafIndex(contract: AztecAddress, slot: Fr,
|
|
|
22
22
|
),
|
|
23
23
|
);
|
|
24
24
|
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Computes the hash of the global variables.
|
|
28
|
+
* @returns The hash of the global variables.
|
|
29
|
+
*/
|
|
30
|
+
export async function computeGlobalVariablesHash(
|
|
31
|
+
globalVariables: GlobalVariables = GlobalVariables.empty(),
|
|
32
|
+
): Promise<Fr> {
|
|
33
|
+
const wasm = await CircuitsWasm.get();
|
|
34
|
+
return computeGlobalsHash(wasm, globalVariables);
|
|
35
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { L2Block, MerkleTreeId } from '@aztec/types';
|
|
1
|
+
import { GlobalVariables, MAX_NEW_NULLIFIERS_PER_TX } from '@aztec/circuits.js';
|
|
3
2
|
import { createDebugLogger } from '@aztec/foundation/log';
|
|
4
|
-
import {
|
|
3
|
+
import { LeafData, LowLeafWitnessData } from '@aztec/merkle-tree';
|
|
4
|
+
import { L2Block, MerkleTreeId, SiblingPath } from '@aztec/types';
|
|
5
5
|
|
|
6
6
|
export * from './merkle_trees.js';
|
|
7
7
|
export { LeafData } from '@aztec/merkle-tree';
|
|
@@ -66,7 +66,7 @@ type WithIncludeUncommitted<F> = F extends (...args: [...infer Rest]) => infer R
|
|
|
66
66
|
/**
|
|
67
67
|
* The current roots of the commitment trees
|
|
68
68
|
*/
|
|
69
|
-
export type
|
|
69
|
+
export type CurrentTreeRoots = {
|
|
70
70
|
/** Private data tree root. */
|
|
71
71
|
privateDataTreeRoot: Buffer;
|
|
72
72
|
/** Contract data tree root. */
|
|
@@ -75,6 +75,10 @@ export type CurrentCommitmentTreeRoots = {
|
|
|
75
75
|
l1Tol2MessagesTreeRoot: Buffer;
|
|
76
76
|
/** Nullifier data tree root. */
|
|
77
77
|
nullifierTreeRoot: Buffer;
|
|
78
|
+
/** Blocks tree root. */
|
|
79
|
+
blocksTreeRoot: Buffer;
|
|
80
|
+
/** Public data tree root */
|
|
81
|
+
publicDataTreeRoot: Buffer;
|
|
78
82
|
};
|
|
79
83
|
|
|
80
84
|
/**
|
|
@@ -111,7 +115,7 @@ export interface MerkleTreeOperations {
|
|
|
111
115
|
/**
|
|
112
116
|
* Gets the current roots of the commitment trees.
|
|
113
117
|
*/
|
|
114
|
-
|
|
118
|
+
getTreeRoots(): CurrentTreeRoots;
|
|
115
119
|
|
|
116
120
|
/**
|
|
117
121
|
* Gets sibling path for a leaf.
|
|
@@ -169,10 +173,11 @@ export interface MerkleTreeOperations {
|
|
|
169
173
|
getLeafValue(treeId: MerkleTreeId, index: bigint): Promise<Buffer | undefined>;
|
|
170
174
|
|
|
171
175
|
/**
|
|
172
|
-
* Inserts into the
|
|
173
|
-
* the current roots of the
|
|
176
|
+
* Inserts the new block hash into the new block hashes tree.
|
|
177
|
+
* This includes all of the current roots of all of the data trees and the current blocks global vars.
|
|
178
|
+
* @param globalVariables - The global variables to insert into the block hash.
|
|
174
179
|
*/
|
|
175
|
-
|
|
180
|
+
updateHistoricBlocksTree(globalVariables: GlobalVariables): Promise<void>;
|
|
176
181
|
|
|
177
182
|
/**
|
|
178
183
|
* Batch insert multiple leaves into the tree.
|