@aztec/world-state 0.1.0-alpha11
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/.eslintrc.cjs +1 -0
- package/.tsbuildinfo +1 -0
- package/README.md +40 -0
- package/dest/index.d.ts +4 -0
- package/dest/index.d.ts.map +1 -0
- package/dest/index.js +4 -0
- package/dest/merkle-tree/merkle_tree_operations_facade.d.ts +117 -0
- package/dest/merkle-tree/merkle_tree_operations_facade.d.ts.map +1 -0
- package/dest/merkle-tree/merkle_tree_operations_facade.js +133 -0
- package/dest/synchroniser/config.d.ts +19 -0
- package/dest/synchroniser/config.d.ts.map +1 -0
- package/dest/synchroniser/config.js +13 -0
- package/dest/synchroniser/index.d.ts +3 -0
- package/dest/synchroniser/index.d.ts.map +1 -0
- package/dest/synchroniser/index.js +3 -0
- package/dest/synchroniser/server_world_state_synchroniser.d.ts +62 -0
- package/dest/synchroniser/server_world_state_synchroniser.d.ts.map +1 -0
- package/dest/synchroniser/server_world_state_synchroniser.js +134 -0
- package/dest/synchroniser/server_world_state_synchroniser.test.d.ts +2 -0
- package/dest/synchroniser/server_world_state_synchroniser.test.d.ts.map +1 -0
- package/dest/synchroniser/server_world_state_synchroniser.test.js +215 -0
- package/dest/synchroniser/world_state_synchroniser.d.ts +34 -0
- package/dest/synchroniser/world_state_synchroniser.d.ts.map +1 -0
- package/dest/synchroniser/world_state_synchroniser.js +11 -0
- package/dest/utils.d.ts +12 -0
- package/dest/utils.d.ts.map +1 -0
- package/dest/utils.js +14 -0
- package/dest/world-state-db/index.d.ts +165 -0
- package/dest/world-state-db/index.d.ts.map +1 -0
- package/dest/world-state-db/index.js +21 -0
- package/dest/world-state-db/merkle_trees.d.ts +200 -0
- package/dest/world-state-db/merkle_trees.d.ts.map +1 -0
- package/dest/world-state-db/merkle_trees.js +373 -0
- package/package.json +15 -0
- package/src/index.ts +3 -0
- package/src/merkle-tree/merkle_tree_operations_facade.ts +164 -0
- package/src/synchroniser/config.ts +27 -0
- package/src/synchroniser/index.ts +2 -0
- package/src/synchroniser/server_world_state_synchroniser.test.ts +281 -0
- package/src/synchroniser/server_world_state_synchroniser.ts +151 -0
- package/src/synchroniser/world_state_synchroniser.ts +36 -0
- package/src/utils.ts +24 -0
- package/src/world-state-db/index.ts +215 -0
- package/src/world-state-db/merkle_trees.ts +547 -0
- package/tsconfig.json +23 -0
|
@@ -0,0 +1,373 @@
|
|
|
1
|
+
import { CONTRACT_TREE_HEIGHT, CONTRACT_TREE_ROOTS_TREE_HEIGHT, CircuitsWasm, L1_TO_L2_MESSAGES_ROOTS_TREE_HEIGHT, L1_TO_L2_MESSAGES_TREE_HEIGHT, NULLIFIER_TREE_HEIGHT, PRIVATE_DATA_TREE_HEIGHT, PRIVATE_DATA_TREE_ROOTS_TREE_HEIGHT, PUBLIC_DATA_TREE_HEIGHT, } from '@aztec/circuits.js';
|
|
2
|
+
import { Pedersen, SparseTree, StandardIndexedTree, StandardTree, newTree, } from '@aztec/merkle-tree';
|
|
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';
|
|
6
|
+
import { SerialQueue } from '@aztec/foundation/fifo';
|
|
7
|
+
import { createDebugLogger } from '@aztec/foundation/log';
|
|
8
|
+
/**
|
|
9
|
+
* A convenience class for managing multiple merkle trees.
|
|
10
|
+
*/
|
|
11
|
+
export class MerkleTrees {
|
|
12
|
+
constructor(db, log = createDebugLogger('aztec:merkle_trees')) {
|
|
13
|
+
this.db = db;
|
|
14
|
+
this.log = log;
|
|
15
|
+
this.trees = [];
|
|
16
|
+
this.jobQueue = new SerialQueue();
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Initialises the collection of Merkle Trees.
|
|
20
|
+
* @param optionalWasm - WASM instance to use for hashing (if not provided PrimitivesWasm will be used).
|
|
21
|
+
*/
|
|
22
|
+
async init(optionalWasm) {
|
|
23
|
+
const wasm = optionalWasm ?? (await CircuitsWasm.get());
|
|
24
|
+
const hasher = new Pedersen(wasm);
|
|
25
|
+
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
|
+
const nullifierTree = await newTree(StandardIndexedTree, this.db, hasher, `${MerkleTreeId[MerkleTreeId.NULLIFIER_TREE]}`, NULLIFIER_TREE_HEIGHT, INITIAL_NULLIFIER_TREE_SIZE);
|
|
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
|
+
const publicDataTree = await newTree(SparseTree, this.db, hasher, `${MerkleTreeId[MerkleTreeId.PUBLIC_DATA_TREE]}`, PUBLIC_DATA_TREE_HEIGHT);
|
|
31
|
+
const l1Tol2MessagesTree = await newTree(StandardTree, this.db, hasher, `${MerkleTreeId[MerkleTreeId.L1_TO_L2_MESSAGES_TREE]}`, L1_TO_L2_MESSAGES_TREE_HEIGHT);
|
|
32
|
+
const l1Tol2MessagesRootsTree = await newTree(StandardTree, this.db, hasher, `${MerkleTreeId[MerkleTreeId.L1_TO_L2_MESSAGES_ROOTS_TREE]}`, L1_TO_L2_MESSAGES_ROOTS_TREE_HEIGHT);
|
|
33
|
+
this.trees = [
|
|
34
|
+
contractTree,
|
|
35
|
+
contractTreeRootsTree,
|
|
36
|
+
nullifierTree,
|
|
37
|
+
privateDataTree,
|
|
38
|
+
privateDataTreeRootsTree,
|
|
39
|
+
publicDataTree,
|
|
40
|
+
l1Tol2MessagesTree,
|
|
41
|
+
l1Tol2MessagesRootsTree,
|
|
42
|
+
];
|
|
43
|
+
this.jobQueue.start();
|
|
44
|
+
// The roots trees must contain the empty roots of their data trees
|
|
45
|
+
await this.updateHistoricRootsTrees(true);
|
|
46
|
+
const historicRootsTrees = [contractTreeRootsTree, privateDataTreeRootsTree, l1Tol2MessagesRootsTree];
|
|
47
|
+
await Promise.all(historicRootsTrees.map(tree => tree.commit()));
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Method to asynchronously create and initialise a MerkleTrees instance.
|
|
51
|
+
* @param db - The db instance to use for data persistance.
|
|
52
|
+
* @param wasm - WASM instance to use for hashing (if not provided PrimitivesWasm will be used).
|
|
53
|
+
* @returns - A fully initialised MerkleTrees instance.
|
|
54
|
+
*/
|
|
55
|
+
static async new(db, wasm) {
|
|
56
|
+
const merkleTrees = new MerkleTrees(db);
|
|
57
|
+
await merkleTrees.init(wasm);
|
|
58
|
+
return merkleTrees;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Stops the job queue (waits for all jobs to finish).
|
|
62
|
+
*/
|
|
63
|
+
async stop() {
|
|
64
|
+
await this.jobQueue.end();
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Gets a view of this db that returns uncommitted data.
|
|
68
|
+
* @returns - A facade for this instance.
|
|
69
|
+
*/
|
|
70
|
+
asLatest() {
|
|
71
|
+
return new MerkleTreeOperationsFacade(this, true);
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Gets a view of this db that returns committed data only.
|
|
75
|
+
* @returns - A facade for this instance.
|
|
76
|
+
*/
|
|
77
|
+
asCommitted() {
|
|
78
|
+
return new MerkleTreeOperationsFacade(this, false);
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Inserts into the roots trees (CONTRACT_TREE_ROOTS_TREE, PRIVATE_DATA_TREE_ROOTS_TREE, L1_TO_L2_MESSAGES_TREE_ROOTS_TREE)
|
|
82
|
+
* the current roots of the corresponding trees (CONTRACT_TREE, PRIVATE_DATA_TREE, L1_TO_L2_MESSAGES_TREE).
|
|
83
|
+
* @param includeUncommitted - Indicates whether to include uncommitted data.
|
|
84
|
+
*/
|
|
85
|
+
async updateHistoricRootsTrees(includeUncommitted) {
|
|
86
|
+
for (const [newTree, rootTree] of [
|
|
87
|
+
[MerkleTreeId.PRIVATE_DATA_TREE, MerkleTreeId.PRIVATE_DATA_TREE_ROOTS_TREE],
|
|
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
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Gets the tree info for the specified tree.
|
|
97
|
+
* @param treeId - Id of the tree to get information from.
|
|
98
|
+
* @param includeUncommitted - Indicates whether to include uncommitted data.
|
|
99
|
+
* @returns The tree info for the specified tree.
|
|
100
|
+
*/
|
|
101
|
+
async getTreeInfo(treeId, includeUncommitted) {
|
|
102
|
+
return await this.synchronise(() => this._getTreeInfo(treeId, includeUncommitted));
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Get the current roots of the commitment trees.
|
|
106
|
+
* @param includeUncommitted - Indicates whether to include uncommitted data.
|
|
107
|
+
* @returns The current roots of the trees.
|
|
108
|
+
*/
|
|
109
|
+
getCommitmentTreeRoots(includeUncommitted) {
|
|
110
|
+
const roots = [
|
|
111
|
+
MerkleTreeId.PRIVATE_DATA_TREE,
|
|
112
|
+
MerkleTreeId.CONTRACT_TREE,
|
|
113
|
+
MerkleTreeId.L1_TO_L2_MESSAGES_TREE,
|
|
114
|
+
MerkleTreeId.NULLIFIER_TREE,
|
|
115
|
+
].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
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Gets the value at the given index.
|
|
125
|
+
* @param treeId - The ID of the tree to get the leaf value from.
|
|
126
|
+
* @param index - The index of the leaf.
|
|
127
|
+
* @param includeUncommitted - Indicates whether to include uncommitted changes.
|
|
128
|
+
* @returns Leaf value at the given index (undefined if not found).
|
|
129
|
+
*/
|
|
130
|
+
async getLeafValue(treeId, index, includeUncommitted) {
|
|
131
|
+
return await this.synchronise(() => this.trees[treeId].getLeafValue(index, includeUncommitted));
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Gets the sibling path for a leaf in a tree.
|
|
135
|
+
* @param treeId - The ID of the tree.
|
|
136
|
+
* @param index - The index of the leaf.
|
|
137
|
+
* @param includeUncommitted - Indicates whether the sibling path should incro include uncommitted data.
|
|
138
|
+
* @returns The sibling path for the leaf.
|
|
139
|
+
*/
|
|
140
|
+
async getSiblingPath(treeId, index, includeUncommitted) {
|
|
141
|
+
return await this.synchronise(() => this._getSiblingPath(treeId, index, includeUncommitted));
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Appends leaves to a tree.
|
|
145
|
+
* @param treeId - The ID of the tree.
|
|
146
|
+
* @param leaves - The leaves to append.
|
|
147
|
+
* @returns Empty promise.
|
|
148
|
+
*/
|
|
149
|
+
async appendLeaves(treeId, leaves) {
|
|
150
|
+
return await this.synchronise(() => this._appendLeaves(treeId, leaves));
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Commits all pending updates.
|
|
154
|
+
* @returns Empty promise.
|
|
155
|
+
*/
|
|
156
|
+
async commit() {
|
|
157
|
+
return await this.synchronise(() => this._commit());
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Rolls back all pending updates.
|
|
161
|
+
* @returns Empty promise.
|
|
162
|
+
*/
|
|
163
|
+
async rollback() {
|
|
164
|
+
return await this.synchronise(() => this._rollback());
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Finds the index of the largest leaf whose value is less than or equal to the provided value.
|
|
168
|
+
* @param treeId - The ID of the tree to search.
|
|
169
|
+
* @param value - The value to be inserted into the tree.
|
|
170
|
+
* @param includeUncommitted - If true, the uncommitted changes are included in the search.
|
|
171
|
+
* @returns The found leaf index and a flag indicating if the corresponding leaf's value is equal to `newValue`.
|
|
172
|
+
*/
|
|
173
|
+
async getPreviousValueIndex(treeId, value, includeUncommitted) {
|
|
174
|
+
return await this.synchronise(() => Promise.resolve(this._getIndexedTree(treeId).findIndexOfPreviousValue(value, includeUncommitted)));
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Gets the leaf data at a given index and tree.
|
|
178
|
+
* @param treeId - The ID of the tree get the leaf from.
|
|
179
|
+
* @param index - The index of the leaf to get.
|
|
180
|
+
* @param includeUncommitted - Indicates whether to include uncommitted data.
|
|
181
|
+
* @returns Leaf data.
|
|
182
|
+
*/
|
|
183
|
+
async getLeafData(treeId, index, includeUncommitted) {
|
|
184
|
+
return await this.synchronise(() => Promise.resolve(this._getIndexedTree(treeId).getLatestLeafDataCopy(index, includeUncommitted)));
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Returns the index of a leaf given its value, or undefined if no leaf with that value is found.
|
|
188
|
+
* @param treeId - The ID of the tree.
|
|
189
|
+
* @param value - The leaf value to look for.
|
|
190
|
+
* @param includeUncommitted - Indicates whether to include uncommitted data.
|
|
191
|
+
* @returns The index of the first leaf found with a given value (undefined if not found).
|
|
192
|
+
*/
|
|
193
|
+
async findLeafIndex(treeId, value, includeUncommitted) {
|
|
194
|
+
return await this.synchronise(async () => {
|
|
195
|
+
const tree = this.trees[treeId];
|
|
196
|
+
for (let i = 0n; i < tree.getNumLeaves(includeUncommitted); i++) {
|
|
197
|
+
const currentValue = await tree.getLeafValue(i, includeUncommitted);
|
|
198
|
+
if (currentValue && currentValue.equals(value)) {
|
|
199
|
+
return i;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
return undefined;
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Updates a leaf in a tree at a given index.
|
|
207
|
+
* @param treeId - The ID of the tree.
|
|
208
|
+
* @param leaf - The new leaf value.
|
|
209
|
+
* @param index - The index to insert into.
|
|
210
|
+
* @returns Empty promise.
|
|
211
|
+
*/
|
|
212
|
+
async updateLeaf(treeId, leaf, index) {
|
|
213
|
+
return await this.synchronise(() => this._updateLeaf(treeId, leaf, index));
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Handles a single L2 block (i.e. Inserts the new commitments into the merkle tree).
|
|
217
|
+
* @param block - The L2 block to handle.
|
|
218
|
+
*/
|
|
219
|
+
async handleL2Block(block) {
|
|
220
|
+
await this.synchronise(() => this._handleL2Block(block));
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Batch insert multiple leaves into the tree.
|
|
224
|
+
* @param treeId - The ID of the tree.
|
|
225
|
+
* @param leaves - Leaves to insert into the tree.
|
|
226
|
+
* @param treeHeight - Height of the tree.
|
|
227
|
+
* @param subtreeHeight - Height of the subtree.
|
|
228
|
+
* @returns The data for the leaves to be updated when inserting the new ones.
|
|
229
|
+
*/
|
|
230
|
+
async batchInsert(treeId, leaves, treeHeight, subtreeHeight) {
|
|
231
|
+
const tree = this.trees[treeId];
|
|
232
|
+
if (!('batchInsert' in tree)) {
|
|
233
|
+
throw new Error('Tree does not support `batchInsert` method');
|
|
234
|
+
}
|
|
235
|
+
return await this.synchronise(() => tree.batchInsert(leaves, treeHeight, subtreeHeight));
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Waits for all jobs to finish before executing the given function.
|
|
239
|
+
* @param fn - The function to execute.
|
|
240
|
+
* @returns Promise containing the result of the function.
|
|
241
|
+
*/
|
|
242
|
+
async synchronise(fn) {
|
|
243
|
+
return await this.jobQueue.put(fn);
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Returns the tree info for the specified tree id.
|
|
247
|
+
* @param treeId - Id of the tree to get information from.
|
|
248
|
+
* @param includeUncommitted - Indicates whether to include uncommitted data.
|
|
249
|
+
* @returns The tree info for the specified tree.
|
|
250
|
+
*/
|
|
251
|
+
_getTreeInfo(treeId, includeUncommitted) {
|
|
252
|
+
const treeInfo = {
|
|
253
|
+
treeId,
|
|
254
|
+
root: this.trees[treeId].getRoot(includeUncommitted),
|
|
255
|
+
size: this.trees[treeId].getNumLeaves(includeUncommitted),
|
|
256
|
+
depth: this.trees[treeId].getDepth(),
|
|
257
|
+
};
|
|
258
|
+
return Promise.resolve(treeInfo);
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Returns an instance of an indexed tree.
|
|
262
|
+
* @param treeId - Id of the tree to get an instance of.
|
|
263
|
+
* @returns The indexed tree for the specified tree id.
|
|
264
|
+
*/
|
|
265
|
+
_getIndexedTree(treeId) {
|
|
266
|
+
return this.trees[treeId];
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* Returns the sibling path for a leaf in a tree.
|
|
270
|
+
* @param treeId - Id of the tree to get the sibling path from.
|
|
271
|
+
* @param index - Index of the leaf to get the sibling path for.
|
|
272
|
+
* @param includeUncommitted - Indicates whether to include uncommitted updates in the sibling path.
|
|
273
|
+
* @returns Promise containing the sibling path for the leaf.
|
|
274
|
+
*/
|
|
275
|
+
_getSiblingPath(treeId, index, includeUncommitted) {
|
|
276
|
+
return Promise.resolve(this.trees[treeId].getSiblingPath(index, includeUncommitted));
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Appends leaves to a tree.
|
|
280
|
+
* @param treeId - Id of the tree to append leaves to.
|
|
281
|
+
* @param leaves - Leaves to append.
|
|
282
|
+
* @returns Empty promise.
|
|
283
|
+
*/
|
|
284
|
+
async _appendLeaves(treeId, leaves) {
|
|
285
|
+
const tree = this.trees[treeId];
|
|
286
|
+
if (!('appendLeaves' in tree)) {
|
|
287
|
+
throw new Error('Tree does not support `appendLeaves` method');
|
|
288
|
+
}
|
|
289
|
+
return await tree.appendLeaves(leaves);
|
|
290
|
+
}
|
|
291
|
+
async _updateLeaf(treeId, leaf, index) {
|
|
292
|
+
const tree = this.trees[treeId];
|
|
293
|
+
if (!('updateLeaf' in tree)) {
|
|
294
|
+
throw new Error('Tree does not support `updateLeaf` method');
|
|
295
|
+
}
|
|
296
|
+
return await tree.updateLeaf(leaf, index);
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* Commits all pending updates.
|
|
300
|
+
* @returns Empty promise.
|
|
301
|
+
*/
|
|
302
|
+
async _commit() {
|
|
303
|
+
for (const tree of this.trees) {
|
|
304
|
+
await tree.commit();
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Rolls back all pending updates.
|
|
309
|
+
* @returns Empty promise.
|
|
310
|
+
*/
|
|
311
|
+
async _rollback() {
|
|
312
|
+
for (const tree of this.trees) {
|
|
313
|
+
await tree.rollback();
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
/**
|
|
317
|
+
* Handles a single L2 block (i.e. Inserts the new commitments into the merkle tree).
|
|
318
|
+
* @param l2Block - The L2 block to handle.
|
|
319
|
+
*/
|
|
320
|
+
async _handleL2Block(l2Block) {
|
|
321
|
+
const compareRoot = (root, treeId) => {
|
|
322
|
+
const treeRoot = this.trees[treeId].getRoot(true);
|
|
323
|
+
return treeRoot.equals(root.toBuffer());
|
|
324
|
+
};
|
|
325
|
+
const rootChecks = [
|
|
326
|
+
compareRoot(l2Block.endContractTreeSnapshot.root, MerkleTreeId.CONTRACT_TREE),
|
|
327
|
+
compareRoot(l2Block.endNullifierTreeSnapshot.root, MerkleTreeId.NULLIFIER_TREE),
|
|
328
|
+
compareRoot(l2Block.endPrivateDataTreeSnapshot.root, MerkleTreeId.PRIVATE_DATA_TREE),
|
|
329
|
+
compareRoot(l2Block.endPublicDataTreeRoot, MerkleTreeId.PUBLIC_DATA_TREE),
|
|
330
|
+
compareRoot(l2Block.endTreeOfHistoricContractTreeRootsSnapshot.root, MerkleTreeId.CONTRACT_TREE_ROOTS_TREE),
|
|
331
|
+
compareRoot(l2Block.endTreeOfHistoricPrivateDataTreeRootsSnapshot.root, MerkleTreeId.PRIVATE_DATA_TREE_ROOTS_TREE),
|
|
332
|
+
compareRoot(l2Block.endL1ToL2MessageTreeSnapshot.root, MerkleTreeId.L1_TO_L2_MESSAGES_TREE),
|
|
333
|
+
compareRoot(l2Block.endTreeOfHistoricL1ToL2MessageTreeRootsSnapshot.root, MerkleTreeId.L1_TO_L2_MESSAGES_ROOTS_TREE),
|
|
334
|
+
];
|
|
335
|
+
const ourBlock = rootChecks.every(x => x);
|
|
336
|
+
if (ourBlock) {
|
|
337
|
+
this.log(`Block ${l2Block.number} is ours, committing world state..`);
|
|
338
|
+
await this._commit();
|
|
339
|
+
}
|
|
340
|
+
else {
|
|
341
|
+
this.log(`Block ${l2Block.number} is not ours, rolling back world state and committing state from chain..`);
|
|
342
|
+
await this._rollback();
|
|
343
|
+
for (const [tree, leaves] of [
|
|
344
|
+
[MerkleTreeId.CONTRACT_TREE, l2Block.newContracts],
|
|
345
|
+
[MerkleTreeId.NULLIFIER_TREE, l2Block.newNullifiers],
|
|
346
|
+
[MerkleTreeId.PRIVATE_DATA_TREE, l2Block.newCommitments],
|
|
347
|
+
[MerkleTreeId.L1_TO_L2_MESSAGES_TREE, l2Block.newL1ToL2Messages],
|
|
348
|
+
]) {
|
|
349
|
+
await this._appendLeaves(tree, leaves.map(fr => fr.toBuffer()));
|
|
350
|
+
}
|
|
351
|
+
for (const dataWrite of l2Block.newPublicDataWrites) {
|
|
352
|
+
if (dataWrite.isEmpty())
|
|
353
|
+
continue;
|
|
354
|
+
const { newValue, leafIndex } = dataWrite;
|
|
355
|
+
await this._updateLeaf(MerkleTreeId.PUBLIC_DATA_TREE, newValue.toBuffer(), leafIndex.value);
|
|
356
|
+
}
|
|
357
|
+
for (const [newTree, rootTree] of [
|
|
358
|
+
[MerkleTreeId.PRIVATE_DATA_TREE, MerkleTreeId.PRIVATE_DATA_TREE_ROOTS_TREE],
|
|
359
|
+
[MerkleTreeId.CONTRACT_TREE, MerkleTreeId.CONTRACT_TREE_ROOTS_TREE],
|
|
360
|
+
[MerkleTreeId.L1_TO_L2_MESSAGES_TREE, MerkleTreeId.L1_TO_L2_MESSAGES_ROOTS_TREE],
|
|
361
|
+
]) {
|
|
362
|
+
const newTreeRoot = this.trees[newTree].getRoot(true);
|
|
363
|
+
await this._appendLeaves(rootTree, [newTreeRoot]);
|
|
364
|
+
}
|
|
365
|
+
await this._commit();
|
|
366
|
+
}
|
|
367
|
+
for (const treeId of merkleTreeIds()) {
|
|
368
|
+
const info = await this._getTreeInfo(treeId, false);
|
|
369
|
+
this.log(`Tree ${MerkleTreeId[treeId]} synched with size ${info.size} root ${info.root.toString('hex')}`);
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVya2xlX3RyZWVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3dvcmxkLXN0YXRlLWRiL21lcmtsZV90cmVlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsb0JBQW9CLEVBQ3BCLCtCQUErQixFQUMvQixZQUFZLEVBRVosbUNBQW1DLEVBQ25DLDZCQUE2QixFQUM3QixxQkFBcUIsRUFDckIsd0JBQXdCLEVBQ3hCLG1DQUFtQyxFQUNuQyx1QkFBdUIsR0FDeEIsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBS0wsUUFBUSxFQUVSLFVBQVUsRUFDVixtQkFBbUIsRUFDbkIsWUFBWSxFQUVaLE9BQU8sR0FDUixNQUFNLG9CQUFvQixDQUFDO0FBRTVCLE9BQU8sRUFFTCwyQkFBMkIsR0FNNUIsTUFBTSxZQUFZLENBQUM7QUFDcEIsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0saURBQWlELENBQUM7QUFDN0YsT0FBTyxFQUFXLFlBQVksRUFBRSxhQUFhLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDcEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRzFEOztHQUVHO0FBQ0gsTUFBTSxPQUFPLFdBQVc7SUFJdEIsWUFBb0IsRUFBbUIsRUFBVSxNQUFNLGlCQUFpQixDQUFDLG9CQUFvQixDQUFDO1FBQTFFLE9BQUUsR0FBRixFQUFFLENBQWlCO1FBQVUsUUFBRyxHQUFILEdBQUcsQ0FBMEM7UUFIdEYsVUFBSyxHQUF3QyxFQUFFLENBQUM7UUFDaEQsYUFBUSxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7SUFFNEQsQ0FBQztJQUVsRzs7O09BR0c7SUFDSSxLQUFLLENBQUMsSUFBSSxDQUFDLFlBQTBCO1FBQzFDLE1BQU0sSUFBSSxHQUFHLFlBQVksSUFBSSxDQUFDLE1BQU0sWUFBWSxDQUFDLEdB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
|
package/package.json
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@aztec/world-state",
|
|
3
|
+
"version": "0.1.0-alpha11",
|
|
4
|
+
"exports": "./dest/index.js",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"dependencies": {
|
|
7
|
+
"@aztec/circuits.js": "0.1.0-alpha11",
|
|
8
|
+
"@aztec/foundation": "0.1.0-alpha11",
|
|
9
|
+
"@aztec/merkle-tree": "0.1.0-alpha11",
|
|
10
|
+
"@aztec/types": "0.1.0-alpha11",
|
|
11
|
+
"levelup": "^5.1.1",
|
|
12
|
+
"memdown": "^6.1.1",
|
|
13
|
+
"tslib": "^2.4.0"
|
|
14
|
+
}
|
|
15
|
+
}
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import { LeafData, MerkleTreeDb, TreeInfo, MerkleTreeOperations, CurrentCommitmentTreeRoots } from '../index.js';
|
|
2
|
+
import { L2Block, MerkleTreeId } from '@aztec/types';
|
|
3
|
+
import { LowLeafWitnessData, SiblingPath } from '@aztec/merkle-tree';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Wraps a MerkleTreeDbOperations to call all functions with a preset includeUncommitted flag.
|
|
7
|
+
*/
|
|
8
|
+
export class MerkleTreeOperationsFacade implements MerkleTreeOperations {
|
|
9
|
+
constructor(private trees: MerkleTreeDb, private includeUncommitted: boolean) {}
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Returns the tree info for the specified tree id.
|
|
13
|
+
* @param treeId - Id of the tree to get information from.
|
|
14
|
+
* @param includeUncommitted - Indicates whether to include uncommitted data.
|
|
15
|
+
* @returns The tree info for the specified tree.
|
|
16
|
+
*/
|
|
17
|
+
getTreeInfo(treeId: MerkleTreeId): Promise<TreeInfo> {
|
|
18
|
+
return this.trees.getTreeInfo(treeId, this.includeUncommitted);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Get the current roots of the commitment trees.
|
|
23
|
+
* @returns The current roots of the trees.
|
|
24
|
+
*/
|
|
25
|
+
getCommitmentTreeRoots(): CurrentCommitmentTreeRoots {
|
|
26
|
+
return this.trees.getCommitmentTreeRoots(this.includeUncommitted);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Appends a set of leaf values to the tree.
|
|
31
|
+
* @param treeId - Id of the tree to append leaves to.
|
|
32
|
+
* @param leaves - The set of leaves to be appended.
|
|
33
|
+
* @returns The tree info of the specified tree.
|
|
34
|
+
*/
|
|
35
|
+
appendLeaves(treeId: MerkleTreeId, leaves: Buffer[]): Promise<void> {
|
|
36
|
+
return this.trees.appendLeaves(treeId, leaves);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Returns the sibling path for a requested leaf index.
|
|
41
|
+
* @param treeId - Id of the tree to get the sibling path from.
|
|
42
|
+
* @param index - The index of the leaf for which a sibling path is required.
|
|
43
|
+
* @returns A promise with the sibling path of the specified leaf index.
|
|
44
|
+
*/
|
|
45
|
+
getSiblingPath(treeId: MerkleTreeId, index: bigint): Promise<SiblingPath<number>> {
|
|
46
|
+
return this.trees.getSiblingPath(treeId, index, this.includeUncommitted);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Finds the index of the largest leaf whose value is less than or equal to the provided value.
|
|
51
|
+
* @param treeId - The ID of the tree to search.
|
|
52
|
+
* @param value - The value to be inserted into the tree.
|
|
53
|
+
* @param includeUncommitted - If true, the uncommitted changes are included in the search.
|
|
54
|
+
* @returns The found leaf index and a flag indicating if the corresponding leaf's value is equal to `newValue`.
|
|
55
|
+
*/
|
|
56
|
+
getPreviousValueIndex(
|
|
57
|
+
treeId: MerkleTreeId.NULLIFIER_TREE,
|
|
58
|
+
value: bigint,
|
|
59
|
+
): Promise<{
|
|
60
|
+
/**
|
|
61
|
+
* The index of the found leaf.
|
|
62
|
+
*/
|
|
63
|
+
index: number;
|
|
64
|
+
/**
|
|
65
|
+
* A flag indicating if the corresponding leaf's value is equal to `newValue`.
|
|
66
|
+
*/
|
|
67
|
+
alreadyPresent: boolean;
|
|
68
|
+
}> {
|
|
69
|
+
return this.trees.getPreviousValueIndex(treeId, value, this.includeUncommitted);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Updates a leaf in a tree at a given index.
|
|
74
|
+
* @param treeId - The ID of the tree.
|
|
75
|
+
* @param leaf - The new leaf value.
|
|
76
|
+
* @param index - The index to insert into.
|
|
77
|
+
* @returns Empty promise.
|
|
78
|
+
*/
|
|
79
|
+
updateLeaf(treeId: MerkleTreeId.NULLIFIER_TREE, leaf: LeafData, index: bigint): Promise<void> {
|
|
80
|
+
return this.trees.updateLeaf(treeId, leaf, index);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Gets the leaf data at a given index and tree.
|
|
85
|
+
* @param treeId - The ID of the tree get the leaf from.
|
|
86
|
+
* @param index - The index of the leaf to get.
|
|
87
|
+
* @returns Leaf data.
|
|
88
|
+
*/
|
|
89
|
+
getLeafData(treeId: MerkleTreeId.NULLIFIER_TREE, index: number): Promise<LeafData | undefined> {
|
|
90
|
+
return this.trees.getLeafData(treeId, index, this.includeUncommitted);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Returns the index of a leaf given its value, or undefined if no leaf with that value is found.
|
|
95
|
+
* @param treeId - The ID of the tree.
|
|
96
|
+
* @param value - The leaf value to look for.
|
|
97
|
+
* @returns The index of the first leaf found with a given value (undefined if not found).
|
|
98
|
+
*/
|
|
99
|
+
findLeafIndex(treeId: MerkleTreeId, value: Buffer): Promise<bigint | undefined> {
|
|
100
|
+
return this.trees.findLeafIndex(treeId, value, this.includeUncommitted);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Gets the value at the given index.
|
|
105
|
+
* @param treeId - The ID of the tree to get the leaf value from.
|
|
106
|
+
* @param index - The index of the leaf.
|
|
107
|
+
* @param includeUncommitted - Indicates whether to include uncommitted changes.
|
|
108
|
+
* @returns Leaf value at the given index (undefined if not found).
|
|
109
|
+
*/
|
|
110
|
+
getLeafValue(treeId: MerkleTreeId, index: bigint): Promise<Buffer | undefined> {
|
|
111
|
+
return this.trees.getLeafValue(treeId, index, this.includeUncommitted);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Inserts into the roots trees (CONTRACT_TREE_ROOTS_TREE, PRIVATE_DATA_TREE_ROOTS_TREE)
|
|
116
|
+
* the current roots of the corresponding trees (CONTRACT_TREE, PRIVATE_DATA_TREE).
|
|
117
|
+
* @returns Empty promise.
|
|
118
|
+
*/
|
|
119
|
+
public updateHistoricRootsTrees(): Promise<void> {
|
|
120
|
+
return this.trees.updateHistoricRootsTrees(this.includeUncommitted);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* Handles a single L2 block (i.e. Inserts the new commitments into the merkle tree).
|
|
125
|
+
* @param block - The L2 block to handle.
|
|
126
|
+
* @returns Empty promise.
|
|
127
|
+
*/
|
|
128
|
+
public handleL2Block(block: L2Block): Promise<void> {
|
|
129
|
+
return this.trees.handleL2Block(block);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Commits all pending updates.
|
|
134
|
+
* @returns Empty promise.
|
|
135
|
+
*/
|
|
136
|
+
public async commit(): Promise<void> {
|
|
137
|
+
return await this.trees.commit();
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Rolls back all pending updates.
|
|
142
|
+
* @returns Empty promise.
|
|
143
|
+
*/
|
|
144
|
+
public async rollback(): Promise<void> {
|
|
145
|
+
return await this.trees.rollback();
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* Batch insert multiple leaves into the tree.
|
|
150
|
+
* @param treeId - The ID of the tree.
|
|
151
|
+
* @param leaves - Leaves to insert into the tree.
|
|
152
|
+
* @param treeHeight - Height of the tree.
|
|
153
|
+
* @param subtreeHeight - Height of the subtree.
|
|
154
|
+
* @returns The data for the leaves to be updated when inserting the new ones.
|
|
155
|
+
*/
|
|
156
|
+
public batchInsert(
|
|
157
|
+
treeId: MerkleTreeId,
|
|
158
|
+
leaves: Buffer[],
|
|
159
|
+
treeHeight: number,
|
|
160
|
+
subtreeHeight: number,
|
|
161
|
+
): Promise<[LowLeafWitnessData<number>[], SiblingPath<number>] | [undefined, SiblingPath<number>]> {
|
|
162
|
+
return this.trees.batchInsert(treeId, leaves, treeHeight, subtreeHeight);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* World State synchroniser configuration values.
|
|
3
|
+
*/
|
|
4
|
+
export interface WorldStateConfig {
|
|
5
|
+
/**
|
|
6
|
+
* The frequency in which to check.
|
|
7
|
+
*/
|
|
8
|
+
checkInterval: number;
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Size of queue of L2 blocks to store.
|
|
12
|
+
*/
|
|
13
|
+
l2QueueSize: number;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Returns the configuration values for the world state synchroniser.
|
|
18
|
+
* @returns The configuration values for the world state synchroniser.
|
|
19
|
+
*/
|
|
20
|
+
export function getConfigEnvVars(): WorldStateConfig {
|
|
21
|
+
const { WS_CHECK_INTERVAL, WS_L2_BLOCK_QUEUE_SIZE } = process.env;
|
|
22
|
+
const envVars: WorldStateConfig = {
|
|
23
|
+
checkInterval: WS_CHECK_INTERVAL ? +WS_CHECK_INTERVAL : 100,
|
|
24
|
+
l2QueueSize: WS_L2_BLOCK_QUEUE_SIZE ? +WS_L2_BLOCK_QUEUE_SIZE : 1000,
|
|
25
|
+
};
|
|
26
|
+
return envVars;
|
|
27
|
+
}
|