@aztec/world-state 0.16.1 → 0.16.2
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 +2 -2
- package/dest/merkle-tree/merkle_tree_operations_facade.d.ts +11 -9
- package/dest/merkle-tree/merkle_tree_operations_facade.d.ts.map +1 -1
- package/dest/merkle-tree/merkle_tree_operations_facade.js +7 -6
- package/dest/merkle-tree/merkle_tree_snapshot_operations_facade.d.ts +40 -0
- package/dest/merkle-tree/merkle_tree_snapshot_operations_facade.d.ts.map +1 -0
- package/dest/merkle-tree/merkle_tree_snapshot_operations_facade.js +100 -0
- package/dest/synchronizer/server_world_state_synchronizer.d.ts +3 -2
- package/dest/synchronizer/server_world_state_synchronizer.d.ts.map +1 -1
- package/dest/synchronizer/server_world_state_synchronizer.js +9 -5
- package/dest/synchronizer/world_state_synchronizer.d.ts +8 -2
- package/dest/synchronizer/world_state_synchronizer.d.ts.map +1 -1
- package/dest/world-state-db/index.d.ts +0 -1
- package/dest/world-state-db/index.d.ts.map +1 -1
- package/dest/world-state-db/merkle_tree_db.d.ts +16 -8
- package/dest/world-state-db/merkle_tree_db.d.ts.map +1 -1
- package/dest/world-state-db/merkle_tree_db.js +1 -1
- package/dest/world-state-db/merkle_trees.d.ts +12 -9
- package/dest/world-state-db/merkle_trees.d.ts.map +1 -1
- package/dest/world-state-db/merkle_trees.js +33 -22
- package/package.json +5 -5
- package/src/merkle-tree/merkle_tree_operations_facade.ts +29 -27
- package/src/merkle-tree/merkle_tree_snapshot_operations_facade.ts +143 -0
- package/src/synchronizer/server_world_state_synchronizer.ts +10 -5
- package/src/synchronizer/world_state_synchronizer.ts +9 -2
- package/src/world-state-db/index.ts +0 -1
- package/src/world-state-db/merkle_tree_db.ts +28 -18
- package/src/world-state-db/merkle_trees.ts +60 -49
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/// <reference types="node" resolution-mode="require"/>
|
|
2
2
|
import { Fr } from '@aztec/circuits.js';
|
|
3
|
-
import {
|
|
3
|
+
import { IndexedTreeLeafPreimage } from '@aztec/foundation/trees';
|
|
4
|
+
import { BatchInsertionResult } from '@aztec/merkle-tree';
|
|
4
5
|
import { L2Block, MerkleTreeId, SiblingPath } from '@aztec/types';
|
|
5
6
|
import { default as levelup } from 'levelup';
|
|
6
7
|
import { CurrentTreeRoots, HandleL2BlockResult, IndexedTreeId, MerkleTreeDb, MerkleTreeOperations, PublicTreeId, TreeInfo } from './merkle_tree_db.js';
|
|
@@ -54,7 +55,7 @@ export declare class MerkleTrees implements MerkleTreeDb {
|
|
|
54
55
|
* @param globalsHash - The current global variables hash.
|
|
55
56
|
* @param includeUncommitted - Indicates whether to include uncommitted data.
|
|
56
57
|
*/
|
|
57
|
-
|
|
58
|
+
updateBlocksTree(globalsHash: Fr, includeUncommitted: boolean): Promise<void>;
|
|
58
59
|
/**
|
|
59
60
|
* Updates the latest global variables hash
|
|
60
61
|
* @param globalVariablesHash - The latest global variables hash
|
|
@@ -124,20 +125,20 @@ export declare class MerkleTrees implements MerkleTreeDb {
|
|
|
124
125
|
/**
|
|
125
126
|
* The index of the found leaf.
|
|
126
127
|
*/
|
|
127
|
-
index:
|
|
128
|
+
index: bigint;
|
|
128
129
|
/**
|
|
129
130
|
* A flag indicating if the corresponding leaf's value is equal to `newValue`.
|
|
130
131
|
*/
|
|
131
132
|
alreadyPresent: boolean;
|
|
132
|
-
}>;
|
|
133
|
+
} | undefined>;
|
|
133
134
|
/**
|
|
134
135
|
* Gets the leaf data at a given index and tree.
|
|
135
136
|
* @param treeId - The ID of the tree get the leaf from.
|
|
136
137
|
* @param index - The index of the leaf to get.
|
|
137
138
|
* @param includeUncommitted - Indicates whether to include uncommitted data.
|
|
138
|
-
* @returns Leaf
|
|
139
|
+
* @returns Leaf preimage.
|
|
139
140
|
*/
|
|
140
|
-
|
|
141
|
+
getLeafPreimage(treeId: IndexedTreeId, index: bigint, includeUncommitted: boolean): Promise<IndexedTreeLeafPreimage | undefined>;
|
|
141
142
|
/**
|
|
142
143
|
* Returns the index of a leaf given its value, or undefined if no leaf with that value is found.
|
|
143
144
|
* @param treeId - The ID of the tree.
|
|
@@ -153,7 +154,7 @@ export declare class MerkleTrees implements MerkleTreeDb {
|
|
|
153
154
|
* @param index - The index to insert into.
|
|
154
155
|
* @returns Empty promise.
|
|
155
156
|
*/
|
|
156
|
-
updateLeaf(treeId: IndexedTreeId | PublicTreeId, leaf:
|
|
157
|
+
updateLeaf(treeId: IndexedTreeId | PublicTreeId, leaf: Buffer, index: bigint): Promise<void>;
|
|
157
158
|
/**
|
|
158
159
|
* Handles a single L2 block (i.e. Inserts the new commitments into the merkle tree).
|
|
159
160
|
* @param block - The L2 block to handle.
|
|
@@ -167,7 +168,7 @@ export declare class MerkleTrees implements MerkleTreeDb {
|
|
|
167
168
|
* @param subtreeHeight - Height of the subtree.
|
|
168
169
|
* @returns The data for the leaves to be updated when inserting the new ones.
|
|
169
170
|
*/
|
|
170
|
-
batchInsert<TreeHeight extends number, SubtreeHeight extends number, SubtreeSiblingPathHeight extends number>(treeId: MerkleTreeId, leaves: Buffer[], subtreeHeight: SubtreeHeight): Promise<
|
|
171
|
+
batchInsert<TreeHeight extends number, SubtreeHeight extends number, SubtreeSiblingPathHeight extends number>(treeId: MerkleTreeId, leaves: Buffer[], subtreeHeight: SubtreeHeight): Promise<BatchInsertionResult<TreeHeight, SubtreeSiblingPathHeight>>;
|
|
171
172
|
/**
|
|
172
173
|
* Waits for all jobs to finish before executing the given function.
|
|
173
174
|
* @param fn - The function to execute.
|
|
@@ -176,7 +177,7 @@ export declare class MerkleTrees implements MerkleTreeDb {
|
|
|
176
177
|
private synchronize;
|
|
177
178
|
private _updateLatestGlobalVariablesHash;
|
|
178
179
|
private _getGlobalVariablesHash;
|
|
179
|
-
private
|
|
180
|
+
private _updateBlocksTree;
|
|
180
181
|
/**
|
|
181
182
|
* Returns the tree info for the specified tree id.
|
|
182
183
|
* @param treeId - Id of the tree to get information from.
|
|
@@ -216,6 +217,8 @@ export declare class MerkleTrees implements MerkleTreeDb {
|
|
|
216
217
|
* @returns Empty promise.
|
|
217
218
|
*/
|
|
218
219
|
private _rollback;
|
|
220
|
+
getSnapshot(blockNumber: number): Promise<import("@aztec/merkle-tree").TreeSnapshot[]>;
|
|
221
|
+
private _snapshot;
|
|
219
222
|
/**
|
|
220
223
|
* Handles a single L2 block (i.e. Inserts the new commitments into the merkle tree).
|
|
221
224
|
* @param l2Block - The L2 block to handle.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"merkle_trees.d.ts","sourceRoot":"","sources":["../../src/world-state-db/merkle_trees.ts"],"names":[],"mappings":";AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"merkle_trees.d.ts","sourceRoot":"","sources":["../../src/world-state-db/merkle_trees.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { CONTRACT_TREE_HEIGHT, Fr, GlobalVariables,
|
|
1
|
+
import { BLOCKS_TREE_HEIGHT, CONTRACT_TREE_HEIGHT, Fr, GlobalVariables, L1_TO_L2_MSG_TREE_HEIGHT, NOTE_HASH_TREE_HEIGHT, NULLIFIER_SUBTREE_HEIGHT, NULLIFIER_TREE_HEIGHT, NullifierLeaf, NullifierLeafPreimage, PUBLIC_DATA_TREE_HEIGHT, } from '@aztec/circuits.js';
|
|
2
2
|
import { computeBlockHash, computeGlobalsHash } from '@aztec/circuits.js/abis';
|
|
3
3
|
import { Committable } from '@aztec/foundation/committable';
|
|
4
4
|
import { SerialQueue } from '@aztec/foundation/fifo';
|
|
@@ -8,6 +8,14 @@ import { MerkleTreeId } from '@aztec/types';
|
|
|
8
8
|
import { MerkleTreeOperationsFacade } from '../merkle-tree/merkle_tree_operations_facade.js';
|
|
9
9
|
import { INITIAL_NULLIFIER_TREE_SIZE, } from './merkle_tree_db.js';
|
|
10
10
|
const LAST_GLOBAL_VARS_HASH = 'lastGlobalVarsHash';
|
|
11
|
+
/**
|
|
12
|
+
* The nullifier tree is an indexed tree.
|
|
13
|
+
*/
|
|
14
|
+
class NullifierTree extends StandardIndexedTree {
|
|
15
|
+
constructor(db, hasher, name, depth, size = 0n, root) {
|
|
16
|
+
super(db, hasher, name, depth, size, NullifierLeafPreimage, NullifierLeaf, root);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
11
19
|
/**
|
|
12
20
|
* A convenience class for managing multiple merkle trees.
|
|
13
21
|
*/
|
|
@@ -28,18 +36,18 @@ export class MerkleTrees {
|
|
|
28
36
|
const initializeTree = fromDb ? loadTree : newTree;
|
|
29
37
|
const hasher = new Pedersen();
|
|
30
38
|
const contractTree = await initializeTree(StandardTree, this.db, hasher, `${MerkleTreeId[MerkleTreeId.CONTRACT_TREE]}`, CONTRACT_TREE_HEIGHT);
|
|
31
|
-
const nullifierTree = await initializeTree(
|
|
39
|
+
const nullifierTree = await initializeTree(NullifierTree, this.db, hasher, `${MerkleTreeId[MerkleTreeId.NULLIFIER_TREE]}`, NULLIFIER_TREE_HEIGHT, INITIAL_NULLIFIER_TREE_SIZE);
|
|
32
40
|
const noteHashTree = await initializeTree(StandardTree, this.db, hasher, `${MerkleTreeId[MerkleTreeId.NOTE_HASH_TREE]}`, NOTE_HASH_TREE_HEIGHT);
|
|
33
41
|
const publicDataTree = await initializeTree(SparseTree, this.db, hasher, `${MerkleTreeId[MerkleTreeId.PUBLIC_DATA_TREE]}`, PUBLIC_DATA_TREE_HEIGHT);
|
|
34
42
|
const l1Tol2MessagesTree = await initializeTree(StandardTree, this.db, hasher, `${MerkleTreeId[MerkleTreeId.L1_TO_L2_MESSAGES_TREE]}`, L1_TO_L2_MSG_TREE_HEIGHT);
|
|
35
|
-
const
|
|
36
|
-
this.trees = [contractTree, nullifierTree, noteHashTree, publicDataTree, l1Tol2MessagesTree,
|
|
43
|
+
const blocksTree = await initializeTree(StandardTree, this.db, hasher, `${MerkleTreeId[MerkleTreeId.BLOCKS_TREE]}`, BLOCKS_TREE_HEIGHT);
|
|
44
|
+
this.trees = [contractTree, nullifierTree, noteHashTree, publicDataTree, l1Tol2MessagesTree, blocksTree];
|
|
37
45
|
this.jobQueue.start();
|
|
38
46
|
// The first leaf in the blocks tree contains the empty roots of the other trees and empty global variables.
|
|
39
47
|
if (!fromDb) {
|
|
40
48
|
const initialGlobalVariablesHash = computeGlobalsHash(GlobalVariables.empty());
|
|
41
49
|
await this._updateLatestGlobalVariablesHash(initialGlobalVariablesHash);
|
|
42
|
-
await this.
|
|
50
|
+
await this._updateBlocksTree(initialGlobalVariablesHash, true);
|
|
43
51
|
await this._commit();
|
|
44
52
|
}
|
|
45
53
|
else {
|
|
@@ -85,8 +93,8 @@ export class MerkleTrees {
|
|
|
85
93
|
* @param globalsHash - The current global variables hash.
|
|
86
94
|
* @param includeUncommitted - Indicates whether to include uncommitted data.
|
|
87
95
|
*/
|
|
88
|
-
async
|
|
89
|
-
await this.synchronize(() => this.
|
|
96
|
+
async updateBlocksTree(globalsHash, includeUncommitted) {
|
|
97
|
+
await this.synchronize(() => this._updateBlocksTree(globalsHash, includeUncommitted));
|
|
90
98
|
}
|
|
91
99
|
/**
|
|
92
100
|
* Updates the latest global variables hash
|
|
@@ -193,17 +201,17 @@ export class MerkleTrees {
|
|
|
193
201
|
* @returns The found leaf index and a flag indicating if the corresponding leaf's value is equal to `newValue`.
|
|
194
202
|
*/
|
|
195
203
|
async getPreviousValueIndex(treeId, value, includeUncommitted) {
|
|
196
|
-
return await this.synchronize(() =>
|
|
204
|
+
return await this.synchronize(() => this._getIndexedTree(treeId).findIndexOfPreviousKey(value, includeUncommitted));
|
|
197
205
|
}
|
|
198
206
|
/**
|
|
199
207
|
* Gets the leaf data at a given index and tree.
|
|
200
208
|
* @param treeId - The ID of the tree get the leaf from.
|
|
201
209
|
* @param index - The index of the leaf to get.
|
|
202
210
|
* @param includeUncommitted - Indicates whether to include uncommitted data.
|
|
203
|
-
* @returns Leaf
|
|
211
|
+
* @returns Leaf preimage.
|
|
204
212
|
*/
|
|
205
|
-
async
|
|
206
|
-
return await this.synchronize(() =>
|
|
213
|
+
async getLeafPreimage(treeId, index, includeUncommitted) {
|
|
214
|
+
return await this.synchronize(() => this._getIndexedTree(treeId).getLatestLeafPreimageCopy(index, includeUncommitted));
|
|
207
215
|
}
|
|
208
216
|
/**
|
|
209
217
|
* Returns the index of a leaf given its value, or undefined if no leaf with that value is found.
|
|
@@ -215,13 +223,7 @@ export class MerkleTrees {
|
|
|
215
223
|
async findLeafIndex(treeId, value, includeUncommitted) {
|
|
216
224
|
return await this.synchronize(async () => {
|
|
217
225
|
const tree = this.trees[treeId];
|
|
218
|
-
|
|
219
|
-
const currentValue = await tree.getLeafValue(i, includeUncommitted);
|
|
220
|
-
if (currentValue && currentValue.equals(value)) {
|
|
221
|
-
return i;
|
|
222
|
-
}
|
|
223
|
-
}
|
|
224
|
-
return undefined;
|
|
226
|
+
return await tree.findLeafIndex(value, includeUncommitted);
|
|
225
227
|
});
|
|
226
228
|
}
|
|
227
229
|
/**
|
|
@@ -271,7 +273,7 @@ export class MerkleTrees {
|
|
|
271
273
|
_getGlobalVariablesHash(includeUncommitted) {
|
|
272
274
|
return Promise.resolve(this.latestGlobalVariablesHash.get(includeUncommitted));
|
|
273
275
|
}
|
|
274
|
-
async
|
|
276
|
+
async _updateBlocksTree(globalsHash, includeUncommitted) {
|
|
275
277
|
const blockHash = await this._getCurrentBlockHash(globalsHash, includeUncommitted);
|
|
276
278
|
await this._appendLeaves(MerkleTreeId.BLOCKS_TREE, [blockHash.toBuffer()]);
|
|
277
279
|
}
|
|
@@ -349,6 +351,14 @@ export class MerkleTrees {
|
|
|
349
351
|
}
|
|
350
352
|
this.latestGlobalVariablesHash.rollback();
|
|
351
353
|
}
|
|
354
|
+
getSnapshot(blockNumber) {
|
|
355
|
+
return Promise.all(this.trees.map(tree => tree.getSnapshot(blockNumber)));
|
|
356
|
+
}
|
|
357
|
+
async _snapshot(blockNumber) {
|
|
358
|
+
for (const tree of this.trees) {
|
|
359
|
+
await tree.snapshot(blockNumber);
|
|
360
|
+
}
|
|
361
|
+
}
|
|
352
362
|
/**
|
|
353
363
|
* Handles a single L2 block (i.e. Inserts the new commitments into the merkle tree).
|
|
354
364
|
* @param l2Block - The L2 block to handle.
|
|
@@ -360,7 +370,7 @@ export class MerkleTrees {
|
|
|
360
370
|
[l2Block.endNoteHashTreeSnapshot.root, MerkleTreeId.NOTE_HASH_TREE],
|
|
361
371
|
[l2Block.endPublicDataTreeRoot, MerkleTreeId.PUBLIC_DATA_TREE],
|
|
362
372
|
[l2Block.endL1ToL2MessagesTreeSnapshot.root, MerkleTreeId.L1_TO_L2_MESSAGES_TREE],
|
|
363
|
-
[l2Block.
|
|
373
|
+
[l2Block.endBlocksTreeSnapshot.root, MerkleTreeId.BLOCKS_TREE],
|
|
364
374
|
];
|
|
365
375
|
const compareRoot = (root, treeId) => {
|
|
366
376
|
const treeRoot = this.trees[treeId].getRoot(true);
|
|
@@ -392,7 +402,7 @@ export class MerkleTrees {
|
|
|
392
402
|
const { newValue, leafIndex } = dataWrite;
|
|
393
403
|
await this._updateLeaf(MerkleTreeId.PUBLIC_DATA_TREE, newValue.toBuffer(), leafIndex.value);
|
|
394
404
|
}
|
|
395
|
-
// Sync and add the block to the
|
|
405
|
+
// Sync and add the block to the blocks tree
|
|
396
406
|
const globalVariablesHash = computeGlobalsHash(l2Block.globalVariables);
|
|
397
407
|
await this._updateLatestGlobalVariablesHash(globalVariablesHash);
|
|
398
408
|
this.log(`Synced global variables with hash ${globalVariablesHash}`);
|
|
@@ -413,7 +423,8 @@ export class MerkleTrees {
|
|
|
413
423
|
this.log(`Tree ${treeName} synched with size ${info.size} root ${rootStr}`);
|
|
414
424
|
}
|
|
415
425
|
}
|
|
426
|
+
await this._snapshot(l2Block.number);
|
|
416
427
|
return { isBlockOurs: ourBlock };
|
|
417
428
|
}
|
|
418
429
|
}
|
|
419
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVya2xlX3RyZWVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3dvcmxkLXN0YXRlLWRiL21lcmtsZV90cmVlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsb0JBQW9CLEVBQ3BCLEVBQUUsRUFDRixlQUFlLEVBQ2YsMkJBQTJCLEVBQzNCLHdCQUF3QixFQUN4QixxQkFBcUIsRUFDckIsd0JBQXdCLEVBQ3hCLHFCQUFxQixFQUNyQix1QkFBdUIsR0FDeEIsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUMvRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDNUQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzFELE9BQU8sRUFLTCxRQUFRLEVBQ1IsVUFBVSxFQUNWLG1CQUFtQixFQUNuQixZQUFZLEVBRVosUUFBUSxFQUNSLE9BQU8sR0FDUixNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFBVyxZQUFZLEVBQWUsTUFBTSxjQUFjLENBQUM7QUFJbEUsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0saURBQWlELENBQUM7QUFDN0YsT0FBTyxFQUdMLDJCQUEyQixHQU01QixNQUFNLHFCQUFxQixDQUFDO0FBWTdCLE1BQU0scUJBQXFCLEdBQUcsb0JBQW9CLENBQUM7QUFFbkQ7O0dBRUc7QUFDSCxNQUFNLE9BQU8sV0FBVztJQUt0QixZQUFvQixFQUFtQixFQUFVLE1BQU0saUJBQWlCLENBQUMsb0JBQW9CLENBQUM7UUFBMUUsT0FBRSxHQUFGLEVBQUUsQ0FBaUI7UUFBVSxRQUFHLEdBQUgsR0FBRyxDQUEwQztRQUp0RixVQUFLLEdBQXdDLEVBQUUsQ0FBQztRQUVoRCxhQUFR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
|
|
430
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVya2xlX3RyZWVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3dvcmxkLXN0YXRlLWRiL21lcmtsZV90cmVlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsa0JBQWtCLEVBQ2xCLG9CQUFvQixFQUNwQixFQUFFLEVBQ0YsZUFBZSxFQUNmLHdCQUF3QixFQUN4QixxQkFBcUIsRUFDckIsd0JBQXdCLEVBQ3hCLHFCQUFxQixFQUNyQixhQUFhLEVBQ2IscUJBQXFCLEVBQ3JCLHVCQUF1QixHQUN4QixNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQy9FLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUM1RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDckQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFMUQsT0FBTyxFQUlMLFFBQVEsRUFDUixVQUFVLEVBQ1YsbUJBQW1CLEVBQ25CLFlBQVksRUFFWixRQUFRLEVBQ1IsT0FBTyxHQUNSLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFtQixZQUFZLEVBQWUsTUFBTSxjQUFjLENBQUM7QUFJMUUsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0saURBQWlELENBQUM7QUFDN0YsT0FBTyxFQUdMLDJCQUEyQixHQU01QixNQUFNLHFCQUFxQixDQUFDO0FBWTdCLE1BQU0scUJBQXFCLEdBQUcsb0JBQW9CLENBQUM7QUFFbkQ7O0dBRUc7QUFDSCxNQUFNLGFBQWMsU0FBUSxtQkFBbUI7SUFDN0MsWUFBWSxFQUFtQixFQUFFLE1BQWMsRUFBRSxJQUFZLEVBQUUsS0FBYSxFQUFFLE9BQWUsRUFBRSxFQUFFLElBQWE7UUFDNUcsS0FBSyxDQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFB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
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/world-state",
|
|
3
|
-
"version": "0.16.
|
|
3
|
+
"version": "0.16.2",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": "./dest/index.js",
|
|
6
6
|
"typedocOptions": {
|
|
@@ -30,10 +30,10 @@
|
|
|
30
30
|
"rootDir": "./src"
|
|
31
31
|
},
|
|
32
32
|
"dependencies": {
|
|
33
|
-
"@aztec/circuits.js": "0.16.
|
|
34
|
-
"@aztec/foundation": "0.16.
|
|
35
|
-
"@aztec/merkle-tree": "0.16.
|
|
36
|
-
"@aztec/types": "0.16.
|
|
33
|
+
"@aztec/circuits.js": "0.16.2",
|
|
34
|
+
"@aztec/foundation": "0.16.2",
|
|
35
|
+
"@aztec/merkle-tree": "0.16.2",
|
|
36
|
+
"@aztec/types": "0.16.2",
|
|
37
37
|
"levelup": "^5.1.1",
|
|
38
38
|
"lodash.times": "^4.3.2",
|
|
39
39
|
"memdown": "^6.1.1",
|
|
@@ -1,15 +1,10 @@
|
|
|
1
|
+
import { NullifierLeafPreimage } from '@aztec/circuits.js';
|
|
1
2
|
import { Fr } from '@aztec/foundation/fields';
|
|
2
|
-
import {
|
|
3
|
+
import { IndexedTreeLeafPreimage } from '@aztec/foundation/trees';
|
|
4
|
+
import { BatchInsertionResult } from '@aztec/merkle-tree';
|
|
3
5
|
import { L2Block, MerkleTreeId, SiblingPath } from '@aztec/types';
|
|
4
6
|
|
|
5
|
-
import {
|
|
6
|
-
CurrentTreeRoots,
|
|
7
|
-
HandleL2BlockResult,
|
|
8
|
-
LeafData,
|
|
9
|
-
MerkleTreeDb,
|
|
10
|
-
MerkleTreeOperations,
|
|
11
|
-
TreeInfo,
|
|
12
|
-
} from '../index.js';
|
|
7
|
+
import { CurrentTreeRoots, HandleL2BlockResult, MerkleTreeDb, MerkleTreeOperations, TreeInfo } from '../index.js';
|
|
13
8
|
|
|
14
9
|
/**
|
|
15
10
|
* Wraps a MerkleTreeDbOperations to call all functions with a preset includeUncommitted flag.
|
|
@@ -66,16 +61,19 @@ export class MerkleTreeOperationsFacade implements MerkleTreeOperations {
|
|
|
66
61
|
getPreviousValueIndex(
|
|
67
62
|
treeId: MerkleTreeId.NULLIFIER_TREE,
|
|
68
63
|
value: bigint,
|
|
69
|
-
): Promise<
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
64
|
+
): Promise<
|
|
65
|
+
| {
|
|
66
|
+
/**
|
|
67
|
+
* The index of the found leaf.
|
|
68
|
+
*/
|
|
69
|
+
index: bigint;
|
|
70
|
+
/**
|
|
71
|
+
* A flag indicating if the corresponding leaf's value is equal to `newValue`.
|
|
72
|
+
*/
|
|
73
|
+
alreadyPresent: boolean;
|
|
74
|
+
}
|
|
75
|
+
| undefined
|
|
76
|
+
> {
|
|
79
77
|
return this.trees.getPreviousValueIndex(treeId, value, this.includeUncommitted);
|
|
80
78
|
}
|
|
81
79
|
|
|
@@ -86,7 +84,7 @@ export class MerkleTreeOperationsFacade implements MerkleTreeOperations {
|
|
|
86
84
|
* @param index - The index to insert into.
|
|
87
85
|
* @returns Empty promise.
|
|
88
86
|
*/
|
|
89
|
-
updateLeaf(treeId: MerkleTreeId.NULLIFIER_TREE, leaf:
|
|
87
|
+
updateLeaf(treeId: MerkleTreeId.NULLIFIER_TREE, leaf: NullifierLeafPreimage, index: bigint): Promise<void> {
|
|
90
88
|
return this.trees.updateLeaf(treeId, leaf, index);
|
|
91
89
|
}
|
|
92
90
|
|
|
@@ -94,10 +92,14 @@ export class MerkleTreeOperationsFacade implements MerkleTreeOperations {
|
|
|
94
92
|
* Gets the leaf data at a given index and tree.
|
|
95
93
|
* @param treeId - The ID of the tree get the leaf from.
|
|
96
94
|
* @param index - The index of the leaf to get.
|
|
97
|
-
* @returns Leaf
|
|
95
|
+
* @returns Leaf preimage.
|
|
98
96
|
*/
|
|
99
|
-
|
|
100
|
-
|
|
97
|
+
async getLeafPreimage(
|
|
98
|
+
treeId: MerkleTreeId.NULLIFIER_TREE,
|
|
99
|
+
index: bigint,
|
|
100
|
+
): Promise<IndexedTreeLeafPreimage | undefined> {
|
|
101
|
+
const preimage = await this.trees.getLeafPreimage(treeId, index, this.includeUncommitted);
|
|
102
|
+
return preimage as IndexedTreeLeafPreimage | undefined;
|
|
101
103
|
}
|
|
102
104
|
|
|
103
105
|
/**
|
|
@@ -127,8 +129,8 @@ export class MerkleTreeOperationsFacade implements MerkleTreeOperations {
|
|
|
127
129
|
* @param globalVariablesHash - The hash of the current global variables to include in the block hash.
|
|
128
130
|
* @returns Empty promise.
|
|
129
131
|
*/
|
|
130
|
-
public
|
|
131
|
-
return this.trees.
|
|
132
|
+
public updateBlocksTree(globalVariablesHash: Fr): Promise<void> {
|
|
133
|
+
return this.trees.updateBlocksTree(globalVariablesHash, this.includeUncommitted);
|
|
132
134
|
}
|
|
133
135
|
|
|
134
136
|
/**
|
|
@@ -178,11 +180,11 @@ export class MerkleTreeOperationsFacade implements MerkleTreeOperations {
|
|
|
178
180
|
* @param subtreeHeight - Height of the subtree.
|
|
179
181
|
* @returns The data for the leaves to be updated when inserting the new ones.
|
|
180
182
|
*/
|
|
181
|
-
public batchInsert(
|
|
183
|
+
public batchInsert<TreeHeight extends number, SubtreeSiblingPathHeight extends number>(
|
|
182
184
|
treeId: MerkleTreeId,
|
|
183
185
|
leaves: Buffer[],
|
|
184
186
|
subtreeHeight: number,
|
|
185
|
-
): Promise<
|
|
187
|
+
): Promise<BatchInsertionResult<TreeHeight, SubtreeSiblingPathHeight>> {
|
|
186
188
|
return this.trees.batchInsert(treeId, leaves, subtreeHeight);
|
|
187
189
|
}
|
|
188
190
|
}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { Fr } from '@aztec/circuits.js';
|
|
2
|
+
import { IndexedTreeLeafPreimage } from '@aztec/foundation/trees';
|
|
3
|
+
import { BatchInsertionResult, IndexedTreeSnapshot, TreeSnapshot } from '@aztec/merkle-tree';
|
|
4
|
+
import { MerkleTreeId, SiblingPath } from '@aztec/types';
|
|
5
|
+
|
|
6
|
+
import { CurrentTreeRoots, HandleL2BlockResult, MerkleTreeDb, MerkleTreeOperations, TreeInfo } from '../index.js';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Merkle tree operations on readonly tree snapshots.
|
|
10
|
+
*/
|
|
11
|
+
export class MerkleTreeSnapshotOperationsFacade implements MerkleTreeOperations {
|
|
12
|
+
#treesDb: MerkleTreeDb;
|
|
13
|
+
#blockNumber: number;
|
|
14
|
+
#treeSnapshots: ReadonlyArray<TreeSnapshot | IndexedTreeSnapshot> = [];
|
|
15
|
+
|
|
16
|
+
constructor(trees: MerkleTreeDb, blockNumber: number) {
|
|
17
|
+
this.#treesDb = trees;
|
|
18
|
+
this.#blockNumber = blockNumber;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
async #getTreeSnapshot(merkleTreeId: number): Promise<TreeSnapshot | IndexedTreeSnapshot> {
|
|
22
|
+
if (this.#treeSnapshots[merkleTreeId]) {
|
|
23
|
+
return this.#treeSnapshots[merkleTreeId];
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
this.#treeSnapshots = await this.#treesDb.getSnapshot(this.#blockNumber);
|
|
27
|
+
return this.#treeSnapshots[merkleTreeId]!;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
async findLeafIndex(treeId: MerkleTreeId, value: Buffer): Promise<bigint | undefined> {
|
|
31
|
+
const tree = await this.#getTreeSnapshot(treeId);
|
|
32
|
+
return tree.findLeafIndex(value);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
getLatestGlobalVariablesHash(): Promise<Fr> {
|
|
36
|
+
return Promise.reject(new Error('not implemented'));
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
async getLeafPreimage(
|
|
40
|
+
treeId: MerkleTreeId.NULLIFIER_TREE,
|
|
41
|
+
index: bigint,
|
|
42
|
+
): Promise<IndexedTreeLeafPreimage | undefined> {
|
|
43
|
+
const snapshot = (await this.#getTreeSnapshot(treeId)) as IndexedTreeSnapshot;
|
|
44
|
+
return snapshot.getLatestLeafPreimageCopy(BigInt(index));
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
async getLeafValue(treeId: MerkleTreeId, index: bigint): Promise<Buffer | undefined> {
|
|
48
|
+
const snapshot = await this.#getTreeSnapshot(treeId);
|
|
49
|
+
return snapshot.getLeafValue(BigInt(index));
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
getPreviousValueIndex(
|
|
53
|
+
_treeId: MerkleTreeId.NULLIFIER_TREE,
|
|
54
|
+
_value: bigint,
|
|
55
|
+
): Promise<
|
|
56
|
+
| {
|
|
57
|
+
/**
|
|
58
|
+
* The index of the found leaf.
|
|
59
|
+
*/
|
|
60
|
+
index: bigint;
|
|
61
|
+
/**
|
|
62
|
+
* A flag indicating if the corresponding leaf's value is equal to `newValue`.
|
|
63
|
+
*/
|
|
64
|
+
alreadyPresent: boolean;
|
|
65
|
+
}
|
|
66
|
+
| undefined
|
|
67
|
+
> {
|
|
68
|
+
return Promise.reject(new Error('not implemented'));
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
async getSiblingPath<N extends number>(treeId: MerkleTreeId, index: bigint): Promise<SiblingPath<N>> {
|
|
72
|
+
const snapshot = await this.#getTreeSnapshot(treeId);
|
|
73
|
+
return snapshot.getSiblingPath(index);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
async getTreeInfo(treeId: MerkleTreeId): Promise<TreeInfo> {
|
|
77
|
+
const snapshot = await this.#getTreeSnapshot(treeId);
|
|
78
|
+
return {
|
|
79
|
+
depth: snapshot.getDepth(),
|
|
80
|
+
root: snapshot.getRoot(),
|
|
81
|
+
size: snapshot.getNumLeaves(),
|
|
82
|
+
treeId,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
async getTreeRoots(): Promise<CurrentTreeRoots> {
|
|
87
|
+
const snapshots = await Promise.all([
|
|
88
|
+
this.#getTreeSnapshot(MerkleTreeId.CONTRACT_TREE),
|
|
89
|
+
this.#getTreeSnapshot(MerkleTreeId.NULLIFIER_TREE),
|
|
90
|
+
this.#getTreeSnapshot(MerkleTreeId.NOTE_HASH_TREE),
|
|
91
|
+
this.#getTreeSnapshot(MerkleTreeId.PUBLIC_DATA_TREE),
|
|
92
|
+
this.#getTreeSnapshot(MerkleTreeId.L1_TO_L2_MESSAGES_TREE),
|
|
93
|
+
this.#getTreeSnapshot(MerkleTreeId.BLOCKS_TREE),
|
|
94
|
+
]);
|
|
95
|
+
|
|
96
|
+
return {
|
|
97
|
+
blocksTreeRoot: snapshots[MerkleTreeId.BLOCKS_TREE].getRoot(),
|
|
98
|
+
contractDataTreeRoot: snapshots[MerkleTreeId.CONTRACT_TREE].getRoot(),
|
|
99
|
+
l1Tol2MessagesTreeRoot: snapshots[MerkleTreeId.L1_TO_L2_MESSAGES_TREE].getRoot(),
|
|
100
|
+
noteHashTreeRoot: snapshots[MerkleTreeId.NOTE_HASH_TREE].getRoot(),
|
|
101
|
+
nullifierTreeRoot: snapshots[MerkleTreeId.NULLIFIER_TREE].getRoot(),
|
|
102
|
+
publicDataTreeRoot: snapshots[MerkleTreeId.PUBLIC_DATA_TREE].getRoot(),
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
appendLeaves(): Promise<void> {
|
|
107
|
+
return Promise.reject(new Error('Tree snapshot operations are read-only'));
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
batchInsert<TreeHeight extends number, SubtreeSiblingPathHeight extends number>(): Promise<
|
|
111
|
+
BatchInsertionResult<TreeHeight, SubtreeSiblingPathHeight>
|
|
112
|
+
> {
|
|
113
|
+
return Promise.reject(new Error('Tree snapshot operations are read-only'));
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
updateBlocksTree(): Promise<void> {
|
|
117
|
+
return Promise.reject(new Error('Tree snapshot operations are read-only'));
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
commit(): Promise<void> {
|
|
121
|
+
return Promise.reject(new Error('Tree snapshot operations are read-only'));
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
handleL2Block(): Promise<HandleL2BlockResult> {
|
|
125
|
+
return Promise.reject(new Error('Tree snapshot operations are read-only'));
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
rollback(): Promise<void> {
|
|
129
|
+
return Promise.reject(new Error('Tree snapshot operations are read-only'));
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
updateHistoricBlocksTree(): Promise<void> {
|
|
133
|
+
return Promise.reject(new Error('Tree snapshot operations are read-only'));
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
updateLatestGlobalVariablesHash(): Promise<void> {
|
|
137
|
+
return Promise.reject(new Error('Tree snapshot operations are read-only'));
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
updateLeaf(): Promise<void> {
|
|
141
|
+
return Promise.reject(new Error('Tree snapshot operations are read-only'));
|
|
142
|
+
}
|
|
143
|
+
}
|
|
@@ -8,6 +8,7 @@ import { LevelUp } from 'levelup';
|
|
|
8
8
|
|
|
9
9
|
import { HandleL2BlockResult, MerkleTreeOperations, MerkleTrees } from '../index.js';
|
|
10
10
|
import { MerkleTreeOperationsFacade } from '../merkle-tree/merkle_tree_operations_facade.js';
|
|
11
|
+
import { MerkleTreeSnapshotOperationsFacade } from '../merkle-tree/merkle_tree_snapshot_operations_facade.js';
|
|
11
12
|
import { WorldStateConfig } from './config.js';
|
|
12
13
|
import { WorldStateRunningState, WorldStateStatus, WorldStateSynchronizer } from './world_state_synchronizer.js';
|
|
13
14
|
|
|
@@ -52,6 +53,10 @@ export class ServerWorldStateSynchronizer implements WorldStateSynchronizer {
|
|
|
52
53
|
return new MerkleTreeOperationsFacade(this.merkleTreeDb, false);
|
|
53
54
|
}
|
|
54
55
|
|
|
56
|
+
public getSnapshot(blockNumber: number): MerkleTreeOperations {
|
|
57
|
+
return new MerkleTreeSnapshotOperationsFacade(this.merkleTreeDb, blockNumber);
|
|
58
|
+
}
|
|
59
|
+
|
|
55
60
|
public static async new(
|
|
56
61
|
db: LevelUp,
|
|
57
62
|
merkleTreeDb: MerkleTrees,
|
|
@@ -130,16 +135,16 @@ export class ServerWorldStateSynchronizer implements WorldStateSynchronizer {
|
|
|
130
135
|
/**
|
|
131
136
|
* Forces an immediate sync
|
|
132
137
|
* @param minBlockNumber - The minimum block number that we must sync to
|
|
133
|
-
* @returns A promise that resolves
|
|
138
|
+
* @returns A promise that resolves with the block number the world state was synced to
|
|
134
139
|
*/
|
|
135
|
-
public async syncImmediate(minBlockNumber?: number): Promise<
|
|
140
|
+
public async syncImmediate(minBlockNumber?: number): Promise<number> {
|
|
136
141
|
if (this.currentState !== WorldStateRunningState.RUNNING) {
|
|
137
142
|
throw new Error(`World State is not running, unable to perform sync`);
|
|
138
143
|
}
|
|
139
144
|
// If we have been given a block number to sync to and we have reached that number
|
|
140
145
|
// then return.
|
|
141
146
|
if (minBlockNumber !== undefined && minBlockNumber <= this.currentL2BlockNum) {
|
|
142
|
-
return;
|
|
147
|
+
return this.currentL2BlockNum;
|
|
143
148
|
}
|
|
144
149
|
const blockToSyncTo = minBlockNumber === undefined ? 'latest' : `${minBlockNumber}`;
|
|
145
150
|
this.log(`World State at block ${this.currentL2BlockNum}, told to sync to block ${blockToSyncTo}...`);
|
|
@@ -148,7 +153,7 @@ export class ServerWorldStateSynchronizer implements WorldStateSynchronizer {
|
|
|
148
153
|
while (true) {
|
|
149
154
|
// Check the block number again
|
|
150
155
|
if (minBlockNumber !== undefined && minBlockNumber <= this.currentL2BlockNum) {
|
|
151
|
-
return;
|
|
156
|
+
return this.currentL2BlockNum;
|
|
152
157
|
}
|
|
153
158
|
// Poll for more blocks
|
|
154
159
|
const numBlocks = await this.l2BlockDownloader.pollImmediate();
|
|
@@ -164,7 +169,7 @@ export class ServerWorldStateSynchronizer implements WorldStateSynchronizer {
|
|
|
164
169
|
`Unable to sync to block number ${minBlockNumber}, currently synced to block ${this.currentL2BlockNum}`,
|
|
165
170
|
);
|
|
166
171
|
}
|
|
167
|
-
return;
|
|
172
|
+
return this.currentL2BlockNum;
|
|
168
173
|
}
|
|
169
174
|
}
|
|
170
175
|
|