@aztec/archiver 0.73.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.
Files changed (82) hide show
  1. package/dest/archiver/archiver.js +729 -711
  2. package/dest/archiver/archiver_store.js +4 -2
  3. package/dest/archiver/archiver_store_test_suite.js +385 -224
  4. package/dest/archiver/config.js +9 -11
  5. package/dest/archiver/data_retrieval.js +89 -65
  6. package/dest/archiver/errors.js +1 -2
  7. package/dest/archiver/index.js +0 -1
  8. package/dest/archiver/instrumentation.js +29 -17
  9. package/dest/archiver/kv_archiver_store/block_store.js +118 -127
  10. package/dest/archiver/kv_archiver_store/contract_class_store.js +43 -37
  11. package/dest/archiver/kv_archiver_store/contract_instance_store.js +7 -12
  12. package/dest/archiver/kv_archiver_store/kv_archiver_store.js +135 -158
  13. package/dest/archiver/kv_archiver_store/log_store.js +271 -256
  14. package/dest/archiver/kv_archiver_store/message_store.js +42 -48
  15. package/dest/archiver/kv_archiver_store/nullifier_store.js +35 -42
  16. package/dest/archiver/memory_archiver_store/l1_to_l2_message_store.js +15 -24
  17. package/dest/archiver/memory_archiver_store/memory_archiver_store.js +227 -231
  18. package/dest/archiver/structs/data_retrieval.js +5 -2
  19. package/dest/archiver/structs/published.js +1 -2
  20. package/dest/factory.js +30 -20
  21. package/dest/index.js +0 -1
  22. package/dest/rpc/index.js +5 -2
  23. package/dest/test/index.js +0 -1
  24. package/dest/test/mock_archiver.js +8 -13
  25. package/dest/test/mock_l1_to_l2_message_source.js +4 -4
  26. package/dest/test/mock_l2_block_source.js +68 -67
  27. package/package.json +14 -13
  28. package/src/archiver/archiver.ts +1 -1
  29. package/src/archiver/data_retrieval.ts +17 -3
  30. package/src/archiver/index.ts +1 -1
  31. package/dest/archiver/archiver.d.ts +0 -186
  32. package/dest/archiver/archiver.d.ts.map +0 -1
  33. package/dest/archiver/archiver_store.d.ts +0 -217
  34. package/dest/archiver/archiver_store.d.ts.map +0 -1
  35. package/dest/archiver/archiver_store_test_suite.d.ts +0 -8
  36. package/dest/archiver/archiver_store_test_suite.d.ts.map +0 -1
  37. package/dest/archiver/config.d.ts +0 -35
  38. package/dest/archiver/config.d.ts.map +0 -1
  39. package/dest/archiver/data_retrieval.d.ts +0 -71
  40. package/dest/archiver/data_retrieval.d.ts.map +0 -1
  41. package/dest/archiver/errors.d.ts +0 -4
  42. package/dest/archiver/errors.d.ts.map +0 -1
  43. package/dest/archiver/index.d.ts +0 -8
  44. package/dest/archiver/index.d.ts.map +0 -1
  45. package/dest/archiver/instrumentation.d.ts +0 -27
  46. package/dest/archiver/instrumentation.d.ts.map +0 -1
  47. package/dest/archiver/kv_archiver_store/block_store.d.ts +0 -87
  48. package/dest/archiver/kv_archiver_store/block_store.d.ts.map +0 -1
  49. package/dest/archiver/kv_archiver_store/contract_class_store.d.ts +0 -17
  50. package/dest/archiver/kv_archiver_store/contract_class_store.d.ts.map +0 -1
  51. package/dest/archiver/kv_archiver_store/contract_instance_store.d.ts +0 -13
  52. package/dest/archiver/kv_archiver_store/contract_instance_store.d.ts.map +0 -1
  53. package/dest/archiver/kv_archiver_store/kv_archiver_store.d.ts +0 -147
  54. package/dest/archiver/kv_archiver_store/kv_archiver_store.d.ts.map +0 -1
  55. package/dest/archiver/kv_archiver_store/log_store.d.ts +0 -47
  56. package/dest/archiver/kv_archiver_store/log_store.d.ts.map +0 -1
  57. package/dest/archiver/kv_archiver_store/message_store.d.ts +0 -33
  58. package/dest/archiver/kv_archiver_store/message_store.d.ts.map +0 -1
  59. package/dest/archiver/kv_archiver_store/nullifier_store.d.ts +0 -12
  60. package/dest/archiver/kv_archiver_store/nullifier_store.d.ts.map +0 -1
  61. package/dest/archiver/memory_archiver_store/l1_to_l2_message_store.d.ts +0 -23
  62. package/dest/archiver/memory_archiver_store/l1_to_l2_message_store.d.ts.map +0 -1
  63. package/dest/archiver/memory_archiver_store/memory_archiver_store.d.ts +0 -168
  64. package/dest/archiver/memory_archiver_store/memory_archiver_store.d.ts.map +0 -1
  65. package/dest/archiver/structs/data_retrieval.d.ts +0 -27
  66. package/dest/archiver/structs/data_retrieval.d.ts.map +0 -1
  67. package/dest/archiver/structs/published.d.ts +0 -11
  68. package/dest/archiver/structs/published.d.ts.map +0 -1
  69. package/dest/factory.d.ts +0 -10
  70. package/dest/factory.d.ts.map +0 -1
  71. package/dest/index.d.ts +0 -5
  72. package/dest/index.d.ts.map +0 -1
  73. package/dest/rpc/index.d.ts +0 -4
  74. package/dest/rpc/index.d.ts.map +0 -1
  75. package/dest/test/index.d.ts +0 -4
  76. package/dest/test/index.d.ts.map +0 -1
  77. package/dest/test/mock_archiver.d.ts +0 -22
  78. package/dest/test/mock_archiver.d.ts.map +0 -1
  79. package/dest/test/mock_l1_to_l2_message_source.d.ts +0 -16
  80. package/dest/test/mock_l1_to_l2_message_source.d.ts.map +0 -1
  81. package/dest/test/mock_l2_block_source.d.ts +0 -80
  82. package/dest/test/mock_l2_block_source.d.ts.map +0 -1
