@aztec/archiver 0.0.1-commit.2f68f620 → 0.0.1-commit.321f6a9
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 +22 -4
- package/dest/archiver.d.ts.map +1 -1
- package/dest/archiver.js +79 -35
- package/dest/config.d.ts +5 -4
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +27 -5
- package/dest/factory.d.ts +8 -2
- package/dest/factory.d.ts.map +1 -1
- package/dest/factory.js +37 -3
- package/dest/l1/calldata_retriever.d.ts +8 -1
- package/dest/l1/calldata_retriever.d.ts.map +1 -1
- package/dest/l1/calldata_retriever.js +7 -6
- package/dest/l1/data_retrieval.d.ts +7 -2
- package/dest/l1/data_retrieval.d.ts.map +1 -1
- package/dest/modules/contract_data_source_adapter.d.ts +2 -2
- package/dest/modules/contract_data_source_adapter.d.ts.map +1 -1
- package/dest/modules/contract_data_source_adapter.js +1 -9
- package/dest/modules/data_source_base.d.ts +2 -3
- package/dest/modules/data_source_base.d.ts.map +1 -1
- package/dest/modules/data_source_base.js +9 -35
- package/dest/modules/data_store_updater.d.ts +1 -1
- package/dest/modules/data_store_updater.d.ts.map +1 -1
- package/dest/modules/data_store_updater.js +4 -3
- package/dest/modules/instrumentation.d.ts +9 -1
- package/dest/modules/instrumentation.d.ts.map +1 -1
- package/dest/modules/instrumentation.js +23 -2
- package/dest/modules/l1_synchronizer.d.ts +3 -3
- package/dest/modules/l1_synchronizer.d.ts.map +1 -1
- package/dest/modules/l1_synchronizer.js +78 -41
- package/dest/modules/validation.d.ts +29 -7
- package/dest/modules/validation.d.ts.map +1 -1
- package/dest/modules/validation.js +31 -13
- package/dest/store/block_store.d.ts +20 -11
- package/dest/store/block_store.d.ts.map +1 -1
- package/dest/store/block_store.js +43 -25
- 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 +19 -1
- 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 +18 -1
- 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 +3 -3
- package/dest/store/log_store_codec.d.ts +9 -1
- package/dest/store/log_store_codec.d.ts.map +1 -1
- package/dest/store/log_store_codec.js +9 -0
- package/dest/test/fake_l1_state.js +3 -3
- package/dest/test/mock_l1_to_l2_message_source.d.ts +1 -1
- package/dest/test/mock_l1_to_l2_message_source.d.ts.map +1 -1
- package/dest/test/mock_l1_to_l2_message_source.js +1 -2
- package/dest/test/mock_l2_block_source.d.ts +1 -4
- package/dest/test/mock_l2_block_source.d.ts.map +1 -1
- package/dest/test/mock_l2_block_source.js +8 -22
- package/dest/test/mock_structs.d.ts +1 -1
- package/dest/test/mock_structs.d.ts.map +1 -1
- package/dest/test/mock_structs.js +2 -2
- package/dest/test/noop_l1_archiver.d.ts +7 -3
- package/dest/test/noop_l1_archiver.d.ts.map +1 -1
- package/dest/test/noop_l1_archiver.js +9 -6
- package/package.json +14 -13
- package/src/archiver.ts +107 -41
- package/src/config.ts +34 -9
- package/src/factory.ts +46 -4
- package/src/l1/calldata_retriever.ts +13 -6
- package/src/l1/data_retrieval.ts +8 -1
- package/src/modules/contract_data_source_adapter.ts +1 -10
- package/src/modules/data_source_base.ts +9 -38
- package/src/modules/data_store_updater.ts +4 -3
- package/src/modules/instrumentation.ts +15 -2
- package/src/modules/l1_synchronizer.ts +120 -57
- package/src/modules/validation.ts +71 -15
- package/src/store/block_store.ts +42 -31
- package/src/store/contract_class_store.ts +19 -1
- package/src/store/contract_instance_store.ts +18 -1
- package/src/store/log_store.ts +3 -2
- package/src/store/log_store_codec.ts +11 -0
- package/src/test/fake_l1_state.ts +3 -3
- package/src/test/mock_l1_to_l2_message_source.ts +0 -1
- package/src/test/mock_l2_block_source.ts +8 -22
- package/src/test/mock_structs.ts +5 -2
- package/src/test/noop_l1_archiver.ts +15 -5
package/dest/archiver.d.ts
CHANGED
|
@@ -30,6 +30,11 @@ export type ArchiverDeps = {
|
|
|
30
30
|
epochCache?: EpochCache;
|
|
31
31
|
dateProvider?: DateProvider;
|
|
32
32
|
};
|
|
33
|
+
/** Minimal dependency for observing whether a checkpoint proposal was received for a slot. */
|
|
34
|
+
export type CheckpointProposalPresence = {
|
|
35
|
+
/** Returns true when a checkpoint proposal for `slot` has been retained locally. */
|
|
36
|
+
hasCheckpointProposalForSlot(slot: SlotNumber): Promise<boolean>;
|
|
37
|
+
};
|
|
33
38
|
/**
|
|
34
39
|
* Pulls checkpoints in a non-blocking manner and provides interface for their retrieval.
|
|
35
40
|
* Responsible for handling robust L1 polling so that other components do not need to
|
|
@@ -49,6 +54,7 @@ export declare class Archiver extends ArchiverDataSourceBase implements L2BlockS
|
|
|
49
54
|
genesisArchiveRoot: Fr;
|
|
50
55
|
};
|
|
51
56
|
private readonly dateProvider;
|
|
57
|
+
private checkpointProposalPresence;
|
|
52
58
|
private readonly log;
|
|
53
59
|
/** Event emitter for archiver events (L2BlockProven, L2PruneUnproven, L2PruneUncheckpointed, etc). */
|
|
54
60
|
readonly events: ArchiverEmitter;
|
|
@@ -66,6 +72,8 @@ export declare class Archiver extends ArchiverDataSourceBase implements L2BlockS
|
|
|
66
72
|
private readonly updater;
|
|
67
73
|
/** In-memory cache for L2 chain tips. */
|
|
68
74
|
private readonly l2TipsCache;
|
|
75
|
+
/** Consensus timing model used for proposed-checkpoint arrival expectations. */
|
|
76
|
+
private readonly timetable;
|
|
69
77
|
readonly tracer: Tracer;
|
|
70
78
|
private readonly instrumentation;
|
|
71
79
|
/**
|
|
@@ -98,12 +106,14 @@ export declare class Archiver extends ArchiverDataSourceBase implements L2BlockS
|
|
|
98
106
|
maxAllowedEthClientDriftSeconds: number;
|
|
99
107
|
ethereumAllowNoDebugHosts?: boolean;
|
|
100
108
|
skipHistoricalLogsCheck?: boolean;
|
|
101
|
-
|
|
102
|
-
|
|
109
|
+
checkpointProposalSyncGrace: number;
|
|
110
|
+
orphanPruneNoProposalTolerance: number;
|
|
111
|
+
skipOrphanProposedBlockPruning: boolean;
|
|
112
|
+
blockDuration: number;
|
|
103
113
|
}, blobClient: BlobClientInterface, instrumentation: ArchiverInstrumentation, l1Constants: L1RollupConstants & {
|
|
104
114
|
l1StartBlockHash: Buffer32;
|
|
105
115
|
genesisArchiveRoot: Fr;
|
|
106
|
-
}, synchronizer: ArchiverL1Synchronizer, events: ArchiverEmitter, initialHeader: BlockHeader, initialBlockHash: BlockHash, l2TipsCache: L2TipsCache, dateProvider: DateProvider, log?: Logger);
|
|
116
|
+
}, synchronizer: ArchiverL1Synchronizer, events: ArchiverEmitter, initialHeader: BlockHeader, initialBlockHash: BlockHash, l2TipsCache: L2TipsCache, dateProvider: DateProvider, checkpointProposalPresence?: CheckpointProposalPresence, log?: Logger);
|
|
107
117
|
/**
|
|
108
118
|
* Returns the L2-to-L1 membership witness for `message` emitted by tx `txHash`. The node selects
|
|
109
119
|
* the smallest partial-proof root on the Outbox that covers the tx's checkpoint and builds the
|
|
@@ -126,6 +136,8 @@ export declare class Archiver extends ArchiverDataSourceBase implements L2BlockS
|
|
|
126
136
|
*/
|
|
127
137
|
start(blockUntilSynced: boolean): Promise<void>;
|
|
128
138
|
syncImmediate(): Promise<void>;
|
|
139
|
+
/** Sets the proposal-presence provider used by orphan proposed-block pruning. */
|
|
140
|
+
setCheckpointProposalPresence(checkpointProposalPresence: CheckpointProposalPresence): void;
|
|
129
141
|
trySyncImmediate(): Promise<void> | undefined;
|
|
130
142
|
/**
|
|
131
143
|
* Queues a block to be added to the archiver store and triggers processing.
|
|
@@ -168,9 +180,15 @@ export declare class Archiver extends ArchiverDataSourceBase implements L2BlockS
|
|
|
168
180
|
/** Returns whether the archiver has completed an initial sync run successfully. */
|
|
169
181
|
isInitialSyncComplete(): boolean;
|
|
170
182
|
removeCheckpointsAfter(checkpointNumber: CheckpointNumber): Promise<boolean>;
|
|
183
|
+
/**
|
|
184
|
+
* Removes all uncheckpointed blocks strictly after `blockNumber`, along with the proposed checkpoints
|
|
185
|
+
* that referenced them. Used by the AutomineSequencer to undo a local insert whose propose tx failed
|
|
186
|
+
* to land on L1 (no reorg needed — nothing reached L1). Refuses to touch checkpointed blocks.
|
|
187
|
+
*/
|
|
188
|
+
removeUncheckpointedBlocksAfter(blockNumber: BlockNumber): Promise<L2Block[]>;
|
|
171
189
|
/** Used by TXE to add checkpoints directly without syncing from L1. */
|
|
172
190
|
addCheckpoints(checkpoints: PublishedCheckpoint[], pendingChainValidationStatus?: ValidateCheckpointResult): Promise<boolean>;
|
|
173
191
|
getL2Tips(): Promise<L2Tips>;
|
|
174
192
|
rollbackTo(targetL2BlockNumber: BlockNumber): Promise<void>;
|
|
175
193
|
}
|
|
176
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
194
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJjaGl2ZXIuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9hcmNoaXZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3JFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNoRCxPQUFPLEVBQXVCLGNBQWMsRUFBRSxjQUFjLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNoRyxPQUFPLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQ2pGLE9BQU8sS0FBSyxFQUFFLGdCQUFnQixFQUFFLHFCQUFxQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDckYsT0FBTyxFQUFFLFdBQVcsRUFBRSxnQkFBZ0IsRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDekcsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRXBELE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNwRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDM0QsT0FBTyxFQUFFLEtBQUssTUFBTSxFQUFnQixNQUFNLHVCQUF1QixDQUFDO0FBRWxFLE9BQU8sRUFBRSxjQUFjLEVBQTJCLE1BQU0sbUNBQW1DLENBQUM7QUFDNUYsT0FBTyxFQUFFLFlBQVksRUFBVyxNQUFNLHlCQUF5QixDQUFDO0FBQ2hFLE9BQU8sRUFDTCxLQUFLLGVBQWUsRUFDcEIsS0FBSyxTQUFTLEVBQ2QsT0FBTyxFQUNQLEtBQUssV0FBVyxFQUVoQixLQUFLLE1BQU0sRUFDWCxLQUFLLHdCQUF3QixFQUU5QixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sRUFBRSxLQUFLLHVCQUF1QixFQUFFLG1CQUFtQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDN0YsT0FB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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,
|
|
1
|
+
{"version":3,"file":"archiver.d.ts","sourceRoot":"","sources":["../src/archiver.ts"],"names":[],"mappings":"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"}
|
package/dest/archiver.js
CHANGED
|
@@ -371,18 +371,18 @@ function _apply_decs_2203_r(targetClass, memberDecs, classDecs, parentClass) {
|
|
|
371
371
|
return (_apply_decs_2203_r = applyDecs2203RFactory())(targetClass, memberDecs, classDecs, parentClass);
|
|
372
372
|
}
|
|
373
373
|
var _dec, _initProto;
|
|
374
|
-
import { PROPOSER_PIPELINING_SLOT_OFFSET } from '@aztec/epoch-cache';
|
|
375
374
|
import { BlockTagTooOldError } from '@aztec/ethereum/contracts';
|
|
376
375
|
import { BlockNumber, EpochNumber, SlotNumber } from '@aztec/foundation/branded-types';
|
|
377
376
|
import { Buffer32 } from '@aztec/foundation/buffer';
|
|
378
|
-
import { merge
|
|
377
|
+
import { merge } from '@aztec/foundation/collection';
|
|
379
378
|
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
380
379
|
import { createLogger } from '@aztec/foundation/log';
|
|
381
380
|
import { promiseWithResolvers } from '@aztec/foundation/promise';
|
|
382
381
|
import { RunningPromise, makeLoggingErrorHandler } from '@aztec/foundation/running-promise';
|
|
383
382
|
import { elapsed } from '@aztec/foundation/timer';
|
|
384
|
-
import { L2BlockSourceEvents } from '@aztec/stdlib/block';
|
|
383
|
+
import { L2BlockSourceEvents, l2TipsEqual } from '@aztec/stdlib/block';
|
|
385
384
|
import { getEpochAtSlot, getSlotAtNextL1Block, getSlotRangeForEpoch, getTimestampForSlot, getTimestampRangeForEpoch } from '@aztec/stdlib/epoch-helpers';
|
|
385
|
+
import { ConsensusTimetable } from '@aztec/stdlib/timetable';
|
|
386
386
|
import { trackSpan } from '@aztec/telemetry-client';
|
|
387
387
|
import { mapArchiverConfig } from './config.js';
|
|
388
388
|
import { BlockAlreadyCheckpointedError, BlockOrCheckpointSlotExpiredError, NoBlobBodiesFoundError } from './errors.js';
|
|
@@ -392,6 +392,9 @@ import { ArchiverDataSourceBase } from './modules/data_source_base.js';
|
|
|
392
392
|
import { ArchiverDataStoreUpdater } from './modules/data_store_updater.js';
|
|
393
393
|
import { OutboxTreesResolver } from './modules/outbox_trees_resolver.js';
|
|
394
394
|
import { backupArchiverDataStores, getArchiverSynchPoint } from './store/data_stores.js';
|
|
395
|
+
const noCheckpointProposalPresence = {
|
|
396
|
+
hasCheckpointProposalForSlot: ()=>Promise.resolve(false)
|
|
397
|
+
};
|
|
395
398
|
_dec = trackSpan('Archiver.sync');
|
|
396
399
|
/**
|
|
397
400
|
* Pulls checkpoints in a non-blocking manner and provides interface for their retrieval.
|
|
@@ -408,6 +411,7 @@ _dec = trackSpan('Archiver.sync');
|
|
|
408
411
|
blobClient;
|
|
409
412
|
l1Constants;
|
|
410
413
|
dateProvider;
|
|
414
|
+
checkpointProposalPresence;
|
|
411
415
|
log;
|
|
412
416
|
static{
|
|
413
417
|
({ e: [_initProto] } = _apply_decs_2203_r(this, [
|
|
@@ -427,6 +431,7 @@ _dec = trackSpan('Archiver.sync');
|
|
|
427
431
|
/** Queue of blocks and checkpoints to be added to the store, processed by the sync loop. */ inboundQueue;
|
|
428
432
|
/** Helper to handle updates to the store */ updater;
|
|
429
433
|
/** In-memory cache for L2 chain tips. */ l2TipsCache;
|
|
434
|
+
/** Consensus timing model used for proposed-checkpoint arrival expectations. */ timetable;
|
|
430
435
|
tracer;
|
|
431
436
|
instrumentation;
|
|
432
437
|
/**
|
|
@@ -449,14 +454,19 @@ _dec = trackSpan('Archiver.sync');
|
|
|
449
454
|
* @param l2TipsCache - In-memory cache for L2 chain tips.
|
|
450
455
|
* @param dateProvider - Provider for current date/time, used for wall-clock orphan-block pruning.
|
|
451
456
|
* @param log - A logger.
|
|
452
|
-
*/ constructor(publicClient, debugClient, rollup, outbox, l1Addresses, dataStores, config, blobClient, instrumentation, l1Constants, synchronizer, events, initialHeader, initialBlockHash, l2TipsCache, dateProvider, log = createLogger('archiver')){
|
|
453
|
-
super(dataStores, l1Constants, initialHeader, initialBlockHash, l1Constants.genesisArchiveRoot), this.publicClient = publicClient, this.debugClient = debugClient, this.rollup = rollup, this.outbox = outbox, this.l1Addresses = l1Addresses, this.dataStores = dataStores, this.config = config, this.blobClient = blobClient, this.l1Constants = l1Constants, this.dateProvider = dateProvider, this.log = log, this.initialSyncComplete = (_initProto(this), false), this.inboundQueue = [];
|
|
457
|
+
*/ constructor(publicClient, debugClient, rollup, outbox, l1Addresses, dataStores, config, blobClient, instrumentation, l1Constants, synchronizer, events, initialHeader, initialBlockHash, l2TipsCache, dateProvider, checkpointProposalPresence = noCheckpointProposalPresence, log = createLogger('archiver')){
|
|
458
|
+
super(dataStores, l1Constants, initialHeader, initialBlockHash, l1Constants.genesisArchiveRoot), this.publicClient = publicClient, this.debugClient = debugClient, this.rollup = rollup, this.outbox = outbox, this.l1Addresses = l1Addresses, this.dataStores = dataStores, this.config = config, this.blobClient = blobClient, this.l1Constants = l1Constants, this.dateProvider = dateProvider, this.checkpointProposalPresence = checkpointProposalPresence, this.log = log, this.initialSyncComplete = (_initProto(this), false), this.inboundQueue = [];
|
|
454
459
|
this.tracer = instrumentation.tracer;
|
|
455
460
|
this.instrumentation = instrumentation;
|
|
456
461
|
this.initialSyncPromise = promiseWithResolvers();
|
|
457
462
|
this.synchronizer = synchronizer;
|
|
458
463
|
this.events = events;
|
|
459
464
|
this.l2TipsCache = l2TipsCache;
|
|
465
|
+
this.timetable = new ConsensusTimetable({
|
|
466
|
+
l1Constants,
|
|
467
|
+
blockDuration: this.config.blockDuration,
|
|
468
|
+
checkpointProposalSyncGrace: this.config.checkpointProposalSyncGrace
|
|
469
|
+
});
|
|
460
470
|
this.updater = new ArchiverDataStoreUpdater(this.dataStores, this.l2TipsCache, {
|
|
461
471
|
rollupManaLimit: l1Constants.rollupManaLimit
|
|
462
472
|
});
|
|
@@ -520,6 +530,9 @@ _dec = trackSpan('Archiver.sync');
|
|
|
520
530
|
syncImmediate() {
|
|
521
531
|
return this.runningPromise.trigger();
|
|
522
532
|
}
|
|
533
|
+
/** Sets the proposal-presence provider used by orphan proposed-block pruning. */ setCheckpointProposalPresence(checkpointProposalPresence) {
|
|
534
|
+
this.checkpointProposalPresence = checkpointProposalPresence;
|
|
535
|
+
}
|
|
523
536
|
trySyncImmediate() {
|
|
524
537
|
try {
|
|
525
538
|
return this.syncImmediate();
|
|
@@ -564,8 +577,9 @@ _dec = trackSpan('Archiver.sync');
|
|
|
564
577
|
* Called at the beginning of each sync iteration.
|
|
565
578
|
* Items are processed in the order they were queued.
|
|
566
579
|
*/ async processInboundQueue() {
|
|
580
|
+
const blocksAdded = [];
|
|
567
581
|
if (this.inboundQueue.length === 0) {
|
|
568
|
-
return;
|
|
582
|
+
return blocksAdded;
|
|
569
583
|
}
|
|
570
584
|
// Take all items from the queue
|
|
571
585
|
const queuedItems = this.inboundQueue.splice(0, this.inboundQueue.length);
|
|
@@ -597,6 +611,7 @@ _dec = trackSpan('Archiver.sync');
|
|
|
597
611
|
if (type === 'block') {
|
|
598
612
|
const [durationMs] = await elapsed(()=>this.updater.addProposedBlock(item.block));
|
|
599
613
|
this.instrumentation.processNewProposedBlock(durationMs, item.block);
|
|
614
|
+
blocksAdded.push(item.block);
|
|
600
615
|
} else {
|
|
601
616
|
await this.updater.addProposedCheckpoint(item.checkpoint);
|
|
602
617
|
}
|
|
@@ -605,6 +620,7 @@ _dec = trackSpan('Archiver.sync');
|
|
|
605
620
|
} catch (err) {
|
|
606
621
|
if (err instanceof BlockAlreadyCheckpointedError) {
|
|
607
622
|
this.log.debug(`Proposed block ${itemNumber} matches already checkpointed block, ignoring late proposal`);
|
|
623
|
+
// A late proposal that matches an already-checkpointed block adds nothing new, so it is not appended.
|
|
608
624
|
resolve();
|
|
609
625
|
continue;
|
|
610
626
|
}
|
|
@@ -615,6 +631,7 @@ _dec = trackSpan('Archiver.sync');
|
|
|
615
631
|
reject(err);
|
|
616
632
|
}
|
|
617
633
|
}
|
|
634
|
+
return blocksAdded;
|
|
618
635
|
}
|
|
619
636
|
waitForInitialSync() {
|
|
620
637
|
return this.initialSyncPromise.promise;
|
|
@@ -622,46 +639,63 @@ _dec = trackSpan('Archiver.sync');
|
|
|
622
639
|
/**
|
|
623
640
|
* Fetches logs from L1 contracts and processes them.
|
|
624
641
|
*/ async sync() {
|
|
642
|
+
// Capture the tips before any mutation so the aggregate event can report what moved this pass.
|
|
643
|
+
const fromTips = await this.getL2Tips();
|
|
644
|
+
// Accumulate the blocks added across the pass's sub-steps (queued proposals + L1 checkpoint payloads).
|
|
645
|
+
const blocksAdded = [];
|
|
625
646
|
// Process any queued blocks first, before doing L1 sync
|
|
626
|
-
await this.processInboundQueue();
|
|
647
|
+
blocksAdded.push(...await this.processInboundQueue());
|
|
627
648
|
// Now perform L1 sync
|
|
628
|
-
await this.syncFromL1();
|
|
629
|
-
// Prune proposed blocks with no corresponding proposed checkpoint
|
|
649
|
+
blocksAdded.push(...await this.syncFromL1());
|
|
650
|
+
// Prune proposed blocks with no corresponding proposed checkpoint after the appropriate materialization deadline.
|
|
630
651
|
await this.pruneOrphanProposedBlocks();
|
|
652
|
+
// Emit a single aggregate update event after all pass work has committed and the tips cache has refreshed,
|
|
653
|
+
// so `toTips` and the source state observed by listeners are consistent with the event payload. The pass
|
|
654
|
+
// mutated state if the tips moved (added blocks, a prune, or a thin tier movement) or blocks were added; a
|
|
655
|
+
// fully-synced no-op pass emits nothing.
|
|
656
|
+
const toTips = await this.getL2Tips();
|
|
657
|
+
if (!l2TipsEqual(fromTips, toTips) || blocksAdded.length > 0) {
|
|
658
|
+
this.events.emit(L2BlockSourceEvents.L2BlockSourceUpdated, {
|
|
659
|
+
type: L2BlockSourceEvents.L2BlockSourceUpdated,
|
|
660
|
+
fromTips,
|
|
661
|
+
toTips,
|
|
662
|
+
blocksAdded
|
|
663
|
+
});
|
|
664
|
+
}
|
|
631
665
|
}
|
|
632
666
|
/**
|
|
633
667
|
* Prunes a block-only local tip that was built atop a checkpoint that was never itself proposed.
|
|
634
668
|
*
|
|
635
669
|
* Under pipelining, a proposer publishes the blocks for a checkpoint (block-only proposals) before
|
|
636
670
|
* assembling and publishing the enclosing proposed checkpoint at the end of the build slot. A node
|
|
637
|
-
* that received those blocks but never the proposed checkpoint is left with an orphan tip it must
|
|
638
|
-
*
|
|
639
|
-
*
|
|
640
|
-
*
|
|
671
|
+
* that received those blocks but never the proposed checkpoint is left with an orphan tip it must not build on.
|
|
672
|
+
* If no checkpoint proposal was received for the orphan slot, we prune after the receive deadline plus local
|
|
673
|
+
* tolerance. If a checkpoint proposal was received but has not materialized into proposed archiver state,
|
|
674
|
+
* we prune after the consensus materialization deadline.
|
|
641
675
|
*
|
|
642
676
|
* The uncheckpointed suffix is scanned in order. Blocks covered by proposed checkpoints are left in
|
|
643
677
|
* place; the first block not covered by a proposed checkpoint starts the orphan suffix to prune.
|
|
644
678
|
*/ async pruneOrphanProposedBlocks() {
|
|
645
|
-
|
|
646
|
-
// whose enclosing checkpoint never arrived over gossip. The test-only automine sequencer is
|
|
647
|
-
// non-pipelined — it publishes each checkpoint synchronously in the slot it builds — so it
|
|
648
|
-
// never produces orphan proposed blocks. Running the prune there would race its two-step local
|
|
649
|
-
// push (addBlock then addProposedCheckpoint) and delete the block before its checkpoint attaches.
|
|
650
|
-
if (!this.config.enableOrphanProposedBlockPruning) {
|
|
679
|
+
if (this.config.skipOrphanProposedBlockPruning) {
|
|
651
680
|
return;
|
|
652
681
|
}
|
|
653
682
|
const tips = await this.getL2Tips();
|
|
654
683
|
const now = BigInt(this.dateProvider.nowInSeconds());
|
|
655
|
-
|
|
684
|
+
// Frontier block covered by a proposed (or, falling back, confirmed) checkpoint. Blocks beyond it
|
|
685
|
+
// have no enclosing checkpoint proposal and are the orphan-pruning candidates.
|
|
686
|
+
const proposedCheckpointBlockNumber = await this.stores.blocks.getProposedCheckpointL2BlockNumber();
|
|
656
687
|
// The proposed tip is a proposed-checkpointed block, so there are no orphan proposed blocks to prune
|
|
657
|
-
if (
|
|
658
|
-
this.log.trace(`No orphan proposed blocks to prune: proposed tip ${tips.proposed.number} is checkpointed`,
|
|
688
|
+
if (proposedCheckpointBlockNumber === tips.proposed.number) {
|
|
689
|
+
this.log.trace(`No orphan proposed blocks to prune: proposed tip ${tips.proposed.number} is checkpointed`, {
|
|
690
|
+
proposed: tips.proposed,
|
|
691
|
+
proposedCheckpointBlockNumber
|
|
692
|
+
});
|
|
659
693
|
return;
|
|
660
694
|
}
|
|
661
695
|
// Load the blocks that are candidates for pruning (ie blocks without a proposed checkpoint covering them)
|
|
662
696
|
const blocksWithoutProposedCheckpoint = await this.stores.blocks.getBlocksData({
|
|
663
|
-
from: BlockNumber(
|
|
664
|
-
limit: tips.proposed.number -
|
|
697
|
+
from: BlockNumber(proposedCheckpointBlockNumber + 1),
|
|
698
|
+
limit: tips.proposed.number - proposedCheckpointBlockNumber
|
|
665
699
|
});
|
|
666
700
|
// Iterate through them in order, the first one with a slot that should have received a proposed checkpoint
|
|
667
701
|
// is the first orphan block, and all blocks after it are also orphaned and should be pruned.
|
|
@@ -674,25 +708,27 @@ _dec = trackSpan('Archiver.sync');
|
|
|
674
708
|
continue;
|
|
675
709
|
}
|
|
676
710
|
lastSlotChecked = blockSlot;
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
const
|
|
680
|
-
|
|
681
|
-
//
|
|
682
|
-
|
|
711
|
+
const hasCheckpointProposal = await this.checkpointProposalPresence.hasCheckpointProposalForSlot(blockSlot);
|
|
712
|
+
const deadlineType = hasCheckpointProposal ? 'checkpoint-proposal-synced' : 'checkpoint-proposal-received';
|
|
713
|
+
const selectedDeadline = BigInt(hasCheckpointProposal ? this.timetable.getCheckpointProposalSyncedDeadline(blockSlot) : Math.ceil(this.timetable.getCheckpointProposalReceiveDeadline(blockSlot) + this.config.orphanPruneNoProposalTolerance));
|
|
714
|
+
// If it's still not checkpointed once strictly past the selected deadline, prune it along with all blocks after
|
|
715
|
+
// it. A proposal may still legitimately arrive or materialize at exactly its deadline, so the tip is only
|
|
716
|
+
// orphaned once that instant has fully elapsed.
|
|
717
|
+
if (now > selectedDeadline) {
|
|
683
718
|
const pruneAfterBlockNumber = BlockNumber(blockNumber - 1);
|
|
684
719
|
this.log.warn(`Pruning orphan blocks after block ${pruneAfterBlockNumber}: block at slot ${blockSlot} belongs to ` + `checkpoint ${blockData.checkpointNumber} which has no matching proposed checkpoint`, {
|
|
685
720
|
firstUncheckpointedBlockHeader: blockData.header.toInspect(),
|
|
686
721
|
blockCheckpointNumber: blockData.checkpointNumber,
|
|
687
722
|
blockNumber,
|
|
688
723
|
blockSlot,
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
724
|
+
hasCheckpointProposal,
|
|
725
|
+
deadlineType,
|
|
726
|
+
selectedDeadline,
|
|
692
727
|
now
|
|
693
728
|
});
|
|
694
729
|
const prunedBlocks = await this.updater.removeBlocksWithoutProposedCheckpointAfter(pruneAfterBlockNumber);
|
|
695
730
|
if (prunedBlocks.length > 0) {
|
|
731
|
+
this.instrumentation.recordPrune('orphan');
|
|
696
732
|
this.events.emit(L2BlockSourceEvents.L2PruneUncheckpointed, {
|
|
697
733
|
type: L2BlockSourceEvents.L2PruneUncheckpointed,
|
|
698
734
|
slotNumber: blockSlot,
|
|
@@ -702,13 +738,13 @@ _dec = trackSpan('Archiver.sync');
|
|
|
702
738
|
return;
|
|
703
739
|
}
|
|
704
740
|
}
|
|
705
|
-
this.log.trace('No orphan proposed blocks to prune: all uncheckpointed blocks are still within
|
|
741
|
+
this.log.trace('No orphan proposed blocks to prune: all uncheckpointed blocks are still within deadline', {
|
|
706
742
|
blocksWithoutProposedCheckpoint: blocksWithoutProposedCheckpoint.map((b)=>b.header.toInspect())
|
|
707
743
|
});
|
|
708
744
|
}
|
|
709
745
|
async syncFromL1() {
|
|
710
746
|
// Delegate to the L1 synchronizer
|
|
711
|
-
await this.synchronizer.syncFromL1(this.initialSyncComplete);
|
|
747
|
+
const blocksAdded = await this.synchronizer.syncFromL1(this.initialSyncComplete);
|
|
712
748
|
// Check if we've completed initial sync
|
|
713
749
|
const currentL1BlockNumber = this.synchronizer.getL1BlockNumber();
|
|
714
750
|
if (currentL1BlockNumber !== undefined && !this.initialSyncComplete) {
|
|
@@ -724,6 +760,7 @@ _dec = trackSpan('Archiver.sync');
|
|
|
724
760
|
this.initialSyncPromise.resolve();
|
|
725
761
|
}
|
|
726
762
|
}
|
|
763
|
+
return blocksAdded;
|
|
727
764
|
}
|
|
728
765
|
/** Resumes the archiver after a stop. */ resume() {
|
|
729
766
|
if (this.runningPromise.isRunning()) {
|
|
@@ -838,6 +875,13 @@ _dec = trackSpan('Archiver.sync');
|
|
|
838
875
|
removeCheckpointsAfter(checkpointNumber) {
|
|
839
876
|
return this.updater.removeCheckpointsAfter(checkpointNumber);
|
|
840
877
|
}
|
|
878
|
+
/**
|
|
879
|
+
* Removes all uncheckpointed blocks strictly after `blockNumber`, along with the proposed checkpoints
|
|
880
|
+
* that referenced them. Used by the AutomineSequencer to undo a local insert whose propose tx failed
|
|
881
|
+
* to land on L1 (no reorg needed — nothing reached L1). Refuses to touch checkpointed blocks.
|
|
882
|
+
*/ removeUncheckpointedBlocksAfter(blockNumber) {
|
|
883
|
+
return this.updater.removeUncheckpointedBlocksAfter(blockNumber);
|
|
884
|
+
}
|
|
841
885
|
/** Used by TXE to add checkpoints directly without syncing from L1. */ async addCheckpoints(checkpoints, pendingChainValidationStatus) {
|
|
842
886
|
await this.updater.addCheckpoints(checkpoints, pendingChainValidationStatus);
|
|
843
887
|
return true;
|
package/dest/config.d.ts
CHANGED
|
@@ -2,7 +2,7 @@ import { type BlobClientConfig } from '@aztec/blob-client/client/config';
|
|
|
2
2
|
import { type L1ContractsConfig } from '@aztec/ethereum/config';
|
|
3
3
|
import { type L1ReaderConfig } from '@aztec/ethereum/l1-reader';
|
|
4
4
|
import { type ConfigMappingsType } from '@aztec/foundation/config';
|
|
5
|
-
import { type ChainConfig } from '@aztec/stdlib/config';
|
|
5
|
+
import { type ChainConfig, type SequencerConfig } from '@aztec/stdlib/config';
|
|
6
6
|
import type { ArchiverSpecificConfig } from '@aztec/stdlib/interfaces/server';
|
|
7
7
|
/**
|
|
8
8
|
* The archiver configuration.
|
|
@@ -11,7 +11,7 @@ import type { ArchiverSpecificConfig } from '@aztec/stdlib/interfaces/server';
|
|
|
11
11
|
* Results of calls to eth_blockNumber are cached by viem with this cache being updated periodically at the interval specified by viemPollingIntervalMS.
|
|
12
12
|
* As a result the maximum observed polling time for new blocks will be viemPollingIntervalMS + archiverPollingIntervalMS.
|
|
13
13
|
*/
|
|
14
|
-
export type ArchiverConfig = ArchiverSpecificConfig & L1ReaderConfig & L1ContractsConfig & BlobClientConfig & ChainConfig
|
|
14
|
+
export type ArchiverConfig = ArchiverSpecificConfig & L1ReaderConfig & L1ContractsConfig & BlobClientConfig & ChainConfig & Pick<SequencerConfig, 'blockDurationMs' | 'checkpointProposalSyncGraceSeconds'>;
|
|
15
15
|
export declare const archiverConfigMappings: ConfigMappingsType<ArchiverConfig>;
|
|
16
16
|
/**
|
|
17
17
|
* Returns the archiver configuration from the environment variables.
|
|
@@ -28,6 +28,7 @@ export declare function mapArchiverConfig(config: Partial<ArchiverConfig>): {
|
|
|
28
28
|
maxAllowedEthClientDriftSeconds: number | undefined;
|
|
29
29
|
ethereumAllowNoDebugHosts: boolean | undefined;
|
|
30
30
|
skipHistoricalLogsCheck: boolean | undefined;
|
|
31
|
-
|
|
31
|
+
orphanPruneNoProposalTolerance: number | undefined;
|
|
32
|
+
skipOrphanProposedBlockPruning: boolean | undefined;
|
|
32
33
|
};
|
|
33
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
34
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLGdCQUFnQixFQUEyQixNQUFNLGtDQUFrQyxDQUFDO0FBQ2xHLE9BQU8sRUFBRSxLQUFLLGlCQUFpQixFQUE2QixNQUFNLHdCQUF3QixDQUFDO0FBQzNGLE9BQU8sRUFBRSxLQUFLLGNBQWMsRUFBMEIsTUFBTSwyQkFBMkIsQ0FBQztBQUN4RixPQUFPLEVBQ0wsS0FBSyxrQkFBa0IsRUFLeEIsTUFBTSwwQkFBMEIsQ0FBQztBQUNsQyxPQUFPLEVBQUUsS0FBSyxXQUFXLEVBQUUsS0FBSyxlQUFlLEVBQXVCLE1BQU0sc0JBQXNCLENBQUM7QUFDbkcsT0FBTyxLQUFLLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUc5RTs7Ozs7O0dBTUc7QUFDSCxNQUFNLE1BQU0sY0FBYyxHQUFHLHNCQUFzQixHQUNqRCxjQUFjLEdBQ2QsaUJBQWlCLEdBQ2pCLGdCQUFnQixHQUNoQixXQUFXLEdBQ1gsSUFBSSxDQUFDLGVBQWUsRUFBRSxpQkFBaUIsR0FBRyxvQ0FBb0MsQ0FBQyxDQUFDO0FBRWxGLGVBQU8sTUFBTSxzQkFBc0IsRUFBRSxrQkFBa0IsQ0FBQyxjQUFjLENBZ0ZyRSxDQUFDO0FBRUY7Ozs7R0FJRztBQUNILHdCQUFnQix3QkFBd0IsSUFBSSxjQUFjLENBRXpEO0FBRUQsZ0ZBQWdGO0FBQ2hGLHdCQUFnQixpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLGNBQWMsQ0FBQzs7Ozs7Ozs7OztFQVloRSJ9
|
package/dest/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,gBAAgB,EAA2B,MAAM,kCAAkC,CAAC;AAClG,OAAO,EAAE,KAAK,iBAAiB,EAA6B,MAAM,wBAAwB,CAAC;AAC3F,OAAO,EAAE,KAAK,cAAc,EAA0B,MAAM,2BAA2B,CAAC;AACxF,OAAO,EACL,KAAK,kBAAkB,EAKxB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,KAAK,WAAW,EAAuB,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,gBAAgB,EAA2B,MAAM,kCAAkC,CAAC;AAClG,OAAO,EAAE,KAAK,iBAAiB,EAA6B,MAAM,wBAAwB,CAAC;AAC3F,OAAO,EAAE,KAAK,cAAc,EAA0B,MAAM,2BAA2B,CAAC;AACxF,OAAO,EACL,KAAK,kBAAkB,EAKxB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,eAAe,EAAuB,MAAM,sBAAsB,CAAC;AACnG,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AAG9E;;;;;;GAMG;AACH,MAAM,MAAM,cAAc,GAAG,sBAAsB,GACjD,cAAc,GACd,iBAAiB,GACjB,gBAAgB,GAChB,WAAW,GACX,IAAI,CAAC,eAAe,EAAE,iBAAiB,GAAG,oCAAoC,CAAC,CAAC;AAElF,eAAO,MAAM,sBAAsB,EAAE,kBAAkB,CAAC,cAAc,CAgFrE,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,wBAAwB,IAAI,cAAc,CAEzD;AAED,gFAAgF;AAChF,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,OAAO,CAAC,cAAc,CAAC;;;;;;;;;;EAYhE"}
|
package/dest/config.js
CHANGED
|
@@ -3,6 +3,7 @@ import { l1ContractsConfigMappings } from '@aztec/ethereum/config';
|
|
|
3
3
|
import { l1ReaderConfigMappings } from '@aztec/ethereum/l1-reader';
|
|
4
4
|
import { booleanConfigHelper, getConfigFromMappings, numberConfigHelper, optionalNumberConfigHelper } from '@aztec/foundation/config';
|
|
5
5
|
import { chainConfigMappings } from '@aztec/stdlib/config';
|
|
6
|
+
import { DEFAULT_ORPHAN_PRUNE_NO_PROPOSAL_TOLERANCE } from '@aztec/stdlib/timetable';
|
|
6
7
|
export const archiverConfigMappings = {
|
|
7
8
|
...blobClientConfigMapping,
|
|
8
9
|
archiverPollingIntervalMS: {
|
|
@@ -20,6 +21,16 @@ export const archiverConfigMappings = {
|
|
|
20
21
|
...optionalNumberConfigHelper(),
|
|
21
22
|
description: 'The maximum possible size of the archiver DB in KB. Overwrites the general dataStoreMapSizeKb.'
|
|
22
23
|
},
|
|
24
|
+
blockDurationMs: {
|
|
25
|
+
env: 'SEQ_BLOCK_DURATION_MS',
|
|
26
|
+
description: 'Duration per block in milliseconds when building multiple blocks per slot. Used to derive orphan proposed block pruning timing.',
|
|
27
|
+
...optionalNumberConfigHelper()
|
|
28
|
+
},
|
|
29
|
+
checkpointProposalSyncGraceSeconds: {
|
|
30
|
+
env: 'CHECKPOINT_PROPOSAL_SYNC_GRACE_SECONDS',
|
|
31
|
+
description: 'Consensus grace in seconds for a received checkpoint proposal to materialize into local proposed state.',
|
|
32
|
+
...optionalNumberConfigHelper()
|
|
33
|
+
},
|
|
23
34
|
skipValidateCheckpointAttestations: {
|
|
24
35
|
description: 'Skip validating checkpoint attestations (for testing purposes only)',
|
|
25
36
|
...booleanConfigHelper(false)
|
|
@@ -43,10 +54,20 @@ export const archiverConfigMappings = {
|
|
|
43
54
|
description: 'Skip the startup check that probes the L1 RPC for historical Rollup contract logs. ' + 'Set to true to bypass the check when the connected RPC node is known to prune old logs.',
|
|
44
55
|
...booleanConfigHelper(false)
|
|
45
56
|
},
|
|
46
|
-
|
|
47
|
-
env: '
|
|
48
|
-
description: '
|
|
49
|
-
...
|
|
57
|
+
orphanPruneNoProposalTolerance: {
|
|
58
|
+
env: 'ARCHIVER_ORPHAN_PRUNE_NO_PROPOSAL_TOLERANCE',
|
|
59
|
+
description: 'Local tolerance in seconds before pruning an orphan block when no checkpoint proposal was received.',
|
|
60
|
+
...numberConfigHelper(DEFAULT_ORPHAN_PRUNE_NO_PROPOSAL_TOLERANCE)
|
|
61
|
+
},
|
|
62
|
+
skipOrphanProposedBlockPruning: {
|
|
63
|
+
env: 'ARCHIVER_SKIP_ORPHAN_PROPOSED_BLOCK_PRUNING',
|
|
64
|
+
description: 'Skip pruning orphan proposed blocks that have no matching proposed checkpoint.',
|
|
65
|
+
...booleanConfigHelper(false)
|
|
66
|
+
},
|
|
67
|
+
testPreloadStandardContracts: {
|
|
68
|
+
env: 'TEST_PRELOAD_STANDARD_CONTRACTS',
|
|
69
|
+
description: 'Preload the standard contracts (AuthRegistry, PublicChecks, HandshakeRegistry) into the contract store at ' + 'block 0. For test environments only, and only safe when genesis seeds the matching registration/deployment ' + 'nullifiers; otherwise a later on-chain publish would collide with the block-0 preload.',
|
|
70
|
+
...booleanConfigHelper(false)
|
|
50
71
|
},
|
|
51
72
|
...chainConfigMappings,
|
|
52
73
|
...l1ReaderConfigMappings,
|
|
@@ -73,6 +94,7 @@ export const archiverConfigMappings = {
|
|
|
73
94
|
maxAllowedEthClientDriftSeconds: config.maxAllowedEthClientDriftSeconds,
|
|
74
95
|
ethereumAllowNoDebugHosts: config.ethereumAllowNoDebugHosts,
|
|
75
96
|
skipHistoricalLogsCheck: config.archiverSkipHistoricalLogsCheck,
|
|
76
|
-
|
|
97
|
+
orphanPruneNoProposalTolerance: config.orphanPruneNoProposalTolerance,
|
|
98
|
+
skipOrphanProposedBlockPruning: config.skipOrphanProposedBlockPruning
|
|
77
99
|
};
|
|
78
100
|
}
|
package/dest/factory.d.ts
CHANGED
|
@@ -19,8 +19,14 @@ export declare function createArchiverStore(userConfig: Pick<ArchiverConfig, 'ar
|
|
|
19
19
|
*/
|
|
20
20
|
export declare function createArchiver(config: ArchiverConfig & DataStoreConfig, deps: ArchiverDeps, opts: {
|
|
21
21
|
blockUntilSync: boolean;
|
|
22
|
-
enableOrphanProposedBlockPruning?: boolean | undefined;
|
|
23
22
|
} | undefined, initialHeader: BlockHeader, initialBlockHash: BlockHash): Promise<Archiver>;
|
|
24
23
|
/** Registers protocol contracts in the archiver store. Idempotent — skips contracts that already exist (e.g. on node restart). */
|
|
25
24
|
export declare function registerProtocolContracts(stores: ArchiverDataStores): Promise<void>;
|
|
26
|
-
|
|
25
|
+
/**
|
|
26
|
+
* Preloads the standard contracts (AuthRegistry, PublicChecks, HandshakeRegistry) into the archiver store at block 0,
|
|
27
|
+
* mirroring {@link registerProtocolContracts}. Only invoked for test environments (via `testPreloadStandardContracts`),
|
|
28
|
+
* which also seed the matching registration/deployment nullifiers into the genesis nullifier tree so the store and tree
|
|
29
|
+
* stay consistent. Idempotent — skips contracts that already exist (e.g. on node restart).
|
|
30
|
+
*/
|
|
31
|
+
export declare function registerStandardContracts(stores: ArchiverDataStores): Promise<void>;
|
|
32
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFjdG9yeS5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2ZhY3RvcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBZ0JBLE9BQU8sS0FBSyxFQUFtQixTQUFTLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUd0RSxPQUFPLEtBQUssRUFBRSxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUs5RCxPQUFPLEtBQUssRUFBRSxXQUFXLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQU1wRCxPQUFPLEVBQUUsUUFBUSxFQUFFLEtBQUssWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzVELE9BQU8sRUFBRSxLQUFLLGNBQWMsRUFBcUIsTUFBTSxhQUFhLENBQUM7QUFHckUsT0FBTyxFQUF1QixLQUFLLGtCQUFrQixFQUE0QixNQUFNLHdCQUF3QixDQUFDO0FBR2hILGVBQU8sTUFBTSxtQkFBbUIsYUFBYSxDQUFDO0FBRTlDLGlDQUFpQztBQUNqQyx3QkFBc0IsbUJBQW1CLENBQ3ZDLFVBQVUsRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFLHdCQUF3QixDQUFDLEdBQUcsZUFBZSxFQUM1RSxnQkFBZ0IsRUFBRSxTQUFTLEdBQzFCLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxDQU83QjtBQUVEOzs7Ozs7Ozs7R0FTRztBQUNILHdCQUFzQixjQUFjLENBQ2xDLE1BQU0sRUFBRSxjQUFjLEdBQUcsZUFBZSxFQUN4QyxJQUFJLEVBQUUsWUFBWSxFQUNsQixJQUFJOzthQUF3RCxFQUM1RCxhQUFhLEVBQUUsV0FBVyxFQUMxQixnQkFBZ0IsRUFBRSxTQUFTLEdBQzFCLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0F3SW5CO0FBRUQsb0lBQWtJO0FBQ2xJLHdCQUFzQix5QkFBeUIsQ0FBQyxNQUFNLEVBQUUsa0JBQWtCLGlCQXlCekU7QUFFRDs7Ozs7R0FLRztBQUNILHdCQUFzQix5QkFBeUIsQ0FBQyxNQUFNLEVBQUUsa0JBQWtCLGlCQXNCekUifQ==
|
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":"AAgBA,OAAO,KAAK,EAAmB,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAGtE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAK9D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAMpD,OAAO,EAAE,QAAQ,EAAE,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,EAAE,KAAK,cAAc,EAAqB,MAAM,aAAa,CAAC;AAGrE,OAAO,EAAuB,KAAK,kBAAkB,EAA4B,MAAM,wBAAwB,CAAC;AAGhH,eAAO,MAAM,mBAAmB,aAAa,CAAC;AAE9C,iCAAiC;AACjC,wBAAsB,mBAAmB,CACvC,UAAU,EAAE,IAAI,CAAC,cAAc,EAAE,wBAAwB,CAAC,GAAG,eAAe,EAC5E,gBAAgB,EAAE,SAAS,GAC1B,OAAO,CAAC,kBAAkB,CAAC,CAO7B;AAED;;;;;;;;;GASG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,cAAc,GAAG,eAAe,EACxC,IAAI,EAAE,YAAY,EAClB,IAAI;;aAAwD,EAC5D,aAAa,EAAE,WAAW,EAC1B,gBAAgB,EAAE,SAAS,GAC1B,OAAO,CAAC,QAAQ,CAAC,CAwInB;AAED,oIAAkI;AAClI,wBAAsB,yBAAyB,CAAC,MAAM,EAAE,kBAAkB,iBAyBzE;AAED;;;;;GAKG;AACH,wBAAsB,yBAAyB,CAAC,MAAM,EAAE,kBAAkB,iBAsBzE"}
|
package/dest/factory.js
CHANGED
|
@@ -11,9 +11,11 @@ import { DateProvider } from '@aztec/foundation/timer';
|
|
|
11
11
|
import { createStore } from '@aztec/kv-store/lmdb-v2';
|
|
12
12
|
import { protocolContractNames } from '@aztec/protocol-contracts';
|
|
13
13
|
import { BundledProtocolContractsProvider } from '@aztec/protocol-contracts/providers/bundle';
|
|
14
|
+
import { getPublishableStandardContracts } from '@aztec/standard-contracts';
|
|
14
15
|
import { FunctionType, decodeFunctionSignature } from '@aztec/stdlib/abi';
|
|
16
|
+
import { DEFAULT_BLOCK_DURATION_MS } from '@aztec/stdlib/config';
|
|
15
17
|
import { computePublicBytecodeCommitment } from '@aztec/stdlib/contract';
|
|
16
|
-
import {
|
|
18
|
+
import { DEFAULT_ORPHAN_PRUNE_NO_PROPOSAL_TOLERANCE, getDefaultCheckpointProposalSyncGrace } from '@aztec/stdlib/timetable';
|
|
17
19
|
import { getTelemetryClient } from '@aztec/telemetry-client';
|
|
18
20
|
import { EventEmitter } from 'events';
|
|
19
21
|
import { createPublicClient } from 'viem';
|
|
@@ -46,6 +48,9 @@ export const ARCHIVER_STORE_NAME = 'archiver';
|
|
|
46
48
|
}, initialHeader, initialBlockHash) {
|
|
47
49
|
const archiverStore = await createArchiverStore(config, initialBlockHash);
|
|
48
50
|
await registerProtocolContracts(archiverStore);
|
|
51
|
+
if (config.testPreloadStandardContracts) {
|
|
52
|
+
await registerStandardContracts(archiverStore);
|
|
53
|
+
}
|
|
49
54
|
// Create Ethereum clients
|
|
50
55
|
const chain = createEthereumChain(config.l1RpcUrls, config.l1ChainId);
|
|
51
56
|
const httpTimeout = config.l1HttpTimeoutMS;
|
|
@@ -102,8 +107,10 @@ export const ARCHIVER_STORE_NAME = 'archiver';
|
|
|
102
107
|
maxAllowedEthClientDriftSeconds: 300,
|
|
103
108
|
ethereumAllowNoDebugHosts: false,
|
|
104
109
|
skipHistoricalLogsCheck: false,
|
|
105
|
-
|
|
106
|
-
|
|
110
|
+
checkpointProposalSyncGrace: config.checkpointProposalSyncGraceSeconds ?? getDefaultCheckpointProposalSyncGrace((config.blockDurationMs ?? DEFAULT_BLOCK_DURATION_MS) / 1000),
|
|
111
|
+
orphanPruneNoProposalTolerance: DEFAULT_ORPHAN_PRUNE_NO_PROPOSAL_TOLERANCE,
|
|
112
|
+
skipOrphanProposedBlockPruning: false,
|
|
113
|
+
blockDuration: (config.blockDurationMs ?? DEFAULT_BLOCK_DURATION_MS) / 1000
|
|
107
114
|
}, mapArchiverConfig(config));
|
|
108
115
|
const epochCache = deps.epochCache ?? await EpochCache.create(config.rollupAddress, config, deps);
|
|
109
116
|
const telemetry = deps.telemetry ?? getTelemetryClient();
|
|
@@ -147,3 +154,30 @@ export const ARCHIVER_STORE_NAME = 'archiver';
|
|
|
147
154
|
], BlockNumber(blockNumber));
|
|
148
155
|
}
|
|
149
156
|
}
|
|
157
|
+
/**
|
|
158
|
+
* Preloads the standard contracts (AuthRegistry, PublicChecks, HandshakeRegistry) into the archiver store at block 0,
|
|
159
|
+
* mirroring {@link registerProtocolContracts}. Only invoked for test environments (via `testPreloadStandardContracts`),
|
|
160
|
+
* which also seed the matching registration/deployment nullifiers into the genesis nullifier tree so the store and tree
|
|
161
|
+
* stay consistent. Idempotent — skips contracts that already exist (e.g. on node restart).
|
|
162
|
+
*/ export async function registerStandardContracts(stores) {
|
|
163
|
+
const blockNumber = 0;
|
|
164
|
+
for (const contract of (await getPublishableStandardContracts())){
|
|
165
|
+
// Skip if already registered (happens on node restart with a persisted store).
|
|
166
|
+
if (await stores.contractClasses.getContractClass(contract.contractClass.id)) {
|
|
167
|
+
continue;
|
|
168
|
+
}
|
|
169
|
+
const publicBytecodeCommitment = await computePublicBytecodeCommitment(contract.contractClass.packedBytecode);
|
|
170
|
+
const contractClassPublic = {
|
|
171
|
+
...contract.contractClass,
|
|
172
|
+
publicBytecodeCommitment
|
|
173
|
+
};
|
|
174
|
+
const publicFunctionSignatures = contract.artifact.functions.filter((fn)=>fn.functionType === FunctionType.PUBLIC).map((fn)=>decodeFunctionSignature(fn.name, fn.parameters));
|
|
175
|
+
await stores.functionNames.register(publicFunctionSignatures);
|
|
176
|
+
await stores.contractClasses.addContractClasses([
|
|
177
|
+
contractClassPublic
|
|
178
|
+
], BlockNumber(blockNumber));
|
|
179
|
+
await stores.contractInstances.addContractInstances([
|
|
180
|
+
contract.instance
|
|
181
|
+
], BlockNumber(blockNumber));
|
|
182
|
+
}
|
|
183
|
+
}
|