@aztec/archiver 0.29.0 → 0.30.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dest/archiver/archiver.d.ts +2 -2
- package/dest/archiver/archiver.d.ts.map +1 -1
- package/dest/archiver/archiver.js +25 -26
- package/dest/archiver/archiver_store.d.ts +7 -7
- package/dest/archiver/archiver_store.d.ts.map +1 -1
- package/dest/archiver/archiver_store_test_suite.d.ts.map +1 -1
- package/dest/archiver/archiver_store_test_suite.js +42 -39
- package/dest/archiver/config.d.ts.map +1 -1
- package/dest/archiver/config.js +6 -2
- package/dest/archiver/data_retrieval.d.ts +5 -6
- package/dest/archiver/data_retrieval.d.ts.map +1 -1
- package/dest/archiver/data_retrieval.js +5 -5
- package/dest/archiver/eth_log_handlers.d.ts +2 -2
- package/dest/archiver/eth_log_handlers.d.ts.map +1 -1
- package/dest/archiver/eth_log_handlers.js +3 -3
- package/dest/archiver/kv_archiver_store/block_store.d.ts +3 -2
- package/dest/archiver/kv_archiver_store/block_store.d.ts.map +1 -1
- package/dest/archiver/kv_archiver_store/block_store.js +10 -13
- package/dest/archiver/kv_archiver_store/kv_archiver_store.d.ts +7 -7
- package/dest/archiver/kv_archiver_store/kv_archiver_store.d.ts.map +1 -1
- package/dest/archiver/kv_archiver_store/kv_archiver_store.js +6 -7
- package/dest/archiver/kv_archiver_store/message_store.d.ts +5 -5
- package/dest/archiver/kv_archiver_store/message_store.d.ts.map +1 -1
- package/dest/archiver/kv_archiver_store/message_store.js +7 -11
- package/dest/archiver/memory_archiver_store/l1_to_l2_message_store.d.ts +2 -2
- package/dest/archiver/memory_archiver_store/l1_to_l2_message_store.d.ts.map +1 -1
- package/dest/archiver/memory_archiver_store/l1_to_l2_message_store.js +3 -3
- package/dest/archiver/memory_archiver_store/memory_archiver_store.d.ts +9 -8
- package/dest/archiver/memory_archiver_store/memory_archiver_store.d.ts.map +1 -1
- package/dest/archiver/memory_archiver_store/memory_archiver_store.js +15 -16
- package/package.json +9 -9
- package/src/archiver/archiver.ts +41 -45
- package/src/archiver/archiver_store.ts +8 -7
- package/src/archiver/archiver_store_test_suite.ts +60 -42
- package/src/archiver/config.ts +6 -0
- package/src/archiver/data_retrieval.ts +9 -9
- package/src/archiver/eth_log_handlers.ts +4 -4
- package/src/archiver/kv_archiver_store/block_store.ts +11 -12
- package/src/archiver/kv_archiver_store/kv_archiver_store.ts +8 -8
- package/src/archiver/kv_archiver_store/message_store.ts +9 -11
- package/src/archiver/memory_archiver_store/l1_to_l2_message_store.ts +3 -3
- package/src/archiver/memory_archiver_store/memory_archiver_store.ts +17 -18
|
@@ -37,6 +37,7 @@ export class MemoryArchiverStore {
|
|
|
37
37
|
this.l1ToL2Messages = new L1ToL2MessageStore();
|
|
38
38
|
this.contractClasses = new Map();
|
|
39
39
|
this.contractInstances = new Map();
|
|
40
|
+
this.lastL1BlockNewBlocks = 0n;
|
|
40
41
|
this.lastL1BlockNewMessages = 0n;
|
|
41
42
|
}
|
|
42
43
|
getContractClass(id) {
|
|
@@ -62,12 +63,13 @@ export class MemoryArchiverStore {
|
|
|
62
63
|
}
|
|
63
64
|
/**
|
|
64
65
|
* Append new blocks to the store's list.
|
|
65
|
-
* @param blocks - The L2 blocks to be added to the store.
|
|
66
|
-
* @returns True if the operation is successful
|
|
66
|
+
* @param blocks - The L2 blocks to be added to the store and the last processed L1 block.
|
|
67
|
+
* @returns True if the operation is successful.
|
|
67
68
|
*/
|
|
68
69
|
addBlocks(blocks) {
|
|
69
|
-
this.
|
|
70
|
-
this.
|
|
70
|
+
this.lastL1BlockNewBlocks = blocks.lastProcessedL1BlockNumber;
|
|
71
|
+
this.l2BlockContexts.push(...blocks.retrievedData.map(block => new L2BlockContext(block)));
|
|
72
|
+
this.txEffects.push(...blocks.retrievedData.flatMap(b => b.getTxs()));
|
|
71
73
|
return Promise.resolve(true);
|
|
72
74
|
}
|
|
73
75
|
/**
|
|
@@ -112,16 +114,15 @@ export class MemoryArchiverStore {
|
|
|
112
114
|
}
|
|
113
115
|
/**
|
|
114
116
|
* Append L1 to L2 messages to the store.
|
|
115
|
-
* @param messages - The L1 to L2 messages to be added to the store.
|
|
116
|
-
* @param lastMessageL1BlockNumber - The L1 block number in which the last message was emitted.
|
|
117
|
+
* @param messages - The L1 to L2 messages to be added to the store and the last processed L1 block.
|
|
117
118
|
* @returns True if the operation is successful.
|
|
118
119
|
*/
|
|
119
|
-
addL1ToL2Messages(messages
|
|
120
|
-
if (
|
|
120
|
+
addL1ToL2Messages(messages) {
|
|
121
|
+
if (messages.lastProcessedL1BlockNumber <= this.lastL1BlockNewMessages) {
|
|
121
122
|
return Promise.resolve(false);
|
|
122
123
|
}
|
|
123
|
-
this.lastL1BlockNewMessages =
|
|
124
|
-
for (const message of messages) {
|
|
124
|
+
this.lastL1BlockNewMessages = messages.lastProcessedL1BlockNumber;
|
|
125
|
+
for (const message of messages.retrievedData) {
|
|
125
126
|
this.l1ToL2Messages.addMessage(message);
|
|
126
127
|
}
|
|
127
128
|
return Promise.resolve(true);
|
|
@@ -129,7 +130,7 @@ export class MemoryArchiverStore {
|
|
|
129
130
|
/**
|
|
130
131
|
* Gets the L1 to L2 message index in the L1 to L2 message tree.
|
|
131
132
|
* @param l1ToL2Message - The L1 to L2 message.
|
|
132
|
-
* @returns The index of the L1 to L2 message in the L1 to L2 message tree.
|
|
133
|
+
* @returns The index of the L1 to L2 message in the L1 to L2 message tree (undefined if not found).
|
|
133
134
|
*/
|
|
134
135
|
getL1ToL2MessageIndex(l1ToL2Message) {
|
|
135
136
|
return Promise.resolve(this.l1ToL2Messages.getMessageIndex(l1ToL2Message));
|
|
@@ -287,12 +288,10 @@ export class MemoryArchiverStore {
|
|
|
287
288
|
return Promise.resolve(this.l2BlockContexts[this.l2BlockContexts.length - 1].block.number);
|
|
288
289
|
}
|
|
289
290
|
getSynchedL1BlockNumbers() {
|
|
290
|
-
const blocks = this.l2BlockContexts[this.l2BlockContexts.length - 1]?.block?.getL1BlockNumber() ?? 0n;
|
|
291
|
-
const messages = this.lastL1BlockNewMessages;
|
|
292
291
|
return Promise.resolve({
|
|
293
|
-
blocks,
|
|
294
|
-
messages,
|
|
292
|
+
blocks: this.lastL1BlockNewBlocks,
|
|
293
|
+
messages: this.lastL1BlockNewMessages,
|
|
295
294
|
});
|
|
296
295
|
}
|
|
297
296
|
}
|
|
298
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVtb3J5X2FyY2hpdmVyX3N0b3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FyY2hpdmVyL21lbW9yeV9hcmNoaXZlcl9zdG9yZS9tZW1vcnlfYXJjaGl2ZXJfc3RvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLHdCQUF3QixFQUl4QixjQUFjLEVBR2QsS0FBSyxFQUNMLE9BQU8sRUFHUCxTQUFTLEVBQ1QsUUFBUSxFQUNSLGdCQUFnQixHQUNqQixNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFBRSxFQUFFLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUs5RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUVqRTs7R0FFRztBQUNILE1BQU0sT0FBTyxtQkFBbUI7SUF1QzlCO0lBQ0Usa0ZBQWtGO0lBQ2xFLE9BQWU7UUFBZixZQUFPLEdBQVAsT0FBTyxDQUFRO1FBeENqQzs7V0FFRztRQUNLLG9CQUFlLEdBQXFCLEVBQUUsQ0FBQztRQUUvQzs7V0FFRztRQUNLLGtCQUFhLEdBQXNCLElBQUksR0FBRyxFQUFFLENBQUM7UUFFckQ7O1dBRUc7UUFDSyxjQUFTLEdBQWUsRUFBRSxDQUFDO1FBRW5DOzs7V0FHRztRQUNLLDBCQUFxQixHQUFvQixFQUFFLENBQUM7UUFFcEQ7OztXQUdHO1FBQ0ssNEJBQXVCLEdBQW9CLEVBQUUsQ0FBQztRQUV0RDs7V0FFRztRQUNLLG1CQUFjLEdBQUcsSUFBSSxrQkFBa0IsRUFBRSxDQUFDO1FBRTFDLG9CQUFlLEdBQXFDLElBQUksR0FBRyxFQUFFLENBQUM7UUFFOUQsc0JBQWlCLEdBQTZDLElBQUksR0FBRyxFQUFFLENBQUM7UUFFeEUsMkJBQXNCLEdBQVcsRUFBRSxDQUFDO0lBS3pDLENBQUM7SUFFRyxnQkFBZ0IsQ0FBQyxFQUFNO1FBQzVCLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENB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
|
|
297
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVtb3J5X2FyY2hpdmVyX3N0b3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FyY2hpdmVyL21lbW9yeV9hcmNoaXZlcl9zdG9yZS9tZW1vcnlfYXJjaGl2ZXJfc3RvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLHdCQUF3QixFQUl4QixjQUFjLEVBR2QsS0FBSyxFQUNMLE9BQU8sRUFHUCxTQUFTLEVBQ1QsUUFBUSxFQUNSLGdCQUFnQixHQUNqQixNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFBRSxFQUFFLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQU05RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUVqRTs7R0FFRztBQUNILE1BQU0sT0FBTyxtQkFBbUI7SUF3QzlCO0lBQ0Usa0ZBQWtGO0lBQ2xFLE9BQWU7UUFBZixZQUFPLEdBQVAsT0FBTyxDQUFRO1FBekNqQzs7V0FFRztRQUNLLG9CQUFlLEdBQXFCLEVBQUUsQ0FBQztRQUUvQzs7V0FFRztRQUNLLGtCQUFhLEdBQXNCLElBQUksR0FBRyxFQUFFLENBQUM7UUFFckQ7O1dBRUc7UUFDSyxjQUFTLEdBQWUsRUFBRSxDQUFDO1FBRW5DOzs7V0FHRztRQUNLLDBCQUFxQixHQUFvQixFQUFFLENBQUM7UUFFcEQ7OztXQUdHO1FBQ0ssNEJBQXVCLEdBQW9CLEVBQUUsQ0FBQztRQUV0RDs7V0FFRztRQUNLLG1CQUFjLEdBQUcsSUFBSSxrQkFBa0IsRUFBRSxDQUFDO1FBRTFDLG9CQUFlLEdBQXFDLElBQUksR0FBRyxFQUFFLENBQUM7UUFFOUQsc0JBQWlCLEdBQTZDLElBQUksR0FBRyxFQUFFLENBQUM7UUFFeEUseUJBQW9CLEdBQVcsRUFBRSxDQUFDO1FBQ2xDLDJCQUFzQixHQUFXLEVBQUUsQ0FBQztJQUt6QyxDQUFDO0lBRUcsZ0JBQWdCLENBQUMsRUFBTTtRQUM1QixPQUFP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
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/archiver",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.30.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": "./dest/index.js",
|
|
6
6
|
"typedocOptions": {
|
|
@@ -35,14 +35,14 @@
|
|
|
35
35
|
"workerThreads": true
|
|
36
36
|
},
|
|
37
37
|
"dependencies": {
|
|
38
|
-
"@aztec/circuit-types": "0.
|
|
39
|
-
"@aztec/circuits.js": "0.
|
|
40
|
-
"@aztec/ethereum": "0.
|
|
41
|
-
"@aztec/foundation": "0.
|
|
42
|
-
"@aztec/kv-store": "0.
|
|
43
|
-
"@aztec/l1-artifacts": "0.
|
|
44
|
-
"@aztec/protocol-contracts": "0.
|
|
45
|
-
"@aztec/types": "0.
|
|
38
|
+
"@aztec/circuit-types": "0.30.0",
|
|
39
|
+
"@aztec/circuits.js": "0.30.0",
|
|
40
|
+
"@aztec/ethereum": "0.30.0",
|
|
41
|
+
"@aztec/foundation": "0.30.0",
|
|
42
|
+
"@aztec/kv-store": "0.30.0",
|
|
43
|
+
"@aztec/l1-artifacts": "0.30.0",
|
|
44
|
+
"@aztec/protocol-contracts": "0.30.0",
|
|
45
|
+
"@aztec/types": "0.30.0",
|
|
46
46
|
"debug": "^4.3.4",
|
|
47
47
|
"lmdb": "^2.9.2",
|
|
48
48
|
"lodash.omit": "^4.5.0",
|
package/src/archiver/archiver.ts
CHANGED
|
@@ -33,6 +33,7 @@ import { Chain, HttpTransport, PublicClient, createPublicClient, http } from 'vi
|
|
|
33
33
|
import { ArchiverDataStore } from './archiver_store.js';
|
|
34
34
|
import { ArchiverConfig } from './config.js';
|
|
35
35
|
import {
|
|
36
|
+
DataRetrieval,
|
|
36
37
|
retrieveBlockBodiesFromAvailabilityOracle,
|
|
37
38
|
retrieveBlockMetadataFromRollup,
|
|
38
39
|
retrieveL1ToL2Messages,
|
|
@@ -195,12 +196,7 @@ export class Archiver implements ArchiveSource {
|
|
|
195
196
|
);
|
|
196
197
|
}
|
|
197
198
|
|
|
198
|
-
await this.store.addL1ToL2Messages(
|
|
199
|
-
retrievedL1ToL2Messages.retrievedData,
|
|
200
|
-
// -1n because the function expects the last block in which the message was emitted and not the one after next
|
|
201
|
-
// TODO(#5264): Check whether this could be cleaned up - `nextEthBlockNumber` value doesn't seem to be used much
|
|
202
|
-
retrievedL1ToL2Messages.nextEthBlockNumber - 1n,
|
|
203
|
-
);
|
|
199
|
+
await this.store.addL1ToL2Messages(retrievedL1ToL2Messages);
|
|
204
200
|
|
|
205
201
|
// Read all data from chain and then write to our stores at the end
|
|
206
202
|
const nextExpectedL2BlockNum = BigInt((await this.store.getSynchedL2BlockNumber()) + 1);
|
|
@@ -214,50 +210,50 @@ export class Archiver implements ArchiveSource {
|
|
|
214
210
|
);
|
|
215
211
|
|
|
216
212
|
const blockBodies = retrievedBlockBodies.retrievedData.map(([blockBody]) => blockBody);
|
|
217
|
-
|
|
218
213
|
await this.store.addBlockBodies(blockBodies);
|
|
219
214
|
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
215
|
+
// Now that we have block bodies we will retrieve block metadata and build L2 blocks from the bodies and
|
|
216
|
+
// the metadata
|
|
217
|
+
let retrievedBlocks: DataRetrieval<L2Block>;
|
|
218
|
+
{
|
|
219
|
+
const retrievedBlockMetadata = await retrieveBlockMetadataFromRollup(
|
|
220
|
+
this.publicClient,
|
|
221
|
+
this.rollupAddress,
|
|
222
|
+
blockUntilSynced,
|
|
223
|
+
lastL1Blocks.blocks + 1n,
|
|
224
|
+
currentL1BlockNumber,
|
|
225
|
+
nextExpectedL2BlockNum,
|
|
226
|
+
);
|
|
232
227
|
|
|
233
|
-
|
|
228
|
+
const retrievedBodyHashes = retrievedBlockMetadata.retrievedData.map(
|
|
229
|
+
([header]) => header.contentCommitment.txsEffectsHash,
|
|
230
|
+
);
|
|
234
231
|
|
|
235
|
-
|
|
236
|
-
throw new Error('Block headers length does not equal block bodies length');
|
|
237
|
-
}
|
|
232
|
+
const blockBodiesFromStore = await this.store.getBlockBodies(retrievedBodyHashes);
|
|
238
233
|
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
new L2Block(blockMetadata[1], blockMetadata[0], blockBodiesFromStore[i], blockMetadata[2]),
|
|
243
|
-
),
|
|
244
|
-
};
|
|
234
|
+
if (retrievedBlockMetadata.retrievedData.length !== blockBodiesFromStore.length) {
|
|
235
|
+
throw new Error('Block headers length does not equal block bodies length');
|
|
236
|
+
}
|
|
245
237
|
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
} else {
|
|
249
|
-
this.log(
|
|
250
|
-
`Retrieved ${retrievedBlocks.retrievedData.length} new L2 blocks between L1 blocks ${
|
|
251
|
-
lastL1Blocks.blocks + 1n
|
|
252
|
-
} and ${currentL1BlockNumber}.`,
|
|
238
|
+
const blocks = retrievedBlockMetadata.retrievedData.map(
|
|
239
|
+
(blockMetadata, i) => new L2Block(blockMetadata[1], blockMetadata[0], blockBodiesFromStore[i]),
|
|
253
240
|
);
|
|
254
|
-
}
|
|
255
241
|
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
242
|
+
if (blocks.length === 0) {
|
|
243
|
+
return;
|
|
244
|
+
} else {
|
|
245
|
+
this.log(
|
|
246
|
+
`Retrieved ${blocks.length} new L2 blocks between L1 blocks ${
|
|
247
|
+
lastL1Blocks.blocks + 1n
|
|
248
|
+
} and ${currentL1BlockNumber}.`,
|
|
249
|
+
);
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
retrievedBlocks = {
|
|
253
|
+
lastProcessedL1BlockNumber: retrievedBlockMetadata.lastProcessedL1BlockNumber,
|
|
254
|
+
retrievedData: blocks,
|
|
255
|
+
};
|
|
256
|
+
}
|
|
261
257
|
|
|
262
258
|
await Promise.all(
|
|
263
259
|
retrievedBlocks.retrievedData.map(block => {
|
|
@@ -280,7 +276,7 @@ export class Archiver implements ArchiveSource {
|
|
|
280
276
|
}),
|
|
281
277
|
);
|
|
282
278
|
|
|
283
|
-
await this.store.addBlocks(retrievedBlocks
|
|
279
|
+
await this.store.addBlocks(retrievedBlocks);
|
|
284
280
|
}
|
|
285
281
|
|
|
286
282
|
/**
|
|
@@ -430,9 +426,9 @@ export class Archiver implements ArchiveSource {
|
|
|
430
426
|
/**
|
|
431
427
|
* Gets the L1 to L2 message index in the L1 to L2 message tree.
|
|
432
428
|
* @param l1ToL2Message - The L1 to L2 message.
|
|
433
|
-
* @returns The index of the L1 to L2 message in the L1 to L2 message tree.
|
|
429
|
+
* @returns The index of the L1 to L2 message in the L1 to L2 message tree (undefined if not found).
|
|
434
430
|
*/
|
|
435
|
-
getL1ToL2MessageIndex(l1ToL2Message: Fr): Promise<bigint> {
|
|
431
|
+
getL1ToL2MessageIndex(l1ToL2Message: Fr): Promise<bigint | undefined> {
|
|
436
432
|
return this.store.getL1ToL2MessageIndex(l1ToL2Message);
|
|
437
433
|
}
|
|
438
434
|
|
|
@@ -14,6 +14,8 @@ import { Fr } from '@aztec/circuits.js';
|
|
|
14
14
|
import { AztecAddress } from '@aztec/foundation/aztec-address';
|
|
15
15
|
import { ContractClassPublic, ContractInstanceWithAddress } from '@aztec/types/contracts';
|
|
16
16
|
|
|
17
|
+
import { DataRetrieval } from './data_retrieval.js';
|
|
18
|
+
|
|
17
19
|
/**
|
|
18
20
|
* Represents the latest L1 block processed by the archiver for various objects in L2.
|
|
19
21
|
*/
|
|
@@ -31,10 +33,10 @@ export type ArchiverL1SynchPoint = {
|
|
|
31
33
|
export interface ArchiverDataStore {
|
|
32
34
|
/**
|
|
33
35
|
* Append new blocks to the store's list.
|
|
34
|
-
* @param blocks - The L2 blocks to be added to the store.
|
|
36
|
+
* @param blocks - The L2 blocks to be added to the store and the last processed L1 block.
|
|
35
37
|
* @returns True if the operation is successful.
|
|
36
38
|
*/
|
|
37
|
-
addBlocks(blocks: L2Block
|
|
39
|
+
addBlocks(blocks: DataRetrieval<L2Block>): Promise<boolean>;
|
|
38
40
|
|
|
39
41
|
/**
|
|
40
42
|
* Append new block bodies to the store's list.
|
|
@@ -88,11 +90,10 @@ export interface ArchiverDataStore {
|
|
|
88
90
|
|
|
89
91
|
/**
|
|
90
92
|
* Append L1 to L2 messages to the store.
|
|
91
|
-
* @param messages - The L1 to L2 messages to be added to the store.
|
|
92
|
-
* @param lastMessageL1BlockNumber - The L1 block number in which the last message was emitted.
|
|
93
|
+
* @param messages - The L1 to L2 messages to be added to the store and the last processed L1 block.
|
|
93
94
|
* @returns True if the operation is successful.
|
|
94
95
|
*/
|
|
95
|
-
addL1ToL2Messages(messages: InboxLeaf
|
|
96
|
+
addL1ToL2Messages(messages: DataRetrieval<InboxLeaf>): Promise<boolean>;
|
|
96
97
|
|
|
97
98
|
/**
|
|
98
99
|
* Gets L1 to L2 message (to be) included in a given block.
|
|
@@ -104,9 +105,9 @@ export interface ArchiverDataStore {
|
|
|
104
105
|
/**
|
|
105
106
|
* Gets the L1 to L2 message index in the L1 to L2 message tree.
|
|
106
107
|
* @param l1ToL2Message - The L1 to L2 message.
|
|
107
|
-
* @returns The index of the L1 to L2 message in the L1 to L2 message tree.
|
|
108
|
+
* @returns The index of the L1 to L2 message in the L1 to L2 message tree (undefined if not found).
|
|
108
109
|
*/
|
|
109
|
-
getL1ToL2MessageIndex(l1ToL2Message: Fr): Promise<bigint>;
|
|
110
|
+
getL1ToL2MessageIndex(l1ToL2Message: Fr): Promise<bigint | undefined>;
|
|
110
111
|
|
|
111
112
|
/**
|
|
112
113
|
* Gets up to `limit` amount of logs starting from `from`.
|
|
@@ -6,6 +6,7 @@ import { randomBytes, randomInt } from '@aztec/foundation/crypto';
|
|
|
6
6
|
import { ContractClassPublic, ContractInstanceWithAddress, SerializableContractInstance } from '@aztec/types/contracts';
|
|
7
7
|
|
|
8
8
|
import { ArchiverDataStore } from './archiver_store.js';
|
|
9
|
+
import { DataRetrieval } from './data_retrieval.js';
|
|
9
10
|
|
|
10
11
|
/**
|
|
11
12
|
* @param testName - The name of the test suite.
|
|
@@ -14,27 +15,26 @@ import { ArchiverDataStore } from './archiver_store.js';
|
|
|
14
15
|
export function describeArchiverDataStore(testName: string, getStore: () => ArchiverDataStore) {
|
|
15
16
|
describe(testName, () => {
|
|
16
17
|
let store: ArchiverDataStore;
|
|
17
|
-
let blocks: L2Block
|
|
18
|
+
let blocks: DataRetrieval<L2Block>;
|
|
18
19
|
const blockTests: [number, number, () => L2Block[]][] = [
|
|
19
|
-
[1, 1, () => blocks.slice(0, 1)],
|
|
20
|
-
[10, 1, () => blocks.slice(9, 10)],
|
|
21
|
-
[1, 10, () => blocks.slice(0, 10)],
|
|
22
|
-
[2, 5, () => blocks.slice(1, 6)],
|
|
23
|
-
[5, 2, () => blocks.slice(4, 6)],
|
|
20
|
+
[1, 1, () => blocks.retrievedData.slice(0, 1)],
|
|
21
|
+
[10, 1, () => blocks.retrievedData.slice(9, 10)],
|
|
22
|
+
[1, 10, () => blocks.retrievedData.slice(0, 10)],
|
|
23
|
+
[2, 5, () => blocks.retrievedData.slice(1, 6)],
|
|
24
|
+
[5, 2, () => blocks.retrievedData.slice(4, 6)],
|
|
24
25
|
];
|
|
25
26
|
|
|
26
27
|
beforeEach(() => {
|
|
27
28
|
store = getStore();
|
|
28
|
-
blocks =
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
});
|
|
29
|
+
blocks = {
|
|
30
|
+
lastProcessedL1BlockNumber: 5n,
|
|
31
|
+
retrievedData: Array.from({ length: 10 }).map((_, i) => L2Block.random(i + 1)),
|
|
32
|
+
};
|
|
33
33
|
});
|
|
34
34
|
|
|
35
35
|
describe('addBlocks', () => {
|
|
36
36
|
it('returns success when adding block bodies', async () => {
|
|
37
|
-
await expect(store.addBlockBodies(blocks.map(block => block.body))).resolves.toBe(true);
|
|
37
|
+
await expect(store.addBlockBodies(blocks.retrievedData.map(block => block.body))).resolves.toBe(true);
|
|
38
38
|
});
|
|
39
39
|
|
|
40
40
|
it('returns success when adding blocks', async () => {
|
|
@@ -50,7 +50,7 @@ export function describeArchiverDataStore(testName: string, getStore: () => Arch
|
|
|
50
50
|
describe('getBlocks', () => {
|
|
51
51
|
beforeEach(async () => {
|
|
52
52
|
await store.addBlocks(blocks);
|
|
53
|
-
await store.addBlockBodies(blocks.map(block => block.body));
|
|
53
|
+
await store.addBlockBodies(blocks.retrievedData.map(block => block.body));
|
|
54
54
|
});
|
|
55
55
|
|
|
56
56
|
it.each(blockTests)('retrieves previously stored blocks', async (start, limit, getExpectedBlocks) => {
|
|
@@ -66,7 +66,7 @@ export function describeArchiverDataStore(testName: string, getStore: () => Arch
|
|
|
66
66
|
});
|
|
67
67
|
|
|
68
68
|
it('resets `from` to the first block if it is out of range', async () => {
|
|
69
|
-
await expect(store.getBlocks(INITIAL_L2_BLOCK_NUM - 100, 1)).resolves.toEqual(blocks.slice(0, 1));
|
|
69
|
+
await expect(store.getBlocks(INITIAL_L2_BLOCK_NUM - 100, 1)).resolves.toEqual(blocks.retrievedData.slice(0, 1));
|
|
70
70
|
});
|
|
71
71
|
});
|
|
72
72
|
|
|
@@ -77,7 +77,7 @@ export function describeArchiverDataStore(testName: string, getStore: () => Arch
|
|
|
77
77
|
|
|
78
78
|
it("returns the most recently added block's number", async () => {
|
|
79
79
|
await store.addBlocks(blocks);
|
|
80
|
-
await expect(store.getSynchedL2BlockNumber()).resolves.toEqual(blocks.at(-1)!.number);
|
|
80
|
+
await expect(store.getSynchedL2BlockNumber()).resolves.toEqual(blocks.retrievedData.at(-1)!.number);
|
|
81
81
|
});
|
|
82
82
|
});
|
|
83
83
|
|
|
@@ -92,13 +92,16 @@ export function describeArchiverDataStore(testName: string, getStore: () => Arch
|
|
|
92
92
|
it('returns the L1 block number in which the most recent L2 block was published', async () => {
|
|
93
93
|
await store.addBlocks(blocks);
|
|
94
94
|
await expect(store.getSynchedL1BlockNumbers()).resolves.toEqual({
|
|
95
|
-
blocks: blocks.
|
|
95
|
+
blocks: blocks.lastProcessedL1BlockNumber,
|
|
96
96
|
messages: 0n,
|
|
97
97
|
});
|
|
98
98
|
});
|
|
99
99
|
|
|
100
100
|
it('returns the L1 block number that most recently added messages from inbox', async () => {
|
|
101
|
-
await store.addL1ToL2Messages(
|
|
101
|
+
await store.addL1ToL2Messages({
|
|
102
|
+
lastProcessedL1BlockNumber: 1n,
|
|
103
|
+
retrievedData: [new InboxLeaf(0n, 0n, Fr.ZERO)],
|
|
104
|
+
});
|
|
102
105
|
await expect(store.getSynchedL1BlockNumbers()).resolves.toEqual({
|
|
103
106
|
blocks: 0n,
|
|
104
107
|
messages: 1n,
|
|
@@ -109,7 +112,11 @@ export function describeArchiverDataStore(testName: string, getStore: () => Arch
|
|
|
109
112
|
describe('addLogs', () => {
|
|
110
113
|
it('adds encrypted & unencrypted logs', async () => {
|
|
111
114
|
await expect(
|
|
112
|
-
store.addLogs(
|
|
115
|
+
store.addLogs(
|
|
116
|
+
blocks.retrievedData[0].body.encryptedLogs,
|
|
117
|
+
blocks.retrievedData[0].body.unencryptedLogs,
|
|
118
|
+
blocks.retrievedData[0].number,
|
|
119
|
+
),
|
|
113
120
|
).resolves.toEqual(true);
|
|
114
121
|
});
|
|
115
122
|
});
|
|
@@ -120,7 +127,9 @@ export function describeArchiverDataStore(testName: string, getStore: () => Arch
|
|
|
120
127
|
])('getLogs (%s)', (_, logType) => {
|
|
121
128
|
beforeEach(async () => {
|
|
122
129
|
await Promise.all(
|
|
123
|
-
blocks.map(block =>
|
|
130
|
+
blocks.retrievedData.map(block =>
|
|
131
|
+
store.addLogs(block.body.encryptedLogs, block.body.unencryptedLogs, block.number),
|
|
132
|
+
),
|
|
124
133
|
);
|
|
125
134
|
});
|
|
126
135
|
|
|
@@ -136,18 +145,20 @@ export function describeArchiverDataStore(testName: string, getStore: () => Arch
|
|
|
136
145
|
describe('getTxEffect', () => {
|
|
137
146
|
beforeEach(async () => {
|
|
138
147
|
await Promise.all(
|
|
139
|
-
blocks.map(block =>
|
|
148
|
+
blocks.retrievedData.map(block =>
|
|
149
|
+
store.addLogs(block.body.encryptedLogs, block.body.unencryptedLogs, block.number),
|
|
150
|
+
),
|
|
140
151
|
);
|
|
141
152
|
await store.addBlocks(blocks);
|
|
142
|
-
await store.addBlockBodies(blocks.map(block => block.body));
|
|
153
|
+
await store.addBlockBodies(blocks.retrievedData.map(block => block.body));
|
|
143
154
|
});
|
|
144
155
|
|
|
145
156
|
it.each([
|
|
146
|
-
() => blocks[0].getTx(0),
|
|
147
|
-
() => blocks[9].getTx(3),
|
|
148
|
-
() => blocks[3].getTx(1),
|
|
149
|
-
() => blocks[5].getTx(2),
|
|
150
|
-
() => blocks[1].getTx(0),
|
|
157
|
+
() => blocks.retrievedData[0].getTx(0),
|
|
158
|
+
() => blocks.retrievedData[9].getTx(3),
|
|
159
|
+
() => blocks.retrievedData[3].getTx(1),
|
|
160
|
+
() => blocks.retrievedData[5].getTx(2),
|
|
161
|
+
() => blocks.retrievedData[1].getTx(0),
|
|
151
162
|
])('retrieves a previously stored transaction', async getExpectedTx => {
|
|
152
163
|
const expectedTx = getExpectedTx();
|
|
153
164
|
const actualTx = await store.getTxEffect(expectedTx.txHash);
|
|
@@ -169,7 +180,7 @@ export function describeArchiverDataStore(testName: string, getStore: () => Arch
|
|
|
169
180
|
it('returns messages in correct order', async () => {
|
|
170
181
|
const msgs = generateBlockMessages(l2BlockNumber, l1ToL2MessageSubtreeSize);
|
|
171
182
|
const shuffledMessages = msgs.slice().sort(() => randomInt(1) - 0.5);
|
|
172
|
-
await store.addL1ToL2Messages(
|
|
183
|
+
await store.addL1ToL2Messages({ lastProcessedL1BlockNumber: 100n, retrievedData: shuffledMessages });
|
|
173
184
|
const retrievedMessages = await store.getL1ToL2Messages(l2BlockNumber);
|
|
174
185
|
|
|
175
186
|
const expectedLeavesOrder = msgs.map(msg => msg.leaf);
|
|
@@ -182,7 +193,7 @@ export function describeArchiverDataStore(testName: string, getStore: () => Arch
|
|
|
182
193
|
// --> with that there will be a gap and it will be impossible to sequence the messages
|
|
183
194
|
msgs[4] = new InboxLeaf(l2BlockNumber, BigInt(l1ToL2MessageSubtreeSize - 1), Fr.random());
|
|
184
195
|
|
|
185
|
-
await store.addL1ToL2Messages(
|
|
196
|
+
await store.addL1ToL2Messages({ lastProcessedL1BlockNumber: 100n, retrievedData: msgs });
|
|
186
197
|
await expect(async () => {
|
|
187
198
|
await store.getL1ToL2Messages(l2BlockNumber);
|
|
188
199
|
}).rejects.toThrow(`L1 to L2 message gap found in block ${l2BlockNumber}`);
|
|
@@ -192,7 +203,7 @@ export function describeArchiverDataStore(testName: string, getStore: () => Arch
|
|
|
192
203
|
const msgs = generateBlockMessages(l2BlockNumber, l1ToL2MessageSubtreeSize + 1);
|
|
193
204
|
|
|
194
205
|
await expect(async () => {
|
|
195
|
-
await store.addL1ToL2Messages(
|
|
206
|
+
await store.addL1ToL2Messages({ lastProcessedL1BlockNumber: 100n, retrievedData: msgs });
|
|
196
207
|
}).rejects.toThrow(`Message index ${l1ToL2MessageSubtreeSize} out of subtree range`);
|
|
197
208
|
});
|
|
198
209
|
});
|
|
@@ -238,20 +249,25 @@ export function describeArchiverDataStore(testName: string, getStore: () => Arch
|
|
|
238
249
|
const numPublicFunctionCalls = 3;
|
|
239
250
|
const numUnencryptedLogs = 4;
|
|
240
251
|
const numBlocks = 10;
|
|
241
|
-
let blocks: L2Block
|
|
252
|
+
let blocks: DataRetrieval<L2Block>;
|
|
242
253
|
|
|
243
254
|
beforeEach(async () => {
|
|
244
|
-
blocks =
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
255
|
+
blocks = {
|
|
256
|
+
lastProcessedL1BlockNumber: 4n,
|
|
257
|
+
retrievedData: Array(numBlocks)
|
|
258
|
+
.fill(0)
|
|
259
|
+
.map((_, index: number) =>
|
|
260
|
+
L2Block.random(index + 1, txsPerBlock, 2, numPublicFunctionCalls, 2, numUnencryptedLogs),
|
|
261
|
+
),
|
|
262
|
+
};
|
|
249
263
|
|
|
250
264
|
await store.addBlocks(blocks);
|
|
251
|
-
await store.addBlockBodies(blocks.map(block => block.body));
|
|
265
|
+
await store.addBlockBodies(blocks.retrievedData.map(block => block.body));
|
|
252
266
|
|
|
253
267
|
await Promise.all(
|
|
254
|
-
blocks.map(block =>
|
|
268
|
+
blocks.retrievedData.map(block =>
|
|
269
|
+
store.addLogs(block.body.encryptedLogs, block.body.unencryptedLogs, block.number),
|
|
270
|
+
),
|
|
255
271
|
);
|
|
256
272
|
});
|
|
257
273
|
|
|
@@ -259,7 +275,7 @@ export function describeArchiverDataStore(testName: string, getStore: () => Arch
|
|
|
259
275
|
// get random tx
|
|
260
276
|
const targetBlockIndex = randomInt(numBlocks);
|
|
261
277
|
const targetTxIndex = randomInt(txsPerBlock);
|
|
262
|
-
const targetTxHash = new L2BlockContext(blocks[targetBlockIndex]).getTxHash(targetTxIndex);
|
|
278
|
+
const targetTxHash = new L2BlockContext(blocks.retrievedData[targetBlockIndex]).getTxHash(targetTxIndex);
|
|
263
279
|
|
|
264
280
|
const response = await store.getUnencryptedLogs({ txHash: targetTxHash });
|
|
265
281
|
const logs = response.logs;
|
|
@@ -303,8 +319,9 @@ export function describeArchiverDataStore(testName: string, getStore: () => Arch
|
|
|
303
319
|
const targetFunctionLogIndex = randomInt(numPublicFunctionCalls);
|
|
304
320
|
const targetLogIndex = randomInt(numUnencryptedLogs);
|
|
305
321
|
const targetContractAddress = UnencryptedL2Log.fromBuffer(
|
|
306
|
-
blocks[targetBlockIndex].body.txEffects[targetTxIndex].unencryptedLogs.functionLogs[
|
|
307
|
-
|
|
322
|
+
blocks.retrievedData[targetBlockIndex].body.txEffects[targetTxIndex].unencryptedLogs.functionLogs[
|
|
323
|
+
targetFunctionLogIndex
|
|
324
|
+
].logs[targetLogIndex],
|
|
308
325
|
).contractAddress;
|
|
309
326
|
|
|
310
327
|
const response = await store.getUnencryptedLogs({ contractAddress: targetContractAddress });
|
|
@@ -323,8 +340,9 @@ export function describeArchiverDataStore(testName: string, getStore: () => Arch
|
|
|
323
340
|
const targetFunctionLogIndex = randomInt(numPublicFunctionCalls);
|
|
324
341
|
const targetLogIndex = randomInt(numUnencryptedLogs);
|
|
325
342
|
const targetSelector = UnencryptedL2Log.fromBuffer(
|
|
326
|
-
blocks[targetBlockIndex].body.txEffects[targetTxIndex].unencryptedLogs.functionLogs[
|
|
327
|
-
|
|
343
|
+
blocks.retrievedData[targetBlockIndex].body.txEffects[targetTxIndex].unencryptedLogs.functionLogs[
|
|
344
|
+
targetFunctionLogIndex
|
|
345
|
+
].logs[targetLogIndex],
|
|
328
346
|
).selector;
|
|
329
347
|
|
|
330
348
|
const response = await store.getUnencryptedLogs({ selector: targetSelector });
|
package/src/archiver/config.ts
CHANGED
|
@@ -62,6 +62,8 @@ export function getConfigEnvVars(): ArchiverConfig {
|
|
|
62
62
|
INBOX_CONTRACT_ADDRESS,
|
|
63
63
|
OUTBOX_CONTRACT_ADDRESS,
|
|
64
64
|
REGISTRY_CONTRACT_ADDRESS,
|
|
65
|
+
GAS_TOKEN_CONTRACT_ADDRESS,
|
|
66
|
+
GAS_PORTAL_CONTRACT_ADDRESS,
|
|
65
67
|
DATA_DIRECTORY,
|
|
66
68
|
} = process.env;
|
|
67
69
|
// Populate the relevant addresses for use by the archiver.
|
|
@@ -73,6 +75,10 @@ export function getConfigEnvVars(): ArchiverConfig {
|
|
|
73
75
|
registryAddress: REGISTRY_CONTRACT_ADDRESS ? EthAddress.fromString(REGISTRY_CONTRACT_ADDRESS) : EthAddress.ZERO,
|
|
74
76
|
inboxAddress: INBOX_CONTRACT_ADDRESS ? EthAddress.fromString(INBOX_CONTRACT_ADDRESS) : EthAddress.ZERO,
|
|
75
77
|
outboxAddress: OUTBOX_CONTRACT_ADDRESS ? EthAddress.fromString(OUTBOX_CONTRACT_ADDRESS) : EthAddress.ZERO,
|
|
78
|
+
gasTokenAddress: GAS_TOKEN_CONTRACT_ADDRESS ? EthAddress.fromString(GAS_TOKEN_CONTRACT_ADDRESS) : EthAddress.ZERO,
|
|
79
|
+
gasPortalAddress: GAS_PORTAL_CONTRACT_ADDRESS
|
|
80
|
+
? EthAddress.fromString(GAS_PORTAL_CONTRACT_ADDRESS)
|
|
81
|
+
: EthAddress.ZERO,
|
|
76
82
|
};
|
|
77
83
|
return {
|
|
78
84
|
rpcUrl: ETHEREUM_HOST || 'http://127.0.0.1:8545/',
|
|
@@ -16,11 +16,11 @@ import {
|
|
|
16
16
|
/**
|
|
17
17
|
* Data retrieved from logs
|
|
18
18
|
*/
|
|
19
|
-
type DataRetrieval<T> = {
|
|
19
|
+
export type DataRetrieval<T> = {
|
|
20
20
|
/**
|
|
21
|
-
*
|
|
21
|
+
* Blocknumber of the last L1 block from which we obtained data.
|
|
22
22
|
*/
|
|
23
|
-
|
|
23
|
+
lastProcessedL1BlockNumber: bigint;
|
|
24
24
|
/**
|
|
25
25
|
* The data returned.
|
|
26
26
|
*/
|
|
@@ -35,7 +35,7 @@ type DataRetrieval<T> = {
|
|
|
35
35
|
* @param searchStartBlock - The block number to use for starting the search.
|
|
36
36
|
* @param searchEndBlock - The highest block number that we should search up to.
|
|
37
37
|
* @param expectedNextL2BlockNum - The next L2 block number that we expect to find.
|
|
38
|
-
* @returns An array of tuples representing block metadata including the header, archive tree snapshot
|
|
38
|
+
* @returns An array of tuples representing block metadata including the header, archive tree snapshot; as well as the next eth block to search from.
|
|
39
39
|
*/
|
|
40
40
|
export async function retrieveBlockMetadataFromRollup(
|
|
41
41
|
publicClient: PublicClient,
|
|
@@ -44,8 +44,8 @@ export async function retrieveBlockMetadataFromRollup(
|
|
|
44
44
|
searchStartBlock: bigint,
|
|
45
45
|
searchEndBlock: bigint,
|
|
46
46
|
expectedNextL2BlockNum: bigint,
|
|
47
|
-
): Promise<DataRetrieval<[Header, AppendOnlyTreeSnapshot
|
|
48
|
-
const retrievedBlockMetadata: [Header, AppendOnlyTreeSnapshot
|
|
47
|
+
): Promise<DataRetrieval<[Header, AppendOnlyTreeSnapshot]>> {
|
|
48
|
+
const retrievedBlockMetadata: [Header, AppendOnlyTreeSnapshot][] = [];
|
|
49
49
|
do {
|
|
50
50
|
if (searchStartBlock > searchEndBlock) {
|
|
51
51
|
break;
|
|
@@ -69,7 +69,7 @@ export async function retrieveBlockMetadataFromRollup(
|
|
|
69
69
|
searchStartBlock = l2BlockProcessedLogs[l2BlockProcessedLogs.length - 1].blockNumber! + 1n;
|
|
70
70
|
expectedNextL2BlockNum += BigInt(newBlockMetadata.length);
|
|
71
71
|
} while (blockUntilSynced && searchStartBlock <= searchEndBlock);
|
|
72
|
-
return {
|
|
72
|
+
return { lastProcessedL1BlockNumber: searchStartBlock - 1n, retrievedData: retrievedBlockMetadata };
|
|
73
73
|
}
|
|
74
74
|
|
|
75
75
|
/**
|
|
@@ -108,7 +108,7 @@ export async function retrieveBlockBodiesFromAvailabilityOracle(
|
|
|
108
108
|
retrievedBlockBodies.push(...newBlockBodies);
|
|
109
109
|
searchStartBlock = l2TxsPublishedLogs[l2TxsPublishedLogs.length - 1].blockNumber! + 1n;
|
|
110
110
|
} while (blockUntilSynced && searchStartBlock <= searchEndBlock);
|
|
111
|
-
return {
|
|
111
|
+
return { lastProcessedL1BlockNumber: searchStartBlock - 1n, retrievedData: retrievedBlockBodies };
|
|
112
112
|
}
|
|
113
113
|
|
|
114
114
|
/**
|
|
@@ -141,5 +141,5 @@ export async function retrieveL1ToL2Messages(
|
|
|
141
141
|
// handles the case when there are no new messages:
|
|
142
142
|
searchStartBlock = (leafInsertedLogs.findLast(msgLog => !!msgLog)?.blockNumber || searchStartBlock) + 1n;
|
|
143
143
|
} while (blockUntilSynced && searchStartBlock <= searchEndBlock);
|
|
144
|
-
return {
|
|
144
|
+
return { lastProcessedL1BlockNumber: searchStartBlock - 1n, retrievedData: retrievedL1ToL2Messages };
|
|
145
145
|
}
|