@@ -1,44 +1,42 @@
1
- import { l1ContractsConfigMappings, l1ReaderConfigMappings, } from '@aztec/ethereum';
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) => 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(1000),
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 } 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, } from 'viem';
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 => log.blockNumber >= searchStartBlock && log.blockNumber <= searchEndBlock);
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
- } while (searchStartBlock <= searchEndBlock);
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([l2BlockNumber]);
53
- const blobHashes = log.args.versionedBlobHashes.map(blobHash => Buffer.from(blobHash.slice(2), 'hex'));
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
- const block = await getBlockFromRollupTx(publicClient, blobSinkClient, log.transactionHash, blobHashes, l2BlockNumber, rollup.address);
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({ data: block, l1 });
63
- }
64
- else {
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({ blockNumber, includeTransactions: false });
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 (let i = 0; i < to.length; i++) {
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
- async function getBlockFromRollupTx(publicClient, blobSinkClient, txHash, blobHashes, // WORKTODO(md): buffer32?
130
- l2BlockNum, rollupAddress) {
131
- const { input: forwarderData, blockHash } = await publicClient.getTransaction({ hash: txHash });
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}`);
@@ -144,7 +146,19 @@ l2BlockNum, rollupAddress) {
144
146
  if (blobBodies.length === 0) {
145
147
  throw new NoBlobBodiesFoundError(Number(l2BlockNum));
146
148
  }
147
- const blockFields = blobBodies.flatMap(b => b.toEncodedFields());
149
+ // TODO(#9101): Once calldata is removed, we can remove this field encoding and update
150
+ // Body.fromBlobFields to accept blob buffers directly
151
+ let blockFields;
152
+ try {
153
+ blockFields = blobBodies.flatMap((b)=>b.toEncodedFields());
154
+ } catch (err) {
155
+ if (err instanceof BlobDeserializationError) {
156
+ logger.fatal(err.message);
157
+ } else {
158
+ logger.fatal('Unable to sync: failed to decode fetched blob, this blob was likely not created by us');
159
+ }
160
+ throw err;
161
+ }
148
162
  // TODO(#9101): Retreiving the block body from calldata is a temporary soln before we have
149
163
  // either a beacon chain client or link to some blob store. Web2 is ok because we will
150
164
  // verify the block body vs the blob as below.
@@ -169,8 +183,8 @@ l2BlockNum, rollupAddress) {
169
183
  throw new Error(`Block number mismatch: expected ${l2BlockNum} but got ${blockNumberFromHeader}`);
170
184
  }
171
185
  const archive = AppendOnlyTreeSnapshot.fromBuffer(Buffer.concat([
172
- Buffer.from(hexToBytes(decodedArgs.archive)), // L2Block.archive.root
173
- numToUInt32BE(Number(l2BlockNum + 1n)), // L2Block.archive.nextAvailableLeafIndex
186
+ Buffer.from(hexToBytes(decodedArgs.archive)),
187
+ numToUInt32BE(Number(l2BlockNum + 1n))
174
188
  ]));
175
189
  return new L2Block(archive, header, blockBody);
176
190
  }
@@ -182,8 +196,7 @@ l2BlockNum, rollupAddress) {
182
196
  * @param searchStartBlock - The block number to use for starting the search.
183
197
  * @param searchEndBlock - The highest block number that we should search up to.
184
198
  * @returns An array of InboxLeaf and next eth block to search from.
185
- */
186
- export async function retrieveL1ToL2Messages(inbox, searchStartBlock, searchEndBlock) {
199
+ */ export async function retrieveL1ToL2Messages(inbox, searchStartBlock, searchEndBlock) {
187
200
  const retrievedL1ToL2Messages = [];
188
201
  do {
189
202
  if (searchStartBlock > searchEndBlock) {
@@ -191,48 +204,57 @@ export async function retrieveL1ToL2Messages(inbox, searchStartBlock, searchEndB
191
204
  }
192
205
  const messageSentLogs = (await inbox.getEvents.MessageSent({}, {
193
206
  fromBlock: searchStartBlock,
194
- toBlock: searchEndBlock,
195
- })).filter(log => log.blockNumber >= searchStartBlock && log.blockNumber <= searchEndBlock);
207
+ toBlock: searchEndBlock
208
+ })).filter((log)=>log.blockNumber >= searchStartBlock && log.blockNumber <= searchEndBlock);
196
209
  if (messageSentLogs.length === 0) {
197
210
  break;
198
211
  }
199
- for (const log of messageSentLogs) {
212
+ for (const log of messageSentLogs){
200
213
  const { index, hash } = log.args;
201
214
  retrievedL1ToL2Messages.push(new InboxLeaf(index, Fr.fromHexString(hash)));
202
215
  }
203
216
  // handles the case when there are no new messages:
204
- searchStartBlock = (messageSentLogs.findLast(msgLog => !!msgLog)?.blockNumber || searchStartBlock) + 1n;
205
- } while (searchStartBlock <= searchEndBlock);
206
- return { lastProcessedL1BlockNumber: searchStartBlock - 1n, retrievedData: retrievedL1ToL2Messages };
217
+ searchStartBlock = (messageSentLogs.findLast((msgLog)=>!!msgLog)?.blockNumber || searchStartBlock) + 1n;
218
+ }while (searchStartBlock <= searchEndBlock)
219
+ return {
220
+ lastProcessedL1BlockNumber: searchStartBlock - 1n,
221
+ retrievedData: retrievedL1ToL2Messages
222
+ };
207
223
  }
208
- /** Retrieves L2ProofVerified events from the rollup contract. */
209
- export async function retrieveL2ProofVerifiedEvents(publicClient, rollupAddress, searchStartBlock, searchEndBlock) {
224
+ /** Retrieves L2ProofVerified events from the rollup contract. */ export async function retrieveL2ProofVerifiedEvents(publicClient, rollupAddress, searchStartBlock, searchEndBlock) {
210
225
  const logs = await publicClient.getLogs({
211
226
  address: rollupAddress.toString(),
212
227
  fromBlock: searchStartBlock,
213
228
  toBlock: searchEndBlock ? searchEndBlock : undefined,
214
229
  strict: true,
215
- event: getAbiItem({ abi: RollupAbi, name: 'L2ProofVerified' }),
230
+ event: getAbiItem({
231
+ abi: RollupAbi,
232
+ name: 'L2ProofVerified'
233
+ })
216
234
  });
217
- return logs.map(log => ({
218
- l1BlockNumber: log.blockNumber,
219
- l2BlockNumber: log.args.blockNumber,
220
- proverId: Fr.fromHexString(log.args.proverId),
221
- txHash: log.transactionHash,
222
- }));
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
+ }));
223
241
  }
224
- /** Retrieve submitted proofs from the rollup contract */
225
- export async function retrieveL2ProofsFromRollup(publicClient, rollupAddress, searchStartBlock, searchEndBlock) {
242
+ /** Retrieve submitted proofs from the rollup contract */ export async function retrieveL2ProofsFromRollup(publicClient, rollupAddress, searchStartBlock, searchEndBlock) {
226
243
  const logs = await retrieveL2ProofVerifiedEvents(publicClient, rollupAddress, searchStartBlock, searchEndBlock);
227
244
  const retrievedData = [];
228
245
  const lastProcessedL1BlockNumber = logs.length > 0 ? logs.at(-1).l1BlockNumber : searchStartBlock - 1n;
229
- for (const { txHash, proverId, l2BlockNumber } of logs) {
246
+ for (const { txHash, proverId, l2BlockNumber } of logs){
230
247
  const proofData = await getProofFromSubmitProofTx(publicClient, txHash, proverId);
231
- retrievedData.push({ proof: proofData.proof, proverId: proofData.proverId, l2BlockNumber, txHash });
248
+ retrievedData.push({
249
+ proof: proofData.proof,
250
+ proverId: proofData.proverId,
251
+ l2BlockNumber,
252
+ txHash
253
+ });
232
254
  }
233
255
  return {
234
256
  retrievedData,
235
- lastProcessedL1BlockNumber,
257
+ lastProcessedL1BlockNumber
236
258
  };
237
259
  }
238
260
  /**
@@ -243,10 +265,14 @@ export async function retrieveL2ProofsFromRollup(publicClient, rollupAddress, se
243
265
  * @param txHash - Hash of the tx that published it.
244
266
  * @param l2BlockNum - L2 block number.
245
267
  * @returns L2 block metadata (header and archive) from the calldata, deserialized
246
- */
247
- export async function getProofFromSubmitProofTx(publicClient, txHash, expectedProverId) {
248
- const { input: data } = await publicClient.getTransaction({ hash: txHash });
249
- const { functionName, args } = decodeFunctionData({ abi: RollupAbi, data });
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
+ });
250
276
  let proverId;
251
277
  let archiveRoot;
252
278
  let aggregationObject;
@@ -257,8 +283,7 @@ export async function getProofFromSubmitProofTx(publicClient, txHash, expectedPr
257
283
  proverId = Fr.fromHexString(decodedArgs.args[6]);
258
284
  archiveRoot = Fr.fromHexString(decodedArgs.args[1]);
259
285
  proof = Proof.fromBuffer(Buffer.from(hexToBytes(decodedArgs.proof)));
260
- }
261
- else {
286
+ } else {
262
287
  throw new Error(`Unexpected proof method called ${functionName}`);
263
288
  }
264
289
  if (!proverId.equals(expectedProverId)) {
@@ -268,7 +293,6 @@ export async function getProofFromSubmitProofTx(publicClient, txHash, expectedPr
268
293
  proverId,
269
294
  aggregationObject,
270
295
  archiveRoot,
271
- proof,
296
+ proof
272
297
  };
273
298
  }
274
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YV9yZXRyaWV2YWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXJjaGl2ZXIvZGF0YV9yZXRyaWV2YWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDaEUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLFdBQVcsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDcEYsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUc5QyxPQUFPLEVBQWUsWUFBWSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzVELE9BQU8sRUFBRSxZQUFZLEVBQWlCLFNBQVMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRTdFLE9BQU8sRUFPTCxrQkFBa0IsRUFDbEIsVUFBVSxFQUNWLFVBQVUsR0FDWCxNQUFNLE1BQU0sQ0FBQztBQUVkLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUlyRDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsd0JBQXdCLENBQzVDLE1BQW1GLEVBQ25GLFlBQTBCLEVBQzFCLGNBQXVDLEVBQ3ZDLGdCQUF3QixFQUN4QixjQUFzQixFQUN0QixTQUFpQixZQUFZLENBQUMsVUFBVSxDQUFDO0lBRXpDLE1BQU0sZUFBZSxHQUEyQixFQUFFLENBQUM7SUFDbkQsR0FBRyxDQUFDO1FBQ0YsSUFBSSxnQkFBZ0IsR0FBRyxjQUFjLEVBQUUsQ0FBQztZQUN0QyxNQUFNO1FBQ1IsQ0FBQztRQUNELE1BQU0sbUJBQW1CLEdBQUcsQ0FDMUIsTUFBTSxNQUFNLENBQUMsU0FBUyxDQUFD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
@@ -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==
@@ -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, } from '@aztec/telemetry-client';
2
+ import { Attributes, LmdbMetrics, Metrics, ValueType } from '@aztec/telemetry-client';
3
3
  export class ArchiverInstrumentation {
4
- constructor(telemetry, lmdbStats) {
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 => b.number)));
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, { [Attributes.STATUS]: 'proven' });
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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