@aztec/archiver 4.0.0-nightly.20260116 → 4.0.0-nightly.20260117
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 +10 -2
- package/dest/archiver.d.ts +3 -2
- package/dest/archiver.d.ts.map +1 -1
- package/dest/archiver.js +7 -6
- package/dest/modules/data_source_base.d.ts +2 -1
- package/dest/modules/data_source_base.d.ts.map +1 -1
- package/dest/modules/data_source_base.js +3 -0
- package/dest/modules/data_store_updater.d.ts +29 -6
- package/dest/modules/data_store_updater.d.ts.map +1 -1
- package/dest/modules/data_store_updater.js +117 -29
- package/dest/modules/l1_synchronizer.d.ts +5 -3
- package/dest/modules/l1_synchronizer.d.ts.map +1 -1
- package/dest/modules/l1_synchronizer.js +98 -52
- package/dest/store/block_store.d.ts +16 -2
- package/dest/store/block_store.d.ts.map +1 -1
- package/dest/store/block_store.js +62 -8
- package/dest/store/kv_archiver_store.d.ts +14 -2
- package/dest/store/kv_archiver_store.d.ts.map +1 -1
- package/dest/store/kv_archiver_store.js +14 -0
- package/dest/store/log_store.d.ts +1 -1
- package/dest/store/log_store.d.ts.map +1 -1
- package/dest/store/log_store.js +69 -48
- package/dest/test/fake_l1_state.d.ts +18 -1
- package/dest/test/fake_l1_state.d.ts.map +1 -1
- package/dest/test/fake_l1_state.js +36 -17
- package/dest/test/mock_l2_block_source.d.ts +2 -1
- package/dest/test/mock_l2_block_source.d.ts.map +1 -1
- package/dest/test/mock_l2_block_source.js +4 -0
- package/package.json +13 -13
- package/src/archiver.ts +8 -6
- package/src/modules/data_source_base.ts +4 -0
- package/src/modules/data_store_updater.ts +143 -42
- package/src/modules/l1_synchronizer.ts +113 -61
- package/src/store/block_store.ts +79 -10
- package/src/store/kv_archiver_store.ts +19 -1
- package/src/store/log_store.ts +112 -76
- package/src/test/fake_l1_state.ts +62 -24
- package/src/test/mock_l2_block_source.ts +5 -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 } from '@aztec/stdlib/epoch-helpers';
|
|
383
|
+
import { getEpochAtSlot, getSlotAtTimestamp } 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';
|
|
@@ -403,7 +403,7 @@ _dec = trackSpan('Archiver.syncFromL1'), _dec1 = trackSpan('Archiver.handleEpoch
|
|
|
403
403
|
epochCache;
|
|
404
404
|
dateProvider;
|
|
405
405
|
instrumentation;
|
|
406
|
-
|
|
406
|
+
l1Constants;
|
|
407
407
|
events;
|
|
408
408
|
log;
|
|
409
409
|
static{
|
|
@@ -431,10 +431,11 @@ _dec = trackSpan('Archiver.syncFromL1'), _dec1 = trackSpan('Archiver.handleEpoch
|
|
|
431
431
|
], []));
|
|
432
432
|
}
|
|
433
433
|
l1BlockNumber;
|
|
434
|
+
l1BlockHash;
|
|
434
435
|
l1Timestamp;
|
|
435
436
|
updater;
|
|
436
437
|
tracer;
|
|
437
|
-
constructor(publicClient, debugClient, rollup, inbox, l1Addresses, store, config, blobClient, epochCache, dateProvider, instrumentation,
|
|
438
|
+
constructor(publicClient, debugClient, rollup, inbox, l1Addresses, store, config, blobClient, epochCache, dateProvider, instrumentation, l1Constants, events, tracer, log = createLogger('archiver:l1-sync')){
|
|
438
439
|
this.publicClient = publicClient;
|
|
439
440
|
this.debugClient = debugClient;
|
|
440
441
|
this.rollup = rollup;
|
|
@@ -446,7 +447,7 @@ _dec = trackSpan('Archiver.syncFromL1'), _dec1 = trackSpan('Archiver.handleEpoch
|
|
|
446
447
|
this.epochCache = epochCache;
|
|
447
448
|
this.dateProvider = dateProvider;
|
|
448
449
|
this.instrumentation = instrumentation;
|
|
449
|
-
this.
|
|
450
|
+
this.l1Constants = l1Constants;
|
|
450
451
|
this.events = events;
|
|
451
452
|
this.log = log;
|
|
452
453
|
_initProto(this);
|
|
@@ -476,26 +477,33 @@ _dec = trackSpan('Archiver.syncFromL1'), _dec1 = trackSpan('Archiver.handleEpoch
|
|
|
476
477
|
}
|
|
477
478
|
}
|
|
478
479
|
async syncFromL1(initialSyncComplete) {
|
|
479
|
-
/**
|
|
480
|
-
* We keep track of three "pointers" to L1 blocks:
|
|
481
|
-
* 1. the last L1 block that published an L2 block
|
|
482
|
-
* 2. the last L1 block that added L1 to L2 messages
|
|
483
|
-
* 3. the last L1 block that cancelled L1 to L2 messages
|
|
484
|
-
*
|
|
485
|
-
* We do this to deal with L1 data providers that are eventually consistent (e.g. Infura).
|
|
486
|
-
* We guard against seeing block X with no data at one point, and later, the provider processes the block and it has data.
|
|
487
|
-
* The archiver will stay back, until there's data on L1 that will move the pointers forward.
|
|
488
|
-
*/ const { l1StartBlock, l1StartBlockHash } = this.l1constants;
|
|
489
|
-
const { blocksSynchedTo = l1StartBlock, messagesSynchedTo = {
|
|
490
|
-
l1BlockNumber: l1StartBlock,
|
|
491
|
-
l1BlockHash: l1StartBlockHash
|
|
492
|
-
} } = await this.store.getSynchPoint();
|
|
493
480
|
const currentL1Block = await this.publicClient.getBlock({
|
|
494
481
|
includeTransactions: false
|
|
495
482
|
});
|
|
496
483
|
const currentL1BlockNumber = currentL1Block.number;
|
|
497
484
|
const currentL1BlockHash = Buffer32.fromString(currentL1Block.hash);
|
|
498
|
-
|
|
485
|
+
const currentL1Timestamp = currentL1Block.timestamp;
|
|
486
|
+
if (this.l1BlockHash && currentL1BlockHash.equals(this.l1BlockHash)) {
|
|
487
|
+
this.log.trace(`No new L1 blocks since last sync at L1 block ${this.l1BlockNumber}`);
|
|
488
|
+
return;
|
|
489
|
+
}
|
|
490
|
+
// Warn if the latest L1 block timestamp is too old
|
|
491
|
+
const maxAllowedDelay = this.config.maxAllowedEthClientDriftSeconds;
|
|
492
|
+
const now = this.dateProvider.nowInSeconds();
|
|
493
|
+
if (maxAllowedDelay > 0 && Number(currentL1Timestamp) <= now - maxAllowedDelay) {
|
|
494
|
+
this.log.warn(`Latest L1 block ${currentL1BlockNumber} timestamp ${currentL1Timestamp} is too old. Make sure your Ethereum node is synced.`, {
|
|
495
|
+
currentL1BlockNumber,
|
|
496
|
+
currentL1Timestamp,
|
|
497
|
+
now,
|
|
498
|
+
maxAllowedDelay
|
|
499
|
+
});
|
|
500
|
+
}
|
|
501
|
+
// Load sync point for blocks and messages defaulting to start block
|
|
502
|
+
const { blocksSynchedTo = this.l1Constants.l1StartBlock, messagesSynchedTo = {
|
|
503
|
+
l1BlockNumber: this.l1Constants.l1StartBlock,
|
|
504
|
+
l1BlockHash: this.l1Constants.l1StartBlockHash
|
|
505
|
+
} } = await this.store.getSynchPoint();
|
|
506
|
+
this.log.debug(`Starting new archiver sync iteration`, {
|
|
499
507
|
blocksSynchedTo,
|
|
500
508
|
messagesSynchedTo,
|
|
501
509
|
currentL1BlockNumber,
|
|
@@ -518,27 +526,14 @@ _dec = trackSpan('Archiver.syncFromL1'), _dec1 = trackSpan('Archiver.handleEpoch
|
|
|
518
526
|
* data up to the currentBlockNumber captured at the top of this function. We might want to improve on this
|
|
519
527
|
* in future but for the time being it should give us the guarantees that we need
|
|
520
528
|
*/ // ********** Events that are processed per L1 block **********
|
|
521
|
-
await this.handleL1ToL2Messages(messagesSynchedTo, currentL1BlockNumber
|
|
522
|
-
// Get L1 timestamp for the current block
|
|
523
|
-
const currentL1Timestamp = !this.l1Timestamp || !this.l1BlockNumber || this.l1BlockNumber !== currentL1BlockNumber ? (await this.publicClient.getBlock({
|
|
524
|
-
blockNumber: currentL1BlockNumber
|
|
525
|
-
})).timestamp : this.l1Timestamp;
|
|
526
|
-
// Warn if the latest L1 block timestamp is too old
|
|
527
|
-
const maxAllowedDelay = this.config.maxAllowedEthClientDriftSeconds;
|
|
528
|
-
const now = this.dateProvider.nowInSeconds();
|
|
529
|
-
if (maxAllowedDelay > 0 && Number(currentL1Timestamp) <= now - maxAllowedDelay) {
|
|
530
|
-
this.log.warn(`Latest L1 block ${currentL1BlockNumber} timestamp ${currentL1Timestamp} is too old. Make sure your Ethereum node is synced.`, {
|
|
531
|
-
currentL1BlockNumber,
|
|
532
|
-
currentL1Timestamp,
|
|
533
|
-
now,
|
|
534
|
-
maxAllowedDelay
|
|
535
|
-
});
|
|
536
|
-
}
|
|
529
|
+
await this.handleL1ToL2Messages(messagesSynchedTo, currentL1BlockNumber);
|
|
537
530
|
// ********** Events that are processed per checkpoint **********
|
|
538
531
|
if (currentL1BlockNumber > blocksSynchedTo) {
|
|
539
532
|
// First we retrieve new checkpoints and L2 blocks and store them in the DB. This will also update the
|
|
540
533
|
// pending chain validation status, proven checkpoint number, and synched L1 block number.
|
|
541
534
|
const rollupStatus = await this.handleCheckpoints(blocksSynchedTo, currentL1BlockNumber, initialSyncComplete);
|
|
535
|
+
// Then we try pruning uncheckpointed blocks if a new slot was mined without checkpoints
|
|
536
|
+
await this.pruneUncheckpointedBlocks(currentL1Timestamp);
|
|
542
537
|
// Then we prune the current epoch if it'd reorg on next submission.
|
|
543
538
|
// Note that we don't do this before retrieving checkpoints because we may need to retrieve
|
|
544
539
|
// checkpoints from more than 2 epochs ago, so we want to make sure we have the latest view of
|
|
@@ -565,15 +560,49 @@ _dec = trackSpan('Archiver.syncFromL1'), _dec1 = trackSpan('Archiver.handleEpoch
|
|
|
565
560
|
// but the corresponding blocks have not been processed (see #12631).
|
|
566
561
|
this.l1Timestamp = currentL1Timestamp;
|
|
567
562
|
this.l1BlockNumber = currentL1BlockNumber;
|
|
563
|
+
this.l1BlockHash = currentL1BlockHash;
|
|
568
564
|
const l1BlockNumberAtEnd = await this.publicClient.getBlockNumber();
|
|
569
|
-
this.log.
|
|
565
|
+
this.log.debug(`Archiver sync iteration complete`, {
|
|
570
566
|
l1BlockNumberAtStart: currentL1BlockNumber,
|
|
571
567
|
l1TimestampAtStart: currentL1Timestamp,
|
|
572
568
|
l1BlockNumberAtEnd
|
|
573
569
|
});
|
|
574
570
|
}
|
|
571
|
+
/** Prune all proposed local blocks that should have been checkpointed by now. */ async pruneUncheckpointedBlocks(currentL1Timestamp) {
|
|
572
|
+
const [lastCheckpointedBlockNumber, lastProposedBlockNumber] = await Promise.all([
|
|
573
|
+
this.store.getCheckpointedL2BlockNumber(),
|
|
574
|
+
this.store.getLatestBlockNumber()
|
|
575
|
+
]);
|
|
576
|
+
// If there are no uncheckpointed blocks, we got nothing to do
|
|
577
|
+
if (lastProposedBlockNumber === lastCheckpointedBlockNumber) {
|
|
578
|
+
this.log.trace(`No uncheckpointed blocks to prune.`);
|
|
579
|
+
return;
|
|
580
|
+
}
|
|
581
|
+
// What's the slot of the first uncheckpointed block?
|
|
582
|
+
const firstUncheckpointedBlockNumber = BlockNumber(lastCheckpointedBlockNumber + 1);
|
|
583
|
+
const [firstUncheckpointedBlockHeader] = await this.store.getBlockHeaders(firstUncheckpointedBlockNumber, 1);
|
|
584
|
+
const firstUncheckpointedBlockSlot = firstUncheckpointedBlockHeader?.getSlot();
|
|
585
|
+
// 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 nextL1BlockTimestamp = currentL1Timestamp + BigInt(this.l1Constants.ethereumSlotDuration);
|
|
587
|
+
const slotAtNextL1Block = getSlotAtTimestamp(nextL1BlockTimestamp, this.l1Constants);
|
|
588
|
+
// Prune provisional blocks from slots that have ended without being checkpointed
|
|
589
|
+
if (firstUncheckpointedBlockSlot !== undefined && firstUncheckpointedBlockSlot < slotAtNextL1Block) {
|
|
590
|
+
this.log.warn(`Pruning blocks after block ${lastCheckpointedBlockNumber} due to slot ${firstUncheckpointedBlockSlot} not being checkpointed`, {
|
|
591
|
+
firstUncheckpointedBlockHeader: firstUncheckpointedBlockHeader.toInspect(),
|
|
592
|
+
slotAtNextL1Block
|
|
593
|
+
});
|
|
594
|
+
const prunedBlocks = await this.updater.removeBlocksAfter(lastCheckpointedBlockNumber);
|
|
595
|
+
if (prunedBlocks.length > 0) {
|
|
596
|
+
this.events.emit(L2BlockSourceEvents.L2PruneUncheckpointed, {
|
|
597
|
+
type: L2BlockSourceEvents.L2PruneUncheckpointed,
|
|
598
|
+
slotNumber: firstUncheckpointedBlockSlot,
|
|
599
|
+
blocks: prunedBlocks
|
|
600
|
+
});
|
|
601
|
+
}
|
|
602
|
+
}
|
|
603
|
+
}
|
|
575
604
|
/** Queries the rollup contract on whether a prune can be executed on the immediate next L1 block. */ async canPrune(currentL1BlockNumber, currentL1Timestamp) {
|
|
576
|
-
const time = (currentL1Timestamp ?? 0n) + BigInt(this.
|
|
605
|
+
const time = (currentL1Timestamp ?? 0n) + BigInt(this.l1Constants.ethereumSlotDuration);
|
|
577
606
|
const result = await this.rollup.canPruneAtTime(time, {
|
|
578
607
|
blockNumber: currentL1BlockNumber
|
|
579
608
|
});
|
|
@@ -598,7 +627,7 @@ _dec = trackSpan('Archiver.syncFromL1'), _dec1 = trackSpan('Archiver.handleEpoch
|
|
|
598
627
|
throw new Error(`Missing checkpoint header ${pruneFrom}`);
|
|
599
628
|
}
|
|
600
629
|
const pruneFromSlotNumber = header.slotNumber;
|
|
601
|
-
const pruneFromEpochNumber = getEpochAtSlot(pruneFromSlotNumber, this.
|
|
630
|
+
const pruneFromEpochNumber = getEpochAtSlot(pruneFromSlotNumber, this.l1Constants);
|
|
602
631
|
const checkpointsToUnwind = localPendingCheckpointNumber - provenCheckpointNumber;
|
|
603
632
|
const checkpointPromises = Array.from({
|
|
604
633
|
length: checkpointsToUnwind
|
|
@@ -607,13 +636,13 @@ _dec = trackSpan('Archiver.syncFromL1'), _dec1 = trackSpan('Archiver.handleEpoch
|
|
|
607
636
|
const blockPromises = await Promise.all(checkpoints.filter(isDefined).map((cp)=>this.store.getBlocksForCheckpoint(CheckpointNumber(cp.checkpointNumber))));
|
|
608
637
|
const newBlocks = blockPromises.filter(isDefined).flat();
|
|
609
638
|
// Emit an event for listening services to react to the chain prune
|
|
610
|
-
this.events.emit(L2BlockSourceEvents.
|
|
611
|
-
type: L2BlockSourceEvents.
|
|
639
|
+
this.events.emit(L2BlockSourceEvents.L2PruneUnproven, {
|
|
640
|
+
type: L2BlockSourceEvents.L2PruneUnproven,
|
|
612
641
|
epochNumber: pruneFromEpochNumber,
|
|
613
642
|
blocks: newBlocks
|
|
614
643
|
});
|
|
615
644
|
this.log.debug(`L2 prune from ${provenCheckpointNumber + 1} to ${localPendingCheckpointNumber} will occur on next checkpoint submission.`);
|
|
616
|
-
await this.updater.
|
|
645
|
+
await this.updater.unwindCheckpoints(localPendingCheckpointNumber, checkpointsToUnwind);
|
|
617
646
|
this.log.warn(`Unwound ${count(checkpointsToUnwind, 'checkpoint')} from checkpoint ${localPendingCheckpointNumber} ` + `to ${provenCheckpointNumber} due to predicted reorg at L1 block ${currentL1BlockNumber}. ` + `Updated latest checkpoint is ${await this.store.getSynchedCheckpointNumber()}.`);
|
|
618
647
|
this.instrumentation.processPrune(timer.ms());
|
|
619
648
|
// TODO(palla/reorg): Do we need to set the block synched L1 block number here?
|
|
@@ -625,7 +654,7 @@ _dec = trackSpan('Archiver.syncFromL1'), _dec1 = trackSpan('Archiver.handleEpoch
|
|
|
625
654
|
};
|
|
626
655
|
}
|
|
627
656
|
nextRange(end, limit) {
|
|
628
|
-
const batchSize = this.config.batchSize * this.
|
|
657
|
+
const batchSize = this.config.batchSize * this.l1Constants.slotDuration / this.l1Constants.ethereumSlotDuration;
|
|
629
658
|
const nextStart = end + 1n;
|
|
630
659
|
const nextEnd = nextStart + BigInt(batchSize);
|
|
631
660
|
if (nextEnd > limit) {
|
|
@@ -639,7 +668,7 @@ _dec = trackSpan('Archiver.syncFromL1'), _dec1 = trackSpan('Archiver.handleEpoch
|
|
|
639
668
|
nextEnd
|
|
640
669
|
];
|
|
641
670
|
}
|
|
642
|
-
async handleL1ToL2Messages(messagesSyncPoint, currentL1BlockNumber
|
|
671
|
+
async handleL1ToL2Messages(messagesSyncPoint, currentL1BlockNumber) {
|
|
643
672
|
this.log.trace(`Handling L1 to L2 messages from ${messagesSyncPoint.l1BlockNumber} to ${currentL1BlockNumber}.`);
|
|
644
673
|
if (currentL1BlockNumber <= messagesSyncPoint.l1BlockNumber) {
|
|
645
674
|
return;
|
|
@@ -688,9 +717,8 @@ _dec = trackSpan('Archiver.syncFromL1'), _dec1 = trackSpan('Archiver.handleEpoch
|
|
|
688
717
|
let messageCount = 0;
|
|
689
718
|
do {
|
|
690
719
|
[searchStartBlock, searchEndBlock] = this.nextRange(searchEndBlock, currentL1BlockNumber);
|
|
691
|
-
this.log.trace(`Retrieving L1 to L2 messages
|
|
720
|
+
this.log.trace(`Retrieving L1 to L2 messages in L1 blocks ${searchStartBlock}-${searchEndBlock}`);
|
|
692
721
|
const messages = await retrieveL1ToL2Messages(this.inbox, searchStartBlock, searchEndBlock);
|
|
693
|
-
this.log.verbose(`Retrieved ${messages.length} new L1 to L2 messages between L1 blocks ${searchStartBlock} and ${searchEndBlock}.`);
|
|
694
722
|
const timer = new Timer();
|
|
695
723
|
await this.store.addL1ToL2Messages(messages);
|
|
696
724
|
const perMsg = timer.ms() / messages.length;
|
|
@@ -722,7 +750,7 @@ _dec = trackSpan('Archiver.syncFromL1'), _dec1 = trackSpan('Archiver.handleEpoch
|
|
|
722
750
|
async retrieveL1ToL2Message(leaf) {
|
|
723
751
|
const currentL1BlockNumber = await this.publicClient.getBlockNumber();
|
|
724
752
|
let searchStartBlock = 0n;
|
|
725
|
-
let searchEndBlock = this.
|
|
753
|
+
let searchEndBlock = this.l1Constants.l1StartBlock - 1n;
|
|
726
754
|
do {
|
|
727
755
|
[searchStartBlock, searchEndBlock] = this.nextRange(searchEndBlock, currentL1BlockNumber);
|
|
728
756
|
const message = await retrieveL1ToL2Message(this.inbox, leaf, searchStartBlock, searchEndBlock);
|
|
@@ -764,7 +792,7 @@ _dec = trackSpan('Archiver.syncFromL1'), _dec1 = trackSpan('Archiver.handleEpoch
|
|
|
764
792
|
// Update the syncpoint so the loop below reprocesses the changed messages. We go to the block before
|
|
765
793
|
// the last common one, so we force reprocessing it, in case new messages were added on that same L1 block
|
|
766
794
|
// after the last common message.
|
|
767
|
-
const syncPointL1BlockNumber = commonMsg ? commonMsg.l1BlockNumber - 1n : this.
|
|
795
|
+
const syncPointL1BlockNumber = commonMsg ? commonMsg.l1BlockNumber - 1n : this.l1Constants.l1StartBlock;
|
|
768
796
|
const syncPointL1BlockHash = await this.getL1BlockHash(syncPointL1BlockNumber);
|
|
769
797
|
messagesSyncPoint = {
|
|
770
798
|
l1BlockNumber: syncPointL1BlockNumber,
|
|
@@ -832,7 +860,7 @@ _dec = trackSpan('Archiver.syncFromL1'), _dec1 = trackSpan('Archiver.handleEpoch
|
|
|
832
860
|
provenCheckpointNumber
|
|
833
861
|
});
|
|
834
862
|
const provenSlotNumber = localCheckpointForDestinationProvenCheckpointNumber.header.slotNumber;
|
|
835
|
-
const provenEpochNumber = getEpochAtSlot(provenSlotNumber, this.
|
|
863
|
+
const provenEpochNumber = getEpochAtSlot(provenSlotNumber, this.l1Constants);
|
|
836
864
|
const lastBlockNumberInCheckpoint = localCheckpointForDestinationProvenCheckpointNumber.startBlock + localCheckpointForDestinationProvenCheckpointNumber.numBlocks - 1;
|
|
837
865
|
this.events.emit(L2BlockSourceEvents.L2BlockProven, {
|
|
838
866
|
type: L2BlockSourceEvents.L2BlockProven,
|
|
@@ -904,7 +932,7 @@ _dec = trackSpan('Archiver.syncFromL1'), _dec1 = trackSpan('Archiver.handleEpoch
|
|
|
904
932
|
tipAfterUnwind--;
|
|
905
933
|
}
|
|
906
934
|
const checkpointsToUnwind = localPendingCheckpointNumber - tipAfterUnwind;
|
|
907
|
-
await this.updater.
|
|
935
|
+
await this.updater.unwindCheckpoints(localPendingCheckpointNumber, checkpointsToUnwind);
|
|
908
936
|
this.log.warn(`Unwound ${count(checkpointsToUnwind, 'checkpoint')} from checkpoint ${localPendingCheckpointNumber} ` + `due to mismatched checkpoint hashes at L1 block ${currentL1BlockNumber}. ` + `Updated L2 latest checkpoint is ${await this.store.getSynchedCheckpointNumber()}.`);
|
|
909
937
|
}
|
|
910
938
|
}
|
|
@@ -935,7 +963,7 @@ _dec = trackSpan('Archiver.syncFromL1'), _dec1 = trackSpan('Archiver.handleEpoch
|
|
|
935
963
|
for (const published of publishedCheckpoints){
|
|
936
964
|
const validationResult = this.config.skipValidateCheckpointAttestations ? {
|
|
937
965
|
valid: true
|
|
938
|
-
} : await validateCheckpointAttestations(published, this.epochCache, this.
|
|
966
|
+
} : await validateCheckpointAttestations(published, this.epochCache, this.l1Constants, this.log);
|
|
939
967
|
// Only update the validation result if it has changed, so we can keep track of the first invalid checkpoint
|
|
940
968
|
// in case there is a sequence of more than one invalid checkpoint, as we need to invalidate the first one.
|
|
941
969
|
// There is an exception though: if a checkpoint is invalidated and replaced with another invalid checkpoint,
|
|
@@ -983,13 +1011,31 @@ _dec = trackSpan('Archiver.syncFromL1'), _dec1 = trackSpan('Archiver.handleEpoch
|
|
|
983
1011
|
}
|
|
984
1012
|
try {
|
|
985
1013
|
const updatedValidationResult = rollupStatus.validationResult === initialValidationResult ? undefined : rollupStatus.validationResult;
|
|
986
|
-
const [processDuration] = await elapsed(()=>execInSpan(this.tracer, 'Archiver.
|
|
1014
|
+
const [processDuration, result] = await elapsed(()=>execInSpan(this.tracer, 'Archiver.setCheckpointData', ()=>this.updater.setNewCheckpointData(validCheckpoints, updatedValidationResult)));
|
|
987
1015
|
this.instrumentation.processNewBlocks(processDuration / validCheckpoints.length, validCheckpoints.flatMap((c)=>c.checkpoint.blocks));
|
|
1016
|
+
// If blocks were pruned due to conflict with L1 checkpoints, emit event
|
|
1017
|
+
if (result.prunedBlocks && result.prunedBlocks.length > 0) {
|
|
1018
|
+
const prunedCheckpointNumber = result.prunedBlocks[0].checkpointNumber;
|
|
1019
|
+
const prunedSlotNumber = result.prunedBlocks[0].header.globalVariables.slotNumber;
|
|
1020
|
+
this.log.warn(`Pruned ${result.prunedBlocks.length} mismatching blocks for checkpoint ${prunedCheckpointNumber}`, {
|
|
1021
|
+
prunedBlocks: result.prunedBlocks.map((b)=>b.toBlockInfo()),
|
|
1022
|
+
prunedSlotNumber,
|
|
1023
|
+
prunedCheckpointNumber
|
|
1024
|
+
});
|
|
1025
|
+
// Emit event for listening services to react to the prune.
|
|
1026
|
+
// Note: slotNumber comes from the first pruned block. If pruned blocks theoretically spanned multiple slots,
|
|
1027
|
+
// only one slot number would be reported (though in practice all blocks in a checkpoint span a single slot).
|
|
1028
|
+
this.events.emit(L2BlockSourceEvents.L2PruneUncheckpointed, {
|
|
1029
|
+
type: L2BlockSourceEvents.L2PruneUncheckpointed,
|
|
1030
|
+
slotNumber: prunedSlotNumber,
|
|
1031
|
+
blocks: result.prunedBlocks
|
|
1032
|
+
});
|
|
1033
|
+
}
|
|
988
1034
|
} catch (err) {
|
|
989
1035
|
if (err instanceof InitialCheckpointNumberNotSequentialError) {
|
|
990
1036
|
const { previousCheckpointNumber, newCheckpointNumber } = err;
|
|
991
1037
|
const previousCheckpoint = previousCheckpointNumber ? await this.store.getCheckpointData(CheckpointNumber(previousCheckpointNumber)) : undefined;
|
|
992
|
-
const updatedL1SyncPoint = previousCheckpoint?.l1.blockNumber ?? this.
|
|
1038
|
+
const updatedL1SyncPoint = previousCheckpoint?.l1.blockNumber ?? this.l1Constants.l1StartBlock;
|
|
993
1039
|
await this.store.setCheckpointSynchedL1BlockNumber(updatedL1SyncPoint);
|
|
994
1040
|
this.log.warn(`Attempting to insert checkpoint ${newCheckpointNumber} with previous block ${previousCheckpointNumber}. Rolling back L1 sync point to ${updatedL1SyncPoint} to try and fetch the missing blocks.`, {
|
|
995
1041
|
previousCheckpointNumber,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { BlockNumber, CheckpointNumber } from '@aztec/foundation/branded-types';
|
|
1
|
+
import { BlockNumber, CheckpointNumber, SlotNumber } from '@aztec/foundation/branded-types';
|
|
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';
|
|
@@ -41,6 +41,7 @@ export declare class BlockStore {
|
|
|
41
41
|
force?: boolean;
|
|
42
42
|
}): Promise<boolean>;
|
|
43
43
|
private addBlockToDatabase;
|
|
44
|
+
private deleteBlock;
|
|
44
45
|
/**
|
|
45
46
|
* Unwinds checkpoints from the database
|
|
46
47
|
* @param from - The tip of the chain, passed for verification purposes,
|
|
@@ -53,6 +54,19 @@ export declare class BlockStore {
|
|
|
53
54
|
getRangeOfCheckpoints(from: CheckpointNumber, limit: number): Promise<CheckpointData[]>;
|
|
54
55
|
private checkpointDataFromCheckpointStorage;
|
|
55
56
|
getBlocksForCheckpoint(checkpointNumber: CheckpointNumber): Promise<L2BlockNew[] | undefined>;
|
|
57
|
+
/**
|
|
58
|
+
* Gets all blocks that have the given slot number.
|
|
59
|
+
* Iterates backwards through blocks for efficiency since we usually query for the last slot.
|
|
60
|
+
* @param slotNumber - The slot number to search for.
|
|
61
|
+
* @returns All blocks with the given slot number, in ascending block number order.
|
|
62
|
+
*/
|
|
63
|
+
getBlocksForSlot(slotNumber: SlotNumber): Promise<L2BlockNew[]>;
|
|
64
|
+
/**
|
|
65
|
+
* Removes all blocks with block number > blockNumber.
|
|
66
|
+
* @param blockNumber - The block number to remove after.
|
|
67
|
+
* @returns The removed blocks (for event emission).
|
|
68
|
+
*/
|
|
69
|
+
unwindBlocksAfter(blockNumber: BlockNumber): Promise<L2BlockNew[]>;
|
|
56
70
|
getProvenBlockNumber(): Promise<BlockNumber>;
|
|
57
71
|
getLatestBlockNumber(): Promise<BlockNumber>;
|
|
58
72
|
getLatestCheckpointNumber(): Promise<CheckpointNumber>;
|
|
@@ -161,4 +175,4 @@ export declare class BlockStore {
|
|
|
161
175
|
*/
|
|
162
176
|
setPendingChainValidationStatus(status: ValidateCheckpointResult | undefined): Promise<void>;
|
|
163
177
|
}
|
|
164
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
178
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmxvY2tfc3RvcmUuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdG9yZS9ibG9ja19zdG9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsV0FBVyxFQUFFLGdCQUFnQixFQUFFLFVBQVUsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQzVGLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQU1wRCxPQUFPLEtBQUssRUFBRSxpQkFBaUIsRUFBNkMsTUFBTSxpQkFBaUIsQ0FBQztBQUNwRyxPQUFPLEtBQUssRUFBRSxZQUFZLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNoRSxPQUFPLEVBRUwsbUJBQW1CLEVBRW5CLFdBQVcsRUFDWCxVQUFVLEVBQ1YsS0FBSyx3QkFBd0IsRUFHOUIsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQUUsZUFBZSxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDaEYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDeEQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDN0QsT0FBTyxFQUNMLFdBQVcsRUFDWCxLQUFLLGVBQWUsRUFFcEIsTUFBTSxFQUNOLFNBQVMsRUFHVixNQUFNLGtCQUFrQixDQUFDO0FBYzFCLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxRQUFRLEVBQUUsS0FBSyxNQUFNLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQXNCekUsTUFBTSxNQUFNLGNBQWMsR0FBRztJQUMzQixnQkFBZ0IsRUFBRSxnQkFBZ0IsQ0FBQztJQUNuQyxNQUFNLEVBQUUsZ0JBQWdCLENBQUM7SUFDekIsT0FBTyxFQUFFLHNCQUFzQixDQUFDO0lBQ2hDLFVBQVUsRUFBRSxNQUFNLENBQUM7SUFDbkIsU0FBUyxFQUFFLE1BQU0sQ0FBQztJQUNsQixFQUFFLEVBQUUsZUFBZSxDQUFDO0lBQ3BCLFlBQVksRUFBRSxNQUFNLEVBQUUsQ0FBQztDQUN4QixDQUFDO0FBRUY7O0dBRUc7QUFDSCxxQkFBYSxVQUFVOztJQWlDVCxPQUFPLENBQUMsRUFBRTtJQUF0QixZQUFvQixFQUFFLEVBQUUsaUJBQWlCLEVBV3hDO0lBRUQ7Ozs7T0FJRztJQUNHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLEVBQUUsSUFBSSxHQUFFO1FBQUUsS0FBSyxDQUFDLEVBQUUsT0FBTyxDQUFBO0tBQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLENBZ0Z0RjtJQUVEOzs7O09BSUc7SUFDRyxjQUFjLENBQUMsV0FBVyxFQUFFLG1CQUFtQixFQUFFLEVBQUUsSUFBSSxHQUFFO1FBQUUsS0FBSyxDQUFDLEVBQUUsT0FBTyxDQUFBO0tBQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLENBd0d6RztZQUVhLGtCQUFrQjtZQTZCbEIsV0FBVztJQWdCekI7Ozs7OztPQU1HO0lBQ0csaUJBQWlCLENBQUMsSUFBSSxFQUFFLGdCQUFnQixFQUFFLG1CQUFtQixFQUFFLE1BQU0sb0JBd0MxRTtJQUVLLGlCQUFpQixDQUFDLGdCQUFnQixFQUFFLGdCQUFnQixHQUFHLE9BQU8sQ0FBQyxjQUFjLEdBQUcsU0FBUyxDQUFDLENBTS9GO0lBRUsscUJBQXFCLENBQUMsSUFBSSxFQUFFLGdCQUFnQixFQUFFLEtBQUssRUFBRSxNQUFNLEdBQUcsT0FBTyxDQUFDLGNBQWMsRUFBRSxDQUFDLENBVTVGO0lBRUQsT0FBTyxDQUFDLG1DQUFtQztJQWFyQyxzQkFBc0IsQ0FBQyxnQkFBZ0IsRUFBRSxnQkFBZ0IsR0FBRyxPQUFPLENBQUMsVUFBVSxFQUFFLEdBQUcsU0FBUyxDQUFDLENBZWxHO0lBRUQ7Ozs7O09BS0c7SUFDRyxnQkFBZ0IsQ0FBQyxVQUFVLEVBQUUsVUFBVSxHQUFHLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQWlCcEU7SUFFRDs7OztPQUlHO0lBQ0csaUJBQWlCLENBQUMsV0FBVyxFQUFFLFdBQVcsR0FBRyxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUMsQ0F1QnZFO0lBRUssb0JBQW9CLElBQUksT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQVdqRDtJQUVLLG9CQUFvQixJQUFJLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FLakQ7SUFFSyx5QkFBeUIsSUFBSSxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FNM0Q7SUFFSyxvQkFBb0IsQ0FBQyxNQUFNLEVBQUUsV0FBVyxHQUFHLE9BQU8sQ0FBQyxtQkFBbUIsR0FBRyxTQUFTLENBQUMsQ0FtQnhGO0lBRUQ7Ozs7O09BS0c7SUFDSSxxQkFBcUIsQ0FBQyxLQUFLLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxNQUFNLEdBQUcscUJBQXFCLENBQUMsbUJBQW1CLENBQUMsQ0FvQjFHO0lBRUssMEJBQTBCLENBQUMsU0FBUyxFQUFFLEVBQUUsR0FBRyxPQUFPLENBQUMsbUJBQW1CLEdBQUcsU0FBUyxDQUFDLENBTXhGO0lBRUssNkJBQTZCLENBQUMsT0FBTyxFQUFFLEVBQUUsR0FBRyxPQUFPLENBQUMsbUJBQW1CLEdBQUcsU0FBUyxDQUFDLENBTXpGO0lBRUQ7Ozs7O09BS0c7SUFDSSxTQUFTLENBQUMsS0FBSyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsTUFBTSxHQUFHLHFCQUFxQixDQUFDLFVBQVUsQ0FBQyxDQU9yRjtJQUVEOzs7O09BSUc7SUFDRyxRQUFRLENBQUMsV0FBVyxFQUFFLFdBQVcsR0FBRyxPQUFPLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQyxDQU14RTtJQUVEOzs7O09BSUc7SUFDRyxjQUFjLENBQUMsU0FBUyxFQUFFLFdBQVcsR0FBRyxPQUFPLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQyxDQU01RTtJQUVEOzs7O09BSUc7SUFDRyxpQkFBaUIsQ0FBQyxPQUFPLEVBQUUsRUFBRSxHQUFHLE9BQU8sQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDLENBTXBFO0lBRUQ7Ozs7T0FJRztJQUNHLG9CQUFvQixDQUFDLFNBQVMsRUFBRSxXQUFXLEdBQUcsT0FBTyxDQUFDLFdBQVcsR0FBRyxTQUFTLENBQUMsQ0FVbkY7SUFFRDs7OztPQUlHO0lBQ0csdUJBQXVCLENBQUMsT0FBTyxFQUFFLEVBQUUsR0FBRyxPQUFPLENBQUMsV0FBVyxHQUFHLFNBQVMsQ0FBQyxDQVUzRTtJQUVEOzs7OztPQUtHO0lBQ0ksZUFBZSxDQUFDLEtBQUssRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLE1BQU0sR0FBRyxxQkFBcUIsQ0FBQyxXQUFXLENBQUMsQ0FVNUY7WUFFYyxnQkFBZ0I7WUFhakIsd0JBQXdCO0lBNkN0Qzs7OztPQUlHO0lBQ0csV0FBVyxDQUFDLE1BQU0sRUFBRSxNQUFNLEdBQUcsT0FBTyxDQUFDLGVBQWUsR0FBRyxTQUFTLENBQUMsQ0FNdEU7SUFFRDs7OztPQUlHO0lBQ0csbUJBQW1CLENBQUMsTUFBTSxFQUFFLE1BQU0sR0FBRyxPQUFPLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQyxDQWN4RTtJQUVEOzs7O09BSUc7SUFDVSxhQUFhLENBQUMsTUFBTSxFQUFFLE1BQU0sR0FBRyxPQUFPLENBQUMsQ0FBQyxXQUFXLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FPdEc7SUFFRDs7OztPQUlHO0lBQ0gsbUJBQW1CLENBQUMsZUFBZSxFQUFFLFlBQVksR0FBRyxPQUFPLENBQUMsQ0FBQyxXQUFXLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FFNUc7SUFFRDs7O09BR0c7SUFDRyw0QkFBNEIsSUFBSSxPQUFPLENBQUMsV0FBVyxDQUFDLENBT3pEO0lBRUssc0JBQXNCLElBQUksT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUduRDtJQUVEOzs7T0FHRztJQUNILHVCQUF1QixJQUFJLE9BQU8sQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDLENBRXJEO0lBRUQsdUJBQXVCLENBQUMsYUFBYSxFQUFFLE1BQU0sb0JBRTVDO0lBRUsseUJBQXlCLElBQUksT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBUTNEO0lBRUsseUJBQXlCLENBQUMsZ0JBQWdCLEVBQUUsZ0JBQWdCLG9CQUdqRTtJQWNEOzs7T0FHRztJQUNHLCtCQUErQixJQUFJLE9BQU8sQ0FBQyx3QkFBd0IsR0FBRyxTQUFTLENBQUMsQ0FNckY7SUFFRDs7O09BR0c7SUFDRywrQkFBK0IsQ0FBQyxNQUFNLEVBQUUsd0JBQXdCLEdBQUcsU0FBUyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FPakc7Q0FDRiJ9
|
|
@@ -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,EAAE,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"block_store.d.ts","sourceRoot":"","sources":["../../src/store/block_store.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { INITIAL_CHECKPOINT_NUMBER, INITIAL_L2_BLOCK_NUM } from '@aztec/constants';
|
|
2
2
|
import { BlockNumber, CheckpointNumber } from '@aztec/foundation/branded-types';
|
|
3
|
+
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
3
4
|
import { toArray } from '@aztec/foundation/iterable';
|
|
4
5
|
import { createLogger } from '@aztec/foundation/log';
|
|
5
6
|
import { BufferReader } from '@aztec/foundation/serialize';
|
|
@@ -214,6 +215,18 @@ export { TxReceipt } from '@aztec/stdlib/tx';
|
|
|
214
215
|
await this.#blockHashIndex.set(blockHash.toString(), block.number);
|
|
215
216
|
await this.#blockArchiveIndex.set(block.archive.root.toString(), block.number);
|
|
216
217
|
}
|
|
218
|
+
/** Deletes a block and all associated data (tx effects, indices). */ async deleteBlock(block) {
|
|
219
|
+
// Delete the block from the main blocks map
|
|
220
|
+
await this.#blocks.delete(block.number);
|
|
221
|
+
// Delete all tx effects for this block
|
|
222
|
+
await Promise.all(block.body.txEffects.map((tx)=>this.#txEffects.delete(tx.txHash.toString())));
|
|
223
|
+
// Delete block txs mapping
|
|
224
|
+
const blockHash = (await block.hash()).toString();
|
|
225
|
+
await this.#blockTxs.delete(blockHash);
|
|
226
|
+
// Clean up indices
|
|
227
|
+
await this.#blockHashIndex.delete(blockHash);
|
|
228
|
+
await this.#blockArchiveIndex.delete(block.archive.root.toString());
|
|
229
|
+
}
|
|
217
230
|
/**
|
|
218
231
|
* Unwinds checkpoints from the database
|
|
219
232
|
* @param from - The tip of the chain, passed for verification purposes,
|
|
@@ -245,14 +258,8 @@ export { TxReceipt } from '@aztec/stdlib/tx';
|
|
|
245
258
|
this.#log.warn(`Cannot remove block ${blockNumber} from the store since we don't have it`);
|
|
246
259
|
continue;
|
|
247
260
|
}
|
|
248
|
-
await this
|
|
249
|
-
|
|
250
|
-
const blockHash = (await block.hash()).toString();
|
|
251
|
-
await this.#blockTxs.delete(blockHash);
|
|
252
|
-
// Clean up indices
|
|
253
|
-
await this.#blockHashIndex.delete(blockHash);
|
|
254
|
-
await this.#blockArchiveIndex.delete(block.archive.root.toString());
|
|
255
|
-
this.#log.debug(`Unwound block ${blockNumber} ${blockHash} for checkpoint ${checkpointNumber}`);
|
|
261
|
+
await this.deleteBlock(block);
|
|
262
|
+
this.#log.debug(`Unwound block ${blockNumber} ${(await block.hash()).toString()} for checkpoint ${checkpointNumber}`);
|
|
256
263
|
}
|
|
257
264
|
}
|
|
258
265
|
return true;
|
|
@@ -300,6 +307,52 @@ export { TxReceipt } from '@aztec/stdlib/tx';
|
|
|
300
307
|
const converted = await Promise.all(blocksForCheckpoint.map((x)=>this.getBlockFromBlockStorage(x[0], x[1])));
|
|
301
308
|
return converted.filter(isDefined);
|
|
302
309
|
}
|
|
310
|
+
/**
|
|
311
|
+
* Gets all blocks that have the given slot number.
|
|
312
|
+
* Iterates backwards through blocks for efficiency since we usually query for the last slot.
|
|
313
|
+
* @param slotNumber - The slot number to search for.
|
|
314
|
+
* @returns All blocks with the given slot number, in ascending block number order.
|
|
315
|
+
*/ async getBlocksForSlot(slotNumber) {
|
|
316
|
+
const blocks = [];
|
|
317
|
+
// Iterate backwards through all blocks and filter by slot number
|
|
318
|
+
// This is more efficient since we usually query for the most recent slot
|
|
319
|
+
for await (const [blockNumber, blockStorage] of this.#blocks.entriesAsync({
|
|
320
|
+
reverse: true
|
|
321
|
+
})){
|
|
322
|
+
const block = await this.getBlockFromBlockStorage(blockNumber, blockStorage);
|
|
323
|
+
const blockSlot = block?.header.globalVariables.slotNumber;
|
|
324
|
+
if (block && blockSlot === slotNumber) {
|
|
325
|
+
blocks.push(block);
|
|
326
|
+
} else if (blockSlot && blockSlot < slotNumber) {
|
|
327
|
+
break; // Blocks are stored in slot ascending order, so we can stop searching
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
// Reverse to return blocks in ascending order (block number order)
|
|
331
|
+
return blocks.reverse();
|
|
332
|
+
}
|
|
333
|
+
/**
|
|
334
|
+
* Removes all blocks with block number > blockNumber.
|
|
335
|
+
* @param blockNumber - The block number to remove after.
|
|
336
|
+
* @returns The removed blocks (for event emission).
|
|
337
|
+
*/ async unwindBlocksAfter(blockNumber) {
|
|
338
|
+
return await this.db.transactionAsync(async ()=>{
|
|
339
|
+
const removedBlocks = [];
|
|
340
|
+
// Get the latest block number to determine the range
|
|
341
|
+
const latestBlockNumber = await this.getLatestBlockNumber();
|
|
342
|
+
// Iterate from blockNumber + 1 to latestBlockNumber
|
|
343
|
+
for(let bn = blockNumber + 1; bn <= latestBlockNumber; bn++){
|
|
344
|
+
const block = await this.getBlock(BlockNumber(bn));
|
|
345
|
+
if (block === undefined) {
|
|
346
|
+
this.#log.warn(`Cannot remove block ${bn} from the store since we don't have it`);
|
|
347
|
+
continue;
|
|
348
|
+
}
|
|
349
|
+
removedBlocks.push(block);
|
|
350
|
+
await this.deleteBlock(block);
|
|
351
|
+
this.#log.debug(`Removed block ${bn} ${(await block.hash()).toString()}`);
|
|
352
|
+
}
|
|
353
|
+
return removedBlocks;
|
|
354
|
+
});
|
|
355
|
+
}
|
|
303
356
|
async getProvenBlockNumber() {
|
|
304
357
|
const provenCheckpointNumber = await this.getProvenCheckpointNumber();
|
|
305
358
|
if (provenCheckpointNumber === INITIAL_CHECKPOINT_NUMBER - 1) {
|
|
@@ -484,6 +537,7 @@ export { TxReceipt } from '@aztec/stdlib/tx';
|
|
|
484
537
|
const header = BlockHeader.fromBuffer(blockStorage.header);
|
|
485
538
|
const archive = AppendOnlyTreeSnapshot.fromBuffer(blockStorage.archive);
|
|
486
539
|
const blockHash = blockStorage.blockHash;
|
|
540
|
+
header.setHash(Fr.fromBuffer(blockHash));
|
|
487
541
|
const blockHashString = bufferToHex(blockHash);
|
|
488
542
|
const blockTxsBuffer = await this.#blockTxs.getAsync(blockHashString);
|
|
489
543
|
if (blockTxsBuffer === undefined) {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { L1BlockId } from '@aztec/ethereum/l1-types';
|
|
2
|
-
import type { BlockNumber, CheckpointNumber } from '@aztec/foundation/branded-types';
|
|
2
|
+
import type { BlockNumber, CheckpointNumber, SlotNumber } from '@aztec/foundation/branded-types';
|
|
3
3
|
import type { Fr } from '@aztec/foundation/curves/bn254';
|
|
4
4
|
import type { AztecAsyncKVStore, CustomRange, StoreSize } from '@aztec/kv-store';
|
|
5
5
|
import { FunctionSelector } from '@aztec/stdlib/abi';
|
|
@@ -315,5 +315,17 @@ export declare class KVArchiverDataStore implements ContractDataSource {
|
|
|
315
315
|
* @returns The checkpoint data or undefined if not found
|
|
316
316
|
*/
|
|
317
317
|
getCheckpointData(checkpointNumber: CheckpointNumber): Promise<CheckpointData | undefined>;
|
|
318
|
+
/**
|
|
319
|
+
* Gets all blocks that have the given slot number.
|
|
320
|
+
* @param slotNumber - The slot number to search for.
|
|
321
|
+
* @returns All blocks with the given slot number.
|
|
322
|
+
*/
|
|
323
|
+
getBlocksForSlot(slotNumber: SlotNumber): Promise<L2BlockNew[]>;
|
|
324
|
+
/**
|
|
325
|
+
* Removes all blocks with block number > blockNumber.
|
|
326
|
+
* @param blockNumber - The block number to remove after.
|
|
327
|
+
* @returns The removed blocks (for event emission).
|
|
328
|
+
*/
|
|
329
|
+
removeBlocksAfter(blockNumber: BlockNumber): Promise<L2BlockNew[]>;
|
|
318
330
|
}
|
|
319
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
331
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia3ZfYXJjaGl2ZXJfc3RvcmUuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdG9yZS9rdl9hcmNoaXZlcl9zdG9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMxRCxPQUFPLEtBQUssRUFBRSxXQUFXLEVBQUUsZ0JBQWdCLEVBQUUsVUFBVSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDakcsT0FBTyxLQUFLLEVBQUUsRUFBRSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFHekQsT0FBTyxLQUFLLEVBQUUsaUJBQWlCLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2pGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3JELE9BQU8sS0FBSyxFQUFFLFlBQVksRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxtQkFBbUIsRUFBZSxVQUFVLEVBQUUsS0FBSyx3QkFBd0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2xILE9BQU8sS0FBSyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDcEUsT0FBTyxLQUFLLEVBQ1YsbUJBQW1CLEVBQ25CLGtCQUFrQixFQUNsQixpQ0FBaUMsRUFDakMsMkJBQTJCLEVBQzNCLDRDQUE0QyxFQUM1QyxrQ0FBa0MsRUFDbkMsTUFBTSx3QkFBd0IsQ0FBQztBQUNoQyxPQUFPLEtBQUssRUFBRSw0QkFBNEIsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQzNHLE9BQU8sS0FBSyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLGFBQWEsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ25GLE9BQU8sS0FBSyxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sa0JB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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kv_archiver_store.d.ts","sourceRoot":"","sources":["../../src/store/kv_archiver_store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"kv_archiver_store.d.ts","sourceRoot":"","sources":["../../src/store/kv_archiver_store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AACjG,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AAGzD,OAAO,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjF,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAe,UAAU,EAAE,KAAK,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAClH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,KAAK,EACV,mBAAmB,EACnB,kBAAkB,EAClB,iCAAiC,EACjC,2BAA2B,EAC3B,4CAA4C,EAC5C,kCAAkC,EACnC,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,4BAA4B,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AAC3G,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACvE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAIlD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAc,KAAK,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAMnE,eAAO,MAAM,mBAAmB,IAAI,CAAC;AACrC,eAAO,MAAM,uBAAuB,OAAO,CAAC;AAC5C,eAAO,MAAM,qBAAqB,MAAM,CAAC;AAEzC;;GAEG;AACH,MAAM,MAAM,oBAAoB,GAAG;IACjC,4EAA4E;IAC5E,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,mDAAmD;IACnD,iBAAiB,CAAC,EAAE,SAAS,CAAC;CAC/B,CAAC;AAEF;;;GAGG;AACH,qBAAa,mBAAoB,YAAW,kBAAkB;;IAc1D,OAAO,CAAC,EAAE;IAbZ,gBAAuB,cAAc,KAAuB;IAQ5D,OAAO,CAAC,aAAa,CAA6B;IAIlD,YACU,EAAE,EAAE,iBAAiB,EAC7B,eAAe,GAAE,MAAa,EAO/B;IAED,yFAAyF;IAClF,gBAAgB,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAEjE;IAEM,cAAc,IAAI,OAAO,CAAC,WAAW,CAAC,CAE5C;IAEY,WAAW,CACtB,OAAO,EAAE,YAAY,EACrB,cAAc,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC,2BAA2B,GAAG,SAAS,CAAC,CAIlD;IAED,qFAAqF;IACxE,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,UAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAGpE;IAED,wCAAwC;IACjC,KAAK,kBAEX;IAED,wDAAwD;IACxD,oBAAoB,CAAC,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAEpG;IAED,gFAAgF;IAC1E,kCAAkC,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAY5E;IAED;;;OAGG;IACH,gBAAgB,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,mBAAmB,GAAG,SAAS,CAAC,CAEjE;IAED,+DAA+D;IAC/D,mBAAmB,IAAI,OAAO,CAAC,EAAE,EAAE,CAAC,CAEnC;IAED;;;;;OAKG;IACH,mBAAmB,CAAC,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,2BAA2B,GAAG,SAAS,CAAC,CAE9G;IAED,wCAAwC,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAE3F;IAED;;;;;;OAMG;IACG,kBAAkB,CACtB,IAAI,EAAE,mBAAmB,EAAE,EAC3B,mBAAmB,EAAE,EAAE,EAAE,EACzB,WAAW,EAAE,WAAW,GACvB,OAAO,CAAC,OAAO,CAAC,CAMlB;IAEK,qBAAqB,CAAC,IAAI,EAAE,mBAAmB,EAAE,EAAE,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAInG;IAED,qBAAqB,CAAC,eAAe,EAAE,EAAE,GAAG,OAAO,CAAC,EAAE,GAAG,SAAS,CAAC,CAElE;IAED,kDAAkD;IAClD,YAAY,CACV,eAAe,EAAE,EAAE,EACnB,gBAAgB,EAAE,4CAA4C,EAAE,EAChE,gBAAgB,EAAE,kCAAkC,EAAE,GACrD,OAAO,CAAC,OAAO,CAAC,CAElB;IAED;;;;;OAKG;IACG,oBAAoB,CAAC,IAAI,EAAE,2BAA2B,EAAE,EAAE,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAI1G;IAEK,uBAAuB,CAAC,IAAI,EAAE,2BAA2B,EAAE,EAAE,YAAY,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAE9G;IAED;;;;;OAKG;IACG,0BAA0B,CAAC,IAAI,EAAE,iCAAiC,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAQ/G;IACK,6BAA6B,CAAC,IAAI,EAAE,iCAAiC,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAQlH;IAED;;;;OAIG;IACH,SAAS,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE,IAAI,GAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAC;QAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;KAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAE3G;IAED;;;;;OAKG;IACH,qBAAqB,CAAC,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAEtF;IACD;;;OAGG;IACH,oBAAoB,IAAI,OAAO,CAAC,WAAW,CAAC,CAE3C;IAED;;;;;;OAMG;IACH,iBAAiB,CAAC,IAAI,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAEvF;IAED;;;;OAIG;IACH,cAAc,CAAC,WAAW,EAAE,mBAAmB,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAEnE;IAED;;;OAGG;IACH,oBAAoB,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,mBAAmB,GAAG,SAAS,CAAC,CAElF;IACD;;;OAGG;IACH,0BAA0B,CAAC,SAAS,EAAE,EAAE,GAAG,OAAO,CAAC,mBAAmB,GAAG,SAAS,CAAC,CAElF;IACD;;;OAGG;IACH,6BAA6B,CAAC,OAAO,EAAE,EAAE,GAAG,OAAO,CAAC,mBAAmB,GAAG,SAAS,CAAC,CAEnF;IACD;;;OAGG;IACH,QAAQ,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAE7D;IACD;;;OAGG;IACH,cAAc,CAAC,SAAS,EAAE,EAAE,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAE7D;IACD;;;OAGG;IACH,iBAAiB,CAAC,OAAO,EAAE,EAAE,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAE9D;IAED;;;;;OAKG;IACH,SAAS,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAEjE;IAED;;;;;OAKG;IACH,qBAAqB,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAEtF;IAED;;;;;OAKG;IACH,eAAe,CAAC,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAEzE;IAED;;;OAGG;IACH,oBAAoB,CAAC,SAAS,EAAE,EAAE,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CAEpE;IAED;;;OAGG;IACH,uBAAuB,CAAC,OAAO,EAAE,EAAE,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CAErE;IAED;;;;OAIG;IACH,WAAW,CAAC,MAAM,EAAE,MAAM,mEAEzB;IAED;;;;OAIG;IACH,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC,CAElE;IAED;;;;OAIG;IACH,OAAO,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAE9C;IAED,UAAU,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAEjD;IAED;;;OAGG;IACH,0BAA0B,IAAI,OAAO,CAAC,MAAM,CAAC,CAE5C;IAED,gDAAgD;IAChD,oBAAoB,IAAI,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC,CAExD;IAED;;;;OAIG;IACH,iBAAiB,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAEzD;IAED;;;;OAIG;IACH,qBAAqB,CAAC,aAAa,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAEpE;IAED;;;;OAIG;IACH,iBAAiB,CAAC,gBAAgB,EAAE,gBAAgB,GAAG,OAAO,CAAC,EAAE,EAAE,CAAC,CAEnE;IAED;;;OAGG;IACH,oBAAoB,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAMlE;IAED;;;OAGG;IACH,+BAA+B,CAAC,eAAe,EAAE,YAAY,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAMtG;IAED;;;;OAIG;IACH,aAAa,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAM/D;IAED;;;;OAIG;IACH,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,4BAA4B,CAAC,CAM7E;IAED;;;OAGG;IACH,yBAAyB,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAErD;IAED;;;OAGG;IACG,yBAAyB,CAAC,gBAAgB,EAAE,gBAAgB,iBAEjE;IAEK,4BAA4B,CAAC,aAAa,EAAE,MAAM,iBAEvD;IAED;;OAEG;IACG,wBAAwB,CAAC,OAAO,EAAE,SAAS,iBAEhD;IAED;;;OAGG;IACH,oBAAoB,IAAI,OAAO,CAAC,WAAW,CAAC,CAE3C;IAED;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,oBAAoB,CAAC,CASnD;IAED,gDAAgD;IACzC,YAAY,IAAI,OAAO,CAAC,SAAS,CAAC,CAExC;IAED,uFAAuF;IAChF,kCAAkC,CAAC,sBAAsB,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAEjG;IAED,uEAAuE;IAChE,qBAAqB,CAAC,KAAK,GAAE,WAAW,CAAC,MAAM,CAAM,GAAG,qBAAqB,CAAC,YAAY,CAAC,CAEjG;IAED,+EAA+E;IACxE,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE7D;IAED,sEAAsE;IAC/D,+BAA+B,IAAI,OAAO,CAAC,wBAAwB,GAAG,SAAS,CAAC,CAEtF;IAED,mEAAmE;IAC5D,+BAA+B,CAAC,MAAM,EAAE,wBAAwB,GAAG,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAElG;IAED;;;OAGG;IACI,4BAA4B,IAAI,OAAO,CAAC,WAAW,CAAC,CAE1D;IACD;;;OAGG;IACI,0BAA0B,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAE7D;IACD;;;OAGG;IACG,iCAAiC,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE5E;IAED;;;;OAIG;IACH,sBAAsB,CAAC,gBAAgB,EAAE,gBAAgB,GAAG,OAAO,CAAC,UAAU,EAAE,GAAG,SAAS,CAAC,CAE5F;IAED;;;;OAIG;IACH,iBAAiB,CAAC,gBAAgB,EAAE,gBAAgB,GAAG,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC,CAEzF;IAED;;;;OAIG;IACH,gBAAgB,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAE9D;IAED;;;;OAIG;IACH,iBAAiB,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAEjE;CACF"}
|
|
@@ -421,4 +421,18 @@ export const MAX_FUNCTION_NAME_LEN = 256;
|
|
|
421
421
|
*/ getCheckpointData(checkpointNumber) {
|
|
422
422
|
return this.#blockStore.getCheckpointData(checkpointNumber);
|
|
423
423
|
}
|
|
424
|
+
/**
|
|
425
|
+
* Gets all blocks that have the given slot number.
|
|
426
|
+
* @param slotNumber - The slot number to search for.
|
|
427
|
+
* @returns All blocks with the given slot number.
|
|
428
|
+
*/ getBlocksForSlot(slotNumber) {
|
|
429
|
+
return this.#blockStore.getBlocksForSlot(slotNumber);
|
|
430
|
+
}
|
|
431
|
+
/**
|
|
432
|
+
* Removes all blocks with block number > blockNumber.
|
|
433
|
+
* @param blockNumber - The block number to remove after.
|
|
434
|
+
* @returns The removed blocks (for event emission).
|
|
435
|
+
*/ removeBlocksAfter(blockNumber) {
|
|
436
|
+
return this.#blockStore.unwindBlocksAfter(blockNumber);
|
|
437
|
+
}
|
|
424
438
|
}
|
|
@@ -42,4 +42,4 @@ export declare class LogStore {
|
|
|
42
42
|
*/
|
|
43
43
|
getContractClassLogs(filter: LogFilter): Promise<GetContractClassLogsResponse>;
|
|
44
44
|
}
|
|
45
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
45
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nX3N0b3JlLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc3RvcmUvbG9nX3N0b3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQU1BLE9BQU8sS0FBSyxFQUFFLGlCQUFpQixFQUFpQixNQUFNLGlCQUFpQixDQUFDO0FBQ3hFLE9BQU8sS0FBSyxFQUFFLFlBQVksRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ2hFLE9BQU8sRUFBZSxVQUFVLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUM5RCxPQUFPLEtBQUssRUFBRSw0QkFBNEIsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQzNHLE9BQU8sRUFJTCxLQUFLLFNBQVMsRUFHZCxLQUFLLFNBQVMsRUFDZCxHQUFHLEVBQ0gsYUFBYSxFQUNkLE1BQU0sb0JBQW9CLENBQUM7QUFFNUIsT0FBTyxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFbkQ7O0dBRUc7QUFDSCxxQkFBYSxRQUFROztJQWFqQixPQUFPLENBQUMsRUFBRTtJQUNWLE9BQU8sQ0FBQyxVQUFVO0lBRnBCLFlBQ1UsRUFBRSxFQUFFLGlCQUFpQixFQUNyQixVQUFVLEVBQUUsVUFBVSxFQUM5QixlQUFlLEdBQUUsTUFBYSxFQVUvQjtJQTRNRDs7OztPQUlHO0lBQ0gsT0FBTyxDQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUUsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLENBUzlDO0lBZ0JELFVBQVUsQ0FBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQTJCakQ7SUFFRDs7O09BR0c7SUFDRyxvQkFBb0IsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLEdBQUcsT0FBTyxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUMsQ0FJeEU7SUFFRDs7O09BR0c7SUFDRywrQkFBK0IsQ0FBQyxlQUFlLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxPQUFPLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQyxDQVE1RztJQUVEOzs7O09BSUc7SUFDSCxhQUFhLENBQUMsTUFBTSxFQUFFLFNBQVMsR0FBRyxPQUFPLENBQUMscUJBQXFCLENBQUMsQ0FRL0Q7SUE2RUQ7Ozs7T0FJRztJQUNILG9CQUFvQixDQUFDLE1BQU0sRUFBRSxTQUFTLEdBQUcsT0FBTyxDQUFDLDRCQUE0QixDQUFDLENBUTdFO0NBNkdGIn0=
|