@aztec/archiver 0.0.1-commit.e558bd1c → 0.0.1-commit.e5a3663dd
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/README.md +12 -6
- package/dest/archiver.d.ts +26 -15
- package/dest/archiver.d.ts.map +1 -1
- package/dest/archiver.js +161 -153
- package/dest/config.d.ts +5 -3
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +16 -4
- package/dest/errors.d.ts +61 -10
- package/dest/errors.d.ts.map +1 -1
- package/dest/errors.js +88 -14
- package/dest/factory.d.ts +6 -7
- package/dest/factory.d.ts.map +1 -1
- package/dest/factory.js +40 -32
- package/dest/index.d.ts +11 -3
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +10 -2
- package/dest/l1/bin/retrieve-calldata.js +32 -28
- package/dest/l1/calldata_retriever.d.ts +74 -50
- package/dest/l1/calldata_retriever.d.ts.map +1 -1
- package/dest/l1/calldata_retriever.js +197 -260
- package/dest/l1/data_retrieval.d.ts +26 -17
- package/dest/l1/data_retrieval.d.ts.map +1 -1
- package/dest/l1/data_retrieval.js +42 -47
- package/dest/l1/spire_proposer.d.ts +5 -5
- package/dest/l1/spire_proposer.d.ts.map +1 -1
- package/dest/l1/spire_proposer.js +9 -17
- package/dest/l1/validate_historical_logs.d.ts +23 -0
- package/dest/l1/validate_historical_logs.d.ts.map +1 -0
- package/dest/l1/validate_historical_logs.js +108 -0
- package/dest/modules/contract_data_source_adapter.d.ts +25 -0
- package/dest/modules/contract_data_source_adapter.d.ts.map +1 -0
- package/dest/modules/contract_data_source_adapter.js +42 -0
- package/dest/modules/data_source_base.d.ts +27 -14
- package/dest/modules/data_source_base.d.ts.map +1 -1
- package/dest/modules/data_source_base.js +98 -125
- package/dest/modules/data_store_updater.d.ts +37 -17
- package/dest/modules/data_store_updater.d.ts.map +1 -1
- package/dest/modules/data_store_updater.js +155 -112
- package/dest/modules/instrumentation.d.ts +21 -3
- package/dest/modules/instrumentation.d.ts.map +1 -1
- package/dest/modules/instrumentation.js +41 -8
- package/dest/modules/l1_synchronizer.d.ts +13 -11
- package/dest/modules/l1_synchronizer.d.ts.map +1 -1
- package/dest/modules/l1_synchronizer.js +355 -182
- package/dest/modules/validation.d.ts +4 -3
- package/dest/modules/validation.d.ts.map +1 -1
- package/dest/modules/validation.js +6 -6
- package/dest/store/block_store.d.ts +107 -31
- package/dest/store/block_store.d.ts.map +1 -1
- package/dest/store/block_store.js +477 -141
- package/dest/store/contract_class_store.d.ts +17 -4
- package/dest/store/contract_class_store.d.ts.map +1 -1
- package/dest/store/contract_class_store.js +24 -68
- package/dest/store/contract_instance_store.d.ts +28 -1
- package/dest/store/contract_instance_store.d.ts.map +1 -1
- package/dest/store/contract_instance_store.js +37 -2
- package/dest/store/data_stores.d.ts +68 -0
- package/dest/store/data_stores.d.ts.map +1 -0
- package/dest/store/data_stores.js +50 -0
- package/dest/store/function_names_cache.d.ts +17 -0
- package/dest/store/function_names_cache.d.ts.map +1 -0
- package/dest/store/function_names_cache.js +30 -0
- package/dest/store/l2_tips_cache.d.ts +20 -0
- package/dest/store/l2_tips_cache.d.ts.map +1 -0
- package/dest/store/l2_tips_cache.js +109 -0
- package/dest/store/log_store.d.ts +6 -3
- package/dest/store/log_store.d.ts.map +1 -1
- package/dest/store/log_store.js +95 -20
- package/dest/store/message_store.d.ts +11 -1
- package/dest/store/message_store.d.ts.map +1 -1
- package/dest/store/message_store.js +51 -9
- package/dest/test/fake_l1_state.d.ts +25 -1
- package/dest/test/fake_l1_state.d.ts.map +1 -1
- package/dest/test/fake_l1_state.js +166 -32
- package/dest/test/mock_archiver.d.ts +1 -1
- package/dest/test/mock_archiver.d.ts.map +1 -1
- package/dest/test/mock_archiver.js +3 -2
- package/dest/test/mock_l1_to_l2_message_source.d.ts +1 -1
- package/dest/test/mock_l1_to_l2_message_source.d.ts.map +1 -1
- package/dest/test/mock_l1_to_l2_message_source.js +2 -1
- package/dest/test/mock_l2_block_source.d.ts +35 -5
- package/dest/test/mock_l2_block_source.d.ts.map +1 -1
- package/dest/test/mock_l2_block_source.js +182 -89
- package/dest/test/mock_structs.d.ts +4 -1
- package/dest/test/mock_structs.d.ts.map +1 -1
- package/dest/test/mock_structs.js +13 -1
- package/dest/test/noop_l1_archiver.d.ts +7 -4
- package/dest/test/noop_l1_archiver.d.ts.map +1 -1
- package/dest/test/noop_l1_archiver.js +14 -8
- package/package.json +13 -13
- package/src/archiver.ts +199 -174
- package/src/config.ts +23 -2
- package/src/errors.ts +133 -22
- package/src/factory.ts +53 -30
- package/src/index.ts +18 -2
- package/src/l1/README.md +25 -68
- package/src/l1/bin/retrieve-calldata.ts +40 -27
- package/src/l1/calldata_retriever.ts +261 -379
- package/src/l1/data_retrieval.ts +58 -69
- package/src/l1/spire_proposer.ts +7 -15
- package/src/l1/validate_historical_logs.ts +140 -0
- package/src/modules/contract_data_source_adapter.ts +59 -0
- package/src/modules/data_source_base.ts +142 -144
- package/src/modules/data_store_updater.ts +187 -141
- package/src/modules/instrumentation.ts +56 -9
- package/src/modules/l1_synchronizer.ts +463 -218
- package/src/modules/validation.ts +10 -9
- package/src/store/block_store.ts +587 -177
- package/src/store/contract_class_store.ts +31 -103
- package/src/store/contract_instance_store.ts +51 -5
- package/src/store/data_stores.ts +108 -0
- package/src/store/function_names_cache.ts +37 -0
- package/src/store/l2_tips_cache.ts +134 -0
- package/src/store/log_store.ts +128 -32
- package/src/store/message_store.ts +60 -10
- package/src/structs/inbox_message.ts +1 -1
- package/src/test/fake_l1_state.ts +213 -42
- package/src/test/mock_archiver.ts +3 -2
- package/src/test/mock_l1_to_l2_message_source.ts +1 -0
- package/src/test/mock_l2_block_source.ts +230 -82
- package/src/test/mock_structs.ts +20 -6
- package/src/test/noop_l1_archiver.ts +16 -8
- package/dest/store/kv_archiver_store.d.ts +0 -340
- package/dest/store/kv_archiver_store.d.ts.map +0 -1
- package/dest/store/kv_archiver_store.js +0 -446
- package/src/store/kv_archiver_store.ts +0 -639
|
@@ -5,27 +5,43 @@ import { Buffer32 } from '@aztec/foundation/buffer';
|
|
|
5
5
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
6
6
|
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
7
7
|
import { createLogger } from '@aztec/foundation/log';
|
|
8
|
-
import { CheckpointedL2Block
|
|
8
|
+
import { CheckpointedL2Block } from '@aztec/stdlib/block';
|
|
9
9
|
import { Checkpoint, L1PublishedData, PublishedCheckpoint } from '@aztec/stdlib/checkpoint';
|
|
10
|
-
import { EmptyL1RollupConstants, getSlotRangeForEpoch } from '@aztec/stdlib/epoch-helpers';
|
|
10
|
+
import { EmptyL1RollupConstants, getEpochAtSlot, getSlotRangeForEpoch } from '@aztec/stdlib/epoch-helpers';
|
|
11
|
+
import { computeCheckpointOutHash } from '@aztec/stdlib/messaging';
|
|
12
|
+
import { CheckpointHeader } from '@aztec/stdlib/rollup';
|
|
11
13
|
import { TxExecutionResult, TxReceipt, TxStatus } from '@aztec/stdlib/tx';
|
|
12
14
|
/**
|
|
13
15
|
* A mocked implementation of L2BlockSource to be used in tests.
|
|
14
16
|
*/ export class MockL2BlockSource {
|
|
15
17
|
l2Blocks = [];
|
|
18
|
+
checkpointList = [];
|
|
16
19
|
provenBlockNumber = 0;
|
|
17
20
|
finalizedBlockNumber = 0;
|
|
18
21
|
checkpointedBlockNumber = 0;
|
|
22
|
+
proposedCheckpointBlockNumber = 0;
|
|
19
23
|
log = createLogger('archiver:mock_l2_block_source');
|
|
20
|
-
async createBlocks(numBlocks) {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
24
|
+
/** Creates blocks grouped into single-block checkpoints. */ async createBlocks(numBlocks) {
|
|
25
|
+
await this.createCheckpoints(numBlocks, 1);
|
|
26
|
+
}
|
|
27
|
+
getCheckpointNumber() {
|
|
28
|
+
return Promise.resolve(this.checkpointList.length === 0 ? CheckpointNumber.ZERO : CheckpointNumber(this.checkpointList.length));
|
|
29
|
+
}
|
|
30
|
+
/** Creates checkpoints, each containing `blocksPerCheckpoint` blocks. */ async createCheckpoints(numCheckpoints, blocksPerCheckpoint = 1) {
|
|
31
|
+
for(let c = 0; c < numCheckpoints; c++){
|
|
32
|
+
const checkpointNum = CheckpointNumber(this.checkpointList.length + 1);
|
|
33
|
+
const startBlockNum = this.l2Blocks.length + 1;
|
|
34
|
+
const slotNumber = SlotNumber(Number(checkpointNum));
|
|
35
|
+
const checkpoint = await Checkpoint.random(checkpointNum, {
|
|
36
|
+
numBlocks: blocksPerCheckpoint,
|
|
37
|
+
startBlockNumber: startBlockNum,
|
|
38
|
+
slotNumber,
|
|
39
|
+
checkpointNumber: checkpointNum
|
|
25
40
|
});
|
|
26
|
-
this.
|
|
41
|
+
this.checkpointList.push(checkpoint);
|
|
42
|
+
this.l2Blocks.push(...checkpoint.blocks);
|
|
27
43
|
}
|
|
28
|
-
this.log.verbose(`Created ${
|
|
44
|
+
this.log.verbose(`Created ${numCheckpoints} checkpoints with ${blocksPerCheckpoint} blocks each in the mock L2 block source`);
|
|
29
45
|
}
|
|
30
46
|
addProposedBlocks(blocks) {
|
|
31
47
|
this.l2Blocks.push(...blocks);
|
|
@@ -33,6 +49,17 @@ import { TxExecutionResult, TxReceipt, TxStatus } from '@aztec/stdlib/tx';
|
|
|
33
49
|
}
|
|
34
50
|
removeBlocks(numBlocks) {
|
|
35
51
|
this.l2Blocks = this.l2Blocks.slice(0, -numBlocks);
|
|
52
|
+
const maxBlockNum = this.l2Blocks.length;
|
|
53
|
+
// Remove any checkpoint whose last block is beyond the remaining blocks.
|
|
54
|
+
this.checkpointList = this.checkpointList.filter((c)=>{
|
|
55
|
+
const lastBlockNum = c.blocks[0].number + c.blocks.length - 1;
|
|
56
|
+
return lastBlockNum <= maxBlockNum;
|
|
57
|
+
});
|
|
58
|
+
// Keep tip numbers consistent with remaining blocks.
|
|
59
|
+
this.checkpointedBlockNumber = Math.min(this.checkpointedBlockNumber, maxBlockNum);
|
|
60
|
+
this.proposedCheckpointBlockNumber = Math.min(this.proposedCheckpointBlockNumber, maxBlockNum);
|
|
61
|
+
this.provenBlockNumber = Math.min(this.provenBlockNumber, maxBlockNum);
|
|
62
|
+
this.finalizedBlockNumber = Math.min(this.finalizedBlockNumber, maxBlockNum);
|
|
36
63
|
this.log.verbose(`Removed ${numBlocks} blocks from the mock L2 block source`);
|
|
37
64
|
}
|
|
38
65
|
setProvenBlockNumber(provenBlockNumber) {
|
|
@@ -44,8 +71,40 @@ import { TxExecutionResult, TxReceipt, TxStatus } from '@aztec/stdlib/tx';
|
|
|
44
71
|
}
|
|
45
72
|
this.finalizedBlockNumber = finalizedBlockNumber;
|
|
46
73
|
}
|
|
74
|
+
setProposedCheckpointBlockNumber(blockNumber) {
|
|
75
|
+
this.proposedCheckpointBlockNumber = blockNumber;
|
|
76
|
+
}
|
|
47
77
|
setCheckpointedBlockNumber(checkpointedBlockNumber) {
|
|
78
|
+
const prevCheckpointed = this.checkpointedBlockNumber;
|
|
48
79
|
this.checkpointedBlockNumber = checkpointedBlockNumber;
|
|
80
|
+
// Proposed checkpoint is always at least as advanced as checkpointed
|
|
81
|
+
if (this.proposedCheckpointBlockNumber < checkpointedBlockNumber) {
|
|
82
|
+
this.proposedCheckpointBlockNumber = checkpointedBlockNumber;
|
|
83
|
+
}
|
|
84
|
+
// Auto-create single-block checkpoints for newly checkpointed blocks that don't have one yet.
|
|
85
|
+
// This handles blocks added via addProposedBlocks that are now being marked as checkpointed.
|
|
86
|
+
const newCheckpoints = [];
|
|
87
|
+
for(let blockNum = prevCheckpointed + 1; blockNum <= checkpointedBlockNumber; blockNum++){
|
|
88
|
+
const block = this.l2Blocks[blockNum - 1];
|
|
89
|
+
if (!block) {
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
if (this.checkpointList.some((c)=>c.blocks.some((b)=>b.number === block.number))) {
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
const checkpointNum = CheckpointNumber(this.checkpointList.length + newCheckpoints.length + 1);
|
|
96
|
+
const checkpoint = new Checkpoint(block.archive, CheckpointHeader.random({
|
|
97
|
+
slotNumber: block.header.globalVariables.slotNumber
|
|
98
|
+
}), [
|
|
99
|
+
block
|
|
100
|
+
], checkpointNum);
|
|
101
|
+
newCheckpoints.push(checkpoint);
|
|
102
|
+
}
|
|
103
|
+
// Insert new checkpoints in order by number.
|
|
104
|
+
if (newCheckpoints.length > 0) {
|
|
105
|
+
this.checkpointList.push(...newCheckpoints);
|
|
106
|
+
this.checkpointList.sort((a, b)=>a.number - b.number);
|
|
107
|
+
}
|
|
49
108
|
}
|
|
50
109
|
/**
|
|
51
110
|
* Method to fetch the rollup contract address at the base-layer.
|
|
@@ -74,6 +133,9 @@ import { TxExecutionResult, TxReceipt, TxStatus } from '@aztec/stdlib/tx';
|
|
|
74
133
|
getFinalizedL2BlockNumber() {
|
|
75
134
|
return Promise.resolve(BlockNumber(this.finalizedBlockNumber));
|
|
76
135
|
}
|
|
136
|
+
getProposedCheckpointL2BlockNumber() {
|
|
137
|
+
return Promise.resolve(BlockNumber(this.proposedCheckpointBlockNumber));
|
|
138
|
+
}
|
|
77
139
|
getCheckpointedBlock(number) {
|
|
78
140
|
if (number > this.checkpointedBlockNumber) {
|
|
79
141
|
return Promise.resolve(undefined);
|
|
@@ -82,8 +144,7 @@ import { TxExecutionResult, TxReceipt, TxStatus } from '@aztec/stdlib/tx';
|
|
|
82
144
|
if (!block) {
|
|
83
145
|
return Promise.resolve(undefined);
|
|
84
146
|
}
|
|
85
|
-
|
|
86
|
-
return Promise.resolve(checkpointedBlock);
|
|
147
|
+
return Promise.resolve(this.toCheckpointedBlock(block));
|
|
87
148
|
}
|
|
88
149
|
async getCheckpointedBlocks(from, limit) {
|
|
89
150
|
const result = [];
|
|
@@ -124,44 +185,18 @@ import { TxExecutionResult, TxReceipt, TxStatus } from '@aztec/stdlib/tx';
|
|
|
124
185
|
return Promise.resolve(this.l2Blocks.slice(from - 1, from - 1 + limit));
|
|
125
186
|
}
|
|
126
187
|
getCheckpoints(from, limit) {
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
return Promise.all(blocks.map(async (block)=>{
|
|
130
|
-
// Create a checkpoint from the block - manually construct since L2Block doesn't have toCheckpoint()
|
|
131
|
-
const checkpoint = await Checkpoint.random(block.checkpointNumber, {
|
|
132
|
-
numBlocks: 1
|
|
133
|
-
});
|
|
134
|
-
checkpoint.blocks = [
|
|
135
|
-
block
|
|
136
|
-
];
|
|
137
|
-
return new PublishedCheckpoint(checkpoint, new L1PublishedData(BigInt(block.number), BigInt(block.number), Buffer32.random().toString()), []);
|
|
138
|
-
}));
|
|
188
|
+
const checkpoints = this.checkpointList.slice(from - 1, from - 1 + limit);
|
|
189
|
+
return Promise.resolve(checkpoints.map((checkpoint)=>new PublishedCheckpoint(checkpoint, this.mockL1DataForCheckpoint(checkpoint), [])));
|
|
139
190
|
}
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
if (!block) {
|
|
144
|
-
return undefined;
|
|
145
|
-
}
|
|
146
|
-
// Create a checkpoint from the block - manually construct since L2Block doesn't have toCheckpoint()
|
|
147
|
-
const checkpoint = await Checkpoint.random(block.checkpointNumber, {
|
|
148
|
-
numBlocks: 1
|
|
149
|
-
});
|
|
150
|
-
checkpoint.blocks = [
|
|
151
|
-
block
|
|
152
|
-
];
|
|
153
|
-
return checkpoint;
|
|
191
|
+
getCheckpointByArchive(archive) {
|
|
192
|
+
const checkpoint = this.checkpointList.find((c)=>c.archive.root.equals(archive));
|
|
193
|
+
return Promise.resolve(checkpoint);
|
|
154
194
|
}
|
|
155
195
|
async getCheckpointedBlockByHash(blockHash) {
|
|
156
196
|
for (const block of this.l2Blocks){
|
|
157
197
|
const hash = await block.hash();
|
|
158
198
|
if (hash.equals(blockHash)) {
|
|
159
|
-
return
|
|
160
|
-
checkpointNumber: CheckpointNumber.fromBlockNumber(block.number),
|
|
161
|
-
block,
|
|
162
|
-
l1: new L1PublishedData(BigInt(block.number), BigInt(block.number), Buffer32.random().toString()),
|
|
163
|
-
attestations: []
|
|
164
|
-
});
|
|
199
|
+
return this.toCheckpointedBlock(block);
|
|
165
200
|
}
|
|
166
201
|
}
|
|
167
202
|
return undefined;
|
|
@@ -171,12 +206,7 @@ import { TxExecutionResult, TxReceipt, TxStatus } from '@aztec/stdlib/tx';
|
|
|
171
206
|
if (!block) {
|
|
172
207
|
return Promise.resolve(undefined);
|
|
173
208
|
}
|
|
174
|
-
return Promise.resolve(
|
|
175
|
-
checkpointNumber: CheckpointNumber.fromBlockNumber(block.number),
|
|
176
|
-
block,
|
|
177
|
-
l1: new L1PublishedData(BigInt(block.number), BigInt(block.number), Buffer32.random().toString()),
|
|
178
|
-
attestations: []
|
|
179
|
-
}));
|
|
209
|
+
return Promise.resolve(this.toCheckpointedBlock(block));
|
|
180
210
|
}
|
|
181
211
|
async getL2BlockByHash(blockHash) {
|
|
182
212
|
for (const block of this.l2Blocks){
|
|
@@ -204,45 +234,76 @@ import { TxExecutionResult, TxReceipt, TxStatus } from '@aztec/stdlib/tx';
|
|
|
204
234
|
const block = this.l2Blocks.find((b)=>b.archive.root.equals(archive));
|
|
205
235
|
return Promise.resolve(block?.header);
|
|
206
236
|
}
|
|
237
|
+
async getBlockData(number) {
|
|
238
|
+
const block = this.l2Blocks[number - 1];
|
|
239
|
+
if (!block) {
|
|
240
|
+
return undefined;
|
|
241
|
+
}
|
|
242
|
+
return {
|
|
243
|
+
header: block.header,
|
|
244
|
+
archive: block.archive,
|
|
245
|
+
blockHash: await block.hash(),
|
|
246
|
+
checkpointNumber: block.checkpointNumber,
|
|
247
|
+
indexWithinCheckpoint: block.indexWithinCheckpoint
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
getCheckpointData(_n) {
|
|
251
|
+
return Promise.resolve(undefined);
|
|
252
|
+
}
|
|
253
|
+
getCheckpointDataRange(_from, _limit) {
|
|
254
|
+
return Promise.resolve([]);
|
|
255
|
+
}
|
|
256
|
+
getCheckpointNumberBySlot(_slot) {
|
|
257
|
+
return Promise.resolve(undefined);
|
|
258
|
+
}
|
|
259
|
+
async getBlockDataWithCheckpointContext(number) {
|
|
260
|
+
const data = await this.getBlockData(number);
|
|
261
|
+
if (!data) {
|
|
262
|
+
return undefined;
|
|
263
|
+
}
|
|
264
|
+
return {
|
|
265
|
+
data,
|
|
266
|
+
checkpoint: undefined,
|
|
267
|
+
l1: undefined,
|
|
268
|
+
attestations: []
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
async getBlockDataByArchive(archive) {
|
|
272
|
+
const block = this.l2Blocks.find((b)=>b.archive.root.equals(archive));
|
|
273
|
+
if (!block) {
|
|
274
|
+
return undefined;
|
|
275
|
+
}
|
|
276
|
+
return {
|
|
277
|
+
header: block.header,
|
|
278
|
+
archive: block.archive,
|
|
279
|
+
blockHash: await block.hash(),
|
|
280
|
+
checkpointNumber: block.checkpointNumber,
|
|
281
|
+
indexWithinCheckpoint: block.indexWithinCheckpoint
|
|
282
|
+
};
|
|
283
|
+
}
|
|
207
284
|
getBlockHeader(number) {
|
|
208
285
|
return Promise.resolve(this.l2Blocks.at(typeof number === 'number' ? number - 1 : -1)?.header);
|
|
209
286
|
}
|
|
210
287
|
getCheckpointsForEpoch(epochNumber) {
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
block
|
|
227
|
-
];
|
|
228
|
-
return checkpoint;
|
|
229
|
-
}));
|
|
288
|
+
return Promise.resolve(this.getCheckpointsInEpoch(epochNumber));
|
|
289
|
+
}
|
|
290
|
+
getCheckpointsDataForEpoch(epochNumber) {
|
|
291
|
+
const checkpoints = this.getCheckpointsInEpoch(epochNumber);
|
|
292
|
+
return Promise.resolve(checkpoints.map((checkpoint)=>({
|
|
293
|
+
checkpointNumber: checkpoint.number,
|
|
294
|
+
header: checkpoint.header,
|
|
295
|
+
archive: checkpoint.archive,
|
|
296
|
+
checkpointOutHash: computeCheckpointOutHash(checkpoint.blocks.map((b)=>b.body.txEffects.map((tx)=>tx.l2ToL1Msgs))),
|
|
297
|
+
startBlock: checkpoint.blocks[0].number,
|
|
298
|
+
blockCount: checkpoint.blocks.length,
|
|
299
|
+
feeAssetPriceModifier: checkpoint.feeAssetPriceModifier,
|
|
300
|
+
attestations: [],
|
|
301
|
+
l1: this.mockL1DataForCheckpoint(checkpoint)
|
|
302
|
+
})));
|
|
230
303
|
}
|
|
231
304
|
getCheckpointedBlocksForEpoch(epochNumber) {
|
|
232
|
-
const
|
|
233
|
-
|
|
234
|
-
epochDuration
|
|
235
|
-
});
|
|
236
|
-
const blocks = this.l2Blocks.filter((b)=>{
|
|
237
|
-
const slot = b.header.globalVariables.slotNumber;
|
|
238
|
-
return slot >= start && slot <= end;
|
|
239
|
-
});
|
|
240
|
-
return Promise.resolve(blocks.map((block)=>CheckpointedL2Block.fromFields({
|
|
241
|
-
checkpointNumber: CheckpointNumber.fromBlockNumber(block.number),
|
|
242
|
-
block,
|
|
243
|
-
l1: new L1PublishedData(BigInt(block.number), BigInt(block.number), Buffer32.random().toString()),
|
|
244
|
-
attestations: []
|
|
245
|
-
})));
|
|
305
|
+
const checkpoints = this.getCheckpointsInEpoch(epochNumber);
|
|
306
|
+
return Promise.resolve(checkpoints.flatMap((checkpoint)=>checkpoint.blocks.map((block)=>this.toCheckpointedBlock(block))));
|
|
246
307
|
}
|
|
247
308
|
getBlocksForSlot(slotNumber) {
|
|
248
309
|
const blocks = this.l2Blocks.filter((b)=>b.header.globalVariables.slotNumber === slotNumber);
|
|
@@ -281,23 +342,25 @@ import { TxExecutionResult, TxReceipt, TxStatus } from '@aztec/stdlib/tx';
|
|
|
281
342
|
for (const txEffect of block.body.txEffects){
|
|
282
343
|
if (txEffect.txHash.equals(txHash)) {
|
|
283
344
|
// In mock, assume all txs are checkpointed with successful execution
|
|
284
|
-
return new TxReceipt(txHash, TxStatus.CHECKPOINTED, TxExecutionResult.SUCCESS, undefined, txEffect.transactionFee.toBigInt(), await block.hash(), block.number);
|
|
345
|
+
return new TxReceipt(txHash, TxStatus.CHECKPOINTED, TxExecutionResult.SUCCESS, undefined, txEffect.transactionFee.toBigInt(), await block.hash(), block.number, getEpochAtSlot(block.slot, EmptyL1RollupConstants));
|
|
285
346
|
}
|
|
286
347
|
}
|
|
287
348
|
}
|
|
288
349
|
return undefined;
|
|
289
350
|
}
|
|
290
351
|
async getL2Tips() {
|
|
291
|
-
const [latest, proven, finalized, checkpointed] = [
|
|
352
|
+
const [latest, proven, finalized, checkpointed, proposedCheckpoint] = [
|
|
292
353
|
await this.getBlockNumber(),
|
|
293
354
|
await this.getProvenBlockNumber(),
|
|
294
355
|
this.finalizedBlockNumber,
|
|
295
|
-
this.checkpointedBlockNumber
|
|
356
|
+
this.checkpointedBlockNumber,
|
|
357
|
+
await this.getProposedCheckpointL2BlockNumber()
|
|
296
358
|
];
|
|
297
359
|
const latestBlock = this.l2Blocks[latest - 1];
|
|
298
360
|
const provenBlock = this.l2Blocks[proven - 1];
|
|
299
361
|
const finalizedBlock = this.l2Blocks[finalized - 1];
|
|
300
362
|
const checkpointedBlock = this.l2Blocks[checkpointed - 1];
|
|
363
|
+
const proposedCheckpointBlock = this.l2Blocks[proposedCheckpoint - 1];
|
|
301
364
|
const latestBlockId = {
|
|
302
365
|
number: BlockNumber(latest),
|
|
303
366
|
hash: (await latestBlock?.hash())?.toString()
|
|
@@ -314,10 +377,14 @@ import { TxExecutionResult, TxReceipt, TxStatus } from '@aztec/stdlib/tx';
|
|
|
314
377
|
number: BlockNumber(checkpointed),
|
|
315
378
|
hash: (await checkpointedBlock?.hash())?.toString()
|
|
316
379
|
};
|
|
380
|
+
const proposedCheckpointBlockId = {
|
|
381
|
+
number: BlockNumber(proposedCheckpoint),
|
|
382
|
+
hash: (await proposedCheckpointBlock?.hash())?.toString()
|
|
383
|
+
};
|
|
317
384
|
const makeTipId = (blockId)=>({
|
|
318
385
|
block: blockId,
|
|
319
386
|
checkpoint: {
|
|
320
|
-
number:
|
|
387
|
+
number: this.findCheckpointNumberForBlock(blockId.number) ?? CheckpointNumber(0),
|
|
321
388
|
hash: blockId.hash
|
|
322
389
|
}
|
|
323
390
|
});
|
|
@@ -325,13 +392,14 @@ import { TxExecutionResult, TxReceipt, TxStatus } from '@aztec/stdlib/tx';
|
|
|
325
392
|
proposed: latestBlockId,
|
|
326
393
|
checkpointed: makeTipId(checkpointedBlockId),
|
|
327
394
|
proven: makeTipId(provenBlockId),
|
|
328
|
-
finalized: makeTipId(finalizedBlockId)
|
|
395
|
+
finalized: makeTipId(finalizedBlockId),
|
|
396
|
+
proposedCheckpoint: makeTipId(proposedCheckpointBlockId)
|
|
329
397
|
};
|
|
330
398
|
}
|
|
331
|
-
|
|
399
|
+
getSyncedL2EpochNumber() {
|
|
332
400
|
throw new Error('Method not implemented.');
|
|
333
401
|
}
|
|
334
|
-
|
|
402
|
+
getSyncedL2SlotNumber() {
|
|
335
403
|
throw new Error('Method not implemented.');
|
|
336
404
|
}
|
|
337
405
|
isEpochComplete(_epochNumber) {
|
|
@@ -391,4 +459,29 @@ import { TxExecutionResult, TxReceipt, TxStatus } from '@aztec/stdlib/tx';
|
|
|
391
459
|
valid: true
|
|
392
460
|
});
|
|
393
461
|
}
|
|
462
|
+
getLastCheckpoint() {
|
|
463
|
+
return Promise.resolve(undefined);
|
|
464
|
+
}
|
|
465
|
+
getLastProposedCheckpoint() {
|
|
466
|
+
return Promise.resolve(undefined);
|
|
467
|
+
}
|
|
468
|
+
/** Returns checkpoints whose slot falls within the given epoch. */ getCheckpointsInEpoch(epochNumber) {
|
|
469
|
+
const epochDuration = DefaultL1ContractsConfig.aztecEpochDuration;
|
|
470
|
+
const [start, end] = getSlotRangeForEpoch(epochNumber, {
|
|
471
|
+
epochDuration
|
|
472
|
+
});
|
|
473
|
+
return this.checkpointList.filter((c)=>c.header.slotNumber >= start && c.header.slotNumber <= end);
|
|
474
|
+
}
|
|
475
|
+
/** Creates a mock L1PublishedData for a checkpoint. */ mockL1DataForCheckpoint(checkpoint) {
|
|
476
|
+
return new L1PublishedData(BigInt(checkpoint.number), BigInt(checkpoint.number), Buffer32.random().toString());
|
|
477
|
+
}
|
|
478
|
+
/** Creates a CheckpointedL2Block from a block using stored checkpoint info. */ toCheckpointedBlock(block) {
|
|
479
|
+
const checkpoint = this.checkpointList.find((c)=>c.blocks.some((b)=>b.number === block.number));
|
|
480
|
+
const checkpointNumber = checkpoint?.number ?? block.checkpointNumber;
|
|
481
|
+
return new CheckpointedL2Block(checkpointNumber, block, new L1PublishedData(BigInt(block.number), BigInt(block.number), `0x${block.number.toString(16).padStart(64, '0')}`), []);
|
|
482
|
+
}
|
|
483
|
+
/** Finds the checkpoint number for a block, or undefined if the block is not in any checkpoint. */ findCheckpointNumberForBlock(blockNumber) {
|
|
484
|
+
const checkpoint = this.checkpointList.find((c)=>c.blocks.some((b)=>b.number === blockNumber));
|
|
485
|
+
return checkpoint?.number;
|
|
486
|
+
}
|
|
394
487
|
}
|
|
@@ -3,6 +3,7 @@ import { Buffer16 } from '@aztec/foundation/buffer';
|
|
|
3
3
|
import type { Secp256k1Signer } from '@aztec/foundation/crypto/secp256k1-signer';
|
|
4
4
|
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
5
5
|
import { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
6
|
+
import { L2Block } from '@aztec/stdlib/block';
|
|
6
7
|
import { Checkpoint, L1PublishedData, PublishedCheckpoint } from '@aztec/stdlib/checkpoint';
|
|
7
8
|
import { PrivateLog, PublicLog, SiloedTag, Tag } from '@aztec/stdlib/logs';
|
|
8
9
|
import { AppendOnlyTreeSnapshot } from '@aztec/stdlib/trees';
|
|
@@ -28,6 +29,8 @@ export declare function makeBlockHash(blockNumber: number): `0x${string}`;
|
|
|
28
29
|
export declare function makeStateForBlock(blockNumber: number, txsPerBlock: number): StateReference;
|
|
29
30
|
/** Creates L1PublishedData with deterministic values based on l1BlockNumber. */
|
|
30
31
|
export declare function makeL1PublishedData(l1BlockNumber: number): L1PublishedData;
|
|
32
|
+
/** Creates a Checkpoint from a list of blocks with a header that matches the blocks' structure. */
|
|
33
|
+
export declare function makeCheckpoint(blocks: L2Block[], checkpointNumber?: CheckpointNumber): Checkpoint;
|
|
31
34
|
/** Wraps a Checkpoint with L1 published data and random attestations. */
|
|
32
35
|
export declare function makePublishedCheckpoint(checkpoint: Checkpoint, l1BlockNumber: number, attestationCount?: number): PublishedCheckpoint;
|
|
33
36
|
export interface MakeChainedCheckpointsOptions {
|
|
@@ -82,4 +85,4 @@ export interface MockCheckpointWithLogsOptions {
|
|
|
82
85
|
}
|
|
83
86
|
/** Creates a checkpoint with specified logs on each tx effect. */
|
|
84
87
|
export declare function makeCheckpointWithLogs(blockNumber: number, options?: MockCheckpointWithLogsOptions): Promise<PublishedCheckpoint>;
|
|
85
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
88
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9ja19zdHJ1Y3RzLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVzdC9tb2NrX3N0cnVjdHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBTUEsT0FBTyxFQUFlLGdCQUFnQixFQUF5QixNQUFNLGlDQUFpQyxDQUFDO0FBQ3ZHLE9BQU8sRUFBRSxRQUFRLEVBQVksTUFBTSwwQkFBMEIsQ0FBQztBQUc5RCxPQUFPLEtBQUssRUFBRSxlQUFlLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUVqRixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDM0QsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzNELE9BQU8sRUFBd0IsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDcEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxlQUFlLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUM1RixPQUFPLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFLM0UsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDN0QsT0FBTyxFQUF5QixjQUFjLEVBQVksTUFBTSxrQkFBa0IsQ0FBQztBQUVuRixPQUFPLEVBQUUsS0FBSyxZQUFZLEVBQXFCLE1BQU0sNkJBQTZCLENBQUM7QUFFbkYsd0JBQWdCLGdCQUFnQixDQUM5QixtQkFBbUIsV0FBZ0IsRUFDbkMsU0FBUyxHQUFFLE9BQU8sQ0FBQyxZQUFZLENBQU0sR0FDcEMsWUFBWSxDQWdCZDtBQUVELHdCQUFnQixpQkFBaUIsQ0FDL0IsVUFBVSxFQUFFLE1BQU0sRUFDbEIsSUFBSSxHQUFFO0lBQ0osV0FBVyxDQUFDLEVBQUUsUUFBUSxDQUFDO0lBQ3ZCLHVCQUF1QixDQUFDLEVBQUUsZ0JBQWdCLENBQUM7SUFDM0MscUJBQXFCLENBQUMsRUFB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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mock_structs.d.ts","sourceRoot":"","sources":["../../src/test/mock_structs.ts"],"names":[],"mappings":"AAMA,OAAO,EAAe,gBAAgB,EAAyB,MAAM,iCAAiC,CAAC;AACvG,OAAO,EAAE,QAAQ,EAAY,MAAM,0BAA0B,CAAC;AAG9D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2CAA2C,CAAC;AAEjF,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"mock_structs.d.ts","sourceRoot":"","sources":["../../src/test/mock_structs.ts"],"names":[],"mappings":"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"}
|
|
@@ -77,6 +77,18 @@ export function makeInboxMessages(totalCount, opts = {}) {
|
|
|
77
77
|
/** Creates L1PublishedData with deterministic values based on l1BlockNumber. */ export function makeL1PublishedData(l1BlockNumber) {
|
|
78
78
|
return new L1PublishedData(BigInt(l1BlockNumber), BigInt(l1BlockNumber * 1000), makeBlockHash(l1BlockNumber));
|
|
79
79
|
}
|
|
80
|
+
/** Creates a Checkpoint from a list of blocks with a header that matches the blocks' structure. */ export function makeCheckpoint(blocks, checkpointNumber = CheckpointNumber(1)) {
|
|
81
|
+
const firstBlock = blocks[0];
|
|
82
|
+
const { slotNumber, timestamp, coinbase, feeRecipient, gasFees } = firstBlock.header.globalVariables;
|
|
83
|
+
return new Checkpoint(blocks.at(-1).archive, CheckpointHeader.random({
|
|
84
|
+
lastArchiveRoot: firstBlock.header.lastArchive.root,
|
|
85
|
+
slotNumber,
|
|
86
|
+
timestamp,
|
|
87
|
+
coinbase,
|
|
88
|
+
feeRecipient,
|
|
89
|
+
gasFees
|
|
90
|
+
}), blocks, checkpointNumber);
|
|
91
|
+
}
|
|
80
92
|
/** Wraps a Checkpoint with L1 published data and random attestations. */ export function makePublishedCheckpoint(checkpoint, l1BlockNumber, attestationCount = 3) {
|
|
81
93
|
return new PublishedCheckpoint(checkpoint, makeL1PublishedData(l1BlockNumber), times(attestationCount, CommitteeAttestation.random));
|
|
82
94
|
}
|
|
@@ -164,7 +176,7 @@ export function makeInboxMessages(totalCount, opts = {}) {
|
|
|
164
176
|
txEffect.publicLogs = publicLogs ? makePublicLogs(blockNumber, txIndex, publicLogs.numLogsPerTx, publicLogs.contractAddress) : [];
|
|
165
177
|
return txEffect;
|
|
166
178
|
});
|
|
167
|
-
const checkpoint =
|
|
179
|
+
const checkpoint = makeCheckpoint([
|
|
168
180
|
block
|
|
169
181
|
], CheckpointNumber.fromBlockNumber(BlockNumber(blockNumber)));
|
|
170
182
|
return makePublishedCheckpoint(checkpoint, blockNumber);
|
|
@@ -1,23 +1,26 @@
|
|
|
1
|
+
import { SlotNumber } from '@aztec/foundation/branded-types';
|
|
1
2
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
2
3
|
import type { L1RollupConstants } from '@aztec/stdlib/epoch-helpers';
|
|
3
4
|
import { type TelemetryClient } from '@aztec/telemetry-client';
|
|
4
5
|
import { Archiver } from '../archiver.js';
|
|
5
6
|
import { ArchiverInstrumentation } from '../modules/instrumentation.js';
|
|
6
|
-
import type {
|
|
7
|
+
import type { ArchiverDataStores } from '../store/data_stores.js';
|
|
7
8
|
/**
|
|
8
9
|
* Archiver with mocked L1 connectivity for testing.
|
|
9
10
|
* Uses mock L1 clients and a noop synchronizer, enabling tests that
|
|
10
11
|
* don't require real Ethereum connectivity.
|
|
11
12
|
*/
|
|
12
13
|
export declare class NoopL1Archiver extends Archiver {
|
|
13
|
-
constructor(
|
|
14
|
+
constructor(dataStores: ArchiverDataStores, l1Constants: L1RollupConstants & {
|
|
14
15
|
genesisArchiveRoot: Fr;
|
|
15
16
|
}, instrumentation: ArchiverInstrumentation);
|
|
16
17
|
/** Override start to skip L1 validation checks. */
|
|
17
18
|
start(_blockUntilSynced?: boolean): Promise<void>;
|
|
19
|
+
/** Always reports as fully synced since there is no real L1 to sync from. */
|
|
20
|
+
getSyncedL2SlotNumber(): Promise<SlotNumber | undefined>;
|
|
18
21
|
}
|
|
19
22
|
/** Creates an archiver with mocked L1 connectivity for testing. */
|
|
20
|
-
export declare function createNoopL1Archiver(
|
|
23
|
+
export declare function createNoopL1Archiver(dataStores: ArchiverDataStores, l1Constants: L1RollupConstants & {
|
|
21
24
|
genesisArchiveRoot: Fr;
|
|
22
25
|
}, telemetry?: TelemetryClient): Promise<NoopL1Archiver>;
|
|
23
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
26
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9vcF9sMV9hcmNoaXZlci5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Rlc3Qvbm9vcF9sMV9hcmNoaXZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFFN0QsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBSXBELE9BQU8sS0FBSyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDckUsT0FBTyxFQUFFLEtBQUssZUFBZSxFQUFtQyxNQUFNLHlCQUF5QixDQUFDO0FBS2hHLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMxQyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUV4RSxPQUFPLEtBQUssRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBeUJsRTs7OztHQUlHO0FBQ0gscUJBQWEsY0FBZSxTQUFRLFFBQVE7SUFDMUMsWUFDRSxVQUFVLEVBQUUsa0JBQWtCLEVBQzlCLFdBQVcsRUFBRSxpQkFBaUIsR0FBRztRQUFFLGtCQUFrQixFQUFFLEVBQUUsQ0FBQTtLQUFFLEVBQzNELGVBQWUsRUFBRSx1QkFBdUIsRUF5Q3pDO0lBRUQsbURBQW1EO0lBQ25DLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLE9BQU8sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBSWhFO0lBRUQsNkVBQTZFO0lBQzdELHFCQUFxQixJQUFJLE9BQU8sQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDLENBRXZFO0NBQ0Y7QUFFRCxtRUFBbUU7QUFDbkUsd0JBQXNCLG9CQUFvQixDQUN4QyxVQUFVLEVBQUUsa0JBQWtCLEVBQzlCLFdBQVcsRUFBRSxpQkFBaUIsR0FBRztJQUFFLGtCQUFrQixFQUFFLEVBQUUsQ0FBQTtDQUFFLEVBQzNELFNBQVMsR0FBRSxlQUFzQyxHQUNoRCxPQUFPLENBQUMsY0FBYyxDQUFDLENBR3pCIn0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"noop_l1_archiver.d.ts","sourceRoot":"","sources":["../../src/test/noop_l1_archiver.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"noop_l1_archiver.d.ts","sourceRoot":"","sources":["../../src/test/noop_l1_archiver.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAE7D,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AAIpD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,KAAK,eAAe,EAAmC,MAAM,yBAAyB,CAAC;AAKhG,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AAExE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAyBlE;;;;GAIG;AACH,qBAAa,cAAe,SAAQ,QAAQ;IAC1C,YACE,UAAU,EAAE,kBAAkB,EAC9B,WAAW,EAAE,iBAAiB,GAAG;QAAE,kBAAkB,EAAE,EAAE,CAAA;KAAE,EAC3D,eAAe,EAAE,uBAAuB,EAyCzC;IAED,mDAAmD;IACnC,KAAK,CAAC,iBAAiB,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAIhE;IAED,6EAA6E;IAC7D,qBAAqB,IAAI,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAEvE;CACF;AAED,mEAAmE;AACnE,wBAAsB,oBAAoB,CACxC,UAAU,EAAE,kBAAkB,EAC9B,WAAW,EAAE,iBAAiB,GAAG;IAAE,kBAAkB,EAAE,EAAE,CAAA;CAAE,EAC3D,SAAS,GAAE,eAAsC,GAChD,OAAO,CAAC,cAAc,CAAC,CAGzB"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { SlotNumber } from '@aztec/foundation/branded-types';
|
|
1
2
|
import { Buffer32 } from '@aztec/foundation/buffer';
|
|
2
3
|
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
3
4
|
import { getTelemetryClient } from '@aztec/telemetry-client';
|
|
@@ -15,7 +16,7 @@ import { ArchiverInstrumentation } from '../modules/instrumentation.js';
|
|
|
15
16
|
return 0n;
|
|
16
17
|
}
|
|
17
18
|
getL1Timestamp() {
|
|
18
|
-
return
|
|
19
|
+
return undefined;
|
|
19
20
|
}
|
|
20
21
|
testEthereumNodeSynced() {
|
|
21
22
|
return Promise.resolve();
|
|
@@ -29,7 +30,7 @@ import { ArchiverInstrumentation } from '../modules/instrumentation.js';
|
|
|
29
30
|
* Uses mock L1 clients and a noop synchronizer, enabling tests that
|
|
30
31
|
* don't require real Ethereum connectivity.
|
|
31
32
|
*/ export class NoopL1Archiver extends Archiver {
|
|
32
|
-
constructor(
|
|
33
|
+
constructor(dataStores, l1Constants, instrumentation){
|
|
33
34
|
// Create mocks for L1 clients
|
|
34
35
|
const publicClient = mock();
|
|
35
36
|
const debugClient = mock();
|
|
@@ -41,16 +42,18 @@ import { ArchiverInstrumentation } from '../modules/instrumentation.js';
|
|
|
41
42
|
const events = new EventEmitter();
|
|
42
43
|
const synchronizer = new NoopL1Synchronizer(instrumentation.tracer);
|
|
43
44
|
super(publicClient, debugClient, rollup, {
|
|
45
|
+
rollupAddress: EthAddress.ZERO,
|
|
44
46
|
registryAddress: EthAddress.ZERO,
|
|
47
|
+
inboxAddress: EthAddress.ZERO,
|
|
45
48
|
governanceProposerAddress: EthAddress.ZERO,
|
|
46
|
-
slashFactoryAddress: EthAddress.ZERO,
|
|
47
49
|
slashingProposerAddress: EthAddress.ZERO
|
|
48
|
-
},
|
|
50
|
+
}, dataStores, {
|
|
49
51
|
pollingIntervalMs: 1000,
|
|
50
52
|
batchSize: 100,
|
|
51
53
|
skipValidateCheckpointAttestations: true,
|
|
52
54
|
maxAllowedEthClientDriftSeconds: 300,
|
|
53
|
-
ethereumAllowNoDebugHosts: true
|
|
55
|
+
ethereumAllowNoDebugHosts: true,
|
|
56
|
+
skipHistoricalLogsCheck: true
|
|
54
57
|
}, blobClient, instrumentation, {
|
|
55
58
|
...l1Constants,
|
|
56
59
|
l1StartBlockHash: Buffer32.random()
|
|
@@ -61,8 +64,11 @@ import { ArchiverInstrumentation } from '../modules/instrumentation.js';
|
|
|
61
64
|
this.runningPromise.start();
|
|
62
65
|
return Promise.resolve();
|
|
63
66
|
}
|
|
67
|
+
/** Always reports as fully synced since there is no real L1 to sync from. */ getSyncedL2SlotNumber() {
|
|
68
|
+
return Promise.resolve(SlotNumber(Number.MAX_SAFE_INTEGER));
|
|
69
|
+
}
|
|
64
70
|
}
|
|
65
|
-
/** Creates an archiver with mocked L1 connectivity for testing. */ export async function createNoopL1Archiver(
|
|
66
|
-
const instrumentation = await ArchiverInstrumentation.new(telemetry, ()=>
|
|
67
|
-
return new NoopL1Archiver(
|
|
71
|
+
/** Creates an archiver with mocked L1 connectivity for testing. */ export async function createNoopL1Archiver(dataStores, l1Constants, telemetry = getTelemetryClient()) {
|
|
72
|
+
const instrumentation = await ArchiverInstrumentation.new(telemetry, ()=>dataStores.db.estimateSize());
|
|
73
|
+
return new NoopL1Archiver(dataStores, l1Constants, instrumentation);
|
|
68
74
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/archiver",
|
|
3
|
-
"version": "0.0.1-commit.
|
|
3
|
+
"version": "0.0.1-commit.e5a3663dd",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": "./dest/index.js",
|
|
@@ -65,18 +65,18 @@
|
|
|
65
65
|
]
|
|
66
66
|
},
|
|
67
67
|
"dependencies": {
|
|
68
|
-
"@aztec/blob-client": "0.0.1-commit.
|
|
69
|
-
"@aztec/blob-lib": "0.0.1-commit.
|
|
70
|
-
"@aztec/constants": "0.0.1-commit.
|
|
71
|
-
"@aztec/epoch-cache": "0.0.1-commit.
|
|
72
|
-
"@aztec/ethereum": "0.0.1-commit.
|
|
73
|
-
"@aztec/foundation": "0.0.1-commit.
|
|
74
|
-
"@aztec/kv-store": "0.0.1-commit.
|
|
75
|
-
"@aztec/l1-artifacts": "0.0.1-commit.
|
|
76
|
-
"@aztec/noir-protocol-circuits-types": "0.0.1-commit.
|
|
77
|
-
"@aztec/protocol-contracts": "0.0.1-commit.
|
|
78
|
-
"@aztec/stdlib": "0.0.1-commit.
|
|
79
|
-
"@aztec/telemetry-client": "0.0.1-commit.
|
|
68
|
+
"@aztec/blob-client": "0.0.1-commit.e5a3663dd",
|
|
69
|
+
"@aztec/blob-lib": "0.0.1-commit.e5a3663dd",
|
|
70
|
+
"@aztec/constants": "0.0.1-commit.e5a3663dd",
|
|
71
|
+
"@aztec/epoch-cache": "0.0.1-commit.e5a3663dd",
|
|
72
|
+
"@aztec/ethereum": "0.0.1-commit.e5a3663dd",
|
|
73
|
+
"@aztec/foundation": "0.0.1-commit.e5a3663dd",
|
|
74
|
+
"@aztec/kv-store": "0.0.1-commit.e5a3663dd",
|
|
75
|
+
"@aztec/l1-artifacts": "0.0.1-commit.e5a3663dd",
|
|
76
|
+
"@aztec/noir-protocol-circuits-types": "0.0.1-commit.e5a3663dd",
|
|
77
|
+
"@aztec/protocol-contracts": "0.0.1-commit.e5a3663dd",
|
|
78
|
+
"@aztec/stdlib": "0.0.1-commit.e5a3663dd",
|
|
79
|
+
"@aztec/telemetry-client": "0.0.1-commit.e5a3663dd",
|
|
80
80
|
"lodash.groupby": "^4.6.0",
|
|
81
81
|
"lodash.omit": "^4.5.0",
|
|
82
82
|
"tslib": "^2.5.0",
|