@aztec/world-state 0.1.0-alpha43 → 0.1.0-alpha45
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/merkle-tree/merkle_tree_operations_facade.d.ts +14 -5
- package/dest/merkle-tree/merkle_tree_operations_facade.d.ts.map +1 -1
- package/dest/merkle-tree/merkle_tree_operations_facade.js +20 -6
- package/dest/synchroniser/server_world_state_synchroniser.d.ts +14 -5
- package/dest/synchroniser/server_world_state_synchroniser.d.ts.map +1 -1
- package/dest/synchroniser/server_world_state_synchroniser.js +55 -14
- package/dest/synchroniser/server_world_state_synchroniser.test.js +112 -5
- package/dest/synchroniser/world_state_synchroniser.d.ts +6 -5
- package/dest/synchroniser/world_state_synchroniser.d.ts.map +1 -1
- package/dest/synchroniser/world_state_synchroniser.js +1 -1
- package/dest/world-state-db/index.d.ts +14 -5
- package/dest/world-state-db/index.d.ts.map +1 -1
- package/dest/world-state-db/index.js +1 -1
- package/dest/world-state-db/merkle_trees.d.ts +20 -6
- package/dest/world-state-db/merkle_trees.d.ts.map +1 -1
- package/dest/world-state-db/merkle_trees.js +51 -16
- package/package.json +5 -5
- package/src/merkle-tree/merkle_tree_operations_facade.ts +23 -7
- package/src/synchroniser/server_world_state_synchroniser.test.ts +148 -7
- package/src/synchroniser/server_world_state_synchroniser.ts +61 -14
- package/src/synchroniser/world_state_synchroniser.ts +7 -7
- package/src/world-state-db/index.ts +17 -5
- package/src/world-state-db/merkle_trees.ts +60 -16
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/// <reference types="node" resolution-mode="require"/>
|
|
2
|
-
import { Fr
|
|
2
|
+
import { Fr } from '@aztec/circuits.js';
|
|
3
3
|
import { IWasmModule } from '@aztec/foundation/wasm';
|
|
4
4
|
import { LeafData, LowLeafWitnessData } from '@aztec/merkle-tree';
|
|
5
5
|
import { L2Block, MerkleTreeId, SiblingPath } from '@aztec/types';
|
|
@@ -12,6 +12,7 @@ export declare class MerkleTrees implements MerkleTreeDb {
|
|
|
12
12
|
private db;
|
|
13
13
|
private log;
|
|
14
14
|
private trees;
|
|
15
|
+
private latestGlobalVariablesHash;
|
|
15
16
|
private jobQueue;
|
|
16
17
|
constructor(db: levelup.LevelUp, log?: import("@aztec/foundation/log").DebugLogger);
|
|
17
18
|
/**
|
|
@@ -43,10 +44,20 @@ export declare class MerkleTrees implements MerkleTreeDb {
|
|
|
43
44
|
/**
|
|
44
45
|
* Inserts into the roots trees (CONTRACT_TREE_ROOTS_TREE, PRIVATE_DATA_TREE_ROOTS_TREE, L1_TO_L2_MESSAGES_TREE_ROOTS_TREE)
|
|
45
46
|
* the current roots of the corresponding trees (CONTRACT_TREE, PRIVATE_DATA_TREE, L1_TO_L2_MESSAGES_TREE).
|
|
46
|
-
* @param
|
|
47
|
+
* @param globalsHash - The current global variables hash.
|
|
47
48
|
* @param includeUncommitted - Indicates whether to include uncommitted data.
|
|
48
49
|
*/
|
|
49
|
-
updateHistoricBlocksTree(
|
|
50
|
+
updateHistoricBlocksTree(globalsHash: Fr, includeUncommitted: boolean): Promise<void>;
|
|
51
|
+
/**
|
|
52
|
+
* Updates the latest global variables hash
|
|
53
|
+
* @param globalVariablesHash - The latest global variables hash
|
|
54
|
+
*/
|
|
55
|
+
updateLatestGlobalVariablesHash(globalVariablesHash: Fr): Promise<void>;
|
|
56
|
+
/**
|
|
57
|
+
* Gets the global variables hash from the previous block
|
|
58
|
+
* @param includeUncommitted - Indicates whether to include uncommitted data.
|
|
59
|
+
*/
|
|
60
|
+
getLatestGlobalVariablesHash(includeUncommitted: boolean): Promise<Fr>;
|
|
50
61
|
/**
|
|
51
62
|
* Gets the tree info for the specified tree.
|
|
52
63
|
* @param treeId - Id of the tree to get information from.
|
|
@@ -59,9 +70,9 @@ export declare class MerkleTrees implements MerkleTreeDb {
|
|
|
59
70
|
* @param includeUncommitted - Indicates whether to include uncommitted data.
|
|
60
71
|
* @returns The current roots of the trees.
|
|
61
72
|
*/
|
|
62
|
-
getTreeRoots(includeUncommitted: boolean): CurrentTreeRoots
|
|
63
|
-
|
|
64
|
-
|
|
73
|
+
getTreeRoots(includeUncommitted: boolean): Promise<CurrentTreeRoots>;
|
|
74
|
+
private _getCurrentBlockHash;
|
|
75
|
+
private _getAllTreeRoots;
|
|
65
76
|
/**
|
|
66
77
|
* Gets the value at the given index.
|
|
67
78
|
* @param treeId - The ID of the tree to get the leaf value from.
|
|
@@ -155,6 +166,9 @@ export declare class MerkleTrees implements MerkleTreeDb {
|
|
|
155
166
|
* @returns Promise containing the result of the function.
|
|
156
167
|
*/
|
|
157
168
|
private synchronise;
|
|
169
|
+
private _updateLatestGlobalVariablesHash;
|
|
170
|
+
private _getGlobalVariablesHash;
|
|
171
|
+
private _updateHistoricBlocksTree;
|
|
158
172
|
/**
|
|
159
173
|
* Returns the tree info for the specified tree id.
|
|
160
174
|
* @param treeId - Id of the tree to get information from.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"merkle_trees.d.ts","sourceRoot":"","sources":["../../src/world-state-db/merkle_trees.ts"],"names":[],"mappings":";AAAA,OAAO,EAIL,EAAE,
|
|
1
|
+
{"version":3,"file":"merkle_trees.d.ts","sourceRoot":"","sources":["../../src/world-state-db/merkle_trees.ts"],"names":[],"mappings":";AAAA,OAAO,EAIL,EAAE,EAOH,MAAM,oBAAoB,CAAC;AAK5B,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAGL,QAAQ,EACR,kBAAkB,EAOnB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,WAAW,EAAiB,MAAM,cAAc,CAAC;AAEjF,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,SAAS,CAAC;AAI7C,OAAO,EACL,gBAAgB,EAEhB,aAAa,EACb,YAAY,EACZ,oBAAoB,EACpB,YAAY,EACZ,QAAQ,EACT,MAAM,YAAY,CAAC;AAEpB;;GAEG;AACH,qBAAa,WAAY,YAAW,YAAY;IAKlC,OAAO,CAAC,EAAE;IAAmB,OAAO,CAAC,GAAG;IAJpD,OAAO,CAAC,KAAK,CAA2C;IACxD,OAAO,CAAC,yBAAyB,CAAkB;IACnD,OAAO,CAAC,QAAQ,CAAqB;gBAEjB,EAAE,EAAE,OAAO,CAAC,OAAO,EAAU,GAAG,8CAA0C;IAI9F;;;OAGG;IACU,IAAI,CAAC,YAAY,CAAC,EAAE,WAAW;IAyD5C;;;;;OAKG;WACiB,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,WAAW;IAM/D;;OAEG;IACU,IAAI;IAIjB;;;OAGG;IACI,QAAQ,IAAI,oBAAoB;IAIvC;;;OAGG;IACI,WAAW,IAAI,oBAAoB;IAI1C;;;;;OAKG;IACU,wBAAwB,CAAC,WAAW,EAAE,EAAE,EAAE,kBAAkB,EAAE,OAAO;IAIlF;;;OAGG;IACU,+BAA+B,CAAC,mBAAmB,EAAE,EAAE;IAIpE;;;OAGG;IACU,4BAA4B,CAAC,kBAAkB,EAAE,OAAO,GAAG,OAAO,CAAC,EAAE,CAAC;IAInF;;;;;OAKG;IACU,WAAW,CAAC,MAAM,EAAE,YAAY,EAAE,kBAAkB,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC;IAI9F;;;;OAIG;IACU,YAAY,CAAC,kBAAkB,EAAE,OAAO,GAAG,OAAO,CAAC,gBAAgB,CAAC;YAanE,oBAAoB;IAMlC,OAAO,CAAC,gBAAgB;IAaxB;;;;;;OAMG;IACU,YAAY,CACvB,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,MAAM,EACb,kBAAkB,EAAE,OAAO,GAC1B,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAI9B;;;;;;OAMG;IACU,cAAc,CAAC,CAAC,SAAS,MAAM,EAC1C,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,MAAM,EACb,kBAAkB,EAAE,OAAO,GAC1B,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAI1B;;;;;OAKG;IACU,YAAY,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhF;;;OAGG;IACU,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAIpC;;;OAGG;IACU,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAItC;;;;;;OAMG;IACU,qBAAqB,CAChC,MAAM,EAAE,aAAa,EACrB,KAAK,EAAE,MAAM,EACb,kBAAkB,EAAE,OAAO,GAC1B,OAAO,CAAC;QACT;;WAEG;QACH,KAAK,EAAE,MAAM,CAAC;QACd;;WAEG;QACH,cAAc,EAAE,OAAO,CAAC;KACzB,CAAC;IAMF;;;;;;OAMG;IACU,WAAW,CACtB,MAAM,EAAE,aAAa,EACrB,KAAK,EAAE,MAAM,EACb,kBAAkB,EAAE,OAAO,GAC1B,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC;IAMhC;;;;;;OAMG;IACU,aAAa,CACxB,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,MAAM,EACb,kBAAkB,EAAE,OAAO,GAC1B,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAa9B;;;;;;OAMG;IACU,UAAU,CAAC,MAAM,EAAE,aAAa,GAAG,YAAY,EAAE,IAAI,EAAE,QAAQ,GAAG,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIpH;;;OAGG;IACU,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAIzD;;;;;;OAMG;IACU,WAAW,CACtB,UAAU,SAAS,MAAM,EACzB,aAAa,SAAS,MAAM,EAC5B,wBAAwB,SAAS,MAAM,EAEvC,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,MAAM,EAAE,EAChB,aAAa,EAAE,aAAa,GAC3B,OAAO,CACN,CAAC,kBAAkB,CAAC,UAAU,CAAC,EAAE,EAAE,WAAW,CAAC,wBAAwB,CAAC,CAAC,GACzE,CAAC,SAAS,EAAE,WAAW,CAAC,wBAAwB,CAAC,CAAC,CACrD;IAQD;;;;OAIG;YACW,WAAW;IAIzB,OAAO,CAAC,gCAAgC;IAKxC,OAAO,CAAC,uBAAuB;YAIjB,yBAAyB;IAKvC;;;;;OAKG;IACH,OAAO,CAAC,YAAY;IAUpB;;;;OAIG;IACH,OAAO,CAAC,eAAe;IAIvB;;;;;;OAMG;IACH,OAAO,CAAC,eAAe;IAQvB;;;;;OAKG;YACW,aAAa;YAQb,WAAW;IAYzB;;;OAGG;YACW,OAAO;IAOrB;;;OAGG;YACW,SAAS;IAOvB;;;OAGG;YACW,cAAc;CA6D7B"}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
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 {
|
|
2
|
+
import { computeBlockHash } from '@aztec/circuits.js/abis';
|
|
3
|
+
import { Committable } from '@aztec/foundation/committable';
|
|
3
4
|
import { SerialQueue } from '@aztec/foundation/fifo';
|
|
4
5
|
import { createDebugLogger } from '@aztec/foundation/log';
|
|
5
6
|
import { Pedersen, SparseTree, StandardIndexedTree, StandardTree, newTree, } from '@aztec/merkle-tree';
|
|
6
7
|
import { MerkleTreeId, merkleTreeIds } from '@aztec/types';
|
|
7
8
|
import { MerkleTreeOperationsFacade } from '../merkle-tree/merkle_tree_operations_facade.js';
|
|
9
|
+
import { computeGlobalVariablesHash } from '../utils.js';
|
|
8
10
|
import { INITIAL_NULLIFIER_TREE_SIZE, } from './index.js';
|
|
9
11
|
/**
|
|
10
12
|
* A convenience class for managing multiple merkle trees.
|
|
@@ -15,6 +17,7 @@ export class MerkleTrees {
|
|
|
15
17
|
this.log = log;
|
|
16
18
|
this.trees = [];
|
|
17
19
|
this.jobQueue = new SerialQueue();
|
|
20
|
+
this.latestGlobalVariablesHash = new Committable(Fr.zero());
|
|
18
21
|
}
|
|
19
22
|
/**
|
|
20
23
|
* Initialises the collection of Merkle Trees.
|
|
@@ -32,8 +35,10 @@ export class MerkleTrees {
|
|
|
32
35
|
this.trees = [contractTree, nullifierTree, privateDataTree, publicDataTree, l1Tol2MessagesTree, historicBlocksTree];
|
|
33
36
|
this.jobQueue.start();
|
|
34
37
|
// The first leaf in the blocks tree contains the empty roots of the other trees and empty global variables.
|
|
35
|
-
await
|
|
36
|
-
await
|
|
38
|
+
const initialGlobalVariablesHash = await computeGlobalVariablesHash(GlobalVariables.empty());
|
|
39
|
+
await this._updateLatestGlobalVariablesHash(initialGlobalVariablesHash);
|
|
40
|
+
await this._updateHistoricBlocksTree(initialGlobalVariablesHash, true);
|
|
41
|
+
await this._commit();
|
|
37
42
|
}
|
|
38
43
|
/**
|
|
39
44
|
* Method to asynchronously create and initialise a MerkleTrees instance.
|
|
@@ -69,12 +74,25 @@ export class MerkleTrees {
|
|
|
69
74
|
/**
|
|
70
75
|
* Inserts into the roots trees (CONTRACT_TREE_ROOTS_TREE, PRIVATE_DATA_TREE_ROOTS_TREE, L1_TO_L2_MESSAGES_TREE_ROOTS_TREE)
|
|
71
76
|
* the current roots of the corresponding trees (CONTRACT_TREE, PRIVATE_DATA_TREE, L1_TO_L2_MESSAGES_TREE).
|
|
72
|
-
* @param
|
|
77
|
+
* @param globalsHash - The current global variables hash.
|
|
73
78
|
* @param includeUncommitted - Indicates whether to include uncommitted data.
|
|
74
79
|
*/
|
|
75
|
-
async updateHistoricBlocksTree(
|
|
76
|
-
|
|
77
|
-
|
|
80
|
+
async updateHistoricBlocksTree(globalsHash, includeUncommitted) {
|
|
81
|
+
await this.synchronise(() => this._updateHistoricBlocksTree(globalsHash, includeUncommitted));
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Updates the latest global variables hash
|
|
85
|
+
* @param globalVariablesHash - The latest global variables hash
|
|
86
|
+
*/
|
|
87
|
+
async updateLatestGlobalVariablesHash(globalVariablesHash) {
|
|
88
|
+
return await this.synchronise(() => this._updateLatestGlobalVariablesHash(globalVariablesHash));
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Gets the global variables hash from the previous block
|
|
92
|
+
* @param includeUncommitted - Indicates whether to include uncommitted data.
|
|
93
|
+
*/
|
|
94
|
+
async getLatestGlobalVariablesHash(includeUncommitted) {
|
|
95
|
+
return await this.synchronise(() => this._getGlobalVariablesHash(includeUncommitted));
|
|
78
96
|
}
|
|
79
97
|
/**
|
|
80
98
|
* Gets the tree info for the specified tree.
|
|
@@ -90,8 +108,8 @@ export class MerkleTrees {
|
|
|
90
108
|
* @param includeUncommitted - Indicates whether to include uncommitted data.
|
|
91
109
|
* @returns The current roots of the trees.
|
|
92
110
|
*/
|
|
93
|
-
getTreeRoots(includeUncommitted) {
|
|
94
|
-
const roots = this.
|
|
111
|
+
async getTreeRoots(includeUncommitted) {
|
|
112
|
+
const roots = await this.synchronise(() => Promise.resolve(this._getAllTreeRoots(includeUncommitted)));
|
|
95
113
|
return {
|
|
96
114
|
privateDataTreeRoot: roots[0],
|
|
97
115
|
nullifierTreeRoot: roots[1],
|
|
@@ -101,13 +119,13 @@ export class MerkleTrees {
|
|
|
101
119
|
blocksTreeRoot: roots[5],
|
|
102
120
|
};
|
|
103
121
|
}
|
|
104
|
-
async
|
|
105
|
-
const roots = this.
|
|
122
|
+
async _getCurrentBlockHash(globalsHash, includeUncommitted) {
|
|
123
|
+
const roots = (await this._getAllTreeRoots(includeUncommitted)).map(root => Fr.fromBuffer(root));
|
|
106
124
|
const wasm = await CircuitsWasm.get();
|
|
107
|
-
return
|
|
125
|
+
return computeBlockHash(wasm, globalsHash, roots[0], roots[1], roots[2], roots[3], roots[4]);
|
|
108
126
|
}
|
|
109
|
-
|
|
110
|
-
|
|
127
|
+
_getAllTreeRoots(includeUncommitted) {
|
|
128
|
+
const roots = [
|
|
111
129
|
MerkleTreeId.PRIVATE_DATA_TREE,
|
|
112
130
|
MerkleTreeId.NULLIFIER_TREE,
|
|
113
131
|
MerkleTreeId.CONTRACT_TREE,
|
|
@@ -115,6 +133,7 @@ export class MerkleTrees {
|
|
|
115
133
|
MerkleTreeId.PUBLIC_DATA_TREE,
|
|
116
134
|
MerkleTreeId.BLOCKS_TREE,
|
|
117
135
|
].map(tree => this.trees[tree].getRoot(includeUncommitted));
|
|
136
|
+
return Promise.resolve(roots);
|
|
118
137
|
}
|
|
119
138
|
/**
|
|
120
139
|
* Gets the value at the given index.
|
|
@@ -237,6 +256,17 @@ export class MerkleTrees {
|
|
|
237
256
|
async synchronise(fn) {
|
|
238
257
|
return await this.jobQueue.put(fn);
|
|
239
258
|
}
|
|
259
|
+
_updateLatestGlobalVariablesHash(globalVariablesHash) {
|
|
260
|
+
this.latestGlobalVariablesHash.set(globalVariablesHash);
|
|
261
|
+
return Promise.resolve();
|
|
262
|
+
}
|
|
263
|
+
_getGlobalVariablesHash(includeUncommitted) {
|
|
264
|
+
return Promise.resolve(this.latestGlobalVariablesHash.get(includeUncommitted));
|
|
265
|
+
}
|
|
266
|
+
async _updateHistoricBlocksTree(globalsHash, includeUncommitted) {
|
|
267
|
+
const blockHash = await this._getCurrentBlockHash(globalsHash, includeUncommitted);
|
|
268
|
+
await this._appendLeaves(MerkleTreeId.BLOCKS_TREE, [blockHash.toBuffer()]);
|
|
269
|
+
}
|
|
240
270
|
/**
|
|
241
271
|
* Returns the tree info for the specified tree id.
|
|
242
272
|
* @param treeId - Id of the tree to get information from.
|
|
@@ -298,6 +328,7 @@ export class MerkleTrees {
|
|
|
298
328
|
for (const tree of this.trees) {
|
|
299
329
|
await tree.commit();
|
|
300
330
|
}
|
|
331
|
+
this.latestGlobalVariablesHash.commit();
|
|
301
332
|
}
|
|
302
333
|
/**
|
|
303
334
|
* Rolls back all pending updates.
|
|
@@ -307,6 +338,7 @@ export class MerkleTrees {
|
|
|
307
338
|
for (const tree of this.trees) {
|
|
308
339
|
await tree.rollback();
|
|
309
340
|
}
|
|
341
|
+
this.latestGlobalVariablesHash.rollback();
|
|
310
342
|
}
|
|
311
343
|
/**
|
|
312
344
|
* Handles a single L2 block (i.e. Inserts the new commitments into the merkle tree).
|
|
@@ -351,7 +383,10 @@ export class MerkleTrees {
|
|
|
351
383
|
await this._updateLeaf(MerkleTreeId.PUBLIC_DATA_TREE, newValue.toBuffer(), leafIndex.value);
|
|
352
384
|
}
|
|
353
385
|
// Sync and add the block to the historic blocks tree
|
|
354
|
-
const
|
|
386
|
+
const globalVariablesHash = await computeGlobalVariablesHash(l2Block.globalVariables);
|
|
387
|
+
await this._updateLatestGlobalVariablesHash(globalVariablesHash);
|
|
388
|
+
this.log(`Synced global variables with hash ${this.latestGlobalVariablesHash.toString()}`);
|
|
389
|
+
const blockHash = await this._getCurrentBlockHash(globalVariablesHash, true);
|
|
355
390
|
await this._appendLeaves(MerkleTreeId.BLOCKS_TREE, [blockHash.toBuffer()]);
|
|
356
391
|
await this._commit();
|
|
357
392
|
}
|
|
@@ -361,4 +396,4 @@ export class MerkleTrees {
|
|
|
361
396
|
}
|
|
362
397
|
}
|
|
363
398
|
}
|
|
364
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVya2xlX3RyZWVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3dvcmxkLXN0YXRlLWRiL21lcmtsZV90cmVlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLG9CQUFvQixFQUNwQixZQUFZLEVBQ1osRUFBRSxFQUNGLGVBQWUsRUFDZiwyQkFBMkIsRUFDM0Isd0JBQXdCLEVBQ3hCLHFCQUFxQixFQUNyQix3QkFBd0IsRUFDeEIsdUJBQXVCLEdBQ3hCLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDdEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRTFELE9BQU8sRUFLTCxRQUFRLEVBQ1IsVUFBVSxFQUNWLG1CQUFtQixFQUNuQixZQUFZLEVBRVosT0FBTyxHQUNSLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFXLFlBQVksRUFBZSxhQUFhLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFJakYsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0saURBQWlELENBQUM7QUFDN0YsT0FBTyxFQUVMLDJCQUEyQixHQU01QixNQUFNLFlBQVksQ0FBQztBQUVwQjs7R0FFRztBQUNILE1BQU0sT0FBTyxXQUFXO0lBSXRCLFlBQW9CLEVBQW1CLEVBQVUsTUFBTSxpQkFBaUIsQ0FBQyxvQkFBb0IsQ0FBQztRQUExRSxPQUFFLEdBQUYsRUFBRSxDQUFpQjtRQUFVLFFBQUcsR0FBSCxHQUFHLENBQTBDO1FBSHRGLFVBQUssR0FBd0MsRUFBRSxDQUFDO1FBQ2hELGFBQVEsR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO0lBRTRELENBQUM7SUFFbEc7OztPQUdHO0lBQ0ksS0FBSyxDQUFDLElBQUksQ0FBQyxZQUEwQjtR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
|
|
399
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVya2xlX3RyZWVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3dvcmxkLXN0YXRlLWRiL21lcmtsZV90cmVlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLG9CQUFvQixFQUNwQixZQUFZLEVBQ1osRUFBRSxFQUNGLGVBQWUsRUFDZiwyQkFBMkIsRUFDM0Isd0JBQXdCLEVBQ3hCLHFCQUFxQixFQUNyQix3QkFBd0IsRUFDeEIsdUJBQXVCLEdBQ3hCLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDM0QsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQzVELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUUxRCxPQUFPLEVBS0wsUUFBUSxFQUNSLFVBQVUsRUFDVixtQkFBbUIsRUFDbkIsWUFBWSxFQUVaLE9BQU8sR0FDUixNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFBVyxZQUFZLEVBQWUsYUFBYSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBSWpGLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLGlEQUFpRCxDQUFDO0FBQzdGLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN6RCxPQUFPLEVBRUwsMkJBQTJCLEdBTTVCLE1BQU0sWUFBWSxDQUFDO0FBRXBCOztHQUVHO0FBQ0gsTUFBTSxPQUFPLFdBQVc7SUFLdEIsWUFBb0IsRUFBbUIsRUFBVSxNQUFNLGlCQUFpQixDQUFDLG9CQUFvQixDQUFDO1FBQTFFLE9BQUUsR0FBRixFQUFFLENBQWlCO1FBQVUsUUFBRyxHQUFILEdBQUcsQ0FBMEM7UUFKdEYsVUFBSyxHQUF3QyxFQUFFLENBQUM7UUFFaEQs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
|
package/package.json
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/world-state",
|
|
3
|
-
"version": "0.1.0-
|
|
3
|
+
"version": "0.1.0-alpha45",
|
|
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-alpha45",
|
|
8
|
+
"@aztec/foundation": "0.1.0-alpha45",
|
|
9
|
+
"@aztec/merkle-tree": "0.1.0-alpha45",
|
|
10
|
+
"@aztec/types": "0.1.0-alpha45",
|
|
11
11
|
"levelup": "^5.1.1",
|
|
12
12
|
"lodash.times": "^4.3.2",
|
|
13
13
|
"memdown": "^6.1.1",
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Fr } from '@aztec/foundation/fields';
|
|
2
2
|
import { LowLeafWitnessData } from '@aztec/merkle-tree';
|
|
3
3
|
import { L2Block, MerkleTreeId, SiblingPath } from '@aztec/types';
|
|
4
4
|
|
|
@@ -24,7 +24,7 @@ export class MerkleTreeOperationsFacade implements MerkleTreeOperations {
|
|
|
24
24
|
* Get the current roots of the commitment trees.
|
|
25
25
|
* @returns The current roots of the trees.
|
|
26
26
|
*/
|
|
27
|
-
getTreeRoots(): CurrentTreeRoots {
|
|
27
|
+
getTreeRoots(): Promise<CurrentTreeRoots> {
|
|
28
28
|
return this.trees.getTreeRoots(this.includeUncommitted);
|
|
29
29
|
}
|
|
30
30
|
|
|
@@ -44,8 +44,9 @@ export class MerkleTreeOperationsFacade implements MerkleTreeOperations {
|
|
|
44
44
|
* @param index - The index of the leaf for which a sibling path is required.
|
|
45
45
|
* @returns A promise with the sibling path of the specified leaf index.
|
|
46
46
|
*/
|
|
47
|
-
getSiblingPath(treeId: MerkleTreeId, index: bigint): Promise<SiblingPath<
|
|
48
|
-
|
|
47
|
+
async getSiblingPath<N extends number>(treeId: MerkleTreeId, index: bigint): Promise<SiblingPath<N>> {
|
|
48
|
+
const path = await this.trees.getSiblingPath(treeId, index, this.includeUncommitted);
|
|
49
|
+
return path as unknown as SiblingPath<N>;
|
|
49
50
|
}
|
|
50
51
|
|
|
51
52
|
/**
|
|
@@ -116,11 +117,26 @@ export class MerkleTreeOperationsFacade implements MerkleTreeOperations {
|
|
|
116
117
|
/**
|
|
117
118
|
* Inserts into the roots trees (CONTRACT_TREE_ROOTS_TREE, PRIVATE_DATA_TREE_ROOTS_TREE)
|
|
118
119
|
* the current roots of the corresponding trees (CONTRACT_TREE, PRIVATE_DATA_TREE).
|
|
119
|
-
* @param
|
|
120
|
+
* @param globalVariablesHash - The hash of the current global variables to include in the block hash.
|
|
120
121
|
* @returns Empty promise.
|
|
121
122
|
*/
|
|
122
|
-
public updateHistoricBlocksTree(
|
|
123
|
-
return this.trees.updateHistoricBlocksTree(
|
|
123
|
+
public updateHistoricBlocksTree(globalVariablesHash: Fr): Promise<void> {
|
|
124
|
+
return this.trees.updateHistoricBlocksTree(globalVariablesHash, this.includeUncommitted);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Updates the latest global variables hash
|
|
129
|
+
* @param globalVariablesHash - The latest global variables hash
|
|
130
|
+
*/
|
|
131
|
+
public updateLatestGlobalVariablesHash(globalVariablesHash: Fr): Promise<void> {
|
|
132
|
+
return this.trees.updateLatestGlobalVariablesHash(globalVariablesHash, this.includeUncommitted);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* Gets the global variables hash from the previous block
|
|
137
|
+
*/
|
|
138
|
+
public getLatestGlobalVariablesHash(): Promise<Fr> {
|
|
139
|
+
return this.trees.getLatestGlobalVariablesHash(this.includeUncommitted);
|
|
124
140
|
}
|
|
125
141
|
|
|
126
142
|
/**
|
|
@@ -26,7 +26,7 @@ import {
|
|
|
26
26
|
import { jest } from '@jest/globals';
|
|
27
27
|
import times from 'lodash.times';
|
|
28
28
|
|
|
29
|
-
import { MerkleTreeDb } from '../index.js';
|
|
29
|
+
import { MerkleTreeDb, MerkleTrees, WorldStateConfig } from '../index.js';
|
|
30
30
|
import { ServerWorldStateSynchroniser } from './server_world_state_synchroniser.js';
|
|
31
31
|
import { WorldStateRunningState } from './world_state_synchroniser.js';
|
|
32
32
|
|
|
@@ -96,14 +96,19 @@ const getMockBlock = (blockNumber: number, newContractsCommitments?: Buffer[]) =
|
|
|
96
96
|
return block;
|
|
97
97
|
};
|
|
98
98
|
|
|
99
|
-
const createSynchroniser = (merkleTreeDb: any, rollupSource: any) =>
|
|
100
|
-
|
|
99
|
+
const createSynchroniser = (merkleTreeDb: any, rollupSource: any, blockCheckInterval = 100) => {
|
|
100
|
+
const worldStateConfig: WorldStateConfig = {
|
|
101
|
+
worldStateBlockCheckIntervalMS: blockCheckInterval,
|
|
102
|
+
l2QueueSize: 1000,
|
|
103
|
+
};
|
|
104
|
+
return new ServerWorldStateSynchroniser(merkleTreeDb as MerkleTrees, rollupSource as L2BlockSource, worldStateConfig);
|
|
105
|
+
};
|
|
101
106
|
|
|
102
107
|
const log = createDebugLogger('aztec:server_world_state_synchroniser_test');
|
|
103
108
|
|
|
104
109
|
describe('server_world_state_synchroniser', () => {
|
|
105
|
-
const rollupSource: Mockify<Pick<L2BlockSource, '
|
|
106
|
-
|
|
110
|
+
const rollupSource: Mockify<Pick<L2BlockSource, 'getBlockNumber' | 'getL2Blocks'>> = {
|
|
111
|
+
getBlockNumber: jest.fn().mockImplementation(getLatestBlockNumber),
|
|
107
112
|
getL2Blocks: jest.fn().mockImplementation(consumeNextBlocks),
|
|
108
113
|
};
|
|
109
114
|
|
|
@@ -126,8 +131,27 @@ describe('server_world_state_synchroniser', () => {
|
|
|
126
131
|
commit: jest.fn().mockImplementation(() => Promise.resolve()),
|
|
127
132
|
rollback: jest.fn().mockImplementation(() => Promise.resolve()),
|
|
128
133
|
handleL2Block: jest.fn().mockImplementation(() => Promise.resolve()),
|
|
134
|
+
stop: jest.fn().mockImplementation(() => Promise.resolve()),
|
|
129
135
|
} as any;
|
|
130
136
|
|
|
137
|
+
const performInitialSync = async (server: ServerWorldStateSynchroniser) => {
|
|
138
|
+
// test initial state
|
|
139
|
+
let status = await server.status();
|
|
140
|
+
expect(status.syncedToL2Block).toEqual(0);
|
|
141
|
+
expect(status.state).toEqual(WorldStateRunningState.IDLE);
|
|
142
|
+
|
|
143
|
+
// create the initial blocks
|
|
144
|
+
nextBlocks = Array(LATEST_BLOCK_NUMBER)
|
|
145
|
+
.fill(0)
|
|
146
|
+
.map((_, index: number) => getMockBlock(index + 1));
|
|
147
|
+
|
|
148
|
+
// start the sync process and await it
|
|
149
|
+
await server.start().catch(err => log.error('Sync not completed: ', err));
|
|
150
|
+
|
|
151
|
+
status = await server.status();
|
|
152
|
+
expect(status.syncedToL2Block).toBe(LATEST_BLOCK_NUMBER);
|
|
153
|
+
};
|
|
154
|
+
|
|
131
155
|
it('can be constructed', () => {
|
|
132
156
|
expect(() => createSynchroniser(merkleTreeDb, rollupSource)).not.toThrow();
|
|
133
157
|
});
|
|
@@ -241,7 +265,7 @@ describe('server_world_state_synchroniser', () => {
|
|
|
241
265
|
|
|
242
266
|
it('immediately syncs if no new blocks', async () => {
|
|
243
267
|
const server = createSynchroniser(merkleTreeDb, rollupSource);
|
|
244
|
-
rollupSource.
|
|
268
|
+
rollupSource.getBlockNumber.mockImplementationOnce(() => {
|
|
245
269
|
return Promise.resolve(0);
|
|
246
270
|
});
|
|
247
271
|
|
|
@@ -259,7 +283,7 @@ describe('server_world_state_synchroniser', () => {
|
|
|
259
283
|
|
|
260
284
|
it("can't be started if already stopped", async () => {
|
|
261
285
|
const server = createSynchroniser(merkleTreeDb, rollupSource);
|
|
262
|
-
rollupSource.
|
|
286
|
+
rollupSource.getBlockNumber.mockImplementationOnce(() => {
|
|
263
287
|
return Promise.resolve(0);
|
|
264
288
|
});
|
|
265
289
|
|
|
@@ -284,4 +308,121 @@ describe('server_world_state_synchroniser', () => {
|
|
|
284
308
|
expect(merkleTreeDb.handleL2Block).toHaveBeenCalledTimes(totalBlocks);
|
|
285
309
|
await server.stop();
|
|
286
310
|
});
|
|
311
|
+
|
|
312
|
+
it('can immediately sync to latest', async () => {
|
|
313
|
+
const server = createSynchroniser(merkleTreeDb, rollupSource, 10000);
|
|
314
|
+
|
|
315
|
+
await performInitialSync(server);
|
|
316
|
+
|
|
317
|
+
// the server should now be asleep for a long time
|
|
318
|
+
// we will add a new block and force an immediate sync
|
|
319
|
+
nextBlocks = [getMockBlock(LATEST_BLOCK_NUMBER + 1)];
|
|
320
|
+
await server.syncImmediate();
|
|
321
|
+
|
|
322
|
+
let status = await server.status();
|
|
323
|
+
expect(status.syncedToL2Block).toBe(LATEST_BLOCK_NUMBER + 1);
|
|
324
|
+
|
|
325
|
+
nextBlocks = [getMockBlock(LATEST_BLOCK_NUMBER + 2), getMockBlock(LATEST_BLOCK_NUMBER + 3)];
|
|
326
|
+
await server.syncImmediate();
|
|
327
|
+
|
|
328
|
+
status = await server.status();
|
|
329
|
+
expect(status.syncedToL2Block).toBe(LATEST_BLOCK_NUMBER + 3);
|
|
330
|
+
|
|
331
|
+
// stop the synchroniser
|
|
332
|
+
await server.stop();
|
|
333
|
+
|
|
334
|
+
// check the final status
|
|
335
|
+
status = await server.status();
|
|
336
|
+
expect(status.state).toEqual(WorldStateRunningState.STOPPED);
|
|
337
|
+
expect(status.syncedToL2Block).toEqual(LATEST_BLOCK_NUMBER + 3);
|
|
338
|
+
});
|
|
339
|
+
|
|
340
|
+
it('can immediately sync to a minimum block number', async () => {
|
|
341
|
+
const server = createSynchroniser(merkleTreeDb, rollupSource, 10000);
|
|
342
|
+
|
|
343
|
+
await performInitialSync(server);
|
|
344
|
+
|
|
345
|
+
// the server should now be asleep for a long time
|
|
346
|
+
// we will add 20 blocks and force a sync to at least LATEST + 5
|
|
347
|
+
nextBlocks = Array(20)
|
|
348
|
+
.fill(0)
|
|
349
|
+
.map((_, index: number) => getMockBlock(index + 1 + LATEST_BLOCK_NUMBER));
|
|
350
|
+
await server.syncImmediate(LATEST_BLOCK_NUMBER + 5);
|
|
351
|
+
|
|
352
|
+
// we should have synced all of the blocks
|
|
353
|
+
let status = await server.status();
|
|
354
|
+
expect(status.syncedToL2Block).toBe(LATEST_BLOCK_NUMBER + 20);
|
|
355
|
+
|
|
356
|
+
// stop the synchroniser
|
|
357
|
+
await server.stop();
|
|
358
|
+
|
|
359
|
+
// check the final status
|
|
360
|
+
status = await server.status();
|
|
361
|
+
expect(status.state).toEqual(WorldStateRunningState.STOPPED);
|
|
362
|
+
expect(status.syncedToL2Block).toEqual(LATEST_BLOCK_NUMBER + 20);
|
|
363
|
+
});
|
|
364
|
+
|
|
365
|
+
it('can immediately sync to a minimum block in the past', async () => {
|
|
366
|
+
const server = createSynchroniser(merkleTreeDb, rollupSource, 10000);
|
|
367
|
+
|
|
368
|
+
await performInitialSync(server);
|
|
369
|
+
// syncing to a block in the past should succeed
|
|
370
|
+
await server.syncImmediate(LATEST_BLOCK_NUMBER - 1);
|
|
371
|
+
// syncing to the current block should succeed
|
|
372
|
+
await server.syncImmediate(LATEST_BLOCK_NUMBER);
|
|
373
|
+
|
|
374
|
+
// we should have synced all of the blocks
|
|
375
|
+
let status = await server.status();
|
|
376
|
+
expect(status.syncedToL2Block).toBe(LATEST_BLOCK_NUMBER);
|
|
377
|
+
|
|
378
|
+
// stop the synchroniser
|
|
379
|
+
await server.stop();
|
|
380
|
+
|
|
381
|
+
// check the final status
|
|
382
|
+
status = await server.status();
|
|
383
|
+
expect(status.state).toEqual(WorldStateRunningState.STOPPED);
|
|
384
|
+
expect(status.syncedToL2Block).toEqual(LATEST_BLOCK_NUMBER);
|
|
385
|
+
});
|
|
386
|
+
|
|
387
|
+
it('throws if you try to sync to an unavailable block', async () => {
|
|
388
|
+
const server = createSynchroniser(merkleTreeDb, rollupSource, 10000);
|
|
389
|
+
|
|
390
|
+
await performInitialSync(server);
|
|
391
|
+
|
|
392
|
+
// the server should now be asleep for a long time
|
|
393
|
+
// we will add 2 blocks and force a sync to at least LATEST + 5
|
|
394
|
+
nextBlocks = Array(2)
|
|
395
|
+
.fill(0)
|
|
396
|
+
.map((_, index: number) => getMockBlock(index + 1 + LATEST_BLOCK_NUMBER));
|
|
397
|
+
await expect(server.syncImmediate(LATEST_BLOCK_NUMBER + 5)).rejects.toThrow(
|
|
398
|
+
`Unable to sync to block number ${LATEST_BLOCK_NUMBER + 5}, currently synced to block ${LATEST_BLOCK_NUMBER + 2}`,
|
|
399
|
+
);
|
|
400
|
+
|
|
401
|
+
let status = await server.status();
|
|
402
|
+
expect(status.syncedToL2Block).toBe(LATEST_BLOCK_NUMBER + 2);
|
|
403
|
+
|
|
404
|
+
// stop the synchroniser
|
|
405
|
+
await server.stop();
|
|
406
|
+
|
|
407
|
+
// check the final status
|
|
408
|
+
status = await server.status();
|
|
409
|
+
expect(status.state).toEqual(WorldStateRunningState.STOPPED);
|
|
410
|
+
expect(status.syncedToL2Block).toEqual(LATEST_BLOCK_NUMBER + 2);
|
|
411
|
+
});
|
|
412
|
+
|
|
413
|
+
it('throws if you try to immediate sync when not running', async () => {
|
|
414
|
+
const server = createSynchroniser(merkleTreeDb, rollupSource, 10000);
|
|
415
|
+
|
|
416
|
+
// test initial state
|
|
417
|
+
const status = await server.status();
|
|
418
|
+
expect(status.syncedToL2Block).toEqual(0);
|
|
419
|
+
expect(status.state).toEqual(WorldStateRunningState.IDLE);
|
|
420
|
+
|
|
421
|
+
// create an initial block
|
|
422
|
+
nextBlocks = Array(LATEST_BLOCK_NUMBER)
|
|
423
|
+
.fill(0)
|
|
424
|
+
.map((_, index: number) => getMockBlock(index + 1));
|
|
425
|
+
|
|
426
|
+
await expect(server.syncImmediate()).rejects.toThrow(`World State is not running, unable to perform sync`);
|
|
427
|
+
});
|
|
287
428
|
});
|