@aztec/archiver 0.54.0 → 0.55.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dest/archiver/archiver.d.ts +2 -3
- package/dest/archiver/archiver.d.ts.map +1 -1
- package/dest/archiver/archiver.js +36 -62
- package/dest/archiver/config.d.ts +0 -4
- package/dest/archiver/config.d.ts.map +1 -1
- package/dest/archiver/config.js +1 -6
- 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 +50 -91
- package/src/archiver/config.ts +0 -10
- 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXRoX2xvZ19oYW5kbGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcmNoaXZlci9ldGhfbG9nX2hhbmRsZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBc0IsTUFBTSxzQkFBc0IsQ0FBQztBQUNwRixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRTNFLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUM5QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDNUQsT0FBTyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUUxRCxPQUFPLEVBQXlDLGtCQUFrQixFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBSXJIOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsc0JBQXNCLENBQ3BDLElBQW1GO0lBRW5GLE1BQU0sTUFBTSxHQUFnQixFQUFFLENBQUM7SUFDL0IsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUN2QixNQUFNLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDO1FBQ2hELE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxTQUFTLENBQUMsYUFBYSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN4RSxDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsMEJBQTBCLENBQzlDLFlBQTBCLEVBQzFCLHFCQUE2QixFQUM3QixJQUF3RjtJ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
|
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.1",
|
|
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.1",
|
|
65
|
+
"@aztec/circuits.js": "0.55.1",
|
|
66
|
+
"@aztec/ethereum": "0.55.1",
|
|
67
|
+
"@aztec/foundation": "0.55.1",
|
|
68
|
+
"@aztec/kv-store": "0.55.1",
|
|
69
|
+
"@aztec/l1-artifacts": "0.55.1",
|
|
70
|
+
"@aztec/protocol-contracts": "0.55.1",
|
|
71
|
+
"@aztec/telemetry-client": "0.55.1",
|
|
72
|
+
"@aztec/types": "0.55.1",
|
|
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,
|
|
@@ -30,6 +30,7 @@ import { Fr } from '@aztec/foundation/fields';
|
|
|
30
30
|
import { type DebugLogger, createDebugLogger } from '@aztec/foundation/log';
|
|
31
31
|
import { RunningPromise } from '@aztec/foundation/running-promise';
|
|
32
32
|
import { Timer } from '@aztec/foundation/timer';
|
|
33
|
+
import { RollupAbi } from '@aztec/l1-artifacts';
|
|
33
34
|
import { ClassRegistererAddress } from '@aztec/protocol-contracts/class-registerer';
|
|
34
35
|
import { type TelemetryClient } from '@aztec/telemetry-client';
|
|
35
36
|
import {
|
|
@@ -42,20 +43,14 @@ import {
|
|
|
42
43
|
} from '@aztec/types/contracts';
|
|
43
44
|
|
|
44
45
|
import groupBy from 'lodash.groupby';
|
|
45
|
-
import { type Chain, type HttpTransport, type PublicClient, createPublicClient, http } from 'viem';
|
|
46
|
+
import { type Chain, type HttpTransport, type PublicClient, createPublicClient, getContract, http } from 'viem';
|
|
46
47
|
|
|
47
48
|
import { type ArchiverDataStore } from './archiver_store.js';
|
|
48
49
|
import { type ArchiverConfig } from './config.js';
|
|
49
|
-
import {
|
|
50
|
-
retrieveBlockBodiesFromAvailabilityOracle,
|
|
51
|
-
retrieveBlockMetadataFromRollup,
|
|
52
|
-
retrieveL1ToL2Messages,
|
|
53
|
-
retrieveL2ProofVerifiedEvents,
|
|
54
|
-
} from './data_retrieval.js';
|
|
50
|
+
import { retrieveBlockFromRollup, retrieveL1ToL2Messages, retrieveL2ProofVerifiedEvents } from './data_retrieval.js';
|
|
55
51
|
import { getL1BlockTime } from './eth_log_handlers.js';
|
|
56
52
|
import { ArchiverInstrumentation } from './instrumentation.js';
|
|
57
53
|
import { type SingletonDataRetrieval } from './structs/data_retrieval.js';
|
|
58
|
-
import { type L1Published } from './structs/published.js';
|
|
59
54
|
|
|
60
55
|
/**
|
|
61
56
|
* Helper interface to combine all sources this archiver implementation provides.
|
|
@@ -86,7 +81,6 @@ export class Archiver implements ArchiveSource {
|
|
|
86
81
|
constructor(
|
|
87
82
|
private readonly publicClient: PublicClient<HttpTransport, Chain>,
|
|
88
83
|
private readonly rollupAddress: EthAddress,
|
|
89
|
-
private readonly availabilityOracleAddress: EthAddress,
|
|
90
84
|
private readonly inboxAddress: EthAddress,
|
|
91
85
|
private readonly registryAddress: EthAddress,
|
|
92
86
|
private readonly store: ArchiverDataStore,
|
|
@@ -116,16 +110,23 @@ export class Archiver implements ArchiveSource {
|
|
|
116
110
|
pollingInterval: config.viemPollingIntervalMS,
|
|
117
111
|
});
|
|
118
112
|
|
|
113
|
+
const rollup = getContract({
|
|
114
|
+
address: config.l1Contracts.rollupAddress.toString(),
|
|
115
|
+
abi: RollupAbi,
|
|
116
|
+
client: publicClient,
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
const l1StartBlock = await rollup.read.L1_BLOCK_AT_GENESIS();
|
|
120
|
+
|
|
119
121
|
const archiver = new Archiver(
|
|
120
122
|
publicClient,
|
|
121
123
|
config.l1Contracts.rollupAddress,
|
|
122
|
-
config.l1Contracts.availabilityOracleAddress,
|
|
123
124
|
config.l1Contracts.inboxAddress,
|
|
124
125
|
config.l1Contracts.registryAddress,
|
|
125
126
|
archiverStore,
|
|
126
127
|
config.archiverPollingIntervalMS,
|
|
127
128
|
new ArchiverInstrumentation(telemetry),
|
|
128
|
-
BigInt(
|
|
129
|
+
BigInt(l1StartBlock),
|
|
129
130
|
);
|
|
130
131
|
await archiver.start(blockUntilSynced);
|
|
131
132
|
return archiver;
|
|
@@ -247,72 +248,26 @@ export class Archiver implements ArchiveSource {
|
|
|
247
248
|
// Read all data from chain and then write to our stores at the end
|
|
248
249
|
const nextExpectedL2BlockNum = BigInt((await this.store.getSynchedL2BlockNumber()) + 1);
|
|
249
250
|
|
|
250
|
-
this.log.debug(`Retrieving
|
|
251
|
-
const
|
|
251
|
+
this.log.debug(`Retrieving blocks from ${blocksSynchedTo + 1n} to ${currentL1BlockNumber}`);
|
|
252
|
+
const retrievedBlocks = await retrieveBlockFromRollup(
|
|
252
253
|
this.publicClient,
|
|
253
|
-
this.
|
|
254
|
+
this.rollupAddress,
|
|
254
255
|
blockUntilSynced,
|
|
255
|
-
|
|
256
|
+
blocksSynchedTo + 1n,
|
|
256
257
|
currentL1BlockNumber,
|
|
258
|
+
nextExpectedL2BlockNum,
|
|
257
259
|
);
|
|
258
260
|
|
|
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
|
-
);
|
|
261
|
+
// Add the body
|
|
279
262
|
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
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);
|
|
288
|
-
|
|
289
|
-
if (retrievedBlockMetadata.length !== blockBodiesFromStore.length) {
|
|
290
|
-
this.log.warn('Block headers length does not equal block bodies length');
|
|
291
|
-
}
|
|
292
|
-
|
|
293
|
-
const blocks: L1Published<L2Block>[] = [];
|
|
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
|
-
);
|
|
263
|
+
(retrievedBlocks.length ? this.log.verbose : this.log.debug)(
|
|
264
|
+
`Retrieved ${retrievedBlocks.length || 'no'} new L2 blocks between L1 blocks ${
|
|
265
|
+
blocksSynchedTo + 1n
|
|
266
|
+
} and ${currentL1BlockNumber}.`,
|
|
267
|
+
);
|
|
309
268
|
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
retrievedBlockMetadata.length > 0
|
|
313
|
-
? retrievedBlockMetadata[retrievedBlockMetadata.length - 1][2].blockNumber
|
|
314
|
-
: blocksSynchedTo;
|
|
315
|
-
}
|
|
269
|
+
const lastProcessedL1BlockNumber =
|
|
270
|
+
retrievedBlocks.length > 0 ? retrievedBlocks[retrievedBlocks.length - 1].l1.blockNumber : blocksSynchedTo;
|
|
316
271
|
|
|
317
272
|
this.log.debug(
|
|
318
273
|
`Processing retrieved blocks ${retrievedBlocks
|
|
@@ -320,29 +275,33 @@ export class Archiver implements ArchiveSource {
|
|
|
320
275
|
.join(',')} with last processed L1 block ${lastProcessedL1BlockNumber}`,
|
|
321
276
|
);
|
|
322
277
|
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
278
|
+
if (retrievedBlocks.length > 0) {
|
|
279
|
+
await Promise.all(
|
|
280
|
+
retrievedBlocks.map(block => {
|
|
281
|
+
const noteEncryptedLogs = block.data.body.noteEncryptedLogs;
|
|
282
|
+
const encryptedLogs = block.data.body.encryptedLogs;
|
|
283
|
+
const unencryptedLogs = block.data.body.unencryptedLogs;
|
|
284
|
+
return this.store.addLogs(noteEncryptedLogs, encryptedLogs, unencryptedLogs, block.data.number);
|
|
285
|
+
}),
|
|
286
|
+
);
|
|
331
287
|
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
288
|
+
// Unroll all logs emitted during the retrieved blocks and extract any contract classes and instances from them
|
|
289
|
+
await Promise.all(
|
|
290
|
+
retrievedBlocks.map(async block => {
|
|
291
|
+
const blockLogs = block.data.body.txEffects
|
|
292
|
+
.flatMap(txEffect => (txEffect ? [txEffect.unencryptedLogs] : []))
|
|
293
|
+
.flatMap(txLog => txLog.unrollLogs());
|
|
294
|
+
await this.storeRegisteredContractClasses(blockLogs, block.data.number);
|
|
295
|
+
await this.storeDeployedContractInstances(blockLogs, block.data.number);
|
|
296
|
+
await this.storeBroadcastedIndividualFunctions(blockLogs, block.data.number);
|
|
297
|
+
}),
|
|
298
|
+
);
|
|
343
299
|
|
|
344
|
-
if (retrievedBlocks.length > 0) {
|
|
345
300
|
const timer = new Timer();
|
|
301
|
+
await this.store.addBlockBodies({
|
|
302
|
+
lastProcessedL1BlockNumber: lastProcessedL1BlockNumber,
|
|
303
|
+
retrievedData: retrievedBlocks.map(b => b.data.body),
|
|
304
|
+
});
|
|
346
305
|
await this.store.addBlocks(retrievedBlocks);
|
|
347
306
|
this.instrumentation.processNewBlocks(
|
|
348
307
|
timer.ms() / retrievedBlocks.length,
|
package/src/archiver/config.ts
CHANGED
|
@@ -22,11 +22,6 @@ export type ArchiverConfig = {
|
|
|
22
22
|
*/
|
|
23
23
|
archiverPollingIntervalMS?: number;
|
|
24
24
|
|
|
25
|
-
/**
|
|
26
|
-
* The L1 block to start reading from
|
|
27
|
-
*/
|
|
28
|
-
archiverL1StartBlock: number;
|
|
29
|
-
|
|
30
25
|
/**
|
|
31
26
|
* The polling interval viem uses in ms
|
|
32
27
|
*/
|
|
@@ -57,11 +52,6 @@ export const archiverConfigMappings: ConfigMappingsType<ArchiverConfig> = {
|
|
|
57
52
|
description: 'The polling interval in ms for retrieving new L2 blocks and encrypted logs.',
|
|
58
53
|
...numberConfigHelper(1000),
|
|
59
54
|
},
|
|
60
|
-
archiverL1StartBlock: {
|
|
61
|
-
env: 'ARCHIVER_L1_START_BLOCK',
|
|
62
|
-
description: 'The L1 block the archiver should start reading logs from',
|
|
63
|
-
...numberConfigHelper(0),
|
|
64
|
-
},
|
|
65
55
|
viemPollingIntervalMS: {
|
|
66
56
|
env: 'ARCHIVER_VIEM_POLLING_INTERVAL_MS',
|
|
67
57
|
description: 'The polling interval viem uses in ms',
|
|
@@ -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
|
/**
|