@aztec/world-state 0.0.0-test.1 → 0.0.1-commit.5476d83
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/index.d.ts +1 -1
- package/dest/instrumentation/instrumentation.d.ts +6 -4
- package/dest/instrumentation/instrumentation.d.ts.map +1 -1
- package/dest/instrumentation/instrumentation.js +16 -8
- package/dest/native/bench_metrics.d.ts +23 -0
- package/dest/native/bench_metrics.d.ts.map +1 -0
- package/dest/native/bench_metrics.js +81 -0
- package/dest/native/fork_checkpoint.d.ts +1 -1
- package/dest/native/fork_checkpoint.d.ts.map +1 -1
- package/dest/native/index.d.ts +1 -1
- package/dest/native/merkle_trees_facade.d.ts +10 -4
- package/dest/native/merkle_trees_facade.d.ts.map +1 -1
- package/dest/native/merkle_trees_facade.js +39 -7
- package/dest/native/message.d.ts +65 -45
- package/dest/native/message.d.ts.map +1 -1
- package/dest/native/message.js +55 -56
- package/dest/native/native_world_state.d.ts +20 -15
- package/dest/native/native_world_state.d.ts.map +1 -1
- package/dest/native/native_world_state.js +90 -33
- package/dest/native/native_world_state_instance.d.ts +20 -4
- package/dest/native/native_world_state_instance.d.ts.map +1 -1
- package/dest/native/native_world_state_instance.js +42 -3
- package/dest/native/world_state_ops_queue.d.ts +1 -1
- package/dest/native/world_state_ops_queue.d.ts.map +1 -1
- package/dest/native/world_state_ops_queue.js +1 -1
- package/dest/synchronizer/config.d.ts +12 -2
- package/dest/synchronizer/config.d.ts.map +1 -1
- package/dest/synchronizer/config.js +26 -1
- package/dest/synchronizer/errors.d.ts +4 -0
- package/dest/synchronizer/errors.d.ts.map +1 -0
- package/dest/synchronizer/errors.js +5 -0
- package/dest/synchronizer/factory.d.ts +9 -2
- package/dest/synchronizer/factory.d.ts.map +1 -1
- package/dest/synchronizer/factory.js +9 -4
- package/dest/synchronizer/index.d.ts +1 -1
- package/dest/synchronizer/server_world_state_synchronizer.d.ts +14 -18
- package/dest/synchronizer/server_world_state_synchronizer.d.ts.map +1 -1
- package/dest/synchronizer/server_world_state_synchronizer.js +78 -38
- package/dest/test/index.d.ts +1 -1
- package/dest/test/utils.d.ts +2 -2
- package/dest/test/utils.d.ts.map +1 -1
- package/dest/test/utils.js +21 -18
- package/dest/testing.d.ts +2 -2
- package/dest/testing.d.ts.map +1 -1
- package/dest/testing.js +6 -10
- package/dest/world-state-db/index.d.ts +1 -1
- package/dest/world-state-db/merkle_tree_db.d.ts +10 -6
- package/dest/world-state-db/merkle_tree_db.d.ts.map +1 -1
- package/package.json +24 -24
- package/src/instrumentation/instrumentation.ts +22 -10
- package/src/native/bench_metrics.ts +91 -0
- package/src/native/merkle_trees_facade.ts +44 -13
- package/src/native/message.ts +81 -63
- package/src/native/native_world_state.ts +99 -43
- package/src/native/native_world_state_instance.ts +59 -8
- package/src/native/world_state_ops_queue.ts +1 -1
- package/src/synchronizer/config.ts +47 -2
- package/src/synchronizer/errors.ts +5 -0
- package/src/synchronizer/factory.ts +31 -8
- package/src/synchronizer/server_world_state_synchronizer.ts +93 -40
- package/src/test/utils.ts +46 -31
- package/src/testing.ts +3 -7
- package/src/world-state-db/merkle_tree_db.ts +14 -5
package/dest/index.d.ts
CHANGED
|
@@ -2,4 +2,4 @@ export * from './synchronizer/index.js';
|
|
|
2
2
|
export * from './world-state-db/index.js';
|
|
3
3
|
export * from './synchronizer/config.js';
|
|
4
4
|
export * from './native/index.js';
|
|
5
|
-
//# sourceMappingURL=
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLHlCQUF5QixDQUFDO0FBQ3hDLGNBQWMsMkJBQTJCLENBQUM7QUFDMUMsY0FBYywwQkFBMEIsQ0FBQztBQUN6QyxjQUFjLG1CQUFtQixDQUFDIn0=
|
|
@@ -1,22 +1,24 @@
|
|
|
1
|
+
import { type Logger } from '@aztec/foundation/log';
|
|
1
2
|
import { type TelemetryClient } from '@aztec/telemetry-client';
|
|
2
3
|
import { WorldStateMessageType, type WorldStateStatusFull } from '../native/message.js';
|
|
3
4
|
export declare class WorldStateInstrumentation {
|
|
4
5
|
readonly telemetry: TelemetryClient;
|
|
5
6
|
private log;
|
|
6
7
|
private dbMapSize;
|
|
8
|
+
private dbPhysicalSize;
|
|
7
9
|
private treeSize;
|
|
8
|
-
private
|
|
9
|
-
private
|
|
10
|
+
private unfinalizedHeight;
|
|
11
|
+
private finalizedHeight;
|
|
10
12
|
private oldestBlock;
|
|
11
13
|
private dbNumItems;
|
|
12
14
|
private dbUsedSize;
|
|
13
15
|
private requestHistogram;
|
|
14
16
|
private criticalErrors;
|
|
15
|
-
constructor(telemetry: TelemetryClient, log?:
|
|
17
|
+
constructor(telemetry: TelemetryClient, log?: Logger);
|
|
16
18
|
private updateTreeStats;
|
|
17
19
|
private updateTreeDBStats;
|
|
18
20
|
updateWorldStateMetrics(worldStateStatus: WorldStateStatusFull): void;
|
|
19
21
|
recordRoundTrip(timeUs: number, request: WorldStateMessageType): void;
|
|
20
22
|
incCriticalErrors(errorType: 'synch_pending_block' | 'finalize_block' | 'prune_pending_block' | 'prune_historical_block'): void;
|
|
21
23
|
}
|
|
22
|
-
//# sourceMappingURL=
|
|
24
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdHJ1bWVudGF0aW9uLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5zdHJ1bWVudGF0aW9uL2luc3RydW1lbnRhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsS0FBSyxNQUFNLEVBQWdCLE1BQU0sdUJBQXVCLENBQUM7QUFFbEUsT0FBTyxFQUtMLEtBQUssZUFBZSxFQUdyQixNQUFNLHlCQUF5QixDQUFDO0FBRWpDLE9BQU8sRUFJTCxxQkFBcUIsRUFDckIsS0FBSyxvQkFBb0IsRUFDMUIsTUFBTSxzQkFBc0IsQ0FBQztBQWE5QixxQkFBYSx5QkFBeUI7YUFhbEIsU0FBUyxFQUFFLGVBQWU7SUFDMUMsT0FBTyxDQUFDLEdBQUc7SUFiYixPQUFPLENBQUMsU0FBUyxDQUFRO0lBQ3pCLE9BQU8sQ0FBQyxjQUFjLENBQVE7SUFDOUIsT0FBTyxDQUFDLFFBQVEsQ0FBUTtJQUN4QixPQUFPLENBQUMsaUJBQWlCLENBQVE7SUFDakMsT0FBTyxDQUFDLGVBQWUsQ0FBUTtJQUMvQixPQUFPLENBQUMsV0FBVyxDQUFRO0lBQzNCLE9BQU8sQ0FBQyxVQUFVLENBQVE7SUFDMUIsT0FBTyxDQUFDLFVBQVUsQ0FBUTtJQUMxQixPQUFPLENBQUMsZ0JBQWdCLENBQVk7SUFDcEMsT0FBTyxDQUFDLGNBQWMsQ0FBZ0I7SUFFdEMsWUFDa0IsU0FBUyxFQUFFLGVBQWUsRUFDbEMsR0FBRyxHQUFFLE1BQW9ELEVBcURsRTtJQUVELE9BQU8sQ0FBQyxlQUFlO0lBMkJ2QixPQUFPLENBQUMsaUJBQWlCO0lBV2xCLHVCQUF1QixDQUFDLGdCQUFnQixFQUFFLG9CQUFvQixRQThCcEU7SUFFTSxlQUFlLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUscUJBQXFCLFFBTXBFO0lBRU0saUJBQWlCLENBQ3RCLFNBQVMsRUFBRSxxQkFBcUIsR0FBRyxnQkFBZ0IsR0FBRyxxQkFBcUIsR0FBRyx3QkFBd0IsUUFLdkc7Q0FDRiJ9
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instrumentation.d.ts","sourceRoot":"","sources":["../../src/instrumentation/instrumentation.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"instrumentation.d.ts","sourceRoot":"","sources":["../../src/instrumentation/instrumentation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,uBAAuB,CAAC;AAElE,OAAO,EAKL,KAAK,eAAe,EAGrB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAIL,qBAAqB,EACrB,KAAK,oBAAoB,EAC1B,MAAM,sBAAsB,CAAC;AAa9B,qBAAa,yBAAyB;aAalB,SAAS,EAAE,eAAe;IAC1C,OAAO,CAAC,GAAG;IAbb,OAAO,CAAC,SAAS,CAAQ;IACzB,OAAO,CAAC,cAAc,CAAQ;IAC9B,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;IACpC,OAAO,CAAC,cAAc,CAAgB;IAEtC,YACkB,SAAS,EAAE,eAAe,EAClC,GAAG,GAAE,MAAoD,EAqDlE;IAED,OAAO,CAAC,eAAe;IA2BvB,OAAO,CAAC,iBAAiB;IAWlB,uBAAuB,CAAC,gBAAgB,EAAE,oBAAoB,QA8BpE;IAEM,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,qBAAqB,QAMpE;IAEM,iBAAiB,CACtB,SAAS,EAAE,qBAAqB,GAAG,gBAAgB,GAAG,qBAAqB,GAAG,wBAAwB,QAKvG;CACF"}
|
|
@@ -13,9 +13,10 @@ export class WorldStateInstrumentation {
|
|
|
13
13
|
telemetry;
|
|
14
14
|
log;
|
|
15
15
|
dbMapSize;
|
|
16
|
+
dbPhysicalSize;
|
|
16
17
|
treeSize;
|
|
17
|
-
|
|
18
|
-
|
|
18
|
+
unfinalizedHeight;
|
|
19
|
+
finalizedHeight;
|
|
19
20
|
oldestBlock;
|
|
20
21
|
dbNumItems;
|
|
21
22
|
dbUsedSize;
|
|
@@ -29,16 +30,20 @@ export class WorldStateInstrumentation {
|
|
|
29
30
|
description: `The current configured map size for each merkle tree`,
|
|
30
31
|
valueType: ValueType.INT
|
|
31
32
|
});
|
|
33
|
+
this.dbPhysicalSize = meter.createGauge(Metrics.WORLD_STATE_DB_PHYSICAL_SIZE, {
|
|
34
|
+
description: `The current physical disk space used for each database`,
|
|
35
|
+
valueType: ValueType.INT
|
|
36
|
+
});
|
|
32
37
|
this.treeSize = meter.createGauge(Metrics.WORLD_STATE_TREE_SIZE, {
|
|
33
38
|
description: `The current number of leaves in each merkle tree`,
|
|
34
39
|
valueType: ValueType.INT
|
|
35
40
|
});
|
|
36
|
-
this.
|
|
37
|
-
description: `The
|
|
41
|
+
this.unfinalizedHeight = meter.createGauge(Metrics.WORLD_STATE_UNFINALIZED_HEIGHT, {
|
|
42
|
+
description: `The unfinalized block height of each merkle tree`,
|
|
38
43
|
valueType: ValueType.INT
|
|
39
44
|
});
|
|
40
|
-
this.
|
|
41
|
-
description: `The
|
|
45
|
+
this.finalizedHeight = meter.createGauge(Metrics.WORLD_STATE_FINALIZED_HEIGHT, {
|
|
46
|
+
description: `The finalized block height of each merkle tree`,
|
|
42
47
|
valueType: ValueType.INT
|
|
43
48
|
});
|
|
44
49
|
this.oldestBlock = meter.createGauge(Metrics.WORLD_STATE_OLDEST_BLOCK, {
|
|
@@ -67,13 +72,16 @@ export class WorldStateInstrumentation {
|
|
|
67
72
|
this.dbMapSize.record(Number(treeDbStats.mapSize), {
|
|
68
73
|
[Attributes.MERKLE_TREE_NAME]: MerkleTreeId[tree]
|
|
69
74
|
});
|
|
75
|
+
this.dbPhysicalSize.record(Number(treeDbStats.physicalFileSize), {
|
|
76
|
+
[Attributes.MERKLE_TREE_NAME]: MerkleTreeId[tree]
|
|
77
|
+
});
|
|
70
78
|
this.treeSize.record(Number(treeMeta.size), {
|
|
71
79
|
[Attributes.MERKLE_TREE_NAME]: MerkleTreeId[tree]
|
|
72
80
|
});
|
|
73
|
-
this.
|
|
81
|
+
this.unfinalizedHeight.record(Number(treeMeta.unfinalizedBlockHeight), {
|
|
74
82
|
[Attributes.MERKLE_TREE_NAME]: MerkleTreeId[tree]
|
|
75
83
|
});
|
|
76
|
-
this.
|
|
84
|
+
this.finalizedHeight.record(Number(treeMeta.finalizedBlockHeight), {
|
|
77
85
|
[Attributes.MERKLE_TREE_NAME]: MerkleTreeId[tree]
|
|
78
86
|
});
|
|
79
87
|
this.oldestBlock.record(Number(treeMeta.oldestHistoricBlock), {
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { MerkleTreeId } from '@aztec/stdlib/trees';
|
|
2
|
+
export declare enum InsertionType {
|
|
3
|
+
BATCH = 0,
|
|
4
|
+
SEQUENTIAL = 1
|
|
5
|
+
}
|
|
6
|
+
export declare enum DataRetrievalType {
|
|
7
|
+
SIBLING_PATH = 0,
|
|
8
|
+
LEAF_PREIMAGE = 1,
|
|
9
|
+
LEAF_VALUE = 2,
|
|
10
|
+
LEAF_INDICES = 3,
|
|
11
|
+
LOW_LEAF = 4
|
|
12
|
+
}
|
|
13
|
+
export declare class NativeBenchMetics {
|
|
14
|
+
private blockSyncMetrics;
|
|
15
|
+
private insertionMetrics;
|
|
16
|
+
private dataRetrievalMetrics;
|
|
17
|
+
toPrettyString(): string;
|
|
18
|
+
addBlockSyncMetric(numTxs: number, numLeaves: number, value: number): void;
|
|
19
|
+
addInsertionMetric(treeId: MerkleTreeId, insertionType: InsertionType, numLeaves: number, value: number): void;
|
|
20
|
+
addDataRetrievalMetric(retrievalType: DataRetrievalType, value: number): void;
|
|
21
|
+
toGithubActionBenchmarkJSON(indent?: number): string;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmVuY2hfbWV0cmljcy5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL25hdGl2ZS9iZW5jaF9tZXRyaWNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQVFuRCxvQkFBWSxhQUFhO0lBQ3ZCLEtBQUssSUFBQTtJQUNMLFVBQVUsSUFBQTtDQUNYO0FBU0Qsb0JBQVksaUJBQWlCO0lBQzNCLFlBQVksSUFBQTtJQUNaLGFBQWEsSUFBQTtJQUNiLFVBQVUsSUFBQTtJQUNWLFlBQVksSUFBQTtJQUNaLFFBQVEsSUFBQTtDQUNUO0FBT0QscUJBQWEsaUJBQWlCO0lBQzVCLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBMEI7SUFDbEQsT0FBTyxDQUFDLGdCQUFnQixDQUEwQjtJQUNsRCxPQUFPLENBQUMsb0JBQW9CLENBQThCO0lBRW5ELGNBQWMsV0FlcEI7SUFFTSxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sUUFFekU7SUFDTSxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxRQUU3RztJQUNNLHNCQUFzQixDQUFDLGFBQWEsRUFBRSxpQkFBaUIsRUFBRSxLQUFLLEVBQUUsTUFBTSxRQUU1RTtJQUVNLDJCQUEyQixDQUFDLE1BQU0sU0FBSSxVQXdCNUM7Q0FDRiJ9
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bench_metrics.d.ts","sourceRoot":"","sources":["../../src/native/bench_metrics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAQnD,oBAAY,aAAa;IACvB,KAAK,IAAA;IACL,UAAU,IAAA;CACX;AASD,oBAAY,iBAAiB;IAC3B,YAAY,IAAA;IACZ,aAAa,IAAA;IACb,UAAU,IAAA;IACV,YAAY,IAAA;IACZ,QAAQ,IAAA;CACT;AAOD,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,gBAAgB,CAA0B;IAClD,OAAO,CAAC,gBAAgB,CAA0B;IAClD,OAAO,CAAC,oBAAoB,CAA8B;IAEnD,cAAc,WAepB;IAEM,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAEzE;IACM,kBAAkB,CAAC,MAAM,EAAE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAE7G;IACM,sBAAsB,CAAC,aAAa,EAAE,iBAAiB,EAAE,KAAK,EAAE,MAAM,QAE5E;IAEM,2BAA2B,CAAC,MAAM,SAAI,UAwB5C;CACF"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { MerkleTreeId } from '@aztec/stdlib/trees';
|
|
2
|
+
export var InsertionType = /*#__PURE__*/ function(InsertionType) {
|
|
3
|
+
InsertionType[InsertionType["BATCH"] = 0] = "BATCH";
|
|
4
|
+
InsertionType[InsertionType["SEQUENTIAL"] = 1] = "SEQUENTIAL";
|
|
5
|
+
return InsertionType;
|
|
6
|
+
}({});
|
|
7
|
+
export var DataRetrievalType = /*#__PURE__*/ function(DataRetrievalType) {
|
|
8
|
+
DataRetrievalType[DataRetrievalType["SIBLING_PATH"] = 0] = "SIBLING_PATH";
|
|
9
|
+
DataRetrievalType[DataRetrievalType["LEAF_PREIMAGE"] = 1] = "LEAF_PREIMAGE";
|
|
10
|
+
DataRetrievalType[DataRetrievalType["LEAF_VALUE"] = 2] = "LEAF_VALUE";
|
|
11
|
+
DataRetrievalType[DataRetrievalType["LEAF_INDICES"] = 3] = "LEAF_INDICES";
|
|
12
|
+
DataRetrievalType[DataRetrievalType["LOW_LEAF"] = 4] = "LOW_LEAF";
|
|
13
|
+
return DataRetrievalType;
|
|
14
|
+
}({});
|
|
15
|
+
export class NativeBenchMetics {
|
|
16
|
+
blockSyncMetrics = [];
|
|
17
|
+
insertionMetrics = [];
|
|
18
|
+
dataRetrievalMetrics = [];
|
|
19
|
+
toPrettyString() {
|
|
20
|
+
let pretty = '';
|
|
21
|
+
pretty += `Block sync metrics:\n`;
|
|
22
|
+
for (const metric of this.blockSyncMetrics){
|
|
23
|
+
pretty += ` ${metric.numTxs} txs, ${metric.numLeaves} leaves: ${metric.value} ms\n`;
|
|
24
|
+
}
|
|
25
|
+
pretty += `Insertion metrics:\n`;
|
|
26
|
+
for (const metric of this.insertionMetrics){
|
|
27
|
+
pretty += ` ${MerkleTreeId[metric.treeType]}: ${InsertionType[metric.insertionType]} (${metric.numLeaves} leaves): ${metric.value} ms\n`;
|
|
28
|
+
}
|
|
29
|
+
pretty += `Data retrieval metrics:\n`;
|
|
30
|
+
for (const metric of this.dataRetrievalMetrics){
|
|
31
|
+
pretty += ` ${DataRetrievalType[metric.retrievalType]}: ${metric.value} us\n`;
|
|
32
|
+
}
|
|
33
|
+
return pretty;
|
|
34
|
+
}
|
|
35
|
+
addBlockSyncMetric(numTxs, numLeaves, value) {
|
|
36
|
+
this.blockSyncMetrics.push({
|
|
37
|
+
numTxs,
|
|
38
|
+
numLeaves,
|
|
39
|
+
value
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
addInsertionMetric(treeId, insertionType, numLeaves, value) {
|
|
43
|
+
this.insertionMetrics.push({
|
|
44
|
+
treeType: treeId,
|
|
45
|
+
insertionType,
|
|
46
|
+
numLeaves,
|
|
47
|
+
value
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
addDataRetrievalMetric(retrievalType, value) {
|
|
51
|
+
this.dataRetrievalMetrics.push({
|
|
52
|
+
retrievalType,
|
|
53
|
+
value: value
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
toGithubActionBenchmarkJSON(indent = 2) {
|
|
57
|
+
const data = [];
|
|
58
|
+
for (const blockSync of this.blockSyncMetrics){
|
|
59
|
+
data.push({
|
|
60
|
+
name: `Block Sync/${blockSync.numTxs} txs/${blockSync.numLeaves} leaves per tx`,
|
|
61
|
+
value: blockSync.value,
|
|
62
|
+
unit: 'ms'
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
for (const insertion of this.insertionMetrics){
|
|
66
|
+
data.push({
|
|
67
|
+
name: `Tree Insertion/${MerkleTreeId[insertion.treeType]}/${InsertionType[insertion.insertionType]}/${insertion.numLeaves} leaves`,
|
|
68
|
+
value: insertion.value,
|
|
69
|
+
unit: 'ms'
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
for (const retrieval of this.dataRetrievalMetrics){
|
|
73
|
+
data.push({
|
|
74
|
+
name: `Data Retrieval/${DataRetrievalType[retrieval.retrievalType]}`,
|
|
75
|
+
value: retrieval.value,
|
|
76
|
+
unit: 'us'
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
return JSON.stringify(data, null, indent);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
@@ -7,4 +7,4 @@ export declare class ForkCheckpoint {
|
|
|
7
7
|
commit(): Promise<void>;
|
|
8
8
|
revert(): Promise<void>;
|
|
9
9
|
}
|
|
10
|
-
//# sourceMappingURL=
|
|
10
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ya19jaGVja3BvaW50LmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbmF0aXZlL2ZvcmtfY2hlY2twb2ludC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSw4QkFBOEIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRXRGLHFCQUFhLGNBQWM7SUFHTCxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUk7SUFGekMsT0FBTyxDQUFDLFNBQVMsQ0FBUztJQUUxQixPQUFPLGVBQXNFO0lBRTdFLE9BQWEsR0FBRyxDQUFDLElBQUksRUFBRSw4QkFBOEIsR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDLENBRzlFO0lBRUssTUFBTSxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FPNUI7SUFFSyxNQUFNLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxDQU81QjtDQUNGIn0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fork_checkpoint.d.ts","sourceRoot":"","sources":["../../src/native/fork_checkpoint.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,iCAAiC,CAAC;AAEtF,qBAAa,cAAc;IAGL,OAAO,CAAC,QAAQ,CAAC,IAAI;IAFzC,OAAO,CAAC,SAAS,CAAS;IAE1B,OAAO;
|
|
1
|
+
{"version":3,"file":"fork_checkpoint.d.ts","sourceRoot":"","sources":["../../src/native/fork_checkpoint.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,iCAAiC,CAAC;AAEtF,qBAAa,cAAc;IAGL,OAAO,CAAC,QAAQ,CAAC,IAAI;IAFzC,OAAO,CAAC,SAAS,CAAS;IAE1B,OAAO,eAAsE;IAE7E,OAAa,GAAG,CAAC,IAAI,EAAE,8BAA8B,GAAG,OAAO,CAAC,cAAc,CAAC,CAG9E;IAEK,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAO5B;IAEK,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAO5B;CACF"}
|
package/dest/native/index.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
export * from './native_world_state.js';
|
|
2
2
|
export * from './fork_checkpoint.js';
|
|
3
|
-
//# sourceMappingURL=
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9uYXRpdmUvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyx5QkFBeUIsQ0FBQztBQUN4QyxjQUFjLHNCQUFzQixDQUFDIn0=
|
|
@@ -1,11 +1,10 @@
|
|
|
1
|
-
/// <reference types="node" resolution-mode="require"/>
|
|
2
|
-
/// <reference types="node" resolution-mode="require"/>
|
|
3
1
|
import { Fr } from '@aztec/foundation/fields';
|
|
4
2
|
import { type IndexedTreeLeafPreimage, SiblingPath } from '@aztec/foundation/trees';
|
|
5
3
|
import type { BatchInsertionResult, IndexedTreeId, MerkleTreeLeafType, MerkleTreeReadOperations, MerkleTreeWriteOperations, SequentialInsertionResult, TreeInfo } from '@aztec/stdlib/interfaces/server';
|
|
6
4
|
import { MerkleTreeId, NullifierLeaf, PublicDataTreeLeaf } from '@aztec/stdlib/trees';
|
|
7
5
|
import { type BlockHeader, StateReference } from '@aztec/stdlib/tx';
|
|
8
|
-
import { type
|
|
6
|
+
import { type WorldStateRevision, WorldStateRevisionWithHandle } from '@aztec/stdlib/world-state';
|
|
7
|
+
import { type SerializedLeafValue } from './message.js';
|
|
9
8
|
import type { NativeWorldStateInstance } from './native_world_state_instance.js';
|
|
10
9
|
export declare class MerkleTreesFacade implements MerkleTreeReadOperations {
|
|
11
10
|
protected readonly instance: NativeWorldStateInstance;
|
|
@@ -13,7 +12,12 @@ export declare class MerkleTreesFacade implements MerkleTreeReadOperations {
|
|
|
13
12
|
protected readonly revision: WorldStateRevision;
|
|
14
13
|
constructor(instance: NativeWorldStateInstance, initialHeader: BlockHeader, revision: WorldStateRevision);
|
|
15
14
|
getInitialHeader(): BlockHeader;
|
|
15
|
+
getRevision(): WorldStateRevisionWithHandle;
|
|
16
16
|
findLeafIndices(treeId: MerkleTreeId, values: MerkleTreeLeafType<MerkleTreeId>[]): Promise<(bigint | undefined)[]>;
|
|
17
|
+
findSiblingPaths<N extends number>(treeId: MerkleTreeId, values: MerkleTreeLeafType<MerkleTreeId>[]): Promise<({
|
|
18
|
+
path: SiblingPath<N>;
|
|
19
|
+
index: bigint;
|
|
20
|
+
} | undefined)[]>;
|
|
17
21
|
findLeafIndicesAfter(treeId: MerkleTreeId, leaves: MerkleTreeLeafType<MerkleTreeId>[], startIndex: bigint): Promise<(bigint | undefined)[]>;
|
|
18
22
|
getLeafPreimage(treeId: IndexedTreeId, leafIndex: bigint): Promise<IndexedTreeLeafPreimage | undefined>;
|
|
19
23
|
getLeafValue<ID extends MerkleTreeId>(treeId: ID, leafIndex: bigint): Promise<MerkleTreeLeafType<ID> | undefined>;
|
|
@@ -37,6 +41,8 @@ export declare class MerkleTreesForkFacade extends MerkleTreesFacade implements
|
|
|
37
41
|
createCheckpoint(): Promise<void>;
|
|
38
42
|
commitCheckpoint(): Promise<void>;
|
|
39
43
|
revertCheckpoint(): Promise<void>;
|
|
44
|
+
commitAllCheckpoints(): Promise<void>;
|
|
45
|
+
revertAllCheckpoints(): Promise<void>;
|
|
40
46
|
}
|
|
41
47
|
export declare function serializeLeaf(leaf: Fr | NullifierLeaf | PublicDataTreeLeaf): SerializedLeafValue;
|
|
42
|
-
//# sourceMappingURL=
|
|
48
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVya2xlX3RyZWVzX2ZhY2FkZS5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL25hdGl2ZS9tZXJrbGVfdHJlZXNfZmFjYWRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUU5QyxPQUFPLEVBQUUsS0FBSyx1QkFBdUIsRUFBRSxXQUFXLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNwRixPQUFPLEtBQUssRUFDVixvQkFBb0IsRUFDcEIsYUFBYSxFQUNiLGtCQUFrQixFQUNsQix3QkFBd0IsRUFDeEIseUJBQXlCLEVBQ3pCLHlCQUF5QixFQUN6QixRQUFRLEVBQ1QsTUFBTSxpQ0FBaUMsQ0FBQztBQUN6QyxPQUFPLEVBQ0wsWUFBWSxFQUNaLGFBQWEsRUFFYixrQkFBa0IsRUFFbkIsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQUUsS0FBSyxXQUFXLEVBQXlCLGNBQWMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzNGLE9BQU8sRUFBRSxLQUFLLGtCQUFrQixFQUFFLDRCQUE0QixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFJbEcsT0FBTyxFQUVMLEtBQUssbUJBQW1CLEVBSXpCLE1BQU0sY0FBYyxDQUFDO0FBQ3RCLE9BQU8sS0FBSyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFFakYscUJBQWEsaUJBQWtCLFlBQVcsd0JBQXdCO0lBRTlELFNBQVMsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLHdCQUF3QjtJQUNyRCxTQUFTLENBQUMsUUFBUSxDQUFDLGFBQWEsRUFBRSxXQUFXO0lBQzdDLFNBQVMsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLGtCQUFrQjtJQUhqRCxZQUNxQixRQUFRLEVBQUUsd0JBQXdCLEVBQ2xDLGFBQWEsRUFBRSxXQUFXLEVBQzFCLFFBQVEsRUFBRSxrQkFBa0IsRUFDN0M7SUFFSixnQkFBZ0Is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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"merkle_trees_facade.d.ts","sourceRoot":"","sources":["../../src/native/merkle_trees_facade.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"merkle_trees_facade.d.ts","sourceRoot":"","sources":["../../src/native/merkle_trees_facade.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,7 @@ import { serializeToBuffer } from '@aztec/foundation/serialize';
|
|
|
3
3
|
import { SiblingPath } from '@aztec/foundation/trees';
|
|
4
4
|
import { MerkleTreeId, NullifierLeaf, NullifierLeafPreimage, PublicDataTreeLeaf, PublicDataTreeLeafPreimage } from '@aztec/stdlib/trees';
|
|
5
5
|
import { PartialStateReference, StateReference } from '@aztec/stdlib/tx';
|
|
6
|
+
import { WorldStateRevisionWithHandle } from '@aztec/stdlib/world-state';
|
|
6
7
|
import assert from 'assert';
|
|
7
8
|
import { WorldStateMessageType, blockStateReference, treeStateReferenceToSnapshot } from './message.js';
|
|
8
9
|
export class MerkleTreesFacade {
|
|
@@ -17,9 +18,28 @@ export class MerkleTreesFacade {
|
|
|
17
18
|
getInitialHeader() {
|
|
18
19
|
return this.initialHeader;
|
|
19
20
|
}
|
|
21
|
+
getRevision() {
|
|
22
|
+
return WorldStateRevisionWithHandle.fromWorldStateRevision(this.revision, this.instance.getHandle());
|
|
23
|
+
}
|
|
20
24
|
findLeafIndices(treeId, values) {
|
|
21
25
|
return this.findLeafIndicesAfter(treeId, values, 0n);
|
|
22
26
|
}
|
|
27
|
+
async findSiblingPaths(treeId, values) {
|
|
28
|
+
const response = await this.instance.call(WorldStateMessageType.FIND_SIBLING_PATHS, {
|
|
29
|
+
leaves: values.map((leaf)=>serializeLeaf(hydrateLeaf(treeId, leaf))),
|
|
30
|
+
revision: this.revision,
|
|
31
|
+
treeId
|
|
32
|
+
});
|
|
33
|
+
return response.paths.map((path)=>{
|
|
34
|
+
if (!path) {
|
|
35
|
+
return undefined;
|
|
36
|
+
}
|
|
37
|
+
return {
|
|
38
|
+
path: new SiblingPath(path.path.length, path.path),
|
|
39
|
+
index: BigInt(path.index)
|
|
40
|
+
};
|
|
41
|
+
});
|
|
42
|
+
}
|
|
23
43
|
async findLeafIndicesAfter(treeId, leaves, startIndex) {
|
|
24
44
|
const response = await this.instance.call(WorldStateMessageType.FIND_LEAF_INDICES, {
|
|
25
45
|
leaves: leaves.map((leaf)=>serializeLeaf(hydrateLeaf(treeId, leaf))),
|
|
@@ -194,6 +214,18 @@ export class MerkleTreesForkFacade extends MerkleTreesFacade {
|
|
|
194
214
|
forkId: this.revision.forkId
|
|
195
215
|
});
|
|
196
216
|
}
|
|
217
|
+
async commitAllCheckpoints() {
|
|
218
|
+
assert.notEqual(this.revision.forkId, 0, 'Fork ID must be set');
|
|
219
|
+
await this.instance.call(WorldStateMessageType.COMMIT_ALL_CHECKPOINTS, {
|
|
220
|
+
forkId: this.revision.forkId
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
async revertAllCheckpoints() {
|
|
224
|
+
assert.notEqual(this.revision.forkId, 0, 'Fork ID must be set');
|
|
225
|
+
await this.instance.call(WorldStateMessageType.REVERT_ALL_CHECKPOINTS, {
|
|
226
|
+
forkId: this.revision.forkId
|
|
227
|
+
});
|
|
228
|
+
}
|
|
197
229
|
}
|
|
198
230
|
function hydrateLeaf(treeId, leaf) {
|
|
199
231
|
if (leaf instanceof Fr) {
|
|
@@ -211,7 +243,7 @@ export function serializeLeaf(leaf) {
|
|
|
211
243
|
return leaf.toBuffer();
|
|
212
244
|
} else if (leaf instanceof NullifierLeaf) {
|
|
213
245
|
return {
|
|
214
|
-
|
|
246
|
+
nullifier: leaf.nullifier.toBuffer()
|
|
215
247
|
};
|
|
216
248
|
} else {
|
|
217
249
|
return {
|
|
@@ -226,14 +258,14 @@ function deserializeLeafValue(leaf) {
|
|
|
226
258
|
} else if ('slot' in leaf) {
|
|
227
259
|
return new PublicDataTreeLeaf(Fr.fromBuffer(leaf.slot), Fr.fromBuffer(leaf.value));
|
|
228
260
|
} else {
|
|
229
|
-
return new NullifierLeaf(Fr.fromBuffer(leaf.
|
|
261
|
+
return new NullifierLeaf(Fr.fromBuffer(leaf.nullifier));
|
|
230
262
|
}
|
|
231
263
|
}
|
|
232
|
-
function deserializeIndexedLeaf(
|
|
233
|
-
if ('slot' in leaf
|
|
234
|
-
return new PublicDataTreeLeafPreimage(Fr.fromBuffer(leaf.
|
|
235
|
-
} else if ('
|
|
236
|
-
return new NullifierLeafPreimage(Fr.fromBuffer(leaf.
|
|
264
|
+
function deserializeIndexedLeaf(leafPreimage) {
|
|
265
|
+
if ('slot' in leafPreimage.leaf) {
|
|
266
|
+
return new PublicDataTreeLeafPreimage(new PublicDataTreeLeaf(Fr.fromBuffer(leafPreimage.leaf.slot), Fr.fromBuffer(leafPreimage.leaf.value)), Fr.fromBuffer(leafPreimage.nextKey), BigInt(leafPreimage.nextIndex));
|
|
267
|
+
} else if ('nullifier' in leafPreimage.leaf) {
|
|
268
|
+
return new NullifierLeafPreimage(new NullifierLeaf(Fr.fromBuffer(leafPreimage.leaf.nullifier)), Fr.fromBuffer(leafPreimage.nextKey), BigInt(leafPreimage.nextIndex));
|
|
237
269
|
} else {
|
|
238
270
|
throw new Error('Invalid leaf type');
|
|
239
271
|
}
|
package/dest/native/message.d.ts
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
/// <reference types="node" resolution-mode="require"/>
|
|
2
|
-
/// <reference types="node" resolution-mode="require"/>
|
|
3
1
|
import { Fr } from '@aztec/foundation/fields';
|
|
4
2
|
import type { Tuple } from '@aztec/foundation/serialize';
|
|
5
3
|
import { AppendOnlyTreeSnapshot, MerkleTreeId } from '@aztec/stdlib/trees';
|
|
6
4
|
import type { StateReference } from '@aztec/stdlib/tx';
|
|
7
5
|
import type { UInt32 } from '@aztec/stdlib/types';
|
|
6
|
+
import type { WorldStateRevision } from '@aztec/stdlib/world-state';
|
|
8
7
|
export declare enum WorldStateMessageType {
|
|
9
8
|
GET_TREE_INFO = 100,
|
|
10
9
|
GET_STATE_REFERENCE = 101,
|
|
@@ -15,22 +14,26 @@ export declare enum WorldStateMessageType {
|
|
|
15
14
|
GET_BLOCK_NUMBERS_FOR_LEAF_INDICES = 106,
|
|
16
15
|
FIND_LEAF_INDICES = 107,
|
|
17
16
|
FIND_LOW_LEAF = 108,
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
17
|
+
FIND_SIBLING_PATHS = 109,
|
|
18
|
+
APPEND_LEAVES = 110,
|
|
19
|
+
BATCH_INSERT = 111,
|
|
20
|
+
SEQUENTIAL_INSERT = 112,
|
|
21
|
+
UPDATE_ARCHIVE = 113,
|
|
22
|
+
COMMIT = 114,
|
|
23
|
+
ROLLBACK = 115,
|
|
24
|
+
SYNC_BLOCK = 116,
|
|
25
|
+
CREATE_FORK = 117,
|
|
26
|
+
DELETE_FORK = 118,
|
|
27
|
+
FINALIZE_BLOCKS = 119,
|
|
28
|
+
UNWIND_BLOCKS = 120,
|
|
29
|
+
REMOVE_HISTORICAL_BLOCKS = 121,
|
|
30
|
+
GET_STATUS = 122,
|
|
31
|
+
CREATE_CHECKPOINT = 123,
|
|
32
|
+
COMMIT_CHECKPOINT = 124,
|
|
33
|
+
REVERT_CHECKPOINT = 125,
|
|
34
|
+
COMMIT_ALL_CHECKPOINTS = 126,
|
|
35
|
+
REVERT_ALL_CHECKPOINTS = 127,
|
|
36
|
+
COPY_STORES = 128,
|
|
34
37
|
CLOSE = 999
|
|
35
38
|
}
|
|
36
39
|
interface WithTreeId {
|
|
@@ -38,9 +41,9 @@ interface WithTreeId {
|
|
|
38
41
|
}
|
|
39
42
|
export interface WorldStateStatusSummary {
|
|
40
43
|
/** Last block number that can still be unwound. */
|
|
41
|
-
|
|
42
|
-
/** Last block number that is
|
|
43
|
-
|
|
44
|
+
unfinalizedBlockNumber: bigint;
|
|
45
|
+
/** Last block number that is finalized and cannot be unwound. */
|
|
46
|
+
finalizedBlockNumber: bigint;
|
|
44
47
|
/** Oldest block still available for historical queries and forks. */
|
|
45
48
|
oldestHistoricalBlock: bigint;
|
|
46
49
|
/** Whether the trees are in sync with each other */
|
|
@@ -63,10 +66,10 @@ export interface TreeMeta {
|
|
|
63
66
|
initialRoot: Fr;
|
|
64
67
|
/** The current oldest historical block number of the tree */
|
|
65
68
|
oldestHistoricBlock: bigint;
|
|
66
|
-
/** The current
|
|
67
|
-
|
|
68
|
-
/** The current
|
|
69
|
-
|
|
69
|
+
/** The current unfinalized block number of the tree */
|
|
70
|
+
unfinalizedBlockHeight: bigint;
|
|
71
|
+
/** The current finalized block number of the tree */
|
|
72
|
+
finalizedBlockHeight: bigint;
|
|
70
73
|
}
|
|
71
74
|
export interface DBStats {
|
|
72
75
|
/** The name of the DB */
|
|
@@ -79,6 +82,8 @@ export interface DBStats {
|
|
|
79
82
|
export interface TreeDBStats {
|
|
80
83
|
/** The configured max size of the DB mapping file (effectively the max possible size of the DB) */
|
|
81
84
|
mapSize: bigint;
|
|
85
|
+
/** The physical file size of the database on disk */
|
|
86
|
+
physicalFileSize: bigint;
|
|
82
87
|
/** Stats for the 'blocks' DB */
|
|
83
88
|
blocksDBStats: DBStats;
|
|
84
89
|
/** Stats for the 'nodes' DB */
|
|
@@ -126,13 +131,13 @@ export declare function buildEmptyWorldStateMeta(): WorldStateMeta;
|
|
|
126
131
|
export declare function buildEmptyWorldStateDBStats(): WorldStateDBStats;
|
|
127
132
|
export declare function buildEmptyWorldStateSummary(): WorldStateStatusSummary;
|
|
128
133
|
export declare function buildEmptyWorldStateStatusFull(): WorldStateStatusFull;
|
|
129
|
-
export declare function
|
|
130
|
-
export declare function
|
|
131
|
-
export declare function
|
|
132
|
-
export declare function
|
|
133
|
-
export declare function
|
|
134
|
-
export declare function
|
|
135
|
-
export declare function
|
|
134
|
+
export declare function sanitizeSummary(summary: WorldStateStatusSummary): WorldStateStatusSummary;
|
|
135
|
+
export declare function sanitizeDBStats(stats: DBStats): DBStats;
|
|
136
|
+
export declare function sanitizeMeta(meta: TreeMeta): TreeMeta;
|
|
137
|
+
export declare function sanitizeTreeDBStats(stats: TreeDBStats): TreeDBStats;
|
|
138
|
+
export declare function sanitizeWorldStateDBStats(stats: WorldStateDBStats): WorldStateDBStats;
|
|
139
|
+
export declare function sanitizeWorldStateTreeMeta(meta: WorldStateMeta): WorldStateMeta;
|
|
140
|
+
export declare function sanitizeFullStatus(status: WorldStateStatusFull): WorldStateStatusFull;
|
|
136
141
|
interface WithForkId {
|
|
137
142
|
forkId: number;
|
|
138
143
|
}
|
|
@@ -146,15 +151,15 @@ interface WithLeafIndex {
|
|
|
146
151
|
leafIndex: bigint;
|
|
147
152
|
}
|
|
148
153
|
export type SerializedLeafValue = Buffer | {
|
|
149
|
-
|
|
154
|
+
nullifier: Buffer;
|
|
150
155
|
} | {
|
|
151
156
|
value: Buffer;
|
|
152
157
|
slot: Buffer;
|
|
153
158
|
};
|
|
154
159
|
export type SerializedIndexedLeaf = {
|
|
155
|
-
|
|
160
|
+
leaf: Exclude<SerializedLeafValue, Buffer>;
|
|
156
161
|
nextIndex: bigint | number;
|
|
157
|
-
|
|
162
|
+
nextKey: Buffer;
|
|
158
163
|
};
|
|
159
164
|
interface WithLeafValues {
|
|
160
165
|
leaves: SerializedLeafValue[];
|
|
@@ -199,6 +204,15 @@ interface FindLeafIndicesRequest extends WithTreeId, WithLeafValues, WithWorldSt
|
|
|
199
204
|
interface FindLeafIndicesResponse {
|
|
200
205
|
indices: bigint[];
|
|
201
206
|
}
|
|
207
|
+
interface FindSiblingPathsRequest extends WithTreeId, WithLeafValues, WithWorldStateRevision {
|
|
208
|
+
}
|
|
209
|
+
interface SiblingPathAndIndex {
|
|
210
|
+
index: bigint;
|
|
211
|
+
path: Buffer[];
|
|
212
|
+
}
|
|
213
|
+
interface FindSiblingPathsResponse {
|
|
214
|
+
paths: (SiblingPathAndIndex | undefined)[];
|
|
215
|
+
}
|
|
202
216
|
interface FindLowLeafRequest extends WithTreeId, WithWorldStateRevision {
|
|
203
217
|
key: Fr;
|
|
204
218
|
}
|
|
@@ -256,6 +270,10 @@ interface CreateForkResponse {
|
|
|
256
270
|
}
|
|
257
271
|
interface DeleteForkRequest extends WithForkId {
|
|
258
272
|
}
|
|
273
|
+
interface CopyStoresRequest extends WithCanonicalForkId {
|
|
274
|
+
dstPath: string;
|
|
275
|
+
compact: boolean;
|
|
276
|
+
}
|
|
259
277
|
export type WorldStateRequestCategories = WithForkId | WithWorldStateRevision | WithCanonicalForkId;
|
|
260
278
|
export declare function isWithForkId(body: WorldStateRequestCategories): body is WithForkId;
|
|
261
279
|
export declare function isWithRevision(body: WorldStateRequestCategories): body is WithWorldStateRevision;
|
|
@@ -270,6 +288,7 @@ export type WorldStateRequest = {
|
|
|
270
288
|
[WorldStateMessageType.GET_BLOCK_NUMBERS_FOR_LEAF_INDICES]: GetBlockNumbersForLeafIndicesRequest;
|
|
271
289
|
[WorldStateMessageType.FIND_LEAF_INDICES]: FindLeafIndicesRequest;
|
|
272
290
|
[WorldStateMessageType.FIND_LOW_LEAF]: FindLowLeafRequest;
|
|
291
|
+
[WorldStateMessageType.FIND_SIBLING_PATHS]: FindSiblingPathsRequest;
|
|
273
292
|
[WorldStateMessageType.APPEND_LEAVES]: AppendLeavesRequest;
|
|
274
293
|
[WorldStateMessageType.BATCH_INSERT]: BatchInsertRequest;
|
|
275
294
|
[WorldStateMessageType.SEQUENTIAL_INSERT]: SequentialInsertRequest;
|
|
@@ -281,11 +300,14 @@ export type WorldStateRequest = {
|
|
|
281
300
|
[WorldStateMessageType.DELETE_FORK]: DeleteForkRequest;
|
|
282
301
|
[WorldStateMessageType.REMOVE_HISTORICAL_BLOCKS]: BlockShiftRequest;
|
|
283
302
|
[WorldStateMessageType.UNWIND_BLOCKS]: BlockShiftRequest;
|
|
284
|
-
[WorldStateMessageType.
|
|
303
|
+
[WorldStateMessageType.FINALIZE_BLOCKS]: BlockShiftRequest;
|
|
285
304
|
[WorldStateMessageType.GET_STATUS]: WithCanonicalForkId;
|
|
286
305
|
[WorldStateMessageType.CREATE_CHECKPOINT]: WithForkId;
|
|
287
306
|
[WorldStateMessageType.COMMIT_CHECKPOINT]: WithForkId;
|
|
288
307
|
[WorldStateMessageType.REVERT_CHECKPOINT]: WithForkId;
|
|
308
|
+
[WorldStateMessageType.COMMIT_ALL_CHECKPOINTS]: WithForkId;
|
|
309
|
+
[WorldStateMessageType.REVERT_ALL_CHECKPOINTS]: WithForkId;
|
|
310
|
+
[WorldStateMessageType.COPY_STORES]: CopyStoresRequest;
|
|
289
311
|
[WorldStateMessageType.CLOSE]: WithCanonicalForkId;
|
|
290
312
|
};
|
|
291
313
|
export type WorldStateResponse = {
|
|
@@ -298,6 +320,7 @@ export type WorldStateResponse = {
|
|
|
298
320
|
[WorldStateMessageType.GET_BLOCK_NUMBERS_FOR_LEAF_INDICES]: GetBlockNumbersForLeafIndicesResponse;
|
|
299
321
|
[WorldStateMessageType.FIND_LEAF_INDICES]: FindLeafIndicesResponse;
|
|
300
322
|
[WorldStateMessageType.FIND_LOW_LEAF]: FindLowLeafResponse;
|
|
323
|
+
[WorldStateMessageType.FIND_SIBLING_PATHS]: FindSiblingPathsResponse;
|
|
301
324
|
[WorldStateMessageType.APPEND_LEAVES]: void;
|
|
302
325
|
[WorldStateMessageType.BATCH_INSERT]: BatchInsertResponse;
|
|
303
326
|
[WorldStateMessageType.SEQUENTIAL_INSERT]: SequentialInsertResponse;
|
|
@@ -309,23 +332,20 @@ export type WorldStateResponse = {
|
|
|
309
332
|
[WorldStateMessageType.DELETE_FORK]: void;
|
|
310
333
|
[WorldStateMessageType.REMOVE_HISTORICAL_BLOCKS]: WorldStateStatusFull;
|
|
311
334
|
[WorldStateMessageType.UNWIND_BLOCKS]: WorldStateStatusFull;
|
|
312
|
-
[WorldStateMessageType.
|
|
335
|
+
[WorldStateMessageType.FINALIZE_BLOCKS]: WorldStateStatusSummary;
|
|
313
336
|
[WorldStateMessageType.GET_STATUS]: WorldStateStatusSummary;
|
|
314
337
|
[WorldStateMessageType.CREATE_CHECKPOINT]: void;
|
|
315
338
|
[WorldStateMessageType.COMMIT_CHECKPOINT]: void;
|
|
316
339
|
[WorldStateMessageType.REVERT_CHECKPOINT]: void;
|
|
340
|
+
[WorldStateMessageType.COMMIT_ALL_CHECKPOINTS]: void;
|
|
341
|
+
[WorldStateMessageType.REVERT_ALL_CHECKPOINTS]: void;
|
|
342
|
+
[WorldStateMessageType.COPY_STORES]: void;
|
|
317
343
|
[WorldStateMessageType.CLOSE]: void;
|
|
318
344
|
};
|
|
319
|
-
export type WorldStateRevision = {
|
|
320
|
-
forkId: number;
|
|
321
|
-
blockNumber: number;
|
|
322
|
-
includeUncommitted: boolean;
|
|
323
|
-
};
|
|
324
|
-
export declare function worldStateRevision(includeUncommitted: boolean, forkId: number | undefined, blockNumber: number | undefined): WorldStateRevision;
|
|
325
345
|
type TreeStateReference = readonly [Buffer, number | bigint];
|
|
326
346
|
type BlockStateReference = Map<Exclude<MerkleTreeId, MerkleTreeId.ARCHIVE>, TreeStateReference>;
|
|
327
347
|
export declare function treeStateReferenceToSnapshot([root, size]: TreeStateReference): AppendOnlyTreeSnapshot;
|
|
328
|
-
export declare function treeStateReference(snapshot: AppendOnlyTreeSnapshot): readonly [Buffer
|
|
348
|
+
export declare function treeStateReference(snapshot: AppendOnlyTreeSnapshot): readonly [Buffer<ArrayBufferLike>, bigint];
|
|
329
349
|
export declare function blockStateReference(state: StateReference): BlockStateReference;
|
|
330
350
|
export {};
|
|
331
|
-
//# sourceMappingURL=message.d.ts.map
|
|
351
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZS5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL25hdGl2ZS9tZXNzYWdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUM5QyxPQUFPLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsWUFBWSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDM0UsT0FBTyxLQUFLLEVBQUUsY0FBYyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDdkQsT0FBTyxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDbEQsT0FBTyxLQUFLLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUVwRSxvQkFBWSxxQkFBcUI7SUFDL0IsYUFBYSxNQUFNO0lBQ25CLG1CQUFtQixNQUFBO0lBQ25CLDJCQUEyQixNQUFBO0lBRTNCLGNBQWMsTUFBQTtJQUNkLGlCQUFpQixNQUFBO0lBQ2pCLGdCQUFnQixNQUFBO0lBQ2hCLGtDQUFrQyxNQUFBO0lBRWxDLGlCQUFpQixNQUFBO0lBQ2pCLGFBQWEsTUFBQTtJQUNiLGtCQUFrQixNQUFBO0lBRWxCLGFBQWEsTUFBQTtJQUNiLFlBQVksTUFBQTtJQUNaLGlCQUFpQixNQUFBO0lBRWpCLGNBQWMsTUFBQTtJQUVkLE1BQU0sTUFBQTtJQUNOLFFBQVEsTUFBQTtJQUVSLFVBQVUsTUFBQTtJQUVWLFdBQVcsTUFBQTtJQUNYLFdBQVcsTUFBQTtJQUVYLGVBQWUsTUFBQTtJQUNmLGFBQWEsTUFBQTtJQUNiLHdCQUF3QixNQUFBO0lBRXhCLFVBQVUsTUFBQTtJQUVWLGlCQUFpQixNQUFBO0lBQ2pCLGlCQUFpQixNQUFBO0lBQ2pCLGlCQUFpQixNQUFBO0lBQ2pCLHNCQUFzQixNQUFBO0lBQ3RCLHNCQUFzQixNQUFBO0lBRXRCLFdBQVcs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
|