@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.
- package/dest/archiver/archiver.js +1 -1
- package/dest/archiver/data_retrieval.d.ts +4 -3
- package/dest/archiver/data_retrieval.d.ts.map +1 -1
- package/dest/archiver/data_retrieval.js +24 -17
- package/dest/archiver/kv_archiver_store/block_store.js +4 -4
- package/dest/test/mock_l2_block_source.d.ts.map +1 -1
- package/dest/test/mock_l2_block_source.js +4 -3
- package/package.json +13 -13
- package/src/archiver/archiver.ts +1 -1
- package/src/archiver/data_retrieval.ts +26 -18
- package/src/archiver/kv_archiver_store/block_store.ts +3 -3
- package/src/test/mock_l2_block_source.ts +4 -3
|
@@ -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 {
|
|
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:
|
|
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":"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;AAEhE,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,
|
|
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 {
|
|
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:
|
|
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:
|
|
21
|
-
timestamp:
|
|
22
|
-
coinbase:
|
|
23
|
-
feeRecipient:
|
|
24
|
-
gasFees:
|
|
21
|
+
slotNumber: checkpointHeader.slotNumber,
|
|
22
|
+
timestamp: checkpointHeader.timestamp,
|
|
23
|
+
coinbase: checkpointHeader.coinbase,
|
|
24
|
+
feeRecipient: checkpointHeader.feeRecipient,
|
|
25
|
+
gasFees: checkpointHeader.gasFees
|
|
25
26
|
});
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
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:
|
|
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
|
-
|
|
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 {
|
|
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 =
|
|
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 =
|
|
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":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAC3D,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAC;AAEnD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EACL,OAAO,EACP,WAAW,EACX,KAAK,aAAa,EAClB,KAAK,MAAM,EACX,gBAAgB,EAChB,KAAK,mBAAmB,EACzB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,2BAA2B,EAAE,MAAM,wBAAwB,CAAC;AACnH,OAAO,EAA0B,KAAK,iBAAiB,EAAwB,MAAM,6BAA6B,CAAC;AACnH,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,EAAE,SAAS,EAAY,MAAM,kBAAkB,CAAC;AACjF,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAElD;;GAEG;AACH,qBAAa,iBAAkB,YAAW,aAAa,EAAE,kBAAkB;IACzE,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAM;IAEnC,OAAO,CAAC,iBAAiB,CAAa;IACtC,OAAO,CAAC,oBAAoB,CAAa;IAEzC,OAAO,CAAC,GAAG,CAAiD;IAE/C,YAAY,CAAC,SAAS,EAAE,MAAM;IAUpC,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE;IAK3B,YAAY,CAAC,SAAS,EAAE,MAAM;IAK9B,oBAAoB,CAAC,iBAAiB,EAAE,MAAM;IAI9C,uBAAuB,CAAC,oBAAoB,EAAE,MAAM;IAO3D;;;OAGG;IACH,gBAAgB,IAAI,OAAO,CAAC,UAAU,CAAC;IAIvC;;;OAGG;IACH,kBAAkB,IAAI,OAAO,CAAC,UAAU,CAAC;IAIzC;;;OAGG;IACI,cAAc;IAId,oBAAoB,IAAI,OAAO,CAAC,MAAM,CAAC;IAI9C;;;;OAIG;IACI,QAAQ,CAAC,MAAM,EAAE,MAAM;IAI9B;;;;;OAKG;IACI,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO;IAQjD,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO;IAe7E,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;IAI3E,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;
|
|
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)?.
|
|
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
|
-
|
|
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.
|
|
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.
|
|
70
|
-
"@aztec/blob-sink": "3.0.0-nightly.
|
|
71
|
-
"@aztec/constants": "3.0.0-nightly.
|
|
72
|
-
"@aztec/epoch-cache": "3.0.0-nightly.
|
|
73
|
-
"@aztec/ethereum": "3.0.0-nightly.
|
|
74
|
-
"@aztec/foundation": "3.0.0-nightly.
|
|
75
|
-
"@aztec/kv-store": "3.0.0-nightly.
|
|
76
|
-
"@aztec/l1-artifacts": "3.0.0-nightly.
|
|
77
|
-
"@aztec/noir-protocol-circuits-types": "3.0.0-nightly.
|
|
78
|
-
"@aztec/protocol-contracts": "3.0.0-nightly.
|
|
79
|
-
"@aztec/stdlib": "3.0.0-nightly.
|
|
80
|
-
"@aztec/telemetry-client": "3.0.0-nightly.
|
|
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",
|
package/src/archiver/archiver.ts
CHANGED
|
@@ -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 {
|
|
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:
|
|
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:
|
|
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:
|
|
73
|
-
timestamp:
|
|
74
|
-
coinbase:
|
|
75
|
-
feeRecipient:
|
|
76
|
-
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
|
-
|
|
80
|
-
|
|
81
|
-
|
|
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:
|
|
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
|
-
|
|
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 =
|
|
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 =
|
|
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)?.
|
|
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
|
-
|
|
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
|
/**
|