@aztec/archiver 0.0.1-commit.c7c42ec → 0.0.1-commit.c949de6bc
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 +139 -0
- package/dest/archiver.d.ts.map +1 -0
- package/dest/archiver.js +699 -0
- package/dest/{archiver/config.d.ts → config.d.ts} +9 -1
- package/dest/config.d.ts.map +1 -0
- package/dest/{archiver/config.js → config.js} +11 -2
- package/dest/errors.d.ts +41 -0
- package/dest/errors.d.ts.map +1 -0
- package/dest/{archiver/errors.js → errors.js} +8 -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 +11 -4
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +9 -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 +35 -32
- package/dest/l1/calldata_retriever.d.ts +135 -0
- package/dest/l1/calldata_retriever.d.ts.map +1 -0
- package/dest/l1/calldata_retriever.js +402 -0
- 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 +54 -71
- 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 +5 -5
- package/dest/l1/spire_proposer.d.ts.map +1 -0
- package/dest/{archiver/l1 → l1}/spire_proposer.js +9 -17
- 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 +89 -0
- package/dest/modules/data_source_base.d.ts.map +1 -0
- package/dest/modules/data_source_base.js +216 -0
- package/dest/modules/data_store_updater.d.ts +80 -0
- package/dest/modules/data_store_updater.d.ts.map +1 -0
- package/dest/modules/data_store_updater.js +323 -0
- package/dest/modules/instrumentation.d.ts +50 -0
- package/dest/modules/instrumentation.d.ts.map +1 -0
- package/dest/{archiver → modules}/instrumentation.js +44 -68
- package/dest/modules/l1_synchronizer.d.ts +71 -0
- package/dest/modules/l1_synchronizer.d.ts.map +1 -0
- package/dest/modules/l1_synchronizer.js +1117 -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 +196 -0
- package/dest/store/block_store.d.ts.map +1 -0
- package/dest/{archiver/kv_archiver_store → store}/block_store.js +228 -62
- 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 +354 -0
- package/dest/store/kv_archiver_store.d.ts.map +1 -0
- package/dest/store/kv_archiver_store.js +464 -0
- package/dest/store/l2_tips_cache.d.ts +19 -0
- package/dest/store/l2_tips_cache.d.ts.map +1 -0
- package/dest/store/l2_tips_cache.js +89 -0
- package/dest/store/log_store.d.ts +54 -0
- package/dest/store/log_store.d.ts.map +1 -0
- package/dest/{archiver/kv_archiver_store → store}/log_store.js +146 -91
- 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/{archiver/structs → structs}/published.d.ts +1 -1
- package/dest/structs/published.d.ts.map +1 -0
- package/dest/test/fake_l1_state.d.ts +195 -0
- package/dest/test/fake_l1_state.d.ts.map +1 -0
- package/dest/test/fake_l1_state.js +421 -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 +3 -3
- 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 +39 -17
- package/dest/test/mock_l2_block_source.d.ts.map +1 -1
- package/dest/test/mock_l2_block_source.js +232 -83
- 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 +443 -0
- package/src/{archiver/config.ts → config.ts} +13 -2
- package/src/{archiver/errors.ts → errors.ts} +12 -0
- package/src/factory.ts +139 -11
- package/src/index.ts +11 -3
- package/src/interfaces.ts +9 -0
- package/src/l1/README.md +55 -0
- package/src/{archiver/l1 → l1}/bin/retrieve-calldata.ts +45 -33
- package/src/l1/calldata_retriever.ts +511 -0
- package/src/{archiver/l1 → l1}/data_retrieval.ts +75 -94
- package/src/{archiver/l1 → l1}/spire_proposer.ts +7 -15
- package/src/{archiver/l1 → l1}/validate_trace.ts +25 -7
- package/src/modules/data_source_base.ts +328 -0
- package/src/modules/data_store_updater.ts +448 -0
- package/src/{archiver → modules}/instrumentation.ts +53 -70
- package/src/modules/l1_synchronizer.ts +933 -0
- package/src/{archiver → modules}/validation.ts +11 -6
- package/src/{archiver/kv_archiver_store → store}/block_store.ts +293 -100
- 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/{archiver/kv_archiver_store → store}/kv_archiver_store.ts +273 -40
- package/src/store/l2_tips_cache.ts +89 -0
- package/src/{archiver/kv_archiver_store → store}/log_store.ts +242 -121
- package/src/test/fake_l1_state.ts +657 -0
- package/src/test/index.ts +4 -0
- package/src/test/mock_archiver.ts +4 -3
- package/src/test/mock_l1_to_l2_message_source.ts +10 -4
- package/src/test/mock_l2_block_source.ts +276 -90
- package/src/test/mock_structs.ts +269 -8
- package/src/test/noop_l1_archiver.ts +109 -0
- package/dest/archiver/archiver.d.ts +0 -304
- package/dest/archiver/archiver.d.ts.map +0 -1
- package/dest/archiver/archiver.js +0 -1645
- package/dest/archiver/archiver_store.d.ts +0 -308
- 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 -2770
- package/dest/archiver/config.d.ts.map +0 -1
- package/dest/archiver/errors.d.ts +0 -36
- package/dest/archiver/errors.d.ts.map +0 -1
- 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 -157
- package/dest/archiver/kv_archiver_store/block_store.d.ts.map +0 -1
- 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 -158
- 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 -313
- package/dest/archiver/kv_archiver_store/log_store.d.ts +0 -45
- package/dest/archiver/kv_archiver_store/log_store.d.ts.map +0 -1
- 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 +0 -112
- package/dest/archiver/l1/calldata_retriever.d.ts.map +0 -1
- package/dest/archiver/l1/calldata_retriever.js +0 -471
- package/dest/archiver/l1/data_retrieval.d.ts +0 -90
- 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.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 -2157
- package/src/archiver/archiver_store.ts +0 -372
- package/src/archiver/archiver_store_test_suite.ts +0 -2843
- package/src/archiver/index.ts +0 -6
- package/src/archiver/l1/README.md +0 -98
- package/src/archiver/l1/calldata_retriever.ts +0 -641
- package/src/rpc/index.ts +0 -16
- /package/dest/{archiver/l1 → l1}/debug_tx.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}/debug_tx.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
- /package/src/{archiver/structs → structs}/published.ts +0 -0
|
@@ -6,33 +6,31 @@ import {
|
|
|
6
6
|
decodeCheckpointBlobDataFromBlobs,
|
|
7
7
|
encodeBlockBlobData,
|
|
8
8
|
} from '@aztec/blob-lib';
|
|
9
|
-
import type {
|
|
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,
|
|
22
|
+
import { RollupAbi } from '@aztec/l1-artifacts';
|
|
23
|
+
import { Body, CommitteeAttestation, L2Block } from '@aztec/stdlib/block';
|
|
19
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
36
|
import { CalldataRetriever } from './calldata_retriever.js';
|
|
@@ -40,6 +38,7 @@ import { CalldataRetriever } from './calldata_retriever.js';
|
|
|
40
38
|
export type RetrievedCheckpoint = {
|
|
41
39
|
checkpointNumber: CheckpointNumber;
|
|
42
40
|
archiveRoot: Fr;
|
|
41
|
+
feeAssetPriceModifier: bigint;
|
|
43
42
|
header: CheckpointHeader;
|
|
44
43
|
checkpointBlobData: CheckpointBlobData;
|
|
45
44
|
l1: L1PublishedData;
|
|
@@ -51,6 +50,7 @@ export type RetrievedCheckpoint = {
|
|
|
51
50
|
export async function retrievedToPublishedCheckpoint({
|
|
52
51
|
checkpointNumber,
|
|
53
52
|
archiveRoot,
|
|
53
|
+
feeAssetPriceModifier,
|
|
54
54
|
header: checkpointHeader,
|
|
55
55
|
checkpointBlobData,
|
|
56
56
|
l1,
|
|
@@ -71,7 +71,7 @@ export async function retrievedToPublishedCheckpoint({
|
|
|
71
71
|
const l1toL2MessageTreeRoot = blocksBlobData[0].l1ToL2MessageRoot!;
|
|
72
72
|
|
|
73
73
|
const spongeBlob = SpongeBlob.init();
|
|
74
|
-
const l2Blocks:
|
|
74
|
+
const l2Blocks: L2Block[] = [];
|
|
75
75
|
for (let i = 0; i < blocksBlobData.length; i++) {
|
|
76
76
|
const blockBlobData = blocksBlobData[i];
|
|
77
77
|
const { blockEndMarker, blockEndStateField, lastArchiveRoot, noteHashRoot, nullifierRoot, publicDataRoot } =
|
|
@@ -102,7 +102,7 @@ export async function retrievedToPublishedCheckpoint({
|
|
|
102
102
|
}),
|
|
103
103
|
});
|
|
104
104
|
|
|
105
|
-
const body = Body.fromTxBlobData(
|
|
105
|
+
const body = Body.fromTxBlobData(blockBlobData.txs);
|
|
106
106
|
|
|
107
107
|
const blobFields = encodeBlockBlobData(blockBlobData);
|
|
108
108
|
await spongeBlob.absorb(blobFields);
|
|
@@ -121,7 +121,7 @@ export async function retrievedToPublishedCheckpoint({
|
|
|
121
121
|
|
|
122
122
|
const newArchive = new AppendOnlyTreeSnapshot(newArchiveRoots[i], l2BlockNumber + 1);
|
|
123
123
|
|
|
124
|
-
l2Blocks.push(new
|
|
124
|
+
l2Blocks.push(new L2Block(newArchive, header, body, checkpointNumber, IndexWithinCheckpoint(i)));
|
|
125
125
|
}
|
|
126
126
|
|
|
127
127
|
const lastBlock = l2Blocks.at(-1)!;
|
|
@@ -130,6 +130,7 @@ export async function retrievedToPublishedCheckpoint({
|
|
|
130
130
|
header: checkpointHeader,
|
|
131
131
|
blocks: l2Blocks,
|
|
132
132
|
number: checkpointNumber,
|
|
133
|
+
feeAssetPriceModifier: feeAssetPriceModifier,
|
|
133
134
|
});
|
|
134
135
|
|
|
135
136
|
return PublishedCheckpoint.from({ checkpoint, l1, attestations });
|
|
@@ -137,7 +138,7 @@ export async function retrievedToPublishedCheckpoint({
|
|
|
137
138
|
|
|
138
139
|
/**
|
|
139
140
|
* Fetches new checkpoints.
|
|
140
|
-
* @param rollup - The rollup contract
|
|
141
|
+
* @param rollup - The rollup contract wrapper.
|
|
141
142
|
* @param publicClient - The viem public client to use for transaction retrieval.
|
|
142
143
|
* @param debugClient - The viem debug client to use for trace/debug RPC methods (optional).
|
|
143
144
|
* @param blobClient - The blob client client for fetching blob data.
|
|
@@ -150,17 +151,12 @@ export async function retrievedToPublishedCheckpoint({
|
|
|
150
151
|
* @returns An array of retrieved checkpoints.
|
|
151
152
|
*/
|
|
152
153
|
export async function retrieveCheckpointsFromRollup(
|
|
153
|
-
rollup:
|
|
154
|
+
rollup: RollupContract,
|
|
154
155
|
publicClient: ViemPublicClient,
|
|
155
156
|
debugClient: ViemPublicDebugClient,
|
|
156
157
|
blobClient: BlobClientInterface,
|
|
157
158
|
searchStartBlock: bigint,
|
|
158
159
|
searchEndBlock: bigint,
|
|
159
|
-
contractAddresses: {
|
|
160
|
-
governanceProposerAddress: EthAddress;
|
|
161
|
-
slashFactoryAddress?: EthAddress;
|
|
162
|
-
slashingProposerAddress: EthAddress;
|
|
163
|
-
},
|
|
164
160
|
instrumentation: ArchiverInstrumentation,
|
|
165
161
|
logger: Logger = createLogger('archiver'),
|
|
166
162
|
isHistoricalSync: boolean = false,
|
|
@@ -173,15 +169,7 @@ export async function retrieveCheckpointsFromRollup(
|
|
|
173
169
|
if (searchStartBlock > searchEndBlock) {
|
|
174
170
|
break;
|
|
175
171
|
}
|
|
176
|
-
const checkpointProposedLogs = (
|
|
177
|
-
await rollup.getEvents.CheckpointProposed(
|
|
178
|
-
{},
|
|
179
|
-
{
|
|
180
|
-
fromBlock: searchStartBlock,
|
|
181
|
-
toBlock: searchEndBlock,
|
|
182
|
-
},
|
|
183
|
-
)
|
|
184
|
-
).filter(log => log.blockNumber! >= searchStartBlock && log.blockNumber! <= searchEndBlock);
|
|
172
|
+
const checkpointProposedLogs = await rollup.getCheckpointProposedEvents(searchStartBlock, searchEndBlock);
|
|
185
173
|
|
|
186
174
|
if (checkpointProposedLogs.length === 0) {
|
|
187
175
|
break;
|
|
@@ -189,19 +177,19 @@ export async function retrieveCheckpointsFromRollup(
|
|
|
189
177
|
|
|
190
178
|
const lastLog = checkpointProposedLogs.at(-1)!;
|
|
191
179
|
logger.debug(
|
|
192
|
-
`Got ${checkpointProposedLogs.length} processed logs for checkpoints
|
|
180
|
+
`Got ${checkpointProposedLogs.length} processed logs for checkpoints ${checkpointProposedLogs[0].args.checkpointNumber}-${lastLog.args.checkpointNumber} between L1 blocks ${searchStartBlock}-${searchEndBlock}`,
|
|
193
181
|
);
|
|
194
182
|
|
|
195
183
|
if (rollupConstants === undefined) {
|
|
196
184
|
const [chainId, version, targetCommitteeSize] = await Promise.all([
|
|
197
185
|
publicClient.getChainId(),
|
|
198
|
-
rollup.
|
|
199
|
-
rollup.
|
|
186
|
+
rollup.getVersion(),
|
|
187
|
+
rollup.getTargetCommitteeSize(),
|
|
200
188
|
]);
|
|
201
189
|
rollupConstants = {
|
|
202
190
|
chainId: new Fr(chainId),
|
|
203
191
|
version: new Fr(version),
|
|
204
|
-
targetCommitteeSize
|
|
192
|
+
targetCommitteeSize,
|
|
205
193
|
};
|
|
206
194
|
}
|
|
207
195
|
|
|
@@ -212,13 +200,12 @@ export async function retrieveCheckpointsFromRollup(
|
|
|
212
200
|
blobClient,
|
|
213
201
|
checkpointProposedLogs,
|
|
214
202
|
rollupConstants,
|
|
215
|
-
contractAddresses,
|
|
216
203
|
instrumentation,
|
|
217
204
|
logger,
|
|
218
205
|
isHistoricalSync,
|
|
219
206
|
);
|
|
220
207
|
retrievedCheckpoints.push(...newCheckpoints);
|
|
221
|
-
searchStartBlock = lastLog.
|
|
208
|
+
searchStartBlock = lastLog.l1BlockNumber + 1n;
|
|
222
209
|
} while (searchStartBlock <= searchEndBlock);
|
|
223
210
|
|
|
224
211
|
// The asyncPool from processCheckpointProposedLogs will not necessarily return the checkpoints in order, so we sort them before returning.
|
|
@@ -227,30 +214,24 @@ export async function retrieveCheckpointsFromRollup(
|
|
|
227
214
|
|
|
228
215
|
/**
|
|
229
216
|
* Processes newly received CheckpointProposed logs.
|
|
230
|
-
* @param rollup - The rollup contract
|
|
217
|
+
* @param rollup - The rollup contract wrapper.
|
|
231
218
|
* @param publicClient - The viem public client to use for transaction retrieval.
|
|
232
219
|
* @param debugClient - The viem debug client to use for trace/debug RPC methods (optional).
|
|
233
220
|
* @param blobClient - The blob client client for fetching blob data.
|
|
234
221
|
* @param logs - CheckpointProposed logs.
|
|
235
222
|
* @param rollupConstants - The rollup constants (chainId, version, targetCommitteeSize).
|
|
236
|
-
* @param contractAddresses - The contract addresses (governanceProposerAddress, slashFactoryAddress, slashingProposerAddress).
|
|
237
223
|
* @param instrumentation - The archiver instrumentation instance.
|
|
238
224
|
* @param logger - The logger instance.
|
|
239
225
|
* @param isHistoricalSync - Whether this is a historical sync.
|
|
240
226
|
* @returns An array of retrieved checkpoints.
|
|
241
227
|
*/
|
|
242
228
|
async function processCheckpointProposedLogs(
|
|
243
|
-
rollup:
|
|
229
|
+
rollup: RollupContract,
|
|
244
230
|
publicClient: ViemPublicClient,
|
|
245
231
|
debugClient: ViemPublicDebugClient,
|
|
246
232
|
blobClient: BlobClientInterface,
|
|
247
|
-
logs:
|
|
233
|
+
logs: CheckpointProposedLog[],
|
|
248
234
|
{ chainId, version, targetCommitteeSize }: { chainId: Fr; version: Fr; targetCommitteeSize: number },
|
|
249
|
-
contractAddresses: {
|
|
250
|
-
governanceProposerAddress: EthAddress;
|
|
251
|
-
slashFactoryAddress?: EthAddress;
|
|
252
|
-
slashingProposerAddress: EthAddress;
|
|
253
|
-
},
|
|
254
235
|
instrumentation: ArchiverInstrumentation,
|
|
255
236
|
logger: Logger,
|
|
256
237
|
isHistoricalSync: boolean,
|
|
@@ -262,29 +243,31 @@ async function processCheckpointProposedLogs(
|
|
|
262
243
|
targetCommitteeSize,
|
|
263
244
|
instrumentation,
|
|
264
245
|
logger,
|
|
265
|
-
|
|
246
|
+
EthAddress.fromString(rollup.address),
|
|
266
247
|
);
|
|
267
248
|
|
|
268
249
|
await asyncPool(10, logs, async log => {
|
|
269
|
-
const checkpointNumber =
|
|
270
|
-
const archive = log.args.archive
|
|
271
|
-
const archiveFromChain = await rollup.
|
|
272
|
-
const blobHashes = log.args.versionedBlobHashes
|
|
250
|
+
const checkpointNumber = log.args.checkpointNumber;
|
|
251
|
+
const archive = log.args.archive;
|
|
252
|
+
const archiveFromChain = await rollup.archiveAt(checkpointNumber);
|
|
253
|
+
const blobHashes = log.args.versionedBlobHashes;
|
|
273
254
|
|
|
274
255
|
// The value from the event and contract will match only if the checkpoint is in the chain.
|
|
275
|
-
if (archive
|
|
276
|
-
// Build expected hashes object (fields may be undefined for backwards compatibility with older events)
|
|
256
|
+
if (archive.equals(archiveFromChain)) {
|
|
277
257
|
const expectedHashes = {
|
|
278
|
-
attestationsHash: log.args.attestationsHash,
|
|
279
|
-
payloadDigest: log.args.payloadDigest,
|
|
258
|
+
attestationsHash: log.args.attestationsHash.toString() as Hex,
|
|
259
|
+
payloadDigest: log.args.payloadDigest.toString() as Hex,
|
|
280
260
|
};
|
|
281
261
|
|
|
282
262
|
const checkpoint = await calldataRetriever.getCheckpointFromRollupTx(
|
|
283
|
-
log.
|
|
263
|
+
log.l1TransactionHash,
|
|
284
264
|
blobHashes,
|
|
285
265
|
checkpointNumber,
|
|
286
266
|
expectedHashes,
|
|
287
267
|
);
|
|
268
|
+
const { timestamp, parentBeaconBlockRoot } = await getL1Block(publicClient, log.l1BlockNumber);
|
|
269
|
+
const l1 = new L1PublishedData(log.l1BlockNumber, timestamp, log.l1BlockHash.toString());
|
|
270
|
+
|
|
288
271
|
const checkpointBlobData = await getCheckpointBlobDataFromBlobs(
|
|
289
272
|
blobClient,
|
|
290
273
|
checkpoint.blockHash,
|
|
@@ -292,25 +275,21 @@ async function processCheckpointProposedLogs(
|
|
|
292
275
|
checkpointNumber,
|
|
293
276
|
logger,
|
|
294
277
|
isHistoricalSync,
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
const l1 = new L1PublishedData(
|
|
298
|
-
log.blockNumber,
|
|
299
|
-
await getL1BlockTime(publicClient, log.blockNumber),
|
|
300
|
-
log.blockHash,
|
|
278
|
+
parentBeaconBlockRoot,
|
|
279
|
+
timestamp,
|
|
301
280
|
);
|
|
302
281
|
|
|
303
282
|
retrievedCheckpoints.push({ ...checkpoint, checkpointBlobData, l1, chainId, version });
|
|
304
|
-
logger.trace(`Retrieved checkpoint ${checkpointNumber} from L1 tx ${log.
|
|
305
|
-
l1BlockNumber: log.
|
|
283
|
+
logger.trace(`Retrieved checkpoint ${checkpointNumber} from L1 tx ${log.l1TransactionHash}`, {
|
|
284
|
+
l1BlockNumber: log.l1BlockNumber,
|
|
306
285
|
checkpointNumber,
|
|
307
286
|
archive: archive.toString(),
|
|
308
287
|
attestations: checkpoint.attestations,
|
|
309
288
|
});
|
|
310
289
|
} else {
|
|
311
290
|
logger.warn(`Ignoring checkpoint ${checkpointNumber} due to archive root mismatch`, {
|
|
312
|
-
actual: archive,
|
|
313
|
-
expected: archiveFromChain,
|
|
291
|
+
actual: archive.toString(),
|
|
292
|
+
expected: archiveFromChain.toString(),
|
|
314
293
|
});
|
|
315
294
|
}
|
|
316
295
|
});
|
|
@@ -318,9 +297,12 @@ async function processCheckpointProposedLogs(
|
|
|
318
297
|
return retrievedCheckpoints;
|
|
319
298
|
}
|
|
320
299
|
|
|
321
|
-
export async function
|
|
300
|
+
export async function getL1Block(
|
|
301
|
+
publicClient: ViemPublicClient,
|
|
302
|
+
blockNumber: bigint,
|
|
303
|
+
): Promise<{ timestamp: bigint; parentBeaconBlockRoot: string | undefined }> {
|
|
322
304
|
const block = await publicClient.getBlock({ blockNumber, includeTransactions: false });
|
|
323
|
-
return block.timestamp;
|
|
305
|
+
return { timestamp: block.timestamp, parentBeaconBlockRoot: block.parentBeaconBlockRoot };
|
|
324
306
|
}
|
|
325
307
|
|
|
326
308
|
export async function getCheckpointBlobDataFromBlobs(
|
|
@@ -330,8 +312,14 @@ export async function getCheckpointBlobDataFromBlobs(
|
|
|
330
312
|
checkpointNumber: CheckpointNumber,
|
|
331
313
|
logger: Logger,
|
|
332
314
|
isHistoricalSync: boolean,
|
|
315
|
+
parentBeaconBlockRoot?: string,
|
|
316
|
+
l1BlockTimestamp?: bigint,
|
|
333
317
|
): Promise<CheckpointBlobData> {
|
|
334
|
-
const blobBodies = await blobClient.getBlobSidecar(blockHash, blobHashes, {
|
|
318
|
+
const blobBodies = await blobClient.getBlobSidecar(blockHash, blobHashes, {
|
|
319
|
+
isHistoricalSync,
|
|
320
|
+
parentBeaconBlockRoot,
|
|
321
|
+
l1BlockTimestamp,
|
|
322
|
+
});
|
|
335
323
|
if (blobBodies.length === 0) {
|
|
336
324
|
throw new NoBlobBodiesFoundError(checkpointNumber);
|
|
337
325
|
}
|
|
@@ -355,12 +343,12 @@ export async function getCheckpointBlobDataFromBlobs(
|
|
|
355
343
|
|
|
356
344
|
/** Given an L1 to L2 message, retrieves its corresponding event from the Inbox within a specific block range. */
|
|
357
345
|
export async function retrieveL1ToL2Message(
|
|
358
|
-
inbox:
|
|
346
|
+
inbox: InboxContract,
|
|
359
347
|
leaf: Fr,
|
|
360
348
|
fromBlock: bigint,
|
|
361
349
|
toBlock: bigint,
|
|
362
350
|
): Promise<InboxMessage | undefined> {
|
|
363
|
-
const logs = await inbox.
|
|
351
|
+
const logs = await inbox.getMessageSentEventByHash(leaf.toString(), fromBlock, toBlock);
|
|
364
352
|
|
|
365
353
|
const messages = mapLogsInboxMessage(logs);
|
|
366
354
|
return messages.length > 0 ? messages[0] : undefined;
|
|
@@ -368,47 +356,40 @@ export async function retrieveL1ToL2Message(
|
|
|
368
356
|
|
|
369
357
|
/**
|
|
370
358
|
* Fetch L1 to L2 messages.
|
|
371
|
-
* @param
|
|
372
|
-
* @param inboxAddress - The address of the inbox contract to fetch messages from.
|
|
373
|
-
* @param blockUntilSynced - If true, blocks until the archiver has fully synced.
|
|
359
|
+
* @param inbox - The inbox contract wrapper.
|
|
374
360
|
* @param searchStartBlock - The block number to use for starting the search.
|
|
375
361
|
* @param searchEndBlock - The highest block number that we should search up to.
|
|
376
362
|
* @returns An array of InboxLeaf and next eth block to search from.
|
|
377
363
|
*/
|
|
378
364
|
export async function retrieveL1ToL2Messages(
|
|
379
|
-
inbox:
|
|
365
|
+
inbox: InboxContract,
|
|
380
366
|
searchStartBlock: bigint,
|
|
381
367
|
searchEndBlock: bigint,
|
|
382
368
|
): Promise<InboxMessage[]> {
|
|
383
369
|
const retrievedL1ToL2Messages: InboxMessage[] = [];
|
|
384
370
|
while (searchStartBlock <= searchEndBlock) {
|
|
385
|
-
const messageSentLogs = (
|
|
386
|
-
await inbox.getEvents.MessageSent({}, { fromBlock: searchStartBlock, toBlock: searchEndBlock })
|
|
387
|
-
).filter(log => log.blockNumber! >= searchStartBlock && log.blockNumber! <= searchEndBlock);
|
|
371
|
+
const messageSentLogs = await inbox.getMessageSentEvents(searchStartBlock, searchEndBlock);
|
|
388
372
|
|
|
389
373
|
if (messageSentLogs.length === 0) {
|
|
390
374
|
break;
|
|
391
375
|
}
|
|
392
376
|
|
|
393
377
|
retrievedL1ToL2Messages.push(...mapLogsInboxMessage(messageSentLogs));
|
|
394
|
-
searchStartBlock = messageSentLogs.at(-1)!.
|
|
378
|
+
searchStartBlock = messageSentLogs.at(-1)!.l1BlockNumber + 1n;
|
|
395
379
|
}
|
|
396
380
|
|
|
397
381
|
return retrievedL1ToL2Messages;
|
|
398
382
|
}
|
|
399
383
|
|
|
400
|
-
function mapLogsInboxMessage(logs:
|
|
401
|
-
return logs.map(log => {
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
rollingHash: Buffer16.fromString(rollingHash!),
|
|
410
|
-
};
|
|
411
|
-
});
|
|
384
|
+
function mapLogsInboxMessage(logs: MessageSentLog[]): InboxMessage[] {
|
|
385
|
+
return logs.map(log => ({
|
|
386
|
+
index: log.args.index,
|
|
387
|
+
leaf: log.args.leaf,
|
|
388
|
+
l1BlockNumber: log.l1BlockNumber,
|
|
389
|
+
l1BlockHash: log.l1BlockHash,
|
|
390
|
+
checkpointNumber: log.args.checkpointNumber,
|
|
391
|
+
rollingHash: log.args.rollingHash,
|
|
392
|
+
}));
|
|
412
393
|
}
|
|
413
394
|
|
|
414
395
|
/** Retrieves L2ProofVerified events from the rollup contract. */
|
|
@@ -87,17 +87,17 @@ export async function verifyProxyImplementation(
|
|
|
87
87
|
/**
|
|
88
88
|
* Attempts to decode transaction as a Spire Proposer Multicall.
|
|
89
89
|
* Spire Proposer is a proxy contract that wraps multiple calls.
|
|
90
|
-
* Returns
|
|
90
|
+
* Returns all wrapped calls if validation succeeds (caller handles hash matching to find the propose call).
|
|
91
91
|
* @param tx - The transaction to decode
|
|
92
92
|
* @param publicClient - The viem public client for proxy verification
|
|
93
93
|
* @param logger - Logger instance
|
|
94
|
-
* @returns
|
|
94
|
+
* @returns Array of wrapped calls with 'to' and 'data', or undefined if not a valid Spire Proposer tx
|
|
95
95
|
*/
|
|
96
|
-
export async function
|
|
96
|
+
export async function getCallsFromSpireProposer(
|
|
97
97
|
tx: Transaction,
|
|
98
98
|
publicClient: { getStorageAt: (params: { address: Hex; slot: Hex }) => Promise<Hex | undefined> },
|
|
99
99
|
logger: Logger,
|
|
100
|
-
): Promise<{ to: Hex; data: Hex } | undefined> {
|
|
100
|
+
): Promise<{ to: Hex; data: Hex }[] | undefined> {
|
|
101
101
|
const txHash = tx.hash;
|
|
102
102
|
|
|
103
103
|
try {
|
|
@@ -141,17 +141,9 @@ export async function getCallFromSpireProposer(
|
|
|
141
141
|
|
|
142
142
|
const [calls] = spireArgs;
|
|
143
143
|
|
|
144
|
-
//
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
return undefined;
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
const call = calls[0];
|
|
151
|
-
|
|
152
|
-
// Successfully extracted the single wrapped call
|
|
153
|
-
logger.trace(`Decoded Spire Proposer with single call to ${call.target}`, { txHash });
|
|
154
|
-
return { to: call.target, data: call.data };
|
|
144
|
+
// Return all wrapped calls (hash matching in the caller determines which is the propose call)
|
|
145
|
+
logger.trace(`Decoded Spire Proposer with ${calls.length} call(s)`, { txHash });
|
|
146
|
+
return calls.map(call => ({ to: call.target, data: call.data }));
|
|
155
147
|
} catch (err) {
|
|
156
148
|
// Any decoding error triggers fallback to trace
|
|
157
149
|
logger.warn(`Failed to decode Spire Proposer: ${err}`, { txHash });
|
|
@@ -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;
|