@aztec/archiver 0.0.1-commit.3469e52 → 0.0.1-commit.59e663cd
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 +9 -0
- package/dest/archiver.d.ts +6 -5
- package/dest/archiver.d.ts.map +1 -1
- package/dest/archiver.js +19 -20
- package/dest/errors.d.ts +6 -1
- package/dest/errors.d.ts.map +1 -1
- package/dest/errors.js +8 -0
- package/dest/factory.d.ts +5 -2
- package/dest/factory.d.ts.map +1 -1
- package/dest/factory.js +6 -4
- package/dest/l1/bin/retrieve-calldata.js +2 -2
- package/dest/l1/data_retrieval.d.ts +1 -1
- package/dest/l1/data_retrieval.d.ts.map +1 -1
- package/dest/l1/data_retrieval.js +2 -2
- package/dest/modules/data_source_base.d.ts +16 -17
- package/dest/modules/data_source_base.d.ts.map +1 -1
- package/dest/modules/data_source_base.js +21 -52
- package/dest/modules/data_store_updater.d.ts +23 -19
- package/dest/modules/data_store_updater.d.ts.map +1 -1
- package/dest/modules/data_store_updater.js +47 -49
- package/dest/modules/instrumentation.d.ts +3 -3
- package/dest/modules/instrumentation.d.ts.map +1 -1
- package/dest/modules/l1_synchronizer.js +7 -7
- package/dest/store/block_store.d.ts +34 -20
- package/dest/store/block_store.d.ts.map +1 -1
- package/dest/store/block_store.js +81 -40
- package/dest/store/kv_archiver_store.d.ts +26 -22
- package/dest/store/kv_archiver_store.d.ts.map +1 -1
- package/dest/store/kv_archiver_store.js +21 -17
- package/dest/store/log_store.d.ts +4 -4
- package/dest/store/log_store.d.ts.map +1 -1
- package/dest/store/log_store.js +2 -2
- package/dest/test/fake_l1_state.d.ts +4 -4
- package/dest/test/fake_l1_state.d.ts.map +1 -1
- package/dest/test/index.d.ts +2 -1
- package/dest/test/index.d.ts.map +1 -1
- package/dest/test/index.js +1 -0
- package/dest/test/mock_archiver.js +1 -1
- package/dest/test/mock_l2_block_source.d.ts +19 -19
- package/dest/test/mock_l2_block_source.d.ts.map +1 -1
- package/dest/test/mock_l2_block_source.js +40 -41
- package/dest/test/mock_structs.d.ts +3 -2
- package/dest/test/mock_structs.d.ts.map +1 -1
- package/dest/test/mock_structs.js +11 -9
- package/dest/test/noop_l1_archiver.d.ts +23 -0
- package/dest/test/noop_l1_archiver.d.ts.map +1 -0
- package/dest/test/noop_l1_archiver.js +68 -0
- package/package.json +13 -13
- package/src/archiver.ts +25 -27
- package/src/errors.ts +12 -0
- package/src/factory.ts +6 -3
- package/src/l1/bin/retrieve-calldata.ts +7 -2
- package/src/l1/data_retrieval.ts +3 -3
- package/src/modules/data_source_base.ts +25 -76
- package/src/modules/data_store_updater.ts +59 -55
- package/src/modules/instrumentation.ts +2 -2
- package/src/modules/l1_synchronizer.ts +9 -9
- package/src/store/block_store.ts +106 -59
- package/src/store/kv_archiver_store.ts +34 -26
- package/src/store/log_store.ts +11 -11
- package/src/test/fake_l1_state.ts +2 -2
- package/src/test/index.ts +1 -0
- package/src/test/mock_archiver.ts +1 -1
- package/src/test/mock_l2_block_source.ts +53 -63
- package/src/test/mock_structs.ts +26 -10
- package/src/test/noop_l1_archiver.ts +109 -0
|
@@ -5,10 +5,10 @@ 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 {
|
|
8
|
+
import { BlockHash, CheckpointedL2Block, L2Block } from '@aztec/stdlib/block';
|
|
9
9
|
import { Checkpoint, L1PublishedData, PublishedCheckpoint } from '@aztec/stdlib/checkpoint';
|
|
10
10
|
import { EmptyL1RollupConstants, getSlotRangeForEpoch } from '@aztec/stdlib/epoch-helpers';
|
|
11
|
-
import { TxReceipt, TxStatus } from '@aztec/stdlib/tx';
|
|
11
|
+
import { TxExecutionResult, TxReceipt, TxStatus } from '@aztec/stdlib/tx';
|
|
12
12
|
/**
|
|
13
13
|
* A mocked implementation of L2BlockSource to be used in tests.
|
|
14
14
|
*/ export class MockL2BlockSource {
|
|
@@ -20,16 +20,16 @@ import { TxReceipt, TxStatus } from '@aztec/stdlib/tx';
|
|
|
20
20
|
async createBlocks(numBlocks) {
|
|
21
21
|
for(let i = 0; i < numBlocks; i++){
|
|
22
22
|
const blockNum = this.l2Blocks.length + 1;
|
|
23
|
-
const block = await
|
|
23
|
+
const block = await L2Block.random(BlockNumber(blockNum), {
|
|
24
24
|
slotNumber: SlotNumber(blockNum)
|
|
25
25
|
});
|
|
26
26
|
this.l2Blocks.push(block);
|
|
27
27
|
}
|
|
28
28
|
this.log.verbose(`Created ${numBlocks} blocks in the mock L2 block source`);
|
|
29
29
|
}
|
|
30
|
-
|
|
30
|
+
addProposedBlocks(blocks) {
|
|
31
31
|
this.l2Blocks.push(...blocks);
|
|
32
|
-
this.log.verbose(`Added ${blocks.length} blocks to the mock L2 block source`);
|
|
32
|
+
this.log.verbose(`Added ${blocks.length} proposed blocks to the mock L2 block source`);
|
|
33
33
|
}
|
|
34
34
|
removeBlocks(numBlocks) {
|
|
35
35
|
this.l2Blocks = this.l2Blocks.slice(0, -numBlocks);
|
|
@@ -68,6 +68,12 @@ import { TxReceipt, TxStatus } from '@aztec/stdlib/tx';
|
|
|
68
68
|
getProvenBlockNumber() {
|
|
69
69
|
return Promise.resolve(BlockNumber(this.provenBlockNumber));
|
|
70
70
|
}
|
|
71
|
+
getCheckpointedL2BlockNumber() {
|
|
72
|
+
return Promise.resolve(BlockNumber(this.checkpointedBlockNumber));
|
|
73
|
+
}
|
|
74
|
+
getFinalizedL2BlockNumber() {
|
|
75
|
+
return Promise.resolve(BlockNumber(this.finalizedBlockNumber));
|
|
76
|
+
}
|
|
71
77
|
getCheckpointedBlock(number) {
|
|
72
78
|
if (number > this.checkpointedBlockNumber) {
|
|
73
79
|
return Promise.resolve(undefined);
|
|
@@ -76,10 +82,10 @@ import { TxReceipt, TxStatus } from '@aztec/stdlib/tx';
|
|
|
76
82
|
if (!block) {
|
|
77
83
|
return Promise.resolve(undefined);
|
|
78
84
|
}
|
|
79
|
-
const checkpointedBlock = new CheckpointedL2Block(CheckpointNumber(number), block, new L1PublishedData(BigInt(number), BigInt(number), `0x${number.toString(16).padStart(64, '0')}`), []);
|
|
85
|
+
const checkpointedBlock = new CheckpointedL2Block(CheckpointNumber.fromBlockNumber(number), block, new L1PublishedData(BigInt(number), BigInt(number), `0x${number.toString(16).padStart(64, '0')}`), []);
|
|
80
86
|
return Promise.resolve(checkpointedBlock);
|
|
81
87
|
}
|
|
82
|
-
async getCheckpointedBlocks(from, limit
|
|
88
|
+
async getCheckpointedBlocks(from, limit) {
|
|
83
89
|
const result = [];
|
|
84
90
|
for(let i = 0; i < limit; i++){
|
|
85
91
|
const blockNum = from + i;
|
|
@@ -105,7 +111,7 @@ import { TxReceipt, TxStatus } from '@aztec/stdlib/tx';
|
|
|
105
111
|
* Gets an L2 block (new format).
|
|
106
112
|
* @param number - The block number to return.
|
|
107
113
|
* @returns The requested L2 block.
|
|
108
|
-
*/
|
|
114
|
+
*/ getL2Block(number) {
|
|
109
115
|
const block = this.l2Blocks[number - 1];
|
|
110
116
|
return Promise.resolve(block);
|
|
111
117
|
}
|
|
@@ -114,14 +120,14 @@ import { TxReceipt, TxStatus } from '@aztec/stdlib/tx';
|
|
|
114
120
|
* @param from - Number of the first block to return (inclusive).
|
|
115
121
|
* @param limit - The maximum number of blocks to return.
|
|
116
122
|
* @returns The requested mocked L2 blocks.
|
|
117
|
-
*/ getBlocks(from, limit
|
|
118
|
-
return Promise.resolve(this.l2Blocks.slice(from - 1, from - 1 + limit)
|
|
123
|
+
*/ getBlocks(from, limit) {
|
|
124
|
+
return Promise.resolve(this.l2Blocks.slice(from - 1, from - 1 + limit));
|
|
119
125
|
}
|
|
120
|
-
|
|
126
|
+
getCheckpoints(from, limit) {
|
|
121
127
|
// TODO(mbps): Implement this properly. This only works when we have one block per checkpoint.
|
|
122
128
|
const blocks = this.l2Blocks.slice(from - 1, from - 1 + limit);
|
|
123
129
|
return Promise.all(blocks.map(async (block)=>{
|
|
124
|
-
// Create a checkpoint from the block - manually construct since
|
|
130
|
+
// Create a checkpoint from the block - manually construct since L2Block doesn't have toCheckpoint()
|
|
125
131
|
const checkpoint = await Checkpoint.random(block.checkpointNumber, {
|
|
126
132
|
numBlocks: 1
|
|
127
133
|
});
|
|
@@ -137,7 +143,7 @@ import { TxReceipt, TxStatus } from '@aztec/stdlib/tx';
|
|
|
137
143
|
if (!block) {
|
|
138
144
|
return undefined;
|
|
139
145
|
}
|
|
140
|
-
// Create a checkpoint from the block - manually construct since
|
|
146
|
+
// Create a checkpoint from the block - manually construct since L2Block doesn't have toCheckpoint()
|
|
141
147
|
const checkpoint = await Checkpoint.random(block.checkpointNumber, {
|
|
142
148
|
numBlocks: 1
|
|
143
149
|
});
|
|
@@ -146,25 +152,12 @@ import { TxReceipt, TxStatus } from '@aztec/stdlib/tx';
|
|
|
146
152
|
];
|
|
147
153
|
return checkpoint;
|
|
148
154
|
}
|
|
149
|
-
|
|
150
|
-
const blocks = this.l2Blocks.slice(from - 1, from - 1 + limit).filter((b)=>!proven || this.provenBlockNumber === undefined || b.number <= this.provenBlockNumber);
|
|
151
|
-
return Promise.resolve(blocks.map((block)=>CheckpointedL2Block.fromFields({
|
|
152
|
-
checkpointNumber: CheckpointNumber(block.number),
|
|
153
|
-
block,
|
|
154
|
-
l1: new L1PublishedData(BigInt(block.number), BigInt(block.number), Buffer32.random().toString()),
|
|
155
|
-
attestations: []
|
|
156
|
-
})));
|
|
157
|
-
}
|
|
158
|
-
getL2BlocksNew(from, limit, proven) {
|
|
159
|
-
// getBlocks already returns L2BlockNew[], so just return directly
|
|
160
|
-
return this.getBlocks(from, limit, proven);
|
|
161
|
-
}
|
|
162
|
-
async getPublishedBlockByHash(blockHash) {
|
|
155
|
+
async getCheckpointedBlockByHash(blockHash) {
|
|
163
156
|
for (const block of this.l2Blocks){
|
|
164
157
|
const hash = await block.hash();
|
|
165
158
|
if (hash.equals(blockHash)) {
|
|
166
159
|
return CheckpointedL2Block.fromFields({
|
|
167
|
-
checkpointNumber: CheckpointNumber(block.number),
|
|
160
|
+
checkpointNumber: CheckpointNumber.fromBlockNumber(block.number),
|
|
168
161
|
block,
|
|
169
162
|
l1: new L1PublishedData(BigInt(block.number), BigInt(block.number), Buffer32.random().toString()),
|
|
170
163
|
attestations: []
|
|
@@ -173,19 +166,19 @@ import { TxReceipt, TxStatus } from '@aztec/stdlib/tx';
|
|
|
173
166
|
}
|
|
174
167
|
return undefined;
|
|
175
168
|
}
|
|
176
|
-
|
|
169
|
+
getCheckpointedBlockByArchive(archive) {
|
|
177
170
|
const block = this.l2Blocks.find((b)=>b.archive.root.equals(archive));
|
|
178
171
|
if (!block) {
|
|
179
172
|
return Promise.resolve(undefined);
|
|
180
173
|
}
|
|
181
174
|
return Promise.resolve(CheckpointedL2Block.fromFields({
|
|
182
|
-
checkpointNumber: CheckpointNumber(block.number),
|
|
175
|
+
checkpointNumber: CheckpointNumber.fromBlockNumber(block.number),
|
|
183
176
|
block,
|
|
184
177
|
l1: new L1PublishedData(BigInt(block.number), BigInt(block.number), Buffer32.random().toString()),
|
|
185
178
|
attestations: []
|
|
186
179
|
}));
|
|
187
180
|
}
|
|
188
|
-
async
|
|
181
|
+
async getL2BlockByHash(blockHash) {
|
|
189
182
|
for (const block of this.l2Blocks){
|
|
190
183
|
const hash = await block.hash();
|
|
191
184
|
if (hash.equals(blockHash)) {
|
|
@@ -194,7 +187,7 @@ import { TxReceipt, TxStatus } from '@aztec/stdlib/tx';
|
|
|
194
187
|
}
|
|
195
188
|
return undefined;
|
|
196
189
|
}
|
|
197
|
-
|
|
190
|
+
getL2BlockByArchive(archive) {
|
|
198
191
|
const block = this.l2Blocks.find((b)=>b.archive.root.equals(archive));
|
|
199
192
|
return Promise.resolve(block);
|
|
200
193
|
}
|
|
@@ -224,7 +217,7 @@ import { TxReceipt, TxStatus } from '@aztec/stdlib/tx';
|
|
|
224
217
|
const slot = b.header.globalVariables.slotNumber;
|
|
225
218
|
return slot >= start && slot <= end;
|
|
226
219
|
});
|
|
227
|
-
// Create checkpoints from blocks - manually construct since
|
|
220
|
+
// Create checkpoints from blocks - manually construct since L2Block doesn't have toCheckpoint()
|
|
228
221
|
return Promise.all(blocks.map(async (block)=>{
|
|
229
222
|
const checkpoint = await Checkpoint.random(block.checkpointNumber, {
|
|
230
223
|
numBlocks: 1
|
|
@@ -235,7 +228,7 @@ import { TxReceipt, TxStatus } from '@aztec/stdlib/tx';
|
|
|
235
228
|
return checkpoint;
|
|
236
229
|
}));
|
|
237
230
|
}
|
|
238
|
-
|
|
231
|
+
getCheckpointedBlocksForEpoch(epochNumber) {
|
|
239
232
|
const epochDuration = DefaultL1ContractsConfig.aztecEpochDuration;
|
|
240
233
|
const [start, end] = getSlotRangeForEpoch(epochNumber, {
|
|
241
234
|
epochDuration
|
|
@@ -244,15 +237,20 @@ import { TxReceipt, TxStatus } from '@aztec/stdlib/tx';
|
|
|
244
237
|
const slot = b.header.globalVariables.slotNumber;
|
|
245
238
|
return slot >= start && slot <= end;
|
|
246
239
|
});
|
|
247
|
-
return Promise.resolve(blocks)
|
|
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
|
+
})));
|
|
248
246
|
}
|
|
249
247
|
getBlocksForSlot(slotNumber) {
|
|
250
248
|
const blocks = this.l2Blocks.filter((b)=>b.header.globalVariables.slotNumber === slotNumber);
|
|
251
249
|
return Promise.resolve(blocks);
|
|
252
250
|
}
|
|
253
|
-
async
|
|
254
|
-
const
|
|
255
|
-
return
|
|
251
|
+
async getCheckpointedBlockHeadersForEpoch(epochNumber) {
|
|
252
|
+
const checkpointedBlocks = await this.getCheckpointedBlocksForEpoch(epochNumber);
|
|
253
|
+
return checkpointedBlocks.map((b)=>b.block.header);
|
|
256
254
|
}
|
|
257
255
|
/**
|
|
258
256
|
* Gets a tx effect.
|
|
@@ -270,7 +268,7 @@ import { TxReceipt, TxStatus } from '@aztec/stdlib/tx';
|
|
|
270
268
|
return {
|
|
271
269
|
data: txEffect,
|
|
272
270
|
l2BlockNumber: block.number,
|
|
273
|
-
l2BlockHash:
|
|
271
|
+
l2BlockHash: BlockHash.fromField(await block.hash()),
|
|
274
272
|
txIndexInBlock: block.body.txEffects.indexOf(txEffect)
|
|
275
273
|
};
|
|
276
274
|
}
|
|
@@ -282,7 +280,8 @@ import { TxReceipt, TxStatus } from '@aztec/stdlib/tx';
|
|
|
282
280
|
for (const block of this.l2Blocks){
|
|
283
281
|
for (const txEffect of block.body.txEffects){
|
|
284
282
|
if (txEffect.txHash.equals(txHash)) {
|
|
285
|
-
|
|
283
|
+
// In mock, assume all txs are checkpointed with successful execution
|
|
284
|
+
return new TxReceipt(txHash, TxStatus.CHECKPOINTED, TxExecutionResult.SUCCESS, undefined, txEffect.transactionFee.toBigInt(), BlockHash.fromField(await block.hash()), block.number);
|
|
286
285
|
}
|
|
287
286
|
}
|
|
288
287
|
}
|
|
@@ -318,7 +317,7 @@ import { TxReceipt, TxStatus } from '@aztec/stdlib/tx';
|
|
|
318
317
|
const makeTipId = (blockId)=>({
|
|
319
318
|
block: blockId,
|
|
320
319
|
checkpoint: {
|
|
321
|
-
number: CheckpointNumber(blockId.number),
|
|
320
|
+
number: CheckpointNumber.fromBlockNumber(blockId.number),
|
|
322
321
|
hash: blockId.hash
|
|
323
322
|
}
|
|
324
323
|
});
|
|
@@ -9,9 +9,10 @@ import { AppendOnlyTreeSnapshot } from '@aztec/stdlib/trees';
|
|
|
9
9
|
import { StateReference } from '@aztec/stdlib/tx';
|
|
10
10
|
import { type InboxMessage } from '../structs/inbox_message.js';
|
|
11
11
|
export declare function makeInboxMessage(previousRollingHash?: Buffer16, overrides?: Partial<InboxMessage>): InboxMessage;
|
|
12
|
-
export declare function makeInboxMessages(
|
|
12
|
+
export declare function makeInboxMessages(totalCount: number, opts?: {
|
|
13
13
|
initialHash?: Buffer16;
|
|
14
14
|
initialCheckpointNumber?: CheckpointNumber;
|
|
15
|
+
messagesPerCheckpoint?: number;
|
|
15
16
|
overrideFn?: (msg: InboxMessage, index: number) => InboxMessage;
|
|
16
17
|
}): InboxMessage[];
|
|
17
18
|
/** Creates inbox messages distributed across multiple blocks with proper checkpoint numbering. */
|
|
@@ -81,4 +82,4 @@ export interface MockCheckpointWithLogsOptions {
|
|
|
81
82
|
}
|
|
82
83
|
/** Creates a checkpoint with specified logs on each tx effect. */
|
|
83
84
|
export declare function makeCheckpointWithLogs(blockNumber: number, options?: MockCheckpointWithLogsOptions): Promise<PublishedCheckpoint>;
|
|
84
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
85
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9ja19zdHJ1Y3RzLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVzdC9tb2NrX3N0cnVjdHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBTUEsT0FBTyxFQUFlLGdCQUFnQixFQUF5QixNQUFNLGlDQUFpQyxDQUFDO0FBQ3ZHLE9BQU8sRUFBRSxRQUFRLEVBQVksTUFBTSwwQkFBMEIsQ0FBQztBQUc5RCxPQUFPLEtBQUssRUFBRSxlQUFlLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUVqRixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDM0QsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBRTNELE9BQU8sRUFBRSxVQUFVLEVBQUUsZUFBZSxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDNUYsT0FBTyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBSzNFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzdELE9BQU8sRUFBeUIsY0FBYyxFQUFZLE1BQU0sa0JBQWtCLENBQUM7QUFFbkYsT0FBTyxFQUFFLEtBQUssWUFBWSxFQUFxQixNQUFNLDZCQUE2QixDQUFDO0FBRW5GLHdCQUFnQixnQkFBZ0IsQ0FDOUIsbUJBQW1CLFdBQWdCLEVBQ25DLFNBQVMsR0FBRSxPQUFPLENBQUMsWUFBWSxDQUFNLEdBQ3BDLFlBQVksQ0FnQmQ7QUFFRCx3QkFBZ0IsaUJBQWlCLENBQy9CLFVBQVUsRUFBRSxNQUFNLEVBQ2xCLElBQUksR0FBRTtJQUNKLFdBQVcsQ0FBQyxFQUFFLFFBQVEsQ0FBQztJQUN2Qix1QkFBdUIsQ0FBQyxFQUFFLGdCQUFnQixDQUFDO0lBQzNDLHFCQUFxQixDQUFDLEVBQUUsTUFBTSxDQUFDO0lBQy9CLFVBQVUsQ0FBQyxFQUFFLENBQUMsR0FBRyxF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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;AAE3D,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC5F,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AAK3E,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAyB,cAAc,EAAY,MAAM,kBAAkB,CAAC;AAEnF,OAAO,EAAE,KAAK,YAAY,EAAqB,MAAM,6BAA6B,CAAC;AAEnF,wBAAgB,gBAAgB,CAC9B,mBAAmB,WAAgB,EACnC,SAAS,GAAE,OAAO,CAAC,YAAY,CAAM,GACpC,YAAY,CAgBd;AAED,wBAAgB,iBAAiB,CAC/B,
|
|
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;AAE3D,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC5F,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AAK3E,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAyB,cAAc,EAAY,MAAM,kBAAkB,CAAC;AAEnF,OAAO,EAAE,KAAK,YAAY,EAAqB,MAAM,6BAA6B,CAAC;AAEnF,wBAAgB,gBAAgB,CAC9B,mBAAmB,WAAgB,EACnC,SAAS,GAAE,OAAO,CAAC,YAAY,CAAM,GACpC,YAAY,CAgBd;AAED,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,MAAM,EAClB,IAAI,GAAE;IACJ,WAAW,CAAC,EAAE,QAAQ,CAAC;IACvB,uBAAuB,CAAC,EAAE,gBAAgB,CAAC;IAC3C,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,KAAK,YAAY,CAAC;CAC5D,GACL,YAAY,EAAE,CA4BhB;AAED,kGAAkG;AAClG,wBAAgB,+BAA+B,CAC7C,UAAU,EAAE,MAAM,EAClB,IAAI,GAAE;IAAE,uBAAuB,CAAC,EAAE,gBAAgB,CAAA;CAAO,GACxD,YAAY,EAAE,CAYhB;AAED,8DAA8D;AAC9D,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,KAAK,MAAM,EAAE,CAEhE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,cAAc,CAU1F;AAED,gFAAgF;AAChF,wBAAgB,mBAAmB,CAAC,aAAa,EAAE,MAAM,GAAG,eAAe,CAE1E;AAED,yEAAyE;AACzE,wBAAgB,uBAAuB,CACrC,UAAU,EAAE,UAAU,EACtB,aAAa,EAAE,MAAM,EACrB,gBAAgB,SAAI,GACnB,mBAAmB,CAMrB;AAED,MAAM,WAAW,6BAA6B;IAC5C,qDAAqD;IACrD,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,mDAAmD;IACnD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+DAA+D;IAC/D,qBAAqB,CAAC,EAAE,gBAAgB,CAAC;IACzC,wCAAwC;IACxC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,4CAA4C;IAC5C,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,yDAAyD;IACzD,eAAe,CAAC,EAAE,sBAAsB,CAAC;IACzC,4DAA4D;IAC5D,qBAAqB,CAAC,EAAE,CAAC,QAAQ,EAAE,gBAAgB,KAAK,OAAO,CAAC,UAAU,CAAC,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CAC1G;AAED;;;;GAIG;AACH,wBAAsB,sBAAsB,CAC1C,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,6BAAkC,GAC1C,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAiChC;AAED;;;GAGG;AACH,wBAAgB,6BAA6B,CAC3C,UAAU,EAAE,UAAU,EACtB,OAAO,EAAE,eAAe,EAAE,EAC1B,SAAS,EAAE,UAAU,EAAE,EACvB,aAAa,SAAI,GAChB,mBAAmB,CAIrB;AAED,iEAAiE;AACjE,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,CAMnG;AAED,6DAA6D;AAC7D,wBAAgB,cAAc,CAAC,GAAG,EAAE,SAAS,GAAG,UAAU,CAKzD;AAED,uDAAuD;AACvD,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,UAAU,EAAE,CAKxG;AAED,0DAA0D;AAC1D,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,GAAG,CAM5F;AAED,4DAA4D;AAC5D,wBAAgB,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,eAAe,GAAE,YAA8C,GAAG,SAAS,CAKlH;AAED,sDAAsD;AACtD,wBAAgB,cAAc,CAC5B,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,EACpB,eAAe,GAAE,YAA8C,GAC9D,SAAS,EAAE,CAKb;AAED,MAAM,WAAW,6BAA6B;IAC5C,eAAe,CAAC,EAAE,sBAAsB,CAAC;IACzC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE;QAAE,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC;IACvC,UAAU,CAAC,EAAE;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,eAAe,CAAC,EAAE,YAAY,CAAA;KAAE,CAAC;CACvE;AAED,kEAAkE;AAClE,wBAAsB,sBAAsB,CAC1C,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,6BAAkC,GAC1C,OAAO,CAAC,mBAAmB,CAAC,CA2B9B"}
|
|
@@ -6,7 +6,7 @@ import { times, timesParallel } from '@aztec/foundation/collection';
|
|
|
6
6
|
import { randomBigInt, randomInt } from '@aztec/foundation/crypto/random';
|
|
7
7
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
8
8
|
import { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
9
|
-
import { CommitteeAttestation,
|
|
9
|
+
import { CommitteeAttestation, L2Block } from '@aztec/stdlib/block';
|
|
10
10
|
import { Checkpoint, L1PublishedData, PublishedCheckpoint } from '@aztec/stdlib/checkpoint';
|
|
11
11
|
import { PrivateLog, PublicLog, SiloedTag, Tag } from '@aztec/stdlib/logs';
|
|
12
12
|
import { InboxLeaf } from '@aztec/stdlib/messaging';
|
|
@@ -32,16 +32,18 @@ export function makeInboxMessage(previousRollingHash = Buffer16.ZERO, overrides
|
|
|
32
32
|
rollingHash
|
|
33
33
|
};
|
|
34
34
|
}
|
|
35
|
-
export function makeInboxMessages(
|
|
36
|
-
const { initialHash = Buffer16.ZERO, overrideFn = (msg)=>msg, initialCheckpointNumber = 1 } = opts;
|
|
35
|
+
export function makeInboxMessages(totalCount, opts = {}) {
|
|
36
|
+
const { initialHash = Buffer16.ZERO, overrideFn = (msg)=>msg, initialCheckpointNumber = CheckpointNumber(1), messagesPerCheckpoint = 1 } = opts;
|
|
37
37
|
const messages = [];
|
|
38
38
|
let rollingHash = initialHash;
|
|
39
|
-
for(let i = 0; i <
|
|
39
|
+
for(let i = 0; i < totalCount; i++){
|
|
40
|
+
const msgIndex = i % messagesPerCheckpoint;
|
|
41
|
+
const checkpointNumber = CheckpointNumber.fromBigInt(BigInt(initialCheckpointNumber) + BigInt(i) / BigInt(messagesPerCheckpoint));
|
|
40
42
|
const leaf = Fr.random();
|
|
41
|
-
const checkpointNumber = CheckpointNumber(i + initialCheckpointNumber);
|
|
42
43
|
const message = overrideFn(makeInboxMessage(rollingHash, {
|
|
43
44
|
leaf,
|
|
44
|
-
checkpointNumber
|
|
45
|
+
checkpointNumber,
|
|
46
|
+
index: InboxLeaf.smallestIndexForCheckpoint(checkpointNumber) + BigInt(msgIndex)
|
|
45
47
|
}), i);
|
|
46
48
|
rollingHash = message.rollingHash;
|
|
47
49
|
messages.push(message);
|
|
@@ -147,8 +149,8 @@ export function makeInboxMessages(count, opts = {}) {
|
|
|
147
149
|
}
|
|
148
150
|
/** Creates a checkpoint with specified logs on each tx effect. */ export async function makeCheckpointWithLogs(blockNumber, options = {}) {
|
|
149
151
|
const { previousArchive, numTxsPerBlock = 4, privateLogs, publicLogs } = options;
|
|
150
|
-
const block = await
|
|
151
|
-
checkpointNumber: CheckpointNumber(blockNumber),
|
|
152
|
+
const block = await L2Block.random(BlockNumber(blockNumber), {
|
|
153
|
+
checkpointNumber: CheckpointNumber.fromBlockNumber(BlockNumber(blockNumber)),
|
|
152
154
|
indexWithinCheckpoint: IndexWithinCheckpoint(0),
|
|
153
155
|
state: makeStateForBlock(blockNumber, numTxsPerBlock),
|
|
154
156
|
...previousArchive ? {
|
|
@@ -164,6 +166,6 @@ export function makeInboxMessages(count, opts = {}) {
|
|
|
164
166
|
});
|
|
165
167
|
const checkpoint = new Checkpoint(AppendOnlyTreeSnapshot.random(), CheckpointHeader.random(), [
|
|
166
168
|
block
|
|
167
|
-
], CheckpointNumber(blockNumber));
|
|
169
|
+
], CheckpointNumber.fromBlockNumber(BlockNumber(blockNumber)));
|
|
168
170
|
return makePublishedCheckpoint(checkpoint, blockNumber);
|
|
169
171
|
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
2
|
+
import type { L1RollupConstants } from '@aztec/stdlib/epoch-helpers';
|
|
3
|
+
import { type TelemetryClient } from '@aztec/telemetry-client';
|
|
4
|
+
import { Archiver } from '../archiver.js';
|
|
5
|
+
import { ArchiverInstrumentation } from '../modules/instrumentation.js';
|
|
6
|
+
import type { KVArchiverDataStore } from '../store/kv_archiver_store.js';
|
|
7
|
+
/**
|
|
8
|
+
* Archiver with mocked L1 connectivity for testing.
|
|
9
|
+
* Uses mock L1 clients and a noop synchronizer, enabling tests that
|
|
10
|
+
* don't require real Ethereum connectivity.
|
|
11
|
+
*/
|
|
12
|
+
export declare class NoopL1Archiver extends Archiver {
|
|
13
|
+
constructor(dataStore: KVArchiverDataStore, l1Constants: L1RollupConstants & {
|
|
14
|
+
genesisArchiveRoot: Fr;
|
|
15
|
+
}, instrumentation: ArchiverInstrumentation);
|
|
16
|
+
/** Override start to skip L1 validation checks. */
|
|
17
|
+
start(_blockUntilSynced?: boolean): Promise<void>;
|
|
18
|
+
}
|
|
19
|
+
/** Creates an archiver with mocked L1 connectivity for testing. */
|
|
20
|
+
export declare function createNoopL1Archiver(dataStore: KVArchiverDataStore, l1Constants: L1RollupConstants & {
|
|
21
|
+
genesisArchiveRoot: Fr;
|
|
22
|
+
}, telemetry?: TelemetryClient): Promise<NoopL1Archiver>;
|
|
23
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9vcF9sMV9hcmNoaXZlci5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Rlc3Qvbm9vcF9sMV9hcmNoaXZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFJQSxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFJcEQsT0FBTyxLQUFLLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNyRSxPQUFPLEVBQUUsS0FBSyxlQUFlLEVBQW1DLE1BQU0seUJBQXlCLENBQUM7QUFLaEcsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzFDLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBRXhFLE9BQU8sS0FBSyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUF5QnpFOzs7O0dBSUc7QUFDSCxxQkFBYSxjQUFlLFNBQVEsUUFBUTtJQUMxQyxZQUNFLFNBQVMsRUFBRSxtQkFBbUIsRUFDOUIsV0FBVyxFQUFFLGlCQUFpQixHQUFHO1FBQUUsa0JBQWtCLEVBQUUsRUFBRSxDQUFBO0tBQUUsRUFDM0QsZUFBZSxFQUFFLHVCQUF1QixFQXVDekM7SUFFRCxtREFBbUQ7SUFDbkMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsT0FBTyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FJaEU7Q0FDRjtBQUVELG1FQUFtRTtBQUNuRSx3QkFBc0Isb0JBQW9CLENBQ3hDLFNBQVMsRUFBRSxtQkFBbUIsRUFDOUIsV0FBVyxFQUFFLGlCQUFpQixHQUFHO0lBQUUsa0JBQWtCLEVBQUUsRUFBRSxDQUFBO0NBQUUsRUFDM0QsU0FBUyxHQUFFLGVBQXNDLEdBQ2hELE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FHekIifQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"noop_l1_archiver.d.ts","sourceRoot":"","sources":["../../src/test/noop_l1_archiver.ts"],"names":[],"mappings":"AAIA,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,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AAyBzE;;;;GAIG;AACH,qBAAa,cAAe,SAAQ,QAAQ;IAC1C,YACE,SAAS,EAAE,mBAAmB,EAC9B,WAAW,EAAE,iBAAiB,GAAG;QAAE,kBAAkB,EAAE,EAAE,CAAA;KAAE,EAC3D,eAAe,EAAE,uBAAuB,EAuCzC;IAED,mDAAmD;IACnC,KAAK,CAAC,iBAAiB,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAIhE;CACF;AAED,mEAAmE;AACnE,wBAAsB,oBAAoB,CACxC,SAAS,EAAE,mBAAmB,EAC9B,WAAW,EAAE,iBAAiB,GAAG;IAAE,kBAAkB,EAAE,EAAE,CAAA;CAAE,EAC3D,SAAS,GAAE,eAAsC,GAChD,OAAO,CAAC,cAAc,CAAC,CAGzB"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { Buffer32 } from '@aztec/foundation/buffer';
|
|
2
|
+
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
3
|
+
import { getTelemetryClient } from '@aztec/telemetry-client';
|
|
4
|
+
import { mock } from 'jest-mock-extended';
|
|
5
|
+
import { EventEmitter } from 'node:events';
|
|
6
|
+
import { Archiver } from '../archiver.js';
|
|
7
|
+
import { ArchiverInstrumentation } from '../modules/instrumentation.js';
|
|
8
|
+
/** Noop L1 synchronizer for testing without L1 connectivity. */ class NoopL1Synchronizer {
|
|
9
|
+
tracer;
|
|
10
|
+
constructor(tracer){
|
|
11
|
+
this.tracer = tracer;
|
|
12
|
+
}
|
|
13
|
+
setConfig(_config) {}
|
|
14
|
+
getL1BlockNumber() {
|
|
15
|
+
return 0n;
|
|
16
|
+
}
|
|
17
|
+
getL1Timestamp() {
|
|
18
|
+
return 0n;
|
|
19
|
+
}
|
|
20
|
+
testEthereumNodeSynced() {
|
|
21
|
+
return Promise.resolve();
|
|
22
|
+
}
|
|
23
|
+
syncFromL1(_initialSyncComplete) {
|
|
24
|
+
return Promise.resolve();
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Archiver with mocked L1 connectivity for testing.
|
|
29
|
+
* Uses mock L1 clients and a noop synchronizer, enabling tests that
|
|
30
|
+
* don't require real Ethereum connectivity.
|
|
31
|
+
*/ export class NoopL1Archiver extends Archiver {
|
|
32
|
+
constructor(dataStore, l1Constants, instrumentation){
|
|
33
|
+
// Create mocks for L1 clients
|
|
34
|
+
const publicClient = mock();
|
|
35
|
+
const debugClient = mock();
|
|
36
|
+
const rollup = mock();
|
|
37
|
+
const blobClient = mock();
|
|
38
|
+
// Mock methods called during start()
|
|
39
|
+
blobClient.testSources.mockResolvedValue();
|
|
40
|
+
publicClient.getBlockNumber.mockResolvedValue(1n);
|
|
41
|
+
const events = new EventEmitter();
|
|
42
|
+
const synchronizer = new NoopL1Synchronizer(instrumentation.tracer);
|
|
43
|
+
super(publicClient, debugClient, rollup, {
|
|
44
|
+
registryAddress: EthAddress.ZERO,
|
|
45
|
+
governanceProposerAddress: EthAddress.ZERO,
|
|
46
|
+
slashFactoryAddress: EthAddress.ZERO,
|
|
47
|
+
slashingProposerAddress: EthAddress.ZERO
|
|
48
|
+
}, dataStore, {
|
|
49
|
+
pollingIntervalMs: 1000,
|
|
50
|
+
batchSize: 100,
|
|
51
|
+
skipValidateCheckpointAttestations: true,
|
|
52
|
+
maxAllowedEthClientDriftSeconds: 300,
|
|
53
|
+
ethereumAllowNoDebugHosts: true
|
|
54
|
+
}, blobClient, instrumentation, {
|
|
55
|
+
...l1Constants,
|
|
56
|
+
l1StartBlockHash: Buffer32.random()
|
|
57
|
+
}, synchronizer, events);
|
|
58
|
+
}
|
|
59
|
+
/** Override start to skip L1 validation checks. */ start(_blockUntilSynced) {
|
|
60
|
+
// Just start the running promise without L1 checks
|
|
61
|
+
this.runningPromise.start();
|
|
62
|
+
return Promise.resolve();
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/** Creates an archiver with mocked L1 connectivity for testing. */ export async function createNoopL1Archiver(dataStore, l1Constants, telemetry = getTelemetryClient()) {
|
|
66
|
+
const instrumentation = await ArchiverInstrumentation.new(telemetry, ()=>dataStore.estimateSize());
|
|
67
|
+
return new NoopL1Archiver(dataStore, l1Constants, instrumentation);
|
|
68
|
+
}
|
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.59e663cd",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": "./dest/index.js",
|
|
@@ -64,18 +64,18 @@
|
|
|
64
64
|
]
|
|
65
65
|
},
|
|
66
66
|
"dependencies": {
|
|
67
|
-
"@aztec/blob-client": "0.0.1-commit.
|
|
68
|
-
"@aztec/blob-lib": "0.0.1-commit.
|
|
69
|
-
"@aztec/constants": "0.0.1-commit.
|
|
70
|
-
"@aztec/epoch-cache": "0.0.1-commit.
|
|
71
|
-
"@aztec/ethereum": "0.0.1-commit.
|
|
72
|
-
"@aztec/foundation": "0.0.1-commit.
|
|
73
|
-
"@aztec/kv-store": "0.0.1-commit.
|
|
74
|
-
"@aztec/l1-artifacts": "0.0.1-commit.
|
|
75
|
-
"@aztec/noir-protocol-circuits-types": "0.0.1-commit.
|
|
76
|
-
"@aztec/protocol-contracts": "0.0.1-commit.
|
|
77
|
-
"@aztec/stdlib": "0.0.1-commit.
|
|
78
|
-
"@aztec/telemetry-client": "0.0.1-commit.
|
|
67
|
+
"@aztec/blob-client": "0.0.1-commit.59e663cd",
|
|
68
|
+
"@aztec/blob-lib": "0.0.1-commit.59e663cd",
|
|
69
|
+
"@aztec/constants": "0.0.1-commit.59e663cd",
|
|
70
|
+
"@aztec/epoch-cache": "0.0.1-commit.59e663cd",
|
|
71
|
+
"@aztec/ethereum": "0.0.1-commit.59e663cd",
|
|
72
|
+
"@aztec/foundation": "0.0.1-commit.59e663cd",
|
|
73
|
+
"@aztec/kv-store": "0.0.1-commit.59e663cd",
|
|
74
|
+
"@aztec/l1-artifacts": "0.0.1-commit.59e663cd",
|
|
75
|
+
"@aztec/noir-protocol-circuits-types": "0.0.1-commit.59e663cd",
|
|
76
|
+
"@aztec/protocol-contracts": "0.0.1-commit.59e663cd",
|
|
77
|
+
"@aztec/stdlib": "0.0.1-commit.59e663cd",
|
|
78
|
+
"@aztec/telemetry-client": "0.0.1-commit.59e663cd",
|
|
79
79
|
"lodash.groupby": "^4.6.0",
|
|
80
80
|
"lodash.omit": "^4.5.0",
|
|
81
81
|
"tslib": "^2.5.0",
|
package/src/archiver.ts
CHANGED
|
@@ -17,7 +17,7 @@ import {
|
|
|
17
17
|
type ArchiverEmitter,
|
|
18
18
|
type CheckpointId,
|
|
19
19
|
GENESIS_CHECKPOINT_HEADER_HASH,
|
|
20
|
-
|
|
20
|
+
L2Block,
|
|
21
21
|
type L2BlockSink,
|
|
22
22
|
type L2Tips,
|
|
23
23
|
type ValidateCheckpointResult,
|
|
@@ -46,7 +46,7 @@ export type { ArchiverEmitter };
|
|
|
46
46
|
|
|
47
47
|
/** Request to add a block to the archiver, queued for processing by the sync loop. */
|
|
48
48
|
type AddBlockRequest = {
|
|
49
|
-
block:
|
|
49
|
+
block: L2Block;
|
|
50
50
|
resolve: () => void;
|
|
51
51
|
reject: (err: Error) => void;
|
|
52
52
|
};
|
|
@@ -68,7 +68,7 @@ export class Archiver extends ArchiverDataSourceBase implements L2BlockSink, Tra
|
|
|
68
68
|
public readonly events: ArchiverEmitter;
|
|
69
69
|
|
|
70
70
|
/** A loop in which we will be continually fetching new checkpoints. */
|
|
71
|
-
|
|
71
|
+
protected runningPromise: RunningPromise;
|
|
72
72
|
|
|
73
73
|
/** L1 synchronizer that handles fetching checkpoints and messages from L1. */
|
|
74
74
|
private readonly synchronizer: ArchiverL1Synchronizer;
|
|
@@ -187,7 +187,7 @@ export class Archiver extends ArchiverDataSourceBase implements L2BlockSink, Tra
|
|
|
187
187
|
* @param block - The L2 block to add.
|
|
188
188
|
* @returns A promise that resolves when the block has been added to the store, or rejects on error.
|
|
189
189
|
*/
|
|
190
|
-
public addBlock(block:
|
|
190
|
+
public addBlock(block: L2Block): Promise<void> {
|
|
191
191
|
return new Promise<void>((resolve, reject) => {
|
|
192
192
|
this.blockQueue.push({ block, resolve, reject });
|
|
193
193
|
this.log.debug(`Queued block ${block.number} for processing`);
|
|
@@ -215,7 +215,7 @@ export class Archiver extends ArchiverDataSourceBase implements L2BlockSink, Tra
|
|
|
215
215
|
// Process each block individually to properly resolve/reject each promise
|
|
216
216
|
for (const { block, resolve, reject } of queuedItems) {
|
|
217
217
|
try {
|
|
218
|
-
await this.updater.
|
|
218
|
+
await this.updater.addProposedBlocks([block]);
|
|
219
219
|
this.log.debug(`Added block ${block.number} to store`);
|
|
220
220
|
resolve();
|
|
221
221
|
} catch (err: any) {
|
|
@@ -323,8 +323,11 @@ export class Archiver extends ArchiverDataSourceBase implements L2BlockSink, Tra
|
|
|
323
323
|
}
|
|
324
324
|
|
|
325
325
|
public async isEpochComplete(epochNumber: EpochNumber): Promise<boolean> {
|
|
326
|
-
// The epoch is complete if the current L2 block is the last one in the epoch (or later)
|
|
327
|
-
|
|
326
|
+
// The epoch is complete if the current checkpointed L2 block is the last one in the epoch (or later).
|
|
327
|
+
// We use the checkpointed block number (synced from L1) instead of 'latest' to avoid returning true
|
|
328
|
+
// prematurely when proposed blocks have been pushed to the archiver but not yet checkpointed on L1.
|
|
329
|
+
const checkpointedBlockNumber = await this.getCheckpointedL2BlockNumber();
|
|
330
|
+
const header = checkpointedBlockNumber > 0 ? await this.getBlockHeader(checkpointedBlockNumber) : undefined;
|
|
328
331
|
const slot = header ? header.globalVariables.slotNumber : undefined;
|
|
329
332
|
const [_startSlot, endSlot] = getSlotRangeForEpoch(epochNumber, this.l1Constants);
|
|
330
333
|
if (slot && slot >= endSlot) {
|
|
@@ -355,8 +358,8 @@ export class Archiver extends ArchiverDataSourceBase implements L2BlockSink, Tra
|
|
|
355
358
|
return this.initialSyncComplete;
|
|
356
359
|
}
|
|
357
360
|
|
|
358
|
-
public
|
|
359
|
-
return this.updater.
|
|
361
|
+
public removeCheckpointsAfter(checkpointNumber: CheckpointNumber): Promise<boolean> {
|
|
362
|
+
return this.updater.removeCheckpointsAfter(checkpointNumber);
|
|
360
363
|
}
|
|
361
364
|
|
|
362
365
|
/** Used by TXE to add checkpoints directly without syncing from L1. */
|
|
@@ -364,22 +367,18 @@ export class Archiver extends ArchiverDataSourceBase implements L2BlockSink, Tra
|
|
|
364
367
|
checkpoints: PublishedCheckpoint[],
|
|
365
368
|
pendingChainValidationStatus?: ValidateCheckpointResult,
|
|
366
369
|
): Promise<boolean> {
|
|
367
|
-
await this.updater.
|
|
370
|
+
await this.updater.addCheckpoints(checkpoints, pendingChainValidationStatus);
|
|
368
371
|
return true;
|
|
369
372
|
}
|
|
370
373
|
|
|
371
374
|
public async getL2Tips(): Promise<L2Tips> {
|
|
372
|
-
const [latestBlockNumber, provenBlockNumber, checkpointedBlockNumber] = await Promise.all([
|
|
375
|
+
const [latestBlockNumber, provenBlockNumber, checkpointedBlockNumber, finalizedBlockNumber] = await Promise.all([
|
|
373
376
|
this.getBlockNumber(),
|
|
374
377
|
this.getProvenBlockNumber(),
|
|
375
|
-
this.
|
|
378
|
+
this.getCheckpointedL2BlockNumber(),
|
|
379
|
+
this.getFinalizedL2BlockNumber(),
|
|
376
380
|
] as const);
|
|
377
381
|
|
|
378
|
-
// TODO(#13569): Compute proper finalized block number based on L1 finalized block.
|
|
379
|
-
// We just force it 2 epochs worth of proven data for now.
|
|
380
|
-
// NOTE: update end-to-end/src/e2e_epochs/epochs_empty_blocks.test.ts as that uses finalized blocks in computations
|
|
381
|
-
const finalizedBlockNumber = BlockNumber(Math.max(provenBlockNumber - this.l1Constants.epochDuration * 2, 0));
|
|
382
|
-
|
|
383
382
|
const beforeInitialblockNumber = BlockNumber(INITIAL_L2_BLOCK_NUM - 1);
|
|
384
383
|
|
|
385
384
|
// Get the latest block header and checkpointed blocks for proven, finalised and checkpointed blocks
|
|
@@ -425,14 +424,12 @@ export class Archiver extends ArchiverDataSourceBase implements L2BlockSink, Tra
|
|
|
425
424
|
// Now attempt to retrieve checkpoints for proven, finalised and checkpointed blocks
|
|
426
425
|
const [[provenBlockCheckpoint], [finalizedBlockCheckpoint], [checkpointedBlockCheckpoint]] = await Promise.all([
|
|
427
426
|
provenCheckpointedBlock !== undefined
|
|
428
|
-
? await this.
|
|
427
|
+
? await this.getCheckpoints(provenCheckpointedBlock?.checkpointNumber, 1)
|
|
429
428
|
: [undefined],
|
|
430
429
|
finalizedCheckpointedBlock !== undefined
|
|
431
|
-
? await this.
|
|
432
|
-
: [undefined],
|
|
433
|
-
checkpointedBlock !== undefined
|
|
434
|
-
? await this.getPublishedCheckpoints(checkpointedBlock?.checkpointNumber, 1)
|
|
430
|
+
? await this.getCheckpoints(finalizedCheckpointedBlock?.checkpointNumber, 1)
|
|
435
431
|
: [undefined],
|
|
432
|
+
checkpointedBlock !== undefined ? await this.getCheckpoints(checkpointedBlock?.checkpointNumber, 1) : [undefined],
|
|
436
433
|
]);
|
|
437
434
|
|
|
438
435
|
const initialcheckpointId: CheckpointId = {
|
|
@@ -490,13 +487,12 @@ export class Archiver extends ArchiverDataSourceBase implements L2BlockSink, Tra
|
|
|
490
487
|
if (targetL2BlockNumber >= currentL2Block) {
|
|
491
488
|
throw new Error(`Target L2 block ${targetL2BlockNumber} must be less than current L2 block ${currentL2Block}`);
|
|
492
489
|
}
|
|
493
|
-
const blocksToUnwind = currentL2Block - targetL2BlockNumber;
|
|
494
490
|
const targetL2Block = await this.store.getCheckpointedBlock(targetL2BlockNumber);
|
|
495
491
|
if (!targetL2Block) {
|
|
496
492
|
throw new Error(`Target L2 block ${targetL2BlockNumber} not found`);
|
|
497
493
|
}
|
|
498
494
|
const targetL1BlockNumber = targetL2Block.l1.blockNumber;
|
|
499
|
-
const targetCheckpointNumber =
|
|
495
|
+
const targetCheckpointNumber = targetL2Block.checkpointNumber;
|
|
500
496
|
const targetL1Block = await this.publicClient.getBlock({
|
|
501
497
|
blockNumber: targetL1BlockNumber,
|
|
502
498
|
includeTransactions: false,
|
|
@@ -505,9 +501,11 @@ export class Archiver extends ArchiverDataSourceBase implements L2BlockSink, Tra
|
|
|
505
501
|
throw new Error(`Missing L1 block ${targetL1BlockNumber}`);
|
|
506
502
|
}
|
|
507
503
|
const targetL1BlockHash = Buffer32.fromString(targetL1Block.hash);
|
|
508
|
-
this.log.info(
|
|
509
|
-
|
|
510
|
-
|
|
504
|
+
this.log.info(
|
|
505
|
+
`Removing checkpoints after checkpoint ${targetCheckpointNumber} (target block ${targetL2BlockNumber})`,
|
|
506
|
+
);
|
|
507
|
+
await this.updater.removeCheckpointsAfter(targetCheckpointNumber);
|
|
508
|
+
this.log.info(`Rolling back L1 to L2 messages to checkpoint ${targetCheckpointNumber}`);
|
|
511
509
|
await this.store.rollbackL1ToL2MessagesToCheckpoint(targetCheckpointNumber);
|
|
512
510
|
this.log.info(`Setting L1 syncpoints to ${targetL1BlockNumber}`);
|
|
513
511
|
await this.store.setCheckpointSynchedL1BlockNumber(targetL1BlockNumber);
|
package/src/errors.ts
CHANGED
|
@@ -88,3 +88,15 @@ export class BlockNotFoundError extends Error {
|
|
|
88
88
|
super(`Failed to find expected block number ${blockNumber}`);
|
|
89
89
|
}
|
|
90
90
|
}
|
|
91
|
+
|
|
92
|
+
export class CannotOverwriteCheckpointedBlockError extends Error {
|
|
93
|
+
constructor(
|
|
94
|
+
public readonly blockNumber: number,
|
|
95
|
+
public readonly lastCheckpointedBlock: number,
|
|
96
|
+
) {
|
|
97
|
+
super(
|
|
98
|
+
`Cannot add block ${blockNumber}: would overwrite checkpointed data (checkpointed up to block ${lastCheckpointedBlock})`,
|
|
99
|
+
);
|
|
100
|
+
this.name = 'CannotOverwriteCheckpointedBlockError';
|
|
101
|
+
}
|
|
102
|
+
}
|