@aztec/archiver 3.0.0-nightly.20250917 → 3.0.0-nightly.20250919

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.
@@ -591,7 +591,7 @@ function mapArchiverConfig(config) {
591
591
  }
592
592
  const lastProcessedL1BlockNumber = retrievedBlocks[retrievedBlocks.length - 1].l1.blockNumber;
593
593
  this.log.debug(`Retrieved ${retrievedBlocks.length} new L2 blocks between L1 blocks ${searchStartBlock} and ${searchEndBlock} with last processed L1 block ${lastProcessedL1BlockNumber}.`);
594
- const publishedBlocks = retrievedBlocks.map((b)=>retrievedBlockToPublishedL2Block(b));
594
+ const publishedBlocks = await Promise.all(retrievedBlocks.map((b)=>retrievedBlockToPublishedL2Block(b)));
595
595
  const validBlocks = [];
596
596
  for (const block of publishedBlocks){
597
597
  const validationResult = this.config.skipValidateBlockAttestations ? {
@@ -6,7 +6,8 @@ import { type Logger } from '@aztec/foundation/log';
6
6
  import { type InboxAbi, RollupAbi } from '@aztec/l1-artifacts';
7
7
  import { Body, CommitteeAttestation, PublishedL2Block } from '@aztec/stdlib/block';
8
8
  import { Proof } from '@aztec/stdlib/proofs';
9
- import { ProposedBlockHeader, StateReference } from '@aztec/stdlib/tx';
9
+ import { CheckpointHeader } from '@aztec/stdlib/rollup';
10
+ import { StateReference } from '@aztec/stdlib/tx';
10
11
  import { type GetContractReturnType, type Hex } from 'viem';
11
12
  import type { DataRetrieval } from './structs/data_retrieval.js';
12
13
  import type { InboxMessage } from './structs/inbox_message.js';
@@ -15,14 +16,14 @@ export type RetrievedL2Block = {
15
16
  l2BlockNumber: number;
16
17
  archiveRoot: Fr;
17
18
  stateReference: StateReference;
18
- header: ProposedBlockHeader;
19
+ header: CheckpointHeader;
19
20
  body: Body;
20
21
  l1: L1PublishedData;
21
22
  chainId: Fr;
22
23
  version: Fr;
23
24
  attestations: CommitteeAttestation[];
24
25
  };
25
- export declare function retrievedBlockToPublishedL2Block(retrievedBlock: RetrievedL2Block): PublishedL2Block;
26
+ export declare function retrievedBlockToPublishedL2Block(retrievedBlock: RetrievedL2Block): Promise<PublishedL2Block>;
26
27
  /**
27
28
  * Fetches new L2 blocks.
28
29
  * @param publicClient - The viem public client to use for transaction retrieval.
@@ -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":"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"}
@@ -1,35 +1,44 @@
1
- import { Blob, BlobDeserializationError } from '@aztec/blob-lib';
1
+ import { Blob, BlobDeserializationError, SpongeBlob } from '@aztec/blob-lib';
2
2
  import { asyncPool } from '@aztec/foundation/async-pool';
3
3
  import { Buffer16, Buffer32 } from '@aztec/foundation/buffer';
4
4
  import { Fr } from '@aztec/foundation/fields';
5
5
  import { createLogger } from '@aztec/foundation/log';
6
6
  import { RollupAbi } from '@aztec/l1-artifacts';
7
- import { Body, CommitteeAttestation, L2Block, PublishedL2Block } from '@aztec/stdlib/block';
7
+ import { Body, CommitteeAttestation, L2Block, L2BlockHeader, PublishedL2Block } from '@aztec/stdlib/block';
8
8
  import { Proof } from '@aztec/stdlib/proofs';
9
+ import { CheckpointHeader } from '@aztec/stdlib/rollup';
9
10
  import { AppendOnlyTreeSnapshot } from '@aztec/stdlib/trees';
10
- import { BlockHeader, GlobalVariables, ProposedBlockHeader, StateReference } from '@aztec/stdlib/tx';
11
+ import { GlobalVariables, StateReference } from '@aztec/stdlib/tx';
11
12
  import { decodeFunctionData, getAbiItem, hexToBytes, multicall3Abi } from 'viem';
12
13
  import { NoBlobBodiesFoundError } from './errors.js';
13
- export function retrievedBlockToPublishedL2Block(retrievedBlock) {
14
- const { l2BlockNumber, archiveRoot, stateReference, header: proposedHeader, body, l1, chainId, version, attestations } = retrievedBlock;
14
+ export async function retrievedBlockToPublishedL2Block(retrievedBlock) {
15
+ const { l2BlockNumber, archiveRoot, stateReference, header: checkpointHeader, body, l1, chainId, version, attestations } = retrievedBlock;
15
16
  const archive = new AppendOnlyTreeSnapshot(archiveRoot, l2BlockNumber + 1);
16
17
  const globalVariables = GlobalVariables.from({
17
18
  chainId,
18
19
  version,
19
20
  blockNumber: l2BlockNumber,
20
- slotNumber: proposedHeader.slotNumber,
21
- timestamp: proposedHeader.timestamp,
22
- coinbase: proposedHeader.coinbase,
23
- feeRecipient: proposedHeader.feeRecipient,
24
- gasFees: proposedHeader.gasFees
21
+ slotNumber: checkpointHeader.slotNumber,
22
+ timestamp: checkpointHeader.timestamp,
23
+ coinbase: checkpointHeader.coinbase,
24
+ feeRecipient: checkpointHeader.feeRecipient,
25
+ gasFees: checkpointHeader.gasFees
25
26
  });
26
- const header = BlockHeader.from({
27
- lastArchive: new AppendOnlyTreeSnapshot(proposedHeader.lastArchiveRoot, l2BlockNumber),
28
- contentCommitment: proposedHeader.contentCommitment,
27
+ // TODO(#17027)
28
+ // This works when there's only one block in the checkpoint.
29
+ // If there's more than one block, we need to build the spongeBlob from the endSpongeBlob of the previous block.
30
+ const blobFields = body.toBlobFields();
31
+ const spongeBlob = SpongeBlob.init(blobFields.length);
32
+ await spongeBlob.absorb(blobFields);
33
+ const spongeBlobHash = await spongeBlob.squeeze();
34
+ const header = L2BlockHeader.from({
35
+ lastArchive: new AppendOnlyTreeSnapshot(checkpointHeader.lastArchiveRoot, l2BlockNumber),
36
+ contentCommitment: checkpointHeader.contentCommitment,
29
37
  state: stateReference,
30
38
  globalVariables,
31
39
  totalFees: body.txEffects.reduce((accum, txEffect)=>accum.add(txEffect.transactionFee), Fr.ZERO),
32
- totalManaUsed: proposedHeader.totalManaUsed
40
+ totalManaUsed: checkpointHeader.totalManaUsed,
41
+ spongeBlobHash
33
42
  });
34
43
  const block = new L2Block(archive, header, body);
35
44
  return PublishedL2Block.fromFields({
@@ -203,9 +212,7 @@ export async function getL1BlockTime(publicClient, blockNumber) {
203
212
  packedAttestations,
204
213
  targetCommitteeSize
205
214
  });
206
- // TODO(md): why is the proposed block header different to the actual block header?
207
- // This is likely going to be a footgun
208
- const header = ProposedBlockHeader.fromViem(decodedArgs.header);
215
+ const header = CheckpointHeader.fromViem(decodedArgs.header);
209
216
  const blobBodies = await blobSinkClient.getBlobSidecar(blockHash, blobHashes);
210
217
  if (blobBodies.length === 0) {
211
218
  throw new NoBlobBodiesFoundError(l2BlockNumber);
@@ -5,9 +5,9 @@ import { createLogger } from '@aztec/foundation/log';
5
5
  import { BufferReader } from '@aztec/foundation/serialize';
6
6
  import { bufferToHex } from '@aztec/foundation/string';
7
7
  import { Body, CommitteeAttestation, L2Block, L2BlockHash, PublishedL2Block } from '@aztec/stdlib/block';
8
- import { deserializeValidateBlockResult, serializeValidateBlockResult } from '@aztec/stdlib/block';
8
+ import { L2BlockHeader, deserializeValidateBlockResult, serializeValidateBlockResult } from '@aztec/stdlib/block';
9
9
  import { AppendOnlyTreeSnapshot } from '@aztec/stdlib/trees';
10
- import { BlockHeader, TxHash, TxReceipt, deserializeIndexedTxEffect, serializeIndexedTxEffect } from '@aztec/stdlib/tx';
10
+ import { TxHash, TxReceipt, deserializeIndexedTxEffect, serializeIndexedTxEffect } from '@aztec/stdlib/tx';
11
11
  import { BlockNumberNotSequentialError, InitialBlockNumberNotSequentialError } from '../errors.js';
12
12
  export { TxReceipt } from '@aztec/stdlib/tx';
13
13
  /**
@@ -146,7 +146,7 @@ export { TxReceipt } from '@aztec/stdlib/tx';
146
146
  * @returns The requested L2 block headers
147
147
  */ async *getBlockHeaders(start, limit) {
148
148
  for await (const [blockNumber, blockStorage] of this.getBlockStorages(start, limit)){
149
- const header = BlockHeader.fromBuffer(blockStorage.header);
149
+ const header = L2BlockHeader.fromBuffer(blockStorage.header).toBlockHeader();
150
150
  if (header.getBlockNumber() !== blockNumber) {
151
151
  throw new Error(`Block number mismatch when retrieving block header from archive (expected ${blockNumber} but got ${header.getBlockNumber()})`);
152
152
  }
@@ -167,7 +167,7 @@ export { TxReceipt } from '@aztec/stdlib/tx';
167
167
  }
168
168
  }
169
169
  async getBlockFromBlockStorage(blockNumber, blockStorage) {
170
- const header = BlockHeader.fromBuffer(blockStorage.header);
170
+ const header = L2BlockHeader.fromBuffer(blockStorage.header);
171
171
  const archive = AppendOnlyTreeSnapshot.fromBuffer(blockStorage.archive);
172
172
  const blockHash = blockStorage.blockHash;
173
173
  const blockHashString = bufferToHex(blockHash);
@@ -1 +1 @@
1
- {"version":3,"file":"mock_l2_block_source.d.ts","sourceRoot":"","sources":["../../src/test/mock_l2_block_source.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mock_l2_block_source.d.ts","sourceRoot":"","sources":["../../src/test/mock_l2_block_source.ts"],"names":[],"mappings":"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"}
@@ -86,7 +86,7 @@ import { TxReceipt, TxStatus } from '@aztec/stdlib/tx';
86
86
  }));
87
87
  }
