@aztec/world-state 0.0.1-commit.d3ec352c → 0.0.1-commit.f295ac2
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/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/merkle_trees_facade.d.ts +8 -3
- package/dest/native/merkle_trees_facade.d.ts.map +1 -1
- package/dest/native/merkle_trees_facade.js +23 -3
- package/dest/native/message.d.ts +2 -2
- package/dest/native/message.d.ts.map +1 -1
- package/dest/native/message.js +1 -1
- package/dest/native/native_world_state.d.ts +6 -4
- package/dest/native/native_world_state.d.ts.map +1 -1
- package/dest/native/native_world_state.js +5 -4
- package/dest/synchronizer/server_world_state_synchronizer.d.ts +5 -4
- package/dest/synchronizer/server_world_state_synchronizer.d.ts.map +1 -1
- package/dest/synchronizer/server_world_state_synchronizer.js +66 -38
- package/dest/test/utils.d.ts +7 -13
- package/dest/test/utils.d.ts.map +1 -1
- package/dest/test/utils.js +42 -79
- 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/merkle_tree_db.d.ts +6 -8
- package/dest/world-state-db/merkle_tree_db.d.ts.map +1 -1
- package/package.json +11 -11
- package/src/instrumentation/instrumentation.ts +10 -42
- package/src/native/merkle_trees_facade.ts +26 -2
- package/src/native/message.ts +1 -1
- package/src/native/native_world_state.ts +8 -7
- package/src/synchronizer/server_world_state_synchronizer.ts +69 -49
- package/src/test/utils.ts +68 -126
- package/src/testing.ts +1 -1
- package/src/world-state-db/merkle_tree_db.ts +9 -11
- package/dest/synchronizer/utils.d.ts +0 -11
- package/dest/synchronizer/utils.d.ts.map +0 -1
- package/dest/synchronizer/utils.js +0 -59
- package/src/synchronizer/utils.ts +0 -83
|
@@ -1,13 +1,14 @@
|
|
|
1
|
+
import { GENESIS_BLOCK_HEADER_HASH, INITIAL_L2_BLOCK_NUM, INITIAL_L2_CHECKPOINT_NUM } from '@aztec/constants';
|
|
1
2
|
import { BlockNumber } from '@aztec/foundation/branded-types';
|
|
2
3
|
import { createLogger } from '@aztec/foundation/log';
|
|
3
4
|
import { promiseWithResolvers } from '@aztec/foundation/promise';
|
|
4
5
|
import { elapsed } from '@aztec/foundation/timer';
|
|
6
|
+
import { GENESIS_CHECKPOINT_HEADER_HASH, L2BlockStream } from '@aztec/stdlib/block';
|
|
5
7
|
import { WorldStateRunningState } from '@aztec/stdlib/interfaces/server';
|
|
6
8
|
import { MerkleTreeId } from '@aztec/stdlib/trees';
|
|
7
|
-
import {
|
|
9
|
+
import { getTelemetryClient } from '@aztec/telemetry-client';
|
|
8
10
|
import { WorldStateInstrumentation } from '../instrumentation/instrumentation.js';
|
|
9
11
|
import { WorldStateSynchronizerError } from './errors.js';
|
|
10
|
-
import { findFirstBlocksInCheckpoints } from './utils.js';
|
|
11
12
|
/**
|
|
12
13
|
* Synchronizes the world state with the L2 blocks from a L2BlockSource via a block stream.
|
|
13
14
|
* The synchronizer will download the L2 blocks from the L2BlockSource and update the merkle trees.
|
|
@@ -22,7 +23,6 @@ import { findFirstBlocksInCheckpoints } from './utils.js';
|
|
|
22
23
|
latestBlockNumberAtStart;
|
|
23
24
|
historyToKeep;
|
|
24
25
|
currentState;
|
|
25
|
-
latestBlockHashQuery;
|
|
26
26
|
syncPromise;
|
|
27
27
|
blockStream;
|
|
28
28
|
// WorldState doesn't track the proven block number, it only tracks the latest tips of the pending chain and the finalized chain
|
|
@@ -36,7 +36,6 @@ import { findFirstBlocksInCheckpoints } from './utils.js';
|
|
|
36
36
|
this.log = log;
|
|
37
37
|
this.latestBlockNumberAtStart = BlockNumber.ZERO;
|
|
38
38
|
this.currentState = WorldStateRunningState.IDLE;
|
|
39
|
-
this.latestBlockHashQuery = undefined;
|
|
40
39
|
this.syncPromise = promiseWithResolvers();
|
|
41
40
|
this.merkleTreeCommitted = this.merkleTreeDb.getCommitted();
|
|
42
41
|
this.historyToKeep = config.worldStateBlockHistory < 1 ? undefined : config.worldStateBlockHistory;
|
|
@@ -48,8 +47,8 @@ import { findFirstBlocksInCheckpoints } from './utils.js';
|
|
|
48
47
|
getSnapshot(blockNumber) {
|
|
49
48
|
return this.merkleTreeDb.getSnapshot(blockNumber);
|
|
50
49
|
}
|
|
51
|
-
fork(blockNumber) {
|
|
52
|
-
return this.merkleTreeDb.fork(blockNumber);
|
|
50
|
+
fork(blockNumber, opts) {
|
|
51
|
+
return this.merkleTreeDb.fork(blockNumber, opts);
|
|
53
52
|
}
|
|
54
53
|
backupTo(dstPath, compact) {
|
|
55
54
|
return this.merkleTreeDb.backupTo(dstPath, compact);
|
|
@@ -83,12 +82,12 @@ import { findFirstBlocksInCheckpoints } from './utils.js';
|
|
|
83
82
|
return this.syncPromise.promise;
|
|
84
83
|
}
|
|
85
84
|
createBlockStream() {
|
|
86
|
-
const tracer = this.instrumentation.telemetry.getTracer('WorldStateL2BlockStream');
|
|
87
85
|
const logger = createLogger('world-state:block_stream');
|
|
88
|
-
return new
|
|
86
|
+
return new L2BlockStream(this.l2BlockSource, this, this, logger, {
|
|
89
87
|
proven: this.config.worldStateProvenBlocksOnly,
|
|
90
88
|
pollIntervalMS: this.config.worldStateBlockCheckIntervalMS,
|
|
91
|
-
batchSize: this.config.worldStateBlockRequestBatchSize
|
|
89
|
+
batchSize: this.config.worldStateBlockRequestBatchSize,
|
|
90
|
+
ignoreCheckpoints: true
|
|
92
91
|
});
|
|
93
92
|
}
|
|
94
93
|
async stop() {
|
|
@@ -114,7 +113,7 @@ import { findFirstBlocksInCheckpoints } from './utils.js';
|
|
|
114
113
|
};
|
|
115
114
|
}
|
|
116
115
|
async getLatestBlockNumber() {
|
|
117
|
-
return (await this.getL2Tips()).
|
|
116
|
+
return (await this.getL2Tips()).proposed.number;
|
|
118
117
|
}
|
|
119
118
|
async stopSync() {
|
|
120
119
|
this.log.debug('Stopping sync...');
|
|
@@ -175,46 +174,74 @@ import { findFirstBlocksInCheckpoints } from './utils.js';
|
|
|
175
174
|
if (number === BlockNumber.ZERO) {
|
|
176
175
|
return (await this.merkleTreeCommitted.getInitialHeader().hash()).toString();
|
|
177
176
|
}
|
|
178
|
-
|
|
179
|
-
this.latestBlockHashQuery = {
|
|
180
|
-
hash: await this.merkleTreeCommitted.getLeafValue(MerkleTreeId.ARCHIVE, BigInt(number)).then((leaf)=>leaf?.toString()),
|
|
181
|
-
blockNumber: number
|
|
182
|
-
};
|
|
183
|
-
}
|
|
184
|
-
return this.latestBlockHashQuery.hash;
|
|
177
|
+
return this.merkleTreeCommitted.getLeafValue(MerkleTreeId.ARCHIVE, BigInt(number)).then((leaf)=>leaf?.toString());
|
|
185
178
|
}
|
|
186
179
|
/** Returns the latest L2 block number for each tip of the chain (latest, proven, finalized). */ async getL2Tips() {
|
|
187
180
|
const status = await this.merkleTreeDb.getStatusSummary();
|
|
188
|
-
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
|
+
]);
|
|
189
190
|
const latestBlockId = {
|
|
190
191
|
number: status.unfinalizedBlockNumber,
|
|
191
192
|
hash: unfinalizedBlockHash
|
|
192
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();
|
|
193
198
|
return {
|
|
194
|
-
|
|
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
|
+
},
|
|
195
210
|
finalized: {
|
|
196
|
-
|
|
197
|
-
|
|
211
|
+
block: {
|
|
212
|
+
number: status.finalizedBlockNumber,
|
|
213
|
+
hash: finalizedBlockHash ?? ''
|
|
214
|
+
},
|
|
215
|
+
checkpoint: {
|
|
216
|
+
number: INITIAL_L2_CHECKPOINT_NUM,
|
|
217
|
+
hash: genesisCheckpointHeaderHash
|
|
218
|
+
}
|
|
198
219
|
},
|
|
199
220
|
proven: {
|
|
200
|
-
|
|
201
|
-
|
|
221
|
+
block: {
|
|
222
|
+
number: provenBlockNumber,
|
|
223
|
+
hash: provenBlockHash ?? ''
|
|
224
|
+
},
|
|
225
|
+
checkpoint: {
|
|
226
|
+
number: INITIAL_L2_CHECKPOINT_NUM,
|
|
227
|
+
hash: genesisCheckpointHeaderHash
|
|
228
|
+
}
|
|
202
229
|
}
|
|
203
230
|
};
|
|
204
231
|
}
|
|
205
232
|
/** Handles an event emitted by the block stream. */ async handleBlockStreamEvent(event) {
|
|
206
233
|
switch(event.type){
|
|
207
234
|
case 'blocks-added':
|
|
208
|
-
await this.handleL2Blocks(event.blocks
|
|
235
|
+
await this.handleL2Blocks(event.blocks);
|
|
209
236
|
break;
|
|
210
237
|
case 'chain-pruned':
|
|
211
|
-
await this.handleChainPruned(
|
|
238
|
+
await this.handleChainPruned(event.block.number);
|
|
212
239
|
break;
|
|
213
240
|
case 'chain-proven':
|
|
214
|
-
await this.handleChainProven(
|
|
241
|
+
await this.handleChainProven(event.block.number);
|
|
215
242
|
break;
|
|
216
243
|
case 'chain-finalized':
|
|
217
|
-
await this.handleChainFinalized(
|
|
244
|
+
await this.handleChainFinalized(event.block.number);
|
|
218
245
|
break;
|
|
219
246
|
}
|
|
220
247
|
}
|
|
@@ -224,12 +251,15 @@ import { findFirstBlocksInCheckpoints } from './utils.js';
|
|
|
224
251
|
* @returns Whether the block handled was produced by this same node.
|
|
225
252
|
*/ async handleL2Blocks(l2Blocks) {
|
|
226
253
|
this.log.trace(`Handling L2 blocks ${l2Blocks[0].number} to ${l2Blocks.at(-1).number}`);
|
|
227
|
-
|
|
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
|
+
}));
|
|
228
260
|
let updateStatus = undefined;
|
|
229
261
|
for (const block of l2Blocks){
|
|
230
|
-
const
|
|
231
|
-
const isFirstBlock = firstBlocksInCheckpoints.has(block.number);
|
|
232
|
-
const [duration, result] = await elapsed(()=>this.handleL2Block(block, l1ToL2Messages, isFirstBlock));
|
|
262
|
+
const [duration, result] = await elapsed(()=>this.handleL2Block(block, messagesForBlocks.get(block.number) ?? []));
|
|
233
263
|
this.log.info(`World state updated with L2 block ${block.number}`, {
|
|
234
264
|
eventName: 'l2-block-handled',
|
|
235
265
|
duration,
|
|
@@ -250,14 +280,13 @@ import { findFirstBlocksInCheckpoints } from './utils.js';
|
|
|
250
280
|
* @param l2Block - The L2 block to handle.
|
|
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
|
-
*/ async handleL2Block(l2Block, l1ToL2Messages
|
|
254
|
-
// If the above check succeeds, we can proceed to handle the block.
|
|
283
|
+
*/ async handleL2Block(l2Block, l1ToL2Messages) {
|
|
255
284
|
this.log.trace(`Pushing L2 block ${l2Block.number} to merkle tree db `, {
|
|
256
285
|
blockNumber: l2Block.number,
|
|
257
286
|
blockHash: await l2Block.hash().then((h)=>h.toString()),
|
|
258
287
|
l1ToL2Messages: l1ToL2Messages.map((msg)=>msg.toString())
|
|
259
288
|
});
|
|
260
|
-
const result = await this.merkleTreeDb.handleL2BlockAndMessages(l2Block, l1ToL2Messages
|
|
289
|
+
const result = await this.merkleTreeDb.handleL2BlockAndMessages(l2Block, l1ToL2Messages);
|
|
261
290
|
if (this.currentState === WorldStateRunningState.SYNCHING && l2Block.number >= this.latestBlockNumberAtStart) {
|
|
262
291
|
this.setCurrentState(WorldStateRunningState.RUNNING);
|
|
263
292
|
this.syncPromise.resolve();
|
|
@@ -270,12 +299,12 @@ import { findFirstBlocksInCheckpoints } from './utils.js';
|
|
|
270
299
|
if (this.historyToKeep === undefined) {
|
|
271
300
|
return;
|
|
272
301
|
}
|
|
273
|
-
const newHistoricBlock =
|
|
274
|
-
if (newHistoricBlock <=
|
|
302
|
+
const newHistoricBlock = summary.finalizedBlockNumber - this.historyToKeep + 1;
|
|
303
|
+
if (newHistoricBlock <= 1) {
|
|
275
304
|
return;
|
|
276
305
|
}
|
|
277
306
|
this.log.verbose(`Pruning historic blocks to ${newHistoricBlock}`);
|
|
278
|
-
const status = await this.merkleTreeDb.removeHistoricalBlocks(newHistoricBlock);
|
|
307
|
+
const status = await this.merkleTreeDb.removeHistoricalBlocks(BlockNumber(newHistoricBlock));
|
|
279
308
|
this.log.debug(`World state summary `, status.summary);
|
|
280
309
|
}
|
|
281
310
|
handleChainProven(blockNumber) {
|
|
@@ -286,7 +315,6 @@ import { findFirstBlocksInCheckpoints } from './utils.js';
|
|
|
286
315
|
async handleChainPruned(blockNumber) {
|
|
287
316
|
this.log.warn(`Chain pruned to block ${blockNumber}`);
|
|
288
317
|
const status = await this.merkleTreeDb.unwindBlocks(blockNumber);
|
|
289
|
-
this.latestBlockHashQuery = undefined;
|
|
290
318
|
this.provenBlockNumber = undefined;
|
|
291
319
|
this.instrumentation.updateWorldStateMetrics(status);
|
|
292
320
|
}
|
package/dest/test/utils.d.ts
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { BlockNumber, type CheckpointNumber } from '@aztec/foundation/branded-types';
|
|
2
|
-
import { Fr } from '@aztec/foundation/
|
|
2
|
+
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
3
3
|
import { L2BlockNew } from '@aztec/stdlib/block';
|
|
4
|
-
import { Checkpoint } from '@aztec/stdlib/checkpoint';
|
|
5
4
|
import type { MerkleTreeReadOperations, MerkleTreeWriteOperations } from '@aztec/stdlib/interfaces/server';
|
|
5
|
+
import { mockCheckpointAndMessages } from '@aztec/stdlib/testing';
|
|
6
6
|
import type { NativeWorldStateService } from '../native/native_world_state.js';
|
|
7
|
-
export declare function
|
|
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<{
|
|
8
9
|
block: L2BlockNew;
|
|
9
10
|
messages: Fr[];
|
|
10
11
|
}>;
|
|
@@ -16,17 +17,10 @@ export declare function mockBlocks(from: BlockNumber, count: number, numTxs: num
|
|
|
16
17
|
blocks: L2BlockNew[];
|
|
17
18
|
messages: Fr[][];
|
|
18
19
|
}>;
|
|
19
|
-
export declare function
|
|
20
|
-
|
|
21
|
-
startBlockNumber?: BlockNumber;
|
|
22
|
-
numBlocks?: number;
|
|
23
|
-
numTxsPerBlock?: number;
|
|
24
|
-
numL1ToL2Messages?: number;
|
|
25
|
-
fork?: MerkleTreeWriteOperations;
|
|
26
|
-
}): Promise<{
|
|
27
|
-
checkpoint: Checkpoint;
|
|
20
|
+
export declare function mockCheckpoint(checkpointNumber: CheckpointNumber, fork: MerkleTreeWriteOperations, options?: Partial<Parameters<typeof mockCheckpointAndMessages>[1]>): Promise<{
|
|
21
|
+
checkpoint: import("@aztec/stdlib/checkpoint").Checkpoint;
|
|
28
22
|
messages: Fr[];
|
|
29
23
|
}>;
|
|
30
24
|
export declare function assertSameState(forkA: MerkleTreeReadOperations, forkB: MerkleTreeReadOperations): Promise<void>;
|
|
31
25
|
export declare function compareChains(left: MerkleTreeReadOperations, right: MerkleTreeReadOperations): Promise<void>;
|
|
32
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
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":"
|
|
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"}
|
package/dest/test/utils.js
CHANGED
|
@@ -1,45 +1,51 @@
|
|
|
1
1
|
import { MAX_NOTE_HASHES_PER_TX, MAX_NULLIFIERS_PER_TX, NULLIFIER_SUBTREE_HEIGHT, NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP } from '@aztec/constants';
|
|
2
|
-
import {
|
|
2
|
+
import { asyncMap } from '@aztec/foundation/async-map';
|
|
3
|
+
import { BlockNumber, IndexWithinCheckpoint } from '@aztec/foundation/branded-types';
|
|
3
4
|
import { padArrayEnd } from '@aztec/foundation/collection';
|
|
4
|
-
import { Fr } from '@aztec/foundation/
|
|
5
|
+
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
5
6
|
import { L2BlockNew } from '@aztec/stdlib/block';
|
|
6
|
-
import {
|
|
7
|
-
import { computeInHashFromL1ToL2Messages } from '@aztec/stdlib/messaging';
|
|
7
|
+
import { mockCheckpointAndMessages, mockL1ToL2Messages } from '@aztec/stdlib/testing';
|
|
8
8
|
import { AppendOnlyTreeSnapshot, MerkleTreeId } from '@aztec/stdlib/trees';
|
|
9
|
-
|
|
10
|
-
|
|
9
|
+
import { BlockHeader } from '@aztec/stdlib/tx';
|
|
10
|
+
export async function updateBlockState(block, l1ToL2Messages, fork) {
|
|
11
|
+
const insertData = async (treeId, data, subTreeHeight, fork)=>{
|
|
12
|
+
for (const dataBatch of data){
|
|
13
|
+
await fork.batchInsert(treeId, dataBatch, subTreeHeight);
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
const publicDataInsert = insertData(MerkleTreeId.PUBLIC_DATA_TREE, block.body.txEffects.map((txEffect)=>txEffect.publicDataWrites.map((write)=>write.toBuffer())), 0, fork);
|
|
17
|
+
const nullifierInsert = insertData(MerkleTreeId.NULLIFIER_TREE, block.body.txEffects.map((txEffect)=>padArrayEnd(txEffect.nullifiers, Fr.ZERO, MAX_NULLIFIERS_PER_TX).map((nullifier)=>nullifier.toBuffer())), NULLIFIER_SUBTREE_HEIGHT, fork);
|
|
18
|
+
const noteHashesPadded = block.body.txEffects.flatMap((txEffect)=>padArrayEnd(txEffect.noteHashes, Fr.ZERO, MAX_NOTE_HASHES_PER_TX));
|
|
19
|
+
const l1ToL2MessagesPadded = block.indexWithinCheckpoint === 0 ? padArrayEnd(l1ToL2Messages, Fr.ZERO, NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP) : l1ToL2Messages;
|
|
20
|
+
const noteHashInsert = fork.appendLeaves(MerkleTreeId.NOTE_HASH_TREE, noteHashesPadded);
|
|
21
|
+
const messageInsert = fork.appendLeaves(MerkleTreeId.L1_TO_L2_MESSAGE_TREE, l1ToL2MessagesPadded);
|
|
22
|
+
await Promise.all([
|
|
23
|
+
publicDataInsert,
|
|
24
|
+
nullifierInsert,
|
|
25
|
+
noteHashInsert,
|
|
26
|
+
messageInsert
|
|
27
|
+
]);
|
|
28
|
+
const state = await fork.getStateReference();
|
|
29
|
+
block.header = BlockHeader.from({
|
|
30
|
+
...block.header,
|
|
31
|
+
state
|
|
32
|
+
});
|
|
33
|
+
await fork.updateArchive(block.header);
|
|
34
|
+
const archiveState = await fork.getTreeInfo(MerkleTreeId.ARCHIVE);
|
|
35
|
+
block.archive = new AppendOnlyTreeSnapshot(Fr.fromBuffer(archiveState.root), Number(archiveState.size));
|
|
36
|
+
}
|
|
37
|
+
export async function mockBlock(blockNum, size, fork, maxEffects = 1000, numL1ToL2Messages = NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP, isFirstBlockInCheckpoint = true) {
|
|
38
|
+
const block = await L2BlockNew.random(blockNum, {
|
|
39
|
+
indexWithinCheckpoint: isFirstBlockInCheckpoint ? IndexWithinCheckpoint(0) : IndexWithinCheckpoint(1),
|
|
11
40
|
txsPerBlock: size,
|
|
12
41
|
txOptions: {
|
|
13
42
|
maxEffects
|
|
14
43
|
}
|
|
15
44
|
});
|
|
16
45
|
const l1ToL2Messages = mockL1ToL2Messages(numL1ToL2Messages);
|
|
17
|
-
|
|
18
|
-
const insertData = async (treeId, data, subTreeHeight, fork)=>{
|
|
19
|
-
for (const dataBatch of data){
|
|
20
|
-
await fork.batchInsert(treeId, dataBatch, subTreeHeight);
|
|
21
|
-
}
|
|
22
|
-
};
|
|
23
|
-
const publicDataInsert = insertData(MerkleTreeId.PUBLIC_DATA_TREE, l2Block.body.txEffects.map((txEffect)=>txEffect.publicDataWrites.map((write)=>write.toBuffer())), 0, fork);
|
|
24
|
-
const nullifierInsert = insertData(MerkleTreeId.NULLIFIER_TREE, l2Block.body.txEffects.map((txEffect)=>padArrayEnd(txEffect.nullifiers, Fr.ZERO, MAX_NULLIFIERS_PER_TX).map((nullifier)=>nullifier.toBuffer())), NULLIFIER_SUBTREE_HEIGHT, fork);
|
|
25
|
-
const noteHashesPadded = l2Block.body.txEffects.flatMap((txEffect)=>padArrayEnd(txEffect.noteHashes, Fr.ZERO, MAX_NOTE_HASHES_PER_TX));
|
|
26
|
-
const l1ToL2MessagesPadded = isFirstBlock ? padArrayEnd(l1ToL2Messages, Fr.ZERO, NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP) : l1ToL2Messages;
|
|
27
|
-
const noteHashInsert = fork.appendLeaves(MerkleTreeId.NOTE_HASH_TREE, noteHashesPadded);
|
|
28
|
-
const messageInsert = fork.appendLeaves(MerkleTreeId.L1_TO_L2_MESSAGE_TREE, l1ToL2MessagesPadded);
|
|
29
|
-
await Promise.all([
|
|
30
|
-
publicDataInsert,
|
|
31
|
-
nullifierInsert,
|
|
32
|
-
noteHashInsert,
|
|
33
|
-
messageInsert
|
|
34
|
-
]);
|
|
35
|
-
}
|
|
36
|
-
const state = await fork.getStateReference();
|
|
37
|
-
l2Block.header.state = state;
|
|
38
|
-
await fork.updateArchive(l2Block.header);
|
|
39
|
-
const archiveState = await fork.getTreeInfo(MerkleTreeId.ARCHIVE);
|
|
40
|
-
l2Block.archive = new AppendOnlyTreeSnapshot(Fr.fromBuffer(archiveState.root), Number(archiveState.size));
|
|
46
|
+
await updateBlockState(block, l1ToL2Messages, fork);
|
|
41
47
|
return {
|
|
42
|
-
block
|
|
48
|
+
block,
|
|
43
49
|
messages: l1ToL2Messages
|
|
44
50
|
};
|
|
45
51
|
}
|
|
@@ -47,27 +53,7 @@ export async function mockEmptyBlock(blockNum, fork) {
|
|
|
47
53
|
const l2Block = L2BlockNew.empty();
|
|
48
54
|
const l1ToL2Messages = Array(16).fill(0).map(Fr.zero);
|
|
49
55
|
l2Block.header.globalVariables.blockNumber = blockNum;
|
|
50
|
-
|
|
51
|
-
{
|
|
52
|
-
const noteHashesPadded = l2Block.body.txEffects.flatMap((txEffect)=>padArrayEnd(txEffect.noteHashes, Fr.ZERO, MAX_NOTE_HASHES_PER_TX));
|
|
53
|
-
await fork.appendLeaves(MerkleTreeId.NOTE_HASH_TREE, noteHashesPadded);
|
|
54
|
-
const l1ToL2MessagesPadded = padArrayEnd(l1ToL2Messages, Fr.ZERO, NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP);
|
|
55
|
-
await fork.appendLeaves(MerkleTreeId.L1_TO_L2_MESSAGE_TREE, l1ToL2MessagesPadded);
|
|
56
|
-
}
|
|
57
|
-
// Sync the indexed trees
|
|
58
|
-
{
|
|
59
|
-
// We insert the public data tree leaves with one batch per tx to avoid updating the same key twice
|
|
60
|
-
for (const txEffect of l2Block.body.txEffects){
|
|
61
|
-
await fork.batchInsert(MerkleTreeId.PUBLIC_DATA_TREE, txEffect.publicDataWrites.map((write)=>write.toBuffer()), 0);
|
|
62
|
-
const nullifiersPadded = padArrayEnd(txEffect.nullifiers, Fr.ZERO, MAX_NULLIFIERS_PER_TX);
|
|
63
|
-
await fork.batchInsert(MerkleTreeId.NULLIFIER_TREE, nullifiersPadded.map((nullifier)=>nullifier.toBuffer()), NULLIFIER_SUBTREE_HEIGHT);
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
const state = await fork.getStateReference();
|
|
67
|
-
l2Block.header.state = state;
|
|
68
|
-
await fork.updateArchive(l2Block.header);
|
|
69
|
-
const archiveState = await fork.getTreeInfo(MerkleTreeId.ARCHIVE);
|
|
70
|
-
l2Block.archive = new AppendOnlyTreeSnapshot(Fr.fromBuffer(archiveState.root), Number(archiveState.size));
|
|
56
|
+
await updateBlockState(l2Block, l1ToL2Messages, fork);
|
|
71
57
|
return {
|
|
72
58
|
block: l2Block,
|
|
73
59
|
messages: l1ToL2Messages
|
|
@@ -88,34 +74,11 @@ export async function mockBlocks(from, count, numTxs, worldState) {
|
|
|
88
74
|
messages: messagesArray
|
|
89
75
|
};
|
|
90
76
|
}
|
|
91
|
-
export function
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
const slotNumber = SlotNumber(checkpointNumber * 10);
|
|
96
|
-
const blocksAndMessages = [];
|
|
97
|
-
for(let i = 0; i < numBlocks; i++){
|
|
98
|
-
const blockNumber = BlockNumber(startBlockNumber + i);
|
|
99
|
-
const { block, messages } = fork ? await mockBlock(blockNumber, numTxsPerBlock, fork, blockNumber === startBlockNumber ? numL1ToL2Messages : 0) : {
|
|
100
|
-
block: await L2BlockNew.random(blockNumber, {
|
|
101
|
-
txsPerBlock: numTxsPerBlock,
|
|
102
|
-
slotNumber
|
|
103
|
-
}),
|
|
104
|
-
messages: mockL1ToL2Messages(numL1ToL2Messages)
|
|
105
|
-
};
|
|
106
|
-
blocksAndMessages.push({
|
|
107
|
-
block,
|
|
108
|
-
messages
|
|
109
|
-
});
|
|
110
|
-
}
|
|
111
|
-
const messages = blocksAndMessages[0].messages;
|
|
112
|
-
const inHash = computeInHashFromL1ToL2Messages(messages);
|
|
113
|
-
const checkpoint = await Checkpoint.random(checkpointNumber, {
|
|
114
|
-
numBlocks: 0,
|
|
115
|
-
slotNumber,
|
|
116
|
-
inHash
|
|
77
|
+
export async function mockCheckpoint(checkpointNumber, fork, options = {}) {
|
|
78
|
+
const { checkpoint, messages } = await mockCheckpointAndMessages(checkpointNumber, options);
|
|
79
|
+
await asyncMap(checkpoint.blocks, async (block, i)=>{
|
|
80
|
+
await updateBlockState(block, i === 0 ? messages : [], fork);
|
|
117
81
|
});
|
|
118
|
-
checkpoint.blocks = blocksAndMessages.map(({ block })=>block);
|
|
119
82
|
return {
|
|
120
83
|
checkpoint,
|
|
121
84
|
messages
|
package/dest/testing.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Fr } from '@aztec/foundation/
|
|
1
|
+
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
2
2
|
import type { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
3
3
|
import { PublicDataTreeLeaf } from '@aztec/stdlib/trees';
|
|
4
4
|
export declare const defaultInitialAccountFeeJuice: Fr;
|
|
@@ -7,4 +7,4 @@ export declare function getGenesisValues(initialAccounts: AztecAddress[], initia
|
|
|
7
7
|
prefilledPublicData: PublicDataTreeLeaf[];
|
|
8
8
|
fundingNeeded: bigint;
|
|
9
9
|
}>;
|
|
10
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
10
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdGluZy5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3Rlc3RpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRXBELE9BQU8sS0FBSyxFQUFFLFlBQVksRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ2hFLE9BQU8sRUFBZ0Isa0JBQWtCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQXlCdkUsZUFBTyxNQUFNLDZCQUE2QixJQUFxQixDQUFDO0FBRWhFLHdCQUFzQixnQkFBZ0IsQ0FDcEMsZUFBZSxFQUFFLFlBQVksRUFBRSxFQUMvQixzQkFBc0IsS0FBZ0MsRUFDdEQsaUJBQWlCLEdBQUUsa0JBQWtCLEVBQU87Ozs7R0FxQjdDIn0=
|
package/dest/testing.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,EAAE,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AAEpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAgB,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAyBvE,eAAO,MAAM,6BAA6B,IAAqB,CAAC;AAEhE,wBAAsB,gBAAgB,CACpC,eAAe,EAAE,YAAY,EAAE,EAC/B,sBAAsB,KAAgC,EACtD,iBAAiB,GAAE,kBAAkB,EAAO;;;;GAqB7C"}
|
package/dest/testing.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { GENESIS_ARCHIVE_ROOT } from '@aztec/constants';
|
|
2
|
-
import { Fr } from '@aztec/foundation/
|
|
2
|
+
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
3
3
|
import { computeFeePayerBalanceLeafSlot } from '@aztec/protocol-contracts/fee-juice';
|
|
4
4
|
import { MerkleTreeId, PublicDataTreeLeaf } from '@aztec/stdlib/trees';
|
|
5
5
|
import { NativeWorldStateService } from './native/index.js';
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { BlockNumber } from '@aztec/foundation/branded-types';
|
|
2
|
-
import type { Fr } from '@aztec/foundation/
|
|
1
|
+
import type { BlockNumber } from '@aztec/foundation/branded-types';
|
|
2
|
+
import type { Fr } from '@aztec/foundation/curves/bn254';
|
|
3
3
|
import type { IndexedTreeSnapshot, TreeSnapshot } from '@aztec/merkle-tree';
|
|
4
4
|
import type { L2BlockNew } from '@aztec/stdlib/block';
|
|
5
|
-
import type { ForkMerkleTreeOperations, MerkleTreeReadOperations } from '@aztec/stdlib/interfaces/server';
|
|
5
|
+
import type { ForkMerkleTreeOperations, MerkleTreeReadOperations, ReadonlyWorldStateAccess } from '@aztec/stdlib/interfaces/server';
|
|
6
6
|
import type { MerkleTreeId } from '@aztec/stdlib/trees';
|
|
7
7
|
import type { WorldStateStatusFull, WorldStateStatusSummary } from '../native/message.js';
|
|
8
8
|
/**
|
|
@@ -29,15 +29,13 @@ export type TreeSnapshots = {
|
|
|
29
29
|
[MerkleTreeId.L1_TO_L2_MESSAGE_TREE]: TreeSnapshot<Fr>;
|
|
30
30
|
[MerkleTreeId.ARCHIVE]: TreeSnapshot<Fr>;
|
|
31
31
|
};
|
|
32
|
-
export interface MerkleTreeAdminDatabase extends ForkMerkleTreeOperations {
|
|
32
|
+
export interface MerkleTreeAdminDatabase extends ForkMerkleTreeOperations, ReadonlyWorldStateAccess {
|
|
33
33
|
/**
|
|
34
34
|
* Handles a single L2 block (i.e. Inserts the new note hashes into the merkle tree).
|
|
35
35
|
* @param block - The L2 block to handle.
|
|
36
36
|
* @param l1ToL2Messages - The L1 to L2 messages for the block.
|
|
37
|
-
* @param isFirstBlock - Whether the block is the first block in a checkpoint. The messages are padded and inserted
|
|
38
|
-
* to the tree for the first block in a checkpoint.
|
|
39
37
|
*/
|
|
40
|
-
handleL2BlockAndMessages(block: L2BlockNew, l1ToL2Messages: Fr[]
|
|
38
|
+
handleL2BlockAndMessages(block: L2BlockNew, l1ToL2Messages: Fr[]): Promise<WorldStateStatusFull>;
|
|
41
39
|
/**
|
|
42
40
|
* Gets a handle that allows reading the latest committed state
|
|
43
41
|
*/
|
|
@@ -70,4 +68,4 @@ export interface MerkleTreeAdminDatabase extends ForkMerkleTreeOperations {
|
|
|
70
68
|
/** Deletes the db. */
|
|
71
69
|
clear(): Promise<void>;
|
|
72
70
|
}
|
|
73
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
71
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVya2xlX3RyZWVfZGIuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy93b3JsZC1zdGF0ZS1kYi9tZXJrbGVfdHJlZV9kYi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEtBQUssRUFBRSxXQUFXLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNuRSxPQUFPLEtBQUssRUFBRSxFQUFFLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN6RCxPQUFPLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxZQUFZLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM1RSxPQUFPLEtBQUssRUFBRSxVQUFVLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RCxPQUFPLEtBQUssRUFDVix3QkFBd0IsRUFDeEIsd0JBQXdCLEVBQ3hCLHdCQUF3QixFQUN6QixNQUFNLGlDQUFpQyxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxFQUFFLFlBQVksRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRXhELE9BQU8sS0FBSyxFQUFFLG9CQUFvQixFQUFFLHVCQUF1QixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFMUY7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxlQUFPLE1BQU0sMkJBQTJCLFFBQTRCLENBQUM7QUFFckUsZUFBTyxNQUFNLDZCQUE2QixRQUFtRCxDQUFDO0FBRTlGLE1BQU0sTUFBTSxhQUFhLEdBQUc7SUFDMUIsQ0FBQyxZQUFZLENBQUMsY0FBYyxDQUFDLEVBQUUsbUJBQW1CLENBQUM7SUFDbkQsQ0FBQyxZQUFZLENBQUMsY0FBYyxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2hELENBQUMsWUFBWSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsbUJBQW1CLENBQUM7SUFDckQsQ0FBQyxZQUFZLENBQUMscUJBQXFCLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDdkQsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0NBQzFDLENBQUM7QUFFRixNQUFNLFdBQVcsdUJBQXdCLFNBQVEsd0JBQXdCLEVBQUUsd0JBQXdCO0lBQ2pHOzs7O09BSUc7SUFDSCx3QkFBd0IsQ0FBQyxLQUFLLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxFQUFFLEVBQUUsR0FBRyxPQUFPLENBQUMsb0JBQW9CLENBQUMsQ0FBQztJQUVqRzs7T0FFRztJQUNILFlBQVksSUFBSSx3QkFBd0IsQ0FBQztJQUV6Qzs7OztPQUlHO0lBQ0gsc0JBQXNCLENBQUMsYUFBYSxFQUFFLFdBQVcsR0FBRyxPQUFPLENBQUMsb0JBQW9CLENBQUMsQ0FBQztJQUVsRjs7OztPQUlHO0lBQ0gsWUFBWSxDQUFDLGFBQWEsRUFBRSxXQUFXLEdBQUcsT0FBTyxDQUFDLG9CQUFvQixDQUFDLENBQUM7SUFFeEU7Ozs7T0FJRztJQUNILFlBQVksQ0FBQyxhQUFhLEVBQUUsV0FBVyxHQUFHLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO0lBRTNFOzs7T0FHRztJQUNILGdCQUFnQixJQUFJLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO0lBRXJELHlCQUF5QjtJQUN6QixLQUFLLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBRXZCLHNCQUFzQjtJQUN0QixLQUFLLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0NBQ3hCIn0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"merkle_tree_db.d.ts","sourceRoot":"","sources":["../../src/world-state-db/merkle_tree_db.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"merkle_tree_db.d.ts","sourceRoot":"","sources":["../../src/world-state-db/merkle_tree_db.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AACzD,OAAO,KAAK,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC5E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,KAAK,EACV,wBAAwB,EACxB,wBAAwB,EACxB,wBAAwB,EACzB,MAAM,iCAAiC,CAAC;AACzC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD,OAAO,KAAK,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAE1F;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,2BAA2B,QAA4B,CAAC;AAErE,eAAO,MAAM,6BAA6B,QAAmD,CAAC;AAE9F,MAAM,MAAM,aAAa,GAAG;IAC1B,CAAC,YAAY,CAAC,cAAc,CAAC,EAAE,mBAAmB,CAAC;IACnD,CAAC,YAAY,CAAC,cAAc,CAAC,EAAE,YAAY,CAAC,EAAE,CAAC,CAAC;IAChD,CAAC,YAAY,CAAC,gBAAgB,CAAC,EAAE,mBAAmB,CAAC;IACrD,CAAC,YAAY,CAAC,qBAAqB,CAAC,EAAE,YAAY,CAAC,EAAE,CAAC,CAAC;IACvD,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,YAAY,CAAC,EAAE,CAAC,CAAC;CAC1C,CAAC;AAEF,MAAM,WAAW,uBAAwB,SAAQ,wBAAwB,EAAE,wBAAwB;IACjG;;;;OAIG;IACH,wBAAwB,CAAC,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAEjG;;OAEG;IACH,YAAY,IAAI,wBAAwB,CAAC;IAEzC;;;;OAIG;IACH,sBAAsB,CAAC,aAAa,EAAE,WAAW,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAElF;;;;OAIG;IACH,YAAY,CAAC,aAAa,EAAE,WAAW,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAExE;;;;OAIG;IACH,YAAY,CAAC,aAAa,EAAE,WAAW,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAAC;IAE3E;;;OAGG;IACH,gBAAgB,IAAI,OAAO,CAAC,uBAAuB,CAAC,CAAC;IAErD,yBAAyB;IACzB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvB,sBAAsB;IACtB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/world-state",
|
|
3
|
-
"version": "0.0.1-commit.
|
|
3
|
+
"version": "0.0.1-commit.f295ac2",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": "./dest/index.js",
|
|
@@ -64,23 +64,23 @@
|
|
|
64
64
|
]
|
|
65
65
|
},
|
|
66
66
|
"dependencies": {
|
|
67
|
-
"@aztec/constants": "0.0.1-commit.
|
|
68
|
-
"@aztec/foundation": "0.0.1-commit.
|
|
69
|
-
"@aztec/kv-store": "0.0.1-commit.
|
|
70
|
-
"@aztec/merkle-tree": "0.0.1-commit.
|
|
71
|
-
"@aztec/native": "0.0.1-commit.
|
|
72
|
-
"@aztec/protocol-contracts": "0.0.1-commit.
|
|
73
|
-
"@aztec/stdlib": "0.0.1-commit.
|
|
74
|
-
"@aztec/telemetry-client": "0.0.1-commit.
|
|
67
|
+
"@aztec/constants": "0.0.1-commit.f295ac2",
|
|
68
|
+
"@aztec/foundation": "0.0.1-commit.f295ac2",
|
|
69
|
+
"@aztec/kv-store": "0.0.1-commit.f295ac2",
|
|
70
|
+
"@aztec/merkle-tree": "0.0.1-commit.f295ac2",
|
|
71
|
+
"@aztec/native": "0.0.1-commit.f295ac2",
|
|
72
|
+
"@aztec/protocol-contracts": "0.0.1-commit.f295ac2",
|
|
73
|
+
"@aztec/stdlib": "0.0.1-commit.f295ac2",
|
|
74
|
+
"@aztec/telemetry-client": "0.0.1-commit.f295ac2",
|
|
75
75
|
"tslib": "^2.4.0",
|
|
76
76
|
"zod": "^3.23.8"
|
|
77
77
|
},
|
|
78
78
|
"devDependencies": {
|
|
79
|
-
"@aztec/archiver": "0.0.1-commit.
|
|
79
|
+
"@aztec/archiver": "0.0.1-commit.f295ac2",
|
|
80
80
|
"@jest/globals": "^30.0.0",
|
|
81
81
|
"@types/jest": "^30.0.0",
|
|
82
82
|
"@types/node": "^22.15.17",
|
|
83
|
-
"@typescript/native-preview": "7.0.0-dev.
|
|
83
|
+
"@typescript/native-preview": "7.0.0-dev.20260113.1",
|
|
84
84
|
"jest": "^30.0.0",
|
|
85
85
|
"jest-mock-extended": "^4.0.0",
|
|
86
86
|
"ts-node": "^10.9.1",
|
|
@@ -7,7 +7,6 @@ import {
|
|
|
7
7
|
Metrics,
|
|
8
8
|
type TelemetryClient,
|
|
9
9
|
type UpDownCounter,
|
|
10
|
-
ValueType,
|
|
11
10
|
} from '@aztec/telemetry-client';
|
|
12
11
|
|
|
13
12
|
import {
|
|
@@ -46,56 +45,25 @@ export class WorldStateInstrumentation {
|
|
|
46
45
|
private log: Logger = createLogger('world-state:instrumentation'),
|
|
47
46
|
) {
|
|
48
47
|
const meter = telemetry.getMeter('World State');
|
|
49
|
-
this.dbMapSize = meter.createGauge(Metrics.WORLD_STATE_DB_MAP_SIZE
|
|
50
|
-
description: `The current configured map size for each merkle tree`,
|
|
51
|
-
valueType: ValueType.INT,
|
|
52
|
-
});
|
|
48
|
+
this.dbMapSize = meter.createGauge(Metrics.WORLD_STATE_DB_MAP_SIZE);
|
|
53
49
|
|
|
54
|
-
this.dbPhysicalSize = meter.createGauge(Metrics.WORLD_STATE_DB_PHYSICAL_SIZE
|
|
55
|
-
description: `The current physical disk space used for each database`,
|
|
56
|
-
valueType: ValueType.INT,
|
|
57
|
-
});
|
|
50
|
+
this.dbPhysicalSize = meter.createGauge(Metrics.WORLD_STATE_DB_PHYSICAL_SIZE);
|
|
58
51
|
|
|
59
|
-
this.treeSize = meter.createGauge(Metrics.WORLD_STATE_TREE_SIZE
|
|
60
|
-
description: `The current number of leaves in each merkle tree`,
|
|
61
|
-
valueType: ValueType.INT,
|
|
62
|
-
});
|
|
52
|
+
this.treeSize = meter.createGauge(Metrics.WORLD_STATE_TREE_SIZE);
|
|
63
53
|
|
|
64
|
-
this.unfinalizedHeight = meter.createGauge(Metrics.WORLD_STATE_UNFINALIZED_HEIGHT
|
|
65
|
-
description: `The unfinalized block height of each merkle tree`,
|
|
66
|
-
valueType: ValueType.INT,
|
|
67
|
-
});
|
|
54
|
+
this.unfinalizedHeight = meter.createGauge(Metrics.WORLD_STATE_UNFINALIZED_HEIGHT);
|
|
68
55
|
|
|
69
|
-
this.finalizedHeight = meter.createGauge(Metrics.WORLD_STATE_FINALIZED_HEIGHT
|
|
70
|
-
description: `The finalized block height of each merkle tree`,
|
|
71
|
-
valueType: ValueType.INT,
|
|
72
|
-
});
|
|
56
|
+
this.finalizedHeight = meter.createGauge(Metrics.WORLD_STATE_FINALIZED_HEIGHT);
|
|
73
57
|
|
|
74
|
-
this.oldestBlock = meter.createGauge(Metrics.WORLD_STATE_OLDEST_BLOCK
|
|
75
|
-
description: `The oldest historical block of each merkle tree`,
|
|
76
|
-
valueType: ValueType.INT,
|
|
77
|
-
});
|
|
58
|
+
this.oldestBlock = meter.createGauge(Metrics.WORLD_STATE_OLDEST_BLOCK);
|
|
78
59
|
|
|
79
|
-
this.dbUsedSize = meter.createGauge(Metrics.WORLD_STATE_DB_USED_SIZE
|
|
80
|
-
description: `The current used database size for each db of each merkle tree`,
|
|
81
|
-
valueType: ValueType.INT,
|
|
82
|
-
});
|
|
60
|
+
this.dbUsedSize = meter.createGauge(Metrics.WORLD_STATE_DB_USED_SIZE);
|
|
83
61
|
|
|
84
|
-
this.dbNumItems = meter.createGauge(Metrics.WORLD_STATE_DB_NUM_ITEMS
|
|
85
|
-
description: `The current number of items in each database of each merkle tree`,
|
|
86
|
-
valueType: ValueType.INT,
|
|
87
|
-
});
|
|
62
|
+
this.dbNumItems = meter.createGauge(Metrics.WORLD_STATE_DB_NUM_ITEMS);
|
|
88
63
|
|
|
89
|
-
this.requestHistogram = meter.createHistogram(Metrics.WORLD_STATE_REQUEST_TIME
|
|
90
|
-
description: 'The round trip time of world state requests',
|
|
91
|
-
unit: 'us',
|
|
92
|
-
valueType: ValueType.INT,
|
|
93
|
-
});
|
|
64
|
+
this.requestHistogram = meter.createHistogram(Metrics.WORLD_STATE_REQUEST_TIME);
|
|
94
65
|
|
|
95
|
-
this.criticalErrors = meter.createUpDownCounter(Metrics.WORLD_STATE_CRITICAL_ERROR_COUNT
|
|
96
|
-
description: 'The number of critical errors in the world state',
|
|
97
|
-
valueType: ValueType.INT,
|
|
98
|
-
});
|
|
66
|
+
this.criticalErrors = meter.createUpDownCounter(Metrics.WORLD_STATE_CRITICAL_ERROR_COUNT);
|
|
99
67
|
}
|
|
100
68
|
|
|
101
69
|
private updateTreeStats(treeDbStats: TreeDBStats, treeMeta: TreeMeta, tree: MerkleTreeId) {
|