@aztec/archiver 3.0.3 → 4.0.0-devnet.1-patch.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +156 -22
- package/dest/archiver.d.ts +136 -0
- package/dest/archiver.d.ts.map +1 -0
- package/dest/archiver.js +781 -0
- package/dest/{archiver/config.d.ts → config.d.ts} +11 -3
- package/dest/config.d.ts.map +1 -0
- package/dest/{archiver/config.js → config.js} +13 -4
- package/dest/errors.d.ts +41 -0
- package/dest/errors.d.ts.map +1 -0
- package/dest/errors.js +62 -0
- package/dest/factory.d.ts +9 -7
- package/dest/factory.d.ts.map +1 -1
- package/dest/factory.js +91 -11
- package/dest/index.d.ts +10 -4
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +8 -3
- package/dest/interfaces.d.ts +9 -0
- package/dest/interfaces.d.ts.map +1 -0
- package/dest/interfaces.js +3 -0
- package/dest/{archiver/l1 → l1}/bin/retrieve-calldata.d.ts +1 -1
- package/dest/l1/bin/retrieve-calldata.d.ts.map +1 -0
- package/dest/{archiver/l1 → l1}/bin/retrieve-calldata.js +21 -20
- package/dest/{archiver/l1 → l1}/calldata_retriever.d.ts +18 -4
- package/dest/l1/calldata_retriever.d.ts.map +1 -0
- package/dest/{archiver/l1 → l1}/calldata_retriever.js +75 -7
- package/dest/l1/data_retrieval.d.ts +88 -0
- package/dest/l1/data_retrieval.d.ts.map +1 -0
- package/dest/{archiver/l1 → l1}/data_retrieval.js +61 -67
- package/dest/{archiver/l1 → l1}/debug_tx.d.ts +1 -1
- package/dest/l1/debug_tx.d.ts.map +1 -0
- package/dest/{archiver/l1 → l1}/spire_proposer.d.ts +1 -1
- package/dest/l1/spire_proposer.d.ts.map +1 -0
- package/dest/{archiver/l1 → l1}/trace_tx.d.ts +1 -1
- package/dest/l1/trace_tx.d.ts.map +1 -0
- package/dest/l1/types.d.ts +12 -0
- package/dest/l1/types.d.ts.map +1 -0
- package/dest/{archiver/l1 → l1}/validate_trace.d.ts +6 -3
- package/dest/l1/validate_trace.d.ts.map +1 -0
- package/dest/{archiver/l1 → l1}/validate_trace.js +14 -10
- package/dest/modules/data_source_base.d.ts +84 -0
- package/dest/modules/data_source_base.d.ts.map +1 -0
- package/dest/modules/data_source_base.js +260 -0
- package/dest/modules/data_store_updater.d.ts +73 -0
- package/dest/modules/data_store_updater.d.ts.map +1 -0
- package/dest/modules/data_store_updater.js +302 -0
- package/dest/modules/instrumentation.d.ts +37 -0
- package/dest/modules/instrumentation.d.ts.map +1 -0
- package/dest/{archiver → modules}/instrumentation.js +24 -65
- package/dest/modules/l1_synchronizer.d.ts +75 -0
- package/dest/modules/l1_synchronizer.d.ts.map +1 -0
- package/dest/modules/l1_synchronizer.js +1112 -0
- package/dest/modules/validation.d.ts +17 -0
- package/dest/modules/validation.d.ts.map +1 -0
- package/dest/{archiver → modules}/validation.js +7 -1
- package/dest/store/block_store.d.ts +192 -0
- package/dest/store/block_store.d.ts.map +1 -0
- package/dest/store/block_store.js +721 -0
- package/dest/store/contract_class_store.d.ts +18 -0
- package/dest/store/contract_class_store.d.ts.map +1 -0
- package/dest/{archiver/kv_archiver_store → store}/contract_class_store.js +12 -8
- package/dest/store/contract_instance_store.d.ts +24 -0
- package/dest/store/contract_instance_store.d.ts.map +1 -0
- package/dest/{archiver/kv_archiver_store → store}/contract_instance_store.js +1 -1
- package/dest/store/kv_archiver_store.d.ts +340 -0
- package/dest/store/kv_archiver_store.d.ts.map +1 -0
- package/dest/store/kv_archiver_store.js +446 -0
- package/dest/store/log_store.d.ts +54 -0
- package/dest/store/log_store.d.ts.map +1 -0
- package/dest/store/log_store.js +456 -0
- package/dest/{archiver/kv_archiver_store → store}/message_store.d.ts +1 -1
- package/dest/store/message_store.d.ts.map +1 -0
- package/dest/{archiver/structs → structs}/data_retrieval.d.ts +1 -1
- package/dest/structs/data_retrieval.d.ts.map +1 -0
- package/dest/structs/inbox_message.d.ts +15 -0
- package/dest/structs/inbox_message.d.ts.map +1 -0
- package/dest/structs/published.d.ts +2 -0
- package/dest/structs/published.d.ts.map +1 -0
- package/dest/test/fake_l1_state.d.ts +190 -0
- package/dest/test/fake_l1_state.d.ts.map +1 -0
- package/dest/test/fake_l1_state.js +383 -0
- package/dest/test/index.d.ts +2 -1
- package/dest/test/index.d.ts.map +1 -1
- package/dest/test/index.js +4 -1
- package/dest/test/mock_archiver.d.ts +2 -2
- package/dest/test/mock_archiver.d.ts.map +1 -1
- package/dest/test/mock_archiver.js +1 -2
- package/dest/test/mock_l1_to_l2_message_source.d.ts +2 -2
- package/dest/test/mock_l1_to_l2_message_source.d.ts.map +1 -1
- package/dest/test/mock_l1_to_l2_message_source.js +12 -3
- package/dest/test/mock_l2_block_source.d.ts +29 -15
- package/dest/test/mock_l2_block_source.d.ts.map +1 -1
- package/dest/test/mock_l2_block_source.js +173 -66
- package/dest/test/mock_structs.d.ts +78 -3
- package/dest/test/mock_structs.d.ts.map +1 -1
- package/dest/test/mock_structs.js +140 -7
- package/dest/test/noop_l1_archiver.d.ts +23 -0
- package/dest/test/noop_l1_archiver.d.ts.map +1 -0
- package/dest/test/noop_l1_archiver.js +68 -0
- package/package.json +16 -17
- package/src/archiver.ts +543 -0
- package/src/{archiver/config.ts → config.ts} +20 -5
- package/src/errors.ts +102 -0
- package/src/factory.ts +133 -11
- package/src/index.ts +10 -3
- package/src/interfaces.ts +9 -0
- package/src/{archiver/l1 → l1}/bin/retrieve-calldata.ts +18 -19
- package/src/{archiver/l1 → l1}/calldata_retriever.ts +119 -9
- package/src/{archiver/l1 → l1}/data_retrieval.ts +91 -87
- package/src/{archiver/l1 → l1}/validate_trace.ts +25 -7
- package/src/modules/data_source_base.ts +367 -0
- package/src/modules/data_store_updater.ts +423 -0
- package/src/{archiver → modules}/instrumentation.ts +24 -68
- package/src/modules/l1_synchronizer.ts +930 -0
- package/src/{archiver → modules}/validation.ts +11 -6
- package/src/store/block_store.ts +966 -0
- package/src/{archiver/kv_archiver_store → store}/contract_class_store.ts +12 -8
- package/src/{archiver/kv_archiver_store → store}/contract_instance_store.ts +1 -1
- package/src/store/kv_archiver_store.ts +639 -0
- package/src/store/log_store.ts +637 -0
- package/src/{archiver/structs → structs}/published.ts +0 -1
- package/src/test/fake_l1_state.ts +599 -0
- package/src/test/index.ts +4 -0
- package/src/test/mock_archiver.ts +2 -2
- package/src/test/mock_l1_to_l2_message_source.ts +10 -4
- package/src/test/mock_l2_block_source.ts +189 -79
- package/src/test/mock_structs.ts +269 -8
- package/src/test/noop_l1_archiver.ts +109 -0
- package/dest/archiver/archiver.d.ts +0 -284
- package/dest/archiver/archiver.d.ts.map +0 -1
- package/dest/archiver/archiver.js +0 -1454
- package/dest/archiver/archiver_store.d.ts +0 -249
- package/dest/archiver/archiver_store.d.ts.map +0 -1
- package/dest/archiver/archiver_store.js +0 -4
- package/dest/archiver/archiver_store_test_suite.d.ts +0 -8
- package/dest/archiver/archiver_store_test_suite.d.ts.map +0 -1
- package/dest/archiver/archiver_store_test_suite.js +0 -1273
- package/dest/archiver/config.d.ts.map +0 -1
- package/dest/archiver/errors.d.ts +0 -12
- package/dest/archiver/errors.d.ts.map +0 -1
- package/dest/archiver/errors.js +0 -17
- package/dest/archiver/index.d.ts +0 -7
- package/dest/archiver/index.d.ts.map +0 -1
- package/dest/archiver/index.js +0 -4
- package/dest/archiver/instrumentation.d.ts +0 -37
- package/dest/archiver/instrumentation.d.ts.map +0 -1
- package/dest/archiver/kv_archiver_store/block_store.d.ts +0 -125
- package/dest/archiver/kv_archiver_store/block_store.d.ts.map +0 -1
- package/dest/archiver/kv_archiver_store/block_store.js +0 -371
- package/dest/archiver/kv_archiver_store/contract_class_store.d.ts +0 -18
- package/dest/archiver/kv_archiver_store/contract_class_store.d.ts.map +0 -1
- package/dest/archiver/kv_archiver_store/contract_instance_store.d.ts +0 -24
- package/dest/archiver/kv_archiver_store/contract_instance_store.d.ts.map +0 -1
- package/dest/archiver/kv_archiver_store/kv_archiver_store.d.ts +0 -162
- package/dest/archiver/kv_archiver_store/kv_archiver_store.d.ts.map +0 -1
- package/dest/archiver/kv_archiver_store/kv_archiver_store.js +0 -288
- package/dest/archiver/kv_archiver_store/log_store.d.ts +0 -42
- package/dest/archiver/kv_archiver_store/log_store.d.ts.map +0 -1
- package/dest/archiver/kv_archiver_store/log_store.js +0 -314
- package/dest/archiver/kv_archiver_store/message_store.d.ts.map +0 -1
- package/dest/archiver/l1/bin/retrieve-calldata.d.ts.map +0 -1
- package/dest/archiver/l1/calldata_retriever.d.ts.map +0 -1
- package/dest/archiver/l1/data_retrieval.d.ts +0 -87
- package/dest/archiver/l1/data_retrieval.d.ts.map +0 -1
- package/dest/archiver/l1/debug_tx.d.ts.map +0 -1
- package/dest/archiver/l1/spire_proposer.d.ts.map +0 -1
- package/dest/archiver/l1/trace_tx.d.ts.map +0 -1
- package/dest/archiver/l1/types.d.ts +0 -12
- package/dest/archiver/l1/types.d.ts.map +0 -1
- package/dest/archiver/l1/validate_trace.d.ts.map +0 -1
- package/dest/archiver/structs/data_retrieval.d.ts.map +0 -1
- package/dest/archiver/structs/inbox_message.d.ts +0 -15
- package/dest/archiver/structs/inbox_message.d.ts.map +0 -1
- package/dest/archiver/structs/published.d.ts +0 -3
- package/dest/archiver/structs/published.d.ts.map +0 -1
- package/dest/archiver/validation.d.ts +0 -17
- package/dest/archiver/validation.d.ts.map +0 -1
- package/dest/rpc/index.d.ts +0 -9
- package/dest/rpc/index.d.ts.map +0 -1
- package/dest/rpc/index.js +0 -15
- package/src/archiver/archiver.ts +0 -1906
- package/src/archiver/archiver_store.ts +0 -302
- package/src/archiver/archiver_store_test_suite.ts +0 -1286
- package/src/archiver/errors.ts +0 -26
- package/src/archiver/index.ts +0 -6
- package/src/archiver/kv_archiver_store/block_store.ts +0 -482
- package/src/archiver/kv_archiver_store/kv_archiver_store.ts +0 -413
- package/src/archiver/kv_archiver_store/log_store.ts +0 -380
- package/src/rpc/index.ts +0 -16
- /package/dest/{archiver/l1 → l1}/debug_tx.js +0 -0
- /package/dest/{archiver/l1 → l1}/spire_proposer.js +0 -0
- /package/dest/{archiver/l1 → l1}/trace_tx.js +0 -0
- /package/dest/{archiver/l1 → l1}/types.js +0 -0
- /package/dest/{archiver/kv_archiver_store → store}/message_store.js +0 -0
- /package/dest/{archiver/structs → structs}/data_retrieval.js +0 -0
- /package/dest/{archiver/structs → structs}/inbox_message.js +0 -0
- /package/dest/{archiver/structs → structs}/published.js +0 -0
- /package/src/{archiver/l1 → l1}/README.md +0 -0
- /package/src/{archiver/l1 → l1}/debug_tx.ts +0 -0
- /package/src/{archiver/l1 → l1}/spire_proposer.ts +0 -0
- /package/src/{archiver/l1 → l1}/trace_tx.ts +0 -0
- /package/src/{archiver/l1 → l1}/types.ts +0 -0
- /package/src/{archiver/kv_archiver_store → store}/message_store.ts +0 -0
- /package/src/{archiver/structs → structs}/data_retrieval.ts +0 -0
- /package/src/{archiver/structs → structs}/inbox_message.ts +0 -0
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { BlobClientInterface } from '@aztec/blob-client/client';
|
|
1
2
|
import {
|
|
2
3
|
BlobDeserializationError,
|
|
3
4
|
type CheckpointBlobData,
|
|
@@ -5,37 +6,33 @@ import {
|
|
|
5
6
|
decodeCheckpointBlobDataFromBlobs,
|
|
6
7
|
encodeBlockBlobData,
|
|
7
8
|
} from '@aztec/blob-lib';
|
|
8
|
-
import type {
|
|
9
|
-
|
|
10
|
-
|
|
9
|
+
import type {
|
|
10
|
+
CheckpointProposedLog,
|
|
11
|
+
EpochProofPublicInputArgs,
|
|
12
|
+
InboxContract,
|
|
13
|
+
MessageSentLog,
|
|
14
|
+
RollupContract,
|
|
15
|
+
} from '@aztec/ethereum/contracts';
|
|
16
|
+
import type { ViemPublicClient, ViemPublicDebugClient } from '@aztec/ethereum/types';
|
|
11
17
|
import { asyncPool } from '@aztec/foundation/async-pool';
|
|
12
|
-
import { CheckpointNumber } from '@aztec/foundation/branded-types';
|
|
13
|
-
import { Buffer16, Buffer32 } from '@aztec/foundation/buffer';
|
|
18
|
+
import { CheckpointNumber, IndexWithinCheckpoint } from '@aztec/foundation/branded-types';
|
|
14
19
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
15
20
|
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
16
21
|
import { type Logger, createLogger } from '@aztec/foundation/log';
|
|
17
|
-
import {
|
|
18
|
-
import { Body, CommitteeAttestation,
|
|
19
|
-
import { Checkpoint, PublishedCheckpoint } from '@aztec/stdlib/checkpoint';
|
|
22
|
+
import { RollupAbi } from '@aztec/l1-artifacts';
|
|
23
|
+
import { Body, CommitteeAttestation, L2Block } from '@aztec/stdlib/block';
|
|
24
|
+
import { Checkpoint, L1PublishedData, PublishedCheckpoint } from '@aztec/stdlib/checkpoint';
|
|
20
25
|
import { Proof } from '@aztec/stdlib/proofs';
|
|
21
26
|
import { CheckpointHeader } from '@aztec/stdlib/rollup';
|
|
22
27
|
import { AppendOnlyTreeSnapshot } from '@aztec/stdlib/trees';
|
|
23
28
|
import { BlockHeader, GlobalVariables, PartialStateReference, StateReference } from '@aztec/stdlib/tx';
|
|
24
29
|
|
|
25
|
-
import {
|
|
26
|
-
type GetContractEventsReturnType,
|
|
27
|
-
type GetContractReturnType,
|
|
28
|
-
type Hex,
|
|
29
|
-
decodeFunctionData,
|
|
30
|
-
getAbiItem,
|
|
31
|
-
hexToBytes,
|
|
32
|
-
} from 'viem';
|
|
30
|
+
import { type Hex, decodeFunctionData, getAbiItem, hexToBytes } from 'viem';
|
|
33
31
|
|
|
34
32
|
import { NoBlobBodiesFoundError } from '../errors.js';
|
|
35
|
-
import type { ArchiverInstrumentation } from '../instrumentation.js';
|
|
33
|
+
import type { ArchiverInstrumentation } from '../modules/instrumentation.js';
|
|
36
34
|
import type { DataRetrieval } from '../structs/data_retrieval.js';
|
|
37
35
|
import type { InboxMessage } from '../structs/inbox_message.js';
|
|
38
|
-
import type { L1PublishedData } from '../structs/published.js';
|
|
39
36
|
import { CalldataRetriever } from './calldata_retriever.js';
|
|
40
37
|
|
|
41
38
|
export type RetrievedCheckpoint = {
|
|
@@ -72,7 +69,7 @@ export async function retrievedToPublishedCheckpoint({
|
|
|
72
69
|
const l1toL2MessageTreeRoot = blocksBlobData[0].l1ToL2MessageRoot!;
|
|
73
70
|
|
|
74
71
|
const spongeBlob = SpongeBlob.init();
|
|
75
|
-
const l2Blocks:
|
|
72
|
+
const l2Blocks: L2Block[] = [];
|
|
76
73
|
for (let i = 0; i < blocksBlobData.length; i++) {
|
|
77
74
|
const blockBlobData = blocksBlobData[i];
|
|
78
75
|
const { blockEndMarker, blockEndStateField, lastArchiveRoot, noteHashRoot, nullifierRoot, publicDataRoot } =
|
|
@@ -103,7 +100,7 @@ export async function retrievedToPublishedCheckpoint({
|
|
|
103
100
|
}),
|
|
104
101
|
});
|
|
105
102
|
|
|
106
|
-
const body = Body.fromTxBlobData(
|
|
103
|
+
const body = Body.fromTxBlobData(blockBlobData.txs);
|
|
107
104
|
|
|
108
105
|
const blobFields = encodeBlockBlobData(blockBlobData);
|
|
109
106
|
await spongeBlob.absorb(blobFields);
|
|
@@ -122,7 +119,7 @@ export async function retrievedToPublishedCheckpoint({
|
|
|
122
119
|
|
|
123
120
|
const newArchive = new AppendOnlyTreeSnapshot(newArchiveRoots[i], l2BlockNumber + 1);
|
|
124
121
|
|
|
125
|
-
l2Blocks.push(new
|
|
122
|
+
l2Blocks.push(new L2Block(newArchive, header, body, checkpointNumber, IndexWithinCheckpoint(i)));
|
|
126
123
|
}
|
|
127
124
|
|
|
128
125
|
const lastBlock = l2Blocks.at(-1)!;
|
|
@@ -138,19 +135,23 @@ export async function retrievedToPublishedCheckpoint({
|
|
|
138
135
|
|
|
139
136
|
/**
|
|
140
137
|
* Fetches new checkpoints.
|
|
138
|
+
* @param rollup - The rollup contract wrapper.
|
|
141
139
|
* @param publicClient - The viem public client to use for transaction retrieval.
|
|
142
140
|
* @param debugClient - The viem debug client to use for trace/debug RPC methods (optional).
|
|
143
|
-
* @param
|
|
141
|
+
* @param blobClient - The blob client client for fetching blob data.
|
|
144
142
|
* @param searchStartBlock - The block number to use for starting the search.
|
|
145
143
|
* @param searchEndBlock - The highest block number that we should search up to.
|
|
146
|
-
* @param
|
|
147
|
-
* @
|
|
144
|
+
* @param contractAddresses - The contract addresses (governanceProposerAddress, slashFactoryAddress, slashingProposerAddress).
|
|
145
|
+
* @param instrumentation - The archiver instrumentation instance.
|
|
146
|
+
* @param logger - The logger instance.
|
|
147
|
+
* @param isHistoricalSync - Whether this is a historical sync.
|
|
148
|
+
* @returns An array of retrieved checkpoints.
|
|
148
149
|
*/
|
|
149
150
|
export async function retrieveCheckpointsFromRollup(
|
|
150
|
-
rollup:
|
|
151
|
+
rollup: RollupContract,
|
|
151
152
|
publicClient: ViemPublicClient,
|
|
152
153
|
debugClient: ViemPublicDebugClient,
|
|
153
|
-
|
|
154
|
+
blobClient: BlobClientInterface,
|
|
154
155
|
searchStartBlock: bigint,
|
|
155
156
|
searchEndBlock: bigint,
|
|
156
157
|
contractAddresses: {
|
|
@@ -160,6 +161,7 @@ export async function retrieveCheckpointsFromRollup(
|
|
|
160
161
|
},
|
|
161
162
|
instrumentation: ArchiverInstrumentation,
|
|
162
163
|
logger: Logger = createLogger('archiver'),
|
|
164
|
+
isHistoricalSync: boolean = false,
|
|
163
165
|
): Promise<RetrievedCheckpoint[]> {
|
|
164
166
|
const retrievedCheckpoints: RetrievedCheckpoint[] = [];
|
|
165
167
|
|
|
@@ -169,15 +171,7 @@ export async function retrieveCheckpointsFromRollup(
|
|
|
169
171
|
if (searchStartBlock > searchEndBlock) {
|
|
170
172
|
break;
|
|
171
173
|
}
|
|
172
|
-
const checkpointProposedLogs = (
|
|
173
|
-
await rollup.getEvents.CheckpointProposed(
|
|
174
|
-
{},
|
|
175
|
-
{
|
|
176
|
-
fromBlock: searchStartBlock,
|
|
177
|
-
toBlock: searchEndBlock,
|
|
178
|
-
},
|
|
179
|
-
)
|
|
180
|
-
).filter(log => log.blockNumber! >= searchStartBlock && log.blockNumber! <= searchEndBlock);
|
|
174
|
+
const checkpointProposedLogs = await rollup.getCheckpointProposedEvents(searchStartBlock, searchEndBlock);
|
|
181
175
|
|
|
182
176
|
if (checkpointProposedLogs.length === 0) {
|
|
183
177
|
break;
|
|
@@ -185,19 +179,19 @@ export async function retrieveCheckpointsFromRollup(
|
|
|
185
179
|
|
|
186
180
|
const lastLog = checkpointProposedLogs.at(-1)!;
|
|
187
181
|
logger.debug(
|
|
188
|
-
`Got ${checkpointProposedLogs.length} processed logs for checkpoints
|
|
182
|
+
`Got ${checkpointProposedLogs.length} processed logs for checkpoints ${checkpointProposedLogs[0].args.checkpointNumber}-${lastLog.args.checkpointNumber} between L1 blocks ${searchStartBlock}-${searchEndBlock}`,
|
|
189
183
|
);
|
|
190
184
|
|
|
191
185
|
if (rollupConstants === undefined) {
|
|
192
186
|
const [chainId, version, targetCommitteeSize] = await Promise.all([
|
|
193
187
|
publicClient.getChainId(),
|
|
194
|
-
rollup.
|
|
195
|
-
rollup.
|
|
188
|
+
rollup.getVersion(),
|
|
189
|
+
rollup.getTargetCommitteeSize(),
|
|
196
190
|
]);
|
|
197
191
|
rollupConstants = {
|
|
198
192
|
chainId: new Fr(chainId),
|
|
199
193
|
version: new Fr(version),
|
|
200
|
-
targetCommitteeSize
|
|
194
|
+
targetCommitteeSize,
|
|
201
195
|
};
|
|
202
196
|
}
|
|
203
197
|
|
|
@@ -205,15 +199,16 @@ export async function retrieveCheckpointsFromRollup(
|
|
|
205
199
|
rollup,
|
|
206
200
|
publicClient,
|
|
207
201
|
debugClient,
|
|
208
|
-
|
|
202
|
+
blobClient,
|
|
209
203
|
checkpointProposedLogs,
|
|
210
204
|
rollupConstants,
|
|
211
205
|
contractAddresses,
|
|
212
206
|
instrumentation,
|
|
213
207
|
logger,
|
|
208
|
+
isHistoricalSync,
|
|
214
209
|
);
|
|
215
210
|
retrievedCheckpoints.push(...newCheckpoints);
|
|
216
|
-
searchStartBlock = lastLog.
|
|
211
|
+
searchStartBlock = lastLog.l1BlockNumber + 1n;
|
|
217
212
|
} while (searchStartBlock <= searchEndBlock);
|
|
218
213
|
|
|
219
214
|
// The asyncPool from processCheckpointProposedLogs will not necessarily return the checkpoints in order, so we sort them before returning.
|
|
@@ -222,18 +217,24 @@ export async function retrieveCheckpointsFromRollup(
|
|
|
222
217
|
|
|
223
218
|
/**
|
|
224
219
|
* Processes newly received CheckpointProposed logs.
|
|
225
|
-
* @param rollup - The rollup contract
|
|
220
|
+
* @param rollup - The rollup contract wrapper.
|
|
226
221
|
* @param publicClient - The viem public client to use for transaction retrieval.
|
|
227
222
|
* @param debugClient - The viem debug client to use for trace/debug RPC methods (optional).
|
|
223
|
+
* @param blobClient - The blob client client for fetching blob data.
|
|
228
224
|
* @param logs - CheckpointProposed logs.
|
|
229
|
-
* @
|
|
225
|
+
* @param rollupConstants - The rollup constants (chainId, version, targetCommitteeSize).
|
|
226
|
+
* @param contractAddresses - The contract addresses (governanceProposerAddress, slashFactoryAddress, slashingProposerAddress).
|
|
227
|
+
* @param instrumentation - The archiver instrumentation instance.
|
|
228
|
+
* @param logger - The logger instance.
|
|
229
|
+
* @param isHistoricalSync - Whether this is a historical sync.
|
|
230
|
+
* @returns An array of retrieved checkpoints.
|
|
230
231
|
*/
|
|
231
232
|
async function processCheckpointProposedLogs(
|
|
232
|
-
rollup:
|
|
233
|
+
rollup: RollupContract,
|
|
233
234
|
publicClient: ViemPublicClient,
|
|
234
235
|
debugClient: ViemPublicDebugClient,
|
|
235
|
-
|
|
236
|
-
logs:
|
|
236
|
+
blobClient: BlobClientInterface,
|
|
237
|
+
logs: CheckpointProposedLog[],
|
|
237
238
|
{ chainId, version, targetCommitteeSize }: { chainId: Fr; version: Fr; targetCommitteeSize: number },
|
|
238
239
|
contractAddresses: {
|
|
239
240
|
governanceProposerAddress: EthAddress;
|
|
@@ -242,6 +243,7 @@ async function processCheckpointProposedLogs(
|
|
|
242
243
|
},
|
|
243
244
|
instrumentation: ArchiverInstrumentation,
|
|
244
245
|
logger: Logger,
|
|
246
|
+
isHistoricalSync: boolean,
|
|
245
247
|
): Promise<RetrievedCheckpoint[]> {
|
|
246
248
|
const retrievedCheckpoints: RetrievedCheckpoint[] = [];
|
|
247
249
|
const calldataRetriever = new CalldataRetriever(
|
|
@@ -254,43 +256,51 @@ async function processCheckpointProposedLogs(
|
|
|
254
256
|
);
|
|
255
257
|
|
|
256
258
|
await asyncPool(10, logs, async log => {
|
|
257
|
-
const checkpointNumber =
|
|
258
|
-
const archive = log.args.archive
|
|
259
|
-
const archiveFromChain = await rollup.
|
|
260
|
-
const blobHashes = log.args.versionedBlobHashes
|
|
259
|
+
const checkpointNumber = log.args.checkpointNumber;
|
|
260
|
+
const archive = log.args.archive;
|
|
261
|
+
const archiveFromChain = await rollup.archiveAt(checkpointNumber);
|
|
262
|
+
const blobHashes = log.args.versionedBlobHashes;
|
|
261
263
|
|
|
262
264
|
// The value from the event and contract will match only if the checkpoint is in the chain.
|
|
263
|
-
if (archive
|
|
265
|
+
if (archive.equals(archiveFromChain)) {
|
|
266
|
+
// Build expected hashes object (fields may be undefined for backwards compatibility with older events)
|
|
267
|
+
const expectedHashes = {
|
|
268
|
+
attestationsHash: log.args.attestationsHash?.toString(),
|
|
269
|
+
payloadDigest: log.args.payloadDigest?.toString(),
|
|
270
|
+
};
|
|
271
|
+
|
|
264
272
|
const checkpoint = await calldataRetriever.getCheckpointFromRollupTx(
|
|
265
|
-
log.
|
|
273
|
+
log.l1TransactionHash,
|
|
266
274
|
blobHashes,
|
|
267
275
|
checkpointNumber,
|
|
276
|
+
expectedHashes,
|
|
268
277
|
);
|
|
269
278
|
const checkpointBlobData = await getCheckpointBlobDataFromBlobs(
|
|
270
|
-
|
|
279
|
+
blobClient,
|
|
271
280
|
checkpoint.blockHash,
|
|
272
281
|
blobHashes,
|
|
273
282
|
checkpointNumber,
|
|
274
283
|
logger,
|
|
284
|
+
isHistoricalSync,
|
|
275
285
|
);
|
|
276
286
|
|
|
277
|
-
const l1
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
287
|
+
const l1 = new L1PublishedData(
|
|
288
|
+
log.l1BlockNumber,
|
|
289
|
+
await getL1BlockTime(publicClient, log.l1BlockNumber),
|
|
290
|
+
log.l1BlockHash.toString(),
|
|
291
|
+
);
|
|
282
292
|
|
|
283
293
|
retrievedCheckpoints.push({ ...checkpoint, checkpointBlobData, l1, chainId, version });
|
|
284
|
-
logger.trace(`Retrieved checkpoint ${checkpointNumber} from L1 tx ${log.
|
|
285
|
-
l1BlockNumber: log.
|
|
294
|
+
logger.trace(`Retrieved checkpoint ${checkpointNumber} from L1 tx ${log.l1TransactionHash}`, {
|
|
295
|
+
l1BlockNumber: log.l1BlockNumber,
|
|
286
296
|
checkpointNumber,
|
|
287
297
|
archive: archive.toString(),
|
|
288
298
|
attestations: checkpoint.attestations,
|
|
289
299
|
});
|
|
290
300
|
} else {
|
|
291
301
|
logger.warn(`Ignoring checkpoint ${checkpointNumber} due to archive root mismatch`, {
|
|
292
|
-
actual: archive,
|
|
293
|
-
expected: archiveFromChain,
|
|
302
|
+
actual: archive.toString(),
|
|
303
|
+
expected: archiveFromChain.toString(),
|
|
294
304
|
});
|
|
295
305
|
}
|
|
296
306
|
});
|
|
@@ -304,13 +314,14 @@ export async function getL1BlockTime(publicClient: ViemPublicClient, blockNumber
|
|
|
304
314
|
}
|
|
305
315
|
|
|
306
316
|
export async function getCheckpointBlobDataFromBlobs(
|
|
307
|
-
|
|
317
|
+
blobClient: BlobClientInterface,
|
|
308
318
|
blockHash: string,
|
|
309
319
|
blobHashes: Buffer<ArrayBufferLike>[],
|
|
310
320
|
checkpointNumber: CheckpointNumber,
|
|
311
321
|
logger: Logger,
|
|
322
|
+
isHistoricalSync: boolean,
|
|
312
323
|
): Promise<CheckpointBlobData> {
|
|
313
|
-
const blobBodies = await
|
|
324
|
+
const blobBodies = await blobClient.getBlobSidecar(blockHash, blobHashes, { isHistoricalSync });
|
|
314
325
|
if (blobBodies.length === 0) {
|
|
315
326
|
throw new NoBlobBodiesFoundError(checkpointNumber);
|
|
316
327
|
}
|
|
@@ -318,7 +329,7 @@ export async function getCheckpointBlobDataFromBlobs(
|
|
|
318
329
|
let checkpointBlobData: CheckpointBlobData;
|
|
319
330
|
try {
|
|
320
331
|
// Attempt to decode the checkpoint blob data.
|
|
321
|
-
checkpointBlobData = decodeCheckpointBlobDataFromBlobs(blobBodies
|
|
332
|
+
checkpointBlobData = decodeCheckpointBlobDataFromBlobs(blobBodies);
|
|
322
333
|
} catch (err: any) {
|
|
323
334
|
if (err instanceof BlobDeserializationError) {
|
|
324
335
|
logger.fatal(err.message);
|
|
@@ -334,12 +345,12 @@ export async function getCheckpointBlobDataFromBlobs(
|
|
|
334
345
|
|
|
335
346
|
/** Given an L1 to L2 message, retrieves its corresponding event from the Inbox within a specific block range. */
|
|
336
347
|
export async function retrieveL1ToL2Message(
|
|
337
|
-
inbox:
|
|
348
|
+
inbox: InboxContract,
|
|
338
349
|
leaf: Fr,
|
|
339
350
|
fromBlock: bigint,
|
|
340
351
|
toBlock: bigint,
|
|
341
352
|
): Promise<InboxMessage | undefined> {
|
|
342
|
-
const logs = await inbox.
|
|
353
|
+
const logs = await inbox.getMessageSentEventByHash(leaf.toString(), fromBlock, toBlock);
|
|
343
354
|
|
|
344
355
|
const messages = mapLogsInboxMessage(logs);
|
|
345
356
|
return messages.length > 0 ? messages[0] : undefined;
|
|
@@ -347,47 +358,40 @@ export async function retrieveL1ToL2Message(
|
|
|
347
358
|
|
|
348
359
|
/**
|
|
349
360
|
* Fetch L1 to L2 messages.
|
|
350
|
-
* @param
|
|
351
|
-
* @param inboxAddress - The address of the inbox contract to fetch messages from.
|
|
352
|
-
* @param blockUntilSynced - If true, blocks until the archiver has fully synced.
|
|
361
|
+
* @param inbox - The inbox contract wrapper.
|
|
353
362
|
* @param searchStartBlock - The block number to use for starting the search.
|
|
354
363
|
* @param searchEndBlock - The highest block number that we should search up to.
|
|
355
364
|
* @returns An array of InboxLeaf and next eth block to search from.
|
|
356
365
|
*/
|
|
357
366
|
export async function retrieveL1ToL2Messages(
|
|
358
|
-
inbox:
|
|
367
|
+
inbox: InboxContract,
|
|
359
368
|
searchStartBlock: bigint,
|
|
360
369
|
searchEndBlock: bigint,
|
|
361
370
|
): Promise<InboxMessage[]> {
|
|
362
371
|
const retrievedL1ToL2Messages: InboxMessage[] = [];
|
|
363
372
|
while (searchStartBlock <= searchEndBlock) {
|
|
364
|
-
const messageSentLogs = (
|
|
365
|
-
await inbox.getEvents.MessageSent({}, { fromBlock: searchStartBlock, toBlock: searchEndBlock })
|
|
366
|
-
).filter(log => log.blockNumber! >= searchStartBlock && log.blockNumber! <= searchEndBlock);
|
|
373
|
+
const messageSentLogs = await inbox.getMessageSentEvents(searchStartBlock, searchEndBlock);
|
|
367
374
|
|
|
368
375
|
if (messageSentLogs.length === 0) {
|
|
369
376
|
break;
|
|
370
377
|
}
|
|
371
378
|
|
|
372
379
|
retrievedL1ToL2Messages.push(...mapLogsInboxMessage(messageSentLogs));
|
|
373
|
-
searchStartBlock = messageSentLogs.at(-1)!.
|
|
380
|
+
searchStartBlock = messageSentLogs.at(-1)!.l1BlockNumber + 1n;
|
|
374
381
|
}
|
|
375
382
|
|
|
376
383
|
return retrievedL1ToL2Messages;
|
|
377
384
|
}
|
|
378
385
|
|
|
379
|
-
function mapLogsInboxMessage(logs:
|
|
380
|
-
return logs.map(log => {
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
rollingHash: Buffer16.fromString(rollingHash!),
|
|
389
|
-
};
|
|
390
|
-
});
|
|
386
|
+
function mapLogsInboxMessage(logs: MessageSentLog[]): InboxMessage[] {
|
|
387
|
+
return logs.map(log => ({
|
|
388
|
+
index: log.args.index,
|
|
389
|
+
leaf: log.args.leaf,
|
|
390
|
+
l1BlockNumber: log.l1BlockNumber,
|
|
391
|
+
l1BlockHash: log.l1BlockHash,
|
|
392
|
+
checkpointNumber: log.args.checkpointNumber,
|
|
393
|
+
rollingHash: log.args.rollingHash,
|
|
394
|
+
}));
|
|
391
395
|
}
|
|
392
396
|
|
|
393
397
|
/** Retrieves L2ProofVerified events from the rollup contract. */
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { ViemPublicDebugClient } from '@aztec/ethereum/types';
|
|
2
|
-
import { createLogger } from '@aztec/foundation/log';
|
|
2
|
+
import { type Logger, type LoggerBindings, createLogger } from '@aztec/foundation/log';
|
|
3
3
|
|
|
4
4
|
import type { Hex } from 'viem';
|
|
5
5
|
import type { ZodSchema } from 'zod';
|
|
@@ -7,8 +7,6 @@ import type { ZodSchema } from 'zod';
|
|
|
7
7
|
import { callTraceSchema } from './debug_tx.js';
|
|
8
8
|
import { traceTransactionResponseSchema } from './trace_tx.js';
|
|
9
9
|
|
|
10
|
-
const logger = createLogger('aztec:archiver:validate_trace');
|
|
11
|
-
|
|
12
10
|
/**
|
|
13
11
|
* Helper function to test a trace method with validation
|
|
14
12
|
*
|
|
@@ -17,6 +15,7 @@ const logger = createLogger('aztec:archiver:validate_trace');
|
|
|
17
15
|
* @param schema - Zod schema to validate the response
|
|
18
16
|
* @param method - Name of the RPC method ('debug_traceTransaction' or 'trace_transaction')
|
|
19
17
|
* @param blockType - Type of block being tested ('recent' or 'old')
|
|
18
|
+
* @param logger - Logger instance
|
|
20
19
|
* @returns true if the method works and validation passes, false otherwise
|
|
21
20
|
*/
|
|
22
21
|
async function testTraceMethod(
|
|
@@ -25,6 +24,7 @@ async function testTraceMethod(
|
|
|
25
24
|
schema: ZodSchema,
|
|
26
25
|
method: 'debug_traceTransaction' | 'trace_transaction',
|
|
27
26
|
blockType: string,
|
|
27
|
+
logger: Logger,
|
|
28
28
|
): Promise<boolean> {
|
|
29
29
|
try {
|
|
30
30
|
// Make request with appropriate params based on method name
|
|
@@ -59,9 +59,14 @@ export interface TraceAvailability {
|
|
|
59
59
|
* Validates the availability of debug/trace methods on the Ethereum client.
|
|
60
60
|
*
|
|
61
61
|
* @param client - The Viem public debug client
|
|
62
|
+
* @param bindings - Optional logger bindings for context
|
|
62
63
|
* @returns Object indicating which trace methods are available for recent and old blocks
|
|
63
64
|
*/
|
|
64
|
-
export async function validateTraceAvailability(
|
|
65
|
+
export async function validateTraceAvailability(
|
|
66
|
+
client: ViemPublicDebugClient,
|
|
67
|
+
bindings?: LoggerBindings,
|
|
68
|
+
): Promise<TraceAvailability> {
|
|
69
|
+
const logger = createLogger('archiver:validate_trace', bindings);
|
|
65
70
|
const result: TraceAvailability = {
|
|
66
71
|
debugTraceRecent: false,
|
|
67
72
|
traceTransactionRecent: false,
|
|
@@ -95,6 +100,7 @@ export async function validateTraceAvailability(client: ViemPublicDebugClient):
|
|
|
95
100
|
callTraceSchema,
|
|
96
101
|
'debug_traceTransaction',
|
|
97
102
|
'recent',
|
|
103
|
+
logger,
|
|
98
104
|
);
|
|
99
105
|
|
|
100
106
|
// Test trace_transaction with recent block
|
|
@@ -104,6 +110,7 @@ export async function validateTraceAvailability(client: ViemPublicDebugClient):
|
|
|
104
110
|
traceTransactionResponseSchema,
|
|
105
111
|
'trace_transaction',
|
|
106
112
|
'recent',
|
|
113
|
+
logger,
|
|
107
114
|
);
|
|
108
115
|
|
|
109
116
|
// Get a block from 512 blocks ago
|
|
@@ -132,7 +139,14 @@ export async function validateTraceAvailability(client: ViemPublicDebugClient):
|
|
|
132
139
|
const oldTxHash = oldBlock.transactions[0] as Hex;
|
|
133
140
|
|
|
134
141
|
// Test debug_traceTransaction with old block
|
|
135
|
-
result.debugTraceOld = await testTraceMethod(
|
|
142
|
+
result.debugTraceOld = await testTraceMethod(
|
|
143
|
+
client,
|
|
144
|
+
oldTxHash,
|
|
145
|
+
callTraceSchema,
|
|
146
|
+
'debug_traceTransaction',
|
|
147
|
+
'old',
|
|
148
|
+
logger,
|
|
149
|
+
);
|
|
136
150
|
|
|
137
151
|
// Test trace_transaction with old block
|
|
138
152
|
result.traceTransactionOld = await testTraceMethod(
|
|
@@ -141,6 +155,7 @@ export async function validateTraceAvailability(client: ViemPublicDebugClient):
|
|
|
141
155
|
traceTransactionResponseSchema,
|
|
142
156
|
'trace_transaction',
|
|
143
157
|
'old',
|
|
158
|
+
logger,
|
|
144
159
|
);
|
|
145
160
|
} catch (error) {
|
|
146
161
|
logger.warn(`Error validating debug_traceTransaction and trace_transaction availability: ${error}`);
|
|
@@ -159,15 +174,18 @@ function hasTxs(block: { transactions?: Hex[] }): boolean {
|
|
|
159
174
|
*
|
|
160
175
|
* @param client - The Viem public debug client
|
|
161
176
|
* @param ethereumAllowNoDebugHosts - If false, throws an error when no trace methods are available
|
|
177
|
+
* @param bindings - Optional logger bindings for context
|
|
162
178
|
* @throws Error if ethereumAllowNoDebugHosts is false and no trace methods are available
|
|
163
179
|
*/
|
|
164
180
|
export async function validateAndLogTraceAvailability(
|
|
165
181
|
client: ViemPublicDebugClient,
|
|
166
182
|
ethereumAllowNoDebugHosts: boolean,
|
|
183
|
+
bindings?: LoggerBindings,
|
|
167
184
|
): Promise<void> {
|
|
168
|
-
logger
|
|
185
|
+
const logger = createLogger('archiver:validate_trace', bindings);
|
|
186
|
+
logger.debug('Validating trace/debug method availability...');
|
|
169
187
|
|
|
170
|
-
const availability = await validateTraceAvailability(client);
|
|
188
|
+
const availability = await validateTraceAvailability(client, bindings);
|
|
171
189
|
|
|
172
190
|
// Check if we have support for old blocks (either debug or trace)
|
|
173
191
|
const hasOldBlockSupport = availability.debugTraceOld || availability.traceTransactionOld;
|