@aztec/world-state 0.0.1-commit.24de95ac → 0.0.1-commit.3469e52
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 +1 -1
- package/dest/instrumentation/instrumentation.d.ts.map +1 -1
- package/dest/instrumentation/instrumentation.js +11 -42
- package/dest/native/bench_metrics.d.ts +1 -1
- package/dest/native/bench_metrics.d.ts.map +1 -1
- 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 +12 -6
- package/dest/native/merkle_trees_facade.d.ts.map +1 -1
- package/dest/native/merkle_trees_facade.js +39 -8
- package/dest/native/message.d.ts +12 -11
- package/dest/native/message.d.ts.map +1 -1
- package/dest/native/message.js +14 -13
- package/dest/native/native_world_state.d.ts +12 -9
- package/dest/native/native_world_state.d.ts.map +1 -1
- package/dest/native/native_world_state.js +14 -10
- package/dest/native/native_world_state_instance.d.ts +10 -1
- package/dest/native/native_world_state_instance.d.ts.map +1 -1
- package/dest/native/native_world_state_instance.js +21 -0
- 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/synchronizer/config.d.ts +1 -1
- package/dest/synchronizer/errors.d.ts +1 -1
- package/dest/synchronizer/errors.d.ts.map +1 -1
- package/dest/synchronizer/factory.d.ts +1 -1
- package/dest/synchronizer/index.d.ts +1 -1
- package/dest/synchronizer/server_world_state_synchronizer.d.ts +10 -27
- package/dest/synchronizer/server_world_state_synchronizer.d.ts.map +1 -1
- package/dest/synchronizer/server_world_state_synchronizer.js +79 -68
- package/dest/test/index.d.ts +1 -1
- package/dest/test/utils.d.ts +16 -9
- package/dest/test/utils.d.ts.map +1 -1
- package/dest/test/utils.js +56 -52
- package/dest/testing.d.ts +2 -2
- package/dest/testing.d.ts.map +1 -1
- package/dest/testing.js +1 -1
- package/dest/world-state-db/index.d.ts +1 -1
- package/dest/world-state-db/merkle_tree_db.d.ts +10 -11
- package/dest/world-state-db/merkle_tree_db.d.ts.map +1 -1
- package/package.json +13 -12
- package/src/instrumentation/instrumentation.ts +10 -42
- package/src/native/merkle_trees_facade.ts +42 -8
- package/src/native/message.ts +23 -22
- package/src/native/native_world_state.ts +33 -21
- package/src/native/native_world_state_instance.ts +28 -0
- package/src/synchronizer/server_world_state_synchronizer.ts +100 -97
- package/src/test/utils.ts +89 -94
- package/src/testing.ts +1 -1
- package/src/world-state-db/merkle_tree_db.ts +13 -10
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { MAX_NOTE_HASHES_PER_TX, MAX_NULLIFIERS_PER_TX, NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP } from '@aztec/constants';
|
|
2
|
+
import { BlockNumber } from '@aztec/foundation/branded-types';
|
|
2
3
|
import { fromEntries, padArrayEnd } from '@aztec/foundation/collection';
|
|
4
|
+
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
3
5
|
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
4
|
-
import { Fr } from '@aztec/foundation/fields';
|
|
5
6
|
import { tryRmDir } from '@aztec/foundation/fs';
|
|
6
7
|
import { createLogger } from '@aztec/foundation/log';
|
|
7
8
|
import { DatabaseVersionManager } from '@aztec/stdlib/database-version';
|
|
@@ -115,23 +116,26 @@ export class NativeWorldStateService {
|
|
|
115
116
|
getSnapshot(blockNumber) {
|
|
116
117
|
return new MerkleTreesFacade(this.instance, this.initialHeader, new WorldStateRevision(/*forkId=*/ 0, /* blockNumber=*/ blockNumber, /* includeUncommitted=*/ false));
|
|
117
118
|
}
|
|
118
|
-
async fork(blockNumber) {
|
|
119
|
+
async fork(blockNumber, opts = {}) {
|
|
119
120
|
const resp = await this.instance.call(WorldStateMessageType.CREATE_FORK, {
|
|
120
121
|
latest: blockNumber === undefined,
|
|
121
|
-
blockNumber: blockNumber ??
|
|
122
|
+
blockNumber: blockNumber ?? BlockNumber.ZERO,
|
|
122
123
|
canonical: true
|
|
123
124
|
});
|
|
124
|
-
return new MerkleTreesForkFacade(this.instance, this.initialHeader, new WorldStateRevision(/*forkId=*/ resp.forkId, /* blockNumber=*/
|
|
125
|
+
return new MerkleTreesForkFacade(this.instance, this.initialHeader, new WorldStateRevision(/*forkId=*/ resp.forkId, /* blockNumber=*/ BlockNumber.ZERO, /* includeUncommitted=*/ true), opts);
|
|
125
126
|
}
|
|
126
127
|
getInitialHeader() {
|
|
127
128
|
return this.initialHeader;
|
|
128
129
|
}
|
|
129
|
-
async handleL2BlockAndMessages(l2Block, l1ToL2Messages
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
130
|
+
async handleL2BlockAndMessages(l2Block, l1ToL2Messages) {
|
|
131
|
+
const isFirstBlock = l2Block.indexWithinCheckpoint === 0;
|
|
132
|
+
if (!isFirstBlock && l1ToL2Messages.length > 0) {
|
|
133
|
+
throw new Error(`L1 to L2 messages must be empty for non-first blocks, but got ${l1ToL2Messages.length} messages for block ${l2Block.number}.`);
|
|
134
|
+
}
|
|
135
|
+
// We have to pad the given l1 to l2 messages, and the note hashes and nullifiers within tx effects, because that's
|
|
136
|
+
// how the trees are built by circuits.
|
|
134
137
|
const paddedL1ToL2Messages = isFirstBlock ? padArrayEnd(l1ToL2Messages, Fr.ZERO, NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP) : [];
|
|
138
|
+
const paddedNoteHashes = l2Block.body.txEffects.flatMap((txEffect)=>padArrayEnd(txEffect.noteHashes, Fr.ZERO, MAX_NOTE_HASHES_PER_TX));
|
|
135
139
|
const paddedNullifiers = l2Block.body.txEffects.flatMap((txEffect)=>padArrayEnd(txEffect.nullifiers, Fr.ZERO, MAX_NULLIFIERS_PER_TX)).map((nullifier)=>new NullifierLeaf(nullifier));
|
|
136
140
|
const publicDataWrites = l2Block.body.txEffects.flatMap((txEffect)=>{
|
|
137
141
|
return txEffect.publicDataWrites.map((write)=>{
|
|
@@ -144,7 +148,7 @@ export class NativeWorldStateService {
|
|
|
144
148
|
try {
|
|
145
149
|
return await this.instance.call(WorldStateMessageType.SYNC_BLOCK, {
|
|
146
150
|
blockNumber: l2Block.number,
|
|
147
|
-
blockHeaderHash: await l2Block.
|
|
151
|
+
blockHeaderHash: await l2Block.hash(),
|
|
148
152
|
paddedL1ToL2Messages: paddedL1ToL2Messages.map(serializeLeaf),
|
|
149
153
|
paddedNoteHashes: paddedNoteHashes.map(serializeLeaf),
|
|
150
154
|
paddedNullifiers: paddedNullifiers.map(serializeLeaf),
|
|
@@ -5,6 +5,7 @@ import type { WorldStateTreeMapSizes } from '../synchronizer/factory.js';
|
|
|
5
5
|
import { WorldStateMessageType, type WorldStateRequest, type WorldStateRequestCategories, type WorldStateResponse } from './message.js';
|
|
6
6
|
export interface NativeWorldStateInstance {
|
|
7
7
|
call<T extends WorldStateMessageType>(messageType: T, body: WorldStateRequest[T] & WorldStateRequestCategories): Promise<WorldStateResponse[T]>;
|
|
8
|
+
getHandle(): any;
|
|
8
9
|
}
|
|
9
10
|
/**
|
|
10
11
|
* Strongly-typed interface to access the WorldState class in the native world_state_napi module.
|
|
@@ -22,6 +23,14 @@ export declare class NativeWorldState implements NativeWorldStateInstance {
|
|
|
22
23
|
constructor(dataDir: string, wsTreeMapSizes: WorldStateTreeMapSizes, prefilledPublicData: PublicDataTreeLeaf[] | undefined, instrumentation: WorldStateInstrumentation, log?: Logger);
|
|
23
24
|
getDataDir(): string;
|
|
24
25
|
clone(): NativeWorldState;
|
|
26
|
+
/**
|
|
27
|
+
* Gets the native WorldState handle from the underlying native instance.
|
|
28
|
+
* We call the getHandle() method on the native WorldState to get a NAPI External
|
|
29
|
+
* that wraps the underlying C++ WorldState pointer.
|
|
30
|
+
* @returns The NAPI External handle to the native WorldState instance,since
|
|
31
|
+
* the NAPI external type is opaque, we return any (we could also use an opaque symbol type)
|
|
32
|
+
*/
|
|
33
|
+
getHandle(): any;
|
|
25
34
|
/**
|
|
26
35
|
* Sends a message to the native instance and returns the response.
|
|
27
36
|
* @param messageType - The type of message to send
|
|
@@ -37,4 +46,4 @@ export declare class NativeWorldState implements NativeWorldStateInstance {
|
|
|
37
46
|
close(): Promise<void>;
|
|
38
47
|
private _sendMessage;
|
|
39
48
|
}
|
|
40
|
-
//# sourceMappingURL=
|
|
49
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF0aXZlX3dvcmxkX3N0YXRlX2luc3RhbmNlLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbmF0aXZlL25hdGl2ZV93b3JsZF9zdGF0ZV9pbnN0YW5jZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFVQSxPQUFPLEVBQUUsS0FBSyxNQUFNLEVBQWdCLE1BQU0sdUJBQXVCLENBQUM7QUFHbEUsT0FBTyxLQUFLLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUs5RCxPQUFPLEtBQUssRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQ3ZGLE9BQU8sS0FBSyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDekUsT0FBTyxFQUNMLHFCQUFxQixFQUNyQixLQUFLLGlCQUFpQixFQUN0QixLQUFLLDJCQUEyQixFQUNoQyxLQUFLLGtCQUFrQixFQUl4QixNQUFNLGNBQWMsQ0FBQztBQUt0QixNQUFNLFdBQVcsd0JBQXdCO0lBQ3ZDLElBQUksQ0FBQyxDQUFDLFNBQVMscUJBQXFCLEVBQ2xDLFdBQVcsRUFBRSxDQUFDLEVBQ2QsSUFBSSxFQUFFLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxHQUFHLDJCQUEyQixHQUN2RCxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUVsQyxTQUFTLElBQUksR0FBRyxDQUFDO0NBQ2xCO0FBRUQ7O0dBRUc7QUFDSCxxQkFBYSxnQkFBaUIsWUFBVyx3QkFBd0I7SUFVN0QsT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPO0lBQ3hCLE9BQU8sQ0FBQyxRQUFRLENBQUMsY0FBYztJQUMvQixPQUFPLENBQUMsUUFBUSxDQUFDLG1CQUFtQjtJQUNwQyxPQUFPLENBQUMsUUFBUSxDQUFDLGVBQWU7SUFDaEMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHO0lBYnRCLE9BQU8sQ0FBQyxJQUFJLENBQVE7SUFHcEIsT0FBTyxDQUFDLE1BQU0sQ0FBeUM7SUFFdkQsT0FBTyxDQUFDLFFBQVEsQ0FBK0U7SUFFL0YsK0NBQStDO0lBQy9DLFlBQ21CLE9BQU8sRUFBRSxNQUFNLEVBQ2YsY0FBYyxFQUFFLHNCQUFzQixFQUN0QyxtQkFBbUIsa0NBQTJCLEVBQzlDLGVBQWUsRUFBRSx5QkFBeUIsRUFDMUMsR0FBRyxHQUFFLE1BQTZDLEVBb0NwRTtJQUVNLFVBQVUsV0FFaEI7SUFFTSxLQUFLLHFCQVFYO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksU0FBUyxJQUFJLEdBQUcsQ0FpQnRCO0lBRUQ7Ozs7Ozs7T0FPRztJQUNVLElBQUksQ0FBQyxDQUFDLFNBQVMscUJBQXFCLEVBQy9DLFdBQVcsRUFBRSxDQUFDLEVBQ2QsSUFBSSxFQUFFLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxHQUFHLDJCQUEyQixFQUV4RCxlQUFlLDZEQUF1RSxFQUN0RixZQUFZLHNCQUFvQixHQUMvQixPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FxRGhDO0lBRUQ7O09BRUc7SUFDVSxLQUFLLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxDQWVsQztZQUVhLFlBQVk7Q0E4RDNCIn0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"native_world_state_instance.d.ts","sourceRoot":"","sources":["../../src/native/native_world_state_instance.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,uBAAuB,CAAC;AAGlE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAK9D,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,uCAAuC,CAAC;AACvF,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACzE,OAAO,EACL,qBAAqB,EACrB,KAAK,iBAAiB,EACtB,KAAK,2BAA2B,EAChC,KAAK,kBAAkB,EAIxB,MAAM,cAAc,CAAC;AAKtB,MAAM,WAAW,wBAAwB;IACvC,IAAI,CAAC,CAAC,SAAS,qBAAqB,EAClC,WAAW,EAAE,CAAC,EACd,IAAI,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,2BAA2B,GACvD,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"native_world_state_instance.d.ts","sourceRoot":"","sources":["../../src/native/native_world_state_instance.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,uBAAuB,CAAC;AAGlE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAK9D,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,uCAAuC,CAAC;AACvF,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACzE,OAAO,EACL,qBAAqB,EACrB,KAAK,iBAAiB,EACtB,KAAK,2BAA2B,EAChC,KAAK,kBAAkB,EAIxB,MAAM,cAAc,CAAC;AAKtB,MAAM,WAAW,wBAAwB;IACvC,IAAI,CAAC,CAAC,SAAS,qBAAqB,EAClC,WAAW,EAAE,CAAC,EACd,IAAI,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,2BAA2B,GACvD,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC;IAElC,SAAS,IAAI,GAAG,CAAC;CAClB;AAED;;GAEG;AACH,qBAAa,gBAAiB,YAAW,wBAAwB;IAU7D,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,mBAAmB;IACpC,OAAO,CAAC,QAAQ,CAAC,eAAe;IAChC,OAAO,CAAC,QAAQ,CAAC,GAAG;IAbtB,OAAO,CAAC,IAAI,CAAQ;IAGpB,OAAO,CAAC,MAAM,CAAyC;IAEvD,OAAO,CAAC,QAAQ,CAA+E;IAE/F,+CAA+C;IAC/C,YACmB,OAAO,EAAE,MAAM,EACf,cAAc,EAAE,sBAAsB,EACtC,mBAAmB,kCAA2B,EAC9C,eAAe,EAAE,yBAAyB,EAC1C,GAAG,GAAE,MAA6C,EAoCpE;IAEM,UAAU,WAEhB;IAEM,KAAK,qBAQX;IAED;;;;;;OAMG;IACI,SAAS,IAAI,GAAG,CAiBtB;IAED;;;;;;;OAOG;IACU,IAAI,CAAC,CAAC,SAAS,qBAAqB,EAC/C,WAAW,EAAE,CAAC,EACd,IAAI,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,2BAA2B,EAExD,eAAe,6DAAuE,EACtF,YAAY,sBAAoB,GAC/B,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAqDhC;IAED;;OAEG;IACU,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAelC;YAEa,YAAY;CA8D3B"}
|
|
@@ -60,6 +60,27 @@ const MAX_WORLD_STATE_THREADS = +(process.env.HARDWARE_CONCURRENCY || '16');
|
|
|
60
60
|
return new NativeWorldState(this.dataDir, this.wsTreeMapSizes, this.prefilledPublicData, this.instrumentation, this.log);
|
|
61
61
|
}
|
|
62
62
|
/**
|
|
63
|
+
* Gets the native WorldState handle from the underlying native instance.
|
|
64
|
+
* We call the getHandle() method on the native WorldState to get a NAPI External
|
|
65
|
+
* that wraps the underlying C++ WorldState pointer.
|
|
66
|
+
* @returns The NAPI External handle to the native WorldState instance,since
|
|
67
|
+
* the NAPI external type is opaque, we return any (we could also use an opaque symbol type)
|
|
68
|
+
*/ getHandle() {
|
|
69
|
+
const worldStateWrapper = this.instance.dest;
|
|
70
|
+
if (!worldStateWrapper) {
|
|
71
|
+
throw new Error('No WorldStateWrapper found');
|
|
72
|
+
}
|
|
73
|
+
if (typeof worldStateWrapper.getHandle !== 'function') {
|
|
74
|
+
throw new Error('WorldStateWrapper does not have getHandle method');
|
|
75
|
+
}
|
|
76
|
+
// Call getHandle() to get the NAPI External
|
|
77
|
+
try {
|
|
78
|
+
return worldStateWrapper.getHandle();
|
|
79
|
+
} catch (error) {
|
|
80
|
+
this.log.error('Failed to get native WorldState handle', error);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
63
84
|
* Sends a message to the native instance and returns the response.
|
|
64
85
|
* @param messageType - The type of message to send
|
|
65
86
|
* @param body - The message body
|
|
@@ -16,4 +16,4 @@ export declare class WorldStateOpsQueue {
|
|
|
16
16
|
private sendEnqueuedRequest;
|
|
17
17
|
stop(): Promise<void>;
|
|
18
18
|
}
|
|
19
|
-
//# sourceMappingURL=
|
|
19
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ybGRfc3RhdGVfb3BzX3F1ZXVlLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbmF0aXZlL3dvcmxkX3N0YXRlX29wc19xdWV1ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUF5QnJELGVBQU8sTUFBTSxrQkFBa0IsNEJBZ0I3QixDQUFDO0FBR0gscUJBQWEsa0JBQWtCO0lBQzdCLE9BQU8sQ0FBQyxRQUFRLENBQXNCO0lBQ3RDLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBSztJQUNsQyxPQUFPLENBQUMsYUFBYSxDQUFLO0lBQzFCLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBZ0I7SUFDcEMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFhO0lBQ2pDLE9BQU8sQ0FBQyxTQUFTLENBQUs7SUFDdEIsT0FBTyxDQUFDLEdBQUcsQ0FBd0M7SUFJNUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxXQUFXLEVBQUUscUJBQXFCLEVBQUUsYUFBYSxFQUFFLE9BQU8sZ0JBc0JyRztJQUdELE9BQU8sQ0FBQyxlQUFlO0lBV3ZCLE9BQU8sQ0FBQyw2QkFBNkI7SUFZckMsT0FBTyxDQUFDLDJCQUEyQjtJQVVuQyxPQUFPLENBQUMsZUFBZTtJQXlDdkIsT0FBTyxDQUFDLG1CQUFtQjtJQWdCcEIsSUFBSSxrQkFnQlY7Q0FDRiJ9
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"world_state_ops_queue.d.ts","sourceRoot":"","sources":["../../src/native/world_state_ops_queue.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAyBrD,eAAO,MAAM,kBAAkB,4BAgB7B,CAAC;AAGH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAsB;IACtC,OAAO,CAAC,qBAAqB,CAAK;IAClC,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,WAAW,CAAC,CAAgB;IACpC,OAAO,CAAC,WAAW,CAAC,CAAa;IACjC,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,GAAG,CAAwC;IAI5C,OAAO,CAAC,OAAO,EAAE,MAAM,OAAO,CAAC,GAAG,CAAC,EAAE,WAAW,EAAE,qBAAqB,EAAE,aAAa,EAAE,OAAO;
|
|
1
|
+
{"version":3,"file":"world_state_ops_queue.d.ts","sourceRoot":"","sources":["../../src/native/world_state_ops_queue.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAyBrD,eAAO,MAAM,kBAAkB,4BAgB7B,CAAC;AAGH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAsB;IACtC,OAAO,CAAC,qBAAqB,CAAK;IAClC,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,WAAW,CAAC,CAAgB;IACpC,OAAO,CAAC,WAAW,CAAC,CAAa;IACjC,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,GAAG,CAAwC;IAI5C,OAAO,CAAC,OAAO,EAAE,MAAM,OAAO,CAAC,GAAG,CAAC,EAAE,WAAW,EAAE,qBAAqB,EAAE,aAAa,EAAE,OAAO,gBAsBrG;IAGD,OAAO,CAAC,eAAe;IAWvB,OAAO,CAAC,6BAA6B;IAYrC,OAAO,CAAC,2BAA2B;IAUnC,OAAO,CAAC,eAAe;IAyCvB,OAAO,CAAC,mBAAmB;IAgBpB,IAAI,kBAgBV;CACF"}
|
|
@@ -30,4 +30,4 @@ export declare const worldStateConfigMappings: ConfigMappingsType<WorldStateConf
|
|
|
30
30
|
* @returns The configuration values for the world state synchronizer.
|
|
31
31
|
*/
|
|
32
32
|
export declare function getWorldStateConfigFromEnv(): WorldStateConfig;
|
|
33
|
-
//# sourceMappingURL=
|
|
33
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc3luY2hyb25pemVyL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsS0FBSyxrQkFBa0IsRUFJeEIsTUFBTSwwQkFBMEIsQ0FBQztBQUVsQyxxREFBcUQ7QUFDckQsTUFBTSxXQUFXLGdCQUFnQjtJQUMvQix1Q0FBdUM7SUFDdkMsOEJBQThCLEVBQUUsTUFBTSxDQUFDO0lBRXZDLCtDQUErQztJQUMvQywwQkFBMEIsRUFBRSxPQUFPLENBQUM7SUFFcEMsMkZBQTJGO0lBQzNGLCtCQUErQixDQUFDLEVBQUUsTUFBTSxDQUFDO0lBRXpDLG1KQUFtSjtJQUNuSixxQkFBcUIsQ0FBQyxFQUFFLE1BQU0sQ0FBQztJQUUvQiwySkFBMko7SUFDM0osb0JBQW9CLENBQUMsRUFBRSxNQUFNLENBQUM7SUFFOUIsNkpBQTZKO0lBQzdKLHNCQUFzQixDQUFDLEVBQUUsTUFBTSxDQUFDO0lBRWhDLDZKQUE2SjtJQUM3SixxQkFBcUIsQ0FBQyxFQUFFLE1BQU0sQ0FBQztJQUUvQiwySkFBMko7SUFDM0osb0JBQW9CLENBQUMsRUFBRSxNQUFNLENBQUM7SUFFOUIsK0pBQStKO0lBQy9KLHVCQUF1QixDQUFDLEVBQUUsTUFBTSxDQUFDO0lBRWpDLDJHQUEyRztJQUMzRyx1QkFBdUIsQ0FBQyxFQUFFLE1BQU0sQ0FBQztJQUVqQyxnREFBZ0Q7SUFDaEQsc0JBQXNCLEVBQUUsTUFBTSxDQUFDO0NBQ2hDO0FBRUQsZUFBTyxNQUFNLHdCQUF3QixFQUFFLGtCQUFrQixDQUFDLGdCQUFnQixDQTZEekUsQ0FBQztBQUVGOzs7R0FHRztBQUNILHdCQUFnQiwwQkFBMEIsSUFBSSxnQkFBZ0IsQ0FFN0QifQ==
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
export declare class WorldStateSynchronizerError extends Error {
|
|
2
2
|
constructor(message: string, options?: ErrorOptions);
|
|
3
3
|
}
|
|
4
|
-
//# sourceMappingURL=
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JzLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc3luY2hyb25pemVyL2Vycm9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxxQkFBYSwyQkFBNEIsU0FBUSxLQUFLO0lBQ3BELFlBQVksT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsRUFBRSxZQUFZLEVBRWxEO0NBQ0YifQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/synchronizer/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,2BAA4B,SAAQ,KAAK;
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/synchronizer/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,2BAA4B,SAAQ,KAAK;IACpD,YAAY,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,EAElD;CACF"}
|
|
@@ -16,4 +16,4 @@ export interface WorldStateTreeMapSizes {
|
|
|
16
16
|
}
|
|
17
17
|
export declare function createWorldStateSynchronizer(config: WorldStateConfig & DataStoreConfig, l2BlockSource: L2BlockSource & L1ToL2MessageSource, prefilledPublicData?: PublicDataTreeLeaf[], client?: TelemetryClient): Promise<ServerWorldStateSynchronizer>;
|
|
18
18
|
export declare function createWorldState(config: Pick<WorldStateConfig, 'worldStateDataDirectory' | 'worldStateDbMapSizeKb' | 'archiveTreeMapSizeKb' | 'nullifierTreeMapSizeKb' | 'noteHashTreeMapSizeKb' | 'messageTreeMapSizeKb' | 'publicDataTreeMapSizeKb'> & Pick<DataStoreConfig, 'dataDirectory' | 'dataStoreMapSizeKb' | 'l1Contracts'>, prefilledPublicData?: PublicDataTreeLeaf[], instrumentation?: WorldStateInstrumentation): Promise<NativeWorldStateService>;
|
|
19
|
-
//# sourceMappingURL=
|
|
19
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFjdG9yeS5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N5bmNocm9uaXplci9mYWN0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzlELE9BQU8sS0FBSyxFQUFFLGFBQWEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3pELE9BQU8sS0FBSyxFQUFFLG1CQUFtQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDbkUsT0FBTyxLQUFLLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUM5RCxPQUFPLEVBQUUsS0FBSyxlQUFlLEVBQXNCLE1BQU0seUJBQXlCLENBQUM7QUFFbkYsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDbEYsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDMUUsT0FBTyxLQUFLLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDcEQsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFFcEYsTUFBTSxXQUFXLHNCQUFzQjtJQUNyQyxvQkFBb0IsRUFBRSxNQUFNLENBQUM7SUFDN0Isc0JBQXNCLEVBQUUsTUFBTSxDQUFDO0lBQy9CLHFCQUFxQixFQUFFLE1BQU0sQ0FBQztJQUM5QixvQkFBb0IsRUFBRSxNQUFNLENBQUM7SUFDN0IsdUJBQXVCLEVBQUUsTUFBTSxDQUFDO0NBQ2pDO0FBRUQsd0JBQXNCLDRCQUE0QixDQUNoRCxNQUFNLEVBQUUsZ0JBQWdCLEdBQUcsZUFBZSxFQUMxQyxhQUFhLEVBQUUsYUFBYSxHQUFHLG1CQUFtQixFQUNsRCxtQkFBbUIsR0FBRSxrQkFBa0IsRUFBTyxFQUM5QyxNQUFNLEdBQUUsZUFBc0MseUNBSy9DO0FBRUQsd0JBQXNCLGdCQUFnQixDQUNwQyxNQUFNLEVBQUUsSUFBSSxDQUNWLGdCQUFnQixFQUNkLHlCQUF5QixHQUN6Qix1QkFBdUIsR0FDdkIsc0JBQXNCLEdBQ3RCLHdCQUF3QixHQUN4Qix1QkFBdUIsR0FDdkIsc0JBQXNCLEdBQ3RCLHlCQUF5QixDQUM1QixHQUNDLElBQUksQ0FBQyxlQUFlLEVBQUUsZUFBZSxHQUFHLG9CQUFvQixHQUFHLGFBQWEsQ0FBQyxFQUMvRSxtQkFBbUIsR0FBRSxrQkFBa0IsRUFBTyxFQUM5QyxlQUFlLEdBQUUseUJBQStFLG9DQWdDakcifQ==
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
export * from './server_world_state_synchronizer.js';
|
|
2
2
|
export * from './factory.js';
|
|
3
|
-
//# sourceMappingURL=
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zeW5jaHJvbml6ZXIvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxzQ0FBc0MsQ0FBQztBQUNyRCxjQUFjLGNBQWMsQ0FBQyJ9
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { BlockNumber } from '@aztec/foundation/branded-types';
|
|
2
2
|
import { type Logger } from '@aztec/foundation/log';
|
|
3
|
-
import type
|
|
3
|
+
import { type L2BlockSource, L2BlockStream, type L2BlockStreamEvent, type L2BlockStreamEventHandler, type L2BlockStreamLocalDataProvider, type L2Tips } from '@aztec/stdlib/block';
|
|
4
4
|
import { type WorldStateSynchronizer, type WorldStateSynchronizerStatus } from '@aztec/stdlib/interfaces/server';
|
|
5
5
|
import type { L1ToL2MessageSource } from '@aztec/stdlib/messaging';
|
|
6
6
|
import type { SnapshotDataKeys } from '@aztec/stdlib/snapshots';
|
|
@@ -24,21 +24,22 @@ export declare class ServerWorldStateSynchronizer implements WorldStateSynchroni
|
|
|
24
24
|
private latestBlockNumberAtStart;
|
|
25
25
|
private historyToKeep;
|
|
26
26
|
private currentState;
|
|
27
|
-
private latestBlockHashQuery;
|
|
28
27
|
private syncPromise;
|
|
29
28
|
protected blockStream: L2BlockStream | undefined;
|
|
30
29
|
private provenBlockNumber;
|
|
31
30
|
constructor(merkleTreeDb: MerkleTreeAdminDatabase, l2BlockSource: L2BlockSource & L1ToL2MessageSource, config: WorldStateConfig, instrumentation?: WorldStateInstrumentation, log?: Logger);
|
|
32
31
|
getCommitted(): MerkleTreeReadOperations;
|
|
33
|
-
getSnapshot(blockNumber:
|
|
34
|
-
fork(blockNumber?:
|
|
32
|
+
getSnapshot(blockNumber: BlockNumber): MerkleTreeReadOperations;
|
|
33
|
+
fork(blockNumber?: BlockNumber, opts?: {
|
|
34
|
+
closeDelayMs?: number;
|
|
35
|
+
}): Promise<MerkleTreeWriteOperations>;
|
|
35
36
|
backupTo(dstPath: string, compact?: boolean): Promise<Record<Exclude<SnapshotDataKeys, 'archiver'>, string>>;
|
|
36
37
|
clear(): Promise<void>;
|
|
37
38
|
start(): Promise<void | import("@aztec/foundation/promise").PromiseWithResolvers<void>>;
|
|
38
39
|
protected createBlockStream(): L2BlockStream;
|
|
39
40
|
stop(): Promise<void>;
|
|
40
41
|
status(): Promise<WorldStateSynchronizerStatus>;
|
|
41
|
-
getLatestBlockNumber(): Promise<
|
|
42
|
+
getLatestBlockNumber(): Promise<BlockNumber>;
|
|
42
43
|
stopSync(): Promise<void>;
|
|
43
44
|
resumeSync(): void;
|
|
44
45
|
/**
|
|
@@ -47,25 +48,14 @@ export declare class ServerWorldStateSynchronizer implements WorldStateSynchroni
|
|
|
47
48
|
* @param skipThrowIfTargetNotReached - Whether to skip throwing if the target block number is not reached.
|
|
48
49
|
* @returns A promise that resolves with the block number the world state was synced to
|
|
49
50
|
*/
|
|
50
|
-
syncImmediate(targetBlockNumber?:
|
|
51
|
+
syncImmediate(targetBlockNumber?: BlockNumber, skipThrowIfTargetNotReached?: boolean): Promise<BlockNumber>;
|
|
51
52
|
/** Returns the L2 block hash for a given number. Used by the L2BlockStream for detecting reorgs. */
|
|
52
|
-
getL2BlockHash(number:
|
|
53
|
+
getL2BlockHash(number: BlockNumber): Promise<string | undefined>;
|
|
53
54
|
/** Returns the latest L2 block number for each tip of the chain (latest, proven, finalized). */
|
|
54
55
|
getL2Tips(): Promise<L2Tips>;
|
|
55
56
|
/** Handles an event emitted by the block stream. */
|
|
56
57
|
handleBlockStreamEvent(event: L2BlockStreamEvent): Promise<void>;
|
|
57
|
-
/**
|
|
58
|
-
* Handles a list of L2 blocks (i.e. Inserts the new note hashes into the merkle tree).
|
|
59
|
-
* @param l2Blocks - The L2 blocks to handle.
|
|
60
|
-
* @returns Whether the block handled was produced by this same node.
|
|
61
|
-
*/
|
|
62
58
|
private handleL2Blocks;
|
|
63
|
-
/**
|
|
64
|
-
* Handles a single L2 block (i.e. Inserts the new note hashes into the merkle tree).
|
|
65
|
-
* @param l2Block - The L2 block to handle.
|
|
66
|
-
* @param l1ToL2Messages - The L1 to L2 messages for the block.
|
|
67
|
-
* @returns Whether the block handled was produced by this same node.
|
|
68
|
-
*/
|
|
69
59
|
private handleL2Block;
|
|
70
60
|
private handleChainFinalized;
|
|
71
61
|
private handleChainProven;
|
|
@@ -75,12 +65,5 @@ export declare class ServerWorldStateSynchronizer implements WorldStateSynchroni
|
|
|
75
65
|
* @param newState - New state value.
|
|
76
66
|
*/
|
|
77
67
|
private setCurrentState;
|
|
78
|
-
/**
|
|
79
|
-
* Verifies that the L1 to L2 messages hash to the block inHash.
|
|
80
|
-
* @param l1ToL2Messages - The L1 to L2 messages for the block.
|
|
81
|
-
* @param inHash - The inHash of the block.
|
|
82
|
-
* @throws If the L1 to L2 messages do not hash to the block inHash.
|
|
83
|
-
*/
|
|
84
|
-
protected verifyMessagesHashToInHash(l1ToL2Messages: Fr[], inHash: Fr): Promise<void>;
|
|
85
68
|
}
|
|
86
|
-
//# sourceMappingURL=
|
|
69
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyX3dvcmxkX3N0YXRlX3N5bmNocm9uaXplci5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N5bmNocm9uaXplci9zZXJ2ZXJfd29ybGRfc3RhdGVfc3luY2hyb25pemVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUU5RCxPQUFPLEVBQUUsS0FBSyxNQUFNLEVBQWdCLE1BQU0sdUJBQXVCLENBQUM7QUFHbEUsT0FBTyxFQUlMLEtBQUssYUFBYSxFQUNsQixhQUFhLEVBQ2IsS0FBSyxrQkFBa0IsRUFDdkIsS0FBSyx5QkFBeUIsRUFDOUIsS0FBSyw4QkFBOEIsRUFDbkMsS0FBSyxNQUFNLEVBQ1osTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBR0wsS0FBSyxzQkFBc0IsRUFDM0IsS0FBSyw0QkFBNEIsRUFDbEMsTUFBTSxpQ0FBaUMsQ0FBQztBQUN6QyxPQUFPLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ25FLE9BQU8sS0FBSyxFQUFFLGdCQUFnQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFaEUsT0FBTyxFQUFnQixLQUFLLHdCQUF3QixFQUFFLEtBQUsseUJBQXlCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUdsSCxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUVsRixPQUFPLEtBQUssRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ25GLE9BQU8sS0FBSyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBR3BELFlBQVksRUFBRSxnQkFBZ0IsRUFBRSxDQUFDO0FBRWpDOzs7O0dBSUc7QUFDSCxxQkFBYSw0QkFDWCxZQUFXLHNCQUFzQixFQUFFLDhCQUE4QixFQUFFLHlCQUF5QjtJQWdCMUYsT0FBTyxDQUFDLFFBQVEsQ0FBQyxZQUFZO0lBQzdCLE9BQU8sQ0FBQyxRQUFRLENBQUMsYUFBYTtJQUM5QixPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU07SUFDdkIsT0FBTyxDQUFDLGVBQWU7SUFDdkIsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHO0lBbEJ0QixPQUFPLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUEyQjtJQUUvRCxPQUFPLENBQUMsd0JBQXdCLENBQW9CO0lBQ3BELE9BQU8sQ0FBQyxhQUFhLENBQXFCO0lBQzFDLE9BQU8sQ0FBQyxZQUFZLENBQXVEO0lBRTNFLE9BQU8sQ0FBQyxXQUFXLENBQWdDO0lBQ25ELFNBQVMsQ0FBQyxXQUFXLEVBQUUsYUFBYSxHQUFHLFNBQVMsQ0FBQztJQUlqRCxPQUFPLENBQUMsaUJBQWlCLENBQTBCO0lBRW5ELFlBQ21CLFlBQVksRUFBRSx1QkFBdUIsRUFDckMsYUFBYSxFQUFFLGFBQWEsR0FBRyxtQkFBbUIsRUFDbEQsTUFBTSxFQUFFLGdCQUFnQixFQUNqQyxlQUFlLDRCQUFzRCxFQUM1RCxHQUFHLEdBQUUsTUFBb0MsRUFTM0Q7SUFFTSxZQUFZLElBQUksd0JBQXdCLENBRTlDO0lBRU0sV0FBVyxDQUFDLFdBQVcsRUFBRSxXQUFXLEdBQUcsd0JBQXdCLENBRXJFO0lBRU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsRUFBRTtRQUFFLFlBQVksQ0FBQyxFQUFFLE1BQU0sQ0FBQTtLQUFFLEdBQUcsT0FBTyxDQUFDLHlCQUF5QixDQUFDLENBRTNHO0lBRU0sUUFBUSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLEVBQUUsT0FBTyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGdCQUFnQixFQUFFLFVBQVUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBRWxIO0lBRU0sS0FBSyxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FFNUI7SUFFWSxLQUFLLG1GQWdDakI7SUFFRCxTQUFTLENBQUMsaUJBQWlCLElBQUksYUFBYSxDQVEzQztJQUVZLElBQUksa0JBT2hCO0lBRVksTUFBTSxJQUFJLE9BQU8sQ0FBQyw0QkFBNEIsQ0FBQyxDQWEzRDtJQUVZLG9CQUFvQix5QkFFaEM7SUFFWSxRQUFRLGtCQUlwQjtJQUVNLFVBQVUsU0FPaEI7SUFFRDs7Ozs7T0FLRztJQUNVLGFBQWEsQ0FDeEIsaUJBQWlCLENBQUMsRUFBRSxXQUFXLEVBQy9CLDJCQUEyQixDQUFDLEVBQUUsT0FBTyxHQUNwQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBNkN0QjtJQUVELG9HQUFvRztJQUN2RixjQUFjLENBQUMsTUFBTSxFQUFFLFdBQVcsR0FBRyxPQUFPLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQyxDQUs1RTtJQUVELGdHQUFnRztJQUNuRixTQUFTLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQW1DeEM7SUFFRCxvREFBb0Q7SUFDdkMsc0JBQXNCLENBQUMsS0FBSyxFQUFFLGtCQUFrQixHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FlNUU7WUFPYSxjQUFjO1lBeUNkLGFBQWE7WUFnQmIsb0JBQW9CO0lBZWxDLE9BQU8sQ0FBQyxpQkFBaUI7WUFNWCxpQkFBaUI7SUFPL0I7OztPQUdHO0lBQ0gsT0FBTyxDQUFDLGVBQWU7Q0FJeEIifQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server_world_state_synchronizer.d.ts","sourceRoot":"","sources":["../../src/synchronizer/server_world_state_synchronizer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"server_world_state_synchronizer.d.ts","sourceRoot":"","sources":["../../src/synchronizer/server_world_state_synchronizer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { GENESIS_BLOCK_HEADER_HASH, INITIAL_L2_BLOCK_NUM, INITIAL_L2_CHECKPOINT_NUM } from '@aztec/constants';
|
|
2
|
+
import { BlockNumber } from '@aztec/foundation/branded-types';
|
|
3
3
|
import { createLogger } from '@aztec/foundation/log';
|
|
4
4
|
import { promiseWithResolvers } from '@aztec/foundation/promise';
|
|
5
5
|
import { elapsed } from '@aztec/foundation/timer';
|
|
6
|
-
import {
|
|
6
|
+
import { GENESIS_CHECKPOINT_HEADER_HASH, L2BlockStream } from '@aztec/stdlib/block';
|
|
7
7
|
import { WorldStateRunningState } from '@aztec/stdlib/interfaces/server';
|
|
8
8
|
import { MerkleTreeId } from '@aztec/stdlib/trees';
|
|
9
|
-
import {
|
|
9
|
+
import { getTelemetryClient } from '@aztec/telemetry-client';
|
|
10
10
|
import { WorldStateInstrumentation } from '../instrumentation/instrumentation.js';
|
|
11
11
|
import { WorldStateSynchronizerError } from './errors.js';
|
|
12
12
|
/**
|
|
@@ -23,7 +23,6 @@ import { WorldStateSynchronizerError } from './errors.js';
|
|
|
23
23
|
latestBlockNumberAtStart;
|
|
24
24
|
historyToKeep;
|
|
25
25
|
currentState;
|
|
26
|
-
latestBlockHashQuery;
|
|
27
26
|
syncPromise;
|
|
28
27
|
blockStream;
|
|
29
28
|
// WorldState doesn't track the proven block number, it only tracks the latest tips of the pending chain and the finalized chain
|
|
@@ -35,9 +34,8 @@ import { WorldStateSynchronizerError } from './errors.js';
|
|
|
35
34
|
this.config = config;
|
|
36
35
|
this.instrumentation = instrumentation;
|
|
37
36
|
this.log = log;
|
|
38
|
-
this.latestBlockNumberAtStart =
|
|
37
|
+
this.latestBlockNumberAtStart = BlockNumber.ZERO;
|
|
39
38
|
this.currentState = WorldStateRunningState.IDLE;
|
|
40
|
-
this.latestBlockHashQuery = undefined;
|
|
41
39
|
this.syncPromise = promiseWithResolvers();
|
|
42
40
|
this.merkleTreeCommitted = this.merkleTreeDb.getCommitted();
|
|
43
41
|
this.historyToKeep = config.worldStateBlockHistory < 1 ? undefined : config.worldStateBlockHistory;
|
|
@@ -49,8 +47,8 @@ import { WorldStateSynchronizerError } from './errors.js';
|
|
|
49
47
|
getSnapshot(blockNumber) {
|
|
50
48
|
return this.merkleTreeDb.getSnapshot(blockNumber);
|
|
51
49
|
}
|
|
52
|
-
fork(blockNumber) {
|
|
53
|
-
return this.merkleTreeDb.fork(blockNumber);
|
|
50
|
+
fork(blockNumber, opts) {
|
|
51
|
+
return this.merkleTreeDb.fork(blockNumber, opts);
|
|
54
52
|
}
|
|
55
53
|
backupTo(dstPath, compact) {
|
|
56
54
|
return this.merkleTreeDb.backupTo(dstPath, compact);
|
|
@@ -66,7 +64,7 @@ import { WorldStateSynchronizerError } from './errors.js';
|
|
|
66
64
|
return this.syncPromise;
|
|
67
65
|
}
|
|
68
66
|
// Get the current latest block number
|
|
69
|
-
this.latestBlockNumberAtStart = await (this.config.worldStateProvenBlocksOnly ? this.l2BlockSource.getProvenBlockNumber() : this.l2BlockSource.getBlockNumber());
|
|
67
|
+
this.latestBlockNumberAtStart = BlockNumber(await (this.config.worldStateProvenBlocksOnly ? this.l2BlockSource.getProvenBlockNumber() : this.l2BlockSource.getBlockNumber()));
|
|
70
68
|
const blockToDownloadFrom = await this.getLatestBlockNumber() + 1;
|
|
71
69
|
if (blockToDownloadFrom <= this.latestBlockNumberAtStart) {
|
|
72
70
|
// If there are blocks to be retrieved, go to a synching state
|
|
@@ -84,12 +82,12 @@ import { WorldStateSynchronizerError } from './errors.js';
|
|
|
84
82
|
return this.syncPromise.promise;
|
|
85
83
|
}
|
|
86
84
|
createBlockStream() {
|
|
87
|
-
const tracer = this.instrumentation.telemetry.getTracer('WorldStateL2BlockStream');
|
|
88
85
|
const logger = createLogger('world-state:block_stream');
|
|
89
|
-
return new
|
|
86
|
+
return new L2BlockStream(this.l2BlockSource, this, this, logger, {
|
|
90
87
|
proven: this.config.worldStateProvenBlocksOnly,
|
|
91
88
|
pollIntervalMS: this.config.worldStateBlockCheckIntervalMS,
|
|
92
|
-
batchSize: this.config.worldStateBlockRequestBatchSize
|
|
89
|
+
batchSize: this.config.worldStateBlockRequestBatchSize,
|
|
90
|
+
ignoreCheckpoints: true
|
|
93
91
|
});
|
|
94
92
|
}
|
|
95
93
|
async stop() {
|
|
@@ -103,10 +101,10 @@ import { WorldStateSynchronizerError } from './errors.js';
|
|
|
103
101
|
async status() {
|
|
104
102
|
const summary = await this.merkleTreeDb.getStatusSummary();
|
|
105
103
|
const status = {
|
|
106
|
-
latestBlockNumber:
|
|
107
|
-
latestBlockHash: await this.getL2BlockHash(
|
|
108
|
-
finalizedBlockNumber:
|
|
109
|
-
oldestHistoricBlockNumber:
|
|
104
|
+
latestBlockNumber: summary.unfinalizedBlockNumber,
|
|
105
|
+
latestBlockHash: await this.getL2BlockHash(summary.unfinalizedBlockNumber) ?? '',
|
|
106
|
+
finalizedBlockNumber: summary.finalizedBlockNumber,
|
|
107
|
+
oldestHistoricBlockNumber: summary.oldestHistoricalBlock,
|
|
110
108
|
treesAreSynched: summary.treesAreSynched
|
|
111
109
|
};
|
|
112
110
|
return {
|
|
@@ -115,7 +113,7 @@ import { WorldStateSynchronizerError } from './errors.js';
|
|
|
115
113
|
};
|
|
116
114
|
}
|
|
117
115
|
async getLatestBlockNumber() {
|
|
118
|
-
return (await this.getL2Tips()).
|
|
116
|
+
return (await this.getL2Tips()).proposed.number;
|
|
119
117
|
}
|
|
120
118
|
async stopSync() {
|
|
121
119
|
this.log.debug('Stopping sync...');
|
|
@@ -150,7 +148,7 @@ import { WorldStateSynchronizerError } from './errors.js';
|
|
|
150
148
|
this.log.debug(`World State at ${currentBlockNumber} told to sync to ${targetBlockNumber ?? 'latest'}`);
|
|
151
149
|
// If the archiver is behind the target block, force an archiver sync
|
|
152
150
|
if (targetBlockNumber) {
|
|
153
|
-
const archiverLatestBlock = await this.l2BlockSource.getBlockNumber();
|
|
151
|
+
const archiverLatestBlock = BlockNumber(await this.l2BlockSource.getBlockNumber());
|
|
154
152
|
if (archiverLatestBlock < targetBlockNumber) {
|
|
155
153
|
this.log.debug(`Archiver is at ${archiverLatestBlock} behind target block ${targetBlockNumber}.`);
|
|
156
154
|
await this.l2BlockSource.syncImmediate();
|
|
@@ -173,40 +171,68 @@ import { WorldStateSynchronizerError } from './errors.js';
|
|
|
173
171
|
return updatedBlockNumber;
|
|
174
172
|
}
|
|
175
173
|
/** Returns the L2 block hash for a given number. Used by the L2BlockStream for detecting reorgs. */ async getL2BlockHash(number) {
|
|
176
|
-
if (number ===
|
|
174
|
+
if (number === BlockNumber.ZERO) {
|
|
177
175
|
return (await this.merkleTreeCommitted.getInitialHeader().hash()).toString();
|
|
178
176
|
}
|
|
179
|
-
|
|
180
|
-
this.latestBlockHashQuery = {
|
|
181
|
-
hash: await this.merkleTreeCommitted.getLeafValue(MerkleTreeId.ARCHIVE, BigInt(number)).then((leaf)=>leaf?.toString()),
|
|
182
|
-
blockNumber: number
|
|
183
|
-
};
|
|
184
|
-
}
|
|
185
|
-
return this.latestBlockHashQuery.hash;
|
|
177
|
+
return this.merkleTreeCommitted.getLeafValue(MerkleTreeId.ARCHIVE, BigInt(number)).then((leaf)=>leaf?.toString());
|
|
186
178
|
}
|
|
187
179
|
/** Returns the latest L2 block number for each tip of the chain (latest, proven, finalized). */ async getL2Tips() {
|
|
188
180
|
const status = await this.merkleTreeDb.getStatusSummary();
|
|
189
|
-
const
|
|
181
|
+
const unfinalizedBlockHashPromise = this.getL2BlockHash(status.unfinalizedBlockNumber);
|
|
182
|
+
const finalizedBlockHashPromise = this.getL2BlockHash(status.finalizedBlockNumber);
|
|
183
|
+
const provenBlockNumber = this.provenBlockNumber ?? status.finalizedBlockNumber;
|
|
184
|
+
const provenBlockHashPromise = this.provenBlockNumber === undefined ? finalizedBlockHashPromise : this.getL2BlockHash(this.provenBlockNumber);
|
|
185
|
+
const [unfinalizedBlockHash, finalizedBlockHash, provenBlockHash] = await Promise.all([
|
|
186
|
+
unfinalizedBlockHashPromise,
|
|
187
|
+
finalizedBlockHashPromise,
|
|
188
|
+
provenBlockHashPromise
|
|
189
|
+
]);
|
|
190
190
|
const latestBlockId = {
|
|
191
|
-
number:
|
|
191
|
+
number: status.unfinalizedBlockNumber,
|
|
192
192
|
hash: unfinalizedBlockHash
|
|
193
193
|
};
|
|
194
|
+
// World state doesn't track checkpointed blocks or checkpoints themselves.
|
|
195
|
+
// but we use a block stream so we need to provide 'local' L2Tips.
|
|
196
|
+
// We configure the block stream to ignore checkpoints and set checkpoint values to genesis here.
|
|
197
|
+
const genesisCheckpointHeaderHash = GENESIS_CHECKPOINT_HEADER_HASH.toString();
|
|
194
198
|
return {
|
|
195
|
-
|
|
199
|
+
proposed: latestBlockId,
|
|
200
|
+
checkpointed: {
|
|
201
|
+
block: {
|
|
202
|
+
number: INITIAL_L2_BLOCK_NUM,
|
|
203
|
+
hash: GENESIS_BLOCK_HEADER_HASH.toString()
|
|
204
|
+
},
|
|
205
|
+
checkpoint: {
|
|
206
|
+
number: INITIAL_L2_CHECKPOINT_NUM,
|
|
207
|
+
hash: genesisCheckpointHeaderHash
|
|
208
|
+
}
|
|
209
|
+
},
|
|
196
210
|
finalized: {
|
|
197
|
-
|
|
198
|
-
|
|
211
|
+
block: {
|
|
212
|
+
number: status.finalizedBlockNumber,
|
|
213
|
+
hash: finalizedBlockHash ?? ''
|
|
214
|
+
},
|
|
215
|
+
checkpoint: {
|
|
216
|
+
number: INITIAL_L2_CHECKPOINT_NUM,
|
|
217
|
+
hash: genesisCheckpointHeaderHash
|
|
218
|
+
}
|
|
199
219
|
},
|
|
200
220
|
proven: {
|
|
201
|
-
|
|
202
|
-
|
|
221
|
+
block: {
|
|
222
|
+
number: provenBlockNumber,
|
|
223
|
+
hash: provenBlockHash ?? ''
|
|
224
|
+
},
|
|
225
|
+
checkpoint: {
|
|
226
|
+
number: INITIAL_L2_CHECKPOINT_NUM,
|
|
227
|
+
hash: genesisCheckpointHeaderHash
|
|
228
|
+
}
|
|
203
229
|
}
|
|
204
230
|
};
|
|
205
231
|
}
|
|
206
232
|
/** Handles an event emitted by the block stream. */ async handleBlockStreamEvent(event) {
|
|
207
233
|
switch(event.type){
|
|
208
234
|
case 'blocks-added':
|
|
209
|
-
await this.handleL2Blocks(event.blocks
|
|
235
|
+
await this.handleL2Blocks(event.blocks);
|
|
210
236
|
break;
|
|
211
237
|
case 'chain-pruned':
|
|
212
238
|
await this.handleChainPruned(event.block.number);
|
|
@@ -225,18 +251,22 @@ import { WorldStateSynchronizerError } from './errors.js';
|
|
|
225
251
|
* @returns Whether the block handled was produced by this same node.
|
|
226
252
|
*/ async handleL2Blocks(l2Blocks) {
|
|
227
253
|
this.log.trace(`Handling L2 blocks ${l2Blocks[0].number} to ${l2Blocks.at(-1).number}`);
|
|
228
|
-
|
|
229
|
-
const
|
|
254
|
+
// Fetch the L1->L2 messages for the first block in a checkpoint.
|
|
255
|
+
const messagesForBlocks = new Map();
|
|
256
|
+
await Promise.all(l2Blocks.filter((b)=>b.indexWithinCheckpoint === 0).map(async (block)=>{
|
|
257
|
+
const l1ToL2Messages = await this.l2BlockSource.getL1ToL2Messages(block.checkpointNumber);
|
|
258
|
+
messagesForBlocks.set(block.number, l1ToL2Messages);
|
|
259
|
+
}));
|
|
230
260
|
let updateStatus = undefined;
|
|
231
|
-
for(
|
|
232
|
-
const [duration, result] = await elapsed(()=>this.handleL2Block(
|
|
233
|
-
this.log.info(`World state updated with L2 block ${
|
|
261
|
+
for (const block of l2Blocks){
|
|
262
|
+
const [duration, result] = await elapsed(()=>this.handleL2Block(block, messagesForBlocks.get(block.number) ?? []));
|
|
263
|
+
this.log.info(`World state updated with L2 block ${block.number}`, {
|
|
234
264
|
eventName: 'l2-block-handled',
|
|
235
265
|
duration,
|
|
236
|
-
unfinalizedBlockNumber: result.summary.unfinalizedBlockNumber,
|
|
237
|
-
finalizedBlockNumber: result.summary.finalizedBlockNumber,
|
|
238
|
-
oldestHistoricBlock: result.summary.oldestHistoricalBlock,
|
|
239
|
-
...
|
|
266
|
+
unfinalizedBlockNumber: BigInt(result.summary.unfinalizedBlockNumber),
|
|
267
|
+
finalizedBlockNumber: BigInt(result.summary.finalizedBlockNumber),
|
|
268
|
+
oldestHistoricBlock: BigInt(result.summary.oldestHistoricalBlock),
|
|
269
|
+
...block.getStats()
|
|
240
270
|
});
|
|
241
271
|
updateStatus = result;
|
|
242
272
|
}
|
|
@@ -251,12 +281,6 @@ import { WorldStateSynchronizerError } from './errors.js';
|
|
|
251
281
|
* @param l1ToL2Messages - The L1 to L2 messages for the block.
|
|
252
282
|
* @returns Whether the block handled was produced by this same node.
|
|
253
283
|
*/ async handleL2Block(l2Block, l1ToL2Messages) {
|
|
254
|
-
// First we check that the L1 to L2 messages hash to the block inHash.
|
|
255
|
-
// Note that we cannot optimize this check by checking the root of the subtree after inserting the messages
|
|
256
|
-
// to the real L1_TO_L2_MESSAGE_TREE (like we do in merkleTreeDb.handleL2BlockAndMessages(...)) because that
|
|
257
|
-
// tree uses pedersen and we don't have access to the converted root.
|
|
258
|
-
await this.verifyMessagesHashToInHash(l1ToL2Messages, l2Block.header.contentCommitment.inHash);
|
|
259
|
-
// If the above check succeeds, we can proceed to handle the block.
|
|
260
284
|
this.log.trace(`Pushing L2 block ${l2Block.number} to merkle tree db `, {
|
|
261
285
|
blockNumber: l2Block.number,
|
|
262
286
|
blockHash: await l2Block.hash().then((h)=>h.toString()),
|
|
@@ -271,27 +295,26 @@ import { WorldStateSynchronizerError } from './errors.js';
|
|
|
271
295
|
}
|
|
272
296
|
async handleChainFinalized(blockNumber) {
|
|
273
297
|
this.log.verbose(`Finalized chain is now at block ${blockNumber}`);
|
|
274
|
-
const summary = await this.merkleTreeDb.setFinalized(
|
|
298
|
+
const summary = await this.merkleTreeDb.setFinalized(blockNumber);
|
|
275
299
|
if (this.historyToKeep === undefined) {
|
|
276
300
|
return;
|
|
277
301
|
}
|
|
278
|
-
const newHistoricBlock = summary.finalizedBlockNumber -
|
|
302
|
+
const newHistoricBlock = summary.finalizedBlockNumber - this.historyToKeep + 1;
|
|
279
303
|
if (newHistoricBlock <= 1) {
|
|
280
304
|
return;
|
|
281
305
|
}
|
|
282
306
|
this.log.verbose(`Pruning historic blocks to ${newHistoricBlock}`);
|
|
283
|
-
const status = await this.merkleTreeDb.removeHistoricalBlocks(newHistoricBlock);
|
|
307
|
+
const status = await this.merkleTreeDb.removeHistoricalBlocks(BlockNumber(newHistoricBlock));
|
|
284
308
|
this.log.debug(`World state summary `, status.summary);
|
|
285
309
|
}
|
|
286
310
|
handleChainProven(blockNumber) {
|
|
287
|
-
this.provenBlockNumber =
|
|
311
|
+
this.provenBlockNumber = blockNumber;
|
|
288
312
|
this.log.debug(`Proven chain is now at block ${blockNumber}`);
|
|
289
313
|
return Promise.resolve();
|
|
290
314
|
}
|
|
291
315
|
async handleChainPruned(blockNumber) {
|
|
292
316
|
this.log.warn(`Chain pruned to block ${blockNumber}`);
|
|
293
|
-
const status = await this.merkleTreeDb.unwindBlocks(
|
|
294
|
-
this.latestBlockHashQuery = undefined;
|
|
317
|
+
const status = await this.merkleTreeDb.unwindBlocks(blockNumber);
|
|
295
318
|
this.provenBlockNumber = undefined;
|
|
296
319
|
this.instrumentation.updateWorldStateMetrics(status);
|
|
297
320
|
}
|
|
@@ -302,16 +325,4 @@ import { WorldStateSynchronizerError } from './errors.js';
|
|
|
302
325
|
this.currentState = newState;
|
|
303
326
|
this.log.debug(`Moved to state ${WorldStateRunningState[this.currentState]}`);
|
|
304
327
|
}
|
|
305
|
-
/**
|
|
306
|
-
* Verifies that the L1 to L2 messages hash to the block inHash.
|
|
307
|
-
* @param l1ToL2Messages - The L1 to L2 messages for the block.
|
|
308
|
-
* @param inHash - The inHash of the block.
|
|
309
|
-
* @throws If the L1 to L2 messages do not hash to the block inHash.
|
|
310
|
-
*/ async verifyMessagesHashToInHash(l1ToL2Messages, inHash) {
|
|
311
|
-
const treeCalculator = await MerkleTreeCalculator.create(L1_TO_L2_MSG_SUBTREE_HEIGHT, Buffer.alloc(32), (lhs, rhs)=>Promise.resolve(new SHA256Trunc().hash(lhs, rhs)));
|
|
312
|
-
const root = await treeCalculator.computeTreeRoot(l1ToL2Messages.map((msg)=>msg.toBuffer()));
|
|
313
|
-
if (!root.equals(inHash.toBuffer())) {
|
|
314
|
-
throw new Error('Obtained L1 to L2 messages failed to be hashed to the block inHash');
|
|
315
|
-
}
|
|
316
|
-
}
|
|
317
328
|
}
|
package/dest/test/index.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export * from './utils.js';
|
|
2
|
-
//# sourceMappingURL=
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsWUFBWSxDQUFDIn0=
|
package/dest/test/utils.d.ts
CHANGED
|
@@ -1,19 +1,26 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { BlockNumber, type CheckpointNumber } from '@aztec/foundation/branded-types';
|
|
2
|
+
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
3
|
+
import { L2BlockNew } from '@aztec/stdlib/block';
|
|
3
4
|
import type { MerkleTreeReadOperations, MerkleTreeWriteOperations } from '@aztec/stdlib/interfaces/server';
|
|
5
|
+
import { mockCheckpointAndMessages } from '@aztec/stdlib/testing';
|
|
4
6
|
import type { NativeWorldStateService } from '../native/native_world_state.js';
|
|
5
|
-
export declare function
|
|
6
|
-
|
|
7
|
+
export declare function updateBlockState(block: L2BlockNew, l1ToL2Messages: Fr[], fork: MerkleTreeWriteOperations): Promise<void>;
|
|
8
|
+
export declare function mockBlock(blockNum: BlockNumber, size: number, fork: MerkleTreeWriteOperations, maxEffects?: number | undefined, numL1ToL2Messages?: number, isFirstBlockInCheckpoint?: boolean): Promise<{
|
|
9
|
+
block: L2BlockNew;
|
|
7
10
|
messages: Fr[];
|
|
8
11
|
}>;
|
|
9
|
-
export declare function mockEmptyBlock(blockNum:
|
|
10
|
-
block:
|
|
12
|
+
export declare function mockEmptyBlock(blockNum: BlockNumber, fork: MerkleTreeWriteOperations): Promise<{
|
|
13
|
+
block: L2BlockNew;
|
|
11
14
|
messages: Fr[];
|
|
12
15
|
}>;
|
|
13
|
-
export declare function mockBlocks(from:
|
|
14
|
-
blocks:
|
|
16
|
+
export declare function mockBlocks(from: BlockNumber, count: number, numTxs: number, worldState: NativeWorldStateService): Promise<{
|
|
17
|
+
blocks: L2BlockNew[];
|
|
15
18
|
messages: Fr[][];
|
|
16
19
|
}>;
|
|
20
|
+
export declare function mockCheckpoint(checkpointNumber: CheckpointNumber, fork: MerkleTreeWriteOperations, options?: Partial<Parameters<typeof mockCheckpointAndMessages>[1]>): Promise<{
|
|
21
|
+
checkpoint: import("@aztec/stdlib/checkpoint").Checkpoint;
|
|
22
|
+
messages: Fr[];
|
|
23
|
+
}>;
|
|
17
24
|
export declare function assertSameState(forkA: MerkleTreeReadOperations, forkB: MerkleTreeReadOperations): Promise<void>;
|
|
18
25
|
export declare function compareChains(left: MerkleTreeReadOperations, right: MerkleTreeReadOperations): Promise<void>;
|
|
19
|
-
//# sourceMappingURL=
|
|
26
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0L3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQU9BLE9BQU8sRUFBRSxXQUFXLEVBQUUsS0FBSyxnQkFBZ0IsRUFBeUIsTUFBTSxpQ0FBaUMsQ0FBQztBQUU1RyxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDcEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2pELE9BQU8sS0FBSyxFQUVWLHdCQUF3QixFQUN4Qix5QkFBeUIsRUFDMUIsTUFBTSxpQ0FBaUMsQ0FBQztBQUN6QyxPQUFPLEVBQUUseUJBQXlCLEVBQXNCLE1BQU0sdUJBQXVCLENBQUM7QUFJdEYsT0FBTyxLQUFLLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUUvRSx3QkFBc0IsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLHlCQUF5QixpQkE4QzlHO0FBRUQsd0JBQXNCLFNBQVMsQ0FDN0IsUUFBUSxFQUFFLFdBQVcsRUFDckIsSUFBSSxFQUFFLE1BQU0sRUFDWixJQUFJLEVBQUUseUJBQXlCLEVBQy9CLFVBQVUsR0FBRSxNQUFNLEdBQUcsU0FBZ0IsRUFDckMsaUJBQWlCLEdBQUUsTUFBNEMsRUFDL0Qsd0JBQXdCLEdBQUUsT0FBYzs7O0dBZXpDO0FBRUQsd0JBQXNCLGNBQWMsQ0FBQyxRQUFRLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSx5QkFBeUI7OztHQVkxRjtBQUVELHdCQUFzQixVQUFVLENBQzlCLElBQUksRUFBRSxXQUFXLEVBQ2pCLEtBQUssRUFBRSxNQUFNLEVBQ2IsTUFBTSxFQUFFLE1BQU0sRUFDZCxVQUFVLEVBQUUsdUJBQXVCOzs7R0FlcEM7QUFFRCx3QkFBc0IsY0FBYyxDQUNsQyxnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFDbEMsSUFBSSxFQUFFLHlCQUF5QixFQUMvQixPQUFPLEdBQUUsT0FBTyxDQUFDLFVBQVUsQ0FBQyxPQUFPLHlCQUF5QixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQU07OztHQU92RTtBQUVELHdCQUFzQixlQUFlLENBQUMsS0FBSyxFQUFFLHdCQUF3QixFQUFFLEtBQUssRUFBRSx3QkFBd0IsaUJBUXJHO0FBRUQsd0JBQXNCLGFBQWEsQ0FBQyxJQUFJLEVBQUUsd0JBQXdCLEVBQUUsS0FBSyxFQUFFLHdCQUF3QixpQkFZbEcifQ==
|
package/dest/test/utils.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/test/utils.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/test/utils.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAyB,MAAM,iCAAiC,CAAC;AAE5G,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,KAAK,EAEV,wBAAwB,EACxB,yBAAyB,EAC1B,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,yBAAyB,EAAsB,MAAM,uBAAuB,CAAC;AAItF,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAE/E,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,yBAAyB,iBA8C9G;AAED,wBAAsB,SAAS,CAC7B,QAAQ,EAAE,WAAW,EACrB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,yBAAyB,EAC/B,UAAU,GAAE,MAAM,GAAG,SAAgB,EACrC,iBAAiB,GAAE,MAA4C,EAC/D,wBAAwB,GAAE,OAAc;;;GAezC;AAED,wBAAsB,cAAc,CAAC,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,yBAAyB;;;GAY1F;AAED,wBAAsB,UAAU,CAC9B,IAAI,EAAE,WAAW,EACjB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,uBAAuB;;;GAepC;AAED,wBAAsB,cAAc,CAClC,gBAAgB,EAAE,gBAAgB,EAClC,IAAI,EAAE,yBAAyB,EAC/B,OAAO,GAAE,OAAO,CAAC,UAAU,CAAC,OAAO,yBAAyB,CAAC,CAAC,CAAC,CAAC,CAAM;;;GAOvE;AAED,wBAAsB,eAAe,CAAC,KAAK,EAAE,wBAAwB,EAAE,KAAK,EAAE,wBAAwB,iBAQrG;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE,wBAAwB,EAAE,KAAK,EAAE,wBAAwB,iBAYlG"}
|