@aztec/archiver 0.54.0 → 0.55.0
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 +2 -3
- package/dest/archiver/archiver.d.ts.map +1 -1
- package/dest/archiver/archiver.js +28 -61
- package/dest/archiver/data_retrieval.d.ts +6 -16
- package/dest/archiver/data_retrieval.d.ts.map +1 -1
- package/dest/archiver/data_retrieval.js +10 -35
- package/dest/archiver/eth_log_handlers.d.ts +6 -16
- package/dest/archiver/eth_log_handlers.d.ts.map +1 -1
- package/dest/archiver/eth_log_handlers.js +15 -84
- package/dest/index.d.ts +1 -1
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +3 -3
- package/package.json +10 -10
- package/src/archiver/archiver.ts +39 -89
- package/src/archiver/data_retrieval.ts +12 -58
- package/src/archiver/eth_log_handlers.ts +17 -117
- package/src/index.ts +1 -2
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { Body, InboxLeaf } from '@aztec/circuit-types';
|
|
1
|
+
import { Body, InboxLeaf, L2Block } from '@aztec/circuit-types';
|
|
2
2
|
import { AppendOnlyTreeSnapshot, Header, Proof } from '@aztec/circuits.js';
|
|
3
3
|
import { Fr } from '@aztec/foundation/fields';
|
|
4
4
|
import { numToUInt32BE } from '@aztec/foundation/serialize';
|
|
5
|
-
import {
|
|
6
|
-
import { decodeFunctionData, getAbiItem, getAddress, hexToBytes
|
|
5
|
+
import { InboxAbi, RollupAbi } from '@aztec/l1-artifacts';
|
|
6
|
+
import { decodeFunctionData, getAbiItem, getAddress, hexToBytes } from 'viem';
|
|
7
7
|
/**
|
|
8
8
|
* Processes newly received MessageSent (L1 to L2) logs.
|
|
9
9
|
* @param logs - MessageSent logs.
|
|
@@ -22,49 +22,41 @@ export function processMessageSentLogs(logs) {
|
|
|
22
22
|
* @param publicClient - The viem public client to use for transaction retrieval.
|
|
23
23
|
* @param expectedL2BlockNumber - The next expected L2 block number.
|
|
24
24
|
* @param logs - L2BlockProposed logs.
|
|
25
|
-
* @returns - An array
|
|
25
|
+
* @returns - An array blocks.
|
|
26
26
|
*/
|
|
27
27
|
export async function processL2BlockProposedLogs(publicClient, expectedL2BlockNumber, logs) {
|
|
28
|
-
const
|
|
28
|
+
const retrievedBlocks = [];
|
|
29
29
|
for (const log of logs) {
|
|
30
30
|
const blockNum = log.args.blockNumber;
|
|
31
31
|
if (blockNum !== expectedL2BlockNumber) {
|
|
32
32
|
throw new Error('Block number mismatch. Expected: ' + expectedL2BlockNumber + ' but got: ' + blockNum + '.');
|
|
33
33
|
}
|
|
34
34
|
// TODO: Fetch blocks from calldata in parallel
|
|
35
|
-
const
|
|
35
|
+
const block = await getBlockFromRollupTx(publicClient, log.transactionHash, log.args.blockNumber);
|
|
36
36
|
const l1 = {
|
|
37
37
|
blockNumber: log.blockNumber,
|
|
38
38
|
blockHash: log.blockHash,
|
|
39
39
|
timestamp: await getL1BlockTime(publicClient, log.blockNumber),
|
|
40
40
|
};
|
|
41
|
-
|
|
41
|
+
retrievedBlocks.push({ data: block, l1 });
|
|
42
42
|
expectedL2BlockNumber++;
|
|
43
43
|
}
|
|
44
|
-
return
|
|
44
|
+
return retrievedBlocks;
|
|
45
45
|
}
|
|
46
46
|
export async function getL1BlockTime(publicClient, blockNumber) {
|
|
47
47
|
const block = await publicClient.getBlock({ blockNumber, includeTransactions: false });
|
|
48
48
|
return block.timestamp;
|
|
49
49
|
}
|
|
50
|
-
export async function processTxsPublishedLogs(publicClient, logs) {
|
|
51
|
-
const retrievedBlockBodies = [];
|
|
52
|
-
for (const log of logs) {
|
|
53
|
-
const newBlockBody = await getBlockBodiesFromAvailabilityOracleTx(publicClient, log.transactionHash);
|
|
54
|
-
retrievedBlockBodies.push([newBlockBody, Buffer.from(hexToBytes(log.args.txsEffectsHash))]);
|
|
55
|
-
}
|
|
56
|
-
return retrievedBlockBodies;
|
|
57
|
-
}
|
|
58
50
|
/**
|
|
59
|
-
* Gets block
|
|
51
|
+
* Gets block from the calldata of an L1 transaction.
|
|
60
52
|
* Assumes that the block was published from an EOA.
|
|
61
53
|
* TODO: Add retries and error management.
|
|
62
54
|
* @param publicClient - The viem public client to use for transaction retrieval.
|
|
63
55
|
* @param txHash - Hash of the tx that published it.
|
|
64
56
|
* @param l2BlockNum - L2 block number.
|
|
65
|
-
* @returns L2 block
|
|
57
|
+
* @returns L2 block from the calldata, deserialized
|
|
66
58
|
*/
|
|
67
|
-
async function
|
|
59
|
+
async function getBlockFromRollupTx(publicClient, txHash, l2BlockNum) {
|
|
68
60
|
const { input: data } = await publicClient.getTransaction({ hash: txHash });
|
|
69
61
|
const { functionName, args } = decodeFunctionData({
|
|
70
62
|
abi: RollupAbi,
|
|
@@ -73,8 +65,9 @@ async function getBlockMetadataFromRollupTx(publicClient, txHash, l2BlockNum) {
|
|
|
73
65
|
if (!(functionName === 'propose')) {
|
|
74
66
|
throw new Error(`Unexpected method called ${functionName}`);
|
|
75
67
|
}
|
|
76
|
-
const [headerHex, archiveRootHex,
|
|
68
|
+
const [headerHex, archiveRootHex, , , , bodyHex] = args;
|
|
77
69
|
const header = Header.fromBuffer(Buffer.from(hexToBytes(headerHex)));
|
|
70
|
+
const blockBody = Body.fromBuffer(Buffer.from(hexToBytes(bodyHex)));
|
|
78
71
|
const blockNumberFromHeader = header.globalVariables.blockNumber.toBigInt();
|
|
79
72
|
if (blockNumberFromHeader !== l2BlockNum) {
|
|
80
73
|
throw new Error(`Block number mismatch: expected ${l2BlockNum} but got ${blockNumberFromHeader}`);
|
|
@@ -83,50 +76,7 @@ async function getBlockMetadataFromRollupTx(publicClient, txHash, l2BlockNum) {
|
|
|
83
76
|
Buffer.from(hexToBytes(archiveRootHex)), // L2Block.archive.root
|
|
84
77
|
numToUInt32BE(Number(l2BlockNum)), // L2Block.archive.nextAvailableLeafIndex
|
|
85
78
|
]));
|
|
86
|
-
return
|
|
87
|
-
}
|
|
88
|
-
/**
|
|
89
|
-
* Gets block bodies from calldata of an L1 transaction, and deserializes them into Body objects.
|
|
90
|
-
* @note Assumes that the block was published using `propose` or `publish`.
|
|
91
|
-
* TODO: Add retries and error management.
|
|
92
|
-
* @param publicClient - The viem public client to use for transaction retrieval.
|
|
93
|
-
* @param txHash - Hash of the tx that published it.
|
|
94
|
-
* @returns An L2 block body from the calldata, deserialized
|
|
95
|
-
*/
|
|
96
|
-
async function getBlockBodiesFromAvailabilityOracleTx(publicClient, txHash) {
|
|
97
|
-
const { input: data } = await publicClient.getTransaction({ hash: txHash });
|
|
98
|
-
// @note Use `forge inspect Rollup methodIdentifiers to get this,
|
|
99
|
-
// If using `forge sig` you will get an INVALID value for the case with a struct.
|
|
100
|
-
// [
|
|
101
|
-
// "propose(bytes,bytes32,bytes32,(bool,uint8,bytes32,bytes32)[],bytes)": "08978fe9",
|
|
102
|
-
// "propose(bytes,bytes32,bytes32,bytes)": "81e6f472",
|
|
103
|
-
// "publish(bytes calldata _body)"
|
|
104
|
-
// ]
|
|
105
|
-
const DATA_INDEX = [4, 3, 0];
|
|
106
|
-
const SUPPORTED_SIGS = ['0x08978fe9', '0x81e6f472', '0x7fd28346'];
|
|
107
|
-
const signature = slice(data, 0, 4);
|
|
108
|
-
if (!SUPPORTED_SIGS.includes(signature)) {
|
|
109
|
-
throw new Error(`Unexpected method called ${signature}`);
|
|
110
|
-
}
|
|
111
|
-
if (signature === SUPPORTED_SIGS[SUPPORTED_SIGS.length - 1]) {
|
|
112
|
-
const { args } = decodeFunctionData({
|
|
113
|
-
abi: AvailabilityOracleAbi,
|
|
114
|
-
data,
|
|
115
|
-
});
|
|
116
|
-
const [bodyHex] = args;
|
|
117
|
-
const blockBody = Body.fromBuffer(Buffer.from(hexToBytes(bodyHex)));
|
|
118
|
-
return blockBody;
|
|
119
|
-
}
|
|
120
|
-
else {
|
|
121
|
-
const { args } = decodeFunctionData({
|
|
122
|
-
abi: RollupAbi,
|
|
123
|
-
data,
|
|
124
|
-
});
|
|
125
|
-
const index = SUPPORTED_SIGS.indexOf(signature);
|
|
126
|
-
const bodyHex = args[DATA_INDEX[index]];
|
|
127
|
-
const blockBody = Body.fromBuffer(Buffer.from(hexToBytes(bodyHex)));
|
|
128
|
-
return blockBody;
|
|
129
|
-
}
|
|
79
|
+
return new L2Block(archive, header, blockBody);
|
|
130
80
|
}
|
|
131
81
|
/**
|
|
132
82
|
* Gets relevant `L2BlockProposed` logs from chain.
|
|
@@ -147,25 +97,6 @@ export function getL2BlockProposedLogs(publicClient, rollupAddress, fromBlock, t
|
|
|
147
97
|
toBlock: toBlock + 1n, // the toBlock argument in getLogs is exclusive
|
|
148
98
|
});
|
|
149
99
|
}
|
|
150
|
-
/**
|
|
151
|
-
* Gets relevant `TxsPublished` logs from chain.
|
|
152
|
-
* @param publicClient - The viem public client to use for transaction retrieval.
|
|
153
|
-
* @param dataAvailabilityOracleAddress - The address of the availability oracle contract.
|
|
154
|
-
* @param fromBlock - First block to get logs from (inclusive).
|
|
155
|
-
* @param toBlock - Last block to get logs from (inclusive).
|
|
156
|
-
* @returns An array of `TxsPublished` logs.
|
|
157
|
-
*/
|
|
158
|
-
export function getTxsPublishedLogs(publicClient, dataAvailabilityOracleAddress, fromBlock, toBlock) {
|
|
159
|
-
return publicClient.getLogs({
|
|
160
|
-
address: getAddress(dataAvailabilityOracleAddress.toString()),
|
|
161
|
-
event: getAbiItem({
|
|
162
|
-
abi: AvailabilityOracleAbi,
|
|
163
|
-
name: 'TxsPublished',
|
|
164
|
-
}),
|
|
165
|
-
fromBlock,
|
|
166
|
-
toBlock: toBlock + 1n, // the toBlock argument in getLogs is exclusive
|
|
167
|
-
});
|
|
168
|
-
}
|
|
169
100
|
/**
|
|
170
101
|
* Get relevant `MessageSent` logs emitted by Inbox on chain.
|
|
171
102
|
* @param publicClient - The viem public client to use for transaction retrieval.
|
|
@@ -221,4 +152,4 @@ export async function getBlockProofFromSubmitProofTx(publicClient, txHash, l2Blo
|
|
|
221
152
|
proof: Proof.fromBuffer(Buffer.from(hexToBytes(proofHex))),
|
|
222
153
|
};
|
|
223
154
|
}
|
|
224
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
155
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXRoX2xvZ19oYW5kbGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcmNoaXZlci9ldGhfbG9nX2hhbmRsZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBc0IsTUFBTSxzQkFBc0IsQ0FBQztBQUNwRixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRTNFLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUM5QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDNUQsT0FBTyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUUxRCxPQUFPLEVBQXlDLGtCQUFrQixFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBSXJIOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsc0JBQXNCLENBQ3BDLElBQW1GO0lBRW5GLE1BQU0sTUFBTSxHQUFnQixFQUFFLENBQUM7SUFDL0IsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUN2QixNQUFNLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDO1FBQ2hELE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxTQUFTLENBQUMsYUFBYSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN4RSxDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsMEJBQTBCLENBQzlDLFlBQTBCLEVBQzFCLHFCQUE2QixFQUM3QixJQUF3RjtJQUV4RixNQUFNLGVBQWUsR0FBMkIsRUFBRSxDQUFDO0lBQ25ELEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7UUFDdkIsTUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDdEMsSUFBSSxRQUFRLEtBQUsscUJBQXFCLEVBQUUsQ0FBQztZQUN2QyxNQUFNLElBQUksS0FBSyxDQUFDLG1DQUFtQyxHQUFHLHFCQUFxQixHQUFHLFlBQVksR0FBRyxRQUFRLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDL0csQ0FBQztRQUNELCtDQUErQztRQUMvQyxNQUFNLEtBQUssR0FBRyxNQUFNLG9CQUFvQixDQUFDLFlBQVksRUFBRSxHQUFHLENBQUMsZUFBZ0IsRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRW5HLE1BQU0sRUFBRSxHQUFvQjtZQUMxQixXQUFXLEVBQUUsR0FBRyxDQUFDLFdBQVc7WUFDNUIsU0FBUyxFQUFFLEdBQUcsQ0FBQyxTQUFTO1lBQ3hCLFNBQVMsRUFBRSxNQUFNLGNBQWMsQ0FBQyxZQUFZLEVBQUUsR0FBRyxDQUFDLFdBQVcsQ0FBQztTQUMvRCxDQUFDO1FBRUYsZUFBZSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUMxQyxxQkFBcUIsRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFRCxPQUFPLGVBQWUsQ0FBQztBQUN6QixDQUFDO0FBRUQsTUFBTSxDQUFDLEtBQUssVUFBVSxjQUFjLENBQUMsWUFBMEIsRUFBRSxXQUFtQjtJQUNsRixNQUFNLEtBQUssR0FBRyxNQUFNLFlBQVksQ0FBQyxRQUFRLENBQUMsRUFBRSxXQUFXLEVBQUUsbUJBQW1CLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUN2RixPQUFPLEtBQUssQ0FBQyxTQUFTLENBQUM7QUFDekIsQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsS0FBSyxVQUFVLG9CQUFvQixDQUNqQyxZQUEwQixFQUMxQixNQUFxQixFQUNyQixVQUFrQjtJQUVsQixNQUFNLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxHQUFHLE1BQU0sWUFBWSxDQUFDLGNBQWMsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQzVFLE1BQU0sRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLEdBQUcsa0JBQWtCLENBQUM7UUFDaEQsR0FBRyxFQUFFLFNBQVM7UUFDZCxJQUFJO0tBQ0wsQ0FBQyxDQUFDO0lBRUgsSUFBSSxDQUFDLENBQUMsWUFBWSxLQUFLLFNBQVMsQ0FBQyxFQUFFLENBQUM7UUFDbEMsTUFBTSxJQUFJLEtBQUssQ0FBQyw0QkFBNEIsWUFBWSxFQUFFLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBQ0QsTUFBTSxDQUFDLFNBQVMsRUFBRSxjQUFjLEVBQUUsQUFBRCxFQUFHLEFBQUQsRUFBRyxBQUFELEVBQUcsT0FBTyxDQUFDLEdBQUcsSUFBOEQsQ0FBQztJQUVsSCxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyRSxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUVwRSxNQUFNLHFCQUFxQixHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBRTVFLElBQUkscUJBQXFCLEtBQUssVUFBVSxFQUFFLENBQUM7UUFDekMsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQ0FBbUMsVUFBVSxZQUFZLHFCQUFxQixFQUFFLENBQUMsQ0FBQztJQUNwRyxDQUFDO0lBRUQsTUFBTSxPQUFPLEdBQUcsc0JBQXNCLENBQUMsVUFBVSxDQUMvQyxNQUFNLENBQUMsTUFBTSxDQUFDO1FBQ1osTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLENBQUMsRUFBRSx1QkFBdUI7UUFDaEUsYUFBYSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFLHlDQUF5QztLQUM3RSxDQUFDLENBQ0gsQ0FBQztJQUVGLE9BQU8sSUFBSSxPQUFPLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQztBQUNqRCxDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxzQkFBc0IsQ0FDcEMsWUFBMEIsRUFDMUIsYUFBeUIsRUFDekIsU0FBaUIsRUFDakIsT0FBZTtJQUVmLE9BQU8sWUFBWSxDQUFDLE9BQU8sQ0FBQztRQUMxQixPQUFPLEVBQUUsVUFBVSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUM3QyxLQUFLLEVBQUUsVUFBVSxDQUFDO1lBQ2hCLEdBQUcsRUFBRSxTQUFTO1lBQ2QsSUFBSSxFQUFFLGlCQUFpQjtTQUN4QixDQUFDO1FBQ0YsU0FBUztRQUNULE9BQU8sRUFBRSxPQUFPLEdBQUcsRUFBRSxFQUFFLCtDQUErQztLQUN2RSxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxrQkFBa0IsQ0FDaEMsWUFBMEIsRUFDMUIsWUFBd0IsRUFDeEIsU0FBaUIsRUFDakIsT0FBZTtJQUVmLE9BQU8sWUFBWSxDQUFDLE9BQU8sQ0FBQztRQUMxQixPQUFPLEVBQUUsVUFBVSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUM1QyxLQUFLLEVBQUUsVUFBVSxDQUFDO1lBQ2hCLEdBQUcsRUFBRSxRQUFRO1lBQ2IsSUFBSSxFQUFFLGFBQWE7U0FDcEIsQ0FBQztRQUNGLFNBQVM7UUFDVCxPQUFPLEVBQUUsT0FBTyxHQUFHLEVBQUUsRUFBRSwrQ0FBK0M7S0FDdkUsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQVVEOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSw4QkFBOEIsQ0FDbEQsWUFBMEIsRUFDMUIsTUFBcUIsRUFDckIsVUFBa0IsRUFDbEIsZ0JBQW9CO0lBRXBCLE1BQU0sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEdBQUcsTUFBTSxZQUFZLENBQUMsY0FBYyxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDNUUsTUFBTSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsR0FBRyxrQkFBa0IsQ0FBQztRQUNoRCxHQUFHLEVBQUUsU0FBUztRQUNkLElBQUk7S0FDTCxDQUFDLENBQUM7SUFFSCxJQUFJLENBQUMsQ0FBQyxZQUFZLEtBQUssc0JBQXNCLENBQUMsRUFBRSxDQUFDO1FBQy9DLE1BQU0sSUFBSSxLQUFLLENBQUMsNEJBQTRCLFlBQVksRUFBRSxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUNELE1BQU0sQ0FBQyxTQUFTLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxvQkFBb0IsRUFBRSxRQUFRLENBQUMsR0FBRyxJQUFLLENBQUM7SUFFbkYsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDckUsTUFBTSxRQUFRLEdBQUcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUU1QyxNQUFNLHFCQUFxQixHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzVFLElBQUkscUJBQXFCLEtBQUssVUFBVSxFQUFFLENBQUM7UUFDekMsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQ0FBbUMsVUFBVSxZQUFZLHFCQUFxQixFQUFFLENBQUMsQ0FBQztJQUNwRyxDQUFDO0lBQ0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDO1FBQ3ZDLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0NBQWdDLGdCQUFnQixZQUFZLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDMUYsQ0FBQztJQUVELE9BQU87UUFDTCxNQUFNO1FBQ04sUUFBUTtRQUNSLGlCQUFpQixFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDaEUsV0FBVyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDO1FBQ3RDLEtBQUssRUFBRSxLQUFLLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7S0FDM0QsQ0FBQztBQUNKLENBQUMifQ==
|
package/dest/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export * from './archiver/index.js';
|
|
2
2
|
export * from './rpc/index.js';
|
|
3
3
|
export * from './factory.js';
|
|
4
|
-
export { retrieveL2ProofVerifiedEvents,
|
|
4
|
+
export { retrieveL2ProofVerifiedEvents, retrieveBlockFromRollup } from './archiver/data_retrieval.js';
|
|
5
5
|
export { getL2BlockProposedLogs } from './archiver/eth_log_handlers.js';
|
|
6
6
|
//# sourceMappingURL=index.d.ts.map
|
package/dest/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAWA,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAE7B,OAAO,EAAE,6BAA6B,EAAE
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAWA,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAE7B,OAAO,EAAE,6BAA6B,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAEtG,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC"}
|
package/dest/index.js
CHANGED
|
@@ -9,7 +9,7 @@ import { MemoryArchiverStore } from './archiver/memory_archiver_store/memory_arc
|
|
|
9
9
|
export * from './archiver/index.js';
|
|
10
10
|
export * from './rpc/index.js';
|
|
11
11
|
export * from './factory.js';
|
|
12
|
-
export { retrieveL2ProofVerifiedEvents,
|
|
12
|
+
export { retrieveL2ProofVerifiedEvents, retrieveBlockFromRollup } from './archiver/data_retrieval.js';
|
|
13
13
|
export { getL2BlockProposedLogs } from './archiver/eth_log_handlers.js';
|
|
14
14
|
const log = createDebugLogger('aztec:archiver');
|
|
15
15
|
/**
|
|
@@ -24,7 +24,7 @@ async function main() {
|
|
|
24
24
|
transport: http(rpcUrl),
|
|
25
25
|
});
|
|
26
26
|
const archiverStore = new MemoryArchiverStore(1000);
|
|
27
|
-
const archiver = new Archiver(publicClient, l1Contracts.rollupAddress, l1Contracts.
|
|
27
|
+
const archiver = new Archiver(publicClient, l1Contracts.rollupAddress, l1Contracts.inboxAddress, l1Contracts.registryAddress, archiverStore, 1000, new ArchiverInstrumentation(new NoopTelemetryClient()));
|
|
28
28
|
const shutdown = async () => {
|
|
29
29
|
await archiver.stop();
|
|
30
30
|
process.exit(0);
|
|
@@ -40,4 +40,4 @@ if (process.argv[1] === fileURLToPath(import.meta.url).replace(/\/index\.js$/, '
|
|
|
40
40
|
process.exit(1);
|
|
41
41
|
});
|
|
42
42
|
}
|
|
43
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
43
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3RELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRW5FLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxJQUFJLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDaEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUV4QyxPQUFPLEVBQUUsUUFBUSxFQUFFLHdCQUF3QixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDekUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDeEUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMkRBQTJELENBQUM7QUFFaEcsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLGdCQUFnQixDQUFDO0FBQy9CLGNBQWMsY0FBYyxDQUFDO0FBRTdCLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRXRHLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRXhFLE1BQU0sR0FBRyxHQUFHLGlCQUFpQixDQUFDLGdCQUFnQixDQUFDLENBQUM7QUFFaEQ7O0dBRUc7QUFDSCx5Q0FBeUM7QUFDekMsS0FBSyxVQUFVLElBQUk7SUFDakIsTUFBTSxNQUFNLEdBQUcsd0JBQXdCLEVBQUUsQ0FBQztJQUMxQyxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsR0FBRyxNQUFNLENBQUM7SUFFakQsTUFBTSxZQUFZLEdBQUcsa0JBQWtCLENBQUM7UUFDdEMsS0FBSyxFQUFFLFNBQVM7UUFDaEIsU0FBUyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUM7S0FDeEIsQ0FBQyxDQUFDO0lBRUgsTUFBTSxhQUFhLEdBQUcsSUFBSSxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUVwRCxNQUFNLFFBQVEsR0FBRyxJQUFJLFFBQVEsQ0FDM0IsWUFBWSxFQUNaLFdBQVcsQ0FBQyxhQUFhLEVBQ3pCLFdBQVcsQ0FBQyxZQUFZLEVBQ3hCLFdBQVcsQ0FBQyxlQUFlLEVBQzNCLGFBQWEsRUFDYixJQUFJLEVBQ0osSUFBSSx1QkFBdUIsQ0FBQyxJQUFJLG1CQUFtQixFQUFFLENBQUMsQ0FDdkQsQ0FBQztJQUVGLE1BQU0sUUFBUSxHQUFHLEtBQUssSUFBSSxFQUFFO1FBQzFCLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3RCLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEIsQ0FBQyxDQUFDO0lBQ0YsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDakMsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFDcEMsQ0FBQztBQUVELGlFQUFpRTtBQUNqRSxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssYUFBYSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQ25GLG1FQUFtRTtJQUNuRSxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUU7UUFDakIsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNmLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEIsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDIn0=
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/archiver",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.55.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": "./dest/index.js",
|
|
@@ -61,15 +61,15 @@
|
|
|
61
61
|
]
|
|
62
62
|
},
|
|
63
63
|
"dependencies": {
|
|
64
|
-
"@aztec/circuit-types": "0.
|
|
65
|
-
"@aztec/circuits.js": "0.
|
|
66
|
-
"@aztec/ethereum": "0.
|
|
67
|
-
"@aztec/foundation": "0.
|
|
68
|
-
"@aztec/kv-store": "0.
|
|
69
|
-
"@aztec/l1-artifacts": "0.
|
|
70
|
-
"@aztec/protocol-contracts": "0.
|
|
71
|
-
"@aztec/telemetry-client": "0.
|
|
72
|
-
"@aztec/types": "0.
|
|
64
|
+
"@aztec/circuit-types": "0.55.0",
|
|
65
|
+
"@aztec/circuits.js": "0.55.0",
|
|
66
|
+
"@aztec/ethereum": "0.55.0",
|
|
67
|
+
"@aztec/foundation": "0.55.0",
|
|
68
|
+
"@aztec/kv-store": "0.55.0",
|
|
69
|
+
"@aztec/l1-artifacts": "0.55.0",
|
|
70
|
+
"@aztec/protocol-contracts": "0.55.0",
|
|
71
|
+
"@aztec/telemetry-client": "0.55.0",
|
|
72
|
+
"@aztec/types": "0.55.0",
|
|
73
73
|
"debug": "^4.3.4",
|
|
74
74
|
"lodash.groupby": "^4.6.0",
|
|
75
75
|
"lodash.omit": "^4.5.0",
|
package/src/archiver/archiver.ts
CHANGED
|
@@ -2,7 +2,7 @@ import {
|
|
|
2
2
|
type FromLogType,
|
|
3
3
|
type GetUnencryptedLogsResponse,
|
|
4
4
|
type L1ToL2MessageSource,
|
|
5
|
-
L2Block,
|
|
5
|
+
type L2Block,
|
|
6
6
|
type L2BlockL2Logs,
|
|
7
7
|
type L2BlockSource,
|
|
8
8
|
type L2LogsSource,
|
|
@@ -46,16 +46,10 @@ import { type Chain, type HttpTransport, type PublicClient, createPublicClient,
|
|
|
46
46
|
|
|
47
47
|
import { type ArchiverDataStore } from './archiver_store.js';
|
|
48
48
|
import { type ArchiverConfig } from './config.js';
|
|
49
|
-
import {
|
|
50
|
-
retrieveBlockBodiesFromAvailabilityOracle,
|
|
51
|
-
retrieveBlockMetadataFromRollup,
|
|
52
|
-
retrieveL1ToL2Messages,
|
|
53
|
-
retrieveL2ProofVerifiedEvents,
|
|
54
|
-
} from './data_retrieval.js';
|
|
49
|
+
import { retrieveBlockFromRollup, retrieveL1ToL2Messages, retrieveL2ProofVerifiedEvents } from './data_retrieval.js';
|
|
55
50
|
import { getL1BlockTime } from './eth_log_handlers.js';
|
|
56
51
|
import { ArchiverInstrumentation } from './instrumentation.js';
|
|
57
52
|
import { type SingletonDataRetrieval } from './structs/data_retrieval.js';
|
|
58
|
-
import { type L1Published } from './structs/published.js';
|
|
59
53
|
|
|
60
54
|
/**
|
|
61
55
|
* Helper interface to combine all sources this archiver implementation provides.
|
|
@@ -86,7 +80,6 @@ export class Archiver implements ArchiveSource {
|
|
|
86
80
|
constructor(
|
|
87
81
|
private readonly publicClient: PublicClient<HttpTransport, Chain>,
|
|
88
82
|
private readonly rollupAddress: EthAddress,
|
|
89
|
-
private readonly availabilityOracleAddress: EthAddress,
|
|
90
83
|
private readonly inboxAddress: EthAddress,
|
|
91
84
|
private readonly registryAddress: EthAddress,
|
|
92
85
|
private readonly store: ArchiverDataStore,
|
|
@@ -119,7 +112,6 @@ export class Archiver implements ArchiveSource {
|
|
|
119
112
|
const archiver = new Archiver(
|
|
120
113
|
publicClient,
|
|
121
114
|
config.l1Contracts.rollupAddress,
|
|
122
|
-
config.l1Contracts.availabilityOracleAddress,
|
|
123
115
|
config.l1Contracts.inboxAddress,
|
|
124
116
|
config.l1Contracts.registryAddress,
|
|
125
117
|
archiverStore,
|
|
@@ -247,72 +239,26 @@ export class Archiver implements ArchiveSource {
|
|
|
247
239
|
// Read all data from chain and then write to our stores at the end
|
|
248
240
|
const nextExpectedL2BlockNum = BigInt((await this.store.getSynchedL2BlockNumber()) + 1);
|
|
249
241
|
|
|
250
|
-
this.log.debug(`Retrieving
|
|
251
|
-
const
|
|
242
|
+
this.log.debug(`Retrieving blocks from ${blocksSynchedTo + 1n} to ${currentL1BlockNumber}`);
|
|
243
|
+
const retrievedBlocks = await retrieveBlockFromRollup(
|
|
252
244
|
this.publicClient,
|
|
253
|
-
this.
|
|
245
|
+
this.rollupAddress,
|
|
254
246
|
blockUntilSynced,
|
|
255
|
-
|
|
247
|
+
blocksSynchedTo + 1n,
|
|
256
248
|
currentL1BlockNumber,
|
|
249
|
+
nextExpectedL2BlockNum,
|
|
257
250
|
);
|
|
258
251
|
|
|
259
|
-
|
|
260
|
-
`Retrieved ${retrievedBlockBodies.retrievedData.length} block bodies up to L1 block ${retrievedBlockBodies.lastProcessedL1BlockNumber}`,
|
|
261
|
-
);
|
|
262
|
-
await this.store.addBlockBodies(retrievedBlockBodies);
|
|
263
|
-
|
|
264
|
-
// Now that we have block bodies we will retrieve block metadata and build L2 blocks from the bodies and the metadata
|
|
265
|
-
let retrievedBlocks: L1Published<L2Block>[];
|
|
266
|
-
let lastProcessedL1BlockNumber: bigint;
|
|
267
|
-
{
|
|
268
|
-
// @todo @LHerskind Investigate how necessary that nextExpectedL2BlockNum really is.
|
|
269
|
-
// Also, I would expect it to break horribly if we have a reorg.
|
|
270
|
-
this.log.debug(`Retrieving block metadata from ${blocksSynchedTo + 1n} to ${currentL1BlockNumber}`);
|
|
271
|
-
const retrievedBlockMetadata = await retrieveBlockMetadataFromRollup(
|
|
272
|
-
this.publicClient,
|
|
273
|
-
this.rollupAddress,
|
|
274
|
-
blockUntilSynced,
|
|
275
|
-
blocksSynchedTo + 1n,
|
|
276
|
-
currentL1BlockNumber,
|
|
277
|
-
nextExpectedL2BlockNum,
|
|
278
|
-
);
|
|
279
|
-
|
|
280
|
-
const retrievedBodyHashes = retrievedBlockMetadata.map(([header]) => header.contentCommitment.txsEffectsHash);
|
|
281
|
-
|
|
282
|
-
// @note @LHerskind We will occasionally be hitting this point BEFORE, we have actually retrieved the bodies.
|
|
283
|
-
// The main reason this have not been an issue earlier is because:
|
|
284
|
-
// i) the design previously published the body in one tx and the header in another,
|
|
285
|
-
// which in an anvil auto mine world mean that they are separate blocks.
|
|
286
|
-
// ii) We have been lucky that latency have been small enough to not matter.
|
|
287
|
-
const blockBodiesFromStore = await this.store.getBlockBodies(retrievedBodyHashes);
|
|
252
|
+
// Add the body
|
|
288
253
|
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
for (let i = 0; i < retrievedBlockMetadata.length; i++) {
|
|
295
|
-
const [header, archive, l1] = retrievedBlockMetadata[i];
|
|
296
|
-
const blockBody = blockBodiesFromStore[i];
|
|
297
|
-
if (blockBody) {
|
|
298
|
-
blocks.push({ data: new L2Block(archive, header, blockBody), l1 });
|
|
299
|
-
} else {
|
|
300
|
-
this.log.warn(`Block body not found for block ${header.globalVariables.blockNumber.toBigInt()}.`);
|
|
301
|
-
}
|
|
302
|
-
}
|
|
303
|
-
|
|
304
|
-
(blocks.length ? this.log.verbose : this.log.debug)(
|
|
305
|
-
`Retrieved ${blocks.length || 'no'} new L2 blocks between L1 blocks ${
|
|
306
|
-
blocksSynchedTo + 1n
|
|
307
|
-
} and ${currentL1BlockNumber}.`,
|
|
308
|
-
);
|
|
254
|
+
(retrievedBlocks.length ? this.log.verbose : this.log.debug)(
|
|
255
|
+
`Retrieved ${retrievedBlocks.length || 'no'} new L2 blocks between L1 blocks ${
|
|
256
|
+
blocksSynchedTo + 1n
|
|
257
|
+
} and ${currentL1BlockNumber}.`,
|
|
258
|
+
);
|
|
309
259
|
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
retrievedBlockMetadata.length > 0
|
|
313
|
-
? retrievedBlockMetadata[retrievedBlockMetadata.length - 1][2].blockNumber
|
|
314
|
-
: blocksSynchedTo;
|
|
315
|
-
}
|
|
260
|
+
const lastProcessedL1BlockNumber =
|
|
261
|
+
retrievedBlocks.length > 0 ? retrievedBlocks[retrievedBlocks.length - 1].l1.blockNumber : blocksSynchedTo;
|
|
316
262
|
|
|
317
263
|
this.log.debug(
|
|
318
264
|
`Processing retrieved blocks ${retrievedBlocks
|
|
@@ -320,29 +266,33 @@ export class Archiver implements ArchiveSource {
|
|
|
320
266
|
.join(',')} with last processed L1 block ${lastProcessedL1BlockNumber}`,
|
|
321
267
|
);
|
|
322
268
|
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
269
|
+
if (retrievedBlocks.length > 0) {
|
|
270
|
+
await Promise.all(
|
|
271
|
+
retrievedBlocks.map(block => {
|
|
272
|
+
const noteEncryptedLogs = block.data.body.noteEncryptedLogs;
|
|
273
|
+
const encryptedLogs = block.data.body.encryptedLogs;
|
|
274
|
+
const unencryptedLogs = block.data.body.unencryptedLogs;
|
|
275
|
+
return this.store.addLogs(noteEncryptedLogs, encryptedLogs, unencryptedLogs, block.data.number);
|
|
276
|
+
}),
|
|
277
|
+
);
|
|
331
278
|
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
279
|
+
// Unroll all logs emitted during the retrieved blocks and extract any contract classes and instances from them
|
|
280
|
+
await Promise.all(
|
|
281
|
+
retrievedBlocks.map(async block => {
|
|
282
|
+
const blockLogs = block.data.body.txEffects
|
|
283
|
+
.flatMap(txEffect => (txEffect ? [txEffect.unencryptedLogs] : []))
|
|
284
|
+
.flatMap(txLog => txLog.unrollLogs());
|
|
285
|
+
await this.storeRegisteredContractClasses(blockLogs, block.data.number);
|
|
286
|
+
await this.storeDeployedContractInstances(blockLogs, block.data.number);
|
|
287
|
+
await this.storeBroadcastedIndividualFunctions(blockLogs, block.data.number);
|
|
288
|
+
}),
|
|
289
|
+
);
|
|
343
290
|
|
|
344
|
-
if (retrievedBlocks.length > 0) {
|
|
345
291
|
const timer = new Timer();
|
|
292
|
+
await this.store.addBlockBodies({
|
|
293
|
+
lastProcessedL1BlockNumber: lastProcessedL1BlockNumber,
|
|
294
|
+
retrievedData: retrievedBlocks.map(b => b.data.body),
|
|
295
|
+
});
|
|
346
296
|
await this.store.addBlocks(retrievedBlocks);
|
|
347
297
|
this.instrumentation.processNewBlocks(
|
|
348
298
|
timer.ms() / retrievedBlocks.length,
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { type
|
|
2
|
-
import {
|
|
1
|
+
import { type InboxLeaf, type L2Block } from '@aztec/circuit-types';
|
|
2
|
+
import { Fr, type Proof } from '@aztec/circuits.js';
|
|
3
3
|
import { type EthAddress } from '@aztec/foundation/eth-address';
|
|
4
4
|
import { type DebugLogger, createDebugLogger } from '@aztec/foundation/log';
|
|
5
5
|
import { RollupAbi } from '@aztec/l1-artifacts';
|
|
@@ -10,25 +10,23 @@ import {
|
|
|
10
10
|
getBlockProofFromSubmitProofTx,
|
|
11
11
|
getL2BlockProposedLogs,
|
|
12
12
|
getMessageSentLogs,
|
|
13
|
-
getTxsPublishedLogs,
|
|
14
13
|
processL2BlockProposedLogs,
|
|
15
14
|
processMessageSentLogs,
|
|
16
|
-
processTxsPublishedLogs,
|
|
17
15
|
} from './eth_log_handlers.js';
|
|
18
16
|
import { type DataRetrieval } from './structs/data_retrieval.js';
|
|
19
|
-
import { type
|
|
17
|
+
import { type L1Published } from './structs/published.js';
|
|
20
18
|
|
|
21
19
|
/**
|
|
22
|
-
* Fetches new L2
|
|
20
|
+
* Fetches new L2 blocks.
|
|
23
21
|
* @param publicClient - The viem public client to use for transaction retrieval.
|
|
24
22
|
* @param rollupAddress - The address of the rollup contract.
|
|
25
23
|
* @param blockUntilSynced - If true, blocks until the archiver has fully synced.
|
|
26
24
|
* @param searchStartBlock - The block number to use for starting the search.
|
|
27
25
|
* @param searchEndBlock - The highest block number that we should search up to.
|
|
28
26
|
* @param expectedNextL2BlockNum - The next L2 block number that we expect to find.
|
|
29
|
-
* @returns An array of
|
|
27
|
+
* @returns An array of block; as well as the next eth block to search from.
|
|
30
28
|
*/
|
|
31
|
-
export async function
|
|
29
|
+
export async function retrieveBlockFromRollup(
|
|
32
30
|
publicClient: PublicClient,
|
|
33
31
|
rollupAddress: EthAddress,
|
|
34
32
|
blockUntilSynced: boolean,
|
|
@@ -36,8 +34,8 @@ export async function retrieveBlockMetadataFromRollup(
|
|
|
36
34
|
searchEndBlock: bigint,
|
|
37
35
|
expectedNextL2BlockNum: bigint,
|
|
38
36
|
logger: DebugLogger = createDebugLogger('aztec:archiver'),
|
|
39
|
-
): Promise<[
|
|
40
|
-
const
|
|
37
|
+
): Promise<L1Published<L2Block>[]> {
|
|
38
|
+
const retrievedBlocks: L1Published<L2Block>[] = [];
|
|
41
39
|
do {
|
|
42
40
|
if (searchStartBlock > searchEndBlock) {
|
|
43
41
|
break;
|
|
@@ -57,56 +55,12 @@ export async function retrieveBlockMetadataFromRollup(
|
|
|
57
55
|
`Got L2 block processed logs for ${L2BlockProposedLogs[0].blockNumber}-${lastLog.blockNumber} between ${searchStartBlock}-${searchEndBlock} L1 blocks`,
|
|
58
56
|
);
|
|
59
57
|
|
|
60
|
-
const
|
|
61
|
-
|
|
62
|
-
expectedNextL2BlockNum,
|
|
63
|
-
L2BlockProposedLogs,
|
|
64
|
-
);
|
|
65
|
-
retrievedBlockMetadata.push(...newBlockMetadata);
|
|
58
|
+
const newBlocks = await processL2BlockProposedLogs(publicClient, expectedNextL2BlockNum, L2BlockProposedLogs);
|
|
59
|
+
retrievedBlocks.push(...newBlocks);
|
|
66
60
|
searchStartBlock = lastLog.blockNumber! + 1n;
|
|
67
|
-
expectedNextL2BlockNum += BigInt(
|
|
68
|
-
} while (blockUntilSynced && searchStartBlock <= searchEndBlock);
|
|
69
|
-
return retrievedBlockMetadata;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
/**
|
|
73
|
-
* Fetches new L2 block bodies and their hashes.
|
|
74
|
-
* @param publicClient - The viem public client to use for transaction retrieval.
|
|
75
|
-
* @param availabilityOracleAddress - The address of the availability oracle contract.
|
|
76
|
-
* @param blockUntilSynced - If true, blocks until the archiver has fully synced.
|
|
77
|
-
* @param searchStartBlock - The block number to use for starting the search.
|
|
78
|
-
* @param searchEndBlock - The highest block number that we should search up to.
|
|
79
|
-
* @returns A array of L2 block bodies as well as the next eth block to search from
|
|
80
|
-
*/
|
|
81
|
-
export async function retrieveBlockBodiesFromAvailabilityOracle(
|
|
82
|
-
publicClient: PublicClient,
|
|
83
|
-
availabilityOracleAddress: EthAddress,
|
|
84
|
-
blockUntilSynced: boolean,
|
|
85
|
-
searchStartBlock: bigint,
|
|
86
|
-
searchEndBlock: bigint,
|
|
87
|
-
): Promise<DataRetrieval<Body>> {
|
|
88
|
-
const retrievedBlockBodies: Body[] = [];
|
|
89
|
-
|
|
90
|
-
do {
|
|
91
|
-
if (searchStartBlock > searchEndBlock) {
|
|
92
|
-
break;
|
|
93
|
-
}
|
|
94
|
-
const l2TxsPublishedLogs = await getTxsPublishedLogs(
|
|
95
|
-
publicClient,
|
|
96
|
-
availabilityOracleAddress,
|
|
97
|
-
searchStartBlock,
|
|
98
|
-
searchEndBlock,
|
|
99
|
-
);
|
|
100
|
-
if (l2TxsPublishedLogs.length === 0) {
|
|
101
|
-
break;
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
const newBlockBodies = await processTxsPublishedLogs(publicClient, l2TxsPublishedLogs);
|
|
105
|
-
retrievedBlockBodies.push(...newBlockBodies.map(([body]) => body));
|
|
106
|
-
searchStartBlock = l2TxsPublishedLogs[l2TxsPublishedLogs.length - 1].blockNumber + 1n;
|
|
61
|
+
expectedNextL2BlockNum += BigInt(newBlocks.length);
|
|
107
62
|
} while (blockUntilSynced && searchStartBlock <= searchEndBlock);
|
|
108
|
-
|
|
109
|
-
return { lastProcessedL1BlockNumber: searchStartBlock - 1n, retrievedData: retrievedBlockBodies };
|
|
63
|
+
return retrievedBlocks;
|
|
110
64
|
}
|
|
111
65
|
|
|
112
66
|
/**
|