@aztec/world-state 0.72.1 → 0.74.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/native/merkle_trees_facade.js +2 -2
- package/dest/native/message.d.ts +0 -30
- package/dest/native/message.d.ts.map +1 -1
- package/dest/native/message.js +1 -23
- package/dest/native/native_world_state.js +3 -3
- package/dest/native/native_world_state_instance.d.ts +1 -13
- package/dest/native/native_world_state_instance.d.ts.map +1 -1
- package/dest/native/native_world_state_instance.js +27 -94
- package/dest/native/world_state_version.js +2 -2
- package/dest/synchronizer/server_world_state_synchronizer.d.ts +1 -1
- package/dest/synchronizer/server_world_state_synchronizer.d.ts.map +1 -1
- package/dest/synchronizer/server_world_state_synchronizer.js +6 -6
- package/dest/test/index.d.ts +2 -0
- package/dest/test/index.d.ts.map +1 -0
- package/dest/test/index.js +2 -0
- package/dest/world-state-db/index.d.ts +0 -3
- package/dest/world-state-db/index.d.ts.map +1 -1
- package/dest/world-state-db/index.js +1 -4
- package/package.json +13 -17
- package/src/native/merkle_trees_facade.ts +1 -1
- package/src/native/message.ts +0 -44
- package/src/native/native_world_state.ts +2 -2
- package/src/native/native_world_state_instance.ts +28 -124
- package/src/native/world_state_version.ts +1 -1
- package/src/synchronizer/server_world_state_synchronizer.ts +6 -6
- package/src/test/index.ts +1 -0
- package/src/world-state-db/index.ts +0 -3
- package/dest/world-state-db/merkle_tree_map.d.ts +0 -11
- package/dest/world-state-db/merkle_tree_map.d.ts.map +0 -1
- package/dest/world-state-db/merkle_tree_map.js +0 -2
- package/dest/world-state-db/merkle_tree_operations_facade.d.ts +0 -116
- package/dest/world-state-db/merkle_tree_operations_facade.d.ts.map +0 -1
- package/dest/world-state-db/merkle_tree_operations_facade.js +0 -133
- package/dest/world-state-db/merkle_tree_snapshot_operations_facade.d.ts +0 -32
- package/dest/world-state-db/merkle_tree_snapshot_operations_facade.d.ts.map +0 -1
- package/dest/world-state-db/merkle_tree_snapshot_operations_facade.js +0 -76
- package/dest/world-state-db/merkle_trees.d.ts +0 -174
- package/dest/world-state-db/merkle_trees.d.ts.map +0 -1
- package/dest/world-state-db/merkle_trees.js +0 -461
- package/dest/world-state-db/metrics.d.ts +0 -14
- package/dest/world-state-db/metrics.d.ts.map +0 -1
- package/dest/world-state-db/metrics.js +0 -44
- package/src/world-state-db/merkle_tree_map.ts +0 -11
- package/src/world-state-db/merkle_tree_operations_facade.ts +0 -199
- package/src/world-state-db/merkle_tree_snapshot_operations_facade.ts +0 -151
- package/src/world-state-db/merkle_trees.ts +0 -727
- package/src/world-state-db/metrics.ts +0 -64
|
@@ -1,461 +0,0 @@
|
|
|
1
|
-
var _MerkleTrees_instances, _MerkleTrees_init, _MerkleTrees_saveInitialStateReference, _MerkleTrees_loadInitialStateReference, _MerkleTrees_updateArchive, _MerkleTrees_getTreeInfo, _MerkleTrees_getIndexedTree, _MerkleTrees_appendLeaves, _MerkleTrees_commit, _MerkleTrees_rollback, _MerkleTrees_snapshot, _MerkleTrees_handleL2BlockAndMessages, _MerkleTrees_isDbPopulated;
|
|
2
|
-
import { __classPrivateFieldGet } from "tslib";
|
|
3
|
-
import { MerkleTreeId } from '@aztec/circuit-types';
|
|
4
|
-
import { ARCHIVE_HEIGHT, AppendOnlyTreeSnapshot, BlockHeader, Fr, L1_TO_L2_MSG_TREE_HEIGHT, MAX_NOTE_HASHES_PER_TX, MAX_NULLIFIERS_PER_TX, MAX_TOTAL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX, NOTE_HASH_TREE_HEIGHT, NULLIFIER_SUBTREE_HEIGHT, NULLIFIER_TREE_HEIGHT, NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP, NullifierLeaf, NullifierLeafPreimage, PUBLIC_DATA_SUBTREE_HEIGHT, PUBLIC_DATA_TREE_HEIGHT, PartialStateReference, PublicDataTreeLeaf, PublicDataTreeLeafPreimage, PublicDataWrite, StateReference, } from '@aztec/circuits.js';
|
|
5
|
-
import { padArrayEnd } from '@aztec/foundation/collection';
|
|
6
|
-
import { createLogger } from '@aztec/foundation/log';
|
|
7
|
-
import { SerialQueue } from '@aztec/foundation/queue';
|
|
8
|
-
import { Timer, elapsed } from '@aztec/foundation/timer';
|
|
9
|
-
import { openTmpStore } from '@aztec/kv-store/lmdb';
|
|
10
|
-
import { Poseidon, StandardIndexedTree, StandardTree, getTreeMeta, loadTree, newTree, } from '@aztec/merkle-tree';
|
|
11
|
-
import { getTelemetryClient } from '@aztec/telemetry-client';
|
|
12
|
-
import { buildEmptyWorldStateStatusFull, } from '../native/message.js';
|
|
13
|
-
import { INITIAL_NULLIFIER_TREE_SIZE, INITIAL_PUBLIC_DATA_TREE_SIZE, } from './merkle_tree_db.js';
|
|
14
|
-
import { MerkleTreeReadOperationsFacade } from './merkle_tree_operations_facade.js';
|
|
15
|
-
import { MerkleTreeSnapshotOperationsFacade } from './merkle_tree_snapshot_operations_facade.js';
|
|
16
|
-
import { WorldStateMetrics } from './metrics.js';
|
|
17
|
-
/**
|
|
18
|
-
* The nullifier tree is an indexed tree.
|
|
19
|
-
*/
|
|
20
|
-
class NullifierTree extends StandardIndexedTree {
|
|
21
|
-
constructor(store, hasher, name, depth, size = 0n, _noop, root) {
|
|
22
|
-
super(store, hasher, name, depth, size, NullifierLeafPreimage, NullifierLeaf, root);
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
/**
|
|
26
|
-
* The public data tree is an indexed tree.
|
|
27
|
-
*/
|
|
28
|
-
class PublicDataTree extends StandardIndexedTree {
|
|
29
|
-
constructor(store, hasher, name, depth, size = 0n, _noop, root) {
|
|
30
|
-
super(store, hasher, name, depth, size, PublicDataTreeLeafPreimage, PublicDataTreeLeaf, root);
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
/**
|
|
34
|
-
* A convenience class for managing multiple merkle trees.
|
|
35
|
-
*/
|
|
36
|
-
export class MerkleTrees {
|
|
37
|
-
constructor(store, telemetryClient, log) {
|
|
38
|
-
_MerkleTrees_instances.add(this);
|
|
39
|
-
this.store = store;
|
|
40
|
-
this.telemetryClient = telemetryClient;
|
|
41
|
-
this.log = log;
|
|
42
|
-
// gets initialized in #init
|
|
43
|
-
this.trees = null;
|
|
44
|
-
this.jobQueue = new SerialQueue();
|
|
45
|
-
this.initialStateReference = store.openSingleton('merkle_trees_initial_state_reference');
|
|
46
|
-
this.metrics = new WorldStateMetrics(telemetryClient);
|
|
47
|
-
}
|
|
48
|
-
/**
|
|
49
|
-
* Method to asynchronously create and initialize a MerkleTrees instance.
|
|
50
|
-
* @param store - The db instance to use for data persistance.
|
|
51
|
-
* @returns - A fully initialized MerkleTrees instance.
|
|
52
|
-
*/
|
|
53
|
-
static async new(store, client = getTelemetryClient(), log = createLogger('world-state:merkle_trees')) {
|
|
54
|
-
const merkleTrees = new MerkleTrees(store, client, log);
|
|
55
|
-
await __classPrivateFieldGet(merkleTrees, _MerkleTrees_instances, "m", _MerkleTrees_init).call(merkleTrees);
|
|
56
|
-
return merkleTrees;
|
|
57
|
-
}
|
|
58
|
-
/**
|
|
59
|
-
* Creates a temporary store. Useful for testing.
|
|
60
|
-
*/
|
|
61
|
-
static tmp() {
|
|
62
|
-
const store = openTmpStore();
|
|
63
|
-
return MerkleTrees.new(store, getTelemetryClient());
|
|
64
|
-
}
|
|
65
|
-
removeHistoricalBlocks(_toBlockNumber) {
|
|
66
|
-
throw new Error('Method not implemented.');
|
|
67
|
-
}
|
|
68
|
-
unwindBlocks(_toBlockNumber) {
|
|
69
|
-
throw new Error('Method not implemented.');
|
|
70
|
-
}
|
|
71
|
-
setFinalised(_toBlockNumber) {
|
|
72
|
-
throw new Error('Method not implemented.');
|
|
73
|
-
}
|
|
74
|
-
getStatusSummary() {
|
|
75
|
-
throw new Error('Method not implemented.');
|
|
76
|
-
}
|
|
77
|
-
async fork(blockNumber) {
|
|
78
|
-
if (blockNumber) {
|
|
79
|
-
throw new Error('Block number forking is not supported in js world state');
|
|
80
|
-
}
|
|
81
|
-
const [ms, db] = await elapsed(async () => {
|
|
82
|
-
const forked = await this.store.fork();
|
|
83
|
-
return MerkleTrees.new(forked, this.telemetryClient, this.log);
|
|
84
|
-
});
|
|
85
|
-
this.metrics.recordForkDuration(ms);
|
|
86
|
-
return new MerkleTreeReadOperationsFacade(db, true);
|
|
87
|
-
}
|
|
88
|
-
// REFACTOR: We're hiding the `commit` operations in the tree behind a type check only, but
|
|
89
|
-
// we should make sure it's not accidentally called elsewhere by splitting this class into one
|
|
90
|
-
// that can work on a read-only store and one that actually writes to the store. This implies
|
|
91
|
-
// having read-only versions of the kv-stores, all kv-containers, and all trees.
|
|
92
|
-
async ephemeralFork() {
|
|
93
|
-
const forked = new MerkleTrees(this.store, this.telemetryClient, createLogger('world-state:merkle_trees:ephemeral_fork'));
|
|
94
|
-
await __classPrivateFieldGet(forked, _MerkleTrees_instances, "m", _MerkleTrees_init).call(forked, true);
|
|
95
|
-
return new MerkleTreeReadOperationsFacade(forked, true);
|
|
96
|
-
}
|
|
97
|
-
async delete() {
|
|
98
|
-
await this.store.delete();
|
|
99
|
-
}
|
|
100
|
-
getInitialHeader() {
|
|
101
|
-
return BlockHeader.empty({ state: __classPrivateFieldGet(this, _MerkleTrees_instances, "m", _MerkleTrees_loadInitialStateReference).call(this) });
|
|
102
|
-
}
|
|
103
|
-
/**
|
|
104
|
-
* Stops the job queue (waits for all jobs to finish).
|
|
105
|
-
*/
|
|
106
|
-
async close() {
|
|
107
|
-
await this.jobQueue.end();
|
|
108
|
-
}
|
|
109
|
-
/**
|
|
110
|
-
* Gets a view of this db that returns uncommitted data.
|
|
111
|
-
* @returns - A facade for this instance.
|
|
112
|
-
*/
|
|
113
|
-
getLatest() {
|
|
114
|
-
return Promise.resolve(new MerkleTreeReadOperationsFacade(this, true));
|
|
115
|
-
}
|
|
116
|
-
/**
|
|
117
|
-
* Gets a view of this db that returns committed data only.
|
|
118
|
-
* @returns - A facade for this instance.
|
|
119
|
-
*/
|
|
120
|
-
getCommitted() {
|
|
121
|
-
return new MerkleTreeReadOperationsFacade(this, false);
|
|
122
|
-
}
|
|
123
|
-
getSnapshot(blockNumber) {
|
|
124
|
-
return new MerkleTreeSnapshotOperationsFacade(this, blockNumber);
|
|
125
|
-
}
|
|
126
|
-
/**
|
|
127
|
-
* Updates the archive with the new block/header hash.
|
|
128
|
-
* @param header - The header whose hash to insert into the archive.
|
|
129
|
-
* @param includeUncommitted - Indicates whether to include uncommitted data.
|
|
130
|
-
*/
|
|
131
|
-
async updateArchive(header) {
|
|
132
|
-
await this.synchronize(() => __classPrivateFieldGet(this, _MerkleTrees_instances, "m", _MerkleTrees_updateArchive).call(this, header));
|
|
133
|
-
}
|
|
134
|
-
/**
|
|
135
|
-
* Gets the tree info for the specified tree.
|
|
136
|
-
* @param treeId - Id of the tree to get information from.
|
|
137
|
-
* @param includeUncommitted - Indicates whether to include uncommitted data.
|
|
138
|
-
* @returns The tree info for the specified tree.
|
|
139
|
-
*/
|
|
140
|
-
async getTreeInfo(treeId, includeUncommitted) {
|
|
141
|
-
return await this.synchronize(() => __classPrivateFieldGet(this, _MerkleTrees_instances, "m", _MerkleTrees_getTreeInfo).call(this, treeId, includeUncommitted));
|
|
142
|
-
}
|
|
143
|
-
/**
|
|
144
|
-
* Get the current state reference
|
|
145
|
-
* @param includeUncommitted - Indicates whether to include uncommitted data.
|
|
146
|
-
* @returns The current state reference
|
|
147
|
-
*/
|
|
148
|
-
getStateReference(includeUncommitted) {
|
|
149
|
-
const getAppendOnlyTreeSnapshot = (treeId) => {
|
|
150
|
-
const tree = this.trees[treeId];
|
|
151
|
-
return new AppendOnlyTreeSnapshot(Fr.fromBuffer(tree.getRoot(includeUncommitted)), Number(tree.getNumLeaves(includeUncommitted)));
|
|
152
|
-
};
|
|
153
|
-
const state = new StateReference(getAppendOnlyTreeSnapshot(MerkleTreeId.L1_TO_L2_MESSAGE_TREE), new PartialStateReference(getAppendOnlyTreeSnapshot(MerkleTreeId.NOTE_HASH_TREE), getAppendOnlyTreeSnapshot(MerkleTreeId.NULLIFIER_TREE), getAppendOnlyTreeSnapshot(MerkleTreeId.PUBLIC_DATA_TREE)));
|
|
154
|
-
return Promise.resolve(state);
|
|
155
|
-
}
|
|
156
|
-
/**
|
|
157
|
-
* Gets the value at the given index.
|
|
158
|
-
* @param treeId - The ID of the tree to get the leaf value from.
|
|
159
|
-
* @param index - The index of the leaf.
|
|
160
|
-
* @param includeUncommitted - Indicates whether to include uncommitted changes.
|
|
161
|
-
* @returns Leaf value at the given index (undefined if not found).
|
|
162
|
-
*/
|
|
163
|
-
async getLeafValue(treeId, index, includeUncommitted) {
|
|
164
|
-
return await this.synchronize(() => Promise.resolve(this.trees[treeId].getLeafValue(index, includeUncommitted)));
|
|
165
|
-
}
|
|
166
|
-
/**
|
|
167
|
-
* Gets the sibling path for a leaf in a tree.
|
|
168
|
-
* @param treeId - The ID of the tree.
|
|
169
|
-
* @param index - The index of the leaf.
|
|
170
|
-
* @param includeUncommitted - Indicates whether the sibling path should include uncommitted data.
|
|
171
|
-
* @returns The sibling path for the leaf.
|
|
172
|
-
*/
|
|
173
|
-
async getSiblingPath(treeId, index, includeUncommitted) {
|
|
174
|
-
return await this.synchronize(() => this.trees[treeId].getSiblingPath(index, includeUncommitted));
|
|
175
|
-
}
|
|
176
|
-
/**
|
|
177
|
-
* Appends leaves to a tree.
|
|
178
|
-
* @param treeId - The ID of the tree.
|
|
179
|
-
* @param leaves - The leaves to append.
|
|
180
|
-
* @returns Empty promise.
|
|
181
|
-
*/
|
|
182
|
-
async appendLeaves(treeId, leaves) {
|
|
183
|
-
return await this.synchronize(() => __classPrivateFieldGet(this, _MerkleTrees_instances, "m", _MerkleTrees_appendLeaves).call(this, treeId, leaves));
|
|
184
|
-
}
|
|
185
|
-
/**
|
|
186
|
-
* Commits all pending updates.
|
|
187
|
-
* @returns Empty promise.
|
|
188
|
-
*/
|
|
189
|
-
async commit() {
|
|
190
|
-
return await this.synchronize(() => __classPrivateFieldGet(this, _MerkleTrees_instances, "m", _MerkleTrees_commit).call(this));
|
|
191
|
-
}
|
|
192
|
-
/**
|
|
193
|
-
* Rolls back all pending updates.
|
|
194
|
-
* @returns Empty promise.
|
|
195
|
-
*/
|
|
196
|
-
async rollback() {
|
|
197
|
-
return await this.synchronize(() => __classPrivateFieldGet(this, _MerkleTrees_instances, "m", _MerkleTrees_rollback).call(this));
|
|
198
|
-
}
|
|
199
|
-
/**
|
|
200
|
-
* Finds the index of the largest leaf whose value is less than or equal to the provided value.
|
|
201
|
-
* @param treeId - The ID of the tree to search.
|
|
202
|
-
* @param value - The value to be inserted into the tree.
|
|
203
|
-
* @param includeUncommitted - If true, the uncommitted changes are included in the search.
|
|
204
|
-
* @returns The found leaf index and a flag indicating if the corresponding leaf's value is equal to `newValue`.
|
|
205
|
-
*/
|
|
206
|
-
async getPreviousValueIndex(treeId, value, includeUncommitted) {
|
|
207
|
-
return await this.synchronize(() => Promise.resolve(__classPrivateFieldGet(this, _MerkleTrees_instances, "m", _MerkleTrees_getIndexedTree).call(this, treeId).findIndexOfPreviousKey(value, includeUncommitted)));
|
|
208
|
-
}
|
|
209
|
-
/**
|
|
210
|
-
* Gets the leaf data at a given index and tree.
|
|
211
|
-
* @param treeId - The ID of the tree get the leaf from.
|
|
212
|
-
* @param index - The index of the leaf to get.
|
|
213
|
-
* @param includeUncommitted - Indicates whether to include uncommitted data.
|
|
214
|
-
* @returns Leaf preimage.
|
|
215
|
-
*/
|
|
216
|
-
async getLeafPreimage(treeId, index, includeUncommitted) {
|
|
217
|
-
return await this.synchronize(() => Promise.resolve(__classPrivateFieldGet(this, _MerkleTrees_instances, "m", _MerkleTrees_getIndexedTree).call(this, treeId).getLatestLeafPreimageCopy(index, includeUncommitted)));
|
|
218
|
-
}
|
|
219
|
-
/**
|
|
220
|
-
* Returns the index of a leaf given its value, or undefined if no leaf with that value is found.
|
|
221
|
-
* @param treeId - The ID of the tree.
|
|
222
|
-
* @param value - The leaf value to look for.
|
|
223
|
-
* @param includeUncommitted - Indicates whether to include uncommitted data.
|
|
224
|
-
* @returns The index of the first leaf found with a given value (undefined if not found).
|
|
225
|
-
*/
|
|
226
|
-
async findLeafIndex(treeId, value, includeUncommitted) {
|
|
227
|
-
return await this.synchronize(() => {
|
|
228
|
-
const tree = this.trees[treeId];
|
|
229
|
-
// TODO #5448 fix "as any"
|
|
230
|
-
return Promise.resolve(tree.findLeafIndex(value, includeUncommitted));
|
|
231
|
-
});
|
|
232
|
-
}
|
|
233
|
-
/**
|
|
234
|
-
* Returns the first index containing a leaf value after `startIndex`.
|
|
235
|
-
* @param treeId - The tree for which the index should be returned.
|
|
236
|
-
* @param value - The value to search for in the tree.
|
|
237
|
-
* @param startIndex - The index to start searching from (used when skipping nullified messages)
|
|
238
|
-
* @param includeUncommitted - Indicates whether to include uncommitted data.
|
|
239
|
-
*/
|
|
240
|
-
async findLeafIndexAfter(treeId, value, startIndex, includeUncommitted) {
|
|
241
|
-
return await this.synchronize(() => {
|
|
242
|
-
const tree = this.trees[treeId];
|
|
243
|
-
// TODO #5448 fix "as any"
|
|
244
|
-
return Promise.resolve(tree.findLeafIndexAfter(value, startIndex, includeUncommitted));
|
|
245
|
-
});
|
|
246
|
-
}
|
|
247
|
-
/**
|
|
248
|
-
* Handles a single L2 block (i.e. Inserts the new note hashes into the merkle tree).
|
|
249
|
-
* @param block - The L2 block to handle.
|
|
250
|
-
* @param l1ToL2Messages - The L1 to L2 messages for the block.
|
|
251
|
-
* @returns Whether the block handled was produced by this same node.
|
|
252
|
-
*/
|
|
253
|
-
async handleL2BlockAndMessages(block, l1ToL2Messages) {
|
|
254
|
-
return await this.synchronize(() => __classPrivateFieldGet(this, _MerkleTrees_instances, "m", _MerkleTrees_handleL2BlockAndMessages).call(this, block, l1ToL2Messages));
|
|
255
|
-
}
|
|
256
|
-
/**
|
|
257
|
-
* Batch insert multiple leaves into the tree.
|
|
258
|
-
* @param treeId - The ID of the tree.
|
|
259
|
-
* @param leaves - Leaves to insert into the tree.
|
|
260
|
-
* @param subtreeHeight - Height of the subtree.
|
|
261
|
-
* @returns The data for the leaves to be updated when inserting the new ones.
|
|
262
|
-
*/
|
|
263
|
-
async batchInsert(treeId, leaves, subtreeHeight) {
|
|
264
|
-
const tree = this.trees[treeId];
|
|
265
|
-
if (!('batchInsert' in tree)) {
|
|
266
|
-
throw new Error('Tree does not support `batchInsert` method');
|
|
267
|
-
}
|
|
268
|
-
return await this.synchronize(() => tree.batchInsert(leaves, subtreeHeight));
|
|
269
|
-
}
|
|
270
|
-
/**
|
|
271
|
-
* Waits for all jobs to finish before executing the given function.
|
|
272
|
-
* @param fn - The function to execute.
|
|
273
|
-
* @returns Promise containing the result of the function.
|
|
274
|
-
*/
|
|
275
|
-
async synchronize(fn) {
|
|
276
|
-
return await this.jobQueue.put(fn);
|
|
277
|
-
}
|
|
278
|
-
async getTreeSnapshots(blockNumber) {
|
|
279
|
-
const snapshots = await Promise.all([
|
|
280
|
-
this.trees[MerkleTreeId.NULLIFIER_TREE].getSnapshot(blockNumber),
|
|
281
|
-
this.trees[MerkleTreeId.NOTE_HASH_TREE].getSnapshot(blockNumber),
|
|
282
|
-
this.trees[MerkleTreeId.PUBLIC_DATA_TREE].getSnapshot(blockNumber),
|
|
283
|
-
this.trees[MerkleTreeId.L1_TO_L2_MESSAGE_TREE].getSnapshot(blockNumber),
|
|
284
|
-
this.trees[MerkleTreeId.ARCHIVE].getSnapshot(blockNumber),
|
|
285
|
-
]);
|
|
286
|
-
return {
|
|
287
|
-
[MerkleTreeId.NULLIFIER_TREE]: snapshots[0],
|
|
288
|
-
[MerkleTreeId.NOTE_HASH_TREE]: snapshots[1],
|
|
289
|
-
[MerkleTreeId.PUBLIC_DATA_TREE]: snapshots[2],
|
|
290
|
-
[MerkleTreeId.L1_TO_L2_MESSAGE_TREE]: snapshots[3],
|
|
291
|
-
[MerkleTreeId.ARCHIVE]: snapshots[4],
|
|
292
|
-
};
|
|
293
|
-
}
|
|
294
|
-
}
|
|
295
|
-
_MerkleTrees_instances = new WeakSet(), _MerkleTrees_init =
|
|
296
|
-
/**
|
|
297
|
-
* Initializes the collection of Merkle Trees.
|
|
298
|
-
*/
|
|
299
|
-
async function _MerkleTrees_init(loadFromDb) {
|
|
300
|
-
const fromDb = loadFromDb === undefined ? __classPrivateFieldGet(this, _MerkleTrees_instances, "m", _MerkleTrees_isDbPopulated).call(this) : loadFromDb;
|
|
301
|
-
const initializeTree = fromDb ? loadTree : newTree;
|
|
302
|
-
const hasher = new Poseidon();
|
|
303
|
-
const nullifierTree = await initializeTree(NullifierTree, this.store, hasher, `${MerkleTreeId[MerkleTreeId.NULLIFIER_TREE]}`, {}, NULLIFIER_TREE_HEIGHT, INITIAL_NULLIFIER_TREE_SIZE);
|
|
304
|
-
const noteHashTree = await initializeTree(StandardTree, this.store, hasher, `${MerkleTreeId[MerkleTreeId.NOTE_HASH_TREE]}`, Fr, NOTE_HASH_TREE_HEIGHT);
|
|
305
|
-
const publicDataTree = await initializeTree(PublicDataTree, this.store, hasher, `${MerkleTreeId[MerkleTreeId.PUBLIC_DATA_TREE]}`, {}, PUBLIC_DATA_TREE_HEIGHT, INITIAL_PUBLIC_DATA_TREE_SIZE);
|
|
306
|
-
const l1Tol2MessageTree = await initializeTree(StandardTree, this.store, hasher, `${MerkleTreeId[MerkleTreeId.L1_TO_L2_MESSAGE_TREE]}`, Fr, L1_TO_L2_MSG_TREE_HEIGHT);
|
|
307
|
-
const archive = await initializeTree(StandardTree, this.store, hasher, `${MerkleTreeId[MerkleTreeId.ARCHIVE]}`, Fr, ARCHIVE_HEIGHT);
|
|
308
|
-
this.trees = [nullifierTree, noteHashTree, publicDataTree, l1Tol2MessageTree, archive];
|
|
309
|
-
this.jobQueue.start();
|
|
310
|
-
if (!fromDb) {
|
|
311
|
-
// We are not initializing from db so we need to populate the first leaf of the archive tree which is a hash of the initial header,
|
|
312
|
-
// and persist the initial header state reference so we can later load it when requested.
|
|
313
|
-
const initialState = await this.getStateReference(true);
|
|
314
|
-
await __classPrivateFieldGet(this, _MerkleTrees_instances, "m", _MerkleTrees_saveInitialStateReference).call(this, initialState);
|
|
315
|
-
await __classPrivateFieldGet(this, _MerkleTrees_instances, "m", _MerkleTrees_updateArchive).call(this, this.getInitialHeader());
|
|
316
|
-
// And commit anything we did to initialize this set of trees
|
|
317
|
-
await __classPrivateFieldGet(this, _MerkleTrees_instances, "m", _MerkleTrees_commit).call(this);
|
|
318
|
-
}
|
|
319
|
-
}, _MerkleTrees_saveInitialStateReference = function _MerkleTrees_saveInitialStateReference(state) {
|
|
320
|
-
return this.initialStateReference.set(state.toBuffer());
|
|
321
|
-
}, _MerkleTrees_loadInitialStateReference = function _MerkleTrees_loadInitialStateReference() {
|
|
322
|
-
const serialized = this.initialStateReference.get();
|
|
323
|
-
if (!serialized) {
|
|
324
|
-
throw new Error('Initial state reference not found');
|
|
325
|
-
}
|
|
326
|
-
return StateReference.fromBuffer(serialized);
|
|
327
|
-
}, _MerkleTrees_updateArchive = async function _MerkleTrees_updateArchive(header) {
|
|
328
|
-
const state = await this.getStateReference(true);
|
|
329
|
-
// This method should be called only when the block builder already updated the state so we sanity check that it's
|
|
330
|
-
// the case here.
|
|
331
|
-
if (!state.toBuffer().equals(header.state.toBuffer())) {
|
|
332
|
-
throw new Error('State in header does not match current state');
|
|
333
|
-
}
|
|
334
|
-
const blockHash = header.hash();
|
|
335
|
-
await __classPrivateFieldGet(this, _MerkleTrees_instances, "m", _MerkleTrees_appendLeaves).call(this, MerkleTreeId.ARCHIVE, [blockHash]);
|
|
336
|
-
}, _MerkleTrees_getTreeInfo = function _MerkleTrees_getTreeInfo(treeId, includeUncommitted) {
|
|
337
|
-
const treeInfo = {
|
|
338
|
-
treeId,
|
|
339
|
-
root: this.trees[treeId].getRoot(includeUncommitted),
|
|
340
|
-
size: this.trees[treeId].getNumLeaves(includeUncommitted),
|
|
341
|
-
depth: this.trees[treeId].getDepth(),
|
|
342
|
-
};
|
|
343
|
-
return Promise.resolve(treeInfo);
|
|
344
|
-
}, _MerkleTrees_getIndexedTree = function _MerkleTrees_getIndexedTree(treeId) {
|
|
345
|
-
return this.trees[treeId];
|
|
346
|
-
}, _MerkleTrees_appendLeaves =
|
|
347
|
-
/**
|
|
348
|
-
* Appends leaves to a tree.
|
|
349
|
-
* @param treeId - Id of the tree to append leaves to.
|
|
350
|
-
* @param leaves - Leaves to append.
|
|
351
|
-
* @returns Empty promise.
|
|
352
|
-
*/
|
|
353
|
-
async function _MerkleTrees_appendLeaves(treeId, leaves) {
|
|
354
|
-
const tree = this.trees[treeId];
|
|
355
|
-
if (!('appendLeaves' in tree)) {
|
|
356
|
-
throw new Error('Tree does not support `appendLeaves` method');
|
|
357
|
-
}
|
|
358
|
-
// TODO #5448 fix "as any"
|
|
359
|
-
return await tree.appendLeaves(leaves);
|
|
360
|
-
}, _MerkleTrees_commit =
|
|
361
|
-
/**
|
|
362
|
-
* Commits all pending updates.
|
|
363
|
-
* @returns Empty promise.
|
|
364
|
-
*/
|
|
365
|
-
async function _MerkleTrees_commit() {
|
|
366
|
-
for (const tree of Object.values(this.trees)) {
|
|
367
|
-
await tree.commit();
|
|
368
|
-
}
|
|
369
|
-
}, _MerkleTrees_rollback =
|
|
370
|
-
/**
|
|
371
|
-
* Rolls back all pending updates.
|
|
372
|
-
* @returns Empty promise.
|
|
373
|
-
*/
|
|
374
|
-
async function _MerkleTrees_rollback() {
|
|
375
|
-
for (const tree of Object.values(this.trees)) {
|
|
376
|
-
await tree.rollback();
|
|
377
|
-
}
|
|
378
|
-
}, _MerkleTrees_snapshot = async function _MerkleTrees_snapshot(blockNumber) {
|
|
379
|
-
for (const tree of Object.values(this.trees)) {
|
|
380
|
-
await tree.snapshot(blockNumber);
|
|
381
|
-
}
|
|
382
|
-
}, _MerkleTrees_handleL2BlockAndMessages =
|
|
383
|
-
/**
|
|
384
|
-
* Handles a single L2 block (i.e. Inserts the new note hashes into the merkle tree).
|
|
385
|
-
* @param l2Block - The L2 block to handle.
|
|
386
|
-
* @param l1ToL2Messages - The L1 to L2 messages for the block.
|
|
387
|
-
*/
|
|
388
|
-
async function _MerkleTrees_handleL2BlockAndMessages(l2Block, l1ToL2Messages) {
|
|
389
|
-
const timer = new Timer();
|
|
390
|
-
const treeRootWithIdPairs = [
|
|
391
|
-
[l2Block.header.state.partial.nullifierTree.root, MerkleTreeId.NULLIFIER_TREE],
|
|
392
|
-
[l2Block.header.state.partial.noteHashTree.root, MerkleTreeId.NOTE_HASH_TREE],
|
|
393
|
-
[l2Block.header.state.partial.publicDataTree.root, MerkleTreeId.PUBLIC_DATA_TREE],
|
|
394
|
-
[l2Block.header.state.l1ToL2MessageTree.root, MerkleTreeId.L1_TO_L2_MESSAGE_TREE],
|
|
395
|
-
[l2Block.archive.root, MerkleTreeId.ARCHIVE],
|
|
396
|
-
];
|
|
397
|
-
const compareRoot = (root, treeId) => {
|
|
398
|
-
const treeRoot = this.trees[treeId].getRoot(true);
|
|
399
|
-
return treeRoot.equals(root.toBuffer());
|
|
400
|
-
};
|
|
401
|
-
const ourBlock = treeRootWithIdPairs.every(([root, id]) => compareRoot(root, id));
|
|
402
|
-
if (ourBlock) {
|
|
403
|
-
this.log.verbose(`Block ${l2Block.number} is ours, committing world state`);
|
|
404
|
-
await __classPrivateFieldGet(this, _MerkleTrees_instances, "m", _MerkleTrees_commit).call(this);
|
|
405
|
-
}
|
|
406
|
-
else {
|
|
407
|
-
this.log.verbose(`Block ${l2Block.number} is not ours, rolling back world state and committing state from chain`);
|
|
408
|
-
await __classPrivateFieldGet(this, _MerkleTrees_instances, "m", _MerkleTrees_rollback).call(this);
|
|
409
|
-
// We have to pad the values within tx effects because that's how the trees are built by circuits.
|
|
410
|
-
// Sync the append only trees
|
|
411
|
-
{
|
|
412
|
-
const noteHashesPadded = l2Block.body.txEffects.flatMap(txEffect => padArrayEnd(txEffect.noteHashes, Fr.ZERO, MAX_NOTE_HASHES_PER_TX));
|
|
413
|
-
await __classPrivateFieldGet(this, _MerkleTrees_instances, "m", _MerkleTrees_appendLeaves).call(this, MerkleTreeId.NOTE_HASH_TREE, noteHashesPadded);
|
|
414
|
-
const l1ToL2MessagesPadded = padArrayEnd(l1ToL2Messages, Fr.ZERO, NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP);
|
|
415
|
-
await __classPrivateFieldGet(this, _MerkleTrees_instances, "m", _MerkleTrees_appendLeaves).call(this, MerkleTreeId.L1_TO_L2_MESSAGE_TREE, l1ToL2MessagesPadded);
|
|
416
|
-
}
|
|
417
|
-
// Sync the indexed trees
|
|
418
|
-
{
|
|
419
|
-
const nullifiersPadded = l2Block.body.txEffects.flatMap(txEffect => padArrayEnd(txEffect.nullifiers, Fr.ZERO, MAX_NULLIFIERS_PER_TX));
|
|
420
|
-
await this.trees[MerkleTreeId.NULLIFIER_TREE].batchInsert(nullifiersPadded.map(nullifier => nullifier.toBuffer()), NULLIFIER_SUBTREE_HEIGHT);
|
|
421
|
-
const publicDataTree = this.trees[MerkleTreeId.PUBLIC_DATA_TREE];
|
|
422
|
-
// We insert the public data tree leaves with one batch per tx to avoid updating the same key twice
|
|
423
|
-
for (const txEffect of l2Block.body.txEffects) {
|
|
424
|
-
const publicDataWrites = padArrayEnd(txEffect.publicDataWrites, PublicDataWrite.empty(), MAX_TOTAL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX);
|
|
425
|
-
await publicDataTree.batchInsert(publicDataWrites.map(write => write.toBuffer()), PUBLIC_DATA_SUBTREE_HEIGHT);
|
|
426
|
-
}
|
|
427
|
-
}
|
|
428
|
-
// The last thing remaining is to update the archive
|
|
429
|
-
await __classPrivateFieldGet(this, _MerkleTrees_instances, "m", _MerkleTrees_updateArchive).call(this, l2Block.header);
|
|
430
|
-
await __classPrivateFieldGet(this, _MerkleTrees_instances, "m", _MerkleTrees_commit).call(this);
|
|
431
|
-
}
|
|
432
|
-
for (const [root, treeId] of treeRootWithIdPairs) {
|
|
433
|
-
const treeName = MerkleTreeId[treeId];
|
|
434
|
-
const info = await __classPrivateFieldGet(this, _MerkleTrees_instances, "m", _MerkleTrees_getTreeInfo).call(this, treeId, false);
|
|
435
|
-
const syncedStr = '0x' + info.root.toString('hex');
|
|
436
|
-
const rootStr = root.toString();
|
|
437
|
-
// Sanity check that the rebuilt trees match the roots published by the L2 block
|
|
438
|
-
if (!info.root.equals(root.toBuffer())) {
|
|
439
|
-
throw new Error(`Synced tree root ${treeName} does not match published L2 block root: ${syncedStr} != ${rootStr}`);
|
|
440
|
-
}
|
|
441
|
-
else {
|
|
442
|
-
this.log.debug(`Tree ${treeName} synched with size ${info.size} root ${rootStr}`);
|
|
443
|
-
this.metrics.recordTreeSize(treeName, info.size);
|
|
444
|
-
}
|
|
445
|
-
}
|
|
446
|
-
await __classPrivateFieldGet(this, _MerkleTrees_instances, "m", _MerkleTrees_snapshot).call(this, l2Block.number);
|
|
447
|
-
this.metrics.recordDbSize(this.store.estimateSize().actualSize);
|
|
448
|
-
this.metrics.recordSyncDuration('commit', timer);
|
|
449
|
-
return buildEmptyWorldStateStatusFull();
|
|
450
|
-
}, _MerkleTrees_isDbPopulated = function _MerkleTrees_isDbPopulated() {
|
|
451
|
-
try {
|
|
452
|
-
getTreeMeta(this.store, MerkleTreeId[MerkleTreeId.NULLIFIER_TREE]);
|
|
453
|
-
// Tree meta was found --> db is populated
|
|
454
|
-
return true;
|
|
455
|
-
}
|
|
456
|
-
catch (e) {
|
|
457
|
-
// Tree meta was not found --> db is not populated
|
|
458
|
-
return false;
|
|
459
|
-
}
|
|
460
|
-
};
|
|
461
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVya2xlX3RyZWVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3dvcmxkLXN0YXRlLWRiL21lcmtsZV90cmVlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLE9BQU8sRUFBZ0IsWUFBWSxFQUFvQixNQUFNLHNCQUFzQixDQUFDO0FBU3BGLE9BQU8sRUFDTCxjQUFjLEVBQ2Qsc0JBQXNCLEVBQ3RCLFdBQVcsRUFDWCxFQUFFLEVBQ0Ysd0JBQXdCLEVBQ3hCLHNCQUFzQixFQUN0QixxQkFBcUIsRUFDckIsNENBQTRDLEVBQzVDLHFCQUFxQixFQUNyQix3QkFBd0IsRUFDeEIscUJBQXFCLEVBQ3JCLG1DQUFtQyxFQUNuQyxhQUFhLEVBQ2IscUJBQXFCLEVBQ3JCLDBCQUEwQixFQUMxQix1QkFBdUIsRUFDdkIscUJBQXFCLEVBQ3JCLGtCQUFrQixFQUNsQiwwQkFBMEIsRUFDMUIsZUFBZSxFQUNmLGNBQWMsR0FDZixNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMzRCxPQUFPLEVBQWUsWUFBWSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDbEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3RELE9BQU8sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFHekQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3BELE9BQU8sRUFHTCxRQUFRLEVBQ1IsbUJBQW1CLEVBQ25CLFlBQVksRUFDWixXQUFXLEVBQ1gsUUFBUSxFQUNSLE9BQU8sR0FDUixNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFBd0Isa0JBQWtCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUduRixPQUFPLEVBR0wsOEJBQThCLEdBQy9CLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUNMLDJCQUEy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
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import { type Timer } from '@aztec/foundation/timer';
|
|
2
|
-
import { type TelemetryClient } from '@aztec/telemetry-client';
|
|
3
|
-
export declare class WorldStateMetrics {
|
|
4
|
-
private treeSize;
|
|
5
|
-
private dbSize;
|
|
6
|
-
private forkDuration;
|
|
7
|
-
private syncDuration;
|
|
8
|
-
constructor(client: TelemetryClient, name?: string);
|
|
9
|
-
recordTreeSize(treeName: string, treeSize: bigint): void;
|
|
10
|
-
recordDbSize(dbSizeInBytes: number): void;
|
|
11
|
-
recordForkDuration(timerOrMs: Timer | number): void;
|
|
12
|
-
recordSyncDuration(syncType: 'commit' | 'rollback_and_update', timerOrMs: Timer | number): void;
|
|
13
|
-
}
|
|
14
|
-
//# sourceMappingURL=metrics.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../src/world-state-db/metrics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAKL,KAAK,eAAe,EAErB,MAAM,yBAAyB,CAAC;AAEjC,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAQ;IACxB,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,YAAY,CAAY;IAChC,OAAO,CAAC,YAAY,CAAY;gBAEpB,MAAM,EAAE,eAAe,EAAE,IAAI,SAAkB;IA0B3D,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;IAMjD,YAAY,CAAC,aAAa,EAAE,MAAM;IAIlC,kBAAkB,CAAC,SAAS,EAAE,KAAK,GAAG,MAAM;IAK5C,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,GAAG,qBAAqB,EAAE,SAAS,EAAE,KAAK,GAAG,MAAM;CAMzF"}
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
import { Attributes, Metrics, ValueType, } from '@aztec/telemetry-client';
|
|
2
|
-
export class WorldStateMetrics {
|
|
3
|
-
constructor(client, name = 'MerkleTreesDb') {
|
|
4
|
-
const meter = client.getMeter(name);
|
|
5
|
-
this.treeSize = meter.createGauge(Metrics.WORLD_STATE_MERKLE_TREE_SIZE, {
|
|
6
|
-
description: 'The size of Merkle trees',
|
|
7
|
-
valueType: ValueType.INT,
|
|
8
|
-
});
|
|
9
|
-
this.dbSize = meter.createGauge(Metrics.WORLD_STATE_DB_SIZE, {
|
|
10
|
-
description: 'The size of the World State DB',
|
|
11
|
-
valueType: ValueType.INT,
|
|
12
|
-
unit: 'By',
|
|
13
|
-
});
|
|
14
|
-
this.forkDuration = meter.createHistogram(Metrics.WORLD_STATE_FORK_DURATION, {
|
|
15
|
-
description: 'The duration of a fork operation',
|
|
16
|
-
unit: 'ms',
|
|
17
|
-
valueType: ValueType.INT,
|
|
18
|
-
});
|
|
19
|
-
this.syncDuration = meter.createHistogram(Metrics.WORLD_STATE_SYNC_DURATION, {
|
|
20
|
-
description: 'The duration of a sync operation',
|
|
21
|
-
unit: 'ms',
|
|
22
|
-
valueType: ValueType.INT,
|
|
23
|
-
});
|
|
24
|
-
}
|
|
25
|
-
recordTreeSize(treeName, treeSize) {
|
|
26
|
-
this.treeSize.record(Number(treeSize), {
|
|
27
|
-
[Attributes.MERKLE_TREE_NAME]: treeName,
|
|
28
|
-
});
|
|
29
|
-
}
|
|
30
|
-
recordDbSize(dbSizeInBytes) {
|
|
31
|
-
this.dbSize.record(dbSizeInBytes);
|
|
32
|
-
}
|
|
33
|
-
recordForkDuration(timerOrMs) {
|
|
34
|
-
const ms = Math.ceil(typeof timerOrMs === 'number' ? timerOrMs : timerOrMs.ms());
|
|
35
|
-
this.forkDuration.record(ms);
|
|
36
|
-
}
|
|
37
|
-
recordSyncDuration(syncType, timerOrMs) {
|
|
38
|
-
const ms = Math.ceil(typeof timerOrMs === 'number' ? timerOrMs : timerOrMs.ms());
|
|
39
|
-
this.syncDuration.record(ms, {
|
|
40
|
-
[Attributes.STATUS]: syncType,
|
|
41
|
-
});
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0cmljcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy93b3JsZC1zdGF0ZS1kYi9tZXRyaWNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFDTCxVQUFVLEVBR1YsT0FBTyxFQUVQLFNBQVMsR0FDVixNQUFNLHlCQUF5QixDQUFDO0FBRWpDLE1BQU0sT0FBTyxpQkFBaUI7SUFNNUIsWUFBWSxNQUF1QixFQUFFLElBQUksR0FBRyxlQUFlO1FBQ3pELE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyw0QkFBNEIsRUFBRTtZQUN0RSxXQUFXLEVBQUUsMEJBQTBCO1lBQ3ZDLFNBQVMsRUFBRSxTQUFTLENBQUMsR0FBRztTQUN6QixDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLG1CQUFtQixFQUFFO1lBQzNELFdBQVcsRUFBRSxnQ0FBZ0M7WUFDN0MsU0FBUyxFQUFFLFNBQVMsQ0FBQyxHQUFHO1lBQ3hCLElBQUksRUFBRSxJQUFJO1NBQ1gsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyx5QkFBeUIsRUFBRTtZQUMzRSxXQUFXLEVBQUUsa0NBQWtDO1lBQy9DLElBQUksRUFBRSxJQUFJO1lBQ1YsU0FBUyxFQUFFLFNBQVMsQ0FBQyxHQUFHO1NBQ3pCLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMseUJBQXlCLEVBQUU7WUFDM0UsV0FBVyxFQUFFLGtDQUFrQztZQUMvQyxJQUFJLEVBQUUsSUFBSTtZQUNWLFNBQVMsRUFBRSxTQUFTLENBQUMsR0FBRztTQUN6QixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsY0FBYyxDQUFDLFFBQWdCLEVBQUUsUUFBZ0I7UUFDL0MsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQ3JDLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsUUFBUTtTQUN4QyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsWUFBWSxDQUFDLGFBQXFCO1FBQ2hDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxTQUF5QjtRQUMxQyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sU0FBUyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNqRixJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRUQsa0JBQWtCLENBQUMsUUFBMEMsRUFBRSxTQUF5QjtRQUN0RixNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sU0FBUyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNqRixJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUU7WUFDM0IsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEVBQUUsUUFBUTtTQUM5QixDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0YifQ==
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { type MerkleTreeId } from '@aztec/circuit-types';
|
|
2
|
-
import { type Fr } from '@aztec/circuits.js';
|
|
3
|
-
import { type AppendOnlyTree, type IndexedTree } from '@aztec/merkle-tree';
|
|
4
|
-
|
|
5
|
-
export type MerkleTreeMap = {
|
|
6
|
-
[MerkleTreeId.NULLIFIER_TREE]: IndexedTree;
|
|
7
|
-
[MerkleTreeId.NOTE_HASH_TREE]: AppendOnlyTree<Fr>;
|
|
8
|
-
[MerkleTreeId.PUBLIC_DATA_TREE]: IndexedTree;
|
|
9
|
-
[MerkleTreeId.L1_TO_L2_MESSAGE_TREE]: AppendOnlyTree<Fr>;
|
|
10
|
-
[MerkleTreeId.ARCHIVE]: AppendOnlyTree<Fr>;
|
|
11
|
-
};
|