@aztec/archiver 0.8.10 → 0.8.12
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 +12 -6
- package/dest/archiver/archiver.d.ts.map +1 -1
- package/dest/archiver/archiver.js +48 -31
- package/dest/archiver/archiver_store.d.ts +27 -19
- package/dest/archiver/archiver_store.d.ts.map +1 -1
- package/dest/archiver/archiver_store.js +102 -31
- package/dest/archiver/config.d.ts +2 -4
- package/dest/archiver/config.d.ts.map +1 -1
- package/dest/archiver/config.js +2 -3
- package/dest/index.js +5 -4
- package/package.json +6 -6
- package/src/archiver/archiver.ts +54 -33
- package/src/archiver/archiver_store.ts +129 -38
- package/src/archiver/config.ts +3 -7
- package/src/index.ts +3 -3
|
@@ -1,15 +1,18 @@
|
|
|
1
1
|
import { NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP } from '@aztec/circuits.js';
|
|
2
|
-
import { INITIAL_L2_BLOCK_NUM, LogType, } from '@aztec/types';
|
|
2
|
+
import { ExtendedUnencryptedL2Log, INITIAL_L2_BLOCK_NUM, L2BlockContext, LogId, LogType, UnencryptedL2Log, } from '@aztec/types';
|
|
3
3
|
import { L1ToL2MessageStore, PendingL1ToL2MessageStore } from './l1_to_l2_message_store.js';
|
|
4
4
|
/**
|
|
5
5
|
* Simple, in-memory implementation of an archiver data store.
|
|
6
6
|
*/
|
|
7
7
|
export class MemoryArchiverStore {
|
|
8
|
-
constructor(
|
|
8
|
+
constructor(
|
|
9
|
+
/** The max number of logs that can be obtained in 1 "getUnencryptedLogs" call. */
|
|
10
|
+
maxLogs) {
|
|
11
|
+
this.maxLogs = maxLogs;
|
|
9
12
|
/**
|
|
10
13
|
* An array containing all the L2 blocks that have been fetched so far.
|
|
11
14
|
*/
|
|
12
|
-
this.
|
|
15
|
+
this.l2BlockContexts = [];
|
|
13
16
|
/**
|
|
14
17
|
* An array containing all the L2 Txs in the L2 blocks that have been fetched so far.
|
|
15
18
|
*/
|
|
@@ -18,12 +21,12 @@ export class MemoryArchiverStore {
|
|
|
18
21
|
* An array containing all the encrypted logs that have been fetched so far.
|
|
19
22
|
* Note: Index in the "outer" array equals to (corresponding L2 block's number - INITIAL_L2_BLOCK_NUM).
|
|
20
23
|
*/
|
|
21
|
-
this.
|
|
24
|
+
this.encryptedLogsPerBlock = [];
|
|
22
25
|
/**
|
|
23
26
|
* An array containing all the unencrypted logs that have been fetched so far.
|
|
24
27
|
* Note: Index in the "outer" array equals to (corresponding L2 block's number - INITIAL_L2_BLOCK_NUM).
|
|
25
28
|
*/
|
|
26
|
-
this.
|
|
29
|
+
this.unencryptedLogsPerBlock = [];
|
|
27
30
|
/**
|
|
28
31
|
* A sparse array containing all the extended contract data that have been fetched so far.
|
|
29
32
|
*/
|
|
@@ -47,8 +50,8 @@ export class MemoryArchiverStore {
|
|
|
47
50
|
* @param blocks - The L2 blocks to be added to the store.
|
|
48
51
|
* @returns True if the operation is successful (always in this implementation).
|
|
49
52
|
*/
|
|
50
|
-
|
|
51
|
-
this.
|
|
53
|
+
addBlocks(blocks) {
|
|
54
|
+
this.l2BlockContexts.push(...blocks.map(block => new L2BlockContext(block)));
|
|
52
55
|
this.l2Txs.push(...blocks.flatMap(b => b.getTxs()));
|
|
53
56
|
return Promise.resolve(true);
|
|
54
57
|
}
|
|
@@ -59,7 +62,9 @@ export class MemoryArchiverStore {
|
|
|
59
62
|
* @returns True if the operation is successful.
|
|
60
63
|
*/
|
|
61
64
|
addLogs(data, logType) {
|
|
62
|
-
logType === LogType.ENCRYPTED
|
|
65
|
+
logType === LogType.ENCRYPTED
|
|
66
|
+
? this.encryptedLogsPerBlock.push(...data)
|
|
67
|
+
: this.unencryptedLogsPerBlock.push(...data);
|
|
63
68
|
return Promise.resolve(true);
|
|
64
69
|
}
|
|
65
70
|
/**
|
|
@@ -123,18 +128,19 @@ export class MemoryArchiverStore {
|
|
|
123
128
|
* @param from - Number of the first block to return (inclusive).
|
|
124
129
|
* @param limit - The number of blocks to return.
|
|
125
130
|
* @returns The requested L2 blocks.
|
|
131
|
+
* @remarks When "from" is smaller than genesis block number, blocks from the beginning are returned.
|
|
126
132
|
*/
|
|
127
|
-
|
|
133
|
+
getBlocks(from, limit) {
|
|
128
134
|
// Return an empty array if we are outside of range
|
|
129
135
|
if (limit < 1) {
|
|
130
|
-
throw new Error(`Invalid
|
|
136
|
+
throw new Error(`Invalid limit: ${limit}`);
|
|
131
137
|
}
|
|
132
|
-
|
|
138
|
+
const fromIndex = Math.max(from - INITIAL_L2_BLOCK_NUM, 0);
|
|
139
|
+
if (fromIndex >= this.l2BlockContexts.length) {
|
|
133
140
|
return Promise.resolve([]);
|
|
134
141
|
}
|
|
135
|
-
const
|
|
136
|
-
|
|
137
|
-
return Promise.resolve(this.l2Blocks.slice(startIndex, endIndex));
|
|
142
|
+
const toIndex = fromIndex + limit;
|
|
143
|
+
return Promise.resolve(this.l2BlockContexts.slice(fromIndex, toIndex).map(blockContext => blockContext.block));
|
|
138
144
|
}
|
|
139
145
|
/**
|
|
140
146
|
* Gets an l2 tx.
|
|
@@ -174,9 +180,9 @@ export class MemoryArchiverStore {
|
|
|
174
180
|
*/
|
|
175
181
|
getLogs(from, limit, logType) {
|
|
176
182
|
if (from < INITIAL_L2_BLOCK_NUM || limit < 1) {
|
|
177
|
-
throw new Error(`Invalid
|
|
183
|
+
throw new Error(`Invalid limit: ${limit}`);
|
|
178
184
|
}
|
|
179
|
-
const logs = logType === LogType.ENCRYPTED ? this.
|
|
185
|
+
const logs = logType === LogType.ENCRYPTED ? this.encryptedLogsPerBlock : this.unencryptedLogsPerBlock;
|
|
180
186
|
if (from > logs.length) {
|
|
181
187
|
return Promise.resolve([]);
|
|
182
188
|
}
|
|
@@ -184,6 +190,78 @@ export class MemoryArchiverStore {
|
|
|
184
190
|
const endIndex = startIndex + limit;
|
|
185
191
|
return Promise.resolve(logs.slice(startIndex, endIndex));
|
|
186
192
|
}
|
|
193
|
+
/**
|
|
194
|
+
* Gets unencrypted logs based on the provided filter.
|
|
195
|
+
* @param filter - The filter to apply to the logs.
|
|
196
|
+
* @returns The requested logs.
|
|
197
|
+
* @remarks Works by doing an intersection of all params in the filter.
|
|
198
|
+
*/
|
|
199
|
+
getUnencryptedLogs(filter) {
|
|
200
|
+
let txHash;
|
|
201
|
+
let fromBlockIndex = 0;
|
|
202
|
+
let toBlockIndex = this.unencryptedLogsPerBlock.length;
|
|
203
|
+
let txIndexInBlock = 0;
|
|
204
|
+
let logIndexInTx = 0;
|
|
205
|
+
if (filter.afterLog) {
|
|
206
|
+
// Continuation parameter is set --> tx hash is ignored
|
|
207
|
+
if (filter.fromBlock == undefined || filter.fromBlock <= filter.afterLog.blockNumber) {
|
|
208
|
+
fromBlockIndex = filter.afterLog.blockNumber - INITIAL_L2_BLOCK_NUM;
|
|
209
|
+
txIndexInBlock = filter.afterLog.txIndex;
|
|
210
|
+
logIndexInTx = filter.afterLog.logIndex + 1; // We want to start from the next log
|
|
211
|
+
}
|
|
212
|
+
else {
|
|
213
|
+
fromBlockIndex = filter.fromBlock - INITIAL_L2_BLOCK_NUM;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
else {
|
|
217
|
+
txHash = filter.txHash;
|
|
218
|
+
if (filter.fromBlock !== undefined) {
|
|
219
|
+
fromBlockIndex = filter.fromBlock - INITIAL_L2_BLOCK_NUM;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
if (filter.toBlock !== undefined) {
|
|
223
|
+
toBlockIndex = filter.toBlock - INITIAL_L2_BLOCK_NUM;
|
|
224
|
+
}
|
|
225
|
+
// Ensure the indices are within block array bounds
|
|
226
|
+
fromBlockIndex = Math.max(fromBlockIndex, 0);
|
|
227
|
+
toBlockIndex = Math.min(toBlockIndex, this.unencryptedLogsPerBlock.length);
|
|
228
|
+
if (fromBlockIndex > this.unencryptedLogsPerBlock.length || toBlockIndex < fromBlockIndex || toBlockIndex <= 0) {
|
|
229
|
+
return Promise.resolve({
|
|
230
|
+
logs: [],
|
|
231
|
+
maxLogsHit: false,
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
const contractAddress = filter.contractAddress;
|
|
235
|
+
const selector = filter.selector;
|
|
236
|
+
const logs = [];
|
|
237
|
+
for (; fromBlockIndex < toBlockIndex; fromBlockIndex++) {
|
|
238
|
+
const blockContext = this.l2BlockContexts[fromBlockIndex];
|
|
239
|
+
const blockLogs = this.unencryptedLogsPerBlock[fromBlockIndex];
|
|
240
|
+
for (; txIndexInBlock < blockLogs.txLogs.length; txIndexInBlock++) {
|
|
241
|
+
const txLogs = blockLogs.txLogs[txIndexInBlock].unrollLogs().map(log => UnencryptedL2Log.fromBuffer(log));
|
|
242
|
+
for (; logIndexInTx < txLogs.length; logIndexInTx++) {
|
|
243
|
+
const log = txLogs[logIndexInTx];
|
|
244
|
+
if ((!txHash || blockContext.getTxHash(txIndexInBlock).equals(txHash)) &&
|
|
245
|
+
(!contractAddress || log.contractAddress.equals(contractAddress)) &&
|
|
246
|
+
(!selector || log.selector.equals(selector))) {
|
|
247
|
+
logs.push(new ExtendedUnencryptedL2Log(new LogId(blockContext.block.number, txIndexInBlock, logIndexInTx), log));
|
|
248
|
+
if (logs.length === this.maxLogs) {
|
|
249
|
+
return Promise.resolve({
|
|
250
|
+
logs,
|
|
251
|
+
maxLogsHit: true,
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
logIndexInTx = 0;
|
|
257
|
+
}
|
|
258
|
+
txIndexInBlock = 0;
|
|
259
|
+
}
|
|
260
|
+
return Promise.resolve({
|
|
261
|
+
logs,
|
|
262
|
+
maxLogsHit: false,
|
|
263
|
+
});
|
|
264
|
+
}
|
|
187
265
|
/**
|
|
188
266
|
* Get the extended contract data for this contract.
|
|
189
267
|
* @param contractAddress - The contract data address.
|
|
@@ -199,7 +277,7 @@ export class MemoryArchiverStore {
|
|
|
199
277
|
* @returns All extended contract data in the block (if found).
|
|
200
278
|
*/
|
|
201
279
|
getExtendedContractDataInBlock(blockNum) {
|
|
202
|
-
if (blockNum > this.
|
|
280
|
+
if (blockNum > this.l2BlockContexts.length) {
|
|
203
281
|
return Promise.resolve([]);
|
|
204
282
|
}
|
|
205
283
|
return Promise.resolve(this.extendedContractDataByBlock[blockNum] || []);
|
|
@@ -214,8 +292,8 @@ export class MemoryArchiverStore {
|
|
|
214
292
|
if (contractAddress.isZero()) {
|
|
215
293
|
return Promise.resolve(undefined);
|
|
216
294
|
}
|
|
217
|
-
for (const
|
|
218
|
-
for (const contractData of block.newContractData) {
|
|
295
|
+
for (const blockContext of this.l2BlockContexts) {
|
|
296
|
+
for (const contractData of blockContext.block.newContractData) {
|
|
219
297
|
if (contractData.contractAddress.equals(contractAddress)) {
|
|
220
298
|
return Promise.resolve(contractData);
|
|
221
299
|
}
|
|
@@ -230,10 +308,10 @@ export class MemoryArchiverStore {
|
|
|
230
308
|
* @returns ContractData with the portal address (if we didn't throw an error).
|
|
231
309
|
*/
|
|
232
310
|
getContractDataInBlock(l2BlockNum) {
|
|
233
|
-
if (l2BlockNum > this.
|
|
311
|
+
if (l2BlockNum > this.l2BlockContexts.length) {
|
|
234
312
|
return Promise.resolve([]);
|
|
235
313
|
}
|
|
236
|
-
const block = this.
|
|
314
|
+
const block = this.l2BlockContexts[l2BlockNum].block;
|
|
237
315
|
return Promise.resolve(block.newContractData);
|
|
238
316
|
}
|
|
239
317
|
/**
|
|
@@ -241,16 +319,9 @@ export class MemoryArchiverStore {
|
|
|
241
319
|
* @returns The number of the latest L2 block processed.
|
|
242
320
|
*/
|
|
243
321
|
getBlockNumber() {
|
|
244
|
-
if (this.
|
|
322
|
+
if (this.l2BlockContexts.length === 0)
|
|
245
323
|
return Promise.resolve(INITIAL_L2_BLOCK_NUM - 1);
|
|
246
|
-
return Promise.resolve(this.
|
|
247
|
-
}
|
|
248
|
-
/**
|
|
249
|
-
* Gets the length of L2 blocks in store.
|
|
250
|
-
* @returns The length of L2 Blocks array.
|
|
251
|
-
*/
|
|
252
|
-
getBlocksLength() {
|
|
253
|
-
return this.l2Blocks.length;
|
|
324
|
+
return Promise.resolve(this.l2BlockContexts[this.l2BlockContexts.length - 1].block.number);
|
|
254
325
|
}
|
|
255
326
|
}
|
|
256
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJjaGl2ZXJfc3RvcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXJjaGl2ZXIvYXJjaGl2ZXJfc3RvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFNLG1DQUFtQyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFN0UsT0FBTyxFQUdMLG9CQUFvQixFQUtwQixPQUFPLEdBRVIsTUFBTSxjQUFjLENBQUM7QUFFdEIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLHlCQUF5QixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFxSTVGOztHQUVHO0FBQ0gsTUFBTSxPQUFPLG1CQUFtQjtJQTRDOUI7UUEzQ0E7O1dBRUc7UUFDSyxhQUFRLEdBQWMsRUFBRSxDQUFDO1FBRWpDOztXQUVHO1FBQ0ssVUFBSyxHQUFXLEVBQUUsQ0FBQztRQUUzQjs7O1dBR0c7UUFDSyxrQkFBYSxHQUFvQixFQUFFLENBQUM7UUFFNUM7OztXQUdHO1FBQ0ssb0JBQWUsR0FBb0IsRUFBRSxDQUFDO1FBRTlDOztXQUVHO1FBQ0ssZ0NBQTJCLEdBQTJDLEVBQUUsQ0FBQztRQUVqRjs7V0FFRztRQUNLLHlCQUFvQixHQUFzQyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBRTVFOzs7V0FHRztRQUNLLDRCQUF1QixHQUF1QixJQUFJLGtCQUFrQixFQUFFLENBQUM7UUFFL0U7O1dBRUc7UUFDSywwQkFBcUIsR0FBOEIsSUFBSSx5QkFBeUIsRUFBRSxDQUFDO0lBRTVFLENBQUM7SUFFaEI7Ozs7T0FJRztJQUNJLFdBQVcsQ0FBQyxNQUFpQjtRQUNsQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDO1FBQzlCLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDcEQs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
|
|
327
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJjaGl2ZXJfc3RvcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXJjaGl2ZXIvYXJjaGl2ZXJfc3RvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFNLG1DQUFtQyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFN0UsT0FBTyxFQUdMLHdCQUF3QixFQUV4QixvQkFBb0IsRUFHcEIsY0FBYyxFQUlkLEtBQUssRUFDTCxPQUFPLEVBRVAsZ0JBQWdCLEdBQ2pCLE1BQU0sY0FBYyxDQUFDO0FBRXRCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSx5QkFBeUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBc0k1Rjs7R0FFRztBQUNILE1BQU0sT0FBTyxtQkFBbUI7SUE0QzlCO0lBQ0Usa0ZBQWtGO0lBQ2xFLE9BQWU7UUFBZixZQUFPLEdBQVAsT0FBTyxDQUFRO1FBN0NqQzs7V0FFRztRQUNLLG9CQUFlLEdBQXFCLEVBQUUsQ0FBQztRQUUvQzs7V0FFRztRQUNLLFVBQUssR0FBVyxFQUFFLENBQUM7UUFFM0I7OztXQUdHO1FBQ0ssMEJBQXFCLEdBQW9CLEVBQUUsQ0FBQztRQUVwRDs7O1dBR0c7UUFDSyw0QkFBdUIsR0FBb0IsRUFBRSxDQUFDO1FBRXREOztXQUVHO1FBQ0ssZ0NBQTJCLEdBQTJDLEVBQUUsQ0FBQztRQUVqRjs7V0FFRztRQUNLLHlCQUFvQixHQUFzQyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBRTVFOzs7V0FHRztRQUNLLDRCQUF1QixHQUF1QixJQUFJLGtCQUFrQixFQUFFLENBQUM7UUFFL0U7O1dBRUc7UUFDSywwQkFBcUIsR0FBOEIsSUFBSSx5QkFBeUIsRUFBRSxDQUFDO0lBS3hGLENBQUM7SUFFSjs7OztPQUlHO0lBQ0ksU0FBUyxDQUFDLE1BQWlCO1FBQ2hDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFD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
|
|
@@ -25,10 +25,6 @@ export interface ArchiverConfig {
|
|
|
25
25
|
* The polling interval viem uses in ms
|
|
26
26
|
*/
|
|
27
27
|
viemPollingIntervalMS?: number;
|
|
28
|
-
/**
|
|
29
|
-
* Eth block from which we start scanning for L2Blocks.
|
|
30
|
-
*/
|
|
31
|
-
searchStartBlock: number;
|
|
32
28
|
/**
|
|
33
29
|
* The deployed L1 contract addresses
|
|
34
30
|
*/
|
|
@@ -37,6 +33,8 @@ export interface ArchiverConfig {
|
|
|
37
33
|
* Optional dir to store data. If omitted will store in memory.
|
|
38
34
|
*/
|
|
39
35
|
dataDirectory?: string;
|
|
36
|
+
/** The max number of logs that can be obtained in 1 "getUnencryptedLogs" call. */
|
|
37
|
+
maxLogs?: number;
|
|
40
38
|
}
|
|
41
39
|
/**
|
|
42
40
|
* Returns the archiver configuration from the environment variables.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/archiver/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAGtD;;;;;GAKG;AAEH;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;IAEf;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,yBAAyB,CAAC,EAAE,MAAM,CAAC;IAEnC;;OAEG;IACH,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAE/B;;OAEG;IACH,
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/archiver/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAGtD;;;;;GAKG;AAEH;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;IAEf;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,yBAAyB,CAAC,EAAE,MAAM,CAAC;IAEnC;;OAEG;IACH,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAE/B;;OAEG;IACH,WAAW,EAAE,mBAAmB,CAAC;IAEjC;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,kFAAkF;IAClF,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,IAAI,cAAc,CAgCjD"}
|
package/dest/archiver/config.js
CHANGED
|
@@ -5,7 +5,7 @@ import { EthAddress } from '@aztec/foundation/eth-address';
|
|
|
5
5
|
* @returns The archiver configuration.
|
|
6
6
|
*/
|
|
7
7
|
export function getConfigEnvVars() {
|
|
8
|
-
const { ETHEREUM_HOST, ARCHIVER_POLLING_INTERVAL_MS, ARCHIVER_VIEM_POLLING_INTERVAL_MS, ROLLUP_CONTRACT_ADDRESS, CONTRACT_DEPLOYMENT_EMITTER_ADDRESS,
|
|
8
|
+
const { ETHEREUM_HOST, ARCHIVER_POLLING_INTERVAL_MS, ARCHIVER_VIEM_POLLING_INTERVAL_MS, ROLLUP_CONTRACT_ADDRESS, CONTRACT_DEPLOYMENT_EMITTER_ADDRESS, API_KEY, INBOX_CONTRACT_ADDRESS, OUTBOX_CONTRACT_ADDRESS, REGISTRY_CONTRACT_ADDRESS, DATA_DIRECTORY, } = process.env;
|
|
9
9
|
// Populate the relevant addresses for use by the archiver.
|
|
10
10
|
const addresses = {
|
|
11
11
|
rollupAddress: ROLLUP_CONTRACT_ADDRESS ? EthAddress.fromString(ROLLUP_CONTRACT_ADDRESS) : EthAddress.ZERO,
|
|
@@ -21,10 +21,9 @@ export function getConfigEnvVars() {
|
|
|
21
21
|
rpcUrl: ETHEREUM_HOST || 'http://127.0.0.1:8545/',
|
|
22
22
|
archiverPollingIntervalMS: ARCHIVER_POLLING_INTERVAL_MS ? +ARCHIVER_POLLING_INTERVAL_MS : 1000,
|
|
23
23
|
viemPollingIntervalMS: ARCHIVER_VIEM_POLLING_INTERVAL_MS ? +ARCHIVER_VIEM_POLLING_INTERVAL_MS : 1000,
|
|
24
|
-
searchStartBlock: SEARCH_START_BLOCK ? +SEARCH_START_BLOCK : 0,
|
|
25
24
|
apiKey: API_KEY,
|
|
26
25
|
l1Contracts: addresses,
|
|
27
26
|
dataDirectory: DATA_DIRECTORY,
|
|
28
27
|
};
|
|
29
28
|
}
|
|
30
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
29
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FyY2hpdmVyL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUErQzNEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsZ0JBQWdCO0lBQzlCLE1BQU0sRUFDSixhQUFhLEVBQ2IsNEJBQTRCLEVBQzVCLGlDQUFpQyxFQUNqQyx1QkFBdUIsRUFDdkIsbUNBQW1DLEVBQ25DLE9BQU8sRUFDUCxzQkFBc0IsRUFDdEIsdUJBQXVCLEVBQ3ZCLHlCQUF5QixFQUN6QixjQUFjLEdBQ2YsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDO0lBQ2hCLDJEQUEyRDtJQUMzRCxNQUFNLFNBQVMsR0FBd0I7UUFDckMsYUFBYSxFQUFFLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJO1FBQ3pHLGVBQWUsRUFBRSx5QkFBeUIsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSTtRQUMvRyxZQUFZLEVBQUUsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUk7UUFDdEcsYUFBYSxFQUFFLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJO1FBQ3pHLGdDQUFnQyxFQUFFLG1DQUFtQztZQUNuRSxDQUFDLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxtQ0FBbUMsQ0FBQztZQUM1RCxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUk7UUFDbkIsb0JBQW9CLEVBQUUsVUFBVSxDQUFDLElBQUk7S0FDdEMsQ0FBQztJQUNGLE9BQU87UUFDTCxNQUFNLEVBQUUsYUFBYSxJQUFJLHdCQUF3QjtRQUNqRCx5QkFBeUIsRUFBRSw0QkFBNEIsQ0FBQyxDQUFDLENBQUMsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDLENBQUMsSUFBSztRQUMvRixxQkFBcUIsRUFBRSxpQ0FBaUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDLENBQUMsSUFBSztRQUNyRyxNQUFNLEVBQUUsT0FBTztRQUNmLFdBQVcsRUFBRSxTQUFTO1FBQ3RCLGFBQWEsRUFBRSxjQUFjO0tBQzlCLENBQUM7QUFDSixDQUFDIn0=
|
package/dest/index.js
CHANGED
|
@@ -12,13 +12,14 @@ const log = createDebugLogger('aztec:archiver');
|
|
|
12
12
|
// eslint-disable-next-line require-await
|
|
13
13
|
async function main() {
|
|
14
14
|
const config = getConfigEnvVars();
|
|
15
|
-
const { rpcUrl, l1Contracts
|
|
15
|
+
const { rpcUrl, l1Contracts } = config;
|
|
16
16
|
const publicClient = createPublicClient({
|
|
17
17
|
chain: localhost,
|
|
18
18
|
transport: http(rpcUrl),
|
|
19
19
|
});
|
|
20
|
-
const archiverStore = new MemoryArchiverStore();
|
|
21
|
-
const archiver = new Archiver(publicClient, l1Contracts.rollupAddress, l1Contracts.inboxAddress, l1Contracts.registryAddress, l1Contracts.contractDeploymentEmitterAddress,
|
|
20
|
+
const archiverStore = new MemoryArchiverStore(1000);
|
|
21
|
+
const archiver = new Archiver(publicClient, l1Contracts.rollupAddress, l1Contracts.inboxAddress, l1Contracts.registryAddress, l1Contracts.contractDeploymentEmitterAddress, 0, // searchStartBlock
|
|
22
|
+
archiverStore);
|
|
22
23
|
const shutdown = async () => {
|
|
23
24
|
await archiver.stop();
|
|
24
25
|
process.exit(0);
|
|
@@ -34,4 +35,4 @@ if (process.argv[1] === fileURLToPath(import.meta.url).replace(/\/index\.js$/, '
|
|
|
34
35
|
process.exit(1);
|
|
35
36
|
});
|
|
36
37
|
}
|
|
37
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
38
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRXRELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxJQUFJLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDaEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUV4QyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsUUFBUSxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFakUsY0FBYyxxQkFBcUIsQ0FBQztBQUVwQyxNQUFNLEdBQUcsR0FBRyxpQkFBaUIsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0FBRWhEOztHQUVHO0FBQ0gseUNBQXlDO0FBQ3pDLEtBQUssVUFBVSxJQUFJO0lBQ2pCLE1BQU0sTUFBTSxHQUFHLGdCQUFnQixFQUFFLENBQUM7SUFDbEMsTUFBTSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsR0FBRyxNQUFNLENBQUM7SUFFdkMsTUFBTSxZQUFZLEdBQUcsa0JBQWtCLENBQUM7UUFDdEMsS0FBSyxFQUFFLFNBQVM7UUFDaEIsU0FBUyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUM7S0FDeEIsQ0FBQyxDQUFDO0lBRUgsTUFBTSxhQUFhLEdBQUcsSUFBSSxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUVwRCxNQUFNLFFBQVEsR0FBRyxJQUFJLFFBQVEsQ0FDM0IsWUFBWSxFQUNaLFdBQVcsQ0FBQyxhQUFhLEVBQ3pCLFdBQVcsQ0FBQyxZQUFZLEVBQ3hCLFdBQVcsQ0FBQyxlQUFlLEVBQzNCLFdBQVcsQ0FBQyxnQ0FBZ0MsRUFDNUMsQ0FBQyxFQUFFLG1CQUFtQjtJQUN0QixhQUFhLENBQ2QsQ0FBQztJQUVGLE1BQU0sUUFBUSxHQUFHLEtBQUssSUFBSSxFQUFFO1FBQzFCLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3RCLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEIsQ0FBQyxDQUFDO0lBQ0YsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDakMsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFDcEMsQ0FBQztBQUVELGlFQUFpRTtBQUNqRSxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssYUFBYSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUMsRUFBRTtJQUNsRixtRUFBbUU7SUFDbkUsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1FBQ2pCLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDZixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xCLENBQUMsQ0FBQyxDQUFDO0NBQ0oifQ==
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/archiver",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.12",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": "./dest/index.js",
|
|
6
6
|
"typedocOptions": {
|
|
@@ -34,11 +34,11 @@
|
|
|
34
34
|
"rootDir": "./src"
|
|
35
35
|
},
|
|
36
36
|
"dependencies": {
|
|
37
|
-
"@aztec/circuits.js": "0.8.
|
|
38
|
-
"@aztec/ethereum": "0.8.
|
|
39
|
-
"@aztec/foundation": "0.8.
|
|
40
|
-
"@aztec/l1-artifacts": "0.8.
|
|
41
|
-
"@aztec/types": "0.8.
|
|
37
|
+
"@aztec/circuits.js": "0.8.12",
|
|
38
|
+
"@aztec/ethereum": "0.8.12",
|
|
39
|
+
"@aztec/foundation": "0.8.12",
|
|
40
|
+
"@aztec/l1-artifacts": "0.8.12",
|
|
41
|
+
"@aztec/types": "0.8.12",
|
|
42
42
|
"@types/lodash.omit": "^4.5.7",
|
|
43
43
|
"debug": "^4.3.4",
|
|
44
44
|
"lodash.omit": "^4.5.0",
|
package/src/archiver/archiver.ts
CHANGED
|
@@ -5,12 +5,13 @@ import { EthAddress } from '@aztec/foundation/eth-address';
|
|
|
5
5
|
import { Fr } from '@aztec/foundation/fields';
|
|
6
6
|
import { DebugLogger, createDebugLogger } from '@aztec/foundation/log';
|
|
7
7
|
import { RunningPromise } from '@aztec/foundation/running-promise';
|
|
8
|
+
import { RegistryAbi } from '@aztec/l1-artifacts';
|
|
8
9
|
import {
|
|
9
10
|
ContractData,
|
|
10
11
|
ContractDataSource,
|
|
11
12
|
EncodedContractFunction,
|
|
12
13
|
ExtendedContractData,
|
|
13
|
-
|
|
14
|
+
GetUnencryptedLogsResponse,
|
|
14
15
|
L1ToL2Message,
|
|
15
16
|
L1ToL2MessageSource,
|
|
16
17
|
L2Block,
|
|
@@ -18,12 +19,13 @@ import {
|
|
|
18
19
|
L2BlockSource,
|
|
19
20
|
L2LogsSource,
|
|
20
21
|
L2Tx,
|
|
22
|
+
LogFilter,
|
|
21
23
|
LogType,
|
|
22
24
|
TxHash,
|
|
23
25
|
} from '@aztec/types';
|
|
24
26
|
|
|
25
27
|
import omit from 'lodash.omit';
|
|
26
|
-
import { Chain, HttpTransport, PublicClient, createPublicClient, http } from 'viem';
|
|
28
|
+
import { Chain, HttpTransport, PublicClient, createPublicClient, getContract, http } from 'viem';
|
|
27
29
|
|
|
28
30
|
import { ArchiverDataStore, MemoryArchiverStore } from './archiver_store.js';
|
|
29
31
|
import { ArchiverConfig } from './config.js';
|
|
@@ -48,17 +50,17 @@ export class Archiver implements L2BlockSource, L2LogsSource, ContractDataSource
|
|
|
48
50
|
/**
|
|
49
51
|
* Next L1 block number to fetch `L2BlockProcessed` logs from (i.e. `fromBlock` in eth_getLogs).
|
|
50
52
|
*/
|
|
51
|
-
private
|
|
53
|
+
private nextL2BlockFromL1Block = 0n;
|
|
52
54
|
|
|
53
55
|
/**
|
|
54
56
|
* Last Processed Block Number
|
|
55
57
|
*/
|
|
56
|
-
private
|
|
58
|
+
private lastProcessedL1BlockNumber = 0n;
|
|
57
59
|
|
|
58
60
|
/**
|
|
59
61
|
* Use this to track logged block in order to avoid repeating the same message.
|
|
60
62
|
*/
|
|
61
|
-
private
|
|
63
|
+
private lastLoggedL1BlockNumber = 0n;
|
|
62
64
|
|
|
63
65
|
/**
|
|
64
66
|
* Creates a new instance of the Archiver.
|
|
@@ -83,8 +85,8 @@ export class Archiver implements L2BlockSource, L2LogsSource, ContractDataSource
|
|
|
83
85
|
private readonly pollingIntervalMs = 10_000,
|
|
84
86
|
private readonly log: DebugLogger = createDebugLogger('aztec:archiver'),
|
|
85
87
|
) {
|
|
86
|
-
this.
|
|
87
|
-
this.
|
|
88
|
+
this.nextL2BlockFromL1Block = BigInt(searchStartBlock);
|
|
89
|
+
this.lastProcessedL1BlockNumber = BigInt(searchStartBlock);
|
|
88
90
|
}
|
|
89
91
|
|
|
90
92
|
/**
|
|
@@ -100,14 +102,24 @@ export class Archiver implements L2BlockSource, L2LogsSource, ContractDataSource
|
|
|
100
102
|
transport: http(chain.rpcUrl),
|
|
101
103
|
pollingInterval: config.viemPollingIntervalMS,
|
|
102
104
|
});
|
|
103
|
-
|
|
105
|
+
|
|
106
|
+
// ask the registry for the block number when the rollup was deployed
|
|
107
|
+
// this is the block from which archiver has to search from
|
|
108
|
+
const registryContract = getContract({
|
|
109
|
+
address: config.l1Contracts.registryAddress.toString(),
|
|
110
|
+
abi: RegistryAbi,
|
|
111
|
+
publicClient,
|
|
112
|
+
});
|
|
113
|
+
const searchStartBlock = Number((await registryContract.read.getCurrentSnapshot()).blockNumber);
|
|
114
|
+
|
|
115
|
+
const archiverStore = new MemoryArchiverStore(config.maxLogs ?? 1000);
|
|
104
116
|
const archiver = new Archiver(
|
|
105
117
|
publicClient,
|
|
106
118
|
config.l1Contracts.rollupAddress,
|
|
107
119
|
config.l1Contracts.inboxAddress,
|
|
108
120
|
config.l1Contracts.registryAddress,
|
|
109
121
|
config.l1Contracts.contractDeploymentEmitterAddress,
|
|
110
|
-
|
|
122
|
+
searchStartBlock,
|
|
111
123
|
archiverStore,
|
|
112
124
|
config.archiverPollingIntervalMS,
|
|
113
125
|
);
|
|
@@ -138,12 +150,12 @@ export class Archiver implements L2BlockSource, L2LogsSource, ContractDataSource
|
|
|
138
150
|
* @param blockUntilSynced - If true, blocks until the archiver has fully synced.
|
|
139
151
|
*/
|
|
140
152
|
private async sync(blockUntilSynced: boolean) {
|
|
141
|
-
const
|
|
142
|
-
if (
|
|
153
|
+
const currentL1BlockNumber = await this.publicClient.getBlockNumber();
|
|
154
|
+
if (currentL1BlockNumber <= this.lastProcessedL1BlockNumber) {
|
|
143
155
|
// reducing logs, otherwise this gets triggered on every loop (1s)
|
|
144
|
-
if (
|
|
145
|
-
this.log(`No new blocks to process, current block number: ${
|
|
146
|
-
this.
|
|
156
|
+
if (currentL1BlockNumber !== this.lastLoggedL1BlockNumber) {
|
|
157
|
+
this.log(`No new blocks to process, current block number: ${currentL1BlockNumber}`);
|
|
158
|
+
this.lastLoggedL1BlockNumber = currentL1BlockNumber;
|
|
147
159
|
}
|
|
148
160
|
return;
|
|
149
161
|
}
|
|
@@ -165,7 +177,7 @@ export class Archiver implements L2BlockSource, L2LogsSource, ContractDataSource
|
|
|
165
177
|
* This is a problem for example when setting the last block number marker for L1 to L2 messages -
|
|
166
178
|
* this.lastProcessedBlockNumber = currentBlockNumber;
|
|
167
179
|
* It's possible that we actually received messages in block currentBlockNumber + 1 meaning the next time
|
|
168
|
-
* we do this sync we get the same message again.
|
|
180
|
+
* we do this sync we get the same message again. Additionally, the call to get cancelled L1 to L2 messages
|
|
169
181
|
* could read from a block not present when retrieving pending messages. If a message was added and cancelled
|
|
170
182
|
* in the same eth block then we could try and cancel a non-existent pending message.
|
|
171
183
|
*
|
|
@@ -182,15 +194,15 @@ export class Archiver implements L2BlockSource, L2LogsSource, ContractDataSource
|
|
|
182
194
|
this.publicClient,
|
|
183
195
|
this.inboxAddress,
|
|
184
196
|
blockUntilSynced,
|
|
185
|
-
this.
|
|
186
|
-
|
|
197
|
+
this.lastProcessedL1BlockNumber + 1n, // + 1 to prevent re-including messages from the last processed block
|
|
198
|
+
currentL1BlockNumber,
|
|
187
199
|
);
|
|
188
200
|
const retrievedCancelledL1ToL2Messages = await retrieveNewCancelledL1ToL2Messages(
|
|
189
201
|
this.publicClient,
|
|
190
202
|
this.inboxAddress,
|
|
191
203
|
blockUntilSynced,
|
|
192
|
-
this.
|
|
193
|
-
|
|
204
|
+
this.lastProcessedL1BlockNumber + 1n,
|
|
205
|
+
currentL1BlockNumber,
|
|
194
206
|
);
|
|
195
207
|
|
|
196
208
|
// TODO (#717): optimise this - there could be messages in confirmed that are also in pending.
|
|
@@ -202,21 +214,21 @@ export class Archiver implements L2BlockSource, L2LogsSource, ContractDataSource
|
|
|
202
214
|
this.log('Removing pending l1 to l2 messages from store where messages were cancelled');
|
|
203
215
|
await this.store.cancelPendingL1ToL2Messages(retrievedCancelledL1ToL2Messages.retrievedData);
|
|
204
216
|
|
|
205
|
-
this.
|
|
217
|
+
this.lastProcessedL1BlockNumber = currentL1BlockNumber;
|
|
206
218
|
|
|
207
219
|
// ********** Events that are processed per block **********
|
|
208
220
|
|
|
209
221
|
// Read all data from chain and then write to our stores at the end
|
|
210
|
-
const nextExpectedL2BlockNum = BigInt(this.store.
|
|
222
|
+
const nextExpectedL2BlockNum = BigInt((await this.store.getBlockNumber()) + 1);
|
|
211
223
|
this.log(
|
|
212
|
-
`Retrieving chain state from L1 block: ${this.
|
|
224
|
+
`Retrieving chain state from L1 block: ${this.nextL2BlockFromL1Block}, next expected l2 block number: ${nextExpectedL2BlockNum}`,
|
|
213
225
|
);
|
|
214
226
|
const retrievedBlocks = await retrieveBlocks(
|
|
215
227
|
this.publicClient,
|
|
216
228
|
this.rollupAddress,
|
|
217
229
|
blockUntilSynced,
|
|
218
|
-
this.
|
|
219
|
-
|
|
230
|
+
this.nextL2BlockFromL1Block,
|
|
231
|
+
currentL1BlockNumber,
|
|
220
232
|
nextExpectedL2BlockNum,
|
|
221
233
|
);
|
|
222
234
|
|
|
@@ -229,8 +241,8 @@ export class Archiver implements L2BlockSource, L2LogsSource, ContractDataSource
|
|
|
229
241
|
this.publicClient,
|
|
230
242
|
this.contractDeploymentEmitterAddress,
|
|
231
243
|
blockUntilSynced,
|
|
232
|
-
this.
|
|
233
|
-
|
|
244
|
+
this.nextL2BlockFromL1Block,
|
|
245
|
+
currentL1BlockNumber,
|
|
234
246
|
blockHashMapping,
|
|
235
247
|
);
|
|
236
248
|
if (retrievedBlocks.retrievedData.length === 0) {
|
|
@@ -268,14 +280,14 @@ export class Archiver implements L2BlockSource, L2LogsSource, ContractDataSource
|
|
|
268
280
|
|
|
269
281
|
// store retrieved L2 blocks after removing new logs information.
|
|
270
282
|
// remove logs to serve "lightweight" block information. Logs can be fetched separately if needed.
|
|
271
|
-
await this.store.
|
|
283
|
+
await this.store.addBlocks(
|
|
272
284
|
retrievedBlocks.retrievedData.map(block =>
|
|
273
285
|
L2Block.fromFields(omit(block, ['newEncryptedLogs', 'newUnencryptedLogs']), block.getBlockHash()),
|
|
274
286
|
),
|
|
275
287
|
);
|
|
276
288
|
|
|
277
289
|
// set the L1 block for the next search
|
|
278
|
-
this.
|
|
290
|
+
this.nextL2BlockFromL1Block = retrievedBlocks.nextEthBlockNumber;
|
|
279
291
|
}
|
|
280
292
|
|
|
281
293
|
/**
|
|
@@ -304,8 +316,8 @@ export class Archiver implements L2BlockSource, L2LogsSource, ContractDataSource
|
|
|
304
316
|
* @param limit - The number of blocks to return.
|
|
305
317
|
* @returns The requested L2 blocks.
|
|
306
318
|
*/
|
|
307
|
-
public
|
|
308
|
-
return this.store.
|
|
319
|
+
public getBlocks(from: number, limit: number): Promise<L2Block[]> {
|
|
320
|
+
return this.store.getBlocks(from, limit);
|
|
309
321
|
}
|
|
310
322
|
|
|
311
323
|
/**
|
|
@@ -313,12 +325,12 @@ export class Archiver implements L2BlockSource, L2LogsSource, ContractDataSource
|
|
|
313
325
|
* @param number - The block number to return (inclusive).
|
|
314
326
|
* @returns The requested L2 block.
|
|
315
327
|
*/
|
|
316
|
-
public async
|
|
328
|
+
public async getBlock(number: number): Promise<L2Block | undefined> {
|
|
317
329
|
// If the number provided is -ve, then return the latest block.
|
|
318
330
|
if (number < 0) {
|
|
319
|
-
number = this.store.
|
|
331
|
+
number = await this.store.getBlockNumber();
|
|
320
332
|
}
|
|
321
|
-
const blocks = await this.store.
|
|
333
|
+
const blocks = await this.store.getBlocks(number, 1);
|
|
322
334
|
return blocks.length === 0 ? undefined : blocks[0];
|
|
323
335
|
}
|
|
324
336
|
|
|
@@ -389,6 +401,15 @@ export class Archiver implements L2BlockSource, L2LogsSource, ContractDataSource
|
|
|
389
401
|
return this.store.getLogs(from, limit, logType);
|
|
390
402
|
}
|
|
391
403
|
|
|
404
|
+
/**
|
|
405
|
+
* Gets unencrypted logs based on the provided filter.
|
|
406
|
+
* @param filter - The filter to apply to the logs.
|
|
407
|
+
* @returns The requested logs.
|
|
408
|
+
*/
|
|
409
|
+
getUnencryptedLogs(filter: LogFilter): Promise<GetUnencryptedLogsResponse> {
|
|
410
|
+
return this.store.getUnencryptedLogs(filter);
|
|
411
|
+
}
|
|
412
|
+
|
|
392
413
|
/**
|
|
393
414
|
* Gets the number of the latest L2 block processed by the block source implementation.
|
|
394
415
|
* @returns The number of the latest L2 block processed by the block source implementation.
|