@aztec/world-state 0.31.0 → 0.32.0
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/dest/synchronizer/server_world_state_synchronizer.d.ts.map +1 -1
- package/dest/synchronizer/server_world_state_synchronizer.js +4 -3
- package/dest/world-state-db/merkle_tree_db.d.ts +10 -1
- package/dest/world-state-db/merkle_tree_db.d.ts.map +1 -1
- package/dest/world-state-db/merkle_tree_db.js +2 -1
- package/dest/world-state-db/merkle_tree_operations.d.ts +25 -9
- package/dest/world-state-db/merkle_tree_operations.d.ts.map +1 -1
- package/dest/world-state-db/merkle_tree_operations.js +2 -1
- package/dest/world-state-db/merkle_tree_operations_facade.d.ts +9 -9
- package/dest/world-state-db/merkle_tree_operations_facade.d.ts.map +1 -1
- package/dest/world-state-db/merkle_tree_operations_facade.js +1 -1
- package/dest/world-state-db/merkle_tree_snapshot_operations_facade.d.ts +6 -7
- package/dest/world-state-db/merkle_tree_snapshot_operations_facade.d.ts.map +1 -1
- package/dest/world-state-db/merkle_tree_snapshot_operations_facade.js +8 -6
- package/dest/world-state-db/merkle_trees.d.ts +8 -8
- package/dest/world-state-db/merkle_trees.d.ts.map +1 -1
- package/dest/world-state-db/merkle_trees.js +34 -17
- package/package.json +7 -7
- package/src/synchronizer/server_world_state_synchronizer.ts +3 -1
- package/src/world-state-db/merkle_tree_db.ts +11 -2
- package/src/world-state-db/merkle_tree_operations.ts +36 -11
- package/src/world-state-db/merkle_tree_operations_facade.ts +27 -12
- package/src/world-state-db/merkle_tree_snapshot_operations_facade.ts +32 -17
- package/src/world-state-db/merkle_trees.ts +75 -32
|
@@ -40,10 +40,17 @@ import {
|
|
|
40
40
|
} from '@aztec/merkle-tree';
|
|
41
41
|
import { Hasher } from '@aztec/types/interfaces';
|
|
42
42
|
|
|
43
|
-
import {
|
|
43
|
+
import {
|
|
44
|
+
INITIAL_NULLIFIER_TREE_SIZE,
|
|
45
|
+
INITIAL_PUBLIC_DATA_TREE_SIZE,
|
|
46
|
+
MerkleTreeDb,
|
|
47
|
+
TreeSnapshots,
|
|
48
|
+
} from './merkle_tree_db.js';
|
|
44
49
|
import {
|
|
45
50
|
HandleL2BlockAndMessagesResult,
|
|
46
51
|
IndexedTreeId,
|
|
52
|
+
MerkleTreeLeafType,
|
|
53
|
+
MerkleTreeMap,
|
|
47
54
|
MerkleTreeOperations,
|
|
48
55
|
TreeInfo,
|
|
49
56
|
} from './merkle_tree_operations.js';
|
|
@@ -53,7 +60,15 @@ import { MerkleTreeOperationsFacade } from './merkle_tree_operations_facade.js';
|
|
|
53
60
|
* The nullifier tree is an indexed tree.
|
|
54
61
|
*/
|
|
55
62
|
class NullifierTree extends StandardIndexedTree {
|
|
56
|
-
constructor(
|
|
63
|
+
constructor(
|
|
64
|
+
store: AztecKVStore,
|
|
65
|
+
hasher: Hasher,
|
|
66
|
+
name: string,
|
|
67
|
+
depth: number,
|
|
68
|
+
size: bigint = 0n,
|
|
69
|
+
_noop: any,
|
|
70
|
+
root?: Buffer,
|
|
71
|
+
) {
|
|
57
72
|
super(store, hasher, name, depth, size, NullifierLeafPreimage, NullifierLeaf, root);
|
|
58
73
|
}
|
|
59
74
|
}
|
|
@@ -62,7 +77,15 @@ class NullifierTree extends StandardIndexedTree {
|
|
|
62
77
|
* The public data tree is an indexed tree.
|
|
63
78
|
*/
|
|
64
79
|
class PublicDataTree extends StandardIndexedTree {
|
|
65
|
-
constructor(
|
|
80
|
+
constructor(
|
|
81
|
+
store: AztecKVStore,
|
|
82
|
+
hasher: Hasher,
|
|
83
|
+
name: string,
|
|
84
|
+
depth: number,
|
|
85
|
+
size: bigint = 0n,
|
|
86
|
+
_noop: any,
|
|
87
|
+
root?: Buffer,
|
|
88
|
+
) {
|
|
66
89
|
super(store, hasher, name, depth, size, PublicDataTreeLeafPreimage, PublicDataTreeLeaf, root);
|
|
67
90
|
}
|
|
68
91
|
}
|
|
@@ -71,7 +94,8 @@ class PublicDataTree extends StandardIndexedTree {
|
|
|
71
94
|
* A convenience class for managing multiple merkle trees.
|
|
72
95
|
*/
|
|
73
96
|
export class MerkleTrees implements MerkleTreeDb {
|
|
74
|
-
|
|
97
|
+
// gets initialized in #init
|
|
98
|
+
private trees: MerkleTreeMap = null as any;
|
|
75
99
|
private jobQueue = new SerialQueue();
|
|
76
100
|
|
|
77
101
|
private constructor(private store: AztecKVStore, private log: DebugLogger) {}
|
|
@@ -101,14 +125,16 @@ export class MerkleTrees implements MerkleTreeDb {
|
|
|
101
125
|
this.store,
|
|
102
126
|
hasher,
|
|
103
127
|
`${MerkleTreeId[MerkleTreeId.NULLIFIER_TREE]}`,
|
|
128
|
+
{},
|
|
104
129
|
NULLIFIER_TREE_HEIGHT,
|
|
105
130
|
INITIAL_NULLIFIER_TREE_SIZE,
|
|
106
131
|
);
|
|
107
|
-
const noteHashTree: AppendOnlyTree = await initializeTree(
|
|
132
|
+
const noteHashTree: AppendOnlyTree<Fr> = await initializeTree(
|
|
108
133
|
StandardTree,
|
|
109
134
|
this.store,
|
|
110
135
|
hasher,
|
|
111
136
|
`${MerkleTreeId[MerkleTreeId.NOTE_HASH_TREE]}`,
|
|
137
|
+
Fr,
|
|
112
138
|
NOTE_HASH_TREE_HEIGHT,
|
|
113
139
|
);
|
|
114
140
|
const publicDataTree = await initializeTree(
|
|
@@ -116,21 +142,24 @@ export class MerkleTrees implements MerkleTreeDb {
|
|
|
116
142
|
this.store,
|
|
117
143
|
hasher,
|
|
118
144
|
`${MerkleTreeId[MerkleTreeId.PUBLIC_DATA_TREE]}`,
|
|
145
|
+
{},
|
|
119
146
|
PUBLIC_DATA_TREE_HEIGHT,
|
|
120
147
|
INITIAL_PUBLIC_DATA_TREE_SIZE,
|
|
121
148
|
);
|
|
122
|
-
const l1Tol2MessageTree: AppendOnlyTree = await initializeTree(
|
|
149
|
+
const l1Tol2MessageTree: AppendOnlyTree<Fr> = await initializeTree(
|
|
123
150
|
StandardTree,
|
|
124
151
|
this.store,
|
|
125
152
|
hasher,
|
|
126
153
|
`${MerkleTreeId[MerkleTreeId.L1_TO_L2_MESSAGE_TREE]}`,
|
|
154
|
+
Fr,
|
|
127
155
|
L1_TO_L2_MSG_TREE_HEIGHT,
|
|
128
156
|
);
|
|
129
|
-
const archive: AppendOnlyTree = await initializeTree(
|
|
157
|
+
const archive: AppendOnlyTree<Fr> = await initializeTree(
|
|
130
158
|
StandardTree,
|
|
131
159
|
this.store,
|
|
132
160
|
hasher,
|
|
133
161
|
`${MerkleTreeId[MerkleTreeId.ARCHIVE]}`,
|
|
162
|
+
Fr,
|
|
134
163
|
ARCHIVE_HEIGHT,
|
|
135
164
|
);
|
|
136
165
|
this.trees = [nullifierTree, noteHashTree, publicDataTree, l1Tol2MessageTree, archive];
|
|
@@ -230,7 +259,7 @@ export class MerkleTrees implements MerkleTreeDb {
|
|
|
230
259
|
treeId: MerkleTreeId,
|
|
231
260
|
index: bigint,
|
|
232
261
|
includeUncommitted: boolean,
|
|
233
|
-
): Promise<
|
|
262
|
+
): Promise<MerkleTreeLeafType<typeof treeId> | undefined> {
|
|
234
263
|
return await this.synchronize(() => Promise.resolve(this.trees[treeId].getLeafValue(index, includeUncommitted)));
|
|
235
264
|
}
|
|
236
265
|
|
|
@@ -255,7 +284,7 @@ export class MerkleTrees implements MerkleTreeDb {
|
|
|
255
284
|
* @param leaves - The leaves to append.
|
|
256
285
|
* @returns Empty promise.
|
|
257
286
|
*/
|
|
258
|
-
public async appendLeaves(treeId:
|
|
287
|
+
public async appendLeaves<ID extends MerkleTreeId>(treeId: ID, leaves: MerkleTreeLeafType<ID>[]): Promise<void> {
|
|
259
288
|
return await this.synchronize(() => this.#appendLeaves(treeId, leaves));
|
|
260
289
|
}
|
|
261
290
|
|
|
@@ -328,14 +357,15 @@ export class MerkleTrees implements MerkleTreeDb {
|
|
|
328
357
|
* @param includeUncommitted - Indicates whether to include uncommitted data.
|
|
329
358
|
* @returns The index of the first leaf found with a given value (undefined if not found).
|
|
330
359
|
*/
|
|
331
|
-
public async findLeafIndex(
|
|
332
|
-
treeId:
|
|
333
|
-
value:
|
|
360
|
+
public async findLeafIndex<ID extends MerkleTreeId>(
|
|
361
|
+
treeId: ID,
|
|
362
|
+
value: MerkleTreeLeafType<ID>,
|
|
334
363
|
includeUncommitted: boolean,
|
|
335
364
|
): Promise<bigint | undefined> {
|
|
336
365
|
return await this.synchronize(() => {
|
|
337
366
|
const tree = this.trees[treeId];
|
|
338
|
-
|
|
367
|
+
// TODO #5448 fix "as any"
|
|
368
|
+
return Promise.resolve(tree.findLeafIndex(value as any, includeUncommitted));
|
|
339
369
|
});
|
|
340
370
|
}
|
|
341
371
|
|
|
@@ -346,15 +376,16 @@ export class MerkleTrees implements MerkleTreeDb {
|
|
|
346
376
|
* @param startIndex - The index to start searching from (used when skipping nullified messages)
|
|
347
377
|
* @param includeUncommitted - Indicates whether to include uncommitted data.
|
|
348
378
|
*/
|
|
349
|
-
public async findLeafIndexAfter(
|
|
350
|
-
treeId:
|
|
351
|
-
value:
|
|
379
|
+
public async findLeafIndexAfter<ID extends MerkleTreeId>(
|
|
380
|
+
treeId: ID,
|
|
381
|
+
value: MerkleTreeLeafType<ID>,
|
|
352
382
|
startIndex: bigint,
|
|
353
383
|
includeUncommitted: boolean,
|
|
354
384
|
): Promise<bigint | undefined> {
|
|
355
385
|
return await this.synchronize(() => {
|
|
356
386
|
const tree = this.trees[treeId];
|
|
357
|
-
|
|
387
|
+
// TODO #5448 fix "as any"
|
|
388
|
+
return Promise.resolve(tree.findLeafIndexAfter(value as any, startIndex, includeUncommitted));
|
|
358
389
|
});
|
|
359
390
|
}
|
|
360
391
|
|
|
@@ -391,7 +422,7 @@ export class MerkleTrees implements MerkleTreeDb {
|
|
|
391
422
|
SubtreeHeight extends number,
|
|
392
423
|
SubtreeSiblingPathHeight extends number,
|
|
393
424
|
>(
|
|
394
|
-
treeId:
|
|
425
|
+
treeId: IndexedTreeId,
|
|
395
426
|
leaves: Buffer[],
|
|
396
427
|
subtreeHeight: SubtreeHeight,
|
|
397
428
|
): Promise<BatchInsertionResult<TreeHeight, SubtreeSiblingPathHeight>> {
|
|
@@ -421,7 +452,7 @@ export class MerkleTrees implements MerkleTreeDb {
|
|
|
421
452
|
}
|
|
422
453
|
|
|
423
454
|
const blockHash = header.hash();
|
|
424
|
-
await this.#appendLeaves(MerkleTreeId.ARCHIVE, [blockHash
|
|
455
|
+
await this.#appendLeaves(MerkleTreeId.ARCHIVE, [blockHash]);
|
|
425
456
|
}
|
|
426
457
|
|
|
427
458
|
/**
|
|
@@ -455,20 +486,21 @@ export class MerkleTrees implements MerkleTreeDb {
|
|
|
455
486
|
* @param leaves - Leaves to append.
|
|
456
487
|
* @returns Empty promise.
|
|
457
488
|
*/
|
|
458
|
-
async #appendLeaves(treeId:
|
|
489
|
+
async #appendLeaves<ID extends MerkleTreeId>(treeId: ID, leaves: MerkleTreeLeafType<typeof treeId>[]): Promise<void> {
|
|
459
490
|
const tree = this.trees[treeId];
|
|
460
491
|
if (!('appendLeaves' in tree)) {
|
|
461
492
|
throw new Error('Tree does not support `appendLeaves` method');
|
|
462
493
|
}
|
|
463
|
-
|
|
494
|
+
// TODO #5448 fix "as any"
|
|
495
|
+
return await tree.appendLeaves(leaves as any[]);
|
|
464
496
|
}
|
|
465
497
|
|
|
466
|
-
async #updateLeaf(treeId: IndexedTreeId, leaf:
|
|
498
|
+
async #updateLeaf(treeId: IndexedTreeId, leaf: MerkleTreeLeafType<typeof treeId>, index: bigint): Promise<void> {
|
|
467
499
|
const tree = this.trees[treeId];
|
|
468
500
|
if (!('updateLeaf' in tree)) {
|
|
469
501
|
throw new Error('Tree does not support `updateLeaf` method');
|
|
470
502
|
}
|
|
471
|
-
return await tree.updateLeaf(leaf, index);
|
|
503
|
+
return await (tree as UpdateOnlyTree<typeof leaf>).updateLeaf(leaf, index);
|
|
472
504
|
}
|
|
473
505
|
|
|
474
506
|
/**
|
|
@@ -476,7 +508,7 @@ export class MerkleTrees implements MerkleTreeDb {
|
|
|
476
508
|
* @returns Empty promise.
|
|
477
509
|
*/
|
|
478
510
|
async #commit(): Promise<void> {
|
|
479
|
-
for (const tree of this.trees) {
|
|
511
|
+
for (const tree of Object.values(this.trees)) {
|
|
480
512
|
await tree.commit();
|
|
481
513
|
}
|
|
482
514
|
}
|
|
@@ -486,17 +518,31 @@ export class MerkleTrees implements MerkleTreeDb {
|
|
|
486
518
|
* @returns Empty promise.
|
|
487
519
|
*/
|
|
488
520
|
async #rollback(): Promise<void> {
|
|
489
|
-
for (const tree of this.trees) {
|
|
521
|
+
for (const tree of Object.values(this.trees)) {
|
|
490
522
|
await tree.rollback();
|
|
491
523
|
}
|
|
492
524
|
}
|
|
493
525
|
|
|
494
|
-
public getSnapshot(blockNumber: number) {
|
|
495
|
-
|
|
526
|
+
public async getSnapshot(blockNumber: number): Promise<TreeSnapshots> {
|
|
527
|
+
const snapshots = await Promise.all([
|
|
528
|
+
this.trees[MerkleTreeId.NULLIFIER_TREE].getSnapshot(blockNumber),
|
|
529
|
+
this.trees[MerkleTreeId.NOTE_HASH_TREE].getSnapshot(blockNumber),
|
|
530
|
+
this.trees[MerkleTreeId.PUBLIC_DATA_TREE].getSnapshot(blockNumber),
|
|
531
|
+
this.trees[MerkleTreeId.L1_TO_L2_MESSAGE_TREE].getSnapshot(blockNumber),
|
|
532
|
+
this.trees[MerkleTreeId.ARCHIVE].getSnapshot(blockNumber),
|
|
533
|
+
]);
|
|
534
|
+
|
|
535
|
+
return {
|
|
536
|
+
[MerkleTreeId.NULLIFIER_TREE]: snapshots[0],
|
|
537
|
+
[MerkleTreeId.NOTE_HASH_TREE]: snapshots[1],
|
|
538
|
+
[MerkleTreeId.PUBLIC_DATA_TREE]: snapshots[2],
|
|
539
|
+
[MerkleTreeId.L1_TO_L2_MESSAGE_TREE]: snapshots[3],
|
|
540
|
+
[MerkleTreeId.ARCHIVE]: snapshots[4],
|
|
541
|
+
};
|
|
496
542
|
}
|
|
497
543
|
|
|
498
544
|
async #snapshot(blockNumber: number): Promise<void> {
|
|
499
|
-
for (const tree of this.trees) {
|
|
545
|
+
for (const tree of Object.values(this.trees)) {
|
|
500
546
|
await tree.snapshot(blockNumber);
|
|
501
547
|
}
|
|
502
548
|
}
|
|
@@ -535,10 +581,7 @@ export class MerkleTrees implements MerkleTreeDb {
|
|
|
535
581
|
[MerkleTreeId.NOTE_HASH_TREE, l2Block.body.txEffects.flatMap(txEffect => txEffect.noteHashes)],
|
|
536
582
|
[MerkleTreeId.L1_TO_L2_MESSAGE_TREE, l1ToL2MessagesPadded],
|
|
537
583
|
] as const) {
|
|
538
|
-
await this.#appendLeaves(
|
|
539
|
-
tree,
|
|
540
|
-
leaves.map(fr => fr.toBuffer()),
|
|
541
|
-
);
|
|
584
|
+
await this.#appendLeaves(tree, leaves);
|
|
542
585
|
}
|
|
543
586
|
|
|
544
587
|
// Sync the indexed trees
|