@aztec/archiver 0.0.1-commit.3469e52 → 0.0.1-commit.381b1a9
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 +12 -8
- package/dest/archiver.d.ts.map +1 -1
- package/dest/archiver.js +81 -120
- 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 +3 -1
- package/dest/factory.d.ts.map +1 -1
- package/dest/factory.js +14 -11
- package/dest/index.d.ts +2 -1
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +1 -0
- package/dest/l1/bin/retrieve-calldata.js +35 -32
- package/dest/l1/calldata_retriever.d.ts +73 -50
- package/dest/l1/calldata_retriever.d.ts.map +1 -1
- package/dest/l1/calldata_retriever.js +190 -259
- package/dest/l1/data_retrieval.d.ts +4 -7
- package/dest/l1/data_retrieval.d.ts.map +1 -1
- package/dest/l1/data_retrieval.js +12 -16
- 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_trace.d.ts +6 -3
- package/dest/l1/validate_trace.d.ts.map +1 -1
- package/dest/l1/validate_trace.js +13 -9
- package/dest/modules/data_source_base.d.ts +25 -21
- package/dest/modules/data_source_base.d.ts.map +1 -1
- package/dest/modules/data_source_base.js +45 -120
- package/dest/modules/data_store_updater.d.ts +40 -21
- package/dest/modules/data_store_updater.d.ts.map +1 -1
- package/dest/modules/data_store_updater.js +114 -64
- package/dest/modules/instrumentation.d.ts +6 -4
- package/dest/modules/instrumentation.d.ts.map +1 -1
- package/dest/modules/instrumentation.js +26 -12
- package/dest/modules/l1_synchronizer.d.ts +5 -8
- package/dest/modules/l1_synchronizer.d.ts.map +1 -1
- package/dest/modules/l1_synchronizer.js +46 -20
- package/dest/store/block_store.d.ts +49 -32
- package/dest/store/block_store.d.ts.map +1 -1
- package/dest/store/block_store.js +165 -54
- package/dest/store/contract_class_store.d.ts +1 -1
- package/dest/store/contract_class_store.d.ts.map +1 -1
- package/dest/store/contract_class_store.js +11 -7
- package/dest/store/kv_archiver_store.d.ts +53 -25
- package/dest/store/kv_archiver_store.d.ts.map +1 -1
- package/dest/store/kv_archiver_store.js +50 -17
- package/dest/store/l2_tips_cache.d.ts +19 -0
- package/dest/store/l2_tips_cache.d.ts.map +1 -0
- package/dest/store/l2_tips_cache.js +89 -0
- 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 +105 -47
- package/dest/store/message_store.js +1 -1
- package/dest/test/fake_l1_state.d.ts +16 -4
- package/dest/test/fake_l1_state.d.ts.map +1 -1
- package/dest/test/fake_l1_state.js +84 -20
- package/dest/test/index.js +3 -1
- 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_l2_block_source.d.ts +39 -23
- package/dest/test/mock_l2_block_source.d.ts.map +1 -1
- package/dest/test/mock_l2_block_source.js +157 -112
- package/dest/test/mock_structs.d.ts +6 -2
- package/dest/test/mock_structs.d.ts.map +1 -1
- package/dest/test/mock_structs.js +24 -10
- package/dest/test/noop_l1_archiver.d.ts +26 -0
- package/dest/test/noop_l1_archiver.d.ts.map +1 -0
- package/dest/test/noop_l1_archiver.js +72 -0
- package/package.json +14 -13
- package/src/archiver.ts +106 -149
- package/src/errors.ts +12 -0
- package/src/factory.ts +29 -12
- package/src/index.ts +1 -0
- package/src/l1/README.md +25 -68
- package/src/l1/bin/retrieve-calldata.ts +45 -33
- package/src/l1/calldata_retriever.ts +249 -379
- package/src/l1/data_retrieval.ts +10 -20
- package/src/l1/spire_proposer.ts +7 -15
- package/src/l1/validate_trace.ts +24 -6
- package/src/modules/data_source_base.ts +76 -166
- package/src/modules/data_store_updater.ts +130 -66
- package/src/modules/instrumentation.ts +26 -14
- package/src/modules/l1_synchronizer.ts +55 -26
- package/src/store/block_store.ts +216 -92
- package/src/store/contract_class_store.ts +11 -7
- package/src/store/kv_archiver_store.ts +88 -30
- package/src/store/l2_tips_cache.ts +89 -0
- package/src/store/log_store.ts +171 -55
- package/src/store/message_store.ts +1 -1
- package/src/test/fake_l1_state.ts +112 -23
- package/src/test/index.ts +3 -0
- package/src/test/mock_archiver.ts +3 -2
- package/src/test/mock_l2_block_source.ts +211 -129
- package/src/test/mock_structs.ts +45 -15
- package/src/test/noop_l1_archiver.ts +115 -0
|
@@ -380,7 +380,7 @@ import { count } from '@aztec/foundation/string';
|
|
|
380
380
|
import { Timer, elapsed } from '@aztec/foundation/timer';
|
|
381
381
|
import { isDefined } from '@aztec/foundation/types';
|
|
382
382
|
import { L2BlockSourceEvents } from '@aztec/stdlib/block';
|
|
383
|
-
import { getEpochAtSlot,
|
|
383
|
+
import { getEpochAtSlot, getSlotAtNextL1Block } from '@aztec/stdlib/epoch-helpers';
|
|
384
384
|
import { computeInHashFromL1ToL2Messages } from '@aztec/stdlib/messaging';
|
|
385
385
|
import { execInSpan, trackSpan } from '@aztec/telemetry-client';
|
|
386
386
|
import { InitialCheckpointNumberNotSequentialError } from '../errors.js';
|
|
@@ -396,7 +396,6 @@ _dec = trackSpan('Archiver.syncFromL1'), _dec1 = trackSpan('Archiver.handleEpoch
|
|
|
396
396
|
debugClient;
|
|
397
397
|
rollup;
|
|
398
398
|
inbox;
|
|
399
|
-
l1Addresses;
|
|
400
399
|
store;
|
|
401
400
|
config;
|
|
402
401
|
blobClient;
|
|
@@ -435,12 +434,11 @@ _dec = trackSpan('Archiver.syncFromL1'), _dec1 = trackSpan('Archiver.handleEpoch
|
|
|
435
434
|
l1Timestamp;
|
|
436
435
|
updater;
|
|
437
436
|
tracer;
|
|
438
|
-
constructor(publicClient, debugClient, rollup, inbox,
|
|
437
|
+
constructor(publicClient, debugClient, rollup, inbox, store, config, blobClient, epochCache, dateProvider, instrumentation, l1Constants, events, tracer, l2TipsCache, log = createLogger('archiver:l1-sync')){
|
|
439
438
|
this.publicClient = publicClient;
|
|
440
439
|
this.debugClient = debugClient;
|
|
441
440
|
this.rollup = rollup;
|
|
442
441
|
this.inbox = inbox;
|
|
443
|
-
this.l1Addresses = l1Addresses;
|
|
444
442
|
this.store = store;
|
|
445
443
|
this.config = config;
|
|
446
444
|
this.blobClient = blobClient;
|
|
@@ -451,7 +449,9 @@ _dec = trackSpan('Archiver.syncFromL1'), _dec1 = trackSpan('Archiver.handleEpoch
|
|
|
451
449
|
this.events = events;
|
|
452
450
|
this.log = log;
|
|
453
451
|
_initProto(this);
|
|
454
|
-
this.updater = new ArchiverDataStoreUpdater(this.store
|
|
452
|
+
this.updater = new ArchiverDataStoreUpdater(this.store, l2TipsCache, {
|
|
453
|
+
rollupManaLimit: l1Constants.rollupManaLimit
|
|
454
|
+
});
|
|
455
455
|
this.tracer = tracer;
|
|
456
456
|
}
|
|
457
457
|
/** Sets new config */ setConfig(newConfig) {
|
|
@@ -555,6 +555,8 @@ _dec = trackSpan('Archiver.syncFromL1'), _dec1 = trackSpan('Archiver.handleEpoch
|
|
|
555
555
|
}
|
|
556
556
|
this.instrumentation.updateL1BlockHeight(currentL1BlockNumber);
|
|
557
557
|
}
|
|
558
|
+
// Update the finalized L2 checkpoint based on L1 finality.
|
|
559
|
+
await this.updateFinalizedCheckpoint();
|
|
558
560
|
// After syncing has completed, update the current l1 block number and timestamp,
|
|
559
561
|
// otherwise we risk announcing to the world that we've synced to a given point,
|
|
560
562
|
// but the corresponding blocks have not been processed (see #12631).
|
|
@@ -568,6 +570,31 @@ _dec = trackSpan('Archiver.syncFromL1'), _dec1 = trackSpan('Archiver.handleEpoch
|
|
|
568
570
|
l1BlockNumberAtEnd
|
|
569
571
|
});
|
|
570
572
|
}
|
|
573
|
+
/** Query L1 for its finalized block and update the finalized checkpoint accordingly. */ async updateFinalizedCheckpoint() {
|
|
574
|
+
try {
|
|
575
|
+
const finalizedL1Block = await this.publicClient.getBlock({
|
|
576
|
+
blockTag: 'finalized',
|
|
577
|
+
includeTransactions: false
|
|
578
|
+
});
|
|
579
|
+
const finalizedL1BlockNumber = finalizedL1Block.number;
|
|
580
|
+
const finalizedCheckpointNumber = await this.rollup.getProvenCheckpointNumber({
|
|
581
|
+
blockNumber: finalizedL1BlockNumber
|
|
582
|
+
});
|
|
583
|
+
const localFinalizedCheckpointNumber = await this.store.getFinalizedCheckpointNumber();
|
|
584
|
+
if (localFinalizedCheckpointNumber !== finalizedCheckpointNumber) {
|
|
585
|
+
await this.updater.setFinalizedCheckpointNumber(finalizedCheckpointNumber);
|
|
586
|
+
const finalizedL2BlockNumber = await this.store.getFinalizedL2BlockNumber();
|
|
587
|
+
this.log.info(`Updated finalized chain to checkpoint ${finalizedCheckpointNumber} (L2 block ${finalizedL2BlockNumber})`, {
|
|
588
|
+
finalizedCheckpointNumber,
|
|
589
|
+
previousFinalizedCheckpointNumber: localFinalizedCheckpointNumber,
|
|
590
|
+
finalizedL2BlockNumber,
|
|
591
|
+
finalizedL1BlockNumber
|
|
592
|
+
});
|
|
593
|
+
}
|
|
594
|
+
} catch (err) {
|
|
595
|
+
this.log.warn(`Failed to update finalized checkpoint: ${err}`);
|
|
596
|
+
}
|
|
597
|
+
}
|
|
571
598
|
/** Prune all proposed local blocks that should have been checkpointed by now. */ async pruneUncheckpointedBlocks(currentL1Timestamp) {
|
|
572
599
|
const [lastCheckpointedBlockNumber, lastProposedBlockNumber] = await Promise.all([
|
|
573
600
|
this.store.getCheckpointedL2BlockNumber(),
|
|
@@ -583,15 +610,14 @@ _dec = trackSpan('Archiver.syncFromL1'), _dec1 = trackSpan('Archiver.handleEpoch
|
|
|
583
610
|
const [firstUncheckpointedBlockHeader] = await this.store.getBlockHeaders(firstUncheckpointedBlockNumber, 1);
|
|
584
611
|
const firstUncheckpointedBlockSlot = firstUncheckpointedBlockHeader?.getSlot();
|
|
585
612
|
// What's the slot at the next L1 block? All blocks for slots strictly before this one should've been checkpointed by now.
|
|
586
|
-
const
|
|
587
|
-
const slotAtNextL1Block = getSlotAtTimestamp(nextL1BlockTimestamp, this.l1Constants);
|
|
613
|
+
const slotAtNextL1Block = getSlotAtNextL1Block(currentL1Timestamp, this.l1Constants);
|
|
588
614
|
// Prune provisional blocks from slots that have ended without being checkpointed
|
|
589
615
|
if (firstUncheckpointedBlockSlot !== undefined && firstUncheckpointedBlockSlot < slotAtNextL1Block) {
|
|
590
616
|
this.log.warn(`Pruning blocks after block ${lastCheckpointedBlockNumber} due to slot ${firstUncheckpointedBlockSlot} not being checkpointed`, {
|
|
591
617
|
firstUncheckpointedBlockHeader: firstUncheckpointedBlockHeader.toInspect(),
|
|
592
618
|
slotAtNextL1Block
|
|
593
619
|
});
|
|
594
|
-
const prunedBlocks = await this.updater.
|
|
620
|
+
const prunedBlocks = await this.updater.removeUncheckpointedBlocksAfter(lastCheckpointedBlockNumber);
|
|
595
621
|
if (prunedBlocks.length > 0) {
|
|
596
622
|
this.events.emit(L2BlockSourceEvents.L2PruneUncheckpointed, {
|
|
597
623
|
type: L2BlockSourceEvents.L2PruneUncheckpointed,
|
|
@@ -642,8 +668,8 @@ _dec = trackSpan('Archiver.syncFromL1'), _dec1 = trackSpan('Archiver.handleEpoch
|
|
|
642
668
|
blocks: newBlocks
|
|
643
669
|
});
|
|
644
670
|
this.log.debug(`L2 prune from ${provenCheckpointNumber + 1} to ${localPendingCheckpointNumber} will occur on next checkpoint submission.`);
|
|
645
|
-
await this.updater.
|
|
646
|
-
this.log.warn(`
|
|
671
|
+
await this.updater.removeCheckpointsAfter(provenCheckpointNumber);
|
|
672
|
+
this.log.warn(`Removed ${count(checkpointsToUnwind, 'checkpoint')} after checkpoint ${provenCheckpointNumber} ` + `due to predicted reorg at L1 block ${currentL1BlockNumber}. ` + `Updated latest checkpoint is ${await this.store.getSynchedCheckpointNumber()}.`);
|
|
647
673
|
this.instrumentation.processPrune(timer.ms());
|
|
648
674
|
// TODO(palla/reorg): Do we need to set the block synched L1 block number here?
|
|
649
675
|
// Seems like the next iteration should handle this.
|
|
@@ -838,7 +864,7 @@ _dec = trackSpan('Archiver.syncFromL1'), _dec1 = trackSpan('Archiver.handleEpoch
|
|
|
838
864
|
if (provenCheckpointNumber === 0) {
|
|
839
865
|
const localProvenCheckpointNumber = await this.store.getProvenCheckpointNumber();
|
|
840
866
|
if (localProvenCheckpointNumber !== provenCheckpointNumber) {
|
|
841
|
-
await this.
|
|
867
|
+
await this.updater.setProvenCheckpointNumber(provenCheckpointNumber);
|
|
842
868
|
this.log.info(`Rolled back proven chain to checkpoint ${provenCheckpointNumber}`, {
|
|
843
869
|
provenCheckpointNumber
|
|
844
870
|
});
|
|
@@ -855,20 +881,20 @@ _dec = trackSpan('Archiver.syncFromL1'), _dec1 = trackSpan('Archiver.handleEpoch
|
|
|
855
881
|
if (localCheckpointForDestinationProvenCheckpointNumber && provenArchive.equals(localCheckpointForDestinationProvenCheckpointNumber.archive.root)) {
|
|
856
882
|
const localProvenCheckpointNumber = await this.store.getProvenCheckpointNumber();
|
|
857
883
|
if (localProvenCheckpointNumber !== provenCheckpointNumber) {
|
|
858
|
-
await this.
|
|
884
|
+
await this.updater.setProvenCheckpointNumber(provenCheckpointNumber);
|
|
859
885
|
this.log.info(`Updated proven chain to checkpoint ${provenCheckpointNumber}`, {
|
|
860
886
|
provenCheckpointNumber
|
|
861
887
|
});
|
|
862
888
|
const provenSlotNumber = localCheckpointForDestinationProvenCheckpointNumber.header.slotNumber;
|
|
863
889
|
const provenEpochNumber = getEpochAtSlot(provenSlotNumber, this.l1Constants);
|
|
864
|
-
const lastBlockNumberInCheckpoint = localCheckpointForDestinationProvenCheckpointNumber.startBlock + localCheckpointForDestinationProvenCheckpointNumber.
|
|
890
|
+
const lastBlockNumberInCheckpoint = localCheckpointForDestinationProvenCheckpointNumber.startBlock + localCheckpointForDestinationProvenCheckpointNumber.blockCount - 1;
|
|
865
891
|
this.events.emit(L2BlockSourceEvents.L2BlockProven, {
|
|
866
892
|
type: L2BlockSourceEvents.L2BlockProven,
|
|
867
893
|
blockNumber: BlockNumber(lastBlockNumberInCheckpoint),
|
|
868
894
|
slotNumber: provenSlotNumber,
|
|
869
895
|
epochNumber: provenEpochNumber
|
|
870
896
|
});
|
|
871
|
-
this.instrumentation.
|
|
897
|
+
this.instrumentation.updateLastProvenCheckpoint(localCheckpointForDestinationProvenCheckpointNumber);
|
|
872
898
|
} else {
|
|
873
899
|
this.log.trace(`Proven checkpoint ${provenCheckpointNumber} already stored.`);
|
|
874
900
|
}
|
|
@@ -931,9 +957,9 @@ _dec = trackSpan('Archiver.syncFromL1'), _dec1 = trackSpan('Archiver.handleEpoch
|
|
|
931
957
|
}
|
|
932
958
|
tipAfterUnwind--;
|
|
933
959
|
}
|
|
934
|
-
const
|
|
935
|
-
await this.updater.
|
|
936
|
-
this.log.warn(`
|
|
960
|
+
const checkpointsToRemove = localPendingCheckpointNumber - tipAfterUnwind;
|
|
961
|
+
await this.updater.removeCheckpointsAfter(CheckpointNumber(tipAfterUnwind));
|
|
962
|
+
this.log.warn(`Removed ${count(checkpointsToRemove, 'checkpoint')} after checkpoint ${tipAfterUnwind} ` + `due to mismatched checkpoint hashes at L1 block ${currentL1BlockNumber}. ` + `Updated L2 latest checkpoint is ${await this.store.getSynchedCheckpointNumber()}.`);
|
|
937
963
|
}
|
|
938
964
|
}
|
|
939
965
|
// Retrieve checkpoints in batches. Each batch is estimated to accommodate up to 'blockBatchSize' L1 blocks,
|
|
@@ -946,7 +972,7 @@ _dec = trackSpan('Archiver.syncFromL1'), _dec1 = trackSpan('Archiver.handleEpoch
|
|
|
946
972
|
[searchStartBlock, searchEndBlock] = this.nextRange(searchEndBlock, currentL1BlockNumber);
|
|
947
973
|
this.log.trace(`Retrieving checkpoints from L1 block ${searchStartBlock} to ${searchEndBlock}`);
|
|
948
974
|
// TODO(md): Retrieve from blob client then from consensus client, then from peers
|
|
949
|
-
const retrievedCheckpoints = await execInSpan(this.tracer, 'Archiver.retrieveCheckpointsFromRollup', ()=>retrieveCheckpointsFromRollup(this.rollup, this.publicClient, this.debugClient, this.blobClient, searchStartBlock, searchEndBlock, this.
|
|
975
|
+
const retrievedCheckpoints = await execInSpan(this.tracer, 'Archiver.retrieveCheckpointsFromRollup', ()=>retrieveCheckpointsFromRollup(this.rollup, this.publicClient, this.debugClient, this.blobClient, searchStartBlock, searchEndBlock, this.instrumentation, this.log, !initialSyncComplete));
|
|
950
976
|
if (retrievedCheckpoints.length === 0) {
|
|
951
977
|
// We are not calling `setBlockSynchedL1BlockNumber` because it may cause sync issues if based off infura.
|
|
952
978
|
// See further details in earlier comments.
|
|
@@ -1011,13 +1037,13 @@ _dec = trackSpan('Archiver.syncFromL1'), _dec1 = trackSpan('Archiver.handleEpoch
|
|
|
1011
1037
|
}
|
|
1012
1038
|
try {
|
|
1013
1039
|
const updatedValidationResult = rollupStatus.validationResult === initialValidationResult ? undefined : rollupStatus.validationResult;
|
|
1014
|
-
const [processDuration, result] = await elapsed(()=>execInSpan(this.tracer, 'Archiver.
|
|
1040
|
+
const [processDuration, result] = await elapsed(()=>execInSpan(this.tracer, 'Archiver.addCheckpoints', ()=>this.updater.addCheckpoints(validCheckpoints, updatedValidationResult)));
|
|
1015
1041
|
this.instrumentation.processNewBlocks(processDuration / validCheckpoints.length, validCheckpoints.flatMap((c)=>c.checkpoint.blocks));
|
|
1016
1042
|
// If blocks were pruned due to conflict with L1 checkpoints, emit event
|
|
1017
1043
|
if (result.prunedBlocks && result.prunedBlocks.length > 0) {
|
|
1018
1044
|
const prunedCheckpointNumber = result.prunedBlocks[0].checkpointNumber;
|
|
1019
1045
|
const prunedSlotNumber = result.prunedBlocks[0].header.globalVariables.slotNumber;
|
|
1020
|
-
this.log.
|
|
1046
|
+
this.log.info(`Pruned ${result.prunedBlocks.length} mismatching blocks for checkpoint ${prunedCheckpointNumber}`, {
|
|
1021
1047
|
prunedBlocks: result.prunedBlocks.map((b)=>b.toBlockInfo()),
|
|
1022
1048
|
prunedSlotNumber,
|
|
1023
1049
|
prunedCheckpointNumber
|
|
@@ -2,20 +2,13 @@ import { BlockNumber, CheckpointNumber, SlotNumber } from '@aztec/foundation/bra
|
|
|
2
2
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
3
3
|
import type { AztecAsyncKVStore } from '@aztec/kv-store';
|
|
4
4
|
import type { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import { AppendOnlyTreeSnapshot } from '@aztec/stdlib/trees';
|
|
5
|
+
import { type BlockData, BlockHash, CheckpointedL2Block, L2Block, type ValidateCheckpointResult } from '@aztec/stdlib/block';
|
|
6
|
+
import { type CheckpointData, PublishedCheckpoint } from '@aztec/stdlib/checkpoint';
|
|
7
|
+
import { type L1RollupConstants } from '@aztec/stdlib/epoch-helpers';
|
|
9
8
|
import { BlockHeader, type IndexedTxEffect, TxHash, TxReceipt } from '@aztec/stdlib/tx';
|
|
10
9
|
export { TxReceipt, type TxEffect, type TxHash } from '@aztec/stdlib/tx';
|
|
11
|
-
export type
|
|
12
|
-
|
|
13
|
-
header: CheckpointHeader;
|
|
14
|
-
archive: AppendOnlyTreeSnapshot;
|
|
15
|
-
startBlock: number;
|
|
16
|
-
numBlocks: number;
|
|
17
|
-
l1: L1PublishedData;
|
|
18
|
-
attestations: Buffer[];
|
|
10
|
+
export type RemoveCheckpointsResult = {
|
|
11
|
+
blocksRemoved: L2Block[] | undefined;
|
|
19
12
|
};
|
|
20
13
|
/**
|
|
21
14
|
* LMDB-based block storage for the archiver.
|
|
@@ -25,11 +18,19 @@ export declare class BlockStore {
|
|
|
25
18
|
private db;
|
|
26
19
|
constructor(db: AztecAsyncKVStore);
|
|
27
20
|
/**
|
|
28
|
-
*
|
|
29
|
-
*
|
|
21
|
+
* Returns the finalized L2 block number. An L2 block is finalized when it was proven
|
|
22
|
+
* in an L1 block that has itself been finalized on Ethereum.
|
|
23
|
+
* @returns The finalized block number.
|
|
24
|
+
*/
|
|
25
|
+
getFinalizedL2BlockNumber(): Promise<BlockNumber>;
|
|
26
|
+
/**
|
|
27
|
+
* Append new proposed blocks to the store's list. All blocks must be for the 'current' checkpoint.
|
|
28
|
+
* These are uncheckpointed blocks that have been proposed by the sequencer but not yet included in a checkpoint on L1.
|
|
29
|
+
* For checkpointed blocks (already published to L1), use addCheckpoints() instead.
|
|
30
|
+
* @param blocks - The proposed L2 blocks to be added to the store.
|
|
30
31
|
* @returns True if the operation is successful.
|
|
31
32
|
*/
|
|
32
|
-
|
|
33
|
+
addProposedBlocks(blocks: L2Block[], opts?: {
|
|
33
34
|
force?: boolean;
|
|
34
35
|
}): Promise<boolean>;
|
|
35
36
|
/**
|
|
@@ -43,30 +44,31 @@ export declare class BlockStore {
|
|
|
43
44
|
private addBlockToDatabase;
|
|
44
45
|
private deleteBlock;
|
|
45
46
|
/**
|
|
46
|
-
*
|
|
47
|
-
*
|
|
48
|
-
*
|
|
49
|
-
* @param checkpointsToUnwind - The number of checkpoints we are to unwind
|
|
50
|
-
* @returns True if the operation is successful
|
|
47
|
+
* Removes all checkpoints with checkpoint number > checkpointNumber.
|
|
48
|
+
* Also removes ALL blocks (both checkpointed and uncheckpointed) after the last block of the given checkpoint.
|
|
49
|
+
* @param checkpointNumber - Remove all checkpoints strictly after this one.
|
|
51
50
|
*/
|
|
52
|
-
|
|
51
|
+
removeCheckpointsAfter(checkpointNumber: CheckpointNumber): Promise<RemoveCheckpointsResult>;
|
|
53
52
|
getCheckpointData(checkpointNumber: CheckpointNumber): Promise<CheckpointData | undefined>;
|
|
54
53
|
getRangeOfCheckpoints(from: CheckpointNumber, limit: number): Promise<CheckpointData[]>;
|
|
54
|
+
/** Returns checkpoint data for all checkpoints whose slot falls within the given range (inclusive). */
|
|
55
|
+
getCheckpointDataForSlotRange(startSlot: SlotNumber, endSlot: SlotNumber): Promise<CheckpointData[]>;
|
|
55
56
|
private checkpointDataFromCheckpointStorage;
|
|
56
|
-
getBlocksForCheckpoint(checkpointNumber: CheckpointNumber): Promise<
|
|
57
|
+
getBlocksForCheckpoint(checkpointNumber: CheckpointNumber): Promise<L2Block[] | undefined>;
|
|
57
58
|
/**
|
|
58
59
|
* Gets all blocks that have the given slot number.
|
|
59
60
|
* Iterates backwards through blocks for efficiency since we usually query for the last slot.
|
|
60
61
|
* @param slotNumber - The slot number to search for.
|
|
61
62
|
* @returns All blocks with the given slot number, in ascending block number order.
|
|
62
63
|
*/
|
|
63
|
-
getBlocksForSlot(slotNumber: SlotNumber): Promise<
|
|
64
|
+
getBlocksForSlot(slotNumber: SlotNumber): Promise<L2Block[]>;
|
|
64
65
|
/**
|
|
65
66
|
* Removes all blocks with block number > blockNumber.
|
|
67
|
+
* Does not remove any associated checkpoints.
|
|
66
68
|
* @param blockNumber - The block number to remove after.
|
|
67
69
|
* @returns The removed blocks (for event emission).
|
|
68
70
|
*/
|
|
69
|
-
|
|
71
|
+
removeBlocksAfter(blockNumber: BlockNumber): Promise<L2Block[]>;
|
|
70
72
|
getProvenBlockNumber(): Promise<BlockNumber>;
|
|
71
73
|
getLatestBlockNumber(): Promise<BlockNumber>;
|
|
72
74
|
getLatestCheckpointNumber(): Promise<CheckpointNumber>;
|
|
@@ -78,7 +80,7 @@ export declare class BlockStore {
|
|
|
78
80
|
* @returns The requested L2 blocks
|
|
79
81
|
*/
|
|
80
82
|
getCheckpointedBlocks(start: BlockNumber, limit: number): AsyncIterableIterator<CheckpointedL2Block>;
|
|
81
|
-
getCheckpointedBlockByHash(blockHash:
|
|
83
|
+
getCheckpointedBlockByHash(blockHash: BlockHash): Promise<CheckpointedL2Block | undefined>;
|
|
82
84
|
getCheckpointedBlockByArchive(archive: Fr): Promise<CheckpointedL2Block | undefined>;
|
|
83
85
|
/**
|
|
84
86
|
* Gets up to `limit` amount of L2 blocks starting from `from`.
|
|
@@ -86,31 +88,43 @@ export declare class BlockStore {
|
|
|
86
88
|
* @param limit - The number of blocks to return.
|
|
87
89
|
* @returns The requested L2 blocks
|
|
88
90
|
*/
|
|
89
|
-
getBlocks(start: BlockNumber, limit: number): AsyncIterableIterator<
|
|
91
|
+
getBlocks(start: BlockNumber, limit: number): AsyncIterableIterator<L2Block>;
|
|
92
|
+
/**
|
|
93
|
+
* Gets block metadata (without tx data) by block number.
|
|
94
|
+
* @param blockNumber - The number of the block to return.
|
|
95
|
+
* @returns The requested block data.
|
|
96
|
+
*/
|
|
97
|
+
getBlockData(blockNumber: BlockNumber): Promise<BlockData | undefined>;
|
|
98
|
+
/**
|
|
99
|
+
* Gets block metadata (without tx data) by archive root.
|
|
100
|
+
* @param archive - The archive root of the block to return.
|
|
101
|
+
* @returns The requested block data.
|
|
102
|
+
*/
|
|
103
|
+
getBlockDataByArchive(archive: Fr): Promise<BlockData | undefined>;
|
|
90
104
|
/**
|
|
91
105
|
* Gets an L2 block.
|
|
92
106
|
* @param blockNumber - The number of the block to return.
|
|
93
107
|
* @returns The requested L2 block.
|
|
94
108
|
*/
|
|
95
|
-
getBlock(blockNumber: BlockNumber): Promise<
|
|
109
|
+
getBlock(blockNumber: BlockNumber): Promise<L2Block | undefined>;
|
|
96
110
|
/**
|
|
97
111
|
* Gets an L2 block by its hash.
|
|
98
112
|
* @param blockHash - The hash of the block to return.
|
|
99
113
|
* @returns The requested L2 block.
|
|
100
114
|
*/
|
|
101
|
-
getBlockByHash(blockHash:
|
|
115
|
+
getBlockByHash(blockHash: BlockHash): Promise<L2Block | undefined>;
|
|
102
116
|
/**
|
|
103
117
|
* Gets an L2 block by its archive root.
|
|
104
118
|
* @param archive - The archive root of the block to return.
|
|
105
119
|
* @returns The requested L2 block.
|
|
106
120
|
*/
|
|
107
|
-
getBlockByArchive(archive: Fr): Promise<
|
|
121
|
+
getBlockByArchive(archive: Fr): Promise<L2Block | undefined>;
|
|
108
122
|
/**
|
|
109
123
|
* Gets a block header by its hash.
|
|
110
124
|
* @param blockHash - The hash of the block to return.
|
|
111
125
|
* @returns The requested block header.
|
|
112
126
|
*/
|
|
113
|
-
getBlockHeaderByHash(blockHash:
|
|
127
|
+
getBlockHeaderByHash(blockHash: BlockHash): Promise<BlockHeader | undefined>;
|
|
114
128
|
/**
|
|
115
129
|
* Gets a block header by its archive root.
|
|
116
130
|
* @param archive - The archive root of the block to return.
|
|
@@ -125,6 +139,7 @@ export declare class BlockStore {
|
|
|
125
139
|
*/
|
|
126
140
|
getBlockHeaders(start: BlockNumber, limit: number): AsyncIterableIterator<BlockHeader>;
|
|
127
141
|
private getBlockStorages;
|
|
142
|
+
private getBlockDataFromBlockStorage;
|
|
128
143
|
private getBlockFromBlockStorage;
|
|
129
144
|
/**
|
|
130
145
|
* Gets a tx effect.
|
|
@@ -137,7 +152,7 @@ export declare class BlockStore {
|
|
|
137
152
|
* @param txHash - The hash of a tx we try to get the receipt for.
|
|
138
153
|
* @returns The requested tx receipt (or undefined if not found).
|
|
139
154
|
*/
|
|
140
|
-
getSettledTxReceipt(txHash: TxHash): Promise<TxReceipt | undefined>;
|
|
155
|
+
getSettledTxReceipt(txHash: TxHash, l1Constants?: Pick<L1RollupConstants, 'epochDuration'>): Promise<TxReceipt | undefined>;
|
|
141
156
|
/**
|
|
142
157
|
* Looks up which block included the requested tx effect.
|
|
143
158
|
* @param txHash - The txHash of the tx.
|
|
@@ -164,6 +179,8 @@ export declare class BlockStore {
|
|
|
164
179
|
setSynchedL1BlockNumber(l1BlockNumber: bigint): Promise<boolean>;
|
|
165
180
|
getProvenCheckpointNumber(): Promise<CheckpointNumber>;
|
|
166
181
|
setProvenCheckpointNumber(checkpointNumber: CheckpointNumber): Promise<boolean>;
|
|
182
|
+
getFinalizedCheckpointNumber(): Promise<CheckpointNumber>;
|
|
183
|
+
setFinalizedCheckpointNumber(checkpointNumber: CheckpointNumber): Promise<boolean>;
|
|
167
184
|
/**
|
|
168
185
|
* Gets the pending chain validation status.
|
|
169
186
|
* @returns The validation status or undefined if not set.
|
|
@@ -175,4 +192,4 @@ export declare class BlockStore {
|
|
|
175
192
|
*/
|
|
176
193
|
setPendingChainValidationStatus(status: ValidateCheckpointResult | undefined): Promise<void>;
|
|
177
194
|
}
|
|
178
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
195
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmxvY2tfc3RvcmUuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdG9yZS9ibG9ja19zdG9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsV0FBVyxFQUFFLGdCQUFnQixFQUF5QixVQUFVLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNuSCxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFNcEQsT0FBTyxLQUFLLEVBQUUsaUJBQWlCLEVBQTZDLE1BQU0saUJBQWlCLENBQUM7QUFDcEcsT0FBTyxLQUFLLEVBQUUsWUFBWSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDaEUsT0FBTyxFQUNMLEtBQUssU0FBUyxFQUNkLFNBQVMsRUFFVCxtQkFBbUIsRUFFbkIsT0FBTyxFQUNQLEtBQUssd0JBQXdCLEVBRzlCLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFFLEtBQUssY0FBYyxFQUFtQixtQkFBbUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3JHLE9BQU8sRUFBRSxLQUFLLGlCQUFpQixFQUFrQixNQUFNLDZCQUE2QixDQUFDO0FBR3JGLE9BQU8sRUFDTCxXQUFXLEVBQ1gsS0FBSyxlQUFlLEVBRXBCLE1BQU0sRUFDTixTQUFTLEVBSVYsTUFBTSxrQkFBa0IsQ0FBQztBQWUxQixPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssUUFBUSxFQUFFLEtBQUssTUFBTSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUF1QnpFLE1BQU0sTUFBTSx1QkFBdUIsR0FBRztJQUFFLGFBQWEsRUFBRSxPQUFPLEVBQUUsR0FBRyxTQUFTLENBQUE7Q0FBRSxDQUFDO0FBRS9FOztHQUVHO0FBQ0gscUJBQWEsVUFBVTs7SUF1Q1QsT0FBTyxDQUFDLEVBQUU7SUFBdEIsWUFBb0IsRUFBRSxFQUFFLGlCQUFpQixFQWF4QztJQUVEOzs7O09BSUc7SUFDRyx5QkFBeUIsSUFBSSxPQUFPLENBQUMsV0FB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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"block_store.d.ts","sourceRoot":"","sources":["../../src/store/block_store.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAyB,UAAU,EAAE,MAAM,iCAAiC,CAAC;AACnH,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AAMpD,OAAO,KAAK,EAAE,iBAAiB,EAA6C,MAAM,iBAAiB,CAAC;AACpG,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,
|
|
1
|
+
{"version":3,"file":"block_store.d.ts","sourceRoot":"","sources":["../../src/store/block_store.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAyB,UAAU,EAAE,MAAM,iCAAiC,CAAC;AACnH,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AAMpD,OAAO,KAAK,EAAE,iBAAiB,EAA6C,MAAM,iBAAiB,CAAC;AACpG,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EACL,KAAK,SAAS,EACd,SAAS,EAET,mBAAmB,EAEnB,OAAO,EACP,KAAK,wBAAwB,EAG9B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,KAAK,cAAc,EAAmB,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AACrG,OAAO,EAAE,KAAK,iBAAiB,EAAkB,MAAM,6BAA6B,CAAC;AAGrF,OAAO,EACL,WAAW,EACX,KAAK,eAAe,EAEpB,MAAM,EACN,SAAS,EAIV,MAAM,kBAAkB,CAAC;AAe1B,OAAO,EAAE,SAAS,EAAE,KAAK,QAAQ,EAAE,KAAK,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAuBzE,MAAM,MAAM,uBAAuB,GAAG;IAAE,aAAa,EAAE,OAAO,EAAE,GAAG,SAAS,CAAA;CAAE,CAAC;AAE/E;;GAEG;AACH,qBAAa,UAAU;;IAuCT,OAAO,CAAC,EAAE;IAAtB,YAAoB,EAAE,EAAE,iBAAiB,EAaxC;IAED;;;;OAIG;IACG,yBAAyB,IAAI,OAAO,CAAC,WAAW,CAAC,CAUtD;IAED;;;;;;OAMG;IACG,iBAAiB,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,IAAI,GAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAsF3F;IAED;;;;OAIG;IACG,cAAc,CAAC,WAAW,EAAE,mBAAmB,EAAE,EAAE,IAAI,GAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CA4GzG;YAEa,kBAAkB;YA6BlB,WAAW;IAgBzB;;;;OAIG;IACG,sBAAsB,CAAC,gBAAgB,EAAE,gBAAgB,GAAG,OAAO,CAAC,uBAAuB,CAAC,CA4CjG;IAEK,iBAAiB,CAAC,gBAAgB,EAAE,gBAAgB,GAAG,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC,CAM/F;IAEK,qBAAqB,CAAC,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAU5F;IAED,uGAAuG;IACjG,6BAA6B,CAAC,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAYzG;IAED,OAAO,CAAC,mCAAmC;IAarC,sBAAsB,CAAC,gBAAgB,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,EAAE,GAAG,SAAS,CAAC,CAe/F;IAED;;;;;OAKG;IACG,gBAAgB,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAiBjE;IAED;;;;;OAKG;IACG,iBAAiB,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAuBpE;IAEK,oBAAoB,IAAI,OAAO,CAAC,WAAW,CAAC,CAWjD;IAEK,oBAAoB,IAAI,OAAO,CAAC,WAAW,CAAC,CAKjD;IAEK,yBAAyB,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAM3D;IAEK,oBAAoB,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,mBAAmB,GAAG,SAAS,CAAC,CAmBxF;IAED;;;;;OAKG;IACI,qBAAqB,CAAC,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,GAAG,qBAAqB,CAAC,mBAAmB,CAAC,CAoB1G;IAEK,0BAA0B,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,mBAAmB,GAAG,SAAS,CAAC,CAM/F;IAEK,6BAA6B,CAAC,OAAO,EAAE,EAAE,GAAG,OAAO,CAAC,mBAAmB,GAAG,SAAS,CAAC,CAMzF;IAED;;;;;OAKG;IACI,SAAS,CAAC,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAOlF;IAED;;;;OAIG;IACG,YAAY,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC,CAM3E;IAED;;;;OAIG;IACG,qBAAqB,CAAC,OAAO,EAAE,EAAE,GAAG,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC,CAMvE;IAED;;;;OAIG;IACG,QAAQ,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC,CAMrE;IAED;;;;OAIG;IACG,cAAc,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC,CAMvE;IAED;;;;OAIG;IACG,iBAAiB,CAAC,OAAO,EAAE,EAAE,GAAG,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC,CAMjE;IAED;;;;OAIG;IACG,oBAAoB,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CAUjF;IAED;;;;OAIG;IACG,uBAAuB,CAAC,OAAO,EAAE,EAAE,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CAU3E;IAED;;;;;OAKG;IACI,eAAe,CAAC,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,GAAG,qBAAqB,CAAC,WAAW,CAAC,CAU5F;YAEc,gBAAgB;IAa/B,OAAO,CAAC,4BAA4B;YAUtB,wBAAwB;IAsCtC;;;;OAIG;IACG,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC,CAMtE;IAED;;;;OAIG;IACG,mBAAmB,CACvB,MAAM,EAAE,MAAM,EACd,WAAW,CAAC,EAAE,IAAI,CAAC,iBAAiB,EAAE,eAAe,CAAC,GACrD,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC,CAwChC;IAED;;;;OAIG;IACU,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC,CAOtG;IAED;;;;OAIG;IACH,mBAAmB,CAAC,eAAe,EAAE,YAAY,GAAG,OAAO,CAAC,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC,CAE5G;IAED;;;OAGG;IACG,4BAA4B,IAAI,OAAO,CAAC,WAAW,CAAC,CAOzD;IAEK,sBAAsB,IAAI,OAAO,CAAC,WAAW,CAAC,CAGnD;IAED;;;OAGG;IACH,uBAAuB,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAErD;IAED,uBAAuB,CAAC,aAAa,EAAE,MAAM,oBAE5C;IAEK,yBAAyB,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAQ3D;IAEK,yBAAyB,CAAC,gBAAgB,EAAE,gBAAgB,oBAGjE;IAEK,4BAA4B,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAQ9D;IAED,4BAA4B,CAAC,gBAAgB,EAAE,gBAAgB,oBAE9D;IAcD;;;OAGG;IACG,+BAA+B,IAAI,OAAO,CAAC,wBAAwB,GAAG,SAAS,CAAC,CAMrF;IAED;;;OAGG;IACG,+BAA+B,CAAC,MAAM,EAAE,wBAAwB,GAAG,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAOjG;CACF"}
|