@aztec/archiver 3.0.0-nightly.20251222 → 3.0.0-nightly.20251224
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.d.ts +10 -14
- package/dest/archiver/archiver.d.ts.map +1 -1
- package/dest/archiver/archiver.js +23 -18
- package/dest/archiver/archiver_store.d.ts +11 -8
- package/dest/archiver/archiver_store.d.ts.map +1 -1
- package/dest/archiver/archiver_store_test_suite.d.ts +1 -1
- package/dest/archiver/archiver_store_test_suite.d.ts.map +1 -1
- package/dest/archiver/archiver_store_test_suite.js +134 -39
- package/dest/archiver/config.d.ts +3 -3
- package/dest/archiver/config.d.ts.map +1 -1
- package/dest/archiver/config.js +2 -2
- package/dest/archiver/kv_archiver_store/kv_archiver_store.d.ts +4 -10
- package/dest/archiver/kv_archiver_store/kv_archiver_store.d.ts.map +1 -1
- package/dest/archiver/kv_archiver_store/kv_archiver_store.js +9 -8
- package/dest/archiver/kv_archiver_store/log_store.d.ts +11 -8
- package/dest/archiver/kv_archiver_store/log_store.d.ts.map +1 -1
- package/dest/archiver/kv_archiver_store/log_store.js +114 -48
- package/dest/archiver/l1/bin/retrieve-calldata.js +3 -1
- package/dest/archiver/l1/data_retrieval.d.ts +5 -5
- package/dest/archiver/l1/data_retrieval.d.ts.map +1 -1
- package/dest/archiver/l1/data_retrieval.js +9 -9
- package/dest/factory.d.ts +1 -1
- package/dest/factory.js +1 -1
- package/package.json +13 -13
- package/src/archiver/archiver.ts +29 -20
- package/src/archiver/archiver_store.ts +11 -7
- package/src/archiver/archiver_store_test_suite.ts +157 -43
- package/src/archiver/config.ts +7 -3
- package/src/archiver/kv_archiver_store/kv_archiver_store.ts +11 -10
- package/src/archiver/kv_archiver_store/log_store.ts +158 -53
- package/src/archiver/l1/bin/retrieve-calldata.ts +1 -1
- package/src/archiver/l1/data_retrieval.ts +10 -10
- package/src/factory.ts +1 -1
|
@@ -10,8 +10,12 @@ import { ContractClassLog, ExtendedContractClassLog, ExtendedPublicLog, LogId, P
|
|
|
10
10
|
*/ export class LogStore {
|
|
11
11
|
db;
|
|
12
12
|
blockStore;
|
|
13
|
-
|
|
14
|
-
#
|
|
13
|
+
// `tag` --> private logs
|
|
14
|
+
#privateLogsByTag;
|
|
15
|
+
// `{contractAddress}_${tag}` --> public logs
|
|
16
|
+
#publicLogsByContractAndTag;
|
|
17
|
+
#privateLogKeysByBlock;
|
|
18
|
+
#publicLogKeysByBlock;
|
|
15
19
|
#publicLogsByBlock;
|
|
16
20
|
#contractClassLogsByBlock;
|
|
17
21
|
#logsMaxPageSize;
|
|
@@ -20,68 +24,121 @@ import { ContractClassLog, ExtendedContractClassLog, ExtendedPublicLog, LogId, P
|
|
|
20
24
|
this.db = db;
|
|
21
25
|
this.blockStore = blockStore;
|
|
22
26
|
this.#log = createLogger('archiver:log_store');
|
|
23
|
-
this.#
|
|
24
|
-
this.#
|
|
27
|
+
this.#privateLogsByTag = db.openMap('archiver_private_tagged_logs_by_tag');
|
|
28
|
+
this.#publicLogsByContractAndTag = db.openMap('archiver_public_tagged_logs_by_tag');
|
|
29
|
+
this.#privateLogKeysByBlock = db.openMap('archiver_private_log_keys_by_block');
|
|
30
|
+
this.#publicLogKeysByBlock = db.openMap('archiver_public_log_keys_by_block');
|
|
25
31
|
this.#publicLogsByBlock = db.openMap('archiver_public_logs_by_block');
|
|
26
32
|
this.#contractClassLogsByBlock = db.openMap('archiver_contract_class_logs_by_block');
|
|
27
33
|
this.#logsMaxPageSize = logsMaxPageSize;
|
|
28
34
|
}
|
|
29
|
-
|
|
35
|
+
/**
|
|
36
|
+
* Extracts tagged logs from a single block, grouping them into private and public maps.
|
|
37
|
+
*
|
|
38
|
+
* @param block - The L2 block to extract logs from.
|
|
39
|
+
* @returns An object containing the private and public tagged logs for the block.
|
|
40
|
+
*/ async #extractTaggedLogsFromBlock(block) {
|
|
30
41
|
const blockHash = L2BlockHash.fromField(await block.hash());
|
|
31
|
-
|
|
42
|
+
// SiloedTag (as string) -> array of log buffers.
|
|
43
|
+
const privateTaggedLogs = new Map();
|
|
44
|
+
// "{contractAddress}_{tag}" (as string) -> array of log buffers.
|
|
45
|
+
const publicTaggedLogs = new Map();
|
|
32
46
|
const dataStartIndexForBlock = block.header.state.partial.noteHashTree.nextAvailableLeafIndex - block.body.txEffects.length * MAX_NOTE_HASHES_PER_TX;
|
|
33
47
|
block.body.txEffects.forEach((txEffect, txIndex)=>{
|
|
34
48
|
const txHash = txEffect.txHash;
|
|
35
49
|
const dataStartIndexForTx = dataStartIndexForBlock + txIndex * MAX_NOTE_HASHES_PER_TX;
|
|
36
50
|
txEffect.privateLogs.forEach((log, logIndex)=>{
|
|
51
|
+
// Private logs use SiloedTag (already siloed by kernel)
|
|
37
52
|
const tag = log.fields[0];
|
|
38
53
|
this.#log.debug(`Found private log with tag ${tag.toString()} in block ${block.number}`);
|
|
39
|
-
const currentLogs =
|
|
40
|
-
currentLogs.push(new TxScopedL2Log(txHash, dataStartIndexForTx, logIndex, block.number, blockHash, log).toBuffer());
|
|
41
|
-
|
|
54
|
+
const currentLogs = privateTaggedLogs.get(tag.toString()) ?? [];
|
|
55
|
+
currentLogs.push(new TxScopedL2Log(txHash, dataStartIndexForTx, logIndex, block.number, blockHash, block.timestamp, log).toBuffer());
|
|
56
|
+
privateTaggedLogs.set(tag.toString(), currentLogs);
|
|
42
57
|
});
|
|
43
58
|
txEffect.publicLogs.forEach((log, logIndex)=>{
|
|
59
|
+
// Public logs use Tag directly (not siloed) and are stored with contract address
|
|
44
60
|
const tag = log.fields[0];
|
|
45
|
-
|
|
46
|
-
const
|
|
47
|
-
|
|
48
|
-
|
|
61
|
+
const contractAddress = log.contractAddress;
|
|
62
|
+
const key = `${contractAddress.toString()}_${tag.toString()}`;
|
|
63
|
+
this.#log.debug(`Found public log with tag ${tag.toString()} from contract ${contractAddress.toString()} in block ${block.number}`);
|
|
64
|
+
const currentLogs = publicTaggedLogs.get(key) ?? [];
|
|
65
|
+
currentLogs.push(new TxScopedL2Log(txHash, dataStartIndexForTx, logIndex, block.number, blockHash, block.timestamp, log).toBuffer());
|
|
66
|
+
publicTaggedLogs.set(key, currentLogs);
|
|
49
67
|
});
|
|
50
68
|
});
|
|
51
|
-
return
|
|
69
|
+
return {
|
|
70
|
+
privateTaggedLogs,
|
|
71
|
+
publicTaggedLogs
|
|
72
|
+
};
|
|
52
73
|
}
|
|
53
74
|
/**
|
|
54
|
-
*
|
|
55
|
-
* @param blocks - The blocks
|
|
56
|
-
* @returns
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
const
|
|
60
|
-
|
|
75
|
+
* Extracts and aggregates tagged logs from a list of blocks.
|
|
76
|
+
* @param blocks - The blocks to extract logs from.
|
|
77
|
+
* @returns A map from tag (as string) to an array of serialized private logs belonging to that tag, and a map from
|
|
78
|
+
* "{contractAddress}_{tag}" (as string) to an array of serialized public logs belonging to that key.
|
|
79
|
+
*/ async #extractTaggedLogs(blocks) {
|
|
80
|
+
const taggedLogsInBlocks = await Promise.all(blocks.map((block)=>this.#extractTaggedLogsFromBlock(block)));
|
|
81
|
+
// Now we merge the maps from each block into a single map.
|
|
82
|
+
const privateTaggedLogs = taggedLogsInBlocks.reduce((acc, { privateTaggedLogs })=>{
|
|
83
|
+
for (const [tag, logs] of privateTaggedLogs.entries()){
|
|
61
84
|
const currentLogs = acc.get(tag) ?? [];
|
|
62
85
|
acc.set(tag, currentLogs.concat(logs));
|
|
63
86
|
}
|
|
64
87
|
return acc;
|
|
65
88
|
}, new Map());
|
|
66
|
-
const
|
|
89
|
+
const publicTaggedLogs = taggedLogsInBlocks.reduce((acc, { publicTaggedLogs })=>{
|
|
90
|
+
for (const [key, logs] of publicTaggedLogs.entries()){
|
|
91
|
+
const currentLogs = acc.get(key) ?? [];
|
|
92
|
+
acc.set(key, currentLogs.concat(logs));
|
|
93
|
+
}
|
|
94
|
+
return acc;
|
|
95
|
+
}, new Map());
|
|
96
|
+
return {
|
|
97
|
+
privateTaggedLogs,
|
|
98
|
+
publicTaggedLogs
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Append new logs to the store's list.
|
|
103
|
+
* @param blocks - The blocks for which to add the logs.
|
|
104
|
+
* @returns True if the operation is successful.
|
|
105
|
+
*/ async addLogs(blocks) {
|
|
106
|
+
const { privateTaggedLogs, publicTaggedLogs } = await this.#extractTaggedLogs(blocks);
|
|
107
|
+
const keysOfPrivateLogsToUpdate = Array.from(privateTaggedLogs.keys());
|
|
108
|
+
const keysOfPublicLogsToUpdate = Array.from(publicTaggedLogs.keys());
|
|
67
109
|
return this.db.transactionAsync(async ()=>{
|
|
68
|
-
const
|
|
69
|
-
tag,
|
|
70
|
-
logBuffers: await this.#
|
|
110
|
+
const currentPrivateTaggedLogs = await Promise.all(keysOfPrivateLogsToUpdate.map(async (key)=>({
|
|
111
|
+
tag: key,
|
|
112
|
+
logBuffers: await this.#privateLogsByTag.getAsync(key)
|
|
71
113
|
})));
|
|
72
|
-
|
|
114
|
+
currentPrivateTaggedLogs.forEach((taggedLogBuffer)=>{
|
|
73
115
|
if (taggedLogBuffer.logBuffers && taggedLogBuffer.logBuffers.length > 0) {
|
|
74
|
-
|
|
116
|
+
privateTaggedLogs.set(taggedLogBuffer.tag, taggedLogBuffer.logBuffers.concat(privateTaggedLogs.get(taggedLogBuffer.tag)));
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
const currentPublicTaggedLogs = await Promise.all(keysOfPublicLogsToUpdate.map(async (key)=>({
|
|
120
|
+
key,
|
|
121
|
+
logBuffers: await this.#publicLogsByContractAndTag.getAsync(key)
|
|
122
|
+
})));
|
|
123
|
+
currentPublicTaggedLogs.forEach((taggedLogBuffer)=>{
|
|
124
|
+
if (taggedLogBuffer.logBuffers && taggedLogBuffer.logBuffers.length > 0) {
|
|
125
|
+
publicTaggedLogs.set(taggedLogBuffer.key, taggedLogBuffer.logBuffers.concat(publicTaggedLogs.get(taggedLogBuffer.key)));
|
|
75
126
|
}
|
|
76
127
|
});
|
|
77
128
|
for (const block of blocks){
|
|
78
129
|
const blockHash = await block.hash();
|
|
79
|
-
const
|
|
80
|
-
for (const [tag, logs] of
|
|
81
|
-
await this.#
|
|
82
|
-
|
|
130
|
+
const privateTagsInBlock = [];
|
|
131
|
+
for (const [tag, logs] of privateTaggedLogs.entries()){
|
|
132
|
+
await this.#privateLogsByTag.set(tag, logs);
|
|
133
|
+
privateTagsInBlock.push(tag);
|
|
134
|
+
}
|
|
135
|
+
await this.#privateLogKeysByBlock.set(block.number, privateTagsInBlock);
|
|
136
|
+
const publicKeysInBlock = [];
|
|
137
|
+
for (const [key, logs] of publicTaggedLogs.entries()){
|
|
138
|
+
await this.#publicLogsByContractAndTag.set(key, logs);
|
|
139
|
+
publicKeysInBlock.push(key);
|
|
83
140
|
}
|
|
84
|
-
await this.#
|
|
141
|
+
await this.#publicLogKeysByBlock.set(block.number, publicKeysInBlock);
|
|
85
142
|
const publicLogsInBlock = block.body.txEffects.map((txEffect, txIndex)=>[
|
|
86
143
|
numToUInt32BE(txIndex),
|
|
87
144
|
numToUInt32BE(txEffect.publicLogs.length),
|
|
@@ -113,30 +170,39 @@ import { ContractClassLog, ExtendedContractClassLog, ExtendedPublicLog, LogId, P
|
|
|
113
170
|
}
|
|
114
171
|
deleteLogs(blocks) {
|
|
115
172
|
return this.db.transactionAsync(async ()=>{
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
173
|
+
await Promise.all(blocks.map(async (block)=>{
|
|
174
|
+
// Delete private logs
|
|
175
|
+
const privateKeys = await this.#privateLogKeysByBlock.getAsync(block.number) ?? [];
|
|
176
|
+
await Promise.all(privateKeys.map((tag)=>this.#privateLogsByTag.delete(tag)));
|
|
177
|
+
// Delete public logs
|
|
178
|
+
const publicKeys = await this.#publicLogKeysByBlock.getAsync(block.number) ?? [];
|
|
179
|
+
await Promise.all(publicKeys.map((key)=>this.#publicLogsByContractAndTag.delete(key)));
|
|
180
|
+
}));
|
|
120
181
|
await Promise.all(blocks.map((block)=>Promise.all([
|
|
121
182
|
this.#publicLogsByBlock.delete(block.number),
|
|
122
|
-
this.#
|
|
183
|
+
this.#privateLogKeysByBlock.delete(block.number),
|
|
184
|
+
this.#publicLogKeysByBlock.delete(block.number),
|
|
123
185
|
this.#contractClassLogsByBlock.delete(block.number)
|
|
124
186
|
])));
|
|
125
|
-
await Promise.all(tagsToDelete.map((tag)=>this.#logsByTag.delete(tag.toString())));
|
|
126
187
|
return true;
|
|
127
188
|
});
|
|
128
189
|
}
|
|
129
190
|
/**
|
|
130
|
-
* Gets all logs that match any of the
|
|
131
|
-
*
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
191
|
+
* Gets all private logs that match any of the `tags`. For each tag, an array of matching logs is returned. An empty
|
|
192
|
+
* array implies no logs match that tag.
|
|
193
|
+
*/ async getPrivateLogsByTags(tags) {
|
|
194
|
+
const logs = await Promise.all(tags.map((tag)=>this.#privateLogsByTag.getAsync(tag.toString())));
|
|
195
|
+
return logs.map((logBuffers)=>logBuffers?.map((logBuffer)=>TxScopedL2Log.fromBuffer(logBuffer)) ?? []);
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Gets all public logs that match any of the `tags` from the specified contract. For each tag, an array of matching
|
|
199
|
+
* logs is returned. An empty array implies no logs match that tag.
|
|
200
|
+
*/ async getPublicLogsByTagsFromContract(contractAddress, tags) {
|
|
201
|
+
const logs = await Promise.all(tags.map((tag)=>{
|
|
202
|
+
const key = `${contractAddress.toString()}_${tag.value.toString()}`;
|
|
203
|
+
return this.#publicLogsByContractAndTag.getAsync(key);
|
|
204
|
+
}));
|
|
205
|
+
return logs.map((logBuffers)=>logBuffers?.map((logBuffer)=>TxScopedL2Log.fromBuffer(logBuffer)) ?? []);
|
|
140
206
|
}
|
|
141
207
|
/**
|
|
142
208
|
* Gets public logs based on the provided filter.
|
|
@@ -61,7 +61,9 @@ async function main() {
|
|
|
61
61
|
// Create viem public client
|
|
62
62
|
const publicClient = createPublicClient({
|
|
63
63
|
chain: mainnet,
|
|
64
|
-
transport: http(rpcUrl
|
|
64
|
+
transport: http(rpcUrl, {
|
|
65
|
+
batch: false
|
|
66
|
+
})
|
|
65
67
|
});
|
|
66
68
|
logger.info('Fetching transaction...');
|
|
67
69
|
const tx = await publicClient.getTransaction({
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
+
import type { BlobClientInterface } from '@aztec/blob-client/client';
|
|
1
2
|
import { type CheckpointBlobData } from '@aztec/blob-lib';
|
|
2
|
-
import type { BlobSinkClientInterface } from '@aztec/blob-sink/client';
|
|
3
3
|
import type { ViemClient, ViemPublicClient, ViemPublicDebugClient } from '@aztec/ethereum/types';
|
|
4
4
|
import { CheckpointNumber } from '@aztec/foundation/branded-types';
|
|
5
5
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
@@ -30,7 +30,7 @@ export declare function retrievedToPublishedCheckpoint({ checkpointNumber, archi
|
|
|
30
30
|
* @param rollup - The rollup contract instance.
|
|
31
31
|
* @param publicClient - The viem public client to use for transaction retrieval.
|
|
32
32
|
* @param debugClient - The viem debug client to use for trace/debug RPC methods (optional).
|
|
33
|
-
* @param
|
|
33
|
+
* @param blobClient - The blob client client for fetching blob data.
|
|
34
34
|
* @param searchStartBlock - The block number to use for starting the search.
|
|
35
35
|
* @param searchEndBlock - The highest block number that we should search up to.
|
|
36
36
|
* @param contractAddresses - The contract addresses (governanceProposerAddress, slashFactoryAddress, slashingProposerAddress).
|
|
@@ -39,13 +39,13 @@ export declare function retrievedToPublishedCheckpoint({ checkpointNumber, archi
|
|
|
39
39
|
* @param isHistoricalSync - Whether this is a historical sync.
|
|
40
40
|
* @returns An array of retrieved checkpoints.
|
|
41
41
|
*/
|
|
42
|
-
export declare function retrieveCheckpointsFromRollup(rollup: GetContractReturnType<typeof RollupAbi, ViemPublicClient>, publicClient: ViemPublicClient, debugClient: ViemPublicDebugClient,
|
|
42
|
+
export declare function retrieveCheckpointsFromRollup(rollup: GetContractReturnType<typeof RollupAbi, ViemPublicClient>, publicClient: ViemPublicClient, debugClient: ViemPublicDebugClient, blobClient: BlobClientInterface, searchStartBlock: bigint, searchEndBlock: bigint, contractAddresses: {
|
|
43
43
|
governanceProposerAddress: EthAddress;
|
|
44
44
|
slashFactoryAddress?: EthAddress;
|
|
45
45
|
slashingProposerAddress: EthAddress;
|
|
46
46
|
}, instrumentation: ArchiverInstrumentation, logger?: Logger, isHistoricalSync?: boolean): Promise<RetrievedCheckpoint[]>;
|
|
47
47
|
export declare function getL1BlockTime(publicClient: ViemPublicClient, blockNumber: bigint): Promise<bigint>;
|
|
48
|
-
export declare function getCheckpointBlobDataFromBlobs(
|
|
48
|
+
export declare function getCheckpointBlobDataFromBlobs(blobClient: BlobClientInterface, blockHash: string, blobHashes: Buffer<ArrayBufferLike>[], checkpointNumber: CheckpointNumber, logger: Logger, isHistoricalSync: boolean): Promise<CheckpointBlobData>;
|
|
49
49
|
/** Given an L1 to L2 message, retrieves its corresponding event from the Inbox within a specific block range. */
|
|
50
50
|
export declare function retrieveL1ToL2Message(inbox: GetContractReturnType<typeof InboxAbi, ViemClient>, leaf: Fr, fromBlock: bigint, toBlock: bigint): Promise<InboxMessage | undefined>;
|
|
51
51
|
/**
|
|
@@ -87,4 +87,4 @@ export type SubmitEpochProof = {
|
|
|
87
87
|
* @returns Epoch proof metadata from the calldata, deserialized.
|
|
88
88
|
*/
|
|
89
89
|
export declare function getProofFromSubmitProofTx(publicClient: ViemPublicClient, txHash: `0x${string}`, expectedProverId: Fr): Promise<SubmitEpochProof>;
|
|
90
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
90
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YV9yZXRyaWV2YWwuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcmNoaXZlci9sMS9kYXRhX3JldHJpZXZhbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3JFLE9BQU8sRUFFTCxLQUFLLGtCQUFrQixFQUl4QixNQUFNLGlCQUFpQixDQUFDO0FBRXpCLE9BQU8sS0FBSyxFQUFFLFVBQVUsRUFBRSxnQkFBZ0IsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRWpHLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRW5FLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNwRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDM0QsT0FBTyxFQUFFLEtBQUssTUFBTSxFQUFnQixNQUFNLHVCQUF1QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxLQUFLLFFBQVEsRUFBRSxTQUFTLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMvRCxPQUFPLEVBQVEsb0JBQW9CLEVBQWMsTUFBTSxxQkFBcUIsQ0FBQztBQUM3RSxPQUFPLEVBQWMsZUFBZSxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDNUYsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBSXhELE9BQU8sRUFFTCxLQUFLLHFCQUFxQixFQUMxQixLQUFLLEdBQUcsRUFJVCxNQUFNLE1BQU0sQ0FBQztBQUdkLE9BQU8sS0FBSyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDckUsT0FBTyxLQUFLLEVBQUUsYUFBYSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFD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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data_retrieval.d.ts","sourceRoot":"","sources":["../../../src/archiver/l1/data_retrieval.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"data_retrieval.d.ts","sourceRoot":"","sources":["../../../src/archiver/l1/data_retrieval.ts"],"names":[],"mappings":"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"}
|
|
@@ -81,7 +81,7 @@ export async function retrievedToPublishedCheckpoint({ checkpointNumber, archive
|
|
|
81
81
|
* @param rollup - The rollup contract instance.
|
|
82
82
|
* @param publicClient - The viem public client to use for transaction retrieval.
|
|
83
83
|
* @param debugClient - The viem debug client to use for trace/debug RPC methods (optional).
|
|
84
|
-
* @param
|
|
84
|
+
* @param blobClient - The blob client client for fetching blob data.
|
|
85
85
|
* @param searchStartBlock - The block number to use for starting the search.
|
|
86
86
|
* @param searchEndBlock - The highest block number that we should search up to.
|
|
87
87
|
* @param contractAddresses - The contract addresses (governanceProposerAddress, slashFactoryAddress, slashingProposerAddress).
|
|
@@ -89,7 +89,7 @@ export async function retrievedToPublishedCheckpoint({ checkpointNumber, archive
|
|
|
89
89
|
* @param logger - The logger instance.
|
|
90
90
|
* @param isHistoricalSync - Whether this is a historical sync.
|
|
91
91
|
* @returns An array of retrieved checkpoints.
|
|
92
|
-
*/ export async function retrieveCheckpointsFromRollup(rollup, publicClient, debugClient,
|
|
92
|
+
*/ export async function retrieveCheckpointsFromRollup(rollup, publicClient, debugClient, blobClient, searchStartBlock, searchEndBlock, contractAddresses, instrumentation, logger = createLogger('archiver'), isHistoricalSync = false) {
|
|
93
93
|
const retrievedCheckpoints = [];
|
|
94
94
|
let rollupConstants;
|
|
95
95
|
do {
|
|
@@ -117,7 +117,7 @@ export async function retrievedToPublishedCheckpoint({ checkpointNumber, archive
|
|
|
117
117
|
targetCommitteeSize: Number(targetCommitteeSize)
|
|
118
118
|
};
|
|
119
119
|
}
|
|
120
|
-
const newCheckpoints = await processCheckpointProposedLogs(rollup, publicClient, debugClient,
|
|
120
|
+
const newCheckpoints = await processCheckpointProposedLogs(rollup, publicClient, debugClient, blobClient, checkpointProposedLogs, rollupConstants, contractAddresses, instrumentation, logger, isHistoricalSync);
|
|
121
121
|
retrievedCheckpoints.push(...newCheckpoints);
|
|
122
122
|
searchStartBlock = lastLog.blockNumber + 1n;
|
|
123
123
|
}while (searchStartBlock <= searchEndBlock)
|
|
@@ -129,7 +129,7 @@ export async function retrievedToPublishedCheckpoint({ checkpointNumber, archive
|
|
|
129
129
|
* @param rollup - The rollup contract instance.
|
|
130
130
|
* @param publicClient - The viem public client to use for transaction retrieval.
|
|
131
131
|
* @param debugClient - The viem debug client to use for trace/debug RPC methods (optional).
|
|
132
|
-
* @param
|
|
132
|
+
* @param blobClient - The blob client client for fetching blob data.
|
|
133
133
|
* @param logs - CheckpointProposed logs.
|
|
134
134
|
* @param rollupConstants - The rollup constants (chainId, version, targetCommitteeSize).
|
|
135
135
|
* @param contractAddresses - The contract addresses (governanceProposerAddress, slashFactoryAddress, slashingProposerAddress).
|
|
@@ -137,7 +137,7 @@ export async function retrievedToPublishedCheckpoint({ checkpointNumber, archive
|
|
|
137
137
|
* @param logger - The logger instance.
|
|
138
138
|
* @param isHistoricalSync - Whether this is a historical sync.
|
|
139
139
|
* @returns An array of retrieved checkpoints.
|
|
140
|
-
*/ async function processCheckpointProposedLogs(rollup, publicClient, debugClient,
|
|
140
|
+
*/ async function processCheckpointProposedLogs(rollup, publicClient, debugClient, blobClient, logs, { chainId, version, targetCommitteeSize }, contractAddresses, instrumentation, logger, isHistoricalSync) {
|
|
141
141
|
const retrievedCheckpoints = [];
|
|
142
142
|
const calldataRetriever = new CalldataRetriever(publicClient, debugClient, targetCommitteeSize, instrumentation, logger, {
|
|
143
143
|
...contractAddresses,
|
|
@@ -158,7 +158,7 @@ export async function retrievedToPublishedCheckpoint({ checkpointNumber, archive
|
|
|
158
158
|
payloadDigest: log.args.payloadDigest
|
|
159
159
|
};
|
|
160
160
|
const checkpoint = await calldataRetriever.getCheckpointFromRollupTx(log.transactionHash, blobHashes, checkpointNumber, expectedHashes);
|
|
161
|
-
const checkpointBlobData = await getCheckpointBlobDataFromBlobs(
|
|
161
|
+
const checkpointBlobData = await getCheckpointBlobDataFromBlobs(blobClient, checkpoint.blockHash, blobHashes, checkpointNumber, logger, isHistoricalSync);
|
|
162
162
|
const l1 = new L1PublishedData(log.blockNumber, await getL1BlockTime(publicClient, log.blockNumber), log.blockHash);
|
|
163
163
|
retrievedCheckpoints.push({
|
|
164
164
|
...checkpoint,
|
|
@@ -189,8 +189,8 @@ export async function getL1BlockTime(publicClient, blockNumber) {
|
|
|
189
189
|
});
|
|
190
190
|
return block.timestamp;
|
|
191
191
|
}
|
|
192
|
-
export async function getCheckpointBlobDataFromBlobs(
|
|
193
|
-
const blobBodies = await
|
|
192
|
+
export async function getCheckpointBlobDataFromBlobs(blobClient, blockHash, blobHashes, checkpointNumber, logger, isHistoricalSync) {
|
|
193
|
+
const blobBodies = await blobClient.getBlobSidecar(blockHash, blobHashes, {
|
|
194
194
|
isHistoricalSync
|
|
195
195
|
});
|
|
196
196
|
if (blobBodies.length === 0) {
|
|
@@ -199,7 +199,7 @@ export async function getCheckpointBlobDataFromBlobs(blobSinkClient, blockHash,
|
|
|
199
199
|
let checkpointBlobData;
|
|
200
200
|
try {
|
|
201
201
|
// Attempt to decode the checkpoint blob data.
|
|
202
|
-
checkpointBlobData = decodeCheckpointBlobDataFromBlobs(blobBodies
|
|
202
|
+
checkpointBlobData = decodeCheckpointBlobDataFromBlobs(blobBodies);
|
|
203
203
|
} catch (err) {
|
|
204
204
|
if (err instanceof BlobDeserializationError) {
|
|
205
205
|
logger.fatal(err.message);
|
package/dest/factory.d.ts
CHANGED
|
@@ -8,7 +8,7 @@ export declare function createArchiverStore(userConfig: Pick<ArchiverConfig, 'ar
|
|
|
8
8
|
/**
|
|
9
9
|
* Creates a local archiver.
|
|
10
10
|
* @param config - The archiver configuration.
|
|
11
|
-
* @param
|
|
11
|
+
* @param blobClient - The blob client client.
|
|
12
12
|
* @param opts - The options.
|
|
13
13
|
* @param telemetry - The telemetry client.
|
|
14
14
|
* @returns The local archiver.
|
package/dest/factory.js
CHANGED
|
@@ -19,7 +19,7 @@ export const ARCHIVER_STORE_NAME = 'archiver';
|
|
|
19
19
|
/**
|
|
20
20
|
* Creates a local archiver.
|
|
21
21
|
* @param config - The archiver configuration.
|
|
22
|
-
* @param
|
|
22
|
+
* @param blobClient - The blob client client.
|
|
23
23
|
* @param opts - The options.
|
|
24
24
|
* @param telemetry - The telemetry client.
|
|
25
25
|
* @returns The local archiver.
|
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.20251224",
|
|
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-
|
|
70
|
-
"@aztec/blob-
|
|
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-client": "3.0.0-nightly.20251224",
|
|
70
|
+
"@aztec/blob-lib": "3.0.0-nightly.20251224",
|
|
71
|
+
"@aztec/constants": "3.0.0-nightly.20251224",
|
|
72
|
+
"@aztec/epoch-cache": "3.0.0-nightly.20251224",
|
|
73
|
+
"@aztec/ethereum": "3.0.0-nightly.20251224",
|
|
74
|
+
"@aztec/foundation": "3.0.0-nightly.20251224",
|
|
75
|
+
"@aztec/kv-store": "3.0.0-nightly.20251224",
|
|
76
|
+
"@aztec/l1-artifacts": "3.0.0-nightly.20251224",
|
|
77
|
+
"@aztec/noir-protocol-circuits-types": "3.0.0-nightly.20251224",
|
|
78
|
+
"@aztec/protocol-contracts": "3.0.0-nightly.20251224",
|
|
79
|
+
"@aztec/stdlib": "3.0.0-nightly.20251224",
|
|
80
|
+
"@aztec/telemetry-client": "3.0.0-nightly.20251224",
|
|
81
81
|
"lodash.groupby": "^4.6.0",
|
|
82
82
|
"lodash.omit": "^4.5.0",
|
|
83
83
|
"tslib": "^2.5.0",
|
package/src/archiver/archiver.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { BlobClientInterface } from '@aztec/blob-client/client';
|
|
2
2
|
import { GENESIS_BLOCK_HEADER_HASH } from '@aztec/constants';
|
|
3
3
|
import { EpochCache } from '@aztec/epoch-cache';
|
|
4
4
|
import { createEthereumChain } from '@aztec/ethereum/chain';
|
|
@@ -64,7 +64,15 @@ import {
|
|
|
64
64
|
} from '@aztec/stdlib/epoch-helpers';
|
|
65
65
|
import type { GetContractClassLogsResponse, GetPublicLogsResponse } from '@aztec/stdlib/interfaces/client';
|
|
66
66
|
import type { L2LogsSource } from '@aztec/stdlib/interfaces/server';
|
|
67
|
-
import {
|
|
67
|
+
import {
|
|
68
|
+
ContractClassLog,
|
|
69
|
+
type LogFilter,
|
|
70
|
+
type PrivateLog,
|
|
71
|
+
type PublicLog,
|
|
72
|
+
type SiloedTag,
|
|
73
|
+
Tag,
|
|
74
|
+
TxScopedL2Log,
|
|
75
|
+
} from '@aztec/stdlib/logs';
|
|
68
76
|
import { type L1ToL2MessageSource, computeInHashFromL1ToL2Messages } from '@aztec/stdlib/messaging';
|
|
69
77
|
import type { CheckpointHeader } from '@aztec/stdlib/rollup';
|
|
70
78
|
import { type BlockHeader, type IndexedTxEffect, TxHash, TxReceipt } from '@aztec/stdlib/tx';
|
|
@@ -110,7 +118,7 @@ type AddBlockRequest = {
|
|
|
110
118
|
|
|
111
119
|
export type ArchiverDeps = {
|
|
112
120
|
telemetry?: TelemetryClient;
|
|
113
|
-
|
|
121
|
+
blobClient: BlobClientInterface;
|
|
114
122
|
epochCache?: EpochCache;
|
|
115
123
|
dateProvider?: DateProvider;
|
|
116
124
|
};
|
|
@@ -188,7 +196,7 @@ export class Archiver
|
|
|
188
196
|
maxAllowedEthClientDriftSeconds: number;
|
|
189
197
|
ethereumAllowNoDebugHosts?: boolean;
|
|
190
198
|
},
|
|
191
|
-
private readonly
|
|
199
|
+
private readonly blobClient: BlobClientInterface,
|
|
192
200
|
private readonly epochCache: EpochCache,
|
|
193
201
|
private readonly dateProvider: DateProvider,
|
|
194
202
|
private readonly instrumentation: ArchiverInstrumentation,
|
|
@@ -230,7 +238,7 @@ export class Archiver
|
|
|
230
238
|
const chain = createEthereumChain(config.l1RpcUrls, config.l1ChainId);
|
|
231
239
|
const publicClient = createPublicClient({
|
|
232
240
|
chain: chain.chainInfo,
|
|
233
|
-
transport: fallback(config.l1RpcUrls.map(url => http(url))),
|
|
241
|
+
transport: fallback(config.l1RpcUrls.map(url => http(url, { batch: false }))),
|
|
234
242
|
pollingInterval: config.viemPollingIntervalMS,
|
|
235
243
|
});
|
|
236
244
|
|
|
@@ -238,7 +246,7 @@ export class Archiver
|
|
|
238
246
|
const debugRpcUrls = config.l1DebugRpcUrls.length > 0 ? config.l1DebugRpcUrls : config.l1RpcUrls;
|
|
239
247
|
const debugClient = createPublicClient({
|
|
240
248
|
chain: chain.chainInfo,
|
|
241
|
-
transport: fallback(debugRpcUrls.map(url => http(url))),
|
|
249
|
+
transport: fallback(debugRpcUrls.map(url => http(url, { batch: false }))),
|
|
242
250
|
pollingInterval: config.viemPollingIntervalMS,
|
|
243
251
|
}) as ViemPublicDebugClient;
|
|
244
252
|
|
|
@@ -289,7 +297,7 @@ export class Archiver
|
|
|
289
297
|
{ ...config.l1Contracts, slashingProposerAddress },
|
|
290
298
|
archiverStore,
|
|
291
299
|
opts,
|
|
292
|
-
deps.
|
|
300
|
+
deps.blobClient,
|
|
293
301
|
epochCache,
|
|
294
302
|
deps.dateProvider ?? new DateProvider(),
|
|
295
303
|
await ArchiverInstrumentation.new(telemetry, () => archiverStore.estimateSize()),
|
|
@@ -313,7 +321,7 @@ export class Archiver
|
|
|
313
321
|
throw new Error('Archiver is already running');
|
|
314
322
|
}
|
|
315
323
|
|
|
316
|
-
await this.
|
|
324
|
+
await this.blobClient.testSources();
|
|
317
325
|
await this.testEthereumNodeSynced();
|
|
318
326
|
await validateAndLogTraceAvailability(this.debugClient, this.config.ethereumAllowNoDebugHosts ?? false);
|
|
319
327
|
|
|
@@ -959,12 +967,12 @@ export class Archiver
|
|
|
959
967
|
|
|
960
968
|
this.log.trace(`Retrieving checkpoints from L1 block ${searchStartBlock} to ${searchEndBlock}`);
|
|
961
969
|
|
|
962
|
-
// TODO(md): Retrieve from blob
|
|
970
|
+
// TODO(md): Retrieve from blob client then from consensus client, then from peers
|
|
963
971
|
const retrievedCheckpoints = await retrieveCheckpointsFromRollup(
|
|
964
972
|
this.rollup.getContract() as GetContractReturnType<typeof RollupAbi, ViemPublicClient>,
|
|
965
973
|
this.publicClient,
|
|
966
974
|
this.debugClient,
|
|
967
|
-
this.
|
|
975
|
+
this.blobClient,
|
|
968
976
|
searchStartBlock, // TODO(palla/reorg): If the L2 reorg was due to an L1 reorg, we need to start search earlier
|
|
969
977
|
searchEndBlock,
|
|
970
978
|
this.l1Addresses,
|
|
@@ -1407,14 +1415,12 @@ export class Archiver
|
|
|
1407
1415
|
return this.store.getSettledTxReceipt(txHash);
|
|
1408
1416
|
}
|
|
1409
1417
|
|
|
1410
|
-
|
|
1411
|
-
|
|
1412
|
-
|
|
1413
|
-
|
|
1414
|
-
|
|
1415
|
-
|
|
1416
|
-
getLogsByTags(tags: Fr[]): Promise<TxScopedL2Log[][]> {
|
|
1417
|
-
return this.store.getLogsByTags(tags);
|
|
1418
|
+
getPrivateLogsByTags(tags: SiloedTag[]): Promise<TxScopedL2Log[][]> {
|
|
1419
|
+
return this.store.getPrivateLogsByTags(tags);
|
|
1420
|
+
}
|
|
1421
|
+
|
|
1422
|
+
getPublicLogsByTagsFromContract(contractAddress: AztecAddress, tags: Tag[]): Promise<TxScopedL2Log[][]> {
|
|
1423
|
+
return this.store.getPublicLogsByTagsFromContract(contractAddress, tags);
|
|
1418
1424
|
}
|
|
1419
1425
|
|
|
1420
1426
|
/**
|
|
@@ -2072,8 +2078,11 @@ export class ArchiverStoreHelper
|
|
|
2072
2078
|
getL1ToL2MessageIndex(l1ToL2Message: Fr): Promise<bigint | undefined> {
|
|
2073
2079
|
return this.store.getL1ToL2MessageIndex(l1ToL2Message);
|
|
2074
2080
|
}
|
|
2075
|
-
|
|
2076
|
-
return this.store.
|
|
2081
|
+
getPrivateLogsByTags(tags: SiloedTag[]): Promise<TxScopedL2Log[][]> {
|
|
2082
|
+
return this.store.getPrivateLogsByTags(tags);
|
|
2083
|
+
}
|
|
2084
|
+
getPublicLogsByTagsFromContract(contractAddress: AztecAddress, tags: Tag[]): Promise<TxScopedL2Log[][]> {
|
|
2085
|
+
return this.store.getPublicLogsByTagsFromContract(contractAddress, tags);
|
|
2077
2086
|
}
|
|
2078
2087
|
getPublicLogs(filter: LogFilter): Promise<GetPublicLogsResponse> {
|
|
2079
2088
|
return this.store.getPublicLogs(filter);
|
|
@@ -14,7 +14,7 @@ import type {
|
|
|
14
14
|
UtilityFunctionWithMembershipProof,
|
|
15
15
|
} from '@aztec/stdlib/contract';
|
|
16
16
|
import type { GetContractClassLogsResponse, GetPublicLogsResponse } from '@aztec/stdlib/interfaces/client';
|
|
17
|
-
import type { LogFilter, TxScopedL2Log } from '@aztec/stdlib/logs';
|
|
17
|
+
import type { LogFilter, SiloedTag, Tag, TxScopedL2Log } from '@aztec/stdlib/logs';
|
|
18
18
|
import { BlockHeader, type IndexedTxEffect, type TxHash, type TxReceipt } from '@aztec/stdlib/tx';
|
|
19
19
|
import type { UInt64 } from '@aztec/stdlib/types';
|
|
20
20
|
|
|
@@ -206,13 +206,17 @@ export interface ArchiverDataStore {
|
|
|
206
206
|
getTotalL1ToL2MessageCount(): Promise<bigint>;
|
|
207
207
|
|
|
208
208
|
/**
|
|
209
|
-
|
|
210
|
-
*
|
|
211
|
-
*
|
|
212
|
-
|
|
213
|
-
|
|
209
|
+
/**
|
|
210
|
+
* Gets all private logs that match any of the `tags`. For each tag, an array of matching logs is returned. An empty
|
|
211
|
+
* array implies no logs match that tag.
|
|
212
|
+
*/
|
|
213
|
+
getPrivateLogsByTags(tags: SiloedTag[]): Promise<TxScopedL2Log[][]>;
|
|
214
|
+
|
|
215
|
+
/**
|
|
216
|
+
* Gets all public logs that match any of the `tags` from the specified contract. For each tag, an array of matching
|
|
217
|
+
* logs is returned. An empty array implies no logs match that tag.
|
|
214
218
|
*/
|
|
215
|
-
|
|
219
|
+
getPublicLogsByTagsFromContract(contractAddress: AztecAddress, tags: Tag[]): Promise<TxScopedL2Log[][]>;
|
|
216
220
|
|
|
217
221
|
/**
|
|
218
222
|
* Gets public logs based on the provided filter.
|