@aztec/world-state 0.66.0 → 0.67.1-devnet
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.d.ts +8 -8
- package/dest/native/merkle_trees_facade.d.ts.map +1 -1
- package/dest/native/merkle_trees_facade.js +14 -12
- package/dest/native/message.d.ts +9 -7
- package/dest/native/message.d.ts.map +1 -1
- package/dest/native/message.js +2 -2
- package/dest/native/native_world_state.d.ts +3 -3
- package/dest/native/native_world_state.d.ts.map +1 -1
- package/dest/native/native_world_state.js +9 -8
- package/dest/native/native_world_state_instance.d.ts.map +1 -1
- package/dest/native/native_world_state_instance.js +3 -15
- package/dest/synchronizer/factory.d.ts.map +1 -1
- package/dest/synchronizer/factory.js +4 -4
- package/dest/synchronizer/instrumentation.d.ts +9 -1
- package/dest/synchronizer/instrumentation.d.ts.map +1 -1
- package/dest/synchronizer/instrumentation.js +52 -72
- 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 +12 -10
- package/dest/world-state-db/merkle_tree_operations_facade.d.ts +5 -5
- package/dest/world-state-db/merkle_tree_operations_facade.d.ts.map +1 -1
- package/dest/world-state-db/merkle_tree_operations_facade.js +5 -5
- package/dest/world-state-db/merkle_tree_snapshot_operations_facade.d.ts +4 -4
- 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 -6
- package/dest/world-state-db/merkle_trees.d.ts +5 -4
- package/dest/world-state-db/merkle_trees.d.ts.map +1 -1
- package/dest/world-state-db/merkle_trees.js +7 -7
- package/package.json +14 -9
- package/src/native/merkle_trees_facade.ts +19 -17
- package/src/native/message.ts +9 -7
- package/src/native/native_world_state.ts +11 -10
- package/src/native/native_world_state_instance.ts +2 -13
- package/src/synchronizer/factory.ts +3 -6
- package/src/synchronizer/instrumentation.ts +54 -84
- package/src/synchronizer/server_world_state_synchronizer.ts +12 -11
- package/src/world-state-db/merkle_tree_operations_facade.ts +14 -9
- package/src/world-state-db/merkle_tree_snapshot_operations_facade.ts +17 -8
- package/src/world-state-db/merkle_trees.ts +14 -10
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
type L2Block,
|
|
4
4
|
type L2BlockId,
|
|
5
5
|
type L2BlockSource,
|
|
6
|
-
L2BlockStream,
|
|
6
|
+
type L2BlockStream,
|
|
7
7
|
type L2BlockStreamEvent,
|
|
8
8
|
type L2BlockStreamEventHandler,
|
|
9
9
|
type L2BlockStreamLocalDataProvider,
|
|
@@ -19,11 +19,11 @@ import { type L2BlockHandledStats } from '@aztec/circuit-types/stats';
|
|
|
19
19
|
import { MerkleTreeCalculator } from '@aztec/circuits.js';
|
|
20
20
|
import { L1_TO_L2_MSG_SUBTREE_HEIGHT } from '@aztec/circuits.js/constants';
|
|
21
21
|
import { type Fr } from '@aztec/foundation/fields';
|
|
22
|
-
import {
|
|
22
|
+
import { createLogger } from '@aztec/foundation/log';
|
|
23
23
|
import { promiseWithResolvers } from '@aztec/foundation/promise';
|
|
24
24
|
import { elapsed } from '@aztec/foundation/timer';
|
|
25
25
|
import { SHA256Trunc } from '@aztec/merkle-tree';
|
|
26
|
-
import { type TelemetryClient } from '@aztec/telemetry-client';
|
|
26
|
+
import { type TelemetryClient, TraceableL2BlockStream } from '@aztec/telemetry-client';
|
|
27
27
|
|
|
28
28
|
import { type WorldStateStatusFull } from '../native/message.js';
|
|
29
29
|
import { type MerkleTreeAdminDatabase } from '../world-state-db/merkle_tree_db.js';
|
|
@@ -54,7 +54,7 @@ export class ServerWorldStateSynchronizer
|
|
|
54
54
|
private readonly l2BlockSource: L2BlockSource & L1ToL2MessageSource,
|
|
55
55
|
private readonly config: WorldStateConfig,
|
|
56
56
|
telemetry: TelemetryClient,
|
|
57
|
-
private readonly log =
|
|
57
|
+
private readonly log = createLogger('world_state'),
|
|
58
58
|
) {
|
|
59
59
|
this.instrumentation = new WorldStateInstrumentation(telemetry);
|
|
60
60
|
this.merkleTreeCommitted = this.merkleTreeDb.getCommitted();
|
|
@@ -110,8 +110,10 @@ export class ServerWorldStateSynchronizer
|
|
|
110
110
|
return this.syncPromise.promise;
|
|
111
111
|
}
|
|
112
112
|
|
|
113
|
-
protected createBlockStream() {
|
|
114
|
-
|
|
113
|
+
protected createBlockStream(): L2BlockStream {
|
|
114
|
+
const tracer = this.instrumentation.telemetry.getTracer('WorldStateL2BlockStream');
|
|
115
|
+
const logger = createLogger('world-state:block_stream');
|
|
116
|
+
return new TraceableL2BlockStream(this.l2BlockSource, this, this, tracer, 'WorldStateL2BlockStream', logger, {
|
|
115
117
|
proven: this.config.worldStateProvenBlocksOnly,
|
|
116
118
|
pollIntervalMS: this.config.worldStateBlockCheckIntervalMS,
|
|
117
119
|
batchSize: this.config.worldStateBlockRequestBatchSize,
|
|
@@ -224,14 +226,13 @@ export class ServerWorldStateSynchronizer
|
|
|
224
226
|
* @returns Whether the block handled was produced by this same node.
|
|
225
227
|
*/
|
|
226
228
|
private async handleL2Blocks(l2Blocks: L2Block[]) {
|
|
227
|
-
this.log.verbose(`Handling new L2 blocks from ${l2Blocks[0].number} to ${l2Blocks[l2Blocks.length - 1].number}`);
|
|
228
229
|
const messagePromises = l2Blocks.map(block => this.l2BlockSource.getL1ToL2Messages(BigInt(block.number)));
|
|
229
230
|
const l1ToL2Messages: Fr[][] = await Promise.all(messagePromises);
|
|
230
231
|
let updateStatus: WorldStateStatusFull | undefined = undefined;
|
|
231
232
|
|
|
232
233
|
for (let i = 0; i < l2Blocks.length; i++) {
|
|
233
234
|
const [duration, result] = await elapsed(() => this.handleL2Block(l2Blocks[i], l1ToL2Messages[i]));
|
|
234
|
-
this.log.verbose(`
|
|
235
|
+
this.log.verbose(`World state updated with L2 block ${l2Blocks[i].number}`, {
|
|
235
236
|
eventName: 'l2-block-handled',
|
|
236
237
|
duration,
|
|
237
238
|
unfinalisedBlockNumber: result.summary.unfinalisedBlockNumber,
|
|
@@ -272,7 +273,7 @@ export class ServerWorldStateSynchronizer
|
|
|
272
273
|
}
|
|
273
274
|
|
|
274
275
|
private async handleChainFinalized(blockNumber: number) {
|
|
275
|
-
this.log.verbose(`
|
|
276
|
+
this.log.verbose(`Finalized chain is now at block ${blockNumber}`);
|
|
276
277
|
const summary = await this.merkleTreeDb.setFinalised(BigInt(blockNumber));
|
|
277
278
|
if (this.historyToKeep === undefined) {
|
|
278
279
|
return;
|
|
@@ -286,12 +287,12 @@ export class ServerWorldStateSynchronizer
|
|
|
286
287
|
}
|
|
287
288
|
|
|
288
289
|
private handleChainProven(blockNumber: number) {
|
|
289
|
-
this.log.
|
|
290
|
+
this.log.debug(`Proven chain is now at block ${blockNumber}`);
|
|
290
291
|
return Promise.resolve();
|
|
291
292
|
}
|
|
292
293
|
|
|
293
294
|
private async handleChainPruned(blockNumber: number) {
|
|
294
|
-
this.log.
|
|
295
|
+
this.log.warn(`Chain pruned to block ${blockNumber}`);
|
|
295
296
|
const status = await this.merkleTreeDb.unwindBlocks(BigInt(blockNumber));
|
|
296
297
|
this.latestBlockHashQuery = undefined;
|
|
297
298
|
this.instrumentation.updateWorldStateMetrics(status);
|
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
type SequentialInsertionResult,
|
|
7
7
|
type TreeInfo,
|
|
8
8
|
} from '@aztec/circuit-types/interfaces';
|
|
9
|
-
import { type
|
|
9
|
+
import { type BlockHeader, type StateReference } from '@aztec/circuits.js';
|
|
10
10
|
import { type IndexedTreeLeafPreimage } from '@aztec/foundation/trees';
|
|
11
11
|
|
|
12
12
|
import { type MerkleTrees } from './merkle_trees.js';
|
|
@@ -39,7 +39,7 @@ export class MerkleTreeReadOperationsFacade implements MerkleTreeWriteOperations
|
|
|
39
39
|
* Returns the initial header for the chain before the first block.
|
|
40
40
|
* @returns The initial header.
|
|
41
41
|
*/
|
|
42
|
-
getInitialHeader():
|
|
42
|
+
getInitialHeader(): BlockHeader {
|
|
43
43
|
return this.trees.getInitialHeader();
|
|
44
44
|
}
|
|
45
45
|
|
|
@@ -110,8 +110,11 @@ export class MerkleTreeReadOperationsFacade implements MerkleTreeWriteOperations
|
|
|
110
110
|
* @param value - The leaf value to look for.
|
|
111
111
|
* @returns The index of the first leaf found with a given value (undefined if not found).
|
|
112
112
|
*/
|
|
113
|
-
|
|
114
|
-
|
|
113
|
+
findLeafIndices<ID extends MerkleTreeId>(
|
|
114
|
+
treeId: ID,
|
|
115
|
+
values: MerkleTreeLeafType<ID>[],
|
|
116
|
+
): Promise<(bigint | undefined)[]> {
|
|
117
|
+
return Promise.all(values.map(leaf => this.trees.findLeafIndex(treeId, leaf, this.includeUncommitted)));
|
|
115
118
|
}
|
|
116
119
|
|
|
117
120
|
/**
|
|
@@ -120,12 +123,14 @@ export class MerkleTreeReadOperationsFacade implements MerkleTreeWriteOperations
|
|
|
120
123
|
* @param value - The value to search for in the tree.
|
|
121
124
|
* @param startIndex - The index to start searching from (used when skipping nullified messages)
|
|
122
125
|
*/
|
|
123
|
-
|
|
126
|
+
findLeafIndicesAfter<ID extends MerkleTreeId>(
|
|
124
127
|
treeId: ID,
|
|
125
|
-
|
|
128
|
+
values: MerkleTreeLeafType<ID>[],
|
|
126
129
|
startIndex: bigint,
|
|
127
|
-
): Promise<bigint | undefined> {
|
|
128
|
-
return
|
|
130
|
+
): Promise<(bigint | undefined)[]> {
|
|
131
|
+
return Promise.all(
|
|
132
|
+
values.map(leaf => this.trees.findLeafIndexAfter(treeId, leaf, startIndex, this.includeUncommitted)),
|
|
133
|
+
);
|
|
129
134
|
}
|
|
130
135
|
|
|
131
136
|
/**
|
|
@@ -149,7 +154,7 @@ export class MerkleTreeReadOperationsFacade implements MerkleTreeWriteOperations
|
|
|
149
154
|
* This includes all of the current roots of all of the data trees and the current blocks global vars.
|
|
150
155
|
* @param header - The header to insert into the archive.
|
|
151
156
|
*/
|
|
152
|
-
public updateArchive(header:
|
|
157
|
+
public updateArchive(header: BlockHeader): Promise<void> {
|
|
153
158
|
return this.trees.updateArchive(header);
|
|
154
159
|
}
|
|
155
160
|
|
|
@@ -5,7 +5,13 @@ import {
|
|
|
5
5
|
type MerkleTreeReadOperations,
|
|
6
6
|
type TreeInfo,
|
|
7
7
|
} from '@aztec/circuit-types/interfaces';
|
|
8
|
-
import {
|
|
8
|
+
import {
|
|
9
|
+
AppendOnlyTreeSnapshot,
|
|
10
|
+
type BlockHeader,
|
|
11
|
+
Fr,
|
|
12
|
+
PartialStateReference,
|
|
13
|
+
StateReference,
|
|
14
|
+
} from '@aztec/circuits.js';
|
|
9
15
|
import { type IndexedTreeLeafPreimage } from '@aztec/foundation/trees';
|
|
10
16
|
import { type IndexedTreeSnapshot } from '@aztec/merkle-tree';
|
|
11
17
|
|
|
@@ -34,20 +40,23 @@ export class MerkleTreeSnapshotOperationsFacade implements MerkleTreeReadOperati
|
|
|
34
40
|
return this.#treeSnapshots[treeId]!;
|
|
35
41
|
}
|
|
36
42
|
|
|
37
|
-
async
|
|
43
|
+
async findLeafIndices<ID extends MerkleTreeId>(
|
|
44
|
+
treeId: ID,
|
|
45
|
+
values: MerkleTreeLeafType<ID>[],
|
|
46
|
+
): Promise<(bigint | undefined)[]> {
|
|
38
47
|
const tree = await this.#getTreeSnapshot(treeId);
|
|
39
48
|
// TODO #5448 fix "as any"
|
|
40
|
-
return tree.findLeafIndex(
|
|
49
|
+
return values.map(leaf => tree.findLeafIndex(leaf as any));
|
|
41
50
|
}
|
|
42
51
|
|
|
43
|
-
async
|
|
52
|
+
async findLeafIndicesAfter<ID extends MerkleTreeId>(
|
|
44
53
|
treeId: MerkleTreeId,
|
|
45
|
-
|
|
54
|
+
values: MerkleTreeLeafType<ID>[],
|
|
46
55
|
startIndex: bigint,
|
|
47
|
-
): Promise<bigint | undefined> {
|
|
56
|
+
): Promise<(bigint | undefined)[]> {
|
|
48
57
|
const tree = await this.#getTreeSnapshot(treeId);
|
|
49
58
|
// TODO #5448 fix "as any"
|
|
50
|
-
return tree.findLeafIndexAfter(
|
|
59
|
+
return values.map(leaf => tree.findLeafIndexAfter(leaf as any, startIndex));
|
|
51
60
|
}
|
|
52
61
|
|
|
53
62
|
async getLeafPreimage<ID extends IndexedTreeId>(
|
|
@@ -136,7 +145,7 @@ export class MerkleTreeSnapshotOperationsFacade implements MerkleTreeReadOperati
|
|
|
136
145
|
);
|
|
137
146
|
}
|
|
138
147
|
|
|
139
|
-
getInitialHeader():
|
|
148
|
+
getInitialHeader(): BlockHeader {
|
|
140
149
|
throw new Error('Getting initial header not supported on snapshot.');
|
|
141
150
|
}
|
|
142
151
|
}
|
|
@@ -10,8 +10,8 @@ import {
|
|
|
10
10
|
import {
|
|
11
11
|
ARCHIVE_HEIGHT,
|
|
12
12
|
AppendOnlyTreeSnapshot,
|
|
13
|
+
BlockHeader,
|
|
13
14
|
Fr,
|
|
14
|
-
Header,
|
|
15
15
|
L1_TO_L2_MSG_TREE_HEIGHT,
|
|
16
16
|
MAX_NOTE_HASHES_PER_TX,
|
|
17
17
|
MAX_NULLIFIERS_PER_TX,
|
|
@@ -31,12 +31,12 @@ import {
|
|
|
31
31
|
StateReference,
|
|
32
32
|
} from '@aztec/circuits.js';
|
|
33
33
|
import { padArrayEnd } from '@aztec/foundation/collection';
|
|
34
|
-
import { type
|
|
34
|
+
import { type Logger, createLogger } from '@aztec/foundation/log';
|
|
35
35
|
import { SerialQueue } from '@aztec/foundation/queue';
|
|
36
36
|
import { Timer, elapsed } from '@aztec/foundation/timer';
|
|
37
37
|
import { type IndexedTreeLeafPreimage } from '@aztec/foundation/trees';
|
|
38
38
|
import { type AztecKVStore, type AztecSingleton } from '@aztec/kv-store';
|
|
39
|
-
import { openTmpStore } from '@aztec/kv-store/
|
|
39
|
+
import { openTmpStore } from '@aztec/kv-store/lmdb';
|
|
40
40
|
import {
|
|
41
41
|
type AppendOnlyTree,
|
|
42
42
|
type IndexedTree,
|
|
@@ -111,7 +111,7 @@ export class MerkleTrees implements MerkleTreeAdminDatabase {
|
|
|
111
111
|
private initialStateReference: AztecSingleton<Buffer>;
|
|
112
112
|
private metrics: WorldStateMetrics;
|
|
113
113
|
|
|
114
|
-
private constructor(private store: AztecKVStore, private telemetryClient: TelemetryClient, private log:
|
|
114
|
+
private constructor(private store: AztecKVStore, private telemetryClient: TelemetryClient, private log: Logger) {
|
|
115
115
|
this.initialStateReference = store.openSingleton('merkle_trees_initial_state_reference');
|
|
116
116
|
this.metrics = new WorldStateMetrics(telemetryClient);
|
|
117
117
|
}
|
|
@@ -121,7 +121,11 @@ export class MerkleTrees implements MerkleTreeAdminDatabase {
|
|
|
121
121
|
* @param store - The db instance to use for data persistance.
|
|
122
122
|
* @returns - A fully initialized MerkleTrees instance.
|
|
123
123
|
*/
|
|
124
|
-
public static async new(
|
|
124
|
+
public static async new(
|
|
125
|
+
store: AztecKVStore,
|
|
126
|
+
client: TelemetryClient,
|
|
127
|
+
log = createLogger('world-state:merkle_trees'),
|
|
128
|
+
) {
|
|
125
129
|
const merkleTrees = new MerkleTrees(store, client, log);
|
|
126
130
|
await merkleTrees.#init();
|
|
127
131
|
return merkleTrees;
|
|
@@ -239,7 +243,7 @@ export class MerkleTrees implements MerkleTreeAdminDatabase {
|
|
|
239
243
|
const forked = new MerkleTrees(
|
|
240
244
|
this.store,
|
|
241
245
|
this.telemetryClient,
|
|
242
|
-
|
|
246
|
+
createLogger('world-state:merkle_trees:ephemeral_fork'),
|
|
243
247
|
);
|
|
244
248
|
await forked.#init(true);
|
|
245
249
|
return new MerkleTreeReadOperationsFacade(forked, true);
|
|
@@ -249,8 +253,8 @@ export class MerkleTrees implements MerkleTreeAdminDatabase {
|
|
|
249
253
|
await this.store.delete();
|
|
250
254
|
}
|
|
251
255
|
|
|
252
|
-
public getInitialHeader():
|
|
253
|
-
return
|
|
256
|
+
public getInitialHeader(): BlockHeader {
|
|
257
|
+
return BlockHeader.empty({ state: this.#loadInitialStateReference() });
|
|
254
258
|
}
|
|
255
259
|
|
|
256
260
|
/**
|
|
@@ -285,7 +289,7 @@ export class MerkleTrees implements MerkleTreeAdminDatabase {
|
|
|
285
289
|
* @param header - The header whose hash to insert into the archive.
|
|
286
290
|
* @param includeUncommitted - Indicates whether to include uncommitted data.
|
|
287
291
|
*/
|
|
288
|
-
public async updateArchive(header:
|
|
292
|
+
public async updateArchive(header: BlockHeader) {
|
|
289
293
|
await this.synchronize(() => this.#updateArchive(header));
|
|
290
294
|
}
|
|
291
295
|
|
|
@@ -519,7 +523,7 @@ export class MerkleTrees implements MerkleTreeAdminDatabase {
|
|
|
519
523
|
return StateReference.fromBuffer(serialized);
|
|
520
524
|
}
|
|
521
525
|
|
|
522
|
-
async #updateArchive(header:
|
|
526
|
+
async #updateArchive(header: BlockHeader) {
|
|
523
527
|
const state = await this.getStateReference(true);
|
|
524
528
|
|
|
525
529
|
// This method should be called only when the block builder already updated the state so we sanity check that it's
|