@aztec/world-state 0.30.0 → 0.31.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 +8 -4
- package/dest/synchronizer/server_world_state_synchronizer.d.ts.map +1 -1
- package/dest/synchronizer/server_world_state_synchronizer.js +39 -8
- package/dest/world-state-db/merkle_tree_db.d.ts +1 -1
- package/dest/world-state-db/merkle_tree_db.d.ts.map +1 -1
- package/dest/world-state-db/merkle_tree_operations.d.ts +12 -4
- package/dest/world-state-db/merkle_tree_operations.d.ts.map +1 -1
- package/dest/world-state-db/merkle_tree_operations.js +1 -1
- package/dest/world-state-db/merkle_tree_operations_facade.d.ts +11 -3
- package/dest/world-state-db/merkle_tree_operations_facade.d.ts.map +1 -1
- package/dest/world-state-db/merkle_tree_operations_facade.js +13 -3
- package/dest/world-state-db/merkle_tree_snapshot_operations_facade.d.ts +3 -2
- 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 +6 -2
- package/dest/world-state-db/merkle_trees.d.ts +12 -3
- package/dest/world-state-db/merkle_trees.d.ts.map +1 -1
- package/dest/world-state-db/merkle_trees.js +27 -8
- package/package.json +7 -7
- package/src/synchronizer/server_world_state_synchronizer.ts +50 -10
- package/src/world-state-db/merkle_tree_db.ts +7 -1
- package/src/world-state-db/merkle_tree_operations.ts +13 -4
- package/src/world-state-db/merkle_tree_operations_facade.ts +15 -4
- package/src/world-state-db/merkle_tree_snapshot_operations_facade.ts +7 -2
- package/src/world-state-db/merkle_trees.ts +37 -5
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { L2BlockSource } from '@aztec/circuit-types';
|
|
1
|
+
import { L1ToL2MessageSource, L2BlockSource } from '@aztec/circuit-types';
|
|
2
2
|
import { AztecKVStore } from '@aztec/kv-store';
|
|
3
3
|
import { MerkleTreeOperations, MerkleTrees } from '../world-state-db/index.js';
|
|
4
4
|
import { WorldStateConfig } from './config.js';
|
|
@@ -9,6 +9,7 @@ import { WorldStateStatus, WorldStateSynchronizer } from './world_state_synchron
|
|
|
9
9
|
* tree.
|
|
10
10
|
*/
|
|
11
11
|
export declare class ServerWorldStateSynchronizer implements WorldStateSynchronizer {
|
|
12
|
+
#private;
|
|
12
13
|
private merkleTreeDb;
|
|
13
14
|
private l2BlockSource;
|
|
14
15
|
private log;
|
|
@@ -21,7 +22,7 @@ export declare class ServerWorldStateSynchronizer implements WorldStateSynchroni
|
|
|
21
22
|
private runningPromise;
|
|
22
23
|
private currentState;
|
|
23
24
|
private blockNumber;
|
|
24
|
-
constructor(store: AztecKVStore, merkleTreeDb: MerkleTrees, l2BlockSource: L2BlockSource, config: WorldStateConfig, log?: import("@aztec/foundation/log").DebugLogger);
|
|
25
|
+
constructor(store: AztecKVStore, merkleTreeDb: MerkleTrees, l2BlockSource: L2BlockSource & L1ToL2MessageSource, config: WorldStateConfig, log?: import("@aztec/foundation/log").DebugLogger);
|
|
25
26
|
getLatest(): MerkleTreeOperations;
|
|
26
27
|
getCommitted(): MerkleTreeOperations;
|
|
27
28
|
getSnapshot(blockNumber: number): MerkleTreeOperations;
|
|
@@ -42,14 +43,17 @@ export declare class ServerWorldStateSynchronizer implements WorldStateSynchroni
|
|
|
42
43
|
/**
|
|
43
44
|
* Handles a list of L2 blocks (i.e. Inserts the new note hashes into the merkle tree).
|
|
44
45
|
* @param l2Blocks - The L2 blocks to handle.
|
|
46
|
+
* @param l1ToL2Messages - The L1 to L2 messages for each block.
|
|
45
47
|
* @returns Whether the block handled was produced by this same node.
|
|
46
48
|
*/
|
|
47
|
-
private
|
|
49
|
+
private handleL2BlocksAndMessages;
|
|
48
50
|
/**
|
|
49
51
|
* Handles a single L2 block (i.e. Inserts the new note hashes into the merkle tree).
|
|
50
52
|
* @param l2Block - The L2 block to handle.
|
|
53
|
+
* @param l1ToL2Messages - The L1 to L2 messages for the block.
|
|
54
|
+
* @returns Whether the block handled was produced by this same node.
|
|
51
55
|
*/
|
|
52
|
-
private
|
|
56
|
+
private handleL2BlockAndMessages;
|
|
53
57
|
/**
|
|
54
58
|
* Method to set the value of the current state.
|
|
55
59
|
* @param newState - New state value.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server_world_state_synchronizer.d.ts","sourceRoot":"","sources":["../../src/synchronizer/server_world_state_synchronizer.ts"],"names":[],"mappings":"AAAA,OAAO,EAA8B,aAAa,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"server_world_state_synchronizer.d.ts","sourceRoot":"","sources":["../../src/synchronizer/server_world_state_synchronizer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAA8B,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAOtG,OAAO,EAAE,YAAY,EAAkB,MAAM,iBAAiB,CAAC;AAI/D,OAAO,EAAkC,oBAAoB,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAG/G,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAA0B,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAEjH;;;;GAIG;AACH,qBAAa,4BAA6B,YAAW,sBAAsB;;IAcvE,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,aAAa;IAErB,OAAO,CAAC,GAAG;IAhBb,OAAO,CAAC,wBAAwB,CAAK;IAErC,OAAO,CAAC,iBAAiB,CAAoB;IAC7C,OAAO,CAAC,WAAW,CAAoC;IACvD,OAAO,CAAC,WAAW,CAAC,CAAyB;IAC7C,OAAO,CAAC,QAAQ,CAAqB;IACrC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,cAAc,CAAoC;IAC1D,OAAO,CAAC,YAAY,CAAuD;IAC3E,OAAO,CAAC,WAAW,CAAyB;gBAG1C,KAAK,EAAE,YAAY,EACX,YAAY,EAAE,WAAW,EACzB,aAAa,EAAE,aAAa,GAAG,mBAAmB,EAC1D,MAAM,EAAE,gBAAgB,EAChB,GAAG,8CAAyC;IAU/C,SAAS,IAAI,oBAAoB;IAIjC,YAAY,IAAI,oBAAoB;IAIpC,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,oBAAoB;IAIhD,KAAK;IAwCL,IAAI;IAajB,OAAO,KAAK,iBAAiB,GAE5B;IAEM,MAAM,IAAI,OAAO,CAAC,gBAAgB,CAAC;IAQ1C;;;;OAIG;IACU,aAAa,CAAC,cAAc,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAoCpE;;OAEG;YACW,uBAAuB;IASrC;;;;;OAKG;YACW,yBAAyB;IAYvC;;;;;OAKG;YACW,wBAAwB;IAuBtC;;;OAGG;IACH,OAAO,CAAC,eAAe;CAwBxB"}
|
|
@@ -1,7 +1,12 @@
|
|
|
1
|
+
var _ServerWorldStateSynchronizer_instances, _ServerWorldStateSynchronizer_verifyMessagesHashToInHash;
|
|
2
|
+
import { __classPrivateFieldGet } from "tslib";
|
|
1
3
|
import { L2BlockDownloader } from '@aztec/circuit-types';
|
|
4
|
+
import { L1_TO_L2_MSG_SUBTREE_HEIGHT } from '@aztec/circuits.js/constants';
|
|
2
5
|
import { SerialQueue } from '@aztec/foundation/fifo';
|
|
3
6
|
import { createDebugLogger } from '@aztec/foundation/log';
|
|
4
7
|
import { elapsed } from '@aztec/foundation/timer';
|
|
8
|
+
import { openTmpStore } from '@aztec/kv-store/utils';
|
|
9
|
+
import { SHA256Trunc, StandardTree } from '@aztec/merkle-tree';
|
|
5
10
|
import { MerkleTreeOperationsFacade } from '../world-state-db/merkle_tree_operations_facade.js';
|
|
6
11
|
import { MerkleTreeSnapshotOperationsFacade } from '../world-state-db/merkle_tree_snapshot_operations_facade.js';
|
|
7
12
|
import { WorldStateRunningState } from './world_state_synchronizer.js';
|
|
@@ -12,6 +17,7 @@ import { WorldStateRunningState } from './world_state_synchronizer.js';
|
|
|
12
17
|
*/
|
|
13
18
|
export class ServerWorldStateSynchronizer {
|
|
14
19
|
constructor(store, merkleTreeDb, l2BlockSource, config, log = createDebugLogger('aztec:world_state')) {
|
|
20
|
+
_ServerWorldStateSynchronizer_instances.add(this);
|
|
15
21
|
this.merkleTreeDb = merkleTreeDb;
|
|
16
22
|
this.l2BlockSource = l2BlockSource;
|
|
17
23
|
this.log = log;
|
|
@@ -136,30 +142,41 @@ export class ServerWorldStateSynchronizer {
|
|
|
136
142
|
async collectAndProcessBlocks() {
|
|
137
143
|
// This request for blocks will timeout after 1 second if no blocks are received
|
|
138
144
|
const blocks = await this.l2BlockDownloader.getBlocks(1);
|
|
139
|
-
|
|
145
|
+
const messagePromises = blocks.map(block => this.l2BlockSource.getL1ToL2Messages(BigInt(block.number)));
|
|
146
|
+
const l1ToL2Messages = await Promise.all(messagePromises);
|
|
147
|
+
await this.handleL2BlocksAndMessages(blocks, l1ToL2Messages);
|
|
140
148
|
}
|
|
141
149
|
/**
|
|
142
150
|
* Handles a list of L2 blocks (i.e. Inserts the new note hashes into the merkle tree).
|
|
143
151
|
* @param l2Blocks - The L2 blocks to handle.
|
|
152
|
+
* @param l1ToL2Messages - The L1 to L2 messages for each block.
|
|
144
153
|
* @returns Whether the block handled was produced by this same node.
|
|
145
154
|
*/
|
|
146
|
-
async
|
|
147
|
-
for (
|
|
148
|
-
const [duration, result] = await elapsed(() => this.
|
|
155
|
+
async handleL2BlocksAndMessages(l2Blocks, l1ToL2Messages) {
|
|
156
|
+
for (let i = 0; i < l2Blocks.length; i++) {
|
|
157
|
+
const [duration, result] = await elapsed(() => this.handleL2BlockAndMessages(l2Blocks[i], l1ToL2Messages[i]));
|
|
149
158
|
this.log(`Handled new L2 block`, {
|
|
150
159
|
eventName: 'l2-block-handled',
|
|
151
160
|
duration,
|
|
152
161
|
isBlockOurs: result.isBlockOurs,
|
|
153
|
-
...
|
|
162
|
+
...l2Blocks[i].getStats(),
|
|
154
163
|
});
|
|
155
164
|
}
|
|
156
165
|
}
|
|
157
166
|
/**
|
|
158
167
|
* Handles a single L2 block (i.e. Inserts the new note hashes into the merkle tree).
|
|
159
168
|
* @param l2Block - The L2 block to handle.
|
|
169
|
+
* @param l1ToL2Messages - The L1 to L2 messages for the block.
|
|
170
|
+
* @returns Whether the block handled was produced by this same node.
|
|
160
171
|
*/
|
|
161
|
-
async
|
|
162
|
-
|
|
172
|
+
async handleL2BlockAndMessages(l2Block, l1ToL2Messages) {
|
|
173
|
+
// First we check that the L1 to L2 messages hash to the block inHash.
|
|
174
|
+
// Note that we cannot optimize this check by checking the root of the subtree after inserting the messages
|
|
175
|
+
// to the real L1_TO_L2_MESSAGE_TREE (like we do in merkleTreeDb.handleL2BlockAndMessages(...)) because that
|
|
176
|
+
// tree uses pedersen and we don't have access to the converted root.
|
|
177
|
+
await __classPrivateFieldGet(this, _ServerWorldStateSynchronizer_instances, "m", _ServerWorldStateSynchronizer_verifyMessagesHashToInHash).call(this, l1ToL2Messages, l2Block.header.contentCommitment.inHash);
|
|
178
|
+
// If the above check succeeds, we can proceed to handle the block.
|
|
179
|
+
const result = await this.merkleTreeDb.handleL2BlockAndMessages(l2Block, l1ToL2Messages);
|
|
163
180
|
await this.blockNumber.set(l2Block.number);
|
|
164
181
|
if (this.currentState === WorldStateRunningState.SYNCHING && l2Block.number >= this.latestBlockNumberAtStart) {
|
|
165
182
|
this.setCurrentState(WorldStateRunningState.RUNNING);
|
|
@@ -178,4 +195,18 @@ export class ServerWorldStateSynchronizer {
|
|
|
178
195
|
this.log(`Moved to state ${WorldStateRunningState[this.currentState]}`);
|
|
179
196
|
}
|
|
180
197
|
}
|
|
181
|
-
|
|
198
|
+
_ServerWorldStateSynchronizer_instances = new WeakSet(), _ServerWorldStateSynchronizer_verifyMessagesHashToInHash =
|
|
199
|
+
/**
|
|
200
|
+
* Verifies that the L1 to L2 messages hash to the block inHash.
|
|
201
|
+
* @param l1ToL2Messages - The L1 to L2 messages for the block.
|
|
202
|
+
* @param inHash - The inHash of the block.
|
|
203
|
+
* @throws If the L1 to L2 messages do not hash to the block inHash.
|
|
204
|
+
*/
|
|
205
|
+
async function _ServerWorldStateSynchronizer_verifyMessagesHashToInHash(l1ToL2Messages, inHash) {
|
|
206
|
+
const tree = new StandardTree(openTmpStore(true), new SHA256Trunc(), 'temp_in_hash_check', L1_TO_L2_MSG_SUBTREE_HEIGHT);
|
|
207
|
+
await tree.appendLeaves(l1ToL2Messages.map(msg => msg.toBuffer()));
|
|
208
|
+
if (!tree.getRoot(true).equals(inHash)) {
|
|
209
|
+
throw new Error('Obtained L1 to L2 messages failed to be hashed to the block inHash');
|
|
210
|
+
}
|
|
211
|
+
};
|
|
212
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyX3dvcmxkX3N0YXRlX3N5bmNocm9uaXplci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zeW5jaHJvbml6ZXIvc2VydmVyX3dvcmxkX3N0YXRlX3N5bmNocm9uaXplci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLE9BQU8sRUFBZ0MsaUJBQWlCLEVBQWlCLE1BQU0sc0JBQXNCLENBQUM7QUFFdEcsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFFM0UsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzFELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUVsRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDckQsT0FBTyxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUcvRCxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxvREFBb0QsQ0FBQztBQUNoRyxPQUFPLEVBQUUsa0NBQWtDLEVBQUUsTUFBTSw2REFBNkQsQ0FBQztBQUVqSCxPQUFPLEVBQUUsc0JBQXNCLEVBQTRDLE1BQU0sK0JBQStCLENBQUM7QUFFakg7Ozs7R0FJRztBQUNILE1BQU0sT0FBTyw0QkFBNEI7SUFZdkMsWUFDRSxLQUFtQixFQUNYLFlBQXlCLEVBQ3pCLGFBQWtELEVBQzFELE1BQXdCLEVBQ2hCLE1BQU0saUJBQWlCLENBQUMsbUJBQW1CLENBQUM7O1FBSDVDLGlCQUFZLEdBQVosWUFBWSxDQUFhO1FBQ3pCLGtCQUFhLEdBQWIsYUFBYSxDQUFxQztRQUVsRCxRQUFHLEdBQUgsR0FBRyxDQUF5QztRQWhCOUMsNkJBQXdCLEdBQUcsQ0FBQyxDQUFDO1FBRzdCLGdCQUFXLEdBQWtCLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FB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
|
|
@@ -24,7 +24,7 @@ type WithIncludeUncommitted<F> = F extends (...args: [...infer Rest]) => infer R
|
|
|
24
24
|
/**
|
|
25
25
|
* Defines the names of the setters on Merkle Trees.
|
|
26
26
|
*/
|
|
27
|
-
type MerkleTreeSetters = 'appendLeaves' | 'updateLeaf' | 'commit' | 'rollback' | '
|
|
27
|
+
type MerkleTreeSetters = 'appendLeaves' | 'updateLeaf' | 'commit' | 'rollback' | 'handleL2BlockAndMessages' | 'batchInsert';
|
|
28
28
|
/**
|
|
29
29
|
* Defines the interface for operations on a set of Merkle Trees configuring whether to return committed or uncommitted data.
|
|
30
30
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"merkle_tree_db.d.ts","sourceRoot":"","sources":["../../src/world-state-db/merkle_tree_db.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvE,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAEnE;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,2BAA2B,QAAgC,CAAC;AAEzE,eAAO,MAAM,6BAA6B,QAA6C,CAAC;AAExF;;GAEG;AACH,KAAK,sBAAsB,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,MAAM,IAAI,CAAC,KAAK,MAAM,MAAM,GACjF,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,KAAK,MAAM,GACvC,CAAC,CAAC;AAEN;;GAEG;AACH,KAAK,iBAAiB,
|
|
1
|
+
{"version":3,"file":"merkle_tree_db.d.ts","sourceRoot":"","sources":["../../src/world-state-db/merkle_tree_db.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvE,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAEnE;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,2BAA2B,QAAgC,CAAC;AAEzE,eAAO,MAAM,6BAA6B,QAA6C,CAAC;AAExF;;GAEG;AACH,KAAK,sBAAsB,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,MAAM,IAAI,CAAC,KAAK,MAAM,MAAM,GACjF,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,KAAK,MAAM,GACvC,CAAC,CAAC;AAEN;;GAEG;AACH,KAAK,iBAAiB,GAClB,cAAc,GACd,YAAY,GACZ,QAAQ,GACR,UAAU,GACV,0BAA0B,GAC1B,aAAa,CAAC;AAElB;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG;KACxB,QAAQ,IAAI,MAAM,oBAAoB,IAAI,OAAO,CAAC,QAAQ,EAAE,iBAAiB,CAAC,GAAG,sBAAsB,CACtG,oBAAoB,CAAC,QAAQ,CAAC,CAC/B;CACF,GAAG,IAAI,CAAC,oBAAoB,EAAE,iBAAiB,CAAC,GAAG;IAChD;;;OAGG;IACH,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,YAAY,GAAG,mBAAmB,CAAC,CAAC,CAAC;CACxF,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/// <reference types="node" resolution-mode="require"/>
|
|
2
2
|
import { L2Block, MerkleTreeId, SiblingPath } from '@aztec/circuit-types';
|
|
3
|
-
import { Header, NullifierLeafPreimage, StateReference } from '@aztec/circuits.js';
|
|
3
|
+
import { Fr, Header, NullifierLeafPreimage, StateReference } from '@aztec/circuits.js';
|
|
4
4
|
import { IndexedTreeLeafPreimage } from '@aztec/foundation/trees';
|
|
5
5
|
import { BatchInsertionResult } from '@aztec/merkle-tree';
|
|
6
6
|
/**
|
|
@@ -91,6 +91,13 @@ export interface MerkleTreeOperations {
|
|
|
91
91
|
* @param value - The value to search for in the tree.
|
|
92
92
|
*/
|
|
93
93
|
findLeafIndex(treeId: MerkleTreeId, value: Buffer): Promise<bigint | undefined>;
|
|
94
|
+
/**
|
|
95
|
+
* Returns the first index containing a leaf value after `startIndex`.
|
|
96
|
+
* @param treeId - The tree for which the index should be returned.
|
|
97
|
+
* @param value - The value to search for in the tree.
|
|
98
|
+
* @param startIndex - The index to start searching from (used when skipping nullified messages)
|
|
99
|
+
*/
|
|
100
|
+
findLeafIndexAfter(treeId: MerkleTreeId, value: Buffer, startIndex: bigint): Promise<bigint | undefined>;
|
|
94
101
|
/**
|
|
95
102
|
* Gets the value for a leaf in the tree.
|
|
96
103
|
* @param treeId - The tree for which the index should be returned.
|
|
@@ -114,8 +121,9 @@ export interface MerkleTreeOperations {
|
|
|
114
121
|
/**
|
|
115
122
|
* Handles a single L2 block (i.e. Inserts the new note hashes into the merkle tree).
|
|
116
123
|
* @param block - The L2 block to handle.
|
|
124
|
+
* @param l1ToL2Messages - The L1 to L2 messages for the block.
|
|
117
125
|
*/
|
|
118
|
-
|
|
126
|
+
handleL2BlockAndMessages(block: L2Block, l1ToL2Messages: Fr[]): Promise<HandleL2BlockAndMessagesResult>;
|
|
119
127
|
/**
|
|
120
128
|
* Commits pending changes to the underlying store.
|
|
121
129
|
*/
|
|
@@ -125,8 +133,8 @@ export interface MerkleTreeOperations {
|
|
|
125
133
|
*/
|
|
126
134
|
rollback(): Promise<void>;
|
|
127
135
|
}
|
|
128
|
-
/** Return type for
|
|
129
|
-
export type
|
|
136
|
+
/** Return type for handleL2BlockAndMessages */
|
|
137
|
+
export type HandleL2BlockAndMessagesResult = {
|
|
130
138
|
/** Whether the block processed was emitted by our sequencer */ isBlockOurs: boolean;
|
|
131
139
|
};
|
|
132
140
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"merkle_tree_operations.d.ts","sourceRoot":"","sources":["../../src/world-state-db/merkle_tree_operations.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAC1E,OAAO,EAAE,MAAM,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"merkle_tree_operations.d.ts","sourceRoot":"","sources":["../../src/world-state-db/merkle_tree_operations.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,4 +10,4 @@ export async function inspectTree(db, treeId, log = createDebugLogger('aztec:ins
|
|
|
10
10
|
}
|
|
11
11
|
log(output.join('\n'));
|
|
12
12
|
}
|
|
13
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
13
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVya2xlX3RyZWVfb3BlcmF0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy93b3JsZC1zdGF0ZS1kYi9tZXJrbGVfdHJlZV9vcGVyYXRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBd0sxRDs7R0FFRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsV0FBVyxDQUMvQixFQUF3QixFQUN4QixNQUFvQixFQUNwQixHQUFHLEdBQUcsaUJBQWlCLENBQUMsb0JBQW9CLENBQUM7SUFFN0MsTUFBTSxJQUFJLEdBQUcsTUFBTSxFQUFFLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzFDLE1BQU0sTUFBTSxHQUFHLENBQUMsV0FBVyxNQUFNLFNBQVMsSUFBSSxDQUFDLElBQUksV0FBVyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDM0YsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNuQyxNQUFNLENBQUMsSUFBSSxDQUNULFNBQVMsQ0FBQyxLQUFLLE1BQU0sRUFBRSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxhQUFhLENBQUMsRUFBRSxDQUN6RyxDQUFDO0lBQ0osQ0FBQztJQUNELEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDekIsQ0FBQyJ9
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
/// <reference types="node" resolution-mode="require"/>
|
|
2
2
|
import { L2Block, MerkleTreeId, SiblingPath } from '@aztec/circuit-types';
|
|
3
|
-
import { Header, NullifierLeafPreimage, StateReference } from '@aztec/circuits.js';
|
|
3
|
+
import { Fr, Header, NullifierLeafPreimage, StateReference } from '@aztec/circuits.js';
|
|
4
4
|
import { IndexedTreeLeafPreimage } from '@aztec/foundation/trees';
|
|
5
5
|
import { BatchInsertionResult } from '@aztec/merkle-tree';
|
|
6
6
|
import { MerkleTreeDb } from './merkle_tree_db.js';
|
|
7
|
-
import {
|
|
7
|
+
import { HandleL2BlockAndMessagesResult, MerkleTreeOperations, TreeInfo } from './merkle_tree_operations.js';
|
|
8
8
|
/**
|
|
9
9
|
* Wraps a MerkleTreeDbOperations to call all functions with a preset includeUncommitted flag.
|
|
10
10
|
*/
|
|
@@ -82,6 +82,13 @@ export declare class MerkleTreeOperationsFacade implements MerkleTreeOperations
|
|
|
82
82
|
* @returns The index of the first leaf found with a given value (undefined if not found).
|
|
83
83
|
*/
|
|
84
84
|
findLeafIndex(treeId: MerkleTreeId, value: Buffer): Promise<bigint | undefined>;
|
|
85
|
+
/**
|
|
86
|
+
* Returns the first index containing a leaf value after `startIndex`.
|
|
87
|
+
* @param treeId - The tree for which the index should be returned.
|
|
88
|
+
* @param value - The value to search for in the tree.
|
|
89
|
+
* @param startIndex - The index to start searching from (used when skipping nullified messages)
|
|
90
|
+
*/
|
|
91
|
+
findLeafIndexAfter(treeId: MerkleTreeId, value: Buffer, startIndex: bigint): Promise<bigint | undefined>;
|
|
85
92
|
/**
|
|
86
93
|
* Gets the value at the given index.
|
|
87
94
|
* @param treeId - The ID of the tree to get the leaf value from.
|
|
@@ -99,9 +106,10 @@ export declare class MerkleTreeOperationsFacade implements MerkleTreeOperations
|
|
|
99
106
|
/**
|
|
100
107
|
* Handles a single L2 block (i.e. Inserts the new note hashes into the merkle tree).
|
|
101
108
|
* @param block - The L2 block to handle.
|
|
109
|
+
* @param l1ToL2Messages - The L1 to L2 messages for the block.
|
|
102
110
|
* @returns Whether the block handled was produced by this same node.
|
|
103
111
|
*/
|
|
104
|
-
|
|
112
|
+
handleL2BlockAndMessages(block: L2Block, l1ToL2Messages: Fr[]): Promise<HandleL2BlockAndMessagesResult>;
|
|
105
113
|
/**
|
|
106
114
|
* Commits all pending updates.
|
|
107
115
|
* @returns Empty promise.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"merkle_tree_operations_facade.d.ts","sourceRoot":"","sources":["../../src/world-state-db/merkle_tree_operations_facade.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAC1E,OAAO,EAAE,MAAM,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"merkle_tree_operations_facade.d.ts","sourceRoot":"","sources":["../../src/world-state-db/merkle_tree_operations_facade.ts"],"names":[],"mappings":"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"}
|
|
@@ -87,6 +87,15 @@ export class MerkleTreeOperationsFacade {
|
|
|
87
87
|
findLeafIndex(treeId, value) {
|
|
88
88
|
return this.trees.findLeafIndex(treeId, value, this.includeUncommitted);
|
|
89
89
|
}
|
|
90
|
+
/**
|
|
91
|
+
* Returns the first index containing a leaf value after `startIndex`.
|
|
92
|
+
* @param treeId - The tree for which the index should be returned.
|
|
93
|
+
* @param value - The value to search for in the tree.
|
|
94
|
+
* @param startIndex - The index to start searching from (used when skipping nullified messages)
|
|
95
|
+
*/
|
|
96
|
+
findLeafIndexAfter(treeId, value, startIndex) {
|
|
97
|
+
return this.trees.findLeafIndexAfter(treeId, value, startIndex, this.includeUncommitted);
|
|
98
|
+
}
|
|
90
99
|
/**
|
|
91
100
|
* Gets the value at the given index.
|
|
92
101
|
* @param treeId - The ID of the tree to get the leaf value from.
|
|
@@ -108,10 +117,11 @@ export class MerkleTreeOperationsFacade {
|
|
|
108
117
|
/**
|
|
109
118
|
* Handles a single L2 block (i.e. Inserts the new note hashes into the merkle tree).
|
|
110
119
|
* @param block - The L2 block to handle.
|
|
120
|
+
* @param l1ToL2Messages - The L1 to L2 messages for the block.
|
|
111
121
|
* @returns Whether the block handled was produced by this same node.
|
|
112
122
|
*/
|
|
113
|
-
|
|
114
|
-
return this.trees.
|
|
123
|
+
handleL2BlockAndMessages(block, l1ToL2Messages) {
|
|
124
|
+
return this.trees.handleL2BlockAndMessages(block, l1ToL2Messages);
|
|
115
125
|
}
|
|
116
126
|
/**
|
|
117
127
|
* Commits all pending updates.
|
|
@@ -138,4 +148,4 @@ export class MerkleTreeOperationsFacade {
|
|
|
138
148
|
return this.trees.batchInsert(treeId, leaves, subtreeHeight);
|
|
139
149
|
}
|
|
140
150
|
}
|
|
141
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
151
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVya2xlX3RyZWVfb3BlcmF0aW9uc19mYWNhZGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvd29ybGQtc3RhdGUtZGIvbWVya2xlX3RyZWVfb3BlcmF0aW9uc19mYWNhZGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBUUE7O0dBRUc7QUFDSCxNQUFNLE9BQU8sMEJBQTBCO0lBQ3JDLFlBQW9CLEtBQW1CLEVBQVUsa0JBQTJCO1FBQXhELFVBQUssR0FBTCxLQUFLLENBQWM7UUFBVSx1QkFBa0IsR0FBbEIsa0JBQWtCLENBQVM7SUFBRyxDQUFDO0lBRWhGOzs7OztPQUtHO0lBQ0gsV0FBVyxDQUFDLE1BQW9CO1FBQzlCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0lBQ2pFLENBQUM7SUFFRDs7O09BR0c7SUFDSCxpQkFBaUI7UUFDZixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7SUFDL0QsQ0FBQztJQUVEOzs7T0FHRztJQUNILGtCQUFrQjtRQUNoQixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7SUFDaEUsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsWUFBWSxDQUFDLE1BQW9CLEVBQUUsTUFBZ0I7UUFDakQsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsS0FBSyxDQUFDLGNBQWMsQ0FBbUIsTUFBb0IsRUFBRSxLQUFhO1FBQ3hFLE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsa0JBQWtC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
|
|
@@ -4,7 +4,7 @@ import { Header, StateReference } from '@aztec/circuits.js';
|
|
|
4
4
|
import { IndexedTreeLeafPreimage } from '@aztec/foundation/trees';
|
|
5
5
|
import { BatchInsertionResult } from '@aztec/merkle-tree';
|
|
6
6
|
import { MerkleTreeDb } from './merkle_tree_db.js';
|
|
7
|
-
import {
|
|
7
|
+
import { HandleL2BlockAndMessagesResult, MerkleTreeOperations, TreeInfo } from './merkle_tree_operations.js';
|
|
8
8
|
/**
|
|
9
9
|
* Merkle tree operations on readonly tree snapshots.
|
|
10
10
|
*/
|
|
@@ -12,6 +12,7 @@ export declare class MerkleTreeSnapshotOperationsFacade implements MerkleTreeOpe
|
|
|
12
12
|
#private;
|
|
13
13
|
constructor(trees: MerkleTreeDb, blockNumber: number);
|
|
14
14
|
findLeafIndex(treeId: MerkleTreeId, value: Buffer): Promise<bigint | undefined>;
|
|
15
|
+
findLeafIndexAfter(treeId: MerkleTreeId, value: Buffer, startIndex: bigint): Promise<bigint | undefined>;
|
|
15
16
|
getLeafPreimage(treeId: MerkleTreeId.NULLIFIER_TREE, index: bigint): Promise<IndexedTreeLeafPreimage | undefined>;
|
|
16
17
|
getLeafValue(treeId: MerkleTreeId, index: bigint): Promise<Buffer | undefined>;
|
|
17
18
|
getPreviousValueIndex(treeId: MerkleTreeId.NULLIFIER_TREE, value: bigint): Promise<{
|
|
@@ -31,7 +32,7 @@ export declare class MerkleTreeSnapshotOperationsFacade implements MerkleTreeOpe
|
|
|
31
32
|
batchInsert<TreeHeight extends number, SubtreeSiblingPathHeight extends number>(): Promise<BatchInsertionResult<TreeHeight, SubtreeSiblingPathHeight>>;
|
|
32
33
|
updateArchive(): Promise<void>;
|
|
33
34
|
commit(): Promise<void>;
|
|
34
|
-
|
|
35
|
+
handleL2BlockAndMessages(): Promise<HandleL2BlockAndMessagesResult>;
|
|
35
36
|
rollback(): Promise<void>;
|
|
36
37
|
updateHistoricArchive(): Promise<void>;
|
|
37
38
|
updateLeaf(): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"merkle_tree_snapshot_operations_facade.d.ts","sourceRoot":"","sources":["../../src/world-state-db/merkle_tree_snapshot_operations_facade.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,EAA8B,MAAM,EAAyB,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAC/G,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,oBAAoB,EAAqC,MAAM,oBAAoB,CAAC;AAE7F,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"merkle_tree_snapshot_operations_facade.d.ts","sourceRoot":"","sources":["../../src/world-state-db/merkle_tree_snapshot_operations_facade.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,EAA8B,MAAM,EAAyB,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAC/G,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,oBAAoB,EAAqC,MAAM,oBAAoB,CAAC;AAE7F,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,8BAA8B,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAE7G;;GAEG;AACH,qBAAa,kCAAmC,YAAW,oBAAoB;;gBAKjE,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM;IAc9C,aAAa,CAAC,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAK/E,kBAAkB,CAAC,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAKxG,eAAe,CACnB,MAAM,EAAE,YAAY,CAAC,cAAc,EACnC,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,uBAAuB,GAAG,SAAS,CAAC;IAKzC,YAAY,CAAC,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAK9E,qBAAqB,CACzB,MAAM,EAAE,YAAY,CAAC,cAAc,EACnC,KAAK,EAAE,MAAM,GACZ,OAAO,CACN;QACE;;WAEG;QACH,KAAK,EAAE,MAAM,CAAC;QACd;;WAEG;QACH,cAAc,EAAE,OAAO,CAAC;KACzB,GACD,SAAS,CACZ;IAKK,cAAc,CAAC,CAAC,SAAS,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAK9F,WAAW,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,QAAQ,CAAC;IAUpD,iBAAiB,IAAI,OAAO,CAAC,cAAc,CAAC;IA+BlD,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAI7B,WAAW,CAAC,UAAU,SAAS,MAAM,EAAE,wBAAwB,SAAS,MAAM,KAAK,OAAO,CACxF,oBAAoB,CAAC,UAAU,EAAE,wBAAwB,CAAC,CAC3D;IAID,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAI9B,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAIvB,wBAAwB,IAAI,OAAO,CAAC,8BAA8B,CAAC;IAInE,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAIzB,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC;IAItC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAI3B,kBAAkB,IAAI,OAAO,CAAC,MAAM,CAAC;CAGtC"}
|
|
@@ -18,6 +18,10 @@ export class MerkleTreeSnapshotOperationsFacade {
|
|
|
18
18
|
const tree = await __classPrivateFieldGet(this, _MerkleTreeSnapshotOperationsFacade_instances, "m", _MerkleTreeSnapshotOperationsFacade_getTreeSnapshot).call(this, treeId);
|
|
19
19
|
return tree.findLeafIndex(value);
|
|
20
20
|
}
|
|
21
|
+
async findLeafIndexAfter(treeId, value, startIndex) {
|
|
22
|
+
const tree = await __classPrivateFieldGet(this, _MerkleTreeSnapshotOperationsFacade_instances, "m", _MerkleTreeSnapshotOperationsFacade_getTreeSnapshot).call(this, treeId);
|
|
23
|
+
return tree.findLeafIndexAfter(value, startIndex);
|
|
24
|
+
}
|
|
21
25
|
async getLeafPreimage(treeId, index) {
|
|
22
26
|
const snapshot = (await __classPrivateFieldGet(this, _MerkleTreeSnapshotOperationsFacade_instances, "m", _MerkleTreeSnapshotOperationsFacade_getTreeSnapshot).call(this, treeId));
|
|
23
27
|
return snapshot.getLatestLeafPreimageCopy(BigInt(index));
|
|
@@ -65,7 +69,7 @@ export class MerkleTreeSnapshotOperationsFacade {
|
|
|
65
69
|
commit() {
|
|
66
70
|
return Promise.reject(new Error('Tree snapshot operations are read-only'));
|
|
67
71
|
}
|
|
68
|
-
|
|
72
|
+
handleL2BlockAndMessages() {
|
|
69
73
|
return Promise.reject(new Error('Tree snapshot operations are read-only'));
|
|
70
74
|
}
|
|
71
75
|
rollback() {
|
|
@@ -88,4 +92,4 @@ _MerkleTreeSnapshotOperationsFacade_treesDb = new WeakMap(), _MerkleTreeSnapshot
|
|
|
88
92
|
__classPrivateFieldSet(this, _MerkleTreeSnapshotOperationsFacade_treeSnapshots, await __classPrivateFieldGet(this, _MerkleTreeSnapshotOperationsFacade_treesDb, "f").getSnapshot(__classPrivateFieldGet(this, _MerkleTreeSnapshotOperationsFacade_blockNumber, "f")), "f");
|
|
89
93
|
return __classPrivateFieldGet(this, _MerkleTreeSnapshotOperationsFacade_treeSnapshots, "f")[merkleTreeId];
|
|
90
94
|
};
|
|
91
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
95
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVya2xlX3RyZWVfc25hcHNob3Rfb3BlcmF0aW9uc19mYWNhZGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvd29ybGQtc3RhdGUtZGIvbWVya2xlX3RyZWVfc25hcHNob3Rfb3BlcmF0aW9uc19mYWNhZGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFlLE1BQU0sc0JBQXNCLENBQUM7QUFDakUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLEVBQUUsRUFBVSxxQkFBcUIsRUFBRSxjQUFjLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQU8vRzs7R0FFRztBQUNILE1BQU0sT0FBTyxrQ0FBa0M7SUFLN0MsWUFBWSxLQUFtQixFQUFFLFdBQW1COztRQUpwRCw4REFBdUI7UUFDdkIsa0VBQXFCO1FBQ3JCLDREQUFvRSxFQUFFLEVBQUM7UUFHckUsdUJBQUEsSUFBSSwrQ0FBWSxLQUFLLE1BQUEsQ0FBQztRQUN0Qix1QkFBQSxJQUFJLG1EQUFnQixXQUFXLE1BQUEsQ0FBQztJQUNsQyxDQUFDO0lBV0QsS0FBSyxDQUFDLGFBQWEsQ0FBQyxNQUFvQixFQUFFLEtBQWE7UUFDckQsTUFBTSxJQUFJLEdBQUcsTUFBTSx1QkFBQSxJQUFJLDBHQUFpQixNQUFyQixJQUFJLEVBQWtCLE1BQU0sQ0FBQyxDQUFDO1FBQ2pELE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQsS0FBSyxDQUFDLGtCQUFrQixDQUFDLE1BQW9CLEVBQUUsS0FBYSxFQUFFLFVBQWtCO1FBQzlFLE1BQU0sSUFBSSxHQUFHLE1BQU0sdUJBQUEsSUFBSSwwR0FBaUIsTUFBckIsSUFBSSxFQUFrQixNQUFNLENBQUMsQ0FBQztRQUNqRCxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVELEtBQUssQ0FBQyxlQUFlLENBQ25CLE1BQW1DLEVBQ25DLEtBQWE7UUFFYixNQUFNLFFBQVEsR0FBRyxDQUFDLE1BQU0sdUJBQUEsSUFBSSwwR0FBaUIsTUFBckIsSUFBSSxFQUFrQixNQUFNLENBQUMsQ0FBd0IsQ0FBQztRQUM5RSxPQUFPLFFBQVEsQ0FBQyx5QkFBeUIsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRUQsS0FBSyxDQUFDLFlBQVksQ0FBQyxNQUFvQixFQUFFLEtBQWE7UUFDcEQsTUFBTSxRQUFRLEdBQUcsTUFBTSx1QkFBQSxJQUFJLDBHQUFpQixNQUFyQixJQUFJLEVBQWtCLE1BQU0sQ0FBQyxDQUFDO1FBQ3JELE9BQU8sUUFBUSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRUQsS0FBSyxDQUFDLHFCQUFxQixDQUN6QixNQUFtQyxFQUNuQyxLQUFhO1FBY2IsTUFBTSxRQUFRLEdBQUcsQ0FBQyxNQUFNLHVCQUFBLElBQUksMEdBQWlCLE1BQXJCLElBQUksRUFBa0IsTUFBTSxDQUFDLENBQXdCLENBQUM7UUFDOUUsT0FBTyxRQUFRLENBQUMsc0JBQXNCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVELEtBQUssQ0FBQyxjQUFjLENBQW1CLE1BQW9CLEVBQUUsS0FBYTtRQUN4RSxNQUFNLFFBQVEsR0FBRyxNQUFNLHVCQUFBLElBQUksMEdBQWlCLE1BQXJCLElBQUksRUFBa0IsTUFBTSxDQUFDLENBQUM7UUFDckQsT0FBTyxRQUFRLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFRCxLQUFLLENBQUMsV0FBVyxDQUFDLE1BQW9CO1FBQ3BDLE1BQU0sUUFBUSxHQUFHLE1BQU0sdUJBQUEsSUFBSSwwR0FBaUIsTUFBckIsSUFBSSxFQUFrQixNQUFNLENBQUMsQ0FBQztRQUNyRCxPQUFPO1lBQ0wsS0FBSyxFQUFFLFFBQVEsQ0FBQyxRQUFRLEVBQUU7WUFDMUIsSUFBSSxFQUFFLFFBQVEsQ0FBQyxPQUFPLEVBQUU7WUFDeEIsSUFBSSxFQUFFLFFBQVEsQ0FBQyxZQUFZLEVBQUU7WUFDN0IsTUFBTTtTQUNQLENBQUM7SUFDSixDQUFDO0lBRUQsS0FBSyxDQUFDLGlCQUFpQjtRQUNyQixNQUFNLFNBQVMsR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUM7WUFDbEMsdUJBQUEsSUFBSSwwR0FBaUIsTUFBckIsSUFBSSxFQUFrQixZQUFZLENBQUMsY0FBYyxDQUFDO1lBQ2xELHVCQUFBLElBQUksMEdBQWlCLE1BQXJCLElBQUksRUFBa0IsWUFBWSxDQUFDLGNBQWMsQ0FBQztZQUNsRCx1QkFBQSxJQUFJLDBHQUFpQixNQUFyQixJQUFJLEVBQWtCLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQztZQUNwRCx1QkFBQSxJQUFJLDBHQUFpQixNQUFyQixJQUFJLEVBQWtCLFlBQVksQ0FBQyxxQkFBcUIsQ0FBQztZQUN6RCx1QkFBQSxJQUFJLDBHQUFpQixNQUFyQixJQUFJLEVBQWtCLFlBQVksQ0FBQyxPQUFPLENBQUM7U0FDNUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxJQUFJLGNBQWMsQ0FDdkIsSUFBSSxzQkFBc0IsQ0FDeEIsRUFBRSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLHFCQUFxQixDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsRUFDdEUsTUFBTSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMscUJBQXFCLENBQUMsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUNyRSxFQUNELElBQUkscUJBQXFCLENBQ3ZCLElBQUksc0JBQXNCLENBQ3hCLEVBQUUsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUMvRCxNQUFNLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUMsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUM5RCxFQUNELElBQUksc0JBQXNCLENBQ3hCLEVBQUUsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUMvRCxNQUFNLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUMsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUM5RCxFQUNELElBQUksc0JBQXNCLENBQ3hCLEVBQUUsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQ2pFLE1BQU0sQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLGdCQUFnQixDQUFDLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FDaEUsQ0FDRixDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsWUFBWTtRQUNWLE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDLENBQUM7SUFDN0UsQ0FBQztJQUVELFdBQVc7UUFHVCxPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsd0NBQXdDLENBQUMsQ0FBQyxDQUFDO0lBQzdFLENBQUM7SUFFRCxhQUFhO1FBQ1gsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLHdDQUF3QyxDQUFDLENBQUMsQ0FBQztJQUM3RSxDQUFDO0lBRUQsTUFBTTtRQUNKLE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDLENBQUM7SUFDN0UsQ0FBQztJQUVELHdCQUF3QjtRQUN0QixPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsd0NBQXdDLENBQUMsQ0FBQyxDQUFDO0lBQzdFLENBQUM7SUFFRCxRQUFRO1FBQ04sT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLHdDQUF3QyxDQUFDLENBQUMsQ0FBQztJQUM3RSxDQUFDO0lBRUQscUJBQXFCO1FBQ25CLE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDLENBQUM7SUFDN0UsQ0FBQztJQUVELFVBQVU7UUFDUixPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsd0NBQXdDLENBQUMsQ0FBQyxDQUFDO0lBQzdFLENBQUM7SUFFRCxrQkFBa0I7UUFDaEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxvREFBb0QsQ0FBQyxDQUFDO0lBQ3hFLENBQUM7Q0FDRjtzVEF2SUMsS0FBSyw4REFBa0IsWUFBb0I7SUFDekMsSUFBSSx1QkFBQSxJQUFJLHlEQUFlLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztRQUN0QyxPQUFPLHVCQUFBLElBQUkseURBQWUsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRUQsdUJBQUEsSUFBSSxxREFBa0IsTUFBTSx1QkFBQSxJQUFJLG1EQUFTLENBQUMsV0FBVyxDQUFDLHVCQUFBLElBQUksdURBQWEsQ0FBQyxNQUFBLENBQUM7SUFDekUsT0FBTyx1QkFBQSxJQUFJLHlEQUFlLENBQUMsWUFBWSxDQUFFLENBQUM7QUFDNUMsQ0FBQyJ9
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
/// <reference types="node" resolution-mode="require"/>
|
|
2
2
|
import { L2Block, MerkleTreeId, SiblingPath } from '@aztec/circuit-types';
|
|
3
|
-
import { Header, StateReference } from '@aztec/circuits.js';
|
|
3
|
+
import { Fr, Header, StateReference } from '@aztec/circuits.js';
|
|
4
4
|
import { DebugLogger } from '@aztec/foundation/log';
|
|
5
5
|
import { IndexedTreeLeafPreimage } from '@aztec/foundation/trees';
|
|
6
6
|
import { AztecKVStore } from '@aztec/kv-store';
|
|
7
7
|
import { BatchInsertionResult } from '@aztec/merkle-tree';
|
|
8
8
|
import { MerkleTreeDb } from './merkle_tree_db.js';
|
|
9
|
-
import {
|
|
9
|
+
import { HandleL2BlockAndMessagesResult, IndexedTreeId, MerkleTreeOperations, TreeInfo } from './merkle_tree_operations.js';
|
|
10
10
|
/**
|
|
11
11
|
* A convenience class for managing multiple merkle trees.
|
|
12
12
|
*/
|
|
@@ -123,6 +123,14 @@ export declare class MerkleTrees implements MerkleTreeDb {
|
|
|
123
123
|
* @returns The index of the first leaf found with a given value (undefined if not found).
|
|
124
124
|
*/
|
|
125
125
|
findLeafIndex(treeId: MerkleTreeId, value: Buffer, includeUncommitted: boolean): Promise<bigint | undefined>;
|
|
126
|
+
/**
|
|
127
|
+
* Returns the first index containing a leaf value after `startIndex`.
|
|
128
|
+
* @param treeId - The tree for which the index should be returned.
|
|
129
|
+
* @param value - The value to search for in the tree.
|
|
130
|
+
* @param startIndex - The index to start searching from (used when skipping nullified messages)
|
|
131
|
+
* @param includeUncommitted - Indicates whether to include uncommitted data.
|
|
132
|
+
*/
|
|
133
|
+
findLeafIndexAfter(treeId: MerkleTreeId, value: Buffer, startIndex: bigint, includeUncommitted: boolean): Promise<bigint | undefined>;
|
|
126
134
|
/**
|
|
127
135
|
* Updates a leaf in a tree at a given index.
|
|
128
136
|
* @param treeId - The ID of the tree.
|
|
@@ -134,9 +142,10 @@ export declare class MerkleTrees implements MerkleTreeDb {
|
|
|
134
142
|
/**
|
|
135
143
|
* Handles a single L2 block (i.e. Inserts the new note hashes into the merkle tree).
|
|
136
144
|
* @param block - The L2 block to handle.
|
|
145
|
+
* @param l1ToL2Messages - The L1 to L2 messages for the block.
|
|
137
146
|
* @returns Whether the block handled was produced by this same node.
|
|
138
147
|
*/
|
|
139
|
-
|
|
148
|
+
handleL2BlockAndMessages(block: L2Block, l1ToL2Messages: Fr[]): Promise<HandleL2BlockAndMessagesResult>;
|
|
140
149
|
/**
|
|
141
150
|
* Batch insert multiple leaves into the tree.
|
|
142
151
|
* @param treeId - The ID of the tree.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"merkle_trees.d.ts","sourceRoot":"","sources":["../../src/world-state-db/merkle_trees.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAC1E,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,7 +1,8 @@
|
|
|
1
|
-
var _MerkleTrees_instances, _MerkleTrees_init, _MerkleTrees_updateArchive, _MerkleTrees_getTreeInfo, _MerkleTrees_getIndexedTree, _MerkleTrees_appendLeaves, _MerkleTrees_updateLeaf, _MerkleTrees_commit, _MerkleTrees_rollback, _MerkleTrees_snapshot,
|
|
1
|
+
var _MerkleTrees_instances, _MerkleTrees_init, _MerkleTrees_updateArchive, _MerkleTrees_getTreeInfo, _MerkleTrees_getIndexedTree, _MerkleTrees_appendLeaves, _MerkleTrees_updateLeaf, _MerkleTrees_commit, _MerkleTrees_rollback, _MerkleTrees_snapshot, _MerkleTrees_handleL2BlockAndMessages, _MerkleTrees_isDbPopulated;
|
|
2
2
|
import { __classPrivateFieldGet } from "tslib";
|
|
3
3
|
import { MerkleTreeId } from '@aztec/circuit-types';
|
|
4
|
-
import { ARCHIVE_HEIGHT, AppendOnlyTreeSnapshot, ContentCommitment, Fr, GlobalVariables, Header, L1_TO_L2_MSG_TREE_HEIGHT, MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX, NOTE_HASH_TREE_HEIGHT, NULLIFIER_SUBTREE_HEIGHT, NULLIFIER_TREE_HEIGHT, NullifierLeaf, NullifierLeafPreimage, PUBLIC_DATA_SUBTREE_HEIGHT, PUBLIC_DATA_TREE_HEIGHT, PartialStateReference, PublicDataTreeLeaf, PublicDataTreeLeafPreimage, StateReference, } from '@aztec/circuits.js';
|
|
4
|
+
import { ARCHIVE_HEIGHT, AppendOnlyTreeSnapshot, ContentCommitment, Fr, GlobalVariables, Header, L1_TO_L2_MSG_TREE_HEIGHT, MAX_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, StateReference, } from '@aztec/circuits.js';
|
|
5
|
+
import { padArrayEnd } from '@aztec/foundation/collection';
|
|
5
6
|
import { SerialQueue } from '@aztec/foundation/fifo';
|
|
6
7
|
import { createDebugLogger } from '@aztec/foundation/log';
|
|
7
8
|
import { Pedersen, StandardIndexedTree, StandardTree, getTreeMeta, loadTree, newTree, } from '@aztec/merkle-tree';
|
|
@@ -174,6 +175,19 @@ export class MerkleTrees {
|
|
|
174
175
|
return Promise.resolve(tree.findLeafIndex(value, includeUncommitted));
|
|
175
176
|
});
|
|
176
177
|
}
|
|
178
|
+
/**
|
|
179
|
+
* Returns the first index containing a leaf value after `startIndex`.
|
|
180
|
+
* @param treeId - The tree for which the index should be returned.
|
|
181
|
+
* @param value - The value to search for in the tree.
|
|
182
|
+
* @param startIndex - The index to start searching from (used when skipping nullified messages)
|
|
183
|
+
* @param includeUncommitted - Indicates whether to include uncommitted data.
|
|
184
|
+
*/
|
|
185
|
+
async findLeafIndexAfter(treeId, value, startIndex, includeUncommitted) {
|
|
186
|
+
return await this.synchronize(() => {
|
|
187
|
+
const tree = this.trees[treeId];
|
|
188
|
+
return Promise.resolve(tree.findLeafIndexAfter(value, startIndex, includeUncommitted));
|
|
189
|
+
});
|
|
190
|
+
}
|
|
177
191
|
/**
|
|
178
192
|
* Updates a leaf in a tree at a given index.
|
|
179
193
|
* @param treeId - The ID of the tree.
|
|
@@ -187,10 +201,11 @@ export class MerkleTrees {
|
|
|
187
201
|
/**
|
|
188
202
|
* Handles a single L2 block (i.e. Inserts the new note hashes into the merkle tree).
|
|
189
203
|
* @param block - The L2 block to handle.
|
|
204
|
+
* @param l1ToL2Messages - The L1 to L2 messages for the block.
|
|
190
205
|
* @returns Whether the block handled was produced by this same node.
|
|
191
206
|
*/
|
|
192
|
-
async
|
|
193
|
-
return await this.synchronize(() => __classPrivateFieldGet(this, _MerkleTrees_instances, "m",
|
|
207
|
+
async handleL2BlockAndMessages(block, l1ToL2Messages) {
|
|
208
|
+
return await this.synchronize(() => __classPrivateFieldGet(this, _MerkleTrees_instances, "m", _MerkleTrees_handleL2BlockAndMessages).call(this, block, l1ToL2Messages));
|
|
194
209
|
}
|
|
195
210
|
/**
|
|
196
211
|
* Batch insert multiple leaves into the tree.
|
|
@@ -300,12 +315,13 @@ async function _MerkleTrees_rollback() {
|
|
|
300
315
|
for (const tree of this.trees) {
|
|
301
316
|
await tree.snapshot(blockNumber);
|
|
302
317
|
}
|
|
303
|
-
},
|
|
318
|
+
}, _MerkleTrees_handleL2BlockAndMessages =
|
|
304
319
|
/**
|
|
305
320
|
* Handles a single L2 block (i.e. Inserts the new note hashes into the merkle tree).
|
|
306
321
|
* @param l2Block - The L2 block to handle.
|
|
322
|
+
* @param l1ToL2Messages - The L1 to L2 messages for the block.
|
|
307
323
|
*/
|
|
308
|
-
async function
|
|
324
|
+
async function _MerkleTrees_handleL2BlockAndMessages(l2Block, l1ToL2Messages) {
|
|
309
325
|
const treeRootWithIdPairs = [
|
|
310
326
|
[l2Block.header.state.partial.nullifierTree.root, MerkleTreeId.NULLIFIER_TREE],
|
|
311
327
|
[l2Block.header.state.partial.noteHashTree.root, MerkleTreeId.NOTE_HASH_TREE],
|
|
@@ -325,10 +341,13 @@ async function _MerkleTrees_handleL2Block(l2Block) {
|
|
|
325
341
|
else {
|
|
326
342
|
this.log(`Block ${l2Block.number} is not ours, rolling back world state and committing state from chain`);
|
|
327
343
|
await __classPrivateFieldGet(this, _MerkleTrees_instances, "m", _MerkleTrees_rollback).call(this);
|
|
344
|
+
// We pad the messages because always a fixed number of messages is inserted and we need
|
|
345
|
+
// the `nextAvailableLeafIndex` to correctly progress.
|
|
346
|
+
const l1ToL2MessagesPadded = padArrayEnd(l1ToL2Messages, Fr.ZERO, NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP);
|
|
328
347
|
// Sync the append only trees
|
|
329
348
|
for (const [tree, leaves] of [
|
|
330
349
|
[MerkleTreeId.NOTE_HASH_TREE, l2Block.body.txEffects.flatMap(txEffect => txEffect.noteHashes)],
|
|
331
|
-
[MerkleTreeId.L1_TO_L2_MESSAGE_TREE,
|
|
350
|
+
[MerkleTreeId.L1_TO_L2_MESSAGE_TREE, l1ToL2MessagesPadded],
|
|
332
351
|
]) {
|
|
333
352
|
await __classPrivateFieldGet(this, _MerkleTrees_instances, "m", _MerkleTrees_appendLeaves).call(this, tree, leaves.map(fr => fr.toBuffer()));
|
|
334
353
|
}
|
|
@@ -372,4 +391,4 @@ async function _MerkleTrees_handleL2Block(l2Block) {
|
|
|
372
391
|
return false;
|
|
373
392
|
}
|
|
374
393
|
};
|
|
375
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVya2xlX3RyZWVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3dvcmxkLXN0YXRlLWRiL21lcmtsZV90cmVlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLE9BQU8sRUFBVyxZQUFZLEVBQWUsTUFBTSxzQkFBc0IsQ0FBQztBQUMxRSxPQUFPLEVBQ0wsY0FBYyxFQUNkLHNCQUFzQixFQUN0QixpQkFBaUIsRUFDakIsRUFBRSxFQUNGLGVBQWUsRUFDZixNQUFNLEVBQ04sd0JBQXdCLEVBQ3hCLHNDQUFzQyxFQUN0QyxxQkFBcUIsRUFDckIsd0JBQXdCLEVBQ3hCLHFCQUFxQixFQUNyQixhQUFhLEVBQ2IscUJBQXFCLEVBQ3JCLDBCQUEwQixFQUMxQix1QkFBdUIsRUFDdkIscUJBQXFCLEVBQ3JCLGtCQUFrQixFQUNsQiwwQkFBMEIsRUFDMUIsY0FBYyxHQUNmLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3JELE9BQU8sRUFBZSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBR3ZFLE9BQU8sRUFJTCxRQUFRLEVBQ1IsbUJBQW1CLEVBQ25CLFlBQVksRUFFWixXQUFXLEVBQ1gsUUFBUSxFQUNSLE9BQU8sR0FDUixNQUFNLG9CQUFvQixDQUFDO0FBRzVCLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSw2QkFBNkIsRUFBZ0IsTUFBTSxxQkFBcUIsQ0FBQztBQUUvRyxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUVoRjs7R0FFRztBQUNILE1BQU0sYUFBYyxTQUFRLG1CQUFtQjtJQUM3QyxZQUFZLEtBQW1CLEVBQUUsTUFBYyxFQUFFLElBQVksRUFBRSxLQUFhLEVBQUUsT0FBZSxFQUFFLEVBQUUsSUFBYTtRQUM1RyxLQUFLLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFB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
|
|
394
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVya2xlX3RyZWVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3dvcmxkLXN0YXRlLWRiL21lcmtsZV90cmVlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLE9BQU8sRUFBVyxZQUFZLEVBQWUsTUFBTSxzQkFBc0IsQ0FBQztBQUMxRSxPQUFPLEVBQ0wsY0FBYyxFQUNkLHNCQUFzQixFQUN0QixpQkFBaUIsRUFDakIsRUFBRSxFQUNGLGVBQWUsRUFDZixNQUFNLEVBQ04sd0JBQXdCLEVBQ3hCLHNDQUFzQyxFQUN0QyxxQkFBcUIsRUFDckIsd0JBQXdCLEVBQ3hCLHFCQUFxQixFQUNyQixtQ0FBbUMsRUFDbkMsYUFBYSxFQUNiLHFCQUFxQixFQUNyQiwwQkFBMEIsRUFDMUIsdUJBQXVCLEVBQ3ZCLHFCQUFxQixFQUNyQixrQkFBa0IsRUFDbEIsMEJBQTBCLEVBQzFCLGNBQWMsR0FDZixNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDckQsT0FBTyxFQUFlLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFHdkUsT0FBTyxFQUlMLFFBQVEsRUFDUixtQkFBbUIsRUFDbkIsWUFBWSxFQUVaLFdBQVcsRUFDWCxRQUFRLEVBQ1IsT0FBTyxHQUNSLE1BQU0sb0JBQW9CLENBQUM7QUFHNUIsT0FBTyxFQUFFLDJCQUEyQixFQUFFLDZCQUE2QixFQUFnQixNQUFNLHFCQUFxQixDQUFDO0FBTy9HLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBRWhGOztHQUVHO0FBQ0gsTUFBTSxhQUFjLFNBQVEsbUJBQW1CO0lBQzdDLFlBQVksS0FBbUIsRUFBRSxNQUFjLEVBQUUsSUFBWSxFQUFFLEtBQWEsRUFBRSxPQUFlLEVBQUUsRUFBRSxJQUFhO1FBQzVHLEtB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
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/world-state",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.31.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": "./dest/index.js",
|
|
6
6
|
"typedocOptions": {
|
|
@@ -30,12 +30,12 @@
|
|
|
30
30
|
"rootDir": "./src"
|
|
31
31
|
},
|
|
32
32
|
"dependencies": {
|
|
33
|
-
"@aztec/circuit-types": "0.
|
|
34
|
-
"@aztec/circuits.js": "0.
|
|
35
|
-
"@aztec/foundation": "0.
|
|
36
|
-
"@aztec/kv-store": "0.
|
|
37
|
-
"@aztec/merkle-tree": "0.
|
|
38
|
-
"@aztec/types": "0.
|
|
33
|
+
"@aztec/circuit-types": "0.31.0",
|
|
34
|
+
"@aztec/circuits.js": "0.31.0",
|
|
35
|
+
"@aztec/foundation": "0.31.0",
|
|
36
|
+
"@aztec/kv-store": "0.31.0",
|
|
37
|
+
"@aztec/merkle-tree": "0.31.0",
|
|
38
|
+
"@aztec/types": "0.31.0",
|
|
39
39
|
"tslib": "^2.4.0"
|
|
40
40
|
},
|
|
41
41
|
"devDependencies": {
|
|
@@ -1,11 +1,15 @@
|
|
|
1
|
-
import { L2Block, L2BlockDownloader, L2BlockSource } from '@aztec/circuit-types';
|
|
1
|
+
import { L1ToL2MessageSource, L2Block, L2BlockDownloader, L2BlockSource } from '@aztec/circuit-types';
|
|
2
2
|
import { L2BlockHandledStats } from '@aztec/circuit-types/stats';
|
|
3
|
+
import { L1_TO_L2_MSG_SUBTREE_HEIGHT } from '@aztec/circuits.js/constants';
|
|
4
|
+
import { Fr } from '@aztec/foundation/fields';
|
|
3
5
|
import { SerialQueue } from '@aztec/foundation/fifo';
|
|
4
6
|
import { createDebugLogger } from '@aztec/foundation/log';
|
|
5
7
|
import { elapsed } from '@aztec/foundation/timer';
|
|
6
8
|
import { AztecKVStore, AztecSingleton } from '@aztec/kv-store';
|
|
9
|
+
import { openTmpStore } from '@aztec/kv-store/utils';
|
|
10
|
+
import { SHA256Trunc, StandardTree } from '@aztec/merkle-tree';
|
|
7
11
|
|
|
8
|
-
import {
|
|
12
|
+
import { HandleL2BlockAndMessagesResult, MerkleTreeOperations, MerkleTrees } from '../world-state-db/index.js';
|
|
9
13
|
import { MerkleTreeOperationsFacade } from '../world-state-db/merkle_tree_operations_facade.js';
|
|
10
14
|
import { MerkleTreeSnapshotOperationsFacade } from '../world-state-db/merkle_tree_snapshot_operations_facade.js';
|
|
11
15
|
import { WorldStateConfig } from './config.js';
|
|
@@ -31,7 +35,7 @@ export class ServerWorldStateSynchronizer implements WorldStateSynchronizer {
|
|
|
31
35
|
constructor(
|
|
32
36
|
store: AztecKVStore,
|
|
33
37
|
private merkleTreeDb: MerkleTrees,
|
|
34
|
-
private l2BlockSource: L2BlockSource,
|
|
38
|
+
private l2BlockSource: L2BlockSource & L1ToL2MessageSource,
|
|
35
39
|
config: WorldStateConfig,
|
|
36
40
|
private log = createDebugLogger('aztec:world_state'),
|
|
37
41
|
) {
|
|
@@ -167,22 +171,26 @@ export class ServerWorldStateSynchronizer implements WorldStateSynchronizer {
|
|
|
167
171
|
private async collectAndProcessBlocks() {
|
|
168
172
|
// This request for blocks will timeout after 1 second if no blocks are received
|
|
169
173
|
const blocks = await this.l2BlockDownloader.getBlocks(1);
|
|
170
|
-
|
|
174
|
+
const messagePromises = blocks.map(block => this.l2BlockSource.getL1ToL2Messages(BigInt(block.number)));
|
|
175
|
+
const l1ToL2Messages: Fr[][] = await Promise.all(messagePromises);
|
|
176
|
+
|
|
177
|
+
await this.handleL2BlocksAndMessages(blocks, l1ToL2Messages);
|
|
171
178
|
}
|
|
172
179
|
|
|
173
180
|
/**
|
|
174
181
|
* Handles a list of L2 blocks (i.e. Inserts the new note hashes into the merkle tree).
|
|
175
182
|
* @param l2Blocks - The L2 blocks to handle.
|
|
183
|
+
* @param l1ToL2Messages - The L1 to L2 messages for each block.
|
|
176
184
|
* @returns Whether the block handled was produced by this same node.
|
|
177
185
|
*/
|
|
178
|
-
private async
|
|
179
|
-
for (
|
|
180
|
-
const [duration, result] = await elapsed(() => this.
|
|
186
|
+
private async handleL2BlocksAndMessages(l2Blocks: L2Block[], l1ToL2Messages: Fr[][]) {
|
|
187
|
+
for (let i = 0; i < l2Blocks.length; i++) {
|
|
188
|
+
const [duration, result] = await elapsed(() => this.handleL2BlockAndMessages(l2Blocks[i], l1ToL2Messages[i]));
|
|
181
189
|
this.log(`Handled new L2 block`, {
|
|
182
190
|
eventName: 'l2-block-handled',
|
|
183
191
|
duration,
|
|
184
192
|
isBlockOurs: result.isBlockOurs,
|
|
185
|
-
...
|
|
193
|
+
...l2Blocks[i].getStats(),
|
|
186
194
|
} satisfies L2BlockHandledStats);
|
|
187
195
|
}
|
|
188
196
|
}
|
|
@@ -190,9 +198,21 @@ export class ServerWorldStateSynchronizer implements WorldStateSynchronizer {
|
|
|
190
198
|
/**
|
|
191
199
|
* Handles a single L2 block (i.e. Inserts the new note hashes into the merkle tree).
|
|
192
200
|
* @param l2Block - The L2 block to handle.
|
|
201
|
+
* @param l1ToL2Messages - The L1 to L2 messages for the block.
|
|
202
|
+
* @returns Whether the block handled was produced by this same node.
|
|
193
203
|
*/
|
|
194
|
-
private async
|
|
195
|
-
|
|
204
|
+
private async handleL2BlockAndMessages(
|
|
205
|
+
l2Block: L2Block,
|
|
206
|
+
l1ToL2Messages: Fr[],
|
|
207
|
+
): Promise<HandleL2BlockAndMessagesResult> {
|
|
208
|
+
// First we check that the L1 to L2 messages hash to the block inHash.
|
|
209
|
+
// Note that we cannot optimize this check by checking the root of the subtree after inserting the messages
|
|
210
|
+
// to the real L1_TO_L2_MESSAGE_TREE (like we do in merkleTreeDb.handleL2BlockAndMessages(...)) because that
|
|
211
|
+
// tree uses pedersen and we don't have access to the converted root.
|
|
212
|
+
await this.#verifyMessagesHashToInHash(l1ToL2Messages, l2Block.header.contentCommitment.inHash);
|
|
213
|
+
|
|
214
|
+
// If the above check succeeds, we can proceed to handle the block.
|
|
215
|
+
const result = await this.merkleTreeDb.handleL2BlockAndMessages(l2Block, l1ToL2Messages);
|
|
196
216
|
await this.blockNumber.set(l2Block.number);
|
|
197
217
|
|
|
198
218
|
if (this.currentState === WorldStateRunningState.SYNCHING && l2Block.number >= this.latestBlockNumberAtStart) {
|
|
@@ -212,4 +232,24 @@ export class ServerWorldStateSynchronizer implements WorldStateSynchronizer {
|
|
|
212
232
|
this.currentState = newState;
|
|
213
233
|
this.log(`Moved to state ${WorldStateRunningState[this.currentState]}`);
|
|
214
234
|
}
|
|
235
|
+
|
|
236
|
+
/**
|
|
237
|
+
* Verifies that the L1 to L2 messages hash to the block inHash.
|
|
238
|
+
* @param l1ToL2Messages - The L1 to L2 messages for the block.
|
|
239
|
+
* @param inHash - The inHash of the block.
|
|
240
|
+
* @throws If the L1 to L2 messages do not hash to the block inHash.
|
|
241
|
+
*/
|
|
242
|
+
async #verifyMessagesHashToInHash(l1ToL2Messages: Fr[], inHash: Buffer) {
|
|
243
|
+
const tree = new StandardTree(
|
|
244
|
+
openTmpStore(true),
|
|
245
|
+
new SHA256Trunc(),
|
|
246
|
+
'temp_in_hash_check',
|
|
247
|
+
L1_TO_L2_MSG_SUBTREE_HEIGHT,
|
|
248
|
+
);
|
|
249
|
+
await tree.appendLeaves(l1ToL2Messages.map(msg => msg.toBuffer()));
|
|
250
|
+
|
|
251
|
+
if (!tree.getRoot(true).equals(inHash)) {
|
|
252
|
+
throw new Error('Obtained L1 to L2 messages failed to be hashed to the block inHash');
|
|
253
|
+
}
|
|
254
|
+
}
|
|
215
255
|
}
|
|
@@ -32,7 +32,13 @@ type WithIncludeUncommitted<F> = F extends (...args: [...infer Rest]) => infer R
|
|
|
32
32
|
/**
|
|
33
33
|
* Defines the names of the setters on Merkle Trees.
|
|
34
34
|
*/
|
|
35
|
-
type MerkleTreeSetters =
|
|
35
|
+
type MerkleTreeSetters =
|
|
36
|
+
| 'appendLeaves'
|
|
37
|
+
| 'updateLeaf'
|
|
38
|
+
| 'commit'
|
|
39
|
+
| 'rollback'
|
|
40
|
+
| 'handleL2BlockAndMessages'
|
|
41
|
+
| 'batchInsert';
|
|
36
42
|
|
|
37
43
|
/**
|
|
38
44
|
* Defines the interface for operations on a set of Merkle Trees configuring whether to return committed or uncommitted data.
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { L2Block, MerkleTreeId, SiblingPath } from '@aztec/circuit-types';
|
|
2
|
-
import { Header, NullifierLeafPreimage, StateReference } from '@aztec/circuits.js';
|
|
2
|
+
import { Fr, Header, NullifierLeafPreimage, StateReference } from '@aztec/circuits.js';
|
|
3
3
|
import { createDebugLogger } from '@aztec/foundation/log';
|
|
4
4
|
import { IndexedTreeLeafPreimage } from '@aztec/foundation/trees';
|
|
5
5
|
import { BatchInsertionResult } from '@aztec/merkle-tree';
|
|
@@ -110,6 +110,14 @@ export interface MerkleTreeOperations {
|
|
|
110
110
|
*/
|
|
111
111
|
findLeafIndex(treeId: MerkleTreeId, value: Buffer): Promise<bigint | undefined>;
|
|
112
112
|
|
|
113
|
+
/**
|
|
114
|
+
* Returns the first index containing a leaf value after `startIndex`.
|
|
115
|
+
* @param treeId - The tree for which the index should be returned.
|
|
116
|
+
* @param value - The value to search for in the tree.
|
|
117
|
+
* @param startIndex - The index to start searching from (used when skipping nullified messages)
|
|
118
|
+
*/
|
|
119
|
+
findLeafIndexAfter(treeId: MerkleTreeId, value: Buffer, startIndex: bigint): Promise<bigint | undefined>;
|
|
120
|
+
|
|
113
121
|
/**
|
|
114
122
|
* Gets the value for a leaf in the tree.
|
|
115
123
|
* @param treeId - The tree for which the index should be returned.
|
|
@@ -140,8 +148,9 @@ export interface MerkleTreeOperations {
|
|
|
140
148
|
/**
|
|
141
149
|
* Handles a single L2 block (i.e. Inserts the new note hashes into the merkle tree).
|
|
142
150
|
* @param block - The L2 block to handle.
|
|
151
|
+
* @param l1ToL2Messages - The L1 to L2 messages for the block.
|
|
143
152
|
*/
|
|
144
|
-
|
|
153
|
+
handleL2BlockAndMessages(block: L2Block, l1ToL2Messages: Fr[]): Promise<HandleL2BlockAndMessagesResult>;
|
|
145
154
|
|
|
146
155
|
/**
|
|
147
156
|
* Commits pending changes to the underlying store.
|
|
@@ -154,8 +163,8 @@ export interface MerkleTreeOperations {
|
|
|
154
163
|
rollback(): Promise<void>;
|
|
155
164
|
}
|
|
156
165
|
|
|
157
|
-
/** Return type for
|
|
158
|
-
export type
|
|
166
|
+
/** Return type for handleL2BlockAndMessages */
|
|
167
|
+
export type HandleL2BlockAndMessagesResult = {
|
|
159
168
|
/** Whether the block processed was emitted by our sequencer */ isBlockOurs: boolean;
|
|
160
169
|
};
|
|
161
170
|
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { L2Block, MerkleTreeId, SiblingPath } from '@aztec/circuit-types';
|
|
2
|
-
import { Header, NullifierLeafPreimage, StateReference } from '@aztec/circuits.js';
|
|
2
|
+
import { Fr, Header, NullifierLeafPreimage, StateReference } from '@aztec/circuits.js';
|
|
3
3
|
import { IndexedTreeLeafPreimage } from '@aztec/foundation/trees';
|
|
4
4
|
import { BatchInsertionResult } from '@aztec/merkle-tree';
|
|
5
5
|
|
|
6
6
|
import { MerkleTreeDb } from './merkle_tree_db.js';
|
|
7
|
-
import {
|
|
7
|
+
import { HandleL2BlockAndMessagesResult, MerkleTreeOperations, TreeInfo } from './merkle_tree_operations.js';
|
|
8
8
|
|
|
9
9
|
/**
|
|
10
10
|
* Wraps a MerkleTreeDbOperations to call all functions with a preset includeUncommitted flag.
|
|
@@ -120,6 +120,16 @@ export class MerkleTreeOperationsFacade implements MerkleTreeOperations {
|
|
|
120
120
|
return this.trees.findLeafIndex(treeId, value, this.includeUncommitted);
|
|
121
121
|
}
|
|
122
122
|
|
|
123
|
+
/**
|
|
124
|
+
* Returns the first index containing a leaf value after `startIndex`.
|
|
125
|
+
* @param treeId - The tree for which the index should be returned.
|
|
126
|
+
* @param value - The value to search for in the tree.
|
|
127
|
+
* @param startIndex - The index to start searching from (used when skipping nullified messages)
|
|
128
|
+
*/
|
|
129
|
+
findLeafIndexAfter(treeId: MerkleTreeId, value: Buffer, startIndex: bigint): Promise<bigint | undefined> {
|
|
130
|
+
return this.trees.findLeafIndexAfter(treeId, value, startIndex, this.includeUncommitted);
|
|
131
|
+
}
|
|
132
|
+
|
|
123
133
|
/**
|
|
124
134
|
* Gets the value at the given index.
|
|
125
135
|
* @param treeId - The ID of the tree to get the leaf value from.
|
|
@@ -143,10 +153,11 @@ export class MerkleTreeOperationsFacade implements MerkleTreeOperations {
|
|
|
143
153
|
/**
|
|
144
154
|
* Handles a single L2 block (i.e. Inserts the new note hashes into the merkle tree).
|
|
145
155
|
* @param block - The L2 block to handle.
|
|
156
|
+
* @param l1ToL2Messages - The L1 to L2 messages for the block.
|
|
146
157
|
* @returns Whether the block handled was produced by this same node.
|
|
147
158
|
*/
|
|
148
|
-
public
|
|
149
|
-
return this.trees.
|
|
159
|
+
public handleL2BlockAndMessages(block: L2Block, l1ToL2Messages: Fr[]): Promise<HandleL2BlockAndMessagesResult> {
|
|
160
|
+
return this.trees.handleL2BlockAndMessages(block, l1ToL2Messages);
|
|
150
161
|
}
|
|
151
162
|
|
|
152
163
|
/**
|
|
@@ -4,7 +4,7 @@ import { IndexedTreeLeafPreimage } from '@aztec/foundation/trees';
|
|
|
4
4
|
import { BatchInsertionResult, IndexedTreeSnapshot, TreeSnapshot } from '@aztec/merkle-tree';
|
|
5
5
|
|
|
6
6
|
import { MerkleTreeDb } from './merkle_tree_db.js';
|
|
7
|
-
import {
|
|
7
|
+
import { HandleL2BlockAndMessagesResult, MerkleTreeOperations, TreeInfo } from './merkle_tree_operations.js';
|
|
8
8
|
|
|
9
9
|
/**
|
|
10
10
|
* Merkle tree operations on readonly tree snapshots.
|
|
@@ -33,6 +33,11 @@ export class MerkleTreeSnapshotOperationsFacade implements MerkleTreeOperations
|
|
|
33
33
|
return tree.findLeafIndex(value);
|
|
34
34
|
}
|
|
35
35
|
|
|
36
|
+
async findLeafIndexAfter(treeId: MerkleTreeId, value: Buffer, startIndex: bigint): Promise<bigint | undefined> {
|
|
37
|
+
const tree = await this.#getTreeSnapshot(treeId);
|
|
38
|
+
return tree.findLeafIndexAfter(value, startIndex);
|
|
39
|
+
}
|
|
40
|
+
|
|
36
41
|
async getLeafPreimage(
|
|
37
42
|
treeId: MerkleTreeId.NULLIFIER_TREE,
|
|
38
43
|
index: bigint,
|
|
@@ -130,7 +135,7 @@ export class MerkleTreeSnapshotOperationsFacade implements MerkleTreeOperations
|
|
|
130
135
|
return Promise.reject(new Error('Tree snapshot operations are read-only'));
|
|
131
136
|
}
|
|
132
137
|
|
|
133
|
-
|
|
138
|
+
handleL2BlockAndMessages(): Promise<HandleL2BlockAndMessagesResult> {
|
|
134
139
|
return Promise.reject(new Error('Tree snapshot operations are read-only'));
|
|
135
140
|
}
|
|
136
141
|
|
|
@@ -11,6 +11,7 @@ import {
|
|
|
11
11
|
NOTE_HASH_TREE_HEIGHT,
|
|
12
12
|
NULLIFIER_SUBTREE_HEIGHT,
|
|
13
13
|
NULLIFIER_TREE_HEIGHT,
|
|
14
|
+
NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP,
|
|
14
15
|
NullifierLeaf,
|
|
15
16
|
NullifierLeafPreimage,
|
|
16
17
|
PUBLIC_DATA_SUBTREE_HEIGHT,
|
|
@@ -20,6 +21,7 @@ import {
|
|
|
20
21
|
PublicDataTreeLeafPreimage,
|
|
21
22
|
StateReference,
|
|
22
23
|
} from '@aztec/circuits.js';
|
|
24
|
+
import { padArrayEnd } from '@aztec/foundation/collection';
|
|
23
25
|
import { SerialQueue } from '@aztec/foundation/fifo';
|
|
24
26
|
import { DebugLogger, createDebugLogger } from '@aztec/foundation/log';
|
|
25
27
|
import { IndexedTreeLeafPreimage } from '@aztec/foundation/trees';
|
|
@@ -39,7 +41,12 @@ import {
|
|
|
39
41
|
import { Hasher } from '@aztec/types/interfaces';
|
|
40
42
|
|
|
41
43
|
import { INITIAL_NULLIFIER_TREE_SIZE, INITIAL_PUBLIC_DATA_TREE_SIZE, MerkleTreeDb } from './merkle_tree_db.js';
|
|
42
|
-
import {
|
|
44
|
+
import {
|
|
45
|
+
HandleL2BlockAndMessagesResult,
|
|
46
|
+
IndexedTreeId,
|
|
47
|
+
MerkleTreeOperations,
|
|
48
|
+
TreeInfo,
|
|
49
|
+
} from './merkle_tree_operations.js';
|
|
43
50
|
import { MerkleTreeOperationsFacade } from './merkle_tree_operations_facade.js';
|
|
44
51
|
|
|
45
52
|
/**
|
|
@@ -332,6 +339,25 @@ export class MerkleTrees implements MerkleTreeDb {
|
|
|
332
339
|
});
|
|
333
340
|
}
|
|
334
341
|
|
|
342
|
+
/**
|
|
343
|
+
* Returns the first index containing a leaf value after `startIndex`.
|
|
344
|
+
* @param treeId - The tree for which the index should be returned.
|
|
345
|
+
* @param value - The value to search for in the tree.
|
|
346
|
+
* @param startIndex - The index to start searching from (used when skipping nullified messages)
|
|
347
|
+
* @param includeUncommitted - Indicates whether to include uncommitted data.
|
|
348
|
+
*/
|
|
349
|
+
public async findLeafIndexAfter(
|
|
350
|
+
treeId: MerkleTreeId,
|
|
351
|
+
value: Buffer,
|
|
352
|
+
startIndex: bigint,
|
|
353
|
+
includeUncommitted: boolean,
|
|
354
|
+
): Promise<bigint | undefined> {
|
|
355
|
+
return await this.synchronize(() => {
|
|
356
|
+
const tree = this.trees[treeId];
|
|
357
|
+
return Promise.resolve(tree.findLeafIndexAfter(value, startIndex, includeUncommitted));
|
|
358
|
+
});
|
|
359
|
+
}
|
|
360
|
+
|
|
335
361
|
/**
|
|
336
362
|
* Updates a leaf in a tree at a given index.
|
|
337
363
|
* @param treeId - The ID of the tree.
|
|
@@ -346,10 +372,11 @@ export class MerkleTrees implements MerkleTreeDb {
|
|
|
346
372
|
/**
|
|
347
373
|
* Handles a single L2 block (i.e. Inserts the new note hashes into the merkle tree).
|
|
348
374
|
* @param block - The L2 block to handle.
|
|
375
|
+
* @param l1ToL2Messages - The L1 to L2 messages for the block.
|
|
349
376
|
* @returns Whether the block handled was produced by this same node.
|
|
350
377
|
*/
|
|
351
|
-
public async
|
|
352
|
-
return await this.synchronize(() => this.#
|
|
378
|
+
public async handleL2BlockAndMessages(block: L2Block, l1ToL2Messages: Fr[]): Promise<HandleL2BlockAndMessagesResult> {
|
|
379
|
+
return await this.synchronize(() => this.#handleL2BlockAndMessages(block, l1ToL2Messages));
|
|
353
380
|
}
|
|
354
381
|
|
|
355
382
|
/**
|
|
@@ -477,8 +504,9 @@ export class MerkleTrees implements MerkleTreeDb {
|
|
|
477
504
|
/**
|
|
478
505
|
* Handles a single L2 block (i.e. Inserts the new note hashes into the merkle tree).
|
|
479
506
|
* @param l2Block - The L2 block to handle.
|
|
507
|
+
* @param l1ToL2Messages - The L1 to L2 messages for the block.
|
|
480
508
|
*/
|
|
481
|
-
async #
|
|
509
|
+
async #handleL2BlockAndMessages(l2Block: L2Block, l1ToL2Messages: Fr[]): Promise<HandleL2BlockAndMessagesResult> {
|
|
482
510
|
const treeRootWithIdPairs = [
|
|
483
511
|
[l2Block.header.state.partial.nullifierTree.root, MerkleTreeId.NULLIFIER_TREE],
|
|
484
512
|
[l2Block.header.state.partial.noteHashTree.root, MerkleTreeId.NOTE_HASH_TREE],
|
|
@@ -498,10 +526,14 @@ export class MerkleTrees implements MerkleTreeDb {
|
|
|
498
526
|
this.log(`Block ${l2Block.number} is not ours, rolling back world state and committing state from chain`);
|
|
499
527
|
await this.#rollback();
|
|
500
528
|
|
|
529
|
+
// We pad the messages because always a fixed number of messages is inserted and we need
|
|
530
|
+
// the `nextAvailableLeafIndex` to correctly progress.
|
|
531
|
+
const l1ToL2MessagesPadded = padArrayEnd(l1ToL2Messages, Fr.ZERO, NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP);
|
|
532
|
+
|
|
501
533
|
// Sync the append only trees
|
|
502
534
|
for (const [tree, leaves] of [
|
|
503
535
|
[MerkleTreeId.NOTE_HASH_TREE, l2Block.body.txEffects.flatMap(txEffect => txEffect.noteHashes)],
|
|
504
|
-
[MerkleTreeId.L1_TO_L2_MESSAGE_TREE,
|
|
536
|
+
[MerkleTreeId.L1_TO_L2_MESSAGE_TREE, l1ToL2MessagesPadded],
|
|
505
537
|
] as const) {
|
|
506
538
|
await this.#appendLeaves(
|
|
507
539
|
tree,
|