@aztec/archiver 4.0.0-devnet.2-patch.4 → 4.0.0-devnet.3-patch.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dest/archiver.d.ts +3 -3
- package/dest/archiver.d.ts.map +1 -1
- package/dest/archiver.js +67 -22
- package/dest/errors.d.ts +7 -9
- package/dest/errors.d.ts.map +1 -1
- package/dest/errors.js +9 -14
- package/dest/factory.d.ts +3 -4
- package/dest/factory.d.ts.map +1 -1
- package/dest/factory.js +25 -23
- package/dest/l1/bin/retrieve-calldata.js +32 -28
- package/dest/l1/calldata_retriever.d.ts +70 -53
- package/dest/l1/calldata_retriever.d.ts.map +1 -1
- package/dest/l1/calldata_retriever.js +178 -260
- package/dest/l1/data_retrieval.d.ts +2 -6
- package/dest/l1/data_retrieval.d.ts.map +1 -1
- package/dest/l1/data_retrieval.js +6 -11
- 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/modules/data_source_base.d.ts +3 -3
- package/dest/modules/data_source_base.d.ts.map +1 -1
- package/dest/modules/data_source_base.js +1 -1
- package/dest/modules/data_store_updater.d.ts +15 -7
- package/dest/modules/data_store_updater.d.ts.map +1 -1
- package/dest/modules/data_store_updater.js +75 -23
- package/dest/modules/l1_synchronizer.d.ts +3 -7
- package/dest/modules/l1_synchronizer.d.ts.map +1 -1
- package/dest/modules/l1_synchronizer.js +36 -6
- package/dest/store/block_store.d.ts +13 -13
- package/dest/store/block_store.d.ts.map +1 -1
- package/dest/store/block_store.js +111 -66
- 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 +6 -2
- package/dest/store/contract_instance_store.d.ts +1 -1
- package/dest/store/contract_instance_store.d.ts.map +1 -1
- package/dest/store/contract_instance_store.js +6 -2
- package/dest/store/kv_archiver_store.d.ts +20 -12
- package/dest/store/kv_archiver_store.d.ts.map +1 -1
- package/dest/store/kv_archiver_store.js +24 -13
- 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 +48 -10
- package/dest/store/message_store.js +1 -1
- package/dest/test/fake_l1_state.d.ts +17 -1
- package/dest/test/fake_l1_state.d.ts.map +1 -1
- package/dest/test/fake_l1_state.js +83 -12
- package/dest/test/mock_l2_block_source.d.ts +4 -3
- package/dest/test/mock_l2_block_source.d.ts.map +1 -1
- package/dest/test/mock_l2_block_source.js +7 -4
- package/dest/test/mock_structs.d.ts +4 -1
- package/dest/test/mock_structs.d.ts.map +1 -1
- package/dest/test/mock_structs.js +13 -1
- package/dest/test/noop_l1_archiver.d.ts +4 -1
- package/dest/test/noop_l1_archiver.d.ts.map +1 -1
- package/dest/test/noop_l1_archiver.js +5 -1
- package/package.json +13 -13
- package/src/archiver.ts +80 -22
- package/src/errors.ts +10 -24
- package/src/factory.ts +22 -13
- package/src/l1/README.md +25 -68
- package/src/l1/bin/retrieve-calldata.ts +40 -27
- package/src/l1/calldata_retriever.ts +231 -383
- package/src/l1/data_retrieval.ts +3 -16
- package/src/l1/spire_proposer.ts +7 -15
- package/src/modules/data_source_base.ts +3 -3
- package/src/modules/data_store_updater.ts +81 -26
- package/src/modules/l1_synchronizer.ts +41 -10
- package/src/store/block_store.ts +134 -74
- package/src/store/contract_class_store.ts +7 -3
- package/src/store/contract_instance_store.ts +8 -5
- package/src/store/kv_archiver_store.ts +31 -17
- package/src/store/log_store.ts +66 -12
- package/src/store/message_store.ts +1 -1
- package/src/test/fake_l1_state.ts +110 -14
- package/src/test/mock_l2_block_source.ts +15 -3
- package/src/test/mock_structs.ts +20 -6
- package/src/test/noop_l1_archiver.ts +7 -1
package/dest/archiver.d.ts
CHANGED
|
@@ -125,8 +125,8 @@ export declare class Archiver extends ArchiverDataSourceBase implements L2BlockS
|
|
|
125
125
|
getRegistryAddress(): Promise<EthAddress>;
|
|
126
126
|
getL1BlockNumber(): bigint | undefined;
|
|
127
127
|
getL1Timestamp(): Promise<bigint | undefined>;
|
|
128
|
-
|
|
129
|
-
|
|
128
|
+
getSyncedL2SlotNumber(): Promise<SlotNumber | undefined>;
|
|
129
|
+
getSyncedL2EpochNumber(): Promise<EpochNumber | undefined>;
|
|
130
130
|
isEpochComplete(epochNumber: EpochNumber): Promise<boolean>;
|
|
131
131
|
/** Returns whether the archiver has completed an initial sync run successfully. */
|
|
132
132
|
isInitialSyncComplete(): boolean;
|
|
@@ -136,4 +136,4 @@ export declare class Archiver extends ArchiverDataSourceBase implements L2BlockS
|
|
|
136
136
|
getL2Tips(): Promise<L2Tips>;
|
|
137
137
|
rollbackTo(targetL2BlockNumber: BlockNumber): Promise<void>;
|
|
138
138
|
}
|
|
139
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
139
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJjaGl2ZXIuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9hcmNoaXZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3JFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNoRCxPQUFPLEVBQXVCLGNBQWMsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2hGLE9BQU8sS0FBSyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDakYsT0FBTyxLQUFLLEVBQUUsZ0JBQWdCLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNyRixPQUFPLEVBQUUsV0FBVyxFQUFFLGdCQUFnQixFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUN6RyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFcEQsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3BELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUMzRCxPQUFPLEVBQUUsS0FBSyxNQUFNLEVBQWdCLE1BQU0sdUJBQXVCLENBQUM7QUFFbEUsT0FBTyxFQUFFLGNBQWMsRUFBMkIsTUFBTSxtQ0FBbUMsQ0FBQztBQUM1RixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDdkQsT0FBTyxFQUNMLEtBQUssZUFBZSxFQUNwQixPQUFPLEVBQ1AsS0FBSyxXQUFXLEVBQ2hCLEtBQUssTUFBTSxFQUNYLEtBQUssd0JBQXdCLEVBQzlCLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDL0QsT0FBTyxFQUNMLEtBQUssaUJBQWlCLEVBS3ZCLE1BQU0sNkJBQTZCLENBQUM7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
|
package/dest/archiver.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"archiver.d.ts","sourceRoot":"","sources":["../src/archiver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAuB,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAChF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uCAAuC,CAAC;AACjF,OAAO,KAAK,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AACrF,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AACzG,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAEpD,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAC3D,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,uBAAuB,CAAC;AAElE,OAAO,EAAE,cAAc,EAA2B,MAAM,mCAAmC,CAAC;AAC5F,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EACL,KAAK,eAAe,EACpB,OAAO,EACP,KAAK,WAAW,EAChB,KAAK,MAAM,EACX,KAAK,wBAAwB,EAC9B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EACL,KAAK,iBAAiB,
|
|
1
|
+
{"version":3,"file":"archiver.d.ts","sourceRoot":"","sources":["../src/archiver.ts"],"names":[],"mappings":"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"}
|
package/dest/archiver.js
CHANGED
|
@@ -372,17 +372,17 @@ function _apply_decs_2203_r(targetClass, memberDecs, classDecs, parentClass) {
|
|
|
372
372
|
}
|
|
373
373
|
var _dec, _initProto;
|
|
374
374
|
import { BlockTagTooOldError } from '@aztec/ethereum/contracts';
|
|
375
|
-
import {
|
|
375
|
+
import { BlockNumber, EpochNumber, SlotNumber } from '@aztec/foundation/branded-types';
|
|
376
376
|
import { Buffer32 } from '@aztec/foundation/buffer';
|
|
377
377
|
import { merge } from '@aztec/foundation/collection';
|
|
378
378
|
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
379
379
|
import { createLogger } from '@aztec/foundation/log';
|
|
380
380
|
import { promiseWithResolvers } from '@aztec/foundation/promise';
|
|
381
381
|
import { RunningPromise, makeLoggingErrorHandler } from '@aztec/foundation/running-promise';
|
|
382
|
-
import {
|
|
382
|
+
import { getEpochAtSlot, getSlotAtNextL1Block, getSlotRangeForEpoch, getTimestampRangeForEpoch } from '@aztec/stdlib/epoch-helpers';
|
|
383
383
|
import { trackSpan } from '@aztec/telemetry-client';
|
|
384
384
|
import { mapArchiverConfig } from './config.js';
|
|
385
|
-
import { NoBlobBodiesFoundError } from './errors.js';
|
|
385
|
+
import { BlockAlreadyCheckpointedError, NoBlobBodiesFoundError } from './errors.js';
|
|
386
386
|
import { validateAndLogTraceAvailability } from './l1/validate_trace.js';
|
|
387
387
|
import { ArchiverDataSourceBase } from './modules/data_source_base.js';
|
|
388
388
|
import { ArchiverDataStoreUpdater } from './modules/data_store_updater.js';
|
|
@@ -442,7 +442,9 @@ _dec = trackSpan('Archiver.sync');
|
|
|
442
442
|
this.synchronizer = synchronizer;
|
|
443
443
|
this.events = events;
|
|
444
444
|
this.l2TipsCache = l2TipsCache ?? new L2TipsCache(this.dataStore.blockStore);
|
|
445
|
-
this.updater = new ArchiverDataStoreUpdater(this.dataStore, this.l2TipsCache
|
|
445
|
+
this.updater = new ArchiverDataStoreUpdater(this.dataStore, this.l2TipsCache, {
|
|
446
|
+
rollupManaLimit: l1Constants.rollupManaLimit
|
|
447
|
+
});
|
|
446
448
|
// Running promise starts with a small interval inbetween runs, so all iterations needed for the initial sync
|
|
447
449
|
// are done as fast as possible. This then gets updated once the initial sync completes.
|
|
448
450
|
this.runningPromise = new RunningPromise(()=>this.sync(), this.log, this.config.pollingIntervalMs / 10, makeLoggingErrorHandler(this.log, NoBlobBodiesFoundError, BlockTagTooOldError));
|
|
@@ -526,12 +528,15 @@ _dec = trackSpan('Archiver.sync');
|
|
|
526
528
|
continue;
|
|
527
529
|
}
|
|
528
530
|
try {
|
|
529
|
-
await this.updater.
|
|
530
|
-
block
|
|
531
|
-
]);
|
|
531
|
+
await this.updater.addProposedBlock(block);
|
|
532
532
|
this.log.debug(`Added block ${block.number} to store`);
|
|
533
533
|
resolve();
|
|
534
534
|
} catch (err) {
|
|
535
|
+
if (err instanceof BlockAlreadyCheckpointedError) {
|
|
536
|
+
this.log.debug(`Proposed block ${block.number} matches already checkpointed block, ignoring late proposal`);
|
|
537
|
+
resolve();
|
|
538
|
+
continue;
|
|
539
|
+
}
|
|
535
540
|
this.log.error(`Failed to add block ${block.number} to store: ${err.message}`);
|
|
536
541
|
reject(err);
|
|
537
542
|
}
|
|
@@ -606,13 +611,45 @@ _dec = trackSpan('Archiver.sync');
|
|
|
606
611
|
getL1Timestamp() {
|
|
607
612
|
return Promise.resolve(this.synchronizer.getL1Timestamp());
|
|
608
613
|
}
|
|
609
|
-
|
|
614
|
+
async getSyncedL2SlotNumber() {
|
|
615
|
+
// The synced L2 slot is the latest slot for which we have all L1 data,
|
|
616
|
+
// either because we have seen all L1 blocks for that slot, or because
|
|
617
|
+
// we have seen the corresponding checkpoint.
|
|
618
|
+
let slotFromL1Sync;
|
|
610
619
|
const l1Timestamp = this.synchronizer.getL1Timestamp();
|
|
611
|
-
|
|
620
|
+
if (l1Timestamp !== undefined) {
|
|
621
|
+
const nextL1BlockSlot = getSlotAtNextL1Block(l1Timestamp, this.l1Constants);
|
|
622
|
+
if (Number(nextL1BlockSlot) > 0) {
|
|
623
|
+
slotFromL1Sync = SlotNumber.add(nextL1BlockSlot, -1);
|
|
624
|
+
}
|
|
625
|
+
}
|
|
626
|
+
let slotFromCheckpoint;
|
|
627
|
+
const latestCheckpointNumber = await this.store.getSynchedCheckpointNumber();
|
|
628
|
+
if (latestCheckpointNumber > 0) {
|
|
629
|
+
const checkpointData = await this.store.getCheckpointData(latestCheckpointNumber);
|
|
630
|
+
if (checkpointData) {
|
|
631
|
+
slotFromCheckpoint = checkpointData.header.slotNumber;
|
|
632
|
+
}
|
|
633
|
+
}
|
|
634
|
+
if (slotFromL1Sync === undefined && slotFromCheckpoint === undefined) {
|
|
635
|
+
return undefined;
|
|
636
|
+
}
|
|
637
|
+
return SlotNumber(Math.max(slotFromL1Sync ?? 0, slotFromCheckpoint ?? 0));
|
|
612
638
|
}
|
|
613
|
-
|
|
614
|
-
const
|
|
615
|
-
|
|
639
|
+
async getSyncedL2EpochNumber() {
|
|
640
|
+
const syncedSlot = await this.getSyncedL2SlotNumber();
|
|
641
|
+
if (syncedSlot === undefined) {
|
|
642
|
+
return undefined;
|
|
643
|
+
}
|
|
644
|
+
// An epoch is fully synced when all its slots are synced.
|
|
645
|
+
// We check if syncedSlot is the last slot of its epoch; if so, that epoch is fully synced.
|
|
646
|
+
// Otherwise, only the previous epoch is fully synced.
|
|
647
|
+
const epoch = getEpochAtSlot(syncedSlot, this.l1Constants);
|
|
648
|
+
const [, endSlot] = getSlotRangeForEpoch(epoch, this.l1Constants);
|
|
649
|
+
if (syncedSlot >= endSlot) {
|
|
650
|
+
return epoch;
|
|
651
|
+
}
|
|
652
|
+
return Number(epoch) > 0 ? EpochNumber(Number(epoch) - 1) : undefined;
|
|
616
653
|
}
|
|
617
654
|
async isEpochComplete(epochNumber) {
|
|
618
655
|
// The epoch is complete if the current checkpointed L2 block is the last one in the epoch (or later).
|
|
@@ -655,7 +692,6 @@ _dec = trackSpan('Archiver.sync');
|
|
|
655
692
|
return this.l2TipsCache.getL2Tips();
|
|
656
693
|
}
|
|
657
694
|
async rollbackTo(targetL2BlockNumber) {
|
|
658
|
-
// TODO(pw/mbps): This still assumes 1 block per checkpoint
|
|
659
695
|
const currentBlocks = await this.getL2Tips();
|
|
660
696
|
const currentL2Block = currentBlocks.proposed.number;
|
|
661
697
|
const currentProvenBlock = currentBlocks.proven.block.number;
|
|
@@ -666,8 +702,17 @@ _dec = trackSpan('Archiver.sync');
|
|
|
666
702
|
if (!targetL2Block) {
|
|
667
703
|
throw new Error(`Target L2 block ${targetL2BlockNumber} not found`);
|
|
668
704
|
}
|
|
669
|
-
const targetL1BlockNumber = targetL2Block.l1.blockNumber;
|
|
670
705
|
const targetCheckpointNumber = targetL2Block.checkpointNumber;
|
|
706
|
+
// Rollback operates at checkpoint granularity: the target block must be the last block of its checkpoint.
|
|
707
|
+
const checkpointData = await this.store.getCheckpointData(targetCheckpointNumber);
|
|
708
|
+
if (checkpointData) {
|
|
709
|
+
const lastBlockInCheckpoint = BlockNumber(checkpointData.startBlock + checkpointData.blockCount - 1);
|
|
710
|
+
if (targetL2BlockNumber !== lastBlockInCheckpoint) {
|
|
711
|
+
const previousCheckpointBoundary = checkpointData.startBlock > 1 ? BlockNumber(checkpointData.startBlock - 1) : BlockNumber(0);
|
|
712
|
+
throw new Error(`Target L2 block ${targetL2BlockNumber} is not at a checkpoint boundary. ` + `Checkpoint ${targetCheckpointNumber} spans blocks ${checkpointData.startBlock} to ${lastBlockInCheckpoint}. ` + `Use block ${lastBlockInCheckpoint} to roll back to this checkpoint, ` + `or block ${previousCheckpointBoundary} to roll back to the previous one.`);
|
|
713
|
+
}
|
|
714
|
+
}
|
|
715
|
+
const targetL1BlockNumber = targetL2Block.l1.blockNumber;
|
|
671
716
|
const targetL1Block = await this.publicClient.getBlock({
|
|
672
717
|
blockNumber: targetL1BlockNumber,
|
|
673
718
|
includeTransactions: false
|
|
@@ -687,13 +732,13 @@ _dec = trackSpan('Archiver.sync');
|
|
|
687
732
|
l1BlockHash: targetL1BlockHash
|
|
688
733
|
});
|
|
689
734
|
if (targetL2BlockNumber < currentProvenBlock) {
|
|
690
|
-
this.log.info(`
|
|
691
|
-
await this.updater.setProvenCheckpointNumber(
|
|
692
|
-
}
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
735
|
+
this.log.info(`Rolling back proven L2 checkpoint to ${targetCheckpointNumber}`);
|
|
736
|
+
await this.updater.setProvenCheckpointNumber(targetCheckpointNumber);
|
|
737
|
+
}
|
|
738
|
+
const currentFinalizedBlock = currentBlocks.finalized.block.number;
|
|
739
|
+
if (targetL2BlockNumber < currentFinalizedBlock) {
|
|
740
|
+
this.log.info(`Rolling back finalized L2 checkpoint to ${targetCheckpointNumber}`);
|
|
741
|
+
await this.updater.setFinalizedCheckpointNumber(targetCheckpointNumber);
|
|
742
|
+
}
|
|
698
743
|
}
|
|
699
744
|
}
|
package/dest/errors.d.ts
CHANGED
|
@@ -2,11 +2,6 @@ import type { Fr } from '@aztec/foundation/schemas';
|
|
|
2
2
|
export declare class NoBlobBodiesFoundError extends Error {
|
|
3
3
|
constructor(l2BlockNum: number);
|
|
4
4
|
}
|
|
5
|
-
export declare class InitialBlockNumberNotSequentialError extends Error {
|
|
6
|
-
readonly newBlockNumber: number;
|
|
7
|
-
readonly previousBlockNumber: number | undefined;
|
|
8
|
-
constructor(newBlockNumber: number, previousBlockNumber: number | undefined);
|
|
9
|
-
}
|
|
10
5
|
export declare class BlockNumberNotSequentialError extends Error {
|
|
11
6
|
constructor(newBlockNumber: number, previous: number | undefined);
|
|
12
7
|
}
|
|
@@ -18,9 +13,6 @@ export declare class InitialCheckpointNumberNotSequentialError extends Error {
|
|
|
18
13
|
export declare class CheckpointNumberNotSequentialError extends Error {
|
|
19
14
|
constructor(newCheckpointNumber: number, previous: number | undefined);
|
|
20
15
|
}
|
|
21
|
-
export declare class CheckpointNumberNotConsistentError extends Error {
|
|
22
|
-
constructor(newCheckpointNumber: number, previous: number | undefined);
|
|
23
|
-
}
|
|
24
16
|
export declare class BlockIndexNotSequentialError extends Error {
|
|
25
17
|
constructor(newBlockIndex: number, previousBlockIndex: number | undefined);
|
|
26
18
|
}
|
|
@@ -33,9 +25,15 @@ export declare class CheckpointNotFoundError extends Error {
|
|
|
33
25
|
export declare class BlockNotFoundError extends Error {
|
|
34
26
|
constructor(blockNumber: number);
|
|
35
27
|
}
|
|
28
|
+
/** Thrown when a proposed block matches a block that was already checkpointed. This is expected for late proposals. */
|
|
29
|
+
export declare class BlockAlreadyCheckpointedError extends Error {
|
|
30
|
+
readonly blockNumber: number;
|
|
31
|
+
constructor(blockNumber: number);
|
|
32
|
+
}
|
|
33
|
+
/** Thrown when a proposed block conflicts with an already checkpointed block (different content). */
|
|
36
34
|
export declare class CannotOverwriteCheckpointedBlockError extends Error {
|
|
37
35
|
readonly blockNumber: number;
|
|
38
36
|
readonly lastCheckpointedBlock: number;
|
|
39
37
|
constructor(blockNumber: number, lastCheckpointedBlock: number);
|
|
40
38
|
}
|
|
41
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
39
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JzLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZXJyb3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLEVBQUUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRXBELHFCQUFhLHNCQUF1QixTQUFRLEtBQUs7SUFDL0MsWUFBWSxVQUFVLEVBQUUsTUFBTSxFQUU3QjtDQUNGO0FBRUQscUJBQWEsNkJBQThCLFNBQVEsS0FBSztJQUN0RCxZQUFZLGNBQWMsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sR0FBRyxTQUFTLEVBRS9EO0NBQ0Y7QUFFRCxxQkFBYSx5Q0FBMEMsU0FBUSxLQUFLO2FBRWhELG1CQUFtQixFQUFFLE1BQU07YUFDM0Isd0JBQXdCLEVBQUUsTUFBTSxHQUFHLFNBQVM7SUFGOUQsWUFDa0IsbUJBQW1CLEVBQUUsTUFBTSxFQUMzQix3QkFBd0IsRUFBRSxNQUFNLEdBQUcsU0FBUyxFQU83RDtDQUNGO0FBRUQscUJBQWEsa0NBQW1DLFNBQVEsS0FBSztJQUMzRCxZQUFZLG1CQUFtQixFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxHQUFHLFNBQVMsRUFJcEU7Q0FDRjtBQUVELHFCQUFhLDRCQUE2QixTQUFRLEtBQUs7SUFDckQsWUFBWSxhQUFhLEVBQUUsTUFBTSxFQUFFLGtCQUFrQixFQUFFLE1BQU0sR0FBRyxTQUFTLEVBSXhFO0NBQ0Y7QUFFRCxxQkFBYSw4QkFBK0IsU0FBUSxLQUFLO0lBQ3ZELFlBQ0UsY0FBYyxFQUFFLE1BQU0sRUFDdEIsbUJBQW1CLEVBQUUsTUFBTSxHQUFHLFNBQVMsRUFDdkMsZUFBZSxFQUFFLEVBQUUsRUFDbkIsb0JBQW9CLEVBQUUsRUFBRSxFQUt6QjtDQUNGO0FBRUQscUJBQWEsdUJBQXdCLFNBQVEsS0FBSztJQUNoRCxZQUFZLGdCQUFnQixFQUFFLE1BQU0sRUFFbkM7Q0FDRjtBQUVELHFCQUFhLGtCQUFtQixTQUFRLEtBQUs7SUFDM0MsWUFBWSxXQUFXLEVBQUUsTUFBTSxFQUU5QjtDQUNGO0FBRUQsdUhBQXVIO0FBQ3ZILHFCQUFhLDZCQUE4QixTQUFRLEtBQUs7YUFDMUIsV0FBVyxFQUFFLE1BQU07SUFBL0MsWUFBNEIsV0FBVyxFQUFFLE1BQU0sRUFHOUM7Q0FDRjtBQUVELHFHQUFxRztBQUNyRyxxQkFBYSxxQ0FBc0MsU0FBUSxLQUFLO2FBRTVDLFdBQVcsRUFBRSxNQUFNO2FBQ25CLHFCQUFxQixFQUFFLE1BQU07SUFGL0MsWUFDa0IsV0FBVyxFQUFFLE1BQU0sRUFDbkIscUJBQXFCLEVBQUUsTUFBTSxFQU05QztDQUNGIn0=
|
package/dest/errors.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,2BAA2B,CAAC;AAEpD,qBAAa,sBAAuB,SAAQ,KAAK;IAC/C,YAAY,UAAU,EAAE,MAAM,EAE7B;CACF;AAED,qBAAa,
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,2BAA2B,CAAC;AAEpD,qBAAa,sBAAuB,SAAQ,KAAK;IAC/C,YAAY,UAAU,EAAE,MAAM,EAE7B;CACF;AAED,qBAAa,6BAA8B,SAAQ,KAAK;IACtD,YAAY,cAAc,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,EAE/D;CACF;AAED,qBAAa,yCAA0C,SAAQ,KAAK;aAEhD,mBAAmB,EAAE,MAAM;aAC3B,wBAAwB,EAAE,MAAM,GAAG,SAAS;IAF9D,YACkB,mBAAmB,EAAE,MAAM,EAC3B,wBAAwB,EAAE,MAAM,GAAG,SAAS,EAO7D;CACF;AAED,qBAAa,kCAAmC,SAAQ,KAAK;IAC3D,YAAY,mBAAmB,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,EAIpE;CACF;AAED,qBAAa,4BAA6B,SAAQ,KAAK;IACrD,YAAY,aAAa,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,GAAG,SAAS,EAIxE;CACF;AAED,qBAAa,8BAA+B,SAAQ,KAAK;IACvD,YACE,cAAc,EAAE,MAAM,EACtB,mBAAmB,EAAE,MAAM,GAAG,SAAS,EACvC,eAAe,EAAE,EAAE,EACnB,oBAAoB,EAAE,EAAE,EAKzB;CACF;AAED,qBAAa,uBAAwB,SAAQ,KAAK;IAChD,YAAY,gBAAgB,EAAE,MAAM,EAEnC;CACF;AAED,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,YAAY,WAAW,EAAE,MAAM,EAE9B;CACF;AAED,uHAAuH;AACvH,qBAAa,6BAA8B,SAAQ,KAAK;aAC1B,WAAW,EAAE,MAAM;IAA/C,YAA4B,WAAW,EAAE,MAAM,EAG9C;CACF;AAED,qGAAqG;AACrG,qBAAa,qCAAsC,SAAQ,KAAK;aAE5C,WAAW,EAAE,MAAM;aACnB,qBAAqB,EAAE,MAAM;IAF/C,YACkB,WAAW,EAAE,MAAM,EACnB,qBAAqB,EAAE,MAAM,EAM9C;CACF"}
|
package/dest/errors.js
CHANGED
|
@@ -3,16 +3,9 @@ export class NoBlobBodiesFoundError extends Error {
|
|
|
3
3
|
super(`No blob bodies found for block ${l2BlockNum}`);
|
|
4
4
|
}
|
|
5
5
|
}
|
|
6
|
-
export class InitialBlockNumberNotSequentialError extends Error {
|
|
7
|
-
newBlockNumber;
|
|
8
|
-
previousBlockNumber;
|
|
9
|
-
constructor(newBlockNumber, previousBlockNumber){
|
|
10
|
-
super(`Cannot insert new block ${newBlockNumber} given previous block number in store is ${previousBlockNumber ?? 'undefined'}`), this.newBlockNumber = newBlockNumber, this.previousBlockNumber = previousBlockNumber;
|
|
11
|
-
}
|
|
12
|
-
}
|
|
13
6
|
export class BlockNumberNotSequentialError extends Error {
|
|
14
7
|
constructor(newBlockNumber, previous){
|
|
15
|
-
super(`Cannot insert new block ${newBlockNumber} given previous block number
|
|
8
|
+
super(`Cannot insert new block ${newBlockNumber} given previous block number is ${previous ?? 'undefined'}`);
|
|
16
9
|
}
|
|
17
10
|
}
|
|
18
11
|
export class InitialCheckpointNumberNotSequentialError extends Error {
|
|
@@ -27,11 +20,6 @@ export class CheckpointNumberNotSequentialError extends Error {
|
|
|
27
20
|
super(`Cannot insert new checkpoint ${newCheckpointNumber} given previous checkpoint number in batch is ${previous ?? 'undefined'}`);
|
|
28
21
|
}
|
|
29
22
|
}
|
|
30
|
-
export class CheckpointNumberNotConsistentError extends Error {
|
|
31
|
-
constructor(newCheckpointNumber, previous){
|
|
32
|
-
super(`Cannot insert block for new checkpoint ${newCheckpointNumber} given previous block was checkpoint ${previous ?? 'undefined'}`);
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
23
|
export class BlockIndexNotSequentialError extends Error {
|
|
36
24
|
constructor(newBlockIndex, previousBlockIndex){
|
|
37
25
|
super(`Cannot insert new block at checkpoint index ${newBlockIndex} given previous block index is ${previousBlockIndex ?? 'undefined'}`);
|
|
@@ -52,7 +40,14 @@ export class BlockNotFoundError extends Error {
|
|
|
52
40
|
super(`Failed to find expected block number ${blockNumber}`);
|
|
53
41
|
}
|
|
54
42
|
}
|
|
55
|
-
export class
|
|
43
|
+
/** Thrown when a proposed block matches a block that was already checkpointed. This is expected for late proposals. */ export class BlockAlreadyCheckpointedError extends Error {
|
|
44
|
+
blockNumber;
|
|
45
|
+
constructor(blockNumber){
|
|
46
|
+
super(`Block ${blockNumber} has already been checkpointed with the same content`), this.blockNumber = blockNumber;
|
|
47
|
+
this.name = 'BlockAlreadyCheckpointedError';
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/** Thrown when a proposed block conflicts with an already checkpointed block (different content). */ export class CannotOverwriteCheckpointedBlockError extends Error {
|
|
56
51
|
blockNumber;
|
|
57
52
|
lastCheckpointedBlock;
|
|
58
53
|
constructor(blockNumber, lastCheckpointedBlock){
|
package/dest/factory.d.ts
CHANGED
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
import type { DataStoreConfig } from '@aztec/kv-store/config';
|
|
2
|
-
import type { L1RollupConstants } from '@aztec/stdlib/epoch-helpers';
|
|
3
2
|
import { Archiver, type ArchiverDeps } from './archiver.js';
|
|
4
3
|
import { type ArchiverConfig } from './config.js';
|
|
5
4
|
import { KVArchiverDataStore } from './store/kv_archiver_store.js';
|
|
6
5
|
export declare const ARCHIVER_STORE_NAME = "archiver";
|
|
7
6
|
/** Creates an archiver store. */
|
|
8
|
-
export declare function createArchiverStore(userConfig: Pick<ArchiverConfig, 'archiverStoreMapSizeKb' | 'maxLogs'> & DataStoreConfig
|
|
7
|
+
export declare function createArchiverStore(userConfig: Pick<ArchiverConfig, 'archiverStoreMapSizeKb' | 'maxLogs'> & DataStoreConfig): Promise<KVArchiverDataStore>;
|
|
9
8
|
/**
|
|
10
9
|
* Creates a local archiver.
|
|
11
10
|
* @param config - The archiver configuration.
|
|
@@ -16,6 +15,6 @@ export declare function createArchiverStore(userConfig: Pick<ArchiverConfig, 'ar
|
|
|
16
15
|
export declare function createArchiver(config: ArchiverConfig & DataStoreConfig, deps: ArchiverDeps, opts?: {
|
|
17
16
|
blockUntilSync: boolean;
|
|
18
17
|
}): Promise<Archiver>;
|
|
19
|
-
/** Registers protocol contracts in the archiver store. */
|
|
18
|
+
/** Registers protocol contracts in the archiver store. Idempotent — skips contracts that already exist (e.g. on node restart). */
|
|
20
19
|
export declare function registerProtocolContracts(store: KVArchiverDataStore): Promise<void>;
|
|
21
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
20
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFjdG9yeS5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2ZhY3RvcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBVUEsT0FBTyxLQUFLLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFZOUQsT0FBTyxFQUFFLFFBQVEsRUFBRSxLQUFLLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1RCxPQUFPLEVBQUUsS0FBSyxjQUFjLEVBQXFCLE1BQU0sYUFBYSxDQUFDO0FBR3JFLE9BQU8sRUFBdUIsbUJBQW1CLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUd4RixlQUFPLE1BQU0sbUJBQW1CLGFBQWEsQ0FBQztBQUU5QyxpQ0FBaUM7QUFDakMsd0JBQXNCLG1CQUFtQixDQUN2QyxVQUFVLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSx3QkFBd0IsR0FBRyxTQUFTLENBQUMsR0FBRyxlQUFlLGdDQVF6RjtBQUVEOzs7Ozs7R0FNRztBQUNILHdCQUFzQixjQUFjLENBQ2xDLE1BQU0sRUFBRSxjQUFjLEdBQUcsZUFBZSxFQUN4QyxJQUFJLEVBQUUsWUFBWSxFQUNsQixJQUFJLEdBQUU7SUFBRSxjQUFjLEVBQUUsT0FBTyxDQUFBO0NBQTZCLEdBQzNELE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0F1SG5CO0FBRUQsb0lBQWtJO0FBQ2xJLHdCQUFzQix5QkFBeUIsQ0FBQyxLQUFLLEVBQUUsbUJBQW1CLGlCQTJCekUifQ==
|
package/dest/factory.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../src/factory.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../src/factory.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAY9D,OAAO,EAAE,QAAQ,EAAE,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,EAAE,KAAK,cAAc,EAAqB,MAAM,aAAa,CAAC;AAGrE,OAAO,EAAuB,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAGxF,eAAO,MAAM,mBAAmB,aAAa,CAAC;AAE9C,iCAAiC;AACjC,wBAAsB,mBAAmB,CACvC,UAAU,EAAE,IAAI,CAAC,cAAc,EAAE,wBAAwB,GAAG,SAAS,CAAC,GAAG,eAAe,gCAQzF;AAED;;;;;;GAMG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,cAAc,GAAG,eAAe,EACxC,IAAI,EAAE,YAAY,EAClB,IAAI,GAAE;IAAE,cAAc,EAAE,OAAO,CAAA;CAA6B,GAC3D,OAAO,CAAC,QAAQ,CAAC,CAuHnB;AAED,oIAAkI;AAClI,wBAAsB,yBAAyB,CAAC,KAAK,EAAE,mBAAmB,iBA2BzE"}
|
package/dest/factory.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { EpochCache } from '@aztec/epoch-cache';
|
|
2
2
|
import { createEthereumChain } from '@aztec/ethereum/chain';
|
|
3
|
+
import { makeL1HttpTransport } from '@aztec/ethereum/client';
|
|
3
4
|
import { InboxContract, RollupContract } from '@aztec/ethereum/contracts';
|
|
4
5
|
import { BlockNumber } from '@aztec/foundation/branded-types';
|
|
5
6
|
import { Buffer32 } from '@aztec/foundation/buffer';
|
|
@@ -13,7 +14,7 @@ import { FunctionType, decodeFunctionSignature } from '@aztec/stdlib/abi';
|
|
|
13
14
|
import { computePublicBytecodeCommitment } from '@aztec/stdlib/contract';
|
|
14
15
|
import { getTelemetryClient } from '@aztec/telemetry-client';
|
|
15
16
|
import { EventEmitter } from 'events';
|
|
16
|
-
import { createPublicClient
|
|
17
|
+
import { createPublicClient } from 'viem';
|
|
17
18
|
import { Archiver } from './archiver.js';
|
|
18
19
|
import { mapArchiverConfig } from './config.js';
|
|
19
20
|
import { ArchiverInstrumentation } from './modules/instrumentation.js';
|
|
@@ -21,13 +22,13 @@ import { ArchiverL1Synchronizer } from './modules/l1_synchronizer.js';
|
|
|
21
22
|
import { ARCHIVER_DB_VERSION, KVArchiverDataStore } from './store/kv_archiver_store.js';
|
|
22
23
|
import { L2TipsCache } from './store/l2_tips_cache.js';
|
|
23
24
|
export const ARCHIVER_STORE_NAME = 'archiver';
|
|
24
|
-
/** Creates an archiver store. */ export async function createArchiverStore(userConfig
|
|
25
|
+
/** Creates an archiver store. */ export async function createArchiverStore(userConfig) {
|
|
25
26
|
const config = {
|
|
26
27
|
...userConfig,
|
|
27
28
|
dataStoreMapSizeKb: userConfig.archiverStoreMapSizeKb ?? userConfig.dataStoreMapSizeKb
|
|
28
29
|
};
|
|
29
30
|
const store = await createStore(ARCHIVER_STORE_NAME, ARCHIVER_DB_VERSION, config);
|
|
30
|
-
return new KVArchiverDataStore(store, config.maxLogs
|
|
31
|
+
return new KVArchiverDataStore(store, config.maxLogs);
|
|
31
32
|
}
|
|
32
33
|
/**
|
|
33
34
|
* Creates a local archiver.
|
|
@@ -38,39 +39,39 @@ export const ARCHIVER_STORE_NAME = 'archiver';
|
|
|
38
39
|
*/ export async function createArchiver(config, deps, opts = {
|
|
39
40
|
blockUntilSync: true
|
|
40
41
|
}) {
|
|
41
|
-
const archiverStore = await createArchiverStore(config
|
|
42
|
-
epochDuration: config.aztecEpochDuration
|
|
43
|
-
});
|
|
42
|
+
const archiverStore = await createArchiverStore(config);
|
|
44
43
|
await registerProtocolContracts(archiverStore);
|
|
45
44
|
// Create Ethereum clients
|
|
46
45
|
const chain = createEthereumChain(config.l1RpcUrls, config.l1ChainId);
|
|
46
|
+
const httpTimeout = config.l1HttpTimeoutMS;
|
|
47
47
|
const publicClient = createPublicClient({
|
|
48
48
|
chain: chain.chainInfo,
|
|
49
|
-
transport:
|
|
50
|
-
|
|
51
|
-
|
|
49
|
+
transport: makeL1HttpTransport(config.l1RpcUrls, {
|
|
50
|
+
timeout: httpTimeout
|
|
51
|
+
}),
|
|
52
52
|
pollingInterval: config.viemPollingIntervalMS
|
|
53
53
|
});
|
|
54
54
|
// Create debug client using debug RPC URLs if available, otherwise fall back to regular RPC URLs
|
|
55
55
|
const debugRpcUrls = config.l1DebugRpcUrls.length > 0 ? config.l1DebugRpcUrls : config.l1RpcUrls;
|
|
56
56
|
const debugClient = createPublicClient({
|
|
57
57
|
chain: chain.chainInfo,
|
|
58
|
-
transport:
|
|
59
|
-
|
|
60
|
-
|
|
58
|
+
transport: makeL1HttpTransport(debugRpcUrls, {
|
|
59
|
+
timeout: httpTimeout
|
|
60
|
+
}),
|
|
61
61
|
pollingInterval: config.viemPollingIntervalMS
|
|
62
62
|
});
|
|
63
63
|
// Create L1 contract instances
|
|
64
64
|
const rollup = new RollupContract(publicClient, config.l1Contracts.rollupAddress);
|
|
65
65
|
const inbox = new InboxContract(publicClient, config.l1Contracts.inboxAddress);
|
|
66
66
|
// Fetch L1 constants from rollup contract
|
|
67
|
-
const [l1StartBlock, l1GenesisTime, proofSubmissionEpochs, genesisArchiveRoot, slashingProposerAddress, targetCommitteeSize] = await Promise.all([
|
|
67
|
+
const [l1StartBlock, l1GenesisTime, proofSubmissionEpochs, genesisArchiveRoot, slashingProposerAddress, targetCommitteeSize, rollupManaLimit] = await Promise.all([
|
|
68
68
|
rollup.getL1StartBlock(),
|
|
69
69
|
rollup.getL1GenesisTime(),
|
|
70
70
|
rollup.getProofSubmissionEpochs(),
|
|
71
71
|
rollup.getGenesisArchiveTreeRoot(),
|
|
72
72
|
rollup.getSlashingProposerAddress(),
|
|
73
|
-
rollup.getTargetCommitteeSize()
|
|
73
|
+
rollup.getTargetCommitteeSize(),
|
|
74
|
+
rollup.getManaLimit()
|
|
74
75
|
]);
|
|
75
76
|
const l1StartBlockHash = await publicClient.getBlock({
|
|
76
77
|
blockNumber: l1StartBlock,
|
|
@@ -86,7 +87,8 @@ export const ARCHIVER_STORE_NAME = 'archiver';
|
|
|
86
87
|
ethereumSlotDuration,
|
|
87
88
|
proofSubmissionEpochs: Number(proofSubmissionEpochs),
|
|
88
89
|
targetCommitteeSize,
|
|
89
|
-
genesisArchiveRoot: Fr.fromString(genesisArchiveRoot.toString())
|
|
90
|
+
genesisArchiveRoot: Fr.fromString(genesisArchiveRoot.toString()),
|
|
91
|
+
rollupManaLimit: Number(rollupManaLimit)
|
|
90
92
|
};
|
|
91
93
|
const archiverConfig = merge({
|
|
92
94
|
pollingIntervalMs: 10_000,
|
|
@@ -102,10 +104,7 @@ export const ARCHIVER_STORE_NAME = 'archiver';
|
|
|
102
104
|
// Create L2 tips cache shared by archiver and synchronizer
|
|
103
105
|
const l2TipsCache = new L2TipsCache(archiverStore.blockStore);
|
|
104
106
|
// Create the L1 synchronizer
|
|
105
|
-
const synchronizer = new ArchiverL1Synchronizer(publicClient, debugClient, rollup, inbox,
|
|
106
|
-
...config.l1Contracts,
|
|
107
|
-
slashingProposerAddress
|
|
108
|
-
}, archiverStore, archiverConfig, deps.blobClient, epochCache, deps.dateProvider ?? new DateProvider(), instrumentation, l1Constants, events, instrumentation.tracer, l2TipsCache, undefined);
|
|
107
|
+
const synchronizer = new ArchiverL1Synchronizer(publicClient, debugClient, rollup, inbox, archiverStore, archiverConfig, deps.blobClient, epochCache, deps.dateProvider ?? new DateProvider(), instrumentation, l1Constants, events, instrumentation.tracer, l2TipsCache, undefined);
|
|
109
108
|
const archiver = new Archiver(publicClient, debugClient, rollup, {
|
|
110
109
|
...config.l1Contracts,
|
|
111
110
|
slashingProposerAddress
|
|
@@ -113,23 +112,26 @@ export const ARCHIVER_STORE_NAME = 'archiver';
|
|
|
113
112
|
await archiver.start(opts.blockUntilSync);
|
|
114
113
|
return archiver;
|
|
115
114
|
}
|
|
116
|
-
/** Registers protocol contracts in the archiver store. */ export async function registerProtocolContracts(store) {
|
|
115
|
+
/** Registers protocol contracts in the archiver store. Idempotent — skips contracts that already exist (e.g. on node restart). */ export async function registerProtocolContracts(store) {
|
|
117
116
|
const blockNumber = 0;
|
|
118
117
|
for (const name of protocolContractNames){
|
|
119
118
|
const provider = new BundledProtocolContractsProvider();
|
|
120
119
|
const contract = await provider.getProtocolContractArtifact(name);
|
|
120
|
+
// Skip if already registered (happens on node restart with a persisted store).
|
|
121
|
+
if (await store.getContractClass(contract.contractClass.id)) {
|
|
122
|
+
continue;
|
|
123
|
+
}
|
|
124
|
+
const publicBytecodeCommitment = await computePublicBytecodeCommitment(contract.contractClass.packedBytecode);
|
|
121
125
|
const contractClassPublic = {
|
|
122
126
|
...contract.contractClass,
|
|
127
|
+
publicBytecodeCommitment,
|
|
123
128
|
privateFunctions: [],
|
|
124
129
|
utilityFunctions: []
|
|
125
130
|
};
|
|
126
131
|
const publicFunctionSignatures = contract.artifact.functions.filter((fn)=>fn.functionType === FunctionType.PUBLIC).map((fn)=>decodeFunctionSignature(fn.name, fn.parameters));
|
|
127
132
|
await store.registerContractFunctionSignatures(publicFunctionSignatures);
|
|
128
|
-
const bytecodeCommitment = await computePublicBytecodeCommitment(contractClassPublic.packedBytecode);
|
|
129
133
|
await store.addContractClasses([
|
|
130
134
|
contractClassPublic
|
|
131
|
-
], [
|
|
132
|
-
bytecodeCommitment
|
|
133
135
|
], BlockNumber(blockNumber));
|
|
134
136
|
await store.addContractInstances([
|
|
135
137
|
contract.instance
|
|
@@ -3,7 +3,7 @@ import { CheckpointNumber } from '@aztec/foundation/branded-types';
|
|
|
3
3
|
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
4
4
|
import { createLogger } from '@aztec/foundation/log';
|
|
5
5
|
import { RollupAbi } from '@aztec/l1-artifacts/RollupAbi';
|
|
6
|
-
import { createPublicClient, getAbiItem, http, toEventSelector } from 'viem';
|
|
6
|
+
import { createPublicClient, decodeEventLog, getAbiItem, http, toEventSelector } from 'viem';
|
|
7
7
|
import { mainnet } from 'viem/chains';
|
|
8
8
|
import { CalldataRetriever } from '../calldata_retriever.js';
|
|
9
9
|
const logger = createLogger('archiver:calldata-test');
|
|
@@ -74,47 +74,51 @@ async function main() {
|
|
|
74
74
|
throw new Error(`Transaction ${txHash} not found`);
|
|
75
75
|
}
|
|
76
76
|
logger.info(`Transaction found in block ${tx.blockNumber}`);
|
|
77
|
-
// For simplicity, use zero addresses for optional contract addresses
|
|
78
|
-
// In production, these would be fetched from the rollup contract or configuration
|
|
79
|
-
const slashingProposerAddress = EthAddress.ZERO;
|
|
80
|
-
const governanceProposerAddress = EthAddress.ZERO;
|
|
81
|
-
const slashFactoryAddress = undefined;
|
|
82
|
-
logger.info('Using zero addresses for governance/slashing (can be configured if needed)');
|
|
83
77
|
// Create CalldataRetriever
|
|
84
|
-
const retriever = new CalldataRetriever(publicClient, publicClient, targetCommitteeSize, undefined, logger,
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
slashingProposerAddress,
|
|
88
|
-
slashFactoryAddress
|
|
89
|
-
});
|
|
90
|
-
// Extract checkpoint number from transaction logs
|
|
91
|
-
logger.info('Decoding transaction to extract checkpoint number...');
|
|
78
|
+
const retriever = new CalldataRetriever(publicClient, publicClient, targetCommitteeSize, undefined, logger, rollupAddress);
|
|
79
|
+
// Extract checkpoint number and hashes from transaction logs
|
|
80
|
+
logger.info('Decoding transaction to extract checkpoint number and hashes...');
|
|
92
81
|
const receipt = await publicClient.getTransactionReceipt({
|
|
93
82
|
hash: txHash
|
|
94
83
|
});
|
|
95
|
-
// Look for CheckpointProposed event
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
84
|
+
// Look for CheckpointProposed event
|
|
85
|
+
const checkpointProposedEventAbi = getAbiItem({
|
|
86
|
+
abi: RollupAbi,
|
|
87
|
+
name: 'CheckpointProposed'
|
|
88
|
+
});
|
|
89
|
+
const checkpointProposedLog = receipt.logs.find((log)=>{
|
|
99
90
|
try {
|
|
100
|
-
return log.address.toLowerCase() === rollupAddress.toString().toLowerCase() && log.topics[0] === toEventSelector(
|
|
101
|
-
abi: RollupAbi,
|
|
102
|
-
name: 'CheckpointProposed'
|
|
103
|
-
}));
|
|
91
|
+
return log.address.toLowerCase() === rollupAddress.toString().toLowerCase() && log.topics[0] === toEventSelector(checkpointProposedEventAbi);
|
|
104
92
|
} catch {
|
|
105
93
|
return false;
|
|
106
94
|
}
|
|
107
95
|
});
|
|
108
|
-
if (!
|
|
96
|
+
if (!checkpointProposedLog || checkpointProposedLog.topics[1] === undefined) {
|
|
109
97
|
throw new Error(`Checkpoint proposed event not found`);
|
|
110
98
|
}
|
|
111
|
-
const checkpointNumber = CheckpointNumber.fromBigInt(BigInt(
|
|
99
|
+
const checkpointNumber = CheckpointNumber.fromBigInt(BigInt(checkpointProposedLog.topics[1]));
|
|
100
|
+
// Decode the full event to extract attestationsHash and payloadDigest
|
|
101
|
+
const decodedEvent = decodeEventLog({
|
|
102
|
+
abi: RollupAbi,
|
|
103
|
+
data: checkpointProposedLog.data,
|
|
104
|
+
topics: checkpointProposedLog.topics
|
|
105
|
+
});
|
|
106
|
+
const eventArgs = decodedEvent.args;
|
|
107
|
+
if (!eventArgs.attestationsHash || !eventArgs.payloadDigest) {
|
|
108
|
+
throw new Error(`CheckpointProposed event missing attestationsHash or payloadDigest`);
|
|
109
|
+
}
|
|
110
|
+
const expectedHashes = {
|
|
111
|
+
attestationsHash: eventArgs.attestationsHash,
|
|
112
|
+
payloadDigest: eventArgs.payloadDigest
|
|
113
|
+
};
|
|
114
|
+
logger.info(`Checkpoint Number: ${checkpointNumber}`);
|
|
115
|
+
logger.info(`Attestations Hash: ${expectedHashes.attestationsHash}`);
|
|
116
|
+
logger.info(`Payload Digest: ${expectedHashes.payloadDigest}`);
|
|
112
117
|
logger.info('');
|
|
113
118
|
logger.info('Retrieving checkpoint from rollup transaction...');
|
|
114
119
|
logger.info('');
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
logger.info(' Successfully retrieved block header!');
|
|
120
|
+
const result = await retriever.getCheckpointFromRollupTx(txHash, [], checkpointNumber, expectedHashes);
|
|
121
|
+
logger.info(' Successfully retrieved block header!');
|
|
118
122
|
logger.info('');
|
|
119
123
|
logger.info('Block Header Details:');
|
|
120
124
|
logger.info('====================');
|