@aztec/archiver 1.2.1 → 2.0.0-nightly.20250813

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.
@@ -1,9 +1,11 @@
1
1
  import type { BlobSinkClientInterface } from '@aztec/blob-sink/client';
2
+ import { EpochCache } from '@aztec/epoch-cache';
2
3
  import { type L1BlockId, type ViemPublicClient } from '@aztec/ethereum';
3
4
  import { Buffer32 } from '@aztec/foundation/buffer';
4
5
  import type { EthAddress } from '@aztec/foundation/eth-address';
5
6
  import { Fr } from '@aztec/foundation/fields';
6
7
  import { type Logger } from '@aztec/foundation/log';
8
+ import { DateProvider } from '@aztec/foundation/timer';
7
9
  import type { CustomRange } from '@aztec/kv-store';
8
10
  import type { FunctionSelector } from '@aztec/stdlib/abi';
9
11
  import type { AztecAddress } from '@aztec/stdlib/aztec-address';
@@ -22,10 +24,17 @@ import type { ArchiverConfig } from './config.js';
22
24
  import { ArchiverInstrumentation } from './instrumentation.js';
23
25
  import type { InboxMessage } from './structs/inbox_message.js';
24
26
  import type { PublishedL2Block } from './structs/published.js';
27
+ import { type ValidateBlockResult } from './validation.js';
25
28
  /**
26
29
  * Helper interface to combine all sources this archiver implementation provides.
27
30
  */
28
31
  export type ArchiveSource = L2BlockSource & L2LogsSource & ContractDataSource & L1ToL2MessageSource;
32
+ export type ArchiverDeps = {
33
+ telemetry?: TelemetryClient;
34
+ blobSinkClient: BlobSinkClientInterface;
35
+ epochCache?: EpochCache;
36
+ dateProvider?: DateProvider;
37
+ };
29
38
  declare const Archiver_base: new () => ArchiverEmitter;
30
39
  /**
31
40
  * Pulls L2 blocks in a non-blocking manner and provides interface for their retrieval.
@@ -38,6 +47,7 @@ export declare class Archiver extends Archiver_base implements ArchiveSource, Tr
38
47
  readonly dataStore: ArchiverDataStore;
39
48
  private readonly config;
40
49
  private readonly blobSinkClient;
50
+ private readonly epochCache;
41
51
  private readonly instrumentation;
42
52
  private readonly l1constants;
43
53
  private readonly log;
@@ -50,6 +60,7 @@ export declare class Archiver extends Archiver_base implements ArchiveSource, Tr
50
60
  private store;
51
61
  private l1BlockNumber;
52
62
  private l1Timestamp;
63
+ private pendingChainValidationStatus;
53
64
  private initialSyncComplete;
54
65
  readonly tracer: Tracer;
55
66
  /**
@@ -69,7 +80,7 @@ export declare class Archiver extends Archiver_base implements ArchiveSource, Tr
69
80
  }, dataStore: ArchiverDataStore, config: {
70
81
  pollingIntervalMs: number;
71
82
  batchSize: number;
72
- }, blobSinkClient: BlobSinkClientInterface, instrumentation: ArchiverInstrumentation, l1constants: L1RollupConstants & {
83
+ }, blobSinkClient: BlobSinkClientInterface, epochCache: EpochCache, instrumentation: ArchiverInstrumentation, l1constants: L1RollupConstants & {
73
84
  l1StartBlockHash: Buffer32;
74
85
  }, log?: Logger);
75
86
  /**
@@ -79,10 +90,7 @@ export declare class Archiver extends Archiver_base implements ArchiveSource, Tr
79
90
  * @param blockUntilSynced - If true, blocks until the archiver has fully synced.
80
91
  * @returns - An instance of the archiver.
81
92
  */
