@aztec/world-state 0.67.1-devnet → 0.68.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 → instrumentation}/instrumentation.d.ts +3 -1
- package/dest/instrumentation/instrumentation.d.ts.map +1 -0
- package/dest/instrumentation/instrumentation.js +89 -0
- package/dest/native/native_world_state.d.ts +5 -3
- package/dest/native/native_world_state.d.ts.map +1 -1
- package/dest/native/native_world_state.js +10 -7
- package/dest/native/native_world_state_instance.d.ts +3 -1
- package/dest/native/native_world_state_instance.d.ts.map +1 -1
- package/dest/native/native_world_state_instance.js +17 -11
- package/dest/synchronizer/factory.d.ts +2 -2
- package/dest/synchronizer/factory.d.ts.map +1 -1
- package/dest/synchronizer/factory.js +9 -13
- package/dest/synchronizer/server_world_state_synchronizer.d.ts +3 -3
- package/dest/synchronizer/server_world_state_synchronizer.d.ts.map +1 -1
- package/dest/synchronizer/server_world_state_synchronizer.js +5 -4
- package/package.json +12 -12
- package/src/{synchronizer → instrumentation}/instrumentation.ts +36 -10
- package/src/native/native_world_state.ts +12 -4
- package/src/native/native_world_state_instance.ts +25 -10
- package/src/synchronizer/factory.ts +7 -10
- package/src/synchronizer/server_world_state_synchronizer.ts +4 -5
- package/dest/synchronizer/instrumentation.d.ts.map +0 -1
- package/dest/synchronizer/instrumentation.js +0 -78
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type TelemetryClient } from '@aztec/telemetry-client';
|
|
2
|
-
import { type WorldStateStatusFull } from '../native/message.js';
|
|
2
|
+
import { WorldStateMessageType, type WorldStateStatusFull } from '../native/message.js';
|
|
3
3
|
export declare class WorldStateInstrumentation {
|
|
4
4
|
readonly telemetry: TelemetryClient;
|
|
5
5
|
private log;
|
|
@@ -10,9 +10,11 @@ export declare class WorldStateInstrumentation {
|
|
|
10
10
|
private oldestBlock;
|
|
11
11
|
private dbNumItems;
|
|
12
12
|
private dbUsedSize;
|
|
13
|
+
private requestHistogram;
|
|
13
14
|
constructor(telemetry: TelemetryClient, log?: import("@aztec/foundation/log").Logger);
|
|
14
15
|
private updateTreeStats;
|
|
15
16
|
private updateTreeDBStats;
|
|
16
17
|
updateWorldStateMetrics(worldStateStatus: WorldStateStatusFull): void;
|
|
18
|
+
recordRoundTrip(timeUs: number, request: WorldStateMessageType): void;
|
|
17
19
|
}
|
|
18
20
|
//# sourceMappingURL=instrumentation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instrumentation.d.ts","sourceRoot":"","sources":["../../src/instrumentation/instrumentation.ts"],"names":[],"mappings":"AAEA,OAAO,EAKL,KAAK,eAAe,EAErB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAIL,qBAAqB,EACrB,KAAK,oBAAoB,EAC1B,MAAM,sBAAsB,CAAC;AAI9B,qBAAa,yBAAyB;aAUR,SAAS,EAAE,eAAe;IAAE,OAAO,CAAC,GAAG;IATnE,OAAO,CAAC,SAAS,CAAQ;IACzB,OAAO,CAAC,QAAQ,CAAQ;IACxB,OAAO,CAAC,iBAAiB,CAAQ;IACjC,OAAO,CAAC,eAAe,CAAQ;IAC/B,OAAO,CAAC,WAAW,CAAQ;IAC3B,OAAO,CAAC,UAAU,CAAQ;IAC1B,OAAO,CAAC,UAAU,CAAQ;IAC1B,OAAO,CAAC,gBAAgB,CAAY;gBAER,SAAS,EAAE,eAAe,EAAU,GAAG,yCAA8C;IA4CjH,OAAO,CAAC,eAAe;IAwBvB,OAAO,CAAC,iBAAiB;IAWlB,uBAAuB,CAAC,gBAAgB,EAAE,oBAAoB;IAgC9D,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,qBAAqB;CAKtE"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { MerkleTreeId } from '@aztec/circuit-types';
|
|
2
|
+
import { createLogger } from '@aztec/foundation/log';
|
|
3
|
+
import { Attributes, Metrics, ValueType, } from '@aztec/telemetry-client';
|
|
4
|
+
import { WorldStateMessageType, } from '../native/message.js';
|
|
5
|
+
export class WorldStateInstrumentation {
|
|
6
|
+
constructor(telemetry, log = createLogger('world-state:instrumentation')) {
|
|
7
|
+
this.telemetry = telemetry;
|
|
8
|
+
this.log = log;
|
|
9
|
+
const meter = telemetry.getMeter('World State');
|
|
10
|
+
this.dbMapSize = meter.createGauge(Metrics.WORLD_STATE_DB_MAP_SIZE, {
|
|
11
|
+
description: `The current configured map size for each merkle tree`,
|
|
12
|
+
valueType: ValueType.INT,
|
|
13
|
+
});
|
|
14
|
+
this.treeSize = meter.createGauge(Metrics.WORLD_STATE_TREE_SIZE, {
|
|
15
|
+
description: `The current number of leaves in each merkle tree`,
|
|
16
|
+
valueType: ValueType.INT,
|
|
17
|
+
});
|
|
18
|
+
this.unfinalisedHeight = meter.createGauge(Metrics.WORLD_STATE_UNFINALISED_HEIGHT, {
|
|
19
|
+
description: `The unfinalised block height of each merkle tree`,
|
|
20
|
+
valueType: ValueType.INT,
|
|
21
|
+
});
|
|
22
|
+
this.finalisedHeight = meter.createGauge(Metrics.WORLD_STATE_FINALISED_HEIGHT, {
|
|
23
|
+
description: `The finalised block height of each merkle tree`,
|
|
24
|
+
valueType: ValueType.INT,
|
|
25
|
+
});
|
|
26
|
+
this.oldestBlock = meter.createGauge(Metrics.WORLD_STATE_OLDEST_BLOCK, {
|
|
27
|
+
description: `The oldest historical block of each merkle tree`,
|
|
28
|
+
valueType: ValueType.INT,
|
|
29
|
+
});
|
|
30
|
+
this.dbUsedSize = meter.createGauge(Metrics.WORLD_STATE_DB_USED_SIZE, {
|
|
31
|
+
description: `The current used database size for each db of each merkle tree`,
|
|
32
|
+
valueType: ValueType.INT,
|
|
33
|
+
});
|
|
34
|
+
this.dbNumItems = meter.createGauge(Metrics.WORLD_STATE_DB_NUM_ITEMS, {
|
|
35
|
+
description: `The current number of items in each database of each merkle tree`,
|
|
36
|
+
valueType: ValueType.INT,
|
|
37
|
+
});
|
|
38
|
+
this.requestHistogram = meter.createHistogram(Metrics.WORLD_STATE_REQUEST_TIME, {
|
|
39
|
+
description: 'The round trip time of world state requests',
|
|
40
|
+
unit: 'us',
|
|
41
|
+
valueType: ValueType.INT,
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
updateTreeStats(treeDbStats, treeMeta, tree) {
|
|
45
|
+
this.dbMapSize.record(Number(treeDbStats.mapSize), {
|
|
46
|
+
[Attributes.MERKLE_TREE_NAME]: MerkleTreeId[tree],
|
|
47
|
+
});
|
|
48
|
+
this.treeSize.record(Number(treeMeta.size), {
|
|
49
|
+
[Attributes.MERKLE_TREE_NAME]: MerkleTreeId[tree],
|
|
50
|
+
});
|
|
51
|
+
this.unfinalisedHeight.record(Number(treeMeta.unfinalisedBlockHeight), {
|
|
52
|
+
[Attributes.MERKLE_TREE_NAME]: MerkleTreeId[tree],
|
|
53
|
+
});
|
|
54
|
+
this.finalisedHeight.record(Number(treeMeta.finalisedBlockHeight), {
|
|
55
|
+
[Attributes.MERKLE_TREE_NAME]: MerkleTreeId[tree],
|
|
56
|
+
});
|
|
57
|
+
this.oldestBlock.record(Number(treeMeta.oldestHistoricBlock), {
|
|
58
|
+
[Attributes.MERKLE_TREE_NAME]: MerkleTreeId[tree],
|
|
59
|
+
});
|
|
60
|
+
this.updateTreeDBStats(treeDbStats.blockIndicesDBStats, 'block_indices', tree);
|
|
61
|
+
this.updateTreeDBStats(treeDbStats.blocksDBStats, 'blocks', tree);
|
|
62
|
+
this.updateTreeDBStats(treeDbStats.leafIndicesDBStats, 'leaf_indices', tree);
|
|
63
|
+
this.updateTreeDBStats(treeDbStats.leafPreimagesDBStats, 'leaf_preimage', tree);
|
|
64
|
+
this.updateTreeDBStats(treeDbStats.nodesDBStats, 'nodes', tree);
|
|
65
|
+
}
|
|
66
|
+
updateTreeDBStats(dbStats, dbType, tree) {
|
|
67
|
+
this.dbNumItems.record(Number(dbStats.numDataItems), {
|
|
68
|
+
[Attributes.WS_DB_DATA_TYPE]: dbType,
|
|
69
|
+
[Attributes.MERKLE_TREE_NAME]: MerkleTreeId[tree],
|
|
70
|
+
});
|
|
71
|
+
this.dbUsedSize.record(Number(dbStats.totalUsedSize), {
|
|
72
|
+
[Attributes.WS_DB_DATA_TYPE]: dbType,
|
|
73
|
+
[Attributes.MERKLE_TREE_NAME]: MerkleTreeId[tree],
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
updateWorldStateMetrics(worldStateStatus) {
|
|
77
|
+
this.updateTreeStats(worldStateStatus.dbStats.archiveTreeStats, worldStateStatus.meta.archiveTreeMeta, MerkleTreeId.ARCHIVE);
|
|
78
|
+
this.updateTreeStats(worldStateStatus.dbStats.messageTreeStats, worldStateStatus.meta.messageTreeMeta, MerkleTreeId.L1_TO_L2_MESSAGE_TREE);
|
|
79
|
+
this.updateTreeStats(worldStateStatus.dbStats.noteHashTreeStats, worldStateStatus.meta.noteHashTreeMeta, MerkleTreeId.NOTE_HASH_TREE);
|
|
80
|
+
this.updateTreeStats(worldStateStatus.dbStats.nullifierTreeStats, worldStateStatus.meta.nullifierTreeMeta, MerkleTreeId.NULLIFIER_TREE);
|
|
81
|
+
this.updateTreeStats(worldStateStatus.dbStats.publicDataTreeStats, worldStateStatus.meta.publicDataTreeMeta, MerkleTreeId.PUBLIC_DATA_TREE);
|
|
82
|
+
}
|
|
83
|
+
recordRoundTrip(timeUs, request) {
|
|
84
|
+
this.requestHistogram.record(Math.ceil(timeUs), {
|
|
85
|
+
[Attributes.WORLD_STATE_REQUEST_TYPE]: WorldStateMessageType[request],
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdHJ1bWVudGF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2luc3RydW1lbnRhdGlvbi9pbnN0cnVtZW50YXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNyRCxPQUFPLEVBQ0wsVUFBVSxFQUdWLE9BQU8sRUFFUCxTQUFTLEdBQ1YsTUFBTSx5QkFBeUIsQ0FBQztBQUVqQyxPQUFPLEVBSUwscUJBQXFCLEdBRXRCLE1BQU0sc0JBQXNCLENBQUM7QUFJOUIsTUFBTSxPQUFPLHlCQUF5QjtJQVVwQyxZQUE0QixTQUEwQixFQUFVLE1BQU0sWUFBWSxDQUFDLDZCQUE2QixDQUFDO1FBQXJGLGNBQVMsR0FBVCxTQUFTLENBQWlCO1FBQVUsUUFBRyxHQUFILEdBQUcsQ0FBOEM7UUFDL0csTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUNoRCxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLHVCQUF1QixFQUFFO1lBQ2xFLFdBQVcsRUFBRSxzREFBc0Q7WUFDbkUsU0FBUyxFQUFFLFNBQVMsQ0FBQyxHQUFHO1NBQ3pCLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMscUJBQXFCLEVBQUU7WUFDL0QsV0FBVyxFQUFFLGtEQUFrRDtZQUMvRCxTQUFTLEVBQUUsU0FBUyxDQUFDLEdBQUc7U0FDekIsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLDhCQUE4QixFQUFFO1lBQ2pGLFdBQVcsRUFBRSxrREFBa0Q7WUFDL0QsU0FBUyxFQUFFLFNB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
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
/// <reference types="node" resolution-mode="require"/>
|
|
3
3
|
import { type IndexedTreeId, type L2Block, type MerkleTreeReadOperations, type MerkleTreeWriteOperations } from '@aztec/circuit-types';
|
|
4
4
|
import { BlockHeader, EthAddress, Fr, type NullifierLeafPreimage } from '@aztec/circuits.js';
|
|
5
|
+
import { WorldStateInstrumentation } from '../instrumentation/instrumentation.js';
|
|
5
6
|
import { type MerkleTreeAdminDatabase as MerkleTreeDatabase } from '../world-state-db/merkle_tree_db.js';
|
|
6
7
|
import { type WorldStateStatusFull, type WorldStateStatusSummary } from './message.js';
|
|
7
8
|
import { NativeWorldState } from './native_world_state_instance.js';
|
|
@@ -9,13 +10,14 @@ export declare const WORLD_STATE_VERSION_FILE = "version";
|
|
|
9
10
|
export declare const WORLD_STATE_DB_VERSION = 1;
|
|
10
11
|
export declare class NativeWorldStateService implements MerkleTreeDatabase {
|
|
11
12
|
protected readonly instance: NativeWorldState;
|
|
13
|
+
protected readonly worldStateInstrumentation: WorldStateInstrumentation;
|
|
12
14
|
protected readonly log: import("@aztec/foundation/log").Logger;
|
|
13
15
|
private readonly cleanup;
|
|
14
16
|
protected initialHeader: BlockHeader | undefined;
|
|
15
17
|
private cachedStatusSummary;
|
|
16
|
-
protected constructor(instance: NativeWorldState, log?: import("@aztec/foundation/log").Logger, cleanup?: () => Promise<void>);
|
|
17
|
-
static new(rollupAddress: EthAddress, dataDir: string, dbMapSizeKb: number, log?: import("@aztec/foundation/log").Logger, cleanup?: () => Promise<void>): Promise<NativeWorldStateService>;
|
|
18
|
-
static tmp(rollupAddress?: EthAddress, cleanupTmpDir?: boolean): Promise<NativeWorldStateService>;
|
|
18
|
+
protected constructor(instance: NativeWorldState, worldStateInstrumentation: WorldStateInstrumentation, log?: import("@aztec/foundation/log").Logger, cleanup?: () => Promise<void>);
|
|
19
|
+
static new(rollupAddress: EthAddress, dataDir: string, dbMapSizeKb: number, instrumentation?: WorldStateInstrumentation, log?: import("@aztec/foundation/log").Logger, cleanup?: () => Promise<void>): Promise<NativeWorldStateService>;
|
|
20
|
+
static tmp(rollupAddress?: EthAddress, cleanupTmpDir?: boolean, instrumentation?: WorldStateInstrumentation): Promise<NativeWorldStateService>;
|
|
19
21
|
protected init(): Promise<void>;
|
|
20
22
|
getCommitted(): MerkleTreeReadOperations;
|
|
21
23
|
getSnapshot(blockNumber: number): MerkleTreeReadOperations;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"native_world_state.d.ts","sourceRoot":"","sources":["../../src/native/native_world_state.ts"],"names":[],"mappings":";;AAAA,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,OAAO,EAEZ,KAAK,wBAAwB,EAC7B,KAAK,yBAAyB,EAE/B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,WAAW,EACX,UAAU,EACV,EAAE,EAKF,KAAK,qBAAqB,EAI3B,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"native_world_state.d.ts","sourceRoot":"","sources":["../../src/native/native_world_state.ts"],"names":[],"mappings":";;AAAA,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,OAAO,EAEZ,KAAK,wBAAwB,EAC7B,KAAK,yBAAyB,EAE/B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,WAAW,EACX,UAAU,EACV,EAAE,EAKF,KAAK,qBAAqB,EAI3B,MAAM,oBAAoB,CAAC;AAU5B,OAAO,EAAE,yBAAyB,EAAE,MAAM,uCAAuC,CAAC;AAClF,OAAO,EAAE,KAAK,uBAAuB,IAAI,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAEzG,OAAO,EAEL,KAAK,oBAAoB,EACzB,KAAK,uBAAuB,EAM7B,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AAGpE,eAAO,MAAM,wBAAwB,YAAY,CAAC;AAOlD,eAAO,MAAM,sBAAsB,IAAI,CAAC;AAExC,qBAAa,uBAAwB,YAAW,kBAAkB;IAM9D,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,gBAAgB;IAC7C,SAAS,CAAC,QAAQ,CAAC,yBAAyB,EAAE,yBAAyB;IACvE,SAAS,CAAC,QAAQ,CAAC,GAAG;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAR1B,SAAS,CAAC,aAAa,EAAE,WAAW,GAAG,SAAS,CAAC;IAEjD,OAAO,CAAC,mBAAmB,CAAsC;IAEjE,SAAS,aACY,QAAQ,EAAE,gBAAgB,EAC1B,yBAAyB,EAAE,yBAAyB,EACpD,GAAG,yCAAuC,EAC5C,OAAO,sBAA0B;WAGvC,GAAG,CACd,aAAa,EAAE,UAAU,EACzB,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EACnB,eAAe,4BAA2D,EAC1E,GAAG,yCAAuC,EAC1C,OAAO,sBAA0B,GAChC,OAAO,CAAC,uBAAuB,CAAC;WAiCtB,GAAG,CACd,aAAa,aAAkB,EAC/B,aAAa,UAAO,EACpB,eAAe,4BAA2D,GACzE,OAAO,CAAC,uBAAuB,CAAC;cAmBnB,IAAI;IAqBb,YAAY,IAAI,wBAAwB;IAIxC,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,wBAAwB;IAIpD,IAAI,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,yBAAyB,CAAC;IAQpE,gBAAgB,IAAI,WAAW;IAIzB,wBAAwB,CAAC,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC;IA2C/F,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAKrB,kBAAkB;IAKhC,OAAO,CAAC,+BAA+B;IAMvC,OAAO,CAAC,uBAAuB;IAM/B,OAAO,CAAC,mBAAmB;IAI3B;;;;OAIG;IACU,YAAY,CAAC,aAAa,EAAE,MAAM;IAY/C;;;;OAIG;IACU,sBAAsB,CAAC,aAAa,EAAE,MAAM;IAWzD;;;;OAIG;IACU,YAAY,CAAC,aAAa,EAAE,MAAM;IAWlC,gBAAgB;IAO7B,UAAU,CAAC,EAAE,SAAS,aAAa,EACjC,OAAO,EAAE,EAAE,EACX,KAAK,EAAE,qBAAqB,GAAG,MAAM,EACrC,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC;YAIF,wBAAwB;CAYvC"}
|
|
@@ -2,10 +2,12 @@ import { MerkleTreeId, TxEffect, } from '@aztec/circuit-types';
|
|
|
2
2
|
import { BlockHeader, EthAddress, Fr, MAX_NOTE_HASHES_PER_TX, MAX_NULLIFIERS_PER_TX, NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP, NullifierLeaf, PartialStateReference, PublicDataTreeLeaf, StateReference, } from '@aztec/circuits.js';
|
|
3
3
|
import { padArrayEnd } from '@aztec/foundation/collection';
|
|
4
4
|
import { createLogger } from '@aztec/foundation/log';
|
|
5
|
+
import { NoopTelemetryClient } from '@aztec/telemetry-client/noop';
|
|
5
6
|
import assert from 'assert/strict';
|
|
6
7
|
import { mkdir, mkdtemp, rm } from 'fs/promises';
|
|
7
8
|
import { tmpdir } from 'os';
|
|
8
9
|
import { join } from 'path';
|
|
10
|
+
import { WorldStateInstrumentation } from '../instrumentation/instrumentation.js';
|
|
9
11
|
import { MerkleTreesFacade, MerkleTreesForkFacade, serializeLeaf } from './merkle_trees_facade.js';
|
|
10
12
|
import { WorldStateMessageType, blockStateReference, sanitiseFullStatus, sanitiseSummary, treeStateReferenceToSnapshot, worldStateRevision, } from './message.js';
|
|
11
13
|
import { NativeWorldState } from './native_world_state_instance.js';
|
|
@@ -18,12 +20,13 @@ export const WORLD_STATE_VERSION_FILE = 'version';
|
|
|
18
20
|
// the state if a change is detected
|
|
19
21
|
export const WORLD_STATE_DB_VERSION = 1; // The initial version
|
|
20
22
|
export class NativeWorldStateService {
|
|
21
|
-
constructor(instance, log = createLogger('world-state:database'), cleanup = () => Promise.resolve()) {
|
|
23
|
+
constructor(instance, worldStateInstrumentation, log = createLogger('world-state:database'), cleanup = () => Promise.resolve()) {
|
|
22
24
|
this.instance = instance;
|
|
25
|
+
this.worldStateInstrumentation = worldStateInstrumentation;
|
|
23
26
|
this.log = log;
|
|
24
27
|
this.cleanup = cleanup;
|
|
25
28
|
}
|
|
26
|
-
static async new(rollupAddress, dataDir, dbMapSizeKb, log = createLogger('world-state:database'), cleanup = () => Promise.resolve()) {
|
|
29
|
+
static async new(rollupAddress, dataDir, dbMapSizeKb, instrumentation = new WorldStateInstrumentation(new NoopTelemetryClient()), log = createLogger('world-state:database'), cleanup = () => Promise.resolve()) {
|
|
27
30
|
const worldStateDirectory = join(dataDir, 'world_state');
|
|
28
31
|
const versionFile = join(worldStateDirectory, WORLD_STATE_VERSION_FILE);
|
|
29
32
|
const storedWorldStateVersion = await WorldStateVersion.readVersion(versionFile);
|
|
@@ -42,8 +45,8 @@ export class NativeWorldStateService {
|
|
|
42
45
|
const newWorldStateVersion = new WorldStateVersion(WORLD_STATE_DB_VERSION, rollupAddress);
|
|
43
46
|
await mkdir(worldStateDirectory, { recursive: true });
|
|
44
47
|
await newWorldStateVersion.writeVersionFile(versionFile);
|
|
45
|
-
const instance = new NativeWorldState(worldStateDirectory, dbMapSizeKb);
|
|
46
|
-
const worldState = new this(instance, log, cleanup);
|
|
48
|
+
const instance = new NativeWorldState(worldStateDirectory, dbMapSizeKb, instrumentation);
|
|
49
|
+
const worldState = new this(instance, instrumentation, log, cleanup);
|
|
47
50
|
try {
|
|
48
51
|
await worldState.init();
|
|
49
52
|
}
|
|
@@ -53,7 +56,7 @@ export class NativeWorldStateService {
|
|
|
53
56
|
}
|
|
54
57
|
return worldState;
|
|
55
58
|
}
|
|
56
|
-
static async tmp(rollupAddress = EthAddress.ZERO, cleanupTmpDir = true) {
|
|
59
|
+
static async tmp(rollupAddress = EthAddress.ZERO, cleanupTmpDir = true, instrumentation = new WorldStateInstrumentation(new NoopTelemetryClient())) {
|
|
57
60
|
const log = createLogger('world-state:database');
|
|
58
61
|
const dataDir = await mkdtemp(join(tmpdir(), 'aztec-world-state-'));
|
|
59
62
|
const dbMapSizeKb = 10 * 1024 * 1024;
|
|
@@ -68,7 +71,7 @@ export class NativeWorldStateService {
|
|
|
68
71
|
log.debug(`Leaving temporary world state database: ${dataDir}`);
|
|
69
72
|
}
|
|
70
73
|
};
|
|
71
|
-
return this.new(rollupAddress, dataDir, dbMapSizeKb, log, cleanup);
|
|
74
|
+
return this.new(rollupAddress, dataDir, dbMapSizeKb, instrumentation, log, cleanup);
|
|
72
75
|
}
|
|
73
76
|
async init() {
|
|
74
77
|
const status = await this.getStatusSummary();
|
|
@@ -197,4 +200,4 @@ export class NativeWorldStateService {
|
|
|
197
200
|
return new StateReference(treeStateReferenceToSnapshot(resp.state[MerkleTreeId.L1_TO_L2_MESSAGE_TREE]), new PartialStateReference(treeStateReferenceToSnapshot(resp.state[MerkleTreeId.NOTE_HASH_TREE]), treeStateReferenceToSnapshot(resp.state[MerkleTreeId.NULLIFIER_TREE]), treeStateReferenceToSnapshot(resp.state[MerkleTreeId.PUBLIC_DATA_TREE])));
|
|
198
201
|
}
|
|
199
202
|
}
|
|
200
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF0aXZlX3dvcmxkX3N0YXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL25hdGl2ZS9uYXRpdmVfd29ybGRfc3RhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUdMLFlBQVksRUFHWixRQUFRLEdBQ1QsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QixPQUFPLEVBQ0wsV0FBVyxFQUNYLFVBQVUsRUFDVixFQUFFLEVBQ0Ysc0JBQXNCLEVBQ3RCLHFCQUFxQixFQUNyQixtQ0FBbUMsRUFDbkMsYUFBYSxFQUViLHFCQUFxQixFQUNyQixrQkFBa0IsRUFDbEIsY0FBYyxHQUNmLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzNELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUVyRCxPQUFPLE1BQU0sTUFBTSxlQUFlLENBQUM7QUFDbkMsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2pELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDNUIsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUc1QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUscUJBQXFCLEVBQUUsYUFBYSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDbkcsT0FBTyxFQUNMLHFCQUFxQixFQUdyQixtQkFBbUIsRUFDbkIsa0JBQWtCLEVBQ2xCLGVBQWUsRUFDZiw0QkFBNEIsRUFDNUIsa0JBQWtCLEdBQ25CLE1BQU0sY0FBYyxDQUFDO0FBQ3RCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRTdELE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFHLFNBQVMsQ0FB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
|
|
203
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF0aXZlX3dvcmxkX3N0YXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL25hdGl2ZS9uYXRpdmVfd29ybGRfc3RhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUdMLFlBQVksRUFHWixRQUFRLEdBQ1QsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QixPQUFPLEVBQ0wsV0FBVyxFQUNYLFVBQVUsRUFDVixFQUFFLEVBQ0Ysc0JBQXNCLEVBQ3RCLHFCQUFxQixFQUNyQixtQ0FBbUMsRUFDbkMsYUFBYSxFQUViLHFCQUFxQixFQUNyQixrQkFBa0IsRUFDbEIsY0FBYyxHQUNmLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzNELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUVuRSxPQUFPLE1BQU0sTUFBTSxlQUFlLENBQUM7QUFDbkMsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2pELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDNUIsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUU1QixPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUVsRixPQUFPLEVBQUUsaUJBQWlCLEVBQUUscUJBQXFCLEVBQUUsYUFBYSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDbkcsT0FBTyxFQUNMLHFCQUFxQixFQUdyQixtQkFBbUIsRUFDbkIsa0JBQWtCLEVBQ2xCLGVBQWUsRUFDZiw0QkFBNEIsRUFDNUIsa0JBQWtCLEdBQ25CLE1BQU0sY0FBYyxDQUFDO0FBQ3RCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGtDQUFrQyxD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
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
/// <reference types="node" resolution-mode="require"/>
|
|
2
2
|
/// <reference types="node" resolution-mode="require"/>
|
|
3
|
+
import { type WorldStateInstrumentation } from '../instrumentation/instrumentation.js';
|
|
3
4
|
import { WorldStateMessageType, type WorldStateRequest, type WorldStateResponse } from './message.js';
|
|
4
5
|
export interface NativeInstance {
|
|
5
6
|
call(msg: Buffer | Uint8Array): Promise<any>;
|
|
@@ -11,6 +12,7 @@ export interface NativeWorldStateInstance {
|
|
|
11
12
|
* Strongly-typed interface to access the WorldState class in the native world_state_napi module.
|
|
12
13
|
*/
|
|
13
14
|
export declare class NativeWorldState implements NativeWorldStateInstance {
|
|
15
|
+
private instrumentation;
|
|
14
16
|
private log;
|
|
15
17
|
private open;
|
|
16
18
|
/** Each message needs a unique ID */
|
|
@@ -24,7 +26,7 @@ export declare class NativeWorldState implements NativeWorldStateInstance {
|
|
|
24
26
|
/** Calls to the same instance are serialized */
|
|
25
27
|
private queue;
|
|
26
28
|
/** Creates a new native WorldState instance */
|
|
27
|
-
constructor(dataDir: string, dbMapSizeKb: number, log?: import("@aztec/foundation/log").Logger);
|
|
29
|
+
constructor(dataDir: string, dbMapSizeKb: number, instrumentation: WorldStateInstrumentation, log?: import("@aztec/foundation/log").Logger);
|
|
28
30
|
/**
|
|
29
31
|
* Sends a message to the native instance and returns the response.
|
|
30
32
|
* @param messageType - The type of message to send
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"native_world_state_instance.d.ts","sourceRoot":"","sources":["../../src/native/native_world_state_instance.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"native_world_state_instance.d.ts","sourceRoot":"","sources":["../../src/native/native_world_state_instance.ts"],"names":[],"mappings":";;AAqBA,OAAO,EAAE,KAAK,yBAAyB,EAAE,MAAM,uCAAuC,CAAC;AACvF,OAAO,EAGL,qBAAqB,EACrB,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACxB,MAAM,cAAc,CAAC;AAYtB,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;CAC9C;AAQD,MAAM,WAAW,wBAAwB;IACvC,IAAI,CAAC,CAAC,SAAS,qBAAqB,EAAE,WAAW,EAAE,CAAC,EAAE,IAAI,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC;CACnH;AAED;;GAEG;AACH,qBAAa,gBAAiB,YAAW,wBAAwB;IA8B7D,OAAO,CAAC,eAAe;IACvB,OAAO,CAAC,GAAG;IA9Bb,OAAO,CAAC,IAAI,CAAQ;IAEpB,qCAAqC;IACrC,OAAO,CAAC,aAAa,CAAK;IAE1B,mCAAmC;IACnC,OAAO,CAAC,OAAO,CAKZ;IAEH,mCAAmC;IACnC,OAAO,CAAC,OAAO,CAGZ;IAEH,iCAAiC;IACjC,OAAO,CAAC,QAAQ,CAAM;IAEtB,gDAAgD;IAChD,OAAO,CAAC,KAAK,CAAqB;IAElC,+CAA+C;gBAE7C,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EACX,eAAe,EAAE,yBAAyB,EAC1C,GAAG,yCAAuC;IA0BpD;;;;;;;OAOG;IACI,IAAI,CAAC,CAAC,SAAS,qBAAqB,EACzC,WAAW,EAAE,CAAC,EACd,IAAI,EAAE,iBAAiB,CAAC,CAAC,CAAC,EAE1B,eAAe,cAAc,kBAAkB,CAAC,CAAC,CAAC,KAAG,kBAAkB,CAAC,CAAC,CAAa,EACtF,YAAY,OAAO,MAAM,SAAO,GAC/B,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC;IAejC;;OAEG;IACU,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YASrB,YAAY;CAsH3B"}
|
|
@@ -2,7 +2,6 @@ import { MerkleTreeId } from '@aztec/circuit-types';
|
|
|
2
2
|
import { ARCHIVE_HEIGHT, Fr, GeneratorIndex, L1_TO_L2_MSG_TREE_HEIGHT, MAX_NULLIFIERS_PER_TX, MAX_TOTAL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX, NOTE_HASH_TREE_HEIGHT, NULLIFIER_TREE_HEIGHT, PUBLIC_DATA_TREE_HEIGHT, } from '@aztec/circuits.js';
|
|
3
3
|
import { createLogger } from '@aztec/foundation/log';
|
|
4
4
|
import { SerialQueue } from '@aztec/foundation/queue';
|
|
5
|
-
import { Timer } from '@aztec/foundation/timer';
|
|
6
5
|
import assert from 'assert';
|
|
7
6
|
import bindings from 'bindings';
|
|
8
7
|
import { Decoder, Encoder, addExtension } from 'msgpackr';
|
|
@@ -21,13 +20,14 @@ addExtension({
|
|
|
21
20
|
const NATIVE_LIBRARY_NAME = 'world_state_napi';
|
|
22
21
|
const NATIVE_CLASS_NAME = 'WorldState';
|
|
23
22
|
const NATIVE_MODULE = bindings(NATIVE_LIBRARY_NAME);
|
|
24
|
-
const MAX_WORLD_STATE_THREADS = 16;
|
|
23
|
+
const MAX_WORLD_STATE_THREADS = +(process.env.HARDWARE_CONCURRENCY || '16');
|
|
25
24
|
/**
|
|
26
25
|
* Strongly-typed interface to access the WorldState class in the native world_state_napi module.
|
|
27
26
|
*/
|
|
28
27
|
export class NativeWorldState {
|
|
29
28
|
/** Creates a new native WorldState instance */
|
|
30
|
-
constructor(dataDir, dbMapSizeKb, log = createLogger('world-state:database')) {
|
|
29
|
+
constructor(dataDir, dbMapSizeKb, instrumentation, log = createLogger('world-state:database')) {
|
|
30
|
+
this.instrumentation = instrumentation;
|
|
31
31
|
this.log = log;
|
|
32
32
|
this.open = true;
|
|
33
33
|
/** Each message needs a unique ID */
|
|
@@ -46,7 +46,8 @@ export class NativeWorldState {
|
|
|
46
46
|
});
|
|
47
47
|
/** Calls to the same instance are serialized */
|
|
48
48
|
this.queue = new SerialQueue();
|
|
49
|
-
|
|
49
|
+
const threads = Math.min(cpus().length, MAX_WORLD_STATE_THREADS);
|
|
50
|
+
log.info(`Creating world state data store at directory ${dataDir} with map size ${dbMapSizeKb} KB and ${threads} threads.`);
|
|
50
51
|
this.instance = new NATIVE_MODULE[NATIVE_CLASS_NAME](dataDir, {
|
|
51
52
|
[MerkleTreeId.NULLIFIER_TREE]: NULLIFIER_TREE_HEIGHT,
|
|
52
53
|
[MerkleTreeId.NOTE_HASH_TREE]: NOTE_HASH_TREE_HEIGHT,
|
|
@@ -56,7 +57,7 @@ export class NativeWorldState {
|
|
|
56
57
|
}, {
|
|
57
58
|
[MerkleTreeId.NULLIFIER_TREE]: 2 * MAX_NULLIFIERS_PER_TX,
|
|
58
59
|
[MerkleTreeId.PUBLIC_DATA_TREE]: 2 * MAX_TOTAL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX,
|
|
59
|
-
}, GeneratorIndex.BLOCK_HASH, dbMapSizeKb,
|
|
60
|
+
}, GeneratorIndex.BLOCK_HASH, dbMapSizeKb, threads);
|
|
60
61
|
this.queue.start();
|
|
61
62
|
}
|
|
62
63
|
/**
|
|
@@ -135,10 +136,11 @@ export class NativeWorldState {
|
|
|
135
136
|
else {
|
|
136
137
|
this.log.trace(`Calling messageId=${messageId} ${WorldStateMessageType[messageType]}`);
|
|
137
138
|
}
|
|
138
|
-
const
|
|
139
|
+
const start = process.hrtime.bigint();
|
|
139
140
|
const request = new TypedMessage(messageType, new MessageHeader({ messageId }), body);
|
|
140
141
|
const encodedRequest = this.encoder.encode(request);
|
|
141
|
-
const
|
|
142
|
+
const encodingEnd = process.hrtime.bigint();
|
|
143
|
+
const encodingDuration = Number(encodingEnd - start) / 1000000;
|
|
142
144
|
let encodedResponse;
|
|
143
145
|
try {
|
|
144
146
|
encodedResponse = await this.instance.call(encodedRequest);
|
|
@@ -147,7 +149,8 @@ export class NativeWorldState {
|
|
|
147
149
|
this.log.error(`Call messageId=${messageId} ${WorldStateMessageType[messageType]} failed: ${error}`);
|
|
148
150
|
throw error;
|
|
149
151
|
}
|
|
150
|
-
const
|
|
152
|
+
const callEnd = process.hrtime.bigint();
|
|
153
|
+
const callDuration = Number(callEnd - encodingEnd) / 1000000;
|
|
151
154
|
const buf = Buffer.isBuffer(encodedResponse)
|
|
152
155
|
? encodedResponse
|
|
153
156
|
: isAnyArrayBuffer(encodedResponse)
|
|
@@ -163,8 +166,9 @@ export class NativeWorldState {
|
|
|
163
166
|
(decodedResponse === null ? 'null' : typeof decodedResponse));
|
|
164
167
|
}
|
|
165
168
|
const response = TypedMessage.fromMessagePack(decodedResponse);
|
|
166
|
-
const
|
|
167
|
-
const
|
|
169
|
+
const decodingEnd = process.hrtime.bigint();
|
|
170
|
+
const decodingDuration = Number(decodingEnd - callEnd) / 1000000;
|
|
171
|
+
const totalDuration = Number(decodingEnd - start) / 1000000;
|
|
168
172
|
this.log.trace(`Call messageId=${messageId} ${WorldStateMessageType[messageType]} took (ms)`, {
|
|
169
173
|
totalDuration,
|
|
170
174
|
encodingDuration,
|
|
@@ -177,7 +181,9 @@ export class NativeWorldState {
|
|
|
177
181
|
if (response.msgType !== messageType) {
|
|
178
182
|
throw new Error('Invalid response message type: ' + response.msgType + ' != ' + messageType);
|
|
179
183
|
}
|
|
184
|
+
const callDurationUs = Number(callEnd - encodingEnd) / 1000;
|
|
185
|
+
this.instrumentation.recordRoundTrip(callDurationUs, messageType);
|
|
180
186
|
return response.value;
|
|
181
187
|
}
|
|
182
188
|
}
|
|
183
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
189
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF0aXZlX3dvcmxkX3N0YXRlX2luc3RhbmNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL25hdGl2ZS9uYXRpdmVfd29ybGRfc3RhdGVfaW5zdGFuY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3BELE9BQU8sRUFDTCxjQUFjLEVBQ2QsRUFBRSxFQUNGLGNBQWMsRUFDZCx3QkFBd0IsRUFDeEIscUJBQXFCLEVBQ3JCLDRDQUE0QyxFQUM1QyxxQkFBcUIsRUFDckIscUJBQXFCLEVBQ3JCLHVCQUF1QixHQUN4QixNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFdEQsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sUUFBUSxNQUFNLFVBQVUsQ0FBQztBQUNoQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDMUQsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLElBQUksQ0FBQztBQUMxQixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFHOUMsT0FBTyxFQUNMLGFBQWEsRUFDYixZQUFZLEVBQ1oscUJBQXFCLEdBR3RCLE1BQU0sY0FBYyxDQUFDO0FBRXRCLHFHQUFxRztBQUNyRyxzR0FBc0c7QUFDdEcseUZBQXlGO0FBQ3pGLDJHQUEyRztBQUMzRyw2Q0FBNkM7QUFDN0MsWUFBWSxDQUFDO0lBQ1gsS0FBSyxFQUFFLEVBQUU7SUFDVCxLQUFLLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFO0NBQzNCLENBQUMsQ0FBQztBQU1ILE1BQU0sbUJBQW1CLEdBQUcsa0JBQWtCLENBQUM7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
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { type L1ToL2MessageSource, type L2BlockSource } from '@aztec/circuit-types';
|
|
2
2
|
import { type DataStoreConfig } from '@aztec/kv-store/config';
|
|
3
3
|
import { type TelemetryClient } from '@aztec/telemetry-client';
|
|
4
|
+
import { WorldStateInstrumentation } from '../instrumentation/instrumentation.js';
|
|
4
5
|
import { NativeWorldStateService } from '../native/native_world_state.js';
|
|
5
|
-
import { MerkleTrees } from '../world-state-db/merkle_trees.js';
|
|
6
6
|
import { type WorldStateConfig } from './config.js';
|
|
7
7
|
import { ServerWorldStateSynchronizer } from './server_world_state_synchronizer.js';
|
|
8
8
|
export declare function createWorldStateSynchronizer(config: WorldStateConfig & DataStoreConfig, l2BlockSource: L2BlockSource & L1ToL2MessageSource, client: TelemetryClient): Promise<ServerWorldStateSynchronizer>;
|
|
9
|
-
export declare function createWorldState(config: WorldStateConfig & DataStoreConfig,
|
|
9
|
+
export declare function createWorldState(config: WorldStateConfig & DataStoreConfig, instrumentation: WorldStateInstrumentation): Promise<NativeWorldStateService>;
|
|
10
10
|
//# sourceMappingURL=factory.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/synchronizer/factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,mBAAmB,EAAE,KAAK,aAAa,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/synchronizer/factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,mBAAmB,EAAE,KAAK,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACpF,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE/D,OAAO,EAAE,yBAAyB,EAAE,MAAM,uCAAuC,CAAC;AAClF,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAC1E,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,4BAA4B,EAAE,MAAM,sCAAsC,CAAC;AAEpF,wBAAsB,4BAA4B,CAChD,MAAM,EAAE,gBAAgB,GAAG,eAAe,EAC1C,aAAa,EAAE,aAAa,GAAG,mBAAmB,EAClD,MAAM,EAAE,eAAe,yCAKxB;AAED,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,gBAAgB,GAAG,eAAe,EAC1C,eAAe,EAAE,yBAAyB,oCAyB3C"}
|
|
@@ -1,14 +1,12 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { createStore } from '@aztec/kv-store/lmdb';
|
|
3
|
-
import { NoopTelemetryClient } from '@aztec/telemetry-client/noop';
|
|
1
|
+
import { WorldStateInstrumentation } from '../instrumentation/instrumentation.js';
|
|
4
2
|
import { NativeWorldStateService } from '../native/native_world_state.js';
|
|
5
|
-
import { MerkleTrees } from '../world-state-db/merkle_trees.js';
|
|
6
3
|
import { ServerWorldStateSynchronizer } from './server_world_state_synchronizer.js';
|
|
7
4
|
export async function createWorldStateSynchronizer(config, l2BlockSource, client) {
|
|
8
|
-
const
|
|
9
|
-
|
|
5
|
+
const instrumentation = new WorldStateInstrumentation(client);
|
|
6
|
+
const merkleTrees = await createWorldState(config, instrumentation);
|
|
7
|
+
return new ServerWorldStateSynchronizer(merkleTrees, l2BlockSource, config, instrumentation);
|
|
10
8
|
}
|
|
11
|
-
export async function createWorldState(config,
|
|
9
|
+
export async function createWorldState(config, instrumentation) {
|
|
12
10
|
const newConfig = {
|
|
13
11
|
dataDirectory: config.worldStateDataDirectory ?? config.dataDirectory,
|
|
14
12
|
dataStoreMapSizeKB: config.worldStateDbMapSizeKb ?? config.dataStoreMapSizeKB,
|
|
@@ -17,11 +15,9 @@ export async function createWorldState(config, client = new NoopTelemetryClient(
|
|
|
17
15
|
throw new Error('Rollup address is required to create a world state synchronizer.');
|
|
18
16
|
}
|
|
19
17
|
// If a data directory is provided in config, then create a persistent store.
|
|
20
|
-
const merkleTrees =
|
|
21
|
-
? await
|
|
22
|
-
:
|
|
23
|
-
? await NativeWorldStateService.new(config.l1Contracts.rollupAddress, newConfig.dataDirectory, newConfig.dataStoreMapSizeKB)
|
|
24
|
-
: await NativeWorldStateService.tmp(config.l1Contracts.rollupAddress, !['true', '1'].includes(process.env.DEBUG_WORLD_STATE));
|
|
18
|
+
const merkleTrees = newConfig.dataDirectory
|
|
19
|
+
? await NativeWorldStateService.new(config.l1Contracts.rollupAddress, newConfig.dataDirectory, newConfig.dataStoreMapSizeKB, instrumentation)
|
|
20
|
+
: await NativeWorldStateService.tmp(config.l1Contracts.rollupAddress, !['true', '1'].includes(process.env.DEBUG_WORLD_STATE));
|
|
25
21
|
return merkleTrees;
|
|
26
22
|
}
|
|
27
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
23
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFjdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zeW5jaHJvbml6ZXIvZmFjdG9yeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFJQSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUNsRixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUUxRSxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUVwRixNQUFNLENBQUMsS0FBSyxVQUFVLDRCQUE0QixDQUNoRCxNQUEwQyxFQUMxQyxhQUFrRCxFQUNsRCxNQUF1QjtJQUV2QixNQUFNLGVBQWUsR0FBRyxJQUFJLHlCQUF5QixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzlELE1BQU0sV0FBVyxHQUFHLE1BQU0sZ0JBQWdCLENBQUMsTUFBTSxFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBQ3BFLE9BQU8sSUFBSSw0QkFBNEIsQ0FBQyxXQUFXLEVBQUUsYUFBYSxFQUFFLE1BQU0sRUFBRSxlQUFlLENBQUMsQ0FBQztBQUMvRixDQUFDO0FBRUQsTUFBTSxDQUFDLEtBQUssVUFBVSxnQkFBZ0IsQ0FDcEMsTUFBMEMsRUFDMUMsZUFBMEM7SUFFMUMsTUFBTSxTQUFTLEdBQUc7UUFDaEIsYUFBYSxFQUFFLE1BQU0sQ0FBQyx1QkFBdUIsSUFBSSxNQUFNLENBQUMsYUFBYTtRQUNyRSxrQkFBa0IsRUFBRSxNQUFNLENBQUMscUJBQXFCLElBQUksTUFBTSxDQUFDLGtCQUFrQjtLQUMzRCxDQUFDO0lBRXJCLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLGFBQWEsRUFBRSxDQUFDO1FBQ3ZDLE1BQU0sSUFBSSxLQUFLLENBQUMsa0VBQWtFLENBQUMsQ0FBQztJQUN0RixDQUFDO0lBRUQsNkVBQTZFO0lBQzdFLE1BQU0sV0FBVyxHQUFHLFNBQVMsQ0FBQyxhQUFhO1FBQ3pDLENBQUMsQ0FBQyxNQUFNLHVCQUF1QixDQUFDLEdBQUcsQ0FDL0IsTUFBTSxDQUFDLFdBQVcsQ0FBQyxhQUFhLEVBQ2hDLFNBQVMsQ0FBQyxhQUFhLEVBQ3ZCLFNBQVMsQ0FBQyxrQkFBa0IsRUFDNUIsZUFBZSxDQUNoQjtRQUNILENBQUMsQ0FBQyxNQUFNLHVCQUF1QixDQUFDLEdBQUcsQ0FDL0IsTUFBTSxDQUFDLFdBQVcsQ0FBQyxhQUFhLEVBQ2hDLENBQUMsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsaUJBQWtCLENBQUMsQ0FDeEQsQ0FBQztJQUVOLE9BQU8sV0FBVyxDQUFDO0FBQ3JCLENBQUMifQ==
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
/// <reference types="node" resolution-mode="require"/>
|
|
3
3
|
import { type L1ToL2MessageSource, type L2BlockSource, type L2BlockStream, type L2BlockStreamEvent, type L2BlockStreamEventHandler, type L2BlockStreamLocalDataProvider, type L2Tips, type MerkleTreeReadOperations, type MerkleTreeWriteOperations, type WorldStateSynchronizer, type WorldStateSynchronizerStatus } from '@aztec/circuit-types';
|
|
4
4
|
import { type Fr } from '@aztec/foundation/fields';
|
|
5
|
-
import {
|
|
5
|
+
import { WorldStateInstrumentation } from '../instrumentation/instrumentation.js';
|
|
6
6
|
import { type MerkleTreeAdminDatabase } from '../world-state-db/merkle_tree_db.js';
|
|
7
7
|
import { type WorldStateConfig } from './config.js';
|
|
8
8
|
/**
|
|
@@ -14,6 +14,7 @@ export declare class ServerWorldStateSynchronizer implements WorldStateSynchroni
|
|
|
14
14
|
private readonly merkleTreeDb;
|
|
15
15
|
private readonly l2BlockSource;
|
|
16
16
|
private readonly config;
|
|
17
|
+
private instrumentation;
|
|
17
18
|
private readonly log;
|
|
18
19
|
private readonly merkleTreeCommitted;
|
|
19
20
|
private latestBlockNumberAtStart;
|
|
@@ -22,8 +23,7 @@ export declare class ServerWorldStateSynchronizer implements WorldStateSynchroni
|
|
|
22
23
|
private latestBlockHashQuery;
|
|
23
24
|
private syncPromise;
|
|
24
25
|
protected blockStream: L2BlockStream | undefined;
|
|
25
|
-
|
|
26
|
-
constructor(merkleTreeDb: MerkleTreeAdminDatabase, l2BlockSource: L2BlockSource & L1ToL2MessageSource, config: WorldStateConfig, telemetry: TelemetryClient, log?: import("@aztec/foundation/log").Logger);
|
|
26
|
+
constructor(merkleTreeDb: MerkleTreeAdminDatabase, l2BlockSource: L2BlockSource & L1ToL2MessageSource, config: WorldStateConfig, instrumentation?: WorldStateInstrumentation, log?: import("@aztec/foundation/log").Logger);
|
|
27
27
|
getCommitted(): MerkleTreeReadOperations;
|
|
28
28
|
getSnapshot(blockNumber: number): MerkleTreeReadOperations;
|
|
29
29
|
fork(blockNumber?: number): Promise<MerkleTreeWriteOperations>;
|
|
@@ -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,EACL,KAAK,mBAAmB,EAGxB,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,kBAAkB,EACvB,KAAK,yBAAyB,EAC9B,KAAK,8BAA8B,EACnC,KAAK,MAAM,EAEX,KAAK,wBAAwB,EAC7B,KAAK,yBAAyB,EAE9B,KAAK,sBAAsB,EAC3B,KAAK,4BAA4B,EAClC,MAAM,sBAAsB,CAAC;AAI9B,OAAO,EAAE,KAAK,EAAE,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"server_world_state_synchronizer.d.ts","sourceRoot":"","sources":["../../src/synchronizer/server_world_state_synchronizer.ts"],"names":[],"mappings":";;AAAA,OAAO,EACL,KAAK,mBAAmB,EAGxB,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,kBAAkB,EACvB,KAAK,yBAAyB,EAC9B,KAAK,8BAA8B,EACnC,KAAK,MAAM,EAEX,KAAK,wBAAwB,EAC7B,KAAK,yBAAyB,EAE9B,KAAK,sBAAsB,EAC3B,KAAK,4BAA4B,EAClC,MAAM,sBAAsB,CAAC;AAI9B,OAAO,EAAE,KAAK,EAAE,EAAE,MAAM,0BAA0B,CAAC;AAQnD,OAAO,EAAE,yBAAyB,EAAE,MAAM,uCAAuC,CAAC;AAElF,OAAO,EAAE,KAAK,uBAAuB,EAAE,MAAM,qCAAqC,CAAC;AACnF,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEpD;;;;GAIG;AACH,qBAAa,4BACX,YAAW,sBAAsB,EAAE,8BAA8B,EAAE,yBAAyB;IAa1F,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,eAAe;IACvB,OAAO,CAAC,QAAQ,CAAC,GAAG;IAftB,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAA2B;IAE/D,OAAO,CAAC,wBAAwB,CAAK;IACrC,OAAO,CAAC,aAAa,CAAqB;IAC1C,OAAO,CAAC,YAAY,CAAuD;IAC3E,OAAO,CAAC,oBAAoB,CAA4E;IAExG,OAAO,CAAC,WAAW,CAAgC;IACnD,SAAS,CAAC,WAAW,EAAE,aAAa,GAAG,SAAS,CAAC;gBAG9B,YAAY,EAAE,uBAAuB,EACrC,aAAa,EAAE,aAAa,GAAG,mBAAmB,EAClD,MAAM,EAAE,gBAAgB,EACjC,eAAe,4BAA2D,EACjE,GAAG,yCAA8B;IAW7C,YAAY,IAAI,wBAAwB;IAIxC,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,wBAAwB;IAI1D,IAAI,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,yBAAyB,CAAC;IAIxD,KAAK;IAgClB,SAAS,CAAC,iBAAiB,IAAI,aAAa;IAU/B,IAAI;IASJ,MAAM,IAAI,OAAO,CAAC,4BAA4B,CAAC;IAO/C,oBAAoB;IAIjC;;;;OAIG;IACU,aAAa,CAAC,iBAAiB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAwBvE,oGAAoG;IACvF,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAexE,gGAAgG;IACnF,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC;IAYzC,oDAAoD;IACvC,sBAAsB,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAqB7E;;;;OAIG;YACW,cAAc;IAuB5B;;;;;OAKG;YACW,aAAa;YAkBb,oBAAoB;IAclC,OAAO,CAAC,iBAAiB;YAKX,iBAAiB;IAO/B;;;OAGG;IACH,OAAO,CAAC,eAAe;IAKvB;;;;;OAKG;IACH,SAAS,CAAC,0BAA0B,CAAC,cAAc,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM;CAa1E"}
|
|
@@ -6,23 +6,24 @@ import { promiseWithResolvers } from '@aztec/foundation/promise';
|
|
|
6
6
|
import { elapsed } from '@aztec/foundation/timer';
|
|
7
7
|
import { SHA256Trunc } from '@aztec/merkle-tree';
|
|
8
8
|
import { TraceableL2BlockStream } from '@aztec/telemetry-client';
|
|
9
|
-
import {
|
|
9
|
+
import { NoopTelemetryClient } from '@aztec/telemetry-client/noop';
|
|
10
|
+
import { WorldStateInstrumentation } from '../instrumentation/instrumentation.js';
|
|
10
11
|
/**
|
|
11
12
|
* Synchronizes the world state with the L2 blocks from a L2BlockSource via a block stream.
|
|
12
13
|
* The synchronizer will download the L2 blocks from the L2BlockSource and update the merkle trees.
|
|
13
14
|
* Handles chain reorgs via the L2BlockStream.
|
|
14
15
|
*/
|
|
15
16
|
export class ServerWorldStateSynchronizer {
|
|
16
|
-
constructor(merkleTreeDb, l2BlockSource, config,
|
|
17
|
+
constructor(merkleTreeDb, l2BlockSource, config, instrumentation = new WorldStateInstrumentation(new NoopTelemetryClient()), log = createLogger('world_state')) {
|
|
17
18
|
this.merkleTreeDb = merkleTreeDb;
|
|
18
19
|
this.l2BlockSource = l2BlockSource;
|
|
19
20
|
this.config = config;
|
|
21
|
+
this.instrumentation = instrumentation;
|
|
20
22
|
this.log = log;
|
|
21
23
|
this.latestBlockNumberAtStart = 0;
|
|
22
24
|
this.currentState = WorldStateRunningState.IDLE;
|
|
23
25
|
this.latestBlockHashQuery = undefined;
|
|
24
26
|
this.syncPromise = promiseWithResolvers();
|
|
25
|
-
this.instrumentation = new WorldStateInstrumentation(telemetry);
|
|
26
27
|
this.merkleTreeCommitted = this.merkleTreeDb.getCommitted();
|
|
27
28
|
this.historyToKeep = config.worldStateBlockHistory < 1 ? undefined : config.worldStateBlockHistory;
|
|
28
29
|
this.log.info(`Created world state synchroniser with block history of ${this.historyToKeep === undefined ? 'infinity' : this.historyToKeep}`);
|
|
@@ -253,4 +254,4 @@ export class ServerWorldStateSynchronizer {
|
|
|
253
254
|
}
|
|
254
255
|
}
|
|
255
256
|
}
|
|
256
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyX3dvcmxkX3N0YXRlX3N5bmNocm9uaXplci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zeW5jaHJvbml6ZXIvc2VydmVyX3dvcmxkX3N0YXRlX3N5bmNocm9uaXplci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBVUwsWUFBWSxFQUdaLHNCQUFzQixHQUd2QixNQUFNLHNCQUFzQixDQUFDO0FBRTlCLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzFELE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRTNFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDbEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2pELE9BQU8sRUFBd0Isc0JBQXNCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUt2RixPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUVqRTs7OztHQUlHO0FBQ0gsTUFBTSxPQUFPLDRCQUE0QjtJQWN2QyxZQUNtQixZQUFxQyxFQUNyQyxhQUFrRCxFQUNsRCxNQUF3QixFQUN6QyxTQUEwQixFQUNULE1BQU0sWUFBWSxDQUFDLGFBQWEsQ0FBQztRQUpqQyxpQkFBWSxHQUFaLFlBQVksQ0FBeUI7UUFDckMsa0JBQWEsR0FBYixhQUFhLENBQXFDO1FBQ2xELFdBQU0sR0FBTixNQUFNLENBQWtCO1FBRXhCLFFBQUcsR0FBSCxHQUFHLENBQThCO1FBZDVDLDZCQUF3QixHQUFHLENBQUMsQ0FBQztRQUU3QixpQkFBWSxHQUEyQixzQkFBc0IsQ0FBQyxJQUFJLENBQUM7UUFDbkUseUJBQW9CLEdBQWtFLFNBQVMs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
|
|
257
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyX3dvcmxkX3N0YXRlX3N5bmNocm9uaXplci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zeW5jaHJvbml6ZXIvc2VydmVyX3dvcmxkX3N0YXRlX3N5bmNocm9uaXplci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBVUwsWUFBWSxFQUdaLHNCQUFzQixHQUd2QixNQUFNLHNCQUFzQixDQUFDO0FBRTlCLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzFELE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRTNFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDbEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRW5FLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBS2xGOzs7O0dBSUc7QUFDSCxNQUFNLE9BQU8sNEJBQTRCO0lBYXZDLFlBQ21CLFlBQXFDLEVBQ3JDLGFBQWtELEVBQ2xELE1BQXdCLEVBQ2pDLGtCQUFrQixJQUFJLHlCQUF5QixDQUFDLElBQUksbUJBQW1CLEVBQUUsQ0FBQyxFQUNqRSxNQUFNLFlBQVksQ0FBQyxhQUFhLENBQUM7UUFKakMsaUJBQVksR0FBWixZQUFZLENBQXlCO1FBQ3JDLGtCQUFhLEdBQWIsYUFBYSxDQUFxQztRQUNsRCxXQUFNLEdBQU4sTUFBTSxDQUFrQjtRQUNqQyxvQkFBZSxHQUFmLGVBQWUsQ0FBMkQ7UUFDakUs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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.68.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": "./dest/index.js",
|
|
@@ -21,8 +21,8 @@
|
|
|
21
21
|
"clean": "rm -rf ./dest ./build .tsbuildinfo",
|
|
22
22
|
"formatting": "run -T prettier --check ./src && run -T eslint ./src",
|
|
23
23
|
"formatting:fix": "run -T eslint --fix ./src && run -T prettier -w ./src",
|
|
24
|
-
"
|
|
25
|
-
"
|
|
24
|
+
"generate": "mkdir -p build && cp -v ../../barretenberg/cpp/build-pic/lib/world_state_napi.node build",
|
|
25
|
+
"test": "HARDWARE_CONCURRENCY=16 RAYON_NUM_THREADS=4 NODE_NO_WARNINGS=1 node --experimental-vm-modules ../node_modules/.bin/jest --passWithNoTests --maxWorkers=8"
|
|
26
26
|
},
|
|
27
27
|
"inherits": [
|
|
28
28
|
"../package.common.json",
|
|
@@ -55,9 +55,9 @@
|
|
|
55
55
|
],
|
|
56
56
|
"reporters": [
|
|
57
57
|
[
|
|
58
|
-
"
|
|
58
|
+
"jest-silent-reporter",
|
|
59
59
|
{
|
|
60
|
-
"
|
|
60
|
+
"useDots": true
|
|
61
61
|
}
|
|
62
62
|
]
|
|
63
63
|
],
|
|
@@ -67,13 +67,13 @@
|
|
|
67
67
|
]
|
|
68
68
|
},
|
|
69
69
|
"dependencies": {
|
|
70
|
-
"@aztec/circuit-types": "0.
|
|
71
|
-
"@aztec/circuits.js": "0.
|
|
72
|
-
"@aztec/foundation": "0.
|
|
73
|
-
"@aztec/kv-store": "0.
|
|
74
|
-
"@aztec/merkle-tree": "0.
|
|
75
|
-
"@aztec/telemetry-client": "0.
|
|
76
|
-
"@aztec/types": "0.
|
|
70
|
+
"@aztec/circuit-types": "0.68.0",
|
|
71
|
+
"@aztec/circuits.js": "0.68.0",
|
|
72
|
+
"@aztec/foundation": "0.68.0",
|
|
73
|
+
"@aztec/kv-store": "0.68.0",
|
|
74
|
+
"@aztec/merkle-tree": "0.68.0",
|
|
75
|
+
"@aztec/telemetry-client": "0.68.0",
|
|
76
|
+
"@aztec/types": "0.68.0",
|
|
77
77
|
"bindings": "^1.5.0",
|
|
78
78
|
"msgpackr": "^1.10.2",
|
|
79
79
|
"tslib": "^2.4.0",
|
|
@@ -1,8 +1,21 @@
|
|
|
1
1
|
import { MerkleTreeId } from '@aztec/circuit-types';
|
|
2
2
|
import { createLogger } from '@aztec/foundation/log';
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
import {
|
|
4
|
+
Attributes,
|
|
5
|
+
type Gauge,
|
|
6
|
+
type Histogram,
|
|
7
|
+
Metrics,
|
|
8
|
+
type TelemetryClient,
|
|
9
|
+
ValueType,
|
|
10
|
+
} from '@aztec/telemetry-client';
|
|
11
|
+
|
|
12
|
+
import {
|
|
13
|
+
type DBStats,
|
|
14
|
+
type TreeDBStats,
|
|
15
|
+
type TreeMeta,
|
|
16
|
+
WorldStateMessageType,
|
|
17
|
+
type WorldStateStatusFull,
|
|
18
|
+
} from '../native/message.js';
|
|
6
19
|
|
|
7
20
|
type DBTypeString = 'leaf_preimage' | 'leaf_indices' | 'nodes' | 'blocks' | 'block_indices';
|
|
8
21
|
|
|
@@ -14,43 +27,50 @@ export class WorldStateInstrumentation {
|
|
|
14
27
|
private oldestBlock: Gauge;
|
|
15
28
|
private dbNumItems: Gauge;
|
|
16
29
|
private dbUsedSize: Gauge;
|
|
30
|
+
private requestHistogram: Histogram;
|
|
17
31
|
|
|
18
32
|
constructor(public readonly telemetry: TelemetryClient, private log = createLogger('world-state:instrumentation')) {
|
|
19
33
|
const meter = telemetry.getMeter('World State');
|
|
20
|
-
this.dbMapSize = meter.createGauge(
|
|
34
|
+
this.dbMapSize = meter.createGauge(Metrics.WORLD_STATE_DB_MAP_SIZE, {
|
|
21
35
|
description: `The current configured map size for each merkle tree`,
|
|
22
36
|
valueType: ValueType.INT,
|
|
23
37
|
});
|
|
24
38
|
|
|
25
|
-
this.treeSize = meter.createGauge(
|
|
39
|
+
this.treeSize = meter.createGauge(Metrics.WORLD_STATE_TREE_SIZE, {
|
|
26
40
|
description: `The current number of leaves in each merkle tree`,
|
|
27
41
|
valueType: ValueType.INT,
|
|
28
42
|
});
|
|
29
43
|
|
|
30
|
-
this.unfinalisedHeight = meter.createGauge(
|
|
44
|
+
this.unfinalisedHeight = meter.createGauge(Metrics.WORLD_STATE_UNFINALISED_HEIGHT, {
|
|
31
45
|
description: `The unfinalised block height of each merkle tree`,
|
|
32
46
|
valueType: ValueType.INT,
|
|
33
47
|
});
|
|
34
48
|
|
|
35
|
-
this.finalisedHeight = meter.createGauge(
|
|
49
|
+
this.finalisedHeight = meter.createGauge(Metrics.WORLD_STATE_FINALISED_HEIGHT, {
|
|
36
50
|
description: `The finalised block height of each merkle tree`,
|
|
37
51
|
valueType: ValueType.INT,
|
|
38
52
|
});
|
|
39
53
|
|
|
40
|
-
this.oldestBlock = meter.createGauge(
|
|
54
|
+
this.oldestBlock = meter.createGauge(Metrics.WORLD_STATE_OLDEST_BLOCK, {
|
|
41
55
|
description: `The oldest historical block of each merkle tree`,
|
|
42
56
|
valueType: ValueType.INT,
|
|
43
57
|
});
|
|
44
58
|
|
|
45
|
-
this.dbUsedSize = meter.createGauge(
|
|
59
|
+
this.dbUsedSize = meter.createGauge(Metrics.WORLD_STATE_DB_USED_SIZE, {
|
|
46
60
|
description: `The current used database size for each db of each merkle tree`,
|
|
47
61
|
valueType: ValueType.INT,
|
|
48
62
|
});
|
|
49
63
|
|
|
50
|
-
this.dbNumItems = meter.createGauge(
|
|
64
|
+
this.dbNumItems = meter.createGauge(Metrics.WORLD_STATE_DB_NUM_ITEMS, {
|
|
51
65
|
description: `The current number of items in each database of each merkle tree`,
|
|
52
66
|
valueType: ValueType.INT,
|
|
53
67
|
});
|
|
68
|
+
|
|
69
|
+
this.requestHistogram = meter.createHistogram(Metrics.WORLD_STATE_REQUEST_TIME, {
|
|
70
|
+
description: 'The round trip time of world state requests',
|
|
71
|
+
unit: 'us',
|
|
72
|
+
valueType: ValueType.INT,
|
|
73
|
+
});
|
|
54
74
|
}
|
|
55
75
|
|
|
56
76
|
private updateTreeStats(treeDbStats: TreeDBStats, treeMeta: TreeMeta, tree: MerkleTreeId) {
|
|
@@ -119,4 +139,10 @@ export class WorldStateInstrumentation {
|
|
|
119
139
|
MerkleTreeId.PUBLIC_DATA_TREE,
|
|
120
140
|
);
|
|
121
141
|
}
|
|
142
|
+
|
|
143
|
+
public recordRoundTrip(timeUs: number, request: WorldStateMessageType) {
|
|
144
|
+
this.requestHistogram.record(Math.ceil(timeUs), {
|
|
145
|
+
[Attributes.WORLD_STATE_REQUEST_TYPE]: WorldStateMessageType[request],
|
|
146
|
+
});
|
|
147
|
+
}
|
|
122
148
|
}
|
|
@@ -21,12 +21,14 @@ import {
|
|
|
21
21
|
} from '@aztec/circuits.js';
|
|
22
22
|
import { padArrayEnd } from '@aztec/foundation/collection';
|
|
23
23
|
import { createLogger } from '@aztec/foundation/log';
|
|
24
|
+
import { NoopTelemetryClient } from '@aztec/telemetry-client/noop';
|
|
24
25
|
|
|
25
26
|
import assert from 'assert/strict';
|
|
26
27
|
import { mkdir, mkdtemp, rm } from 'fs/promises';
|
|
27
28
|
import { tmpdir } from 'os';
|
|
28
29
|
import { join } from 'path';
|
|
29
30
|
|
|
31
|
+
import { WorldStateInstrumentation } from '../instrumentation/instrumentation.js';
|
|
30
32
|
import { type MerkleTreeAdminDatabase as MerkleTreeDatabase } from '../world-state-db/merkle_tree_db.js';
|
|
31
33
|
import { MerkleTreesFacade, MerkleTreesForkFacade, serializeLeaf } from './merkle_trees_facade.js';
|
|
32
34
|
import {
|
|
@@ -58,6 +60,7 @@ export class NativeWorldStateService implements MerkleTreeDatabase {
|
|
|
58
60
|
|
|
59
61
|
protected constructor(
|
|
60
62
|
protected readonly instance: NativeWorldState,
|
|
63
|
+
protected readonly worldStateInstrumentation: WorldStateInstrumentation,
|
|
61
64
|
protected readonly log = createLogger('world-state:database'),
|
|
62
65
|
private readonly cleanup = () => Promise.resolve(),
|
|
63
66
|
) {}
|
|
@@ -66,6 +69,7 @@ export class NativeWorldStateService implements MerkleTreeDatabase {
|
|
|
66
69
|
rollupAddress: EthAddress,
|
|
67
70
|
dataDir: string,
|
|
68
71
|
dbMapSizeKb: number,
|
|
72
|
+
instrumentation = new WorldStateInstrumentation(new NoopTelemetryClient()),
|
|
69
73
|
log = createLogger('world-state:database'),
|
|
70
74
|
cleanup = () => Promise.resolve(),
|
|
71
75
|
): Promise<NativeWorldStateService> {
|
|
@@ -89,8 +93,8 @@ export class NativeWorldStateService implements MerkleTreeDatabase {
|
|
|
89
93
|
await mkdir(worldStateDirectory, { recursive: true });
|
|
90
94
|
await newWorldStateVersion.writeVersionFile(versionFile);
|
|
91
95
|
|
|
92
|
-
const instance = new NativeWorldState(worldStateDirectory, dbMapSizeKb);
|
|
93
|
-
const worldState = new this(instance, log, cleanup);
|
|
96
|
+
const instance = new NativeWorldState(worldStateDirectory, dbMapSizeKb, instrumentation);
|
|
97
|
+
const worldState = new this(instance, instrumentation, log, cleanup);
|
|
94
98
|
try {
|
|
95
99
|
await worldState.init();
|
|
96
100
|
} catch (e) {
|
|
@@ -101,7 +105,11 @@ export class NativeWorldStateService implements MerkleTreeDatabase {
|
|
|
101
105
|
return worldState;
|
|
102
106
|
}
|
|
103
107
|
|
|
104
|
-
static async tmp(
|
|
108
|
+
static async tmp(
|
|
109
|
+
rollupAddress = EthAddress.ZERO,
|
|
110
|
+
cleanupTmpDir = true,
|
|
111
|
+
instrumentation = new WorldStateInstrumentation(new NoopTelemetryClient()),
|
|
112
|
+
): Promise<NativeWorldStateService> {
|
|
105
113
|
const log = createLogger('world-state:database');
|
|
106
114
|
const dataDir = await mkdtemp(join(tmpdir(), 'aztec-world-state-'));
|
|
107
115
|
const dbMapSizeKb = 10 * 1024 * 1024;
|
|
@@ -117,7 +125,7 @@ export class NativeWorldStateService implements MerkleTreeDatabase {
|
|
|
117
125
|
}
|
|
118
126
|
};
|
|
119
127
|
|
|
120
|
-
return this.new(rollupAddress, dataDir, dbMapSizeKb, log, cleanup);
|
|
128
|
+
return this.new(rollupAddress, dataDir, dbMapSizeKb, instrumentation, log, cleanup);
|
|
121
129
|
}
|
|
122
130
|
|
|
123
131
|
protected async init() {
|
|
@@ -12,7 +12,6 @@ import {
|
|
|
12
12
|
} from '@aztec/circuits.js';
|
|
13
13
|
import { createLogger } from '@aztec/foundation/log';
|
|
14
14
|
import { SerialQueue } from '@aztec/foundation/queue';
|
|
15
|
-
import { Timer } from '@aztec/foundation/timer';
|
|
16
15
|
|
|
17
16
|
import assert from 'assert';
|
|
18
17
|
import bindings from 'bindings';
|
|
@@ -20,6 +19,7 @@ import { Decoder, Encoder, addExtension } from 'msgpackr';
|
|
|
20
19
|
import { cpus } from 'os';
|
|
21
20
|
import { isAnyArrayBuffer } from 'util/types';
|
|
22
21
|
|
|
22
|
+
import { type WorldStateInstrumentation } from '../instrumentation/instrumentation.js';
|
|
23
23
|
import {
|
|
24
24
|
MessageHeader,
|
|
25
25
|
TypedMessage,
|
|
@@ -46,7 +46,7 @@ const NATIVE_LIBRARY_NAME = 'world_state_napi';
|
|
|
46
46
|
const NATIVE_CLASS_NAME = 'WorldState';
|
|
47
47
|
|
|
48
48
|
const NATIVE_MODULE = bindings(NATIVE_LIBRARY_NAME);
|
|
49
|
-
const MAX_WORLD_STATE_THREADS = 16;
|
|
49
|
+
const MAX_WORLD_STATE_THREADS = +(process.env.HARDWARE_CONCURRENCY || '16');
|
|
50
50
|
|
|
51
51
|
export interface NativeWorldStateInstance {
|
|
52
52
|
call<T extends WorldStateMessageType>(messageType: T, body: WorldStateRequest[T]): Promise<WorldStateResponse[T]>;
|
|
@@ -82,8 +82,16 @@ export class NativeWorldState implements NativeWorldStateInstance {
|
|
|
82
82
|
private queue = new SerialQueue();
|
|
83
83
|
|
|
84
84
|
/** Creates a new native WorldState instance */
|
|
85
|
-
constructor(
|
|
86
|
-
|
|
85
|
+
constructor(
|
|
86
|
+
dataDir: string,
|
|
87
|
+
dbMapSizeKb: number,
|
|
88
|
+
private instrumentation: WorldStateInstrumentation,
|
|
89
|
+
private log = createLogger('world-state:database'),
|
|
90
|
+
) {
|
|
91
|
+
const threads = Math.min(cpus().length, MAX_WORLD_STATE_THREADS);
|
|
92
|
+
log.info(
|
|
93
|
+
`Creating world state data store at directory ${dataDir} with map size ${dbMapSizeKb} KB and ${threads} threads.`,
|
|
94
|
+
);
|
|
87
95
|
this.instance = new NATIVE_MODULE[NATIVE_CLASS_NAME](
|
|
88
96
|
dataDir,
|
|
89
97
|
{
|
|
@@ -99,7 +107,7 @@ export class NativeWorldState implements NativeWorldStateInstance {
|
|
|
99
107
|
},
|
|
100
108
|
GeneratorIndex.BLOCK_HASH,
|
|
101
109
|
dbMapSizeKb,
|
|
102
|
-
|
|
110
|
+
threads,
|
|
103
111
|
);
|
|
104
112
|
this.queue.start();
|
|
105
113
|
}
|
|
@@ -197,11 +205,12 @@ export class NativeWorldState implements NativeWorldStateInstance {
|
|
|
197
205
|
this.log.trace(`Calling messageId=${messageId} ${WorldStateMessageType[messageType]}`);
|
|
198
206
|
}
|
|
199
207
|
|
|
200
|
-
const
|
|
208
|
+
const start = process.hrtime.bigint();
|
|
201
209
|
|
|
202
210
|
const request = new TypedMessage(messageType, new MessageHeader({ messageId }), body);
|
|
203
211
|
const encodedRequest = this.encoder.encode(request);
|
|
204
|
-
const
|
|
212
|
+
const encodingEnd = process.hrtime.bigint();
|
|
213
|
+
const encodingDuration = Number(encodingEnd - start) / 1_000_000;
|
|
205
214
|
|
|
206
215
|
let encodedResponse: any;
|
|
207
216
|
try {
|
|
@@ -211,7 +220,9 @@ export class NativeWorldState implements NativeWorldStateInstance {
|
|
|
211
220
|
throw error;
|
|
212
221
|
}
|
|
213
222
|
|
|
214
|
-
const
|
|
223
|
+
const callEnd = process.hrtime.bigint();
|
|
224
|
+
|
|
225
|
+
const callDuration = Number(callEnd - encodingEnd) / 1_000_000;
|
|
215
226
|
|
|
216
227
|
const buf = Buffer.isBuffer(encodedResponse)
|
|
217
228
|
? encodedResponse
|
|
@@ -235,8 +246,9 @@ export class NativeWorldState implements NativeWorldStateInstance {
|
|
|
235
246
|
}
|
|
236
247
|
|
|
237
248
|
const response = TypedMessage.fromMessagePack<T, WorldStateResponse[T]>(decodedResponse);
|
|
238
|
-
const
|
|
239
|
-
const
|
|
249
|
+
const decodingEnd = process.hrtime.bigint();
|
|
250
|
+
const decodingDuration = Number(decodingEnd - callEnd) / 1_000_000;
|
|
251
|
+
const totalDuration = Number(decodingEnd - start) / 1_000_000;
|
|
240
252
|
this.log.trace(`Call messageId=${messageId} ${WorldStateMessageType[messageType]} took (ms)`, {
|
|
241
253
|
totalDuration,
|
|
242
254
|
encodingDuration,
|
|
@@ -254,6 +266,9 @@ export class NativeWorldState implements NativeWorldStateInstance {
|
|
|
254
266
|
throw new Error('Invalid response message type: ' + response.msgType + ' != ' + messageType);
|
|
255
267
|
}
|
|
256
268
|
|
|
269
|
+
const callDurationUs = Number(callEnd - encodingEnd) / 1000;
|
|
270
|
+
this.instrumentation.recordRoundTrip(callDurationUs, messageType);
|
|
271
|
+
|
|
257
272
|
return response.value;
|
|
258
273
|
}
|
|
259
274
|
}
|
|
@@ -1,12 +1,9 @@
|
|
|
1
1
|
import { type L1ToL2MessageSource, type L2BlockSource } from '@aztec/circuit-types';
|
|
2
|
-
import { createLogger } from '@aztec/foundation/log';
|
|
3
2
|
import { type DataStoreConfig } from '@aztec/kv-store/config';
|
|
4
|
-
import { createStore } from '@aztec/kv-store/lmdb';
|
|
5
3
|
import { type TelemetryClient } from '@aztec/telemetry-client';
|
|
6
|
-
import { NoopTelemetryClient } from '@aztec/telemetry-client/noop';
|
|
7
4
|
|
|
5
|
+
import { WorldStateInstrumentation } from '../instrumentation/instrumentation.js';
|
|
8
6
|
import { NativeWorldStateService } from '../native/native_world_state.js';
|
|
9
|
-
import { MerkleTrees } from '../world-state-db/merkle_trees.js';
|
|
10
7
|
import { type WorldStateConfig } from './config.js';
|
|
11
8
|
import { ServerWorldStateSynchronizer } from './server_world_state_synchronizer.js';
|
|
12
9
|
|
|
@@ -15,13 +12,14 @@ export async function createWorldStateSynchronizer(
|
|
|
15
12
|
l2BlockSource: L2BlockSource & L1ToL2MessageSource,
|
|
16
13
|
client: TelemetryClient,
|
|
17
14
|
) {
|
|
18
|
-
const
|
|
19
|
-
|
|
15
|
+
const instrumentation = new WorldStateInstrumentation(client);
|
|
16
|
+
const merkleTrees = await createWorldState(config, instrumentation);
|
|
17
|
+
return new ServerWorldStateSynchronizer(merkleTrees, l2BlockSource, config, instrumentation);
|
|
20
18
|
}
|
|
21
19
|
|
|
22
20
|
export async function createWorldState(
|
|
23
21
|
config: WorldStateConfig & DataStoreConfig,
|
|
24
|
-
|
|
22
|
+
instrumentation: WorldStateInstrumentation,
|
|
25
23
|
) {
|
|
26
24
|
const newConfig = {
|
|
27
25
|
dataDirectory: config.worldStateDataDirectory ?? config.dataDirectory,
|
|
@@ -33,13 +31,12 @@ export async function createWorldState(
|
|
|
33
31
|
}
|
|
34
32
|
|
|
35
33
|
// If a data directory is provided in config, then create a persistent store.
|
|
36
|
-
const merkleTrees =
|
|
37
|
-
? await MerkleTrees.new(await createStore('world-state', newConfig, createLogger('world-state:lmdb')), client)
|
|
38
|
-
: newConfig.dataDirectory
|
|
34
|
+
const merkleTrees = newConfig.dataDirectory
|
|
39
35
|
? await NativeWorldStateService.new(
|
|
40
36
|
config.l1Contracts.rollupAddress,
|
|
41
37
|
newConfig.dataDirectory,
|
|
42
38
|
newConfig.dataStoreMapSizeKB,
|
|
39
|
+
instrumentation,
|
|
43
40
|
)
|
|
44
41
|
: await NativeWorldStateService.tmp(
|
|
45
42
|
config.l1Contracts.rollupAddress,
|
|
@@ -23,12 +23,13 @@ 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 {
|
|
26
|
+
import { TraceableL2BlockStream } from '@aztec/telemetry-client';
|
|
27
|
+
import { NoopTelemetryClient } from '@aztec/telemetry-client/noop';
|
|
27
28
|
|
|
29
|
+
import { WorldStateInstrumentation } from '../instrumentation/instrumentation.js';
|
|
28
30
|
import { type WorldStateStatusFull } from '../native/message.js';
|
|
29
31
|
import { type MerkleTreeAdminDatabase } from '../world-state-db/merkle_tree_db.js';
|
|
30
32
|
import { type WorldStateConfig } from './config.js';
|
|
31
|
-
import { WorldStateInstrumentation } from './instrumentation.js';
|
|
32
33
|
|
|
33
34
|
/**
|
|
34
35
|
* Synchronizes the world state with the L2 blocks from a L2BlockSource via a block stream.
|
|
@@ -47,16 +48,14 @@ export class ServerWorldStateSynchronizer
|
|
|
47
48
|
|
|
48
49
|
private syncPromise = promiseWithResolvers<void>();
|
|
49
50
|
protected blockStream: L2BlockStream | undefined;
|
|
50
|
-
private instrumentation: WorldStateInstrumentation;
|
|
51
51
|
|
|
52
52
|
constructor(
|
|
53
53
|
private readonly merkleTreeDb: MerkleTreeAdminDatabase,
|
|
54
54
|
private readonly l2BlockSource: L2BlockSource & L1ToL2MessageSource,
|
|
55
55
|
private readonly config: WorldStateConfig,
|
|
56
|
-
|
|
56
|
+
private instrumentation = new WorldStateInstrumentation(new NoopTelemetryClient()),
|
|
57
57
|
private readonly log = createLogger('world_state'),
|
|
58
58
|
) {
|
|
59
|
-
this.instrumentation = new WorldStateInstrumentation(telemetry);
|
|
60
59
|
this.merkleTreeCommitted = this.merkleTreeDb.getCommitted();
|
|
61
60
|
this.historyToKeep = config.worldStateBlockHistory < 1 ? undefined : config.worldStateBlockHistory;
|
|
62
61
|
this.log.info(
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"instrumentation.d.ts","sourceRoot":"","sources":["../../src/synchronizer/instrumentation.ts"],"names":[],"mappings":"AAEA,OAAO,EAA0B,KAAK,eAAe,EAAa,MAAM,yBAAyB,CAAC;AAElG,OAAO,EAAiD,KAAK,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAIhH,qBAAa,yBAAyB;aASR,SAAS,EAAE,eAAe;IAAE,OAAO,CAAC,GAAG;IARnE,OAAO,CAAC,SAAS,CAAQ;IACzB,OAAO,CAAC,QAAQ,CAAQ;IACxB,OAAO,CAAC,iBAAiB,CAAQ;IACjC,OAAO,CAAC,eAAe,CAAQ;IAC/B,OAAO,CAAC,WAAW,CAAQ;IAC3B,OAAO,CAAC,UAAU,CAAQ;IAC1B,OAAO,CAAC,UAAU,CAAQ;gBAEE,SAAS,EAAE,eAAe,EAAU,GAAG,yCAA8C;IAsCjH,OAAO,CAAC,eAAe;IAwBvB,OAAO,CAAC,iBAAiB;IAWlB,uBAAuB,CAAC,gBAAgB,EAAE,oBAAoB;CA+BtE"}
|
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
import { MerkleTreeId } from '@aztec/circuit-types';
|
|
2
|
-
import { createLogger } from '@aztec/foundation/log';
|
|
3
|
-
import { Attributes, ValueType } from '@aztec/telemetry-client';
|
|
4
|
-
export class WorldStateInstrumentation {
|
|
5
|
-
constructor(telemetry, log = createLogger('world-state:instrumentation')) {
|
|
6
|
-
this.telemetry = telemetry;
|
|
7
|
-
this.log = log;
|
|
8
|
-
const meter = telemetry.getMeter('World State');
|
|
9
|
-
this.dbMapSize = meter.createGauge(`aztec.world_state.db_map_size`, {
|
|
10
|
-
description: `The current configured map size for each merkle tree`,
|
|
11
|
-
valueType: ValueType.INT,
|
|
12
|
-
});
|
|
13
|
-
this.treeSize = meter.createGauge(`aztec.world_state.tree_size`, {
|
|
14
|
-
description: `The current number of leaves in each merkle tree`,
|
|
15
|
-
valueType: ValueType.INT,
|
|
16
|
-
});
|
|
17
|
-
this.unfinalisedHeight = meter.createGauge(`aztec.world_state.unfinalised_height`, {
|
|
18
|
-
description: `The unfinalised block height of each merkle tree`,
|
|
19
|
-
valueType: ValueType.INT,
|
|
20
|
-
});
|
|
21
|
-
this.finalisedHeight = meter.createGauge(`aztec.world_state.finalised_height`, {
|
|
22
|
-
description: `The finalised block height of each merkle tree`,
|
|
23
|
-
valueType: ValueType.INT,
|
|
24
|
-
});
|
|
25
|
-
this.oldestBlock = meter.createGauge(`aztec.world_state.oldest_block`, {
|
|
26
|
-
description: `The oldest historical block of each merkle tree`,
|
|
27
|
-
valueType: ValueType.INT,
|
|
28
|
-
});
|
|
29
|
-
this.dbUsedSize = meter.createGauge(`aztec.world_state.db_used_size`, {
|
|
30
|
-
description: `The current used database size for each db of each merkle tree`,
|
|
31
|
-
valueType: ValueType.INT,
|
|
32
|
-
});
|
|
33
|
-
this.dbNumItems = meter.createGauge(`aztec.world_state.db_num_items`, {
|
|
34
|
-
description: `The current number of items in each database of each merkle tree`,
|
|
35
|
-
valueType: ValueType.INT,
|
|
36
|
-
});
|
|
37
|
-
}
|
|
38
|
-
updateTreeStats(treeDbStats, treeMeta, tree) {
|
|
39
|
-
this.dbMapSize.record(Number(treeDbStats.mapSize), {
|
|
40
|
-
[Attributes.MERKLE_TREE_NAME]: MerkleTreeId[tree],
|
|
41
|
-
});
|
|
42
|
-
this.treeSize.record(Number(treeMeta.size), {
|
|
43
|
-
[Attributes.MERKLE_TREE_NAME]: MerkleTreeId[tree],
|
|
44
|
-
});
|
|
45
|
-
this.unfinalisedHeight.record(Number(treeMeta.unfinalisedBlockHeight), {
|
|
46
|
-
[Attributes.MERKLE_TREE_NAME]: MerkleTreeId[tree],
|
|
47
|
-
});
|
|
48
|
-
this.finalisedHeight.record(Number(treeMeta.finalisedBlockHeight), {
|
|
49
|
-
[Attributes.MERKLE_TREE_NAME]: MerkleTreeId[tree],
|
|
50
|
-
});
|
|
51
|
-
this.oldestBlock.record(Number(treeMeta.oldestHistoricBlock), {
|
|
52
|
-
[Attributes.MERKLE_TREE_NAME]: MerkleTreeId[tree],
|
|
53
|
-
});
|
|
54
|
-
this.updateTreeDBStats(treeDbStats.blockIndicesDBStats, 'block_indices', tree);
|
|
55
|
-
this.updateTreeDBStats(treeDbStats.blocksDBStats, 'blocks', tree);
|
|
56
|
-
this.updateTreeDBStats(treeDbStats.leafIndicesDBStats, 'leaf_indices', tree);
|
|
57
|
-
this.updateTreeDBStats(treeDbStats.leafPreimagesDBStats, 'leaf_preimage', tree);
|
|
58
|
-
this.updateTreeDBStats(treeDbStats.nodesDBStats, 'nodes', tree);
|
|
59
|
-
}
|
|
60
|
-
updateTreeDBStats(dbStats, dbType, tree) {
|
|
61
|
-
this.dbNumItems.record(Number(dbStats.numDataItems), {
|
|
62
|
-
[Attributes.WS_DB_DATA_TYPE]: dbType,
|
|
63
|
-
[Attributes.MERKLE_TREE_NAME]: MerkleTreeId[tree],
|
|
64
|
-
});
|
|
65
|
-
this.dbUsedSize.record(Number(dbStats.totalUsedSize), {
|
|
66
|
-
[Attributes.WS_DB_DATA_TYPE]: dbType,
|
|
67
|
-
[Attributes.MERKLE_TREE_NAME]: MerkleTreeId[tree],
|
|
68
|
-
});
|
|
69
|
-
}
|
|
70
|
-
updateWorldStateMetrics(worldStateStatus) {
|
|
71
|
-
this.updateTreeStats(worldStateStatus.dbStats.archiveTreeStats, worldStateStatus.meta.archiveTreeMeta, MerkleTreeId.ARCHIVE);
|
|
72
|
-
this.updateTreeStats(worldStateStatus.dbStats.messageTreeStats, worldStateStatus.meta.messageTreeMeta, MerkleTreeId.L1_TO_L2_MESSAGE_TREE);
|
|
73
|
-
this.updateTreeStats(worldStateStatus.dbStats.noteHashTreeStats, worldStateStatus.meta.noteHashTreeMeta, MerkleTreeId.NOTE_HASH_TREE);
|
|
74
|
-
this.updateTreeStats(worldStateStatus.dbStats.nullifierTreeStats, worldStateStatus.meta.nullifierTreeMeta, MerkleTreeId.NULLIFIER_TREE);
|
|
75
|
-
this.updateTreeStats(worldStateStatus.dbStats.publicDataTreeStats, worldStateStatus.meta.publicDataTreeMeta, MerkleTreeId.PUBLIC_DATA_TREE);
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdHJ1bWVudGF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N5bmNocm9uaXplci9pbnN0cnVtZW50YXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsVUFBVSxFQUFvQyxTQUFTLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQU1sRyxNQUFNLE9BQU8seUJBQXlCO0lBU3BDLFlBQTRCLFNBQTBCLEVBQVUsTUFBTSxZQUFZLENBQUMsNkJBQTZCLENBQUM7UUFBckYsY0FBUyxHQUFULFNBQVMsQ0FBaUI7UUFBVSxRQUFHLEdBQUgsR0FBRyxDQUE4QztRQUMvRyxNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ2hELElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDLFdBQVcsQ0FBQywrQkFBK0IsRUFBRTtZQUNsRSxXQUFXLEVBQUUsc0RBQXNEO1lBQ25FLFNBQVMsRUFBRSxTQUFTLENBQUMsR0FBRztTQUN6QixDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUMsNkJBQTZCLEVBQUU7WUFDL0QsV0FBVyxFQUFFLGtEQUFrRDtZQUMvRCxTQUFTLEVBQUUsU0FBUyxDQUFDLEdBQUc7U0FDekIsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUMsc0NBQXNDLEVBQUU7WUFDakYsV0FBVyxFQUFFLGtEQUFrRDtZQUMvRCxTQUFTLEVBQUUsU0FBUyxDQUFDLEdBQUc7U0FDekIsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUMsV0FBVyxDQUFDLG9DQUFvQyxFQUFFO1lB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
|