@aztec/archiver 0.74.0 → 0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2
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.js +729 -711
- package/dest/archiver/archiver_store.js +4 -2
- package/dest/archiver/archiver_store_test_suite.js +385 -224
- package/dest/archiver/config.js +9 -11
- package/dest/archiver/data_retrieval.js +78 -68
- package/dest/archiver/errors.js +1 -2
- package/dest/archiver/index.js +0 -1
- package/dest/archiver/instrumentation.js +29 -17
- package/dest/archiver/kv_archiver_store/block_store.js +118 -127
- package/dest/archiver/kv_archiver_store/contract_class_store.js +43 -37
- package/dest/archiver/kv_archiver_store/contract_instance_store.js +7 -12
- package/dest/archiver/kv_archiver_store/kv_archiver_store.js +135 -158
- package/dest/archiver/kv_archiver_store/log_store.js +271 -256
- package/dest/archiver/kv_archiver_store/message_store.js +42 -48
- package/dest/archiver/kv_archiver_store/nullifier_store.js +35 -42
- package/dest/archiver/memory_archiver_store/l1_to_l2_message_store.js +15 -24
- package/dest/archiver/memory_archiver_store/memory_archiver_store.js +227 -231
- package/dest/archiver/structs/data_retrieval.js +5 -2
- package/dest/archiver/structs/published.js +1 -2
- package/dest/factory.js +30 -20
- package/dest/index.js +0 -1
- package/dest/rpc/index.js +5 -2
- package/dest/test/index.js +0 -1
- package/dest/test/mock_archiver.js +8 -13
- package/dest/test/mock_l1_to_l2_message_source.js +4 -4
- package/dest/test/mock_l2_block_source.js +68 -67
- package/package.json +14 -13
- package/src/archiver/data_retrieval.ts +1 -1
- package/src/archiver/index.ts +1 -1
- package/dest/archiver/archiver.d.ts +0 -186
- package/dest/archiver/archiver.d.ts.map +0 -1
- package/dest/archiver/archiver_store.d.ts +0 -217
- package/dest/archiver/archiver_store.d.ts.map +0 -1
- package/dest/archiver/archiver_store_test_suite.d.ts +0 -8
- package/dest/archiver/archiver_store_test_suite.d.ts.map +0 -1
- package/dest/archiver/config.d.ts +0 -35
- package/dest/archiver/config.d.ts.map +0 -1
- package/dest/archiver/data_retrieval.d.ts +0 -71
- package/dest/archiver/data_retrieval.d.ts.map +0 -1
- package/dest/archiver/errors.d.ts +0 -4
- package/dest/archiver/errors.d.ts.map +0 -1
- package/dest/archiver/index.d.ts +0 -8
- package/dest/archiver/index.d.ts.map +0 -1
- package/dest/archiver/instrumentation.d.ts +0 -27
- package/dest/archiver/instrumentation.d.ts.map +0 -1
- package/dest/archiver/kv_archiver_store/block_store.d.ts +0 -87
- package/dest/archiver/kv_archiver_store/block_store.d.ts.map +0 -1
- package/dest/archiver/kv_archiver_store/contract_class_store.d.ts +0 -17
- package/dest/archiver/kv_archiver_store/contract_class_store.d.ts.map +0 -1
- package/dest/archiver/kv_archiver_store/contract_instance_store.d.ts +0 -13
- package/dest/archiver/kv_archiver_store/contract_instance_store.d.ts.map +0 -1
- package/dest/archiver/kv_archiver_store/kv_archiver_store.d.ts +0 -147
- package/dest/archiver/kv_archiver_store/kv_archiver_store.d.ts.map +0 -1
- package/dest/archiver/kv_archiver_store/log_store.d.ts +0 -47
- package/dest/archiver/kv_archiver_store/log_store.d.ts.map +0 -1
- package/dest/archiver/kv_archiver_store/message_store.d.ts +0 -33
- package/dest/archiver/kv_archiver_store/message_store.d.ts.map +0 -1
- package/dest/archiver/kv_archiver_store/nullifier_store.d.ts +0 -12
- package/dest/archiver/kv_archiver_store/nullifier_store.d.ts.map +0 -1
- package/dest/archiver/memory_archiver_store/l1_to_l2_message_store.d.ts +0 -23
- package/dest/archiver/memory_archiver_store/l1_to_l2_message_store.d.ts.map +0 -1
- package/dest/archiver/memory_archiver_store/memory_archiver_store.d.ts +0 -168
- package/dest/archiver/memory_archiver_store/memory_archiver_store.d.ts.map +0 -1
- package/dest/archiver/structs/data_retrieval.d.ts +0 -27
- package/dest/archiver/structs/data_retrieval.d.ts.map +0 -1
- package/dest/archiver/structs/published.d.ts +0 -11
- package/dest/archiver/structs/published.d.ts.map +0 -1
- package/dest/factory.d.ts +0 -10
- package/dest/factory.d.ts.map +0 -1
- package/dest/index.d.ts +0 -5
- package/dest/index.d.ts.map +0 -1
- package/dest/rpc/index.d.ts +0 -4
- package/dest/rpc/index.d.ts.map +0 -1
- package/dest/test/index.d.ts +0 -4
- package/dest/test/index.d.ts.map +0 -1
- package/dest/test/mock_archiver.d.ts +0 -22
- package/dest/test/mock_archiver.d.ts.map +0 -1
- package/dest/test/mock_l1_to_l2_message_source.d.ts +0 -16
- package/dest/test/mock_l1_to_l2_message_source.d.ts.map +0 -1
- package/dest/test/mock_l2_block_source.d.ts +0 -80
- package/dest/test/mock_l2_block_source.d.ts.map +0 -1
package/dest/archiver/config.js
CHANGED
|
@@ -1,44 +1,42 @@
|
|
|
1
|
-
import { l1ContractsConfigMappings, l1ReaderConfigMappings
|
|
1
|
+
import { l1ContractsConfigMappings, l1ReaderConfigMappings } from '@aztec/ethereum';
|
|
2
2
|
import { getConfigFromMappings, numberConfigHelper } from '@aztec/foundation/config';
|
|
3
3
|
export const archiverConfigMappings = {
|
|
4
4
|
archiverUrl: {
|
|
5
5
|
env: 'ARCHIVER_URL',
|
|
6
|
-
description: 'URL for an archiver service. If set, will return an archiver client as opposed to starting a new one.'
|
|
6
|
+
description: 'URL for an archiver service. If set, will return an archiver client as opposed to starting a new one.'
|
|
7
7
|
},
|
|
8
8
|
l1ConsensusHostUrl: {
|
|
9
9
|
env: 'L1_CONSENSUS_HOST_URL',
|
|
10
10
|
description: 'URL for an L1 consensus client.',
|
|
11
|
-
parseEnv: (val)
|
|
11
|
+
parseEnv: (val)=>val
|
|
12
12
|
},
|
|
13
13
|
archiverPollingIntervalMS: {
|
|
14
14
|
env: 'ARCHIVER_POLLING_INTERVAL_MS',
|
|
15
15
|
description: 'The polling interval in ms for retrieving new L2 blocks and encrypted logs.',
|
|
16
|
-
...numberConfigHelper(500)
|
|
16
|
+
...numberConfigHelper(500)
|
|
17
17
|
},
|
|
18
18
|
archiverBatchSize: {
|
|
19
19
|
env: 'ARCHIVER_BATCH_SIZE',
|
|
20
20
|
description: 'The number of L2 blocks the archiver will attempt to download at a time.',
|
|
21
|
-
...numberConfigHelper(100)
|
|
21
|
+
...numberConfigHelper(100)
|
|
22
22
|
},
|
|
23
23
|
maxLogs: {
|
|
24
24
|
env: 'ARCHIVER_MAX_LOGS',
|
|
25
25
|
description: 'The max number of logs that can be obtained in 1 "getPublicLogs" call.',
|
|
26
|
-
...numberConfigHelper(
|
|
26
|
+
...numberConfigHelper(1_000)
|
|
27
27
|
},
|
|
28
28
|
...l1ReaderConfigMappings,
|
|
29
29
|
viemPollingIntervalMS: {
|
|
30
30
|
env: 'ARCHIVER_VIEM_POLLING_INTERVAL_MS',
|
|
31
31
|
description: 'The polling interval viem uses in ms',
|
|
32
|
-
...numberConfigHelper(1000)
|
|
32
|
+
...numberConfigHelper(1000)
|
|
33
33
|
},
|
|
34
|
-
...l1ContractsConfigMappings
|
|
34
|
+
...l1ContractsConfigMappings
|
|
35
35
|
};
|
|
36
36
|
/**
|
|
37
37
|
* Returns the archiver configuration from the environment variables.
|
|
38
38
|
* Note: If an environment variable is not set, the default value is used.
|
|
39
39
|
* @returns The archiver configuration.
|
|
40
|
-
*/
|
|
41
|
-
export function getArchiverConfigFromEnv() {
|
|
40
|
+
*/ export function getArchiverConfigFromEnv() {
|
|
42
41
|
return getConfigFromMappings(archiverConfigMappings);
|
|
43
42
|
}
|
|
44
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FyY2hpdmVyL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBSUwseUJBQXlCLEVBQ3pCLHNCQUFzQixHQUN2QixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFBMkIscUJBQXFCLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQW9DOUcsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQXVDO0lBQ3hFLFdBQVcsRUFBRTtRQUNYLEdBQUcsRUFBRSxjQUFjO1FBQ25CLFdBQVcsRUFDVCx1R0FBdUc7S0FDMUc7SUFDRCxrQkFBa0IsRUFBRTtRQUNsQixHQUFHLEVBQUUsdUJBQXVCO1FBQzVCLFdBQVcsRUFBRSxpQ0FBaUM7UUFDOUMsUUFBUSxFQUFFLENBQUMsR0FBVyxFQUFFLEVBQUUsQ0FBQyxHQUFHO0tBQy9CO0lBQ0QseUJBQXlCLEVBQUU7UUFDekIsR0FBRyxFQUFFLDhCQUE4QjtRQUNuQyxXQUFXLEVBQUUsNkVBQTZFO1FBQzFGLEdBQUcsa0JBQWtCLENBQUMsR0FBRyxDQUFDO0tBQzNCO0lBQ0QsaUJBQWlCLEVBQUU7UUFDakIsR0FBRyxFQUFFLHFCQUFxQjtRQUMxQixXQUFXLEVBQUUsMEVBQTBFO1FBQ3ZGLEdBQUcsa0JBQWtCLENBQUMsR0FBRyxDQUFDO0tBQzNCO0lBQ0QsT0FBTyxFQUFFO1FBQ1AsR0FBRyxFQUFFLG1CQUFtQjtRQUN4QixXQUFXLEVBQUUsd0VBQXdFO1FBQ3JGLEdBQUcsa0JBQWtCLENBQUMsSUFBSyxDQUFDO0tBQzdCO0lBQ0QsR0FBRyxzQkFBc0I7SUFDekIscUJBQXFCLEVBQUU7UUFDckIsR0FBRyxFQUFFLG1DQUFtQztRQUN4QyxXQUFXLEVBQUUsc0NBQXNDO1FBQ25ELEdBQUcsa0JBQWtCLENBQUMsSUFBSSxDQUFDO0tBQzVCO0lBQ0QsR0FBRyx5QkFBeUI7Q0FDN0IsQ0FBQztBQUVGOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsd0JBQXdCO0lBQ3RDLE9BQU8scUJBQXFCLENBQWlCLHNCQUFzQixDQUFDLENBQUM7QUFDdkUsQ0FBQyJ9
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
+
import { Blob, BlobDeserializationError } from '@aztec/blob-lib';
|
|
1
2
|
import { Body, InboxLeaf, L2Block } from '@aztec/circuit-types';
|
|
2
3
|
import { AppendOnlyTreeSnapshot, BlockHeader, Fr, Proof } from '@aztec/circuits.js';
|
|
3
4
|
import { asyncPool } from '@aztec/foundation/async-pool';
|
|
4
|
-
import { Blob, BlobDeserializationError } from '@aztec/foundation/blob';
|
|
5
5
|
import { createLogger } from '@aztec/foundation/log';
|
|
6
6
|
import { numToUInt32BE } from '@aztec/foundation/serialize';
|
|
7
7
|
import { ForwarderAbi, RollupAbi } from '@aztec/l1-artifacts';
|
|
8
|
-
import { decodeFunctionData, getAbiItem, hexToBytes
|
|
8
|
+
import { decodeFunctionData, getAbiItem, hexToBytes } from 'viem';
|
|
9
9
|
import { NoBlobBodiesFoundError } from './errors.js';
|
|
10
10
|
/**
|
|
11
11
|
* Fetches new L2 blocks.
|
|
@@ -15,8 +15,7 @@ import { NoBlobBodiesFoundError } from './errors.js';
|
|
|
15
15
|
* @param searchEndBlock - The highest block number that we should search up to.
|
|
16
16
|
* @param expectedNextL2BlockNum - The next L2 block number that we expect to find.
|
|
17
17
|
* @returns An array of block; as well as the next eth block to search from.
|
|
18
|
-
*/
|
|
19
|
-
export async function retrieveBlocksFromRollup(rollup, publicClient, blobSinkClient, searchStartBlock, searchEndBlock, logger = createLogger('archiver')) {
|
|
18
|
+
*/ export async function retrieveBlocksFromRollup(rollup, publicClient, blobSinkClient, searchStartBlock, searchEndBlock, logger = createLogger('archiver')) {
|
|
20
19
|
const retrievedBlocks = [];
|
|
21
20
|
do {
|
|
22
21
|
if (searchStartBlock > searchEndBlock) {
|
|
@@ -24,8 +23,8 @@ export async function retrieveBlocksFromRollup(rollup, publicClient, blobSinkCli
|
|
|
24
23
|
}
|
|
25
24
|
const l2BlockProposedLogs = (await rollup.getEvents.L2BlockProposed({}, {
|
|
26
25
|
fromBlock: searchStartBlock,
|
|
27
|
-
toBlock: searchEndBlock
|
|
28
|
-
})).filter(log
|
|
26
|
+
toBlock: searchEndBlock
|
|
27
|
+
})).filter((log)=>log.blockNumber >= searchStartBlock && log.blockNumber <= searchEndBlock);
|
|
29
28
|
if (l2BlockProposedLogs.length === 0) {
|
|
30
29
|
break;
|
|
31
30
|
}
|
|
@@ -34,7 +33,7 @@ export async function retrieveBlocksFromRollup(rollup, publicClient, blobSinkCli
|
|
|
34
33
|
const newBlocks = await processL2BlockProposedLogs(rollup, publicClient, blobSinkClient, l2BlockProposedLogs, logger);
|
|
35
34
|
retrievedBlocks.push(...newBlocks);
|
|
36
35
|
searchStartBlock = lastLog.blockNumber + 1n;
|
|
37
|
-
}
|
|
36
|
+
}while (searchStartBlock <= searchEndBlock)
|
|
38
37
|
return retrievedBlocks;
|
|
39
38
|
}
|
|
40
39
|
/**
|
|
@@ -43,35 +42,41 @@ export async function retrieveBlocksFromRollup(rollup, publicClient, blobSinkCli
|
|
|
43
42
|
* @param publicClient - The viem public client to use for transaction retrieval.
|
|
44
43
|
* @param logs - L2BlockProposed logs.
|
|
45
44
|
* @returns - An array blocks.
|
|
46
|
-
*/
|
|
47
|
-
export async function processL2BlockProposedLogs(rollup, publicClient, blobSinkClient, logs, logger) {
|
|
45
|
+
*/ export async function processL2BlockProposedLogs(rollup, publicClient, blobSinkClient, logs, logger) {
|
|
48
46
|
const retrievedBlocks = [];
|
|
49
|
-
await asyncPool(10, logs, async (log)
|
|
47
|
+
await asyncPool(10, logs, async (log)=>{
|
|
50
48
|
const l2BlockNumber = log.args.blockNumber;
|
|
51
49
|
const archive = log.args.archive;
|
|
52
|
-
const archiveFromChain = await rollup.read.archiveAt([
|
|
53
|
-
|
|
50
|
+
const archiveFromChain = await rollup.read.archiveAt([
|
|
51
|
+
l2BlockNumber
|
|
52
|
+
]);
|
|
53
|
+
const blobHashes = log.args.versionedBlobHashes.map((blobHash)=>Buffer.from(blobHash.slice(2), 'hex'));
|
|
54
54
|
// The value from the event and contract will match only if the block is in the chain.
|
|
55
55
|
if (archive === archiveFromChain) {
|
|
56
56
|
const block = await getBlockFromRollupTx(publicClient, blobSinkClient, log.transactionHash, blobHashes, l2BlockNumber, rollup.address, logger);
|
|
57
57
|
const l1 = {
|
|
58
58
|
blockNumber: log.blockNumber,
|
|
59
59
|
blockHash: log.blockHash,
|
|
60
|
-
timestamp: await getL1BlockTime(publicClient, log.blockNumber)
|
|
60
|
+
timestamp: await getL1BlockTime(publicClient, log.blockNumber)
|
|
61
61
|
};
|
|
62
|
-
retrievedBlocks.push({
|
|
63
|
-
|
|
64
|
-
|
|
62
|
+
retrievedBlocks.push({
|
|
63
|
+
data: block,
|
|
64
|
+
l1
|
|
65
|
+
});
|
|
66
|
+
} else {
|
|
65
67
|
logger.warn(`Ignoring L2 block ${l2BlockNumber} due to archive root mismatch`, {
|
|
66
68
|
actual: archive,
|
|
67
|
-
expected: archiveFromChain
|
|
69
|
+
expected: archiveFromChain
|
|
68
70
|
});
|
|
69
71
|
}
|
|
70
72
|
});
|
|
71
73
|
return retrievedBlocks;
|
|
72
74
|
}
|
|
73
75
|
export async function getL1BlockTime(publicClient, blockNumber) {
|
|
74
|
-
const block = await publicClient.getBlock({
|
|
76
|
+
const block = await publicClient.getBlock({
|
|
77
|
+
blockNumber,
|
|
78
|
+
includeTransactions: false
|
|
79
|
+
});
|
|
75
80
|
return block.timestamp;
|
|
76
81
|
}
|
|
77
82
|
/**
|
|
@@ -79,12 +84,11 @@ export async function getL1BlockTime(publicClient, blockNumber) {
|
|
|
79
84
|
* @param forwarderData - The forwarder transaction input data
|
|
80
85
|
* @param rollupAddress - The address of the rollup contract
|
|
81
86
|
* @returns The calldata for the first 'propose' method call to the rollup contract
|
|
82
|
-
*/
|
|
83
|
-
function extractRollupProposeCalldata(forwarderData, rollupAddress) {
|
|
87
|
+
*/ function extractRollupProposeCalldata(forwarderData, rollupAddress) {
|
|
84
88
|
// TODO(#11451): custom forwarders
|
|
85
89
|
const { functionName: forwarderFunctionName, args: forwarderArgs } = decodeFunctionData({
|
|
86
90
|
abi: ForwarderAbi,
|
|
87
|
-
data: forwarderData
|
|
91
|
+
data: forwarderData
|
|
88
92
|
});
|
|
89
93
|
if (forwarderFunctionName !== 'forward') {
|
|
90
94
|
throw new Error(`Unexpected forwarder method called ${forwarderFunctionName}`);
|
|
@@ -95,7 +99,7 @@ function extractRollupProposeCalldata(forwarderData, rollupAddress) {
|
|
|
95
99
|
const [to, data] = forwarderArgs;
|
|
96
100
|
// Find all rollup calls
|
|
97
101
|
const rollupAddressLower = rollupAddress.toLowerCase();
|
|
98
|
-
for
|
|
102
|
+
for(let i = 0; i < to.length; i++){
|
|
99
103
|
const addr = to[i];
|
|
100
104
|
if (addr.toLowerCase() !== rollupAddressLower) {
|
|
101
105
|
continue;
|
|
@@ -104,14 +108,12 @@ function extractRollupProposeCalldata(forwarderData, rollupAddress) {
|
|
|
104
108
|
try {
|
|
105
109
|
const { functionName: rollupFunctionName } = decodeFunctionData({
|
|
106
110
|
abi: RollupAbi,
|
|
107
|
-
data: callData
|
|
111
|
+
data: callData
|
|
108
112
|
});
|
|
109
113
|
if (rollupFunctionName === 'propose') {
|
|
110
114
|
return callData;
|
|
111
115
|
}
|
|
112
|
-
}
|
|
113
|
-
catch (err) {
|
|
114
|
-
// Skip invalid function data
|
|
116
|
+
} catch (err) {
|
|
115
117
|
continue;
|
|
116
118
|
}
|
|
117
119
|
}
|
|
@@ -125,14 +127,14 @@ function extractRollupProposeCalldata(forwarderData, rollupAddress) {
|
|
|
125
127
|
* @param txHash - Hash of the tx that published it.
|
|
126
128
|
* @param l2BlockNum - L2 block number.
|
|
127
129
|
* @returns L2 block from the calldata, deserialized
|
|
128
|
-
*/
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
130
|
+
*/ async function getBlockFromRollupTx(publicClient, blobSinkClient, txHash, blobHashes, l2BlockNum, rollupAddress, logger) {
|
|
131
|
+
const { input: forwarderData, blockHash } = await publicClient.getTransaction({
|
|
132
|
+
hash: txHash
|
|
133
|
+
});
|
|
132
134
|
const rollupData = extractRollupProposeCalldata(forwarderData, rollupAddress);
|
|
133
135
|
const { functionName: rollupFunctionName, args: rollupArgs } = decodeFunctionData({
|
|
134
136
|
abi: RollupAbi,
|
|
135
|
-
data: rollupData
|
|
137
|
+
data: rollupData
|
|
136
138
|
});
|
|
137
139
|
if (rollupFunctionName !== 'propose') {
|
|
138
140
|
throw new Error(`Unexpected rollup method called ${rollupFunctionName}`);
|
|
@@ -148,13 +150,11 @@ l2BlockNum, rollupAddress, logger) {
|
|
|
148
150
|
// Body.fromBlobFields to accept blob buffers directly
|
|
149
151
|
let blockFields;
|
|
150
152
|
try {
|
|
151
|
-
blockFields = blobBodies.flatMap(b
|
|
152
|
-
}
|
|
153
|
-
catch (err) {
|
|
153
|
+
blockFields = blobBodies.flatMap((b)=>b.toEncodedFields());
|
|
154
|
+
} catch (err) {
|
|
154
155
|
if (err instanceof BlobDeserializationError) {
|
|
155
156
|
logger.fatal(err.message);
|
|
156
|
-
}
|
|
157
|
-
else {
|
|
157
|
+
} else {
|
|
158
158
|
logger.fatal('Unable to sync: failed to decode fetched blob, this blob was likely not created by us');
|
|
159
159
|
}
|
|
160
160
|
throw err;
|
|
@@ -183,8 +183,8 @@ l2BlockNum, rollupAddress, logger) {
|
|
|
183
183
|
throw new Error(`Block number mismatch: expected ${l2BlockNum} but got ${blockNumberFromHeader}`);
|
|
184
184
|
}
|
|
185
185
|
const archive = AppendOnlyTreeSnapshot.fromBuffer(Buffer.concat([
|
|
186
|
-
Buffer.from(hexToBytes(decodedArgs.archive)),
|
|
187
|
-
numToUInt32BE(Number(l2BlockNum + 1n))
|
|
186
|
+
Buffer.from(hexToBytes(decodedArgs.archive)),
|
|
187
|
+
numToUInt32BE(Number(l2BlockNum + 1n))
|
|
188
188
|
]));
|
|
189
189
|
return new L2Block(archive, header, blockBody);
|
|
190
190
|
}
|
|
@@ -196,8 +196,7 @@ l2BlockNum, rollupAddress, logger) {
|
|
|
196
196
|
* @param searchStartBlock - The block number to use for starting the search.
|
|
197
197
|
* @param searchEndBlock - The highest block number that we should search up to.
|
|
198
198
|
* @returns An array of InboxLeaf and next eth block to search from.
|
|
199
|
-
*/
|
|
200
|
-
export async function retrieveL1ToL2Messages(inbox, searchStartBlock, searchEndBlock) {
|
|
199
|
+
*/ export async function retrieveL1ToL2Messages(inbox, searchStartBlock, searchEndBlock) {
|
|
201
200
|
const retrievedL1ToL2Messages = [];
|
|
202
201
|
do {
|
|
203
202
|
if (searchStartBlock > searchEndBlock) {
|
|
@@ -205,48 +204,57 @@ export async function retrieveL1ToL2Messages(inbox, searchStartBlock, searchEndB
|
|
|
205
204
|
}
|
|
206
205
|
const messageSentLogs = (await inbox.getEvents.MessageSent({}, {
|
|
207
206
|
fromBlock: searchStartBlock,
|
|
208
|
-
toBlock: searchEndBlock
|
|
209
|
-
})).filter(log
|
|
207
|
+
toBlock: searchEndBlock
|
|
208
|
+
})).filter((log)=>log.blockNumber >= searchStartBlock && log.blockNumber <= searchEndBlock);
|
|
210
209
|
if (messageSentLogs.length === 0) {
|
|
211
210
|
break;
|
|
212
211
|
}
|
|
213
|
-
for (const log of messageSentLogs)
|
|
212
|
+
for (const log of messageSentLogs){
|
|
214
213
|
const { index, hash } = log.args;
|
|
215
214
|
retrievedL1ToL2Messages.push(new InboxLeaf(index, Fr.fromHexString(hash)));
|
|
216
215
|
}
|
|
217
216
|
// handles the case when there are no new messages:
|
|
218
|
-
searchStartBlock = (messageSentLogs.findLast(msgLog
|
|
219
|
-
}
|
|
220
|
-
return {
|
|
217
|
+
searchStartBlock = (messageSentLogs.findLast((msgLog)=>!!msgLog)?.blockNumber || searchStartBlock) + 1n;
|
|
218
|
+
}while (searchStartBlock <= searchEndBlock)
|
|
219
|
+
return {
|
|
220
|
+
lastProcessedL1BlockNumber: searchStartBlock - 1n,
|
|
221
|
+
retrievedData: retrievedL1ToL2Messages
|
|
222
|
+
};
|
|
221
223
|
}
|
|
222
|
-
/** Retrieves L2ProofVerified events from the rollup contract. */
|
|
223
|
-
export async function retrieveL2ProofVerifiedEvents(publicClient, rollupAddress, searchStartBlock, searchEndBlock) {
|
|
224
|
+
/** Retrieves L2ProofVerified events from the rollup contract. */ export async function retrieveL2ProofVerifiedEvents(publicClient, rollupAddress, searchStartBlock, searchEndBlock) {
|
|
224
225
|
const logs = await publicClient.getLogs({
|
|
225
226
|
address: rollupAddress.toString(),
|
|
226
227
|
fromBlock: searchStartBlock,
|
|
227
228
|
toBlock: searchEndBlock ? searchEndBlock : undefined,
|
|
228
229
|
strict: true,
|
|
229
|
-
event: getAbiItem({
|
|
230
|
+
event: getAbiItem({
|
|
231
|
+
abi: RollupAbi,
|
|
232
|
+
name: 'L2ProofVerified'
|
|
233
|
+
})
|
|
230
234
|
});
|
|
231
|
-
return logs.map(log
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
235
|
+
return logs.map((log)=>({
|
|
236
|
+
l1BlockNumber: log.blockNumber,
|
|
237
|
+
l2BlockNumber: log.args.blockNumber,
|
|
238
|
+
proverId: Fr.fromHexString(log.args.proverId),
|
|
239
|
+
txHash: log.transactionHash
|
|
240
|
+
}));
|
|
237
241
|
}
|
|
238
|
-
/** Retrieve submitted proofs from the rollup contract */
|
|
239
|
-
export async function retrieveL2ProofsFromRollup(publicClient, rollupAddress, searchStartBlock, searchEndBlock) {
|
|
242
|
+
/** Retrieve submitted proofs from the rollup contract */ export async function retrieveL2ProofsFromRollup(publicClient, rollupAddress, searchStartBlock, searchEndBlock) {
|
|
240
243
|
const logs = await retrieveL2ProofVerifiedEvents(publicClient, rollupAddress, searchStartBlock, searchEndBlock);
|
|
241
244
|
const retrievedData = [];
|
|
242
245
|
const lastProcessedL1BlockNumber = logs.length > 0 ? logs.at(-1).l1BlockNumber : searchStartBlock - 1n;
|
|
243
|
-
for (const { txHash, proverId, l2BlockNumber } of logs)
|
|
246
|
+
for (const { txHash, proverId, l2BlockNumber } of logs){
|
|
244
247
|
const proofData = await getProofFromSubmitProofTx(publicClient, txHash, proverId);
|
|
245
|
-
retrievedData.push({
|
|
248
|
+
retrievedData.push({
|
|
249
|
+
proof: proofData.proof,
|
|
250
|
+
proverId: proofData.proverId,
|
|
251
|
+
l2BlockNumber,
|
|
252
|
+
txHash
|
|
253
|
+
});
|
|
246
254
|
}
|
|
247
255
|
return {
|
|
248
256
|
retrievedData,
|
|
249
|
-
lastProcessedL1BlockNumber
|
|
257
|
+
lastProcessedL1BlockNumber
|
|
250
258
|
};
|
|
251
259
|
}
|
|
252
260
|
/**
|
|
@@ -257,10 +265,14 @@ export async function retrieveL2ProofsFromRollup(publicClient, rollupAddress, se
|
|
|
257
265
|
* @param txHash - Hash of the tx that published it.
|
|
258
266
|
* @param l2BlockNum - L2 block number.
|
|
259
267
|
* @returns L2 block metadata (header and archive) from the calldata, deserialized
|
|
260
|
-
*/
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
268
|
+
*/ export async function getProofFromSubmitProofTx(publicClient, txHash, expectedProverId) {
|
|
269
|
+
const { input: data } = await publicClient.getTransaction({
|
|
270
|
+
hash: txHash
|
|
271
|
+
});
|
|
272
|
+
const { functionName, args } = decodeFunctionData({
|
|
273
|
+
abi: RollupAbi,
|
|
274
|
+
data
|
|
275
|
+
});
|
|
264
276
|
let proverId;
|
|
265
277
|
let archiveRoot;
|
|
266
278
|
let aggregationObject;
|
|
@@ -271,8 +283,7 @@ export async function getProofFromSubmitProofTx(publicClient, txHash, expectedPr
|
|
|
271
283
|
proverId = Fr.fromHexString(decodedArgs.args[6]);
|
|
272
284
|
archiveRoot = Fr.fromHexString(decodedArgs.args[1]);
|
|
273
285
|
proof = Proof.fromBuffer(Buffer.from(hexToBytes(decodedArgs.proof)));
|
|
274
|
-
}
|
|
275
|
-
else {
|
|
286
|
+
} else {
|
|
276
287
|
throw new Error(`Unexpected proof method called ${functionName}`);
|
|
277
288
|
}
|
|
278
289
|
if (!proverId.equals(expectedProverId)) {
|
|
@@ -282,7 +293,6 @@ export async function getProofFromSubmitProofTx(publicClient, txHash, expectedPr
|
|
|
282
293
|
proverId,
|
|
283
294
|
aggregationObject,
|
|
284
295
|
archiveRoot,
|
|
285
|
-
proof
|
|
296
|
+
proof
|
|
286
297
|
};
|
|
287
298
|
}
|
|
288
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YV9yZXRyaWV2YWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXJjaGl2ZXIvZGF0YV9yZXRyaWV2YWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDaEUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLFdBQVcsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDcEYsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxJQUFJLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUd4RSxPQUFPLEVBQWUsWUFBWSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzVELE9BQU8sRUFBRSxZQUFZLEVBQWlCLFNBQVMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRTdFLE9BQU8sRUFPTCxrQkFBa0IsRUFDbEIsVUFBVSxFQUNWLFVBQVUsR0FDWCxNQUFNLE1BQU0sQ0FBQztBQUVkLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUlyRDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsd0JBQXdCLENBQzVDLE1BQW1GLEVBQ25GLFlBQTBCLEVBQzFCLGNBQXVDLEVBQ3ZDLGdCQUF3QixFQUN4QixjQUFzQixFQUN0QixTQUFpQixZQUFZLENBQUMsVUFBVSxDQUFDO0lBRXpDLE1BQU0sZUFBZSxHQUEyQixFQUFFLENBQUM7SUFDbkQsR0FBRyxDQUFDO1FBQ0YsSUFBSSxnQkFBZ0IsR0FBRyxjQUFjLEVBQUUsQ0FBQztZQUN0QyxNQUFNO1FBQ1IsQ0FBQztRQUNELE1BQU0sbUJBQW1CLEdBQUcsQ0FDMUIsTUFBTSxNQUFNLENB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
|
package/dest/archiver/errors.js
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
export class NoBlobBodiesFoundError extends Error {
|
|
2
|
-
constructor(l2BlockNum)
|
|
2
|
+
constructor(l2BlockNum){
|
|
3
3
|
super(`No blob bodies found for block ${l2BlockNum}`);
|
|
4
4
|
}
|
|
5
5
|
}
|
|
6
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FyY2hpdmVyL2Vycm9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLE9BQU8sc0JBQXVCLFNBQVEsS0FBSztJQUMvQyxZQUFZLFVBQWtCO1FBQzVCLEtBQUssQ0FBQyxrQ0FBa0MsVUFBVSxFQUFFLENBQUMsQ0FBQztJQUN4RCxDQUFDO0NBQ0YifQ==
|
package/dest/archiver/index.js
CHANGED
|
@@ -3,4 +3,3 @@ export * from './config.js';
|
|
|
3
3
|
export { MemoryArchiverStore } from './memory_archiver_store/memory_archiver_store.js';
|
|
4
4
|
export { KVArchiverDataStore } from './kv_archiver_store/kv_archiver_store.js';
|
|
5
5
|
export { ContractInstanceStore } from './kv_archiver_store/contract_instance_store.js';
|
|
6
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXJjaGl2ZXIvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxlQUFlLENBQUM7QUFDOUIsY0FBYyxhQUFhLENBQUM7QUFFNUIsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sa0RBQWtELENBQUM7QUFFdkYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFDL0UsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sZ0RBQWdELENBQUMifQ==
|
|
@@ -1,43 +1,54 @@
|
|
|
1
1
|
import { createLogger } from '@aztec/foundation/log';
|
|
2
|
-
import { Attributes, LmdbMetrics, Metrics, ValueType
|
|
2
|
+
import { Attributes, LmdbMetrics, Metrics, ValueType } from '@aztec/telemetry-client';
|
|
3
3
|
export class ArchiverInstrumentation {
|
|
4
|
-
|
|
4
|
+
telemetry;
|
|
5
|
+
tracer;
|
|
6
|
+
blockHeight;
|
|
7
|
+
txCount;
|
|
8
|
+
syncDuration;
|
|
9
|
+
l1BlocksSynced;
|
|
10
|
+
proofsSubmittedDelay;
|
|
11
|
+
proofsSubmittedCount;
|
|
12
|
+
dbMetrics;
|
|
13
|
+
pruneCount;
|
|
14
|
+
log;
|
|
15
|
+
constructor(telemetry, lmdbStats){
|
|
5
16
|
this.telemetry = telemetry;
|
|
6
17
|
this.log = createLogger('archiver:instrumentation');
|
|
7
18
|
this.tracer = telemetry.getTracer('Archiver');
|
|
8
19
|
const meter = telemetry.getMeter('Archiver');
|
|
9
20
|
this.blockHeight = meter.createGauge(Metrics.ARCHIVER_BLOCK_HEIGHT, {
|
|
10
21
|
description: 'The height of the latest block processed by the archiver',
|
|
11
|
-
valueType: ValueType.INT
|
|
22
|
+
valueType: ValueType.INT
|
|
12
23
|
});
|
|
13
24
|
this.txCount = meter.createUpDownCounter(Metrics.ARCHIVER_TX_COUNT, {
|
|
14
25
|
description: 'The total number of transactions',
|
|
15
|
-
valueType: ValueType.INT
|
|
26
|
+
valueType: ValueType.INT
|
|
16
27
|
});
|
|
17
28
|
this.syncDuration = meter.createHistogram(Metrics.ARCHIVER_SYNC_DURATION, {
|
|
18
29
|
unit: 'ms',
|
|
19
30
|
description: 'Duration to sync a block',
|
|
20
|
-
valueType: ValueType.INT
|
|
31
|
+
valueType: ValueType.INT
|
|
21
32
|
});
|
|
22
33
|
this.proofsSubmittedCount = meter.createUpDownCounter(Metrics.ARCHIVER_ROLLUP_PROOF_COUNT, {
|
|
23
34
|
description: 'Number of proofs submitted',
|
|
24
|
-
valueType: ValueType.INT
|
|
35
|
+
valueType: ValueType.INT
|
|
25
36
|
});
|
|
26
37
|
this.proofsSubmittedDelay = meter.createHistogram(Metrics.ARCHIVER_ROLLUP_PROOF_DELAY, {
|
|
27
38
|
unit: 'ms',
|
|
28
39
|
description: 'Time after a block is submitted until its proof is published',
|
|
29
|
-
valueType: ValueType.INT
|
|
40
|
+
valueType: ValueType.INT
|
|
30
41
|
});
|
|
31
42
|
this.l1BlocksSynced = meter.createUpDownCounter(Metrics.ARCHIVER_L1_BLOCKS_SYNCED, {
|
|
32
43
|
description: 'Number of blocks synced from L1',
|
|
33
|
-
valueType: ValueType.INT
|
|
44
|
+
valueType: ValueType.INT
|
|
34
45
|
});
|
|
35
46
|
this.dbMetrics = new LmdbMetrics(meter, {
|
|
36
|
-
[Attributes.DB_DATA_TYPE]: 'archiver'
|
|
47
|
+
[Attributes.DB_DATA_TYPE]: 'archiver'
|
|
37
48
|
}, lmdbStats);
|
|
38
49
|
this.pruneCount = meter.createUpDownCounter(Metrics.ARCHIVER_PRUNE_COUNT, {
|
|
39
50
|
description: 'Number of prunes detected',
|
|
40
|
-
valueType: ValueType.INT
|
|
51
|
+
valueType: ValueType.INT
|
|
41
52
|
});
|
|
42
53
|
}
|
|
43
54
|
static async new(telemetry, lmdbStats) {
|
|
@@ -51,9 +62,9 @@ export class ArchiverInstrumentation {
|
|
|
51
62
|
}
|
|
52
63
|
processNewBlocks(syncTimePerBlock, blocks) {
|
|
53
64
|
this.syncDuration.record(Math.ceil(syncTimePerBlock));
|
|
54
|
-
this.blockHeight.record(Math.max(...blocks.map(b
|
|
65
|
+
this.blockHeight.record(Math.max(...blocks.map((b)=>b.number)));
|
|
55
66
|
this.l1BlocksSynced.add(blocks.length);
|
|
56
|
-
for (const block of blocks)
|
|
67
|
+
for (const block of blocks){
|
|
57
68
|
this.txCount.add(block.body.txEffects.length);
|
|
58
69
|
}
|
|
59
70
|
}
|
|
@@ -61,19 +72,20 @@ export class ArchiverInstrumentation {
|
|
|
61
72
|
this.pruneCount.add(1);
|
|
62
73
|
}
|
|
63
74
|
updateLastProvenBlock(blockNumber) {
|
|
64
|
-
this.blockHeight.record(blockNumber, {
|
|
75
|
+
this.blockHeight.record(blockNumber, {
|
|
76
|
+
[Attributes.STATUS]: 'proven'
|
|
77
|
+
});
|
|
65
78
|
}
|
|
66
79
|
processProofsVerified(logs) {
|
|
67
|
-
for (const log of logs)
|
|
80
|
+
for (const log of logs){
|
|
68
81
|
this.log.debug('Recording proof verified event', log);
|
|
69
82
|
this.proofsSubmittedCount.add(1, {
|
|
70
83
|
[Attributes.ROLLUP_PROVER_ID]: log.proverId,
|
|
71
|
-
[Attributes.PROOF_TIMED_OUT]: log.delay > 20n * 60n * 1000n
|
|
84
|
+
[Attributes.PROOF_TIMED_OUT]: log.delay > 20n * 60n * 1000n
|
|
72
85
|
});
|
|
73
86
|
this.proofsSubmittedDelay.record(Math.ceil(Number(log.delay)), {
|
|
74
|
-
[Attributes.ROLLUP_PROVER_ID]: log.proverId
|
|
87
|
+
[Attributes.ROLLUP_PROVER_ID]: log.proverId
|
|
75
88
|
});
|
|
76
89
|
}
|
|
77
90
|
}
|
|
78
91
|
}
|
|
79
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdHJ1bWVudGF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FyY2hpdmVyL2luc3RydW1lbnRhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDckQsT0FBTyxFQUNMLFVBQVUsRUFHVixXQUFXLEVBRVgsT0FBTyxFQUlQLFNBQVMsR0FDVixNQUFNLHlCQUF5QixDQUFDO0FBRWpDLE1BQU0sT0FBTyx1QkFBdUI7SUFjbEMsWUFBNEIsU0FBMEIsRUFBRSxTQUE2QjtRQUF6RCxjQUFTLEdBQVQsU0FBUyxDQUFpQjtRQUY5QyxRQUFHLEdBQUcsWUFBWSxDQUFDLDBCQUEwQixDQUFDLENBQUM7UUFHckQsSUFBSSxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzlDLE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDN0MsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsRUFBRTtZQUNsRSxXQUFXLEVBQUUsMERBQTBEO1lBQ3ZFLFNBQVMsRUFBRSxTQUFTLENBQUMsR0FBRztTQUN6QixDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsaUJBQWlCLEVBQUU7WUFDbEUsV0FBVyxFQUFFLGtDQUFrQztZQUMvQyxTQUFTLEVBQUUsU0FBUyxDQUFDLEdBQUc7U0FDekIsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxzQkFBc0IsRUFBRTtZQUN4RSxJQUFJLEVBQUUsSUFBSTtZQUNWLFdBQVcsRUFBRSwwQkFBMEI7WUFDdkMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxH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
|