88
88
  getBlockHeader(number) {
89
- return Promise.resolve(this.l2Blocks.at(typeof number === 'number' ? number - 1 : -1)?.header);
89
+ return Promise.resolve(this.l2Blocks.at(typeof number === 'number' ? number - 1 : -1)?.getBlockHeader());
90
90
  }
91
91
  getBlocksForEpoch(epochNumber) {
92
92
  const epochDuration = DefaultL1ContractsConfig.aztecEpochDuration;
@@ -99,8 +99,9 @@ import { TxReceipt, TxStatus } from '@aztec/stdlib/tx';
99
99
  });
100
100
  return Promise.resolve(blocks);
101
101
  }
102
- getBlockHeadersForEpoch(epochNumber) {
103
- return this.getBlocksForEpoch(epochNumber).then((blocks)=>blocks.map((b)=>b.header));
102
+ async getBlockHeadersForEpoch(epochNumber) {
103
+ const blocks = await this.getBlocksForEpoch(epochNumber);
104
+ return blocks.map((b)=>b.getBlockHeader());
104
105
  }
105
106
  /**
106
107
  * Gets a tx effect.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aztec/archiver",
3
- "version": "3.0.0-nightly.20250917",
3
+ "version": "3.0.0-nightly.20250919",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": "./dest/index.js",
@@ -66,18 +66,18 @@
66
66
  ]
67
67
  },
68
68
  "dependencies": {
69
- "@aztec/blob-lib": "3.0.0-nightly.20250917",
70
- "@aztec/blob-sink": "3.0.0-nightly.20250917",
71
- "@aztec/constants": "3.0.0-nightly.20250917",
72
- "@aztec/epoch-cache": "3.0.0-nightly.20250917",
73
- "@aztec/ethereum": "3.0.0-nightly.20250917",
74
- "@aztec/foundation": "3.0.0-nightly.20250917",
75
- "@aztec/kv-store": "3.0.0-nightly.20250917",
76
- "@aztec/l1-artifacts": "3.0.0-nightly.20250917",
77
- "@aztec/noir-protocol-circuits-types": "3.0.0-nightly.20250917",
78
- "@aztec/protocol-contracts": "3.0.0-nightly.20250917",
79
- "@aztec/stdlib": "3.0.0-nightly.20250917",
80
- "@aztec/telemetry-client": "3.0.0-nightly.20250917",
69
+ "@aztec/blob-lib": "3.0.0-nightly.20250919",
70
+ "@aztec/blob-sink": "3.0.0-nightly.20250919",
71
+ "@aztec/constants": "3.0.0-nightly.20250919",
72
+ "@aztec/epoch-cache": "3.0.0-nightly.20250919",
73
+ "@aztec/ethereum": "3.0.0-nightly.20250919",
74
+ "@aztec/foundation": "3.0.0-nightly.20250919",
75
+ "@aztec/kv-store": "3.0.0-nightly.20250919",
76
+ "@aztec/l1-artifacts": "3.0.0-nightly.20250919",
77
+ "@aztec/noir-protocol-circuits-types": "3.0.0-nightly.20250919",
78
+ "@aztec/protocol-contracts": "3.0.0-nightly.20250919",
79
+ "@aztec/stdlib": "3.0.0-nightly.20250919",
80
+ "@aztec/telemetry-client": "3.0.0-nightly.20250919",
81
81
  "lodash.groupby": "^4.6.0",
82
82
  "lodash.omit": "^4.5.0",
83
83
  "tsc-watch": "^6.0.0",
@@ -802,7 +802,7 @@ export class Archiver extends (EventEmitter as new () => ArchiverEmitter) implem
802
802
  `Retrieved ${retrievedBlocks.length} new L2 blocks between L1 blocks ${searchStartBlock} and ${searchEndBlock} with last processed L1 block ${lastProcessedL1BlockNumber}.`,
803
803
  );
804
804
 
805
- const publishedBlocks = retrievedBlocks.map(b => retrievedBlockToPublishedL2Block(b));
805
+ const publishedBlocks = await Promise.all(retrievedBlocks.map(b => retrievedBlockToPublishedL2Block(b)));
806
806
  const validBlocks: PublishedL2Block[] = [];
807
807
 
808
808
  for (const block of publishedBlocks) {
@@ -1,4 +1,4 @@
1
- import { Blob, BlobDeserializationError } from '@aztec/blob-lib';
1
+ import { Blob, BlobDeserializationError, SpongeBlob } from '@aztec/blob-lib';
2
2
  import type { BlobSinkClientInterface } from '@aztec/blob-sink/client';
3
3
  import type {
4
4
  EpochProofPublicInputArgs,
@@ -15,10 +15,11 @@ import type { ViemSignature } from '@aztec/foundation/eth-signature';
15
15
  import { Fr } from '@aztec/foundation/fields';
16
16
  import { type Logger, createLogger } from '@aztec/foundation/log';
17
17
  import { type InboxAbi, RollupAbi } from '@aztec/l1-artifacts';
18
- import { Body, CommitteeAttestation, L2Block, PublishedL2Block } from '@aztec/stdlib/block';
18
+ import { Body, CommitteeAttestation, L2Block, L2BlockHeader, PublishedL2Block } from '@aztec/stdlib/block';
19
19
  import { Proof } from '@aztec/stdlib/proofs';
20
+ import { CheckpointHeader } from '@aztec/stdlib/rollup';
20
21
  import { AppendOnlyTreeSnapshot } from '@aztec/stdlib/trees';
21
- import { BlockHeader, GlobalVariables, ProposedBlockHeader, StateReference } from '@aztec/stdlib/tx';
22
+ import { GlobalVariables, StateReference } from '@aztec/stdlib/tx';
22
23
 
23
24
  import {
24
25
  type GetContractEventsReturnType,
@@ -39,7 +40,7 @@ export type RetrievedL2Block = {
39
40
  l2BlockNumber: number;
40
41
  archiveRoot: Fr;
41
42
  stateReference: StateReference;
42
- header: ProposedBlockHeader;
43
+ header: CheckpointHeader;
43
44
  body: Body;
44
45
  l1: L1PublishedData;
45
46
  chainId: Fr;
@@ -47,12 +48,12 @@ export type RetrievedL2Block = {
47
48
  attestations: CommitteeAttestation[];
48
49
  };
49
50
 
50
- export function retrievedBlockToPublishedL2Block(retrievedBlock: RetrievedL2Block): PublishedL2Block {
51
+ export async function retrievedBlockToPublishedL2Block(retrievedBlock: RetrievedL2Block): Promise<PublishedL2Block> {
51
52
  const {
52
53
  l2BlockNumber,
53
54
  archiveRoot,
54
55
  stateReference,
55
- header: proposedHeader,
56
+ header: checkpointHeader,
56
57
  body,
57
58
  l1,
58
59
  chainId,
@@ -69,20 +70,29 @@ export function retrievedBlockToPublishedL2Block(retrievedBlock: RetrievedL2Bloc
69
70
  chainId,
70
71
  version,
71
72
  blockNumber: l2BlockNumber,
72
- slotNumber: proposedHeader.slotNumber,
73
- timestamp: proposedHeader.timestamp,
74
- coinbase: proposedHeader.coinbase,
75
- feeRecipient: proposedHeader.feeRecipient,
76
- gasFees: proposedHeader.gasFees,
73
+ slotNumber: checkpointHeader.slotNumber,
74
+ timestamp: checkpointHeader.timestamp,
75
+ coinbase: checkpointHeader.coinbase,
76
+ feeRecipient: checkpointHeader.feeRecipient,
77
+ gasFees: checkpointHeader.gasFees,
77
78
  });
78
79
 
79
- const header = BlockHeader.from({
80
- lastArchive: new AppendOnlyTreeSnapshot(proposedHeader.lastArchiveRoot, l2BlockNumber),
81
- contentCommitment: proposedHeader.contentCommitment,
80
+ // TODO(#17027)
81
+ // This works when there's only one block in the checkpoint.
82
+ // If there's more than one block, we need to build the spongeBlob from the endSpongeBlob of the previous block.
83
+ const blobFields = body.toBlobFields();
84
+ const spongeBlob = SpongeBlob.init(blobFields.length);
85
+ await spongeBlob.absorb(blobFields);
86
+ const spongeBlobHash = await spongeBlob.squeeze();
87
+
88
+ const header = L2BlockHeader.from({
89
+ lastArchive: new AppendOnlyTreeSnapshot(checkpointHeader.lastArchiveRoot, l2BlockNumber),
90
+ contentCommitment: checkpointHeader.contentCommitment,
82
91
  state: stateReference,
83
92
  globalVariables,
84
93
  totalFees: body.txEffects.reduce((accum, txEffect) => accum.add(txEffect.transactionFee), Fr.ZERO),
85
- totalManaUsed: proposedHeader.totalManaUsed,
94
+ totalManaUsed: checkpointHeader.totalManaUsed,
95
+ spongeBlobHash,
86
96
  });
87
97
 
88
98
  const block = new L2Block(archive, header, body);
@@ -337,9 +347,7 @@ async function getBlockFromRollupTx(
337
347
  targetCommitteeSize,
338
348
  });
339
349
 
340
- // TODO(md): why is the proposed block header different to the actual block header?
341
- // This is likely going to be a footgun
342
- const header = ProposedBlockHeader.fromViem(decodedArgs.header);
350
+ const header = CheckpointHeader.fromViem(decodedArgs.header);
343
351
  const blobBodies = await blobSinkClient.getBlobSidecar(blockHash, blobHashes);
344
352
  if (blobBodies.length === 0) {
345
353
  throw new NoBlobBodiesFoundError(l2BlockNumber);
@@ -14,7 +14,7 @@ import {
14
14
  PublishedL2Block,
15
15
  type ValidateBlockResult,
16
16
  } from '@aztec/stdlib/block';
17
- import { deserializeValidateBlockResult, serializeValidateBlockResult } from '@aztec/stdlib/block';
17
+ import { L2BlockHeader, deserializeValidateBlockResult, serializeValidateBlockResult } from '@aztec/stdlib/block';
18
18
  import { AppendOnlyTreeSnapshot } from '@aztec/stdlib/trees';
19
19
  import {
20
20
  BlockHeader,
@@ -213,7 +213,7 @@ export class BlockStore {
213
213
  */
214
214
  async *getBlockHeaders(start: number, limit: number): AsyncIterableIterator<BlockHeader> {
215
215
  for await (const [blockNumber, blockStorage] of this.getBlockStorages(start, limit)) {
216
- const header = BlockHeader.fromBuffer(blockStorage.header);
216
+ const header = L2BlockHeader.fromBuffer(blockStorage.header).toBlockHeader();
217
217
  if (header.getBlockNumber() !== blockNumber) {
218
218
  throw new Error(
219
219
  `Block number mismatch when retrieving block header from archive (expected ${blockNumber} but got ${header.getBlockNumber()})`,
@@ -240,7 +240,7 @@ export class BlockStore {
240
240
  blockNumber: number,
241
241
  blockStorage: BlockStorage,
242
242
  ): Promise<PublishedL2Block | undefined> {
243
- const header = BlockHeader.fromBuffer(blockStorage.header);
243
+ const header = L2BlockHeader.fromBuffer(blockStorage.header);
244
244
  const archive = AppendOnlyTreeSnapshot.fromBuffer(blockStorage.archive);
245
245
  const blockHash = blockStorage.blockHash;
246
246
  const blockHashString = bufferToHex(blockHash);
@@ -127,7 +127,7 @@ export class MockL2BlockSource implements L2BlockSource, ContractDataSource {
127
127
  }
128
128
 
129
129
  getBlockHeader(number: number | 'latest'): Promise<BlockHeader | undefined> {
130
- return Promise.resolve(this.l2Blocks.at(typeof number === 'number' ? number - 1 : -1)?.header);
130
+ return Promise.resolve(this.l2Blocks.at(typeof number === 'number' ? number - 1 : -1)?.getBlockHeader());
131
131
  }
132
132
 
133
133
  getBlocksForEpoch(epochNumber: bigint): Promise<L2Block[]> {
@@ -140,8 +140,9 @@ export class MockL2BlockSource implements L2BlockSource, ContractDataSource {
140
140
  return Promise.resolve(blocks);
141
141
  }
142
142
 
143
- getBlockHeadersForEpoch(epochNumber: bigint): Promise<BlockHeader[]> {
144
- return this.getBlocksForEpoch(epochNumber).then(blocks => blocks.map(b => b.header));
143
+ async getBlockHeadersForEpoch(epochNumber: bigint): Promise<BlockHeader[]> {
144
+ const blocks = await this.getBlocksForEpoch(epochNumber);
145
+ return blocks.map(b => b.getBlockHeader());
145
146
  }
146
147
 
147
148
  /**