82
- static createAndSync(config: ArchiverConfig, archiverStore: ArchiverDataStore, deps: {
83
- telemetry: TelemetryClient;
84
- blobSinkClient: BlobSinkClientInterface;
85
- }, blockUntilSynced?: boolean): Promise<Archiver>;
93
+ static createAndSync(config: ArchiverConfig, archiverStore: ArchiverDataStore, deps: ArchiverDeps, blockUntilSynced?: boolean): Promise<Archiver>;
86
94
  /**
87
95
  * Starts sync process.
88
96
  * @param blockUntilSynced - If true, blocks until the archiver has fully synced.
@@ -196,6 +204,8 @@ export declare class Archiver extends Archiver_base implements ArchiveSource, Tr
196
204
  getContractClassIds(): Promise<Fr[]>;
197
205
  registerContractFunctionSignatures(signatures: string[]): Promise<void>;
198
206
  getDebugFunctionName(address: AztecAddress, selector: FunctionSelector): Promise<string | undefined>;
207
+ getPendingChainValidationStatus(): Promise<ValidateBlockResult>;
208
+ isPendingChainInvalid(): Promise<boolean>;
199
209
  getL2Tips(): Promise<L2Tips>;
200
210
  rollbackTo(targetL2BlockNumber: number): Promise<void>;
201
211
  }
@@ -1 +1 @@
1
- {"version":3,"file":"archiver.d.ts","sourceRoot":"","sources":["../../src/archiver/archiver.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"archiver.d.ts","sourceRoot":"","sources":["../../src/archiver/archiver.ts"],"names":[],"mappings":"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"}
@@ -4,27 +4,30 @@ function _ts_decorate(decorators, target, key, desc) {
4
4
  else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
5
  return c > 3 && r && Object.defineProperty(target, key, r), r;
6
6
  }
7
+ import { EpochCache } from '@aztec/epoch-cache';
7
8
  import { BlockTagTooOldError, InboxContract, RollupContract, createEthereumChain } from '@aztec/ethereum';
8
9
  import { maxBigint } from '@aztec/foundation/bigint';
9
10
  import { Buffer16, Buffer32 } from '@aztec/foundation/buffer';
11
+ import { pick } from '@aztec/foundation/collection';
10
12
  import { Fr } from '@aztec/foundation/fields';
11
13
  import { createLogger } from '@aztec/foundation/log';
12
14
  import { RunningPromise, makeLoggingErrorHandler } from '@aztec/foundation/running-promise';
13
15
  import { sleep } from '@aztec/foundation/sleep';
14
16
  import { count } from '@aztec/foundation/string';
15
17
  import { Timer, elapsed } from '@aztec/foundation/timer';
16
- import { ContractClassRegisteredEvent, PrivateFunctionBroadcastedEvent, UtilityFunctionBroadcastedEvent } from '@aztec/protocol-contracts/class-registerer';
17
- import { ContractInstanceDeployedEvent, ContractInstanceUpdatedEvent } from '@aztec/protocol-contracts/instance-deployer';
18
+ import { ContractClassPublishedEvent, PrivateFunctionBroadcastedEvent, UtilityFunctionBroadcastedEvent } from '@aztec/protocol-contracts/class-registry';
19
+ import { ContractInstancePublishedEvent, ContractInstanceUpdatedEvent } from '@aztec/protocol-contracts/instance-registry';
18
20
  import { L2BlockSourceEvents } from '@aztec/stdlib/block';
19
21
  import { computePublicBytecodeCommitment, isValidPrivateFunctionMembershipProof, isValidUtilityFunctionMembershipProof } from '@aztec/stdlib/contract';
20
22
  import { getEpochAtSlot, getEpochNumberAtTimestamp, getSlotAtTimestamp, getSlotRangeForEpoch, getTimestampRangeForEpoch } from '@aztec/stdlib/epoch-helpers';
21
- import { Attributes, trackSpan } from '@aztec/telemetry-client';
23
+ import { Attributes, getTelemetryClient, trackSpan } from '@aztec/telemetry-client';
22
24
  import { EventEmitter } from 'events';
23
25
  import groupBy from 'lodash.groupby';
24
26
  import { createPublicClient, fallback, http } from 'viem';
25
27
  import { retrieveBlocksFromRollup, retrieveL1ToL2Message, retrieveL1ToL2Messages, retrievedBlockToPublishedL2Block } from './data_retrieval.js';
26
28
  import { InitialBlockNumberNotSequentialError, NoBlobBodiesFoundError } from './errors.js';
27
29
  import { ArchiverInstrumentation } from './instrumentation.js';
30
+ import { validateBlockAttestations } from './validation.js';
28
31
  /**
29
32
  * Pulls L2 blocks in a non-blocking manner and provides interface for their retrieval.
30
33
  * Responsible for handling robust L1 polling so that other components do not need to
@@ -35,6 +38,7 @@ import { ArchiverInstrumentation } from './instrumentation.js';
35
38
  dataStore;
36
39
  config;
37
40
  blobSinkClient;
41
+ epochCache;
38
42
  instrumentation;
39
43
  l1constants;
40
44
  log;
@@ -46,6 +50,7 @@ import { ArchiverInstrumentation } from './instrumentation.js';
46
50
  store;
47
51
  l1BlockNumber;
48
52
  l1Timestamp;
53
+ pendingChainValidationStatus;
49
54
  initialSyncComplete;
50
55
  tracer;
51
56
  /**
@@ -57,8 +62,10 @@ import { ArchiverInstrumentation } from './instrumentation.js';
57
62
  * @param pollingIntervalMs - The interval for polling for L1 logs (in milliseconds).
58
63
  * @param store - An archiver data store for storage & retrieval of blocks, encrypted logs & contract data.
59
64
  * @param log - A logger.
60
- */ constructor(publicClient, l1Addresses, dataStore, config, blobSinkClient, instrumentation, l1constants, log = createLogger('archiver')){
61
- super(), this.publicClient = publicClient, this.l1Addresses = l1Addresses, this.dataStore = dataStore, this.config = config, this.blobSinkClient = blobSinkClient, this.instrumentation = instrumentation, this.l1constants = l1constants, this.log = log, this.initialSyncComplete = false;
65
+ */ constructor(publicClient, l1Addresses, dataStore, config, blobSinkClient, epochCache, instrumentation, l1constants, log = createLogger('archiver')){
66
+ super(), this.publicClient = publicClient, this.l1Addresses = l1Addresses, this.dataStore = dataStore, this.config = config, this.blobSinkClient = blobSinkClient, this.epochCache = epochCache, this.instrumentation = instrumentation, this.l1constants = l1constants, this.log = log, this.pendingChainValidationStatus = {
67
+ valid: true
68
+ }, this.initialSyncComplete = false;
62
69
  this.tracer = instrumentation.tracer;
63
70
  this.store = new ArchiverStoreHelper(dataStore);
64
71
  this.rollup = new RollupContract(publicClient, l1Addresses.rollupAddress);
@@ -101,7 +108,9 @@ import { ArchiverInstrumentation } from './instrumentation.js';
101
108
  pollingIntervalMs: config.archiverPollingIntervalMS ?? 10_000,
102
109
  batchSize: config.archiverBatchSize ?? 100
103
110
  };
104
- const archiver = new Archiver(publicClient, config.l1Contracts, archiverStore, opts, deps.blobSinkClient, await ArchiverInstrumentation.new(deps.telemetry, ()=>archiverStore.estimateSize()), l1Constants);
111
+ const epochCache = deps.epochCache ?? await EpochCache.create(config.l1Contracts.rollupAddress, config, deps);
112
+ const telemetry = deps.telemetry ?? getTelemetryClient();
113
+ const archiver = new Archiver(publicClient, config.l1Contracts, archiverStore, opts, deps.blobSinkClient, epochCache, await ArchiverInstrumentation.new(telemetry, ()=>archiverStore.estimateSize()), l1Constants);
105
114
  await archiver.start(blockUntilSynced);
106
115
  return archiver;
107
116
  }
@@ -207,10 +216,17 @@ import { ArchiverInstrumentation } from './instrumentation.js';
207
216
  // the chain locally before we start unwinding stuff. This can be optimized by figuring out
208
217
  // up to which point we're pruning, and then requesting L2 blocks up to that point only.
209
218
  const { rollupCanPrune } = await this.handleEpochPrune(rollupStatus.provenBlockNumber, currentL1BlockNumber, currentL1Timestamp);
219
+ // Update the pending chain validation status with the last block validation result.
220
+ // Again, we only update if validation status changed, so in a sequence of invalid blocks
221
+ // we keep track of the first invalid block so we can invalidate that one if needed.
222
+ if (rollupStatus.validationResult && rollupStatus.validationResult?.valid !== this.pendingChainValidationStatus.valid) {
223
+ this.pendingChainValidationStatus = rollupStatus.validationResult;
224
+ }
210
225
  // And lastly we check if we are missing any L2 blocks behind us due to a possible L1 reorg.
211
226
  // We only do this if rollup cant prune on the next submission. Otherwise we will end up
212
- // re-syncing the blocks we have just unwound above.
213
- if (!rollupCanPrune) {
227
+ // re-syncing the blocks we have just unwound above. We also dont do this if the last block is invalid,
228
+ // since the archiver will rightfully refuse to sync up to it.
229
+ if (!rollupCanPrune && this.pendingChainValidationStatus.valid) {
214
230
  await this.checkForNewBlocksBeforeL1SyncPoint(rollupStatus, blocksSynchedTo, currentL1BlockNumber);
215
231
  }
216
232
  this.instrumentation.updateL1BlockHeight(currentL1BlockNumber);
@@ -444,7 +460,8 @@ import { ArchiverInstrumentation } from './instrumentation.js';
444
460
  provenBlockNumber: Number(provenBlockNumber),
445
461
  provenArchive,
446
462
  pendingBlockNumber: Number(pendingBlockNumber),
447
- pendingArchive
463
+ pendingArchive,
464
+ validationResult: undefined
448
465
  };
449
466
  this.log.trace(`Retrieved rollup status at current L1 block ${currentL1BlockNumber}.`, {
450
467
  localPendingBlockNumber,
@@ -511,7 +528,8 @@ import { ArchiverInstrumentation } from './instrumentation.js';
511
528
  if (localPendingBlock === undefined) {
512
529
  throw new Error(`Missing block ${localPendingBlockNumber}`);
513
530
  }
514
- const noBlockSinceLast = localPendingBlock && pendingArchive === localPendingBlock.archive.root.toString();
531
+ const localPendingArchiveRoot = localPendingBlock.archive.root.toString();
532
+ const noBlockSinceLast = localPendingBlock && pendingArchive === localPendingArchiveRoot;
515
533
  if (noBlockSinceLast) {
516
534
  // We believe the following line causes a problem when we encounter L1 re-orgs.
517
535
  // Basically, by setting the synched L1 block number here, we are saying that we have
@@ -524,13 +542,17 @@ import { ArchiverInstrumentation } from './instrumentation.js';
524
542
  this.log.debug(`No blocks to retrieve from ${blocksSynchedTo + 1n} to ${currentL1BlockNumber}`);
525
543
  return rollupStatus;
526
544
  }
527
- const localPendingBlockInChain = archiveForLocalPendingBlockNumber === localPendingBlock.archive.root.toString();
545
+ const localPendingBlockInChain = archiveForLocalPendingBlockNumber === localPendingArchiveRoot;
528
546
  if (!localPendingBlockInChain) {
529
547
  // If our local pending block tip is not in the chain on L1 a "prune" must have happened
530
548
  // or the L1 have reorged.
531
549
  // In any case, we have to figure out how far into the past the action will take us.
532
550
  // For simplicity here, we will simply rewind until we end in a block that is also on the chain on L1.
533
- this.log.debug(`L2 prune has been detected.`);
551
+ this.log.debug(`L2 prune has been detected due to local pending block ${localPendingBlockNumber} not in chain`, {
552
+ localPendingBlockNumber,
553
+ localPendingArchiveRoot,
554
+ archiveForLocalPendingBlockNumber
555
+ });
534
556
  let tipAfterUnwind = localPendingBlockNumber;
535
557
  while(true){
536
558
  const candidateBlock = await this.getBlock(Number(tipAfterUnwind));
@@ -567,7 +589,28 @@ import { ArchiverInstrumentation } from './instrumentation.js';
567
589
  const lastProcessedL1BlockNumber = retrievedBlocks[retrievedBlocks.length - 1].l1.blockNumber;
568
590
  this.log.debug(`Retrieved ${retrievedBlocks.length} new L2 blocks between L1 blocks ${searchStartBlock} and ${searchEndBlock} with last processed L1 block ${lastProcessedL1BlockNumber}.`);
569
591
  const publishedBlocks = retrievedBlocks.map((b)=>retrievedBlockToPublishedL2Block(b));
592
+ const validBlocks = [];
570
593
  for (const block of publishedBlocks){
594
+ const validationResult = await validateBlockAttestations(block, this.epochCache, this.l1constants, this.log);
595
+ // Only update the validation result if it has changed, so we can keep track of the first invalid block
596
+ // in case there is a sequence of more than one invalid block, as we need to invalidate the first one.
597
+ if (rollupStatus.validationResult?.valid !== validationResult.valid) {
598
+ rollupStatus.validationResult = validationResult;
599
+ }
600
+ if (!validationResult.valid) {
601
+ this.log.warn(`Skipping block ${block.block.number} due to invalid attestations`, {
602
+ blockHash: block.block.hash(),
603
+ l1BlockNumber: block.l1.blockNumber,
604
+ ...pick(validationResult, 'reason')
605
+ });
606
+ // Emit event for invalid block detection
607
+ this.emit(L2BlockSourceEvents.InvalidAttestationsBlockDetected, {
608
+ type: L2BlockSourceEvents.InvalidAttestationsBlockDetected,
609
+ validationResult
610
+ });
611
+ continue;
612
+ }
613
+ validBlocks.push(block);
571
614
  this.log.debug(`Ingesting new L2 block ${block.block.number} with ${block.block.body.txEffects.length} txs`, {
572
615
  blockHash: block.block.hash(),
573
616
  l1BlockNumber: block.l1.blockNumber,
@@ -576,8 +619,8 @@ import { ArchiverInstrumentation } from './instrumentation.js';
576
619
  });
577
620
  }
578
621
  try {
579
- const [processDuration] = await elapsed(()=>this.store.addBlocks(publishedBlocks));
580
- this.instrumentation.processNewBlocks(processDuration / publishedBlocks.length, publishedBlocks.map((b)=>b.block));
622
+ const [processDuration] = await elapsed(()=>this.store.addBlocks(validBlocks));
623
+ this.instrumentation.processNewBlocks(processDuration / validBlocks.length, validBlocks.map((b)=>b.block));
581
624
  } catch (err) {
582
625
  if (err instanceof InitialBlockNumberNotSequentialError) {
583
626
  const { previousBlockNumber, newBlockNumber } = err;
@@ -593,7 +636,7 @@ import { ArchiverInstrumentation } from './instrumentation.js';
593
636
  }
594
637
  throw err;
595
638
  }
596
- for (const block of publishedBlocks){
639
+ for (const block of validBlocks){
597
640
  this.log.info(`Downloaded L2 block ${block.block.number}`, {
598
641
  blockHash: await block.block.hash(),
599
642
  blockNumber: block.block.number,
@@ -603,7 +646,7 @@ import { ArchiverInstrumentation } from './instrumentation.js';
603
646
  archiveNextLeafIndex: block.block.archive.nextAvailableLeafIndex
604
647
  });
605
648
  }
606
- lastRetrievedBlock = publishedBlocks.at(-1) ?? lastRetrievedBlock;
649
+ lastRetrievedBlock = validBlocks.at(-1) ?? lastRetrievedBlock;
607
650
  }while (searchEndBlock < currentL1BlockNumber)
608
651
  // Important that we update AFTER inserting the blocks.
609
652
  await updateProvenBlock();
@@ -876,6 +919,12 @@ import { ArchiverInstrumentation } from './instrumentation.js';
876
919
  getDebugFunctionName(address, selector) {
877
920
  return this.store.getDebugFunctionName(address, selector);
878
921
  }
922
+ getPendingChainValidationStatus() {
923
+ return Promise.resolve(this.pendingChainValidationStatus);
924
+ }
925
+ isPendingChainInvalid() {
926
+ return Promise.resolve(this.pendingChainValidationStatus.valid === false);
927
+ }
879
928
  async getL2Tips() {
880
929
  const [latestBlockNumber, provenBlockNumber] = await Promise.all([
881
930
  this.getBlockNumber(),
@@ -976,11 +1025,11 @@ var Operation = /*#__PURE__*/ function(Operation) {
976
1025
  this.#log = createLogger('archiver:block-helper');
977
1026
  }
978
1027
  /**
979
- * Extracts and stores contract classes out of ContractClassRegistered events emitted by the class registerer contract.
1028
+ * Extracts and stores contract classes out of ContractClassPublished events emitted by the class registry contract.
980
1029
  * @param allLogs - All logs emitted in a bunch of blocks.
981
- */ async #updateRegisteredContractClasses(allLogs, blockNum, operation) {
982
- const contractClassRegisteredEvents = allLogs.filter((log)=>ContractClassRegisteredEvent.isContractClassRegisteredEvent(log)).map((log)=>ContractClassRegisteredEvent.fromLog(log));
983
- const contractClasses = await Promise.all(contractClassRegisteredEvents.map((e)=>e.toContractClassPublic()));
1030
+ */ async #updatePublishedContractClasses(allLogs, blockNum, operation) {
1031
+ const contractClassPublishedEvents = allLogs.filter((log)=>ContractClassPublishedEvent.isContractClassPublishedEvent(log)).map((log)=>ContractClassPublishedEvent.fromLog(log));
1032
+ const contractClasses = await Promise.all(contractClassPublishedEvents.map((e)=>e.toContractClassPublic()));
984
1033
  if (contractClasses.length > 0) {
985
1034
  contractClasses.forEach((c)=>this.#log.verbose(`${Operation[operation]} contract class ${c.id.toString()}`));
986
1035
  if (operation == 0) {
@@ -994,10 +1043,10 @@ var Operation = /*#__PURE__*/ function(Operation) {
994
1043
  return true;
995
1044
  }
996
1045
  /**
997
- * Extracts and stores contract instances out of ContractInstanceDeployed events emitted by the canonical deployer contract.
1046
+ * Extracts and stores contract instances out of ContractInstancePublished events emitted by the canonical deployer contract.
998
1047
  * @param allLogs - All logs emitted in a bunch of blocks.
999
1048
  */ async #updateDeployedContractInstances(allLogs, blockNum, operation) {
1000
- const contractInstances = allLogs.filter((log)=>ContractInstanceDeployedEvent.isContractInstanceDeployedEvent(log)).map((log)=>ContractInstanceDeployedEvent.fromLog(log)).map((e)=>e.toContractInstance());
1049
+ const contractInstances = allLogs.filter((log)=>ContractInstancePublishedEvent.isContractInstancePublishedEvent(log)).map((log)=>ContractInstancePublishedEvent.fromLog(log)).map((e)=>e.toContractInstance());
1001
1050
  if (contractInstances.length > 0) {
1002
1051
  contractInstances.forEach((c)=>this.#log.verbose(`${Operation[operation]} contract instance at ${c.address.toString()}`));
1003
1052
  if (operation == 0) {
@@ -1009,7 +1058,7 @@ var Operation = /*#__PURE__*/ function(Operation) {
1009
1058
  return true;
1010
1059
  }
1011
1060
  /**
1012
- * Extracts and stores contract instances out of ContractInstanceDeployed events emitted by the canonical deployer contract.
1061
+ * Extracts and stores contract instances out of ContractInstancePublished events emitted by the canonical deployer contract.
1013
1062
  * @param allLogs - All logs emitted in a bunch of blocks.
1014
1063
  * @param timestamp - Timestamp at which the updates were scheduled.
1015
1064
  * @param operation - The operation to perform on the contract instance updates (Store or Delete).
@@ -1085,11 +1134,11 @@ var Operation = /*#__PURE__*/ function(Operation) {
1085
1134
  // Unroll all logs emitted during the retrieved blocks and extract any contract classes and instances from them
1086
1135
  ...blocks.map(async (block)=>{
1087
1136
  const contractClassLogs = block.block.body.txEffects.flatMap((txEffect)=>txEffect.contractClassLogs);
1088
- // ContractInstanceDeployed event logs are broadcast in privateLogs.
1137
+ // ContractInstancePublished event logs are broadcast in privateLogs.
1089
1138
  const privateLogs = block.block.body.txEffects.flatMap((txEffect)=>txEffect.privateLogs);
1090
1139
  const publicLogs = block.block.body.txEffects.flatMap((txEffect)=>txEffect.publicLogs);
1091
1140
  return (await Promise.all([
1092
- this.#updateRegisteredContractClasses(contractClassLogs, block.block.number, 0),
1141
+ this.#updatePublishedContractClasses(contractClassLogs, block.block.number, 0),
1093
1142
  this.#updateDeployedContractInstances(privateLogs, block.block.number, 0),
1094
1143
  this.#updateUpdatedContractInstances(publicLogs, block.block.header.globalVariables.timestamp, 0),
1095
1144
  this.#storeBroadcastedIndividualFunctions(contractClassLogs, block.block.number)
@@ -1113,11 +1162,11 @@ var Operation = /*#__PURE__*/ function(Operation) {
1113
1162
  // Unroll all logs emitted during the retrieved blocks and extract any contract classes and instances from them
1114
1163
  ...blocks.map(async (block)=>{
1115
1164
  const contractClassLogs = block.block.body.txEffects.flatMap((txEffect)=>txEffect.contractClassLogs);
1116
- // ContractInstanceDeployed event logs are broadcast in privateLogs.
1165
+ // ContractInstancePublished event logs are broadcast in privateLogs.
1117
1166
  const privateLogs = block.block.body.txEffects.flatMap((txEffect)=>txEffect.privateLogs);
1118
1167
  const publicLogs = block.block.body.txEffects.flatMap((txEffect)=>txEffect.publicLogs);
1119
1168
  return (await Promise.all([
1120
- this.#updateRegisteredContractClasses(contractClassLogs, block.block.number, 1),
1169
+ this.#updatePublishedContractClasses(contractClassLogs, block.block.number, 1),
1121
1170
  this.#updateDeployedContractInstances(privateLogs, block.block.number, 1),
1122
1171
  this.#updateUpdatedContractInstances(publicLogs, block.block.header.globalVariables.timestamp, 1)
1123
1172
  ])).every(Boolean);
@@ -1 +1 @@
1
- {"version":3,"file":"data_retrieval.d.ts","sourceRoot":"","sources":["../../src/archiver/data_retrieval.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"data_retrieval.d.ts","sourceRoot":"","sources":["../../src/archiver/data_retrieval.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AACvE,OAAO,KAAK,EAEV,UAAU,EAGV,gBAAgB,EAEjB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAC;AAC9C,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,KAAK,QAAQ,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,IAAI,EAAE,oBAAoB,EAAW,MAAM,qBAAqB,CAAC;AAC1E,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAE7C,OAAO,EAAgC,mBAAmB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAErG,OAAO,EAEL,KAAK,qBAAqB,EAC1B,KAAK,GAAG,EAKT,MAAM,MAAM,CAAC;AAGd,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAEhF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,EAAE,CAAC;IAChB,cAAc,EAAE,cAAc,CAAC;IAC/B,MAAM,EAAE,mBAAmB,CAAC;IAC5B,IAAI,EAAE,IAAI,CAAC;IACX,EAAE,EAAE,eAAe,CAAC;IACpB,OAAO,EAAE,EAAE,CAAC;IACZ,OAAO,EAAE,EAAE,CAAC;IACZ,YAAY,EAAE,oBAAoB,EAAE,CAAC;CACtC,CAAC;AAEF,wBAAgB,gCAAgC,CAAC,cAAc,EAAE,gBAAgB,GAAG,gBAAgB,CA6CnG;AAED;;;;;;;;GAQG;AACH,wBAAsB,wBAAwB,CAC5C,MAAM,EAAE,qBAAqB,CAAC,OAAO,SAAS,EAAE,gBAAgB,CAAC,EACjE,YAAY,EAAE,gBAAgB,EAC9B,cAAc,EAAE,uBAAuB,EACvC,gBAAgB,EAAE,MAAM,EACxB,cAAc,EAAE,MAAM,EACtB,MAAM,GAAE,MAAiC,GACxC,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAuD7B;AA6DD,wBAAsB,cAAc,CAAC,YAAY,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAGzG;AAoJD,iHAAiH;AACjH,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,qBAAqB,CAAC,OAAO,QAAQ,EAAE,UAAU,CAAC,EACzD,IAAI,EAAE,EAAE,EACR,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC,CAKnC;AAED;;;;;;;;GAQG;AACH,wBAAsB,sBAAsB,CAC1C,KAAK,EAAE,qBAAqB,CAAC,OAAO,QAAQ,EAAE,UAAU,CAAC,EACzD,gBAAgB,EAAE,MAAM,EACxB,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,YAAY,EAAE,CAAC,CAgBzB;AAgBD,iEAAiE;AACjE,wBAAsB,6BAA6B,CACjD,YAAY,EAAE,gBAAgB,EAC9B,aAAa,EAAE,UAAU,EACzB,gBAAgB,EAAE,MAAM,EACxB,cAAc,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC;IAAE,aAAa,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,EAAE,CAAC;IAAC,MAAM,EAAE,GAAG,CAAA;CAAE,EAAE,CAAC,CAexF;AAED,yDAAyD;AACzD,wBAAsB,0BAA0B,CAC9C,YAAY,EAAE,gBAAgB,EAC9B,aAAa,EAAE,UAAU,EACzB,gBAAgB,EAAE,MAAM,EACxB,cAAc,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC,aAAa,CAAC;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,QAAQ,EAAE,EAAE,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,KAAK,MAAM,EAAE,CAAA;CAAE,CAAC,CAAC,CAatG;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,WAAW,EAAE,EAAE,CAAC;IAChB,QAAQ,EAAE,EAAE,CAAC;IACb,KAAK,EAAE,KAAK,CAAC;CACd,CAAC;AAEF;;;;;;;;GAQG;AACH,wBAAsB,yBAAyB,CAC7C,YAAY,EAAE,gBAAgB,EAC9B,MAAM,EAAE,KAAK,MAAM,EAAE,EACrB,gBAAgB,EAAE,EAAE,GACnB,OAAO,CAAC,gBAAgB,CAAC,CAmC3B"}
@@ -191,7 +191,18 @@ export async function getL1BlockTime(publicClient, blockNumber) {
191
191
  if (rollupFunctionName !== 'propose') {
192
192
  throw new Error(`Unexpected rollup method called ${rollupFunctionName}`);
193
193
  }
194
- const [decodedArgs, attestations, _blobInput] = rollupArgs;
194
+ const [decodedArgs, packedAttestations, _signers, _blobInput] = rollupArgs;
195
+ const attestations = CommitteeAttestation.fromPacked(packedAttestations, targetCommitteeSize);
196
+ logger.trace(`Recovered propose calldata from tx ${txHash}`, {
197
+ l2BlockNumber,
198
+ archive: decodedArgs.archive,
199
+ stateReference: decodedArgs.stateReference,
200
+ header: decodedArgs.header,
201
+ blobHashes,
202
+ attestations,
203
+ packedAttestations,
204
+ targetCommitteeSize
205
+ });
195
206
  // TODO(md): why is the proposed block header different to the actual block header?
196
207
  // This is likely going to be a footgun
197
208
  const header = ProposedBlockHeader.fromViem(decodedArgs.header);
@@ -220,7 +231,7 @@ export async function getL1BlockTime(publicClient, blockNumber) {
220
231
  stateReference,
221
232
  header,
222
233
  body,
223
- attestations: CommitteeAttestation.fromPacked(attestations, targetCommitteeSize)
234
+ attestations
224
235
  };
225
236
  }
226
237
  /** Given an L1 to L2 message, retrieves its corresponding event from the Inbox within a specific block range. */ export async function retrieveL1ToL2Message(inbox, leaf, fromBlock, toBlock) {
@@ -4,24 +4,24 @@ import { SerializableContractInstance, SerializableContractInstanceUpdate } from
4
4
  */ export class ContractInstanceStore {
5
5
  db;
6
6
  #contractInstances;
7
- #contractInstanceDeployedAt;
7
+ #contractInstancePublishedAt;
8
8
  #contractInstanceUpdates;
9
9
  constructor(db){
10
10
  this.db = db;
11
11
  this.#contractInstances = db.openMap('archiver_contract_instances');
12
- this.#contractInstanceDeployedAt = db.openMap('archiver_contract_instances_deployment_block_number');
12
+ this.#contractInstancePublishedAt = db.openMap('archiver_contract_instances_publication_block_number');
13
13
  this.#contractInstanceUpdates = db.openMap('archiver_contract_instance_updates');
14
14
  }
15
15
  addContractInstance(contractInstance, blockNumber) {
16
16
  return this.db.transactionAsync(async ()=>{
17
17
  await this.#contractInstances.set(contractInstance.address.toString(), new SerializableContractInstance(contractInstance).toBuffer());
18
- await this.#contractInstanceDeployedAt.set(contractInstance.address.toString(), blockNumber);
18
+ await this.#contractInstancePublishedAt.set(contractInstance.address.toString(), blockNumber);
19
19
  });
20
20
  }
21
21
  deleteContractInstance(contractInstance) {
22
22
  return this.db.transactionAsync(async ()=>{
23
23
  await this.#contractInstances.delete(contractInstance.address.toString());
24
- await this.#contractInstanceDeployedAt.delete(contractInstance.address.toString());
24
+ await this.#contractInstancePublishedAt.delete(contractInstance.address.toString());
25
25
  });
26
26
  }
27
27
  getUpdateKey(contractAddress, timestamp, logIndex) {
@@ -72,6 +72,6 @@ import { SerializableContractInstance, SerializableContractInstanceUpdate } from
72
72
  return instance;
73
73
  }
74
74
  getContractInstanceDeploymentBlockNumber(address) {
75
- return this.#contractInstanceDeployedAt.getAsync(address.toString());
75
+ return this.#contractInstancePublishedAt.getAsync(address.toString());
76
76
  }
77
77
  }
@@ -59,7 +59,7 @@ import { ContractClassLog, ExtendedContractClassLog, ExtendedPublicLog, LogId, P
59
59
  acc.set(tag, currentLogs.concat(logs));
60
60
  }
61
61
  return acc;
62
- });
62
+ }, new Map());
63
63
  const tagsToUpdate = Array.from(taggedLogsToAdd.keys());
64
64
  return this.db.transactionAsync(async ()=>{
65
65
  const currentTaggedLogs = await Promise.all(tagsToUpdate.map(async (tag)=>({
@@ -0,0 +1,11 @@
1
+ import type { EpochCache } from '@aztec/epoch-cache';
2
+ import type { Logger } from '@aztec/foundation/log';
3
+ import { type PublishedL2Block, type ValidateBlockResult } from '@aztec/stdlib/block';
4
+ import { type L1RollupConstants } from '@aztec/stdlib/epoch-helpers';
5
+ export type { ValidateBlockResult };
6
+ /**
7
+ * Validates the attestations submitted for the given block.
8
+ * Returns true if the attestations are valid and sufficient, false otherwise.
9
+ */
10
+ export declare function validateBlockAttestations(publishedBlock: PublishedL2Block, epochCache: EpochCache, constants: Pick<L1RollupConstants, 'epochDuration'>, logger?: Logger): Promise<ValidateBlockResult>;
11
+ //# sourceMappingURL=validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/archiver/validation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EACL,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,EAEzB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,KAAK,iBAAiB,EAAkB,MAAM,6BAA6B,CAAC;AAErF,YAAY,EAAE,mBAAmB,EAAE,CAAC;AAEpC;;;GAGG;AACH,wBAAsB,yBAAyB,CAC7C,cAAc,EAAE,gBAAgB,EAChC,UAAU,EAAE,UAAU,EACtB,SAAS,EAAE,IAAI,CAAC,iBAAiB,EAAE,eAAe,CAAC,EACnD,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,mBAAmB,CAAC,CAiD9B"}
@@ -0,0 +1,76 @@
1
+ import { getAttestationsFromPublishedL2Block } from '@aztec/stdlib/block';
2
+ import { getEpochAtSlot } from '@aztec/stdlib/epoch-helpers';
3
+ /**
4
+ * Validates the attestations submitted for the given block.
5
+ * Returns true if the attestations are valid and sufficient, false otherwise.
6
+ */ export async function validateBlockAttestations(publishedBlock, epochCache, constants, logger) {
7
+ const attestations = getAttestationsFromPublishedL2Block(publishedBlock);
8
+ const { block } = publishedBlock;
9
+ const blockHash = await block.hash().then((hash)=>hash.toString());
10
+ const archiveRoot = block.archive.root.toString();
11
+ const slot = block.header.getSlot();
12
+ const epoch = getEpochAtSlot(slot, constants);
13
+ const { committee, seed } = await epochCache.getCommitteeForEpoch(epoch);
14
+ const logData = {
15
+ blockNumber: block.number,
16
+ slot,
17
+ epoch,
18
+ blockHash,
19
+ archiveRoot
20
+ };
21
+ logger?.debug(`Validating attestations for block ${block.number} at slot ${slot} in epoch ${epoch}`, {
22
+ committee: (committee ?? []).map((member)=>member.toString()),
23
+ recoveredAttestors: attestations.map((a)=>a.getSender().toString()),
24
+ postedAttestations: publishedBlock.attestations.map((a)=>a.address.isZero() ? a.signature.toString() : a.address.toString()),
25
+ ...logData
26
+ });
27
+ if (!committee || committee.length === 0) {
28
+ logger?.warn(`No committee found for epoch ${epoch} at slot ${slot}. Accepting block without validation.`, logData);
29
+ return {
30
+ valid: true
31
+ };
32
+ }
33
+ const committeeSet = new Set(committee.map((member)=>member.toString()));
34
+ const requiredAttestationCount = Math.floor(committee.length * 2 / 3) + 1;
35
+ for(let i = 0; i < attestations.length; i++){
36
+ const attestation = attestations[i];
37
+ const signer = attestation.getSender().toString();
38
+ if (!committeeSet.has(signer)) {
39
+ logger?.warn(`Attestation from non-committee member ${signer} at slot ${slot}`, {
40
+ committee
41
+ });
42
+ const reason = 'invalid-attestation';
43
+ return {
44
+ valid: false,
45
+ reason,
46
+ invalidIndex: i,
47
+ block: publishedBlock,
48
+ committee,
49
+ seed,
50
+ epoch,
51
+ attestations
52
+ };
53
+ }
54
+ }
55
+ if (attestations.length < requiredAttestationCount) {
56
+ logger?.warn(`Insufficient attestations for block at slot ${slot}`, {
57
+ requiredAttestations: requiredAttestationCount,
58
+ actualAttestations: attestations.length,
59
+ ...logData
60
+ });
61
+ const reason = 'insufficient-attestations';
62
+ return {
63
+ valid: false,
64
+ reason,
65
+ block: publishedBlock,
66
+ committee,
67
+ seed,
68
+ epoch,
69
+ attestations
70
+ };
71
+ }
72
+ logger?.debug(`Block attestations validated successfully for block ${block.number} at slot ${slot}`, logData);
73
+ return {
74
+ valid: true
75
+ };
76
+ }
package/dest/factory.d.ts CHANGED
@@ -1,8 +1,7 @@
1
- import type { BlobSinkClientInterface } from '@aztec/blob-sink/client';
2
1
  import type { DataStoreConfig } from '@aztec/kv-store/config';
3
2
  import type { L2BlockSourceEventEmitter } from '@aztec/stdlib/block';
4
3
  import type { ArchiverApi, Service } from '@aztec/stdlib/interfaces/server';
5
- import { type TelemetryClient } from '@aztec/telemetry-client';
4
+ import { type ArchiverDeps } from './archiver/archiver.js';
6
5
  import type { ArchiverConfig } from './archiver/config.js';
7
6
  import { KVArchiverDataStore } from './archiver/kv_archiver_store/kv_archiver_store.js';
8
7
  export declare const ARCHIVER_STORE_NAME = "archiver";
@@ -16,9 +15,9 @@ export declare function createArchiverStore(userConfig: Pick<ArchiverConfig, 'ar
16
15
  * @param telemetry - The telemetry client.
17
16
  * @returns The local archiver.
18
17
  */
19
- export declare function createArchiver(config: ArchiverConfig & DataStoreConfig, blobSinkClient: BlobSinkClientInterface, opts?: {
18
+ export declare function createArchiver(config: ArchiverConfig & DataStoreConfig, deps: ArchiverDeps, opts?: {
20
19
  blockUntilSync: boolean;
21
- }, telemetry?: TelemetryClient): Promise<ArchiverApi & Service & L2BlockSourceEventEmitter>;
20
+ }): Promise<ArchiverApi & Service & L2BlockSourceEventEmitter>;
22
21
  /**
23
22
  * Creates a remote archiver client.
24
23
  * @param config - The archiver configuration.
@@ -1 +1 @@
1
- {"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../src/factory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAEvE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAM9D,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAErE,OAAO,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,iCAAiC,CAAC;AAE5E,OAAO,EAAE,KAAK,eAAe,EAAsB,MAAM,yBAAyB,CAAC;AAGnF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAuB,mBAAmB,EAAE,MAAM,mDAAmD,CAAC;AAG7G,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;;;;;;;GAOG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,cAAc,GAAG,eAAe,EACxC,cAAc,EAAE,uBAAuB,EACvC,IAAI,GAAE;IAAE,cAAc,EAAE,OAAO,CAAA;CAA6B,EAC5D,SAAS,GAAE,eAAsC,GAChD,OAAO,CAAC,WAAW,GAAG,OAAO,GAAG,yBAAyB,CAAC,CAI5D;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,cAAc,GAAG,WAAW,CASxE"}
1
+ {"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../src/factory.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAM9D,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAErE,OAAO,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,iCAAiC,CAAC;AAG5E,OAAO,EAAY,KAAK,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACrE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAuB,mBAAmB,EAAE,MAAM,mDAAmD,CAAC;AAG7G,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;;;;;;;GAOG;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,WAAW,GAAG,OAAO,GAAG,yBAAyB,CAAC,CAI5D;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,cAAc,GAAG,WAAW,CASxE"}
package/dest/factory.js CHANGED
@@ -6,7 +6,6 @@ import { BundledProtocolContractsProvider } from '@aztec/protocol-contracts/prov
6
6
  import { FunctionType, decodeFunctionSignature } from '@aztec/stdlib/abi';
7
7
  import { computePublicBytecodeCommitment } from '@aztec/stdlib/contract';
8
8
  import { getComponentsVersionsFromConfig } from '@aztec/stdlib/versioning';
9
- import { getTelemetryClient } from '@aztec/telemetry-client';
10
9
  import { Archiver } from './archiver/archiver.js';
11
10
  import { ARCHIVER_DB_VERSION, KVArchiverDataStore } from './archiver/kv_archiver_store/kv_archiver_store.js';
12
11
  import { createArchiverClient } from './rpc/index.js';
@@ -26,15 +25,12 @@ export const ARCHIVER_STORE_NAME = 'archiver';
26
25
  * @param opts - The options.
27
26
  * @param telemetry - The telemetry client.
28
27
  * @returns The local archiver.
29
- */ export async function createArchiver(config, blobSinkClient, opts = {
28
+ */ export async function createArchiver(config, deps, opts = {
30
29
  blockUntilSync: true
31
- }, telemetry = getTelemetryClient()) {
30
+ }) {
32
31
  const archiverStore = await createArchiverStore(config);
33
32
  await registerProtocolContracts(archiverStore);
34
- return Archiver.createAndSync(config, archiverStore, {
35
- telemetry,
36
- blobSinkClient
37
- }, opts.blockUntilSync);
33
+ return Archiver.createAndSync(config, archiverStore, deps, opts.blockUntilSync);
38
34
  }
39
35
  /**
40
36
  * Creates a remote archiver client.