@aztec/archiver 0.66.0 → 0.67.1-devnet
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 +7 -10
- package/dest/archiver/archiver.d.ts.map +1 -1
- package/dest/archiver/archiver.js +566 -559
- package/dest/archiver/archiver_store.d.ts +2 -2
- package/dest/archiver/archiver_store.d.ts.map +1 -1
- package/dest/archiver/config.d.ts +2 -0
- package/dest/archiver/config.d.ts.map +1 -1
- package/dest/archiver/config.js +6 -1
- package/dest/archiver/data_retrieval.d.ts +3 -3
- package/dest/archiver/data_retrieval.d.ts.map +1 -1
- package/dest/archiver/data_retrieval.js +38 -17
- package/dest/archiver/instrumentation.d.ts +5 -2
- package/dest/archiver/instrumentation.d.ts.map +1 -1
- package/dest/archiver/instrumentation.js +17 -18
- package/dest/archiver/kv_archiver_store/block_store.d.ts +2 -2
- package/dest/archiver/kv_archiver_store/block_store.d.ts.map +1 -1
- package/dest/archiver/kv_archiver_store/block_store.js +6 -6
- package/dest/archiver/kv_archiver_store/contract_class_store.js +2 -2
- package/dest/archiver/kv_archiver_store/kv_archiver_store.d.ts +2 -2
- package/dest/archiver/kv_archiver_store/kv_archiver_store.d.ts.map +1 -1
- package/dest/archiver/kv_archiver_store/kv_archiver_store.js +3 -3
- package/dest/archiver/kv_archiver_store/log_store.js +3 -3
- package/dest/archiver/kv_archiver_store/message_store.js +3 -3
- package/dest/archiver/kv_archiver_store/nullifier_store.js +3 -3
- package/dest/archiver/memory_archiver_store/memory_archiver_store.d.ts +2 -2
- package/dest/archiver/memory_archiver_store/memory_archiver_store.d.ts.map +1 -1
- package/dest/archiver/memory_archiver_store/memory_archiver_store.js +4 -4
- package/dest/factory.d.ts.map +1 -1
- package/dest/factory.js +8 -6
- package/dest/index.d.ts +1 -1
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +2 -2
- package/dest/test/mock_l2_block_source.d.ts +2 -2
- package/dest/test/mock_l2_block_source.d.ts.map +1 -1
- package/dest/test/mock_l2_block_source.js +3 -3
- package/package.json +17 -12
- package/src/archiver/archiver.ts +19 -24
- package/src/archiver/archiver_store.ts +2 -2
- package/src/archiver/config.ts +8 -0
- package/src/archiver/data_retrieval.ts +58 -25
- package/src/archiver/instrumentation.ts +25 -21
- package/src/archiver/kv_archiver_store/block_store.ts +6 -6
- package/src/archiver/kv_archiver_store/contract_class_store.ts +1 -1
- package/src/archiver/kv_archiver_store/kv_archiver_store.ts +4 -4
- package/src/archiver/kv_archiver_store/log_store.ts +2 -2
- package/src/archiver/kv_archiver_store/message_store.ts +2 -2
- package/src/archiver/kv_archiver_store/nullifier_store.ts +2 -2
- package/src/archiver/memory_archiver_store/memory_archiver_store.ts +5 -5
- package/src/factory.ts +7 -5
- package/src/index.ts +1 -4
- package/src/test/mock_l2_block_source.ts +4 -4
|
@@ -2,7 +2,7 @@ import { L2Block, L2BlockHash, TxReceipt, TxStatus, } from '@aztec/circuit-types
|
|
|
2
2
|
import { getSlotRangeForEpoch } from '@aztec/circuit-types';
|
|
3
3
|
import { EthAddress } from '@aztec/circuits.js';
|
|
4
4
|
import { DefaultL1ContractsConfig } from '@aztec/ethereum';
|
|
5
|
-
import {
|
|
5
|
+
import { createLogger } from '@aztec/foundation/log';
|
|
6
6
|
/**
|
|
7
7
|
* A mocked implementation of L2BlockSource to be used in tests.
|
|
8
8
|
*/
|
|
@@ -11,7 +11,7 @@ export class MockL2BlockSource {
|
|
|
11
11
|
this.l2Blocks = [];
|
|
12
12
|
this.provenEpochNumber = 0;
|
|
13
13
|
this.provenBlockNumber = 0;
|
|
14
|
-
this.log =
|
|
14
|
+
this.log = createLogger('archiver:mock_l2_block_source');
|
|
15
15
|
}
|
|
16
16
|
createBlocks(numBlocks) {
|
|
17
17
|
for (let i = 0; i < numBlocks; i++) {
|
|
@@ -159,4 +159,4 @@ export class MockL2BlockSource {
|
|
|
159
159
|
return Promise.resolve();
|
|
160
160
|
}
|
|
161
161
|
}
|
|
162
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
162
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9ja19sMl9ibG9ja19zb3VyY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVzdC9tb2NrX2wyX2Jsb2NrX3NvdXJjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsT0FBTyxFQUNQLFdBQVcsRUFJWCxTQUFTLEVBQ1QsUUFBUSxHQUNULE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDNUQsT0FBTyxFQUFvQixVQUFVLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNsRSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFckQ7O0dBRUc7QUFDSCxNQUFNLE9BQU8saUJBQWlCO0lBQTlCO1FBQ1ksYUFBUSxHQUFjLEVBQUUsQ0FBQztRQUUzQixzQkFBaUIsR0FBVyxDQUFDLENBQUM7UUFDOUIsc0JBQWlCLEdBQVcsQ0FBQyxDQUFDO1FBRTlCLFFBQUcsR0FBRyxZQUFZLENBQUMsK0JBQStCLENBQUMsQ0FBQztJQXFMOUQsQ0FBQztJQW5MUSxZQUFZLENBQUMsU0FBaUI7UUFDbkMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ25DLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztZQUMxQyxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzVCLENBQUM7UUFFRCxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxXQUFXLFNBQVMscUNBQXFDLENBQUMsQ0FBQztJQUM5RSxDQUFDO0lBRU0sU0FBUyxDQUFDLE1BQWlCO1FBQ2hDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUM7UUFDOUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsU0FBUyxNQUFNLENBQUMsTUFBTSxxQ0FBcUMsQ0FBQyxDQUFDO0lBQ2hGLENBQUM7SUFFTSxZQUFZLENBQUMsU0FBaUI7UUFDbkMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNuRCxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxXQUFXLFNBQVMsdUNBQXVDLENBQUMsQ0FBQztJQUNoRixDQUFDO0lBRU0sb0JBQW9CLENBQUMsaUJBQXlCO1FBQ25ELElBQUksQ0FBQyxpQkFBaUIsR0FBRyxpQkFBaUIsQ0FBQztJQUM3QyxDQUFDO0lBRU0sb0JBQW9CLENBQUMsaUJBQXlCO1FBQ25ELElBQUksQ0FBQyxpQkFBaUIsR0FBRyxpQkFBaUIsQ0FBQztJQUM3QyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsZ0JBQWdCO1FBQ2QsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFRDs7O09BR0c7SUFDSCxrQkFBa0I7UUFDaEIsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFRDs7O09BR0c7SUFDSSxjQUFjO1FBQ25CLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFTSxvQkFBb0I7UUFDekIsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFTSxzQkFBc0I7UUFDM0IsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksUUFBUSxDQUFDLE1BQWM7UUFDNUIsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksU0FBUyxDQUFDLElBQVksRUFBRSxLQUFhLEVBQUUsTUFBZ0I7UUFDNUQsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUNwQixJQUFJLENBQUMsUUFBUTthQUNWLEtBQUssQ0FBQyxJQUFJLEdBQUcsQ0FBQyxFQUFFLElBQUksR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDO2FBQ2pDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxpQkFBaUIsS0FBSyxTQUFTLElBQUksQ0FBQyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FDdEcsQ0FBQztJQUNKLENBQUM7SUFFRCxjQUFjLENBQUMsTUFBeUI7UUFDdEMsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLE9BQU8sTUFBTSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNqRyxDQUFDO0lBRUQsaUJBQWlCLENBQUMsV0FBbUI7UUFDbkMsTUFBTSxhQUFhLEdBQUcsd0JBQXdCLENBQUMsa0JBQWtCLENBQUM7UUFDbEUsTUFBTSxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsR0FBRyxvQkFBb0IsQ0FBQyxXQUFXLEVBQUUsRUFBRSxhQUFhLEVBQUUsQ0FBQyxDQUFDO1FBQzFFLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ3RDLE1BQU0sSUFBSSxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUM1RCxPQUFPLElBQUksSUFBSSxLQUFLLElBQUksSUFBSSxJQUFJLEdBQUcsQ0FBQztRQUN0QyxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLFdBQVcsQ0FBQyxNQUFjO1FBQy9CLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRO2FBQ3hCLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBVSxDQUFDLENBQUM7YUFDMUQsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUM1QyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDWCxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDcEMsQ0FBQztRQUNELE1BQU0sQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQ2hDLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFFLEtBQUssQ0FBQyxNQUFNLEVBQUUsV0FBVyxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDaEgsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxtQkFBbUIsQ0FBQyxNQUFjO1FBQ3ZDLEtBQUssTUFBTSxLQUFLLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2xDLEtBQUssTUFBTSxRQUFRLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDNUMsSUFBSSxRQUFRLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO29CQUNuQyxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQ3BCLElBQUksU0FBUyxDQUNYLE1BQU0sRUFDTixRQUFRLENBQUMsT0FBTyxFQUNoQixFQUFFLEVBQ0YsUUFBUSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsRUFDbEMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsRUFDbkMsS0FBSyxDQUFDLE1BQU0sQ0FDYixDQUNGLENBQUM7Z0JBQ0osQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFRCxLQUFLLENBQUMsU0FBUztRQUNiLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLFNBQVMsQ0FBQyxHQUFHO1lBQ2xDLE1BQU0sSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUMzQixNQUFNLElBQUksQ0FBQyxvQkFBb0IsRUFBRTtZQUNqQyxNQUFNLElBQUksQ0FBQyxvQkFBb0IsRUFBRTtTQUN6QixDQUFDO1FBRVgsT0FBTztZQUNMLE1BQU0sRUFBRSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRSxFQUFFO1lBQzlFLE1BQU0sRUFBRSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRSxFQUFFO1lBQzlFLFNBQVMsRUFBRSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRSxFQUFFO1NBQ3hGLENBQUM7SUFDSixDQUFDO0lBRUQsZ0JBQWdCO1FBQ2QsTUFBTSxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRCxlQUFlO1FBQ2IsTUFBTSxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRCxlQUFlLENBQUMsWUFBb0I7UUFDbEMsTUFBTSxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRDs7O09BR0c7SUFDSSxLQUFLO1FBQ1YsT0FBTyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVEOzs7T0FHRztJQUNJLElBQUk7UUFDVCxPQUFPLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUMzQixDQUFDO0NBQ0YifQ==
|
package/package.json
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/archiver",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.67.1-devnet",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": "./dest/index.js",
|
|
7
7
|
"./data-retrieval": "./dest/archiver/data_retrieval.js",
|
|
8
8
|
"./epoch": "./dest/archiver/epoch_helpers.js",
|
|
9
|
-
"./test": "./dest/test/index.js"
|
|
9
|
+
"./test": "./dest/test/index.js",
|
|
10
|
+
"./config": "./dest/archiver/config.js"
|
|
10
11
|
},
|
|
11
12
|
"typedocOptions": {
|
|
12
13
|
"entryPoints": [
|
|
@@ -61,19 +62,23 @@
|
|
|
61
62
|
"summaryThreshold": 9999
|
|
62
63
|
}
|
|
63
64
|
]
|
|
65
|
+
],
|
|
66
|
+
"testTimeout": 30000,
|
|
67
|
+
"setupFiles": [
|
|
68
|
+
"../../foundation/src/jest/setup.mjs"
|
|
64
69
|
]
|
|
65
70
|
},
|
|
66
71
|
"dependencies": {
|
|
67
|
-
"@aztec/circuit-types": "0.
|
|
68
|
-
"@aztec/circuits.js": "0.
|
|
69
|
-
"@aztec/ethereum": "0.
|
|
70
|
-
"@aztec/foundation": "0.
|
|
71
|
-
"@aztec/kv-store": "0.
|
|
72
|
-
"@aztec/l1-artifacts": "0.
|
|
73
|
-
"@aztec/noir-contracts.js": "0.
|
|
74
|
-
"@aztec/protocol-contracts": "0.
|
|
75
|
-
"@aztec/telemetry-client": "0.
|
|
76
|
-
"@aztec/types": "0.
|
|
72
|
+
"@aztec/circuit-types": "0.67.1-devnet",
|
|
73
|
+
"@aztec/circuits.js": "0.67.1-devnet",
|
|
74
|
+
"@aztec/ethereum": "0.67.1-devnet",
|
|
75
|
+
"@aztec/foundation": "0.67.1-devnet",
|
|
76
|
+
"@aztec/kv-store": "0.67.1-devnet",
|
|
77
|
+
"@aztec/l1-artifacts": "0.67.1-devnet",
|
|
78
|
+
"@aztec/noir-contracts.js": "0.67.1-devnet",
|
|
79
|
+
"@aztec/protocol-contracts": "0.67.1-devnet",
|
|
80
|
+
"@aztec/telemetry-client": "0.67.1-devnet",
|
|
81
|
+
"@aztec/types": "0.67.1-devnet",
|
|
77
82
|
"debug": "^4.3.4",
|
|
78
83
|
"lodash.groupby": "^4.6.0",
|
|
79
84
|
"lodash.omit": "^4.5.0",
|
package/src/archiver/archiver.ts
CHANGED
|
@@ -22,12 +22,12 @@ import {
|
|
|
22
22
|
getTimestampRangeForEpoch,
|
|
23
23
|
} from '@aztec/circuit-types';
|
|
24
24
|
import {
|
|
25
|
+
type BlockHeader,
|
|
25
26
|
type ContractClassPublic,
|
|
26
27
|
type ContractDataSource,
|
|
27
28
|
type ContractInstanceWithAddress,
|
|
28
29
|
type ExecutablePrivateFunctionWithMembershipProof,
|
|
29
30
|
type FunctionSelector,
|
|
30
|
-
type Header,
|
|
31
31
|
type PrivateLog,
|
|
32
32
|
type PublicFunction,
|
|
33
33
|
type UnconstrainedFunctionWithMembershipProof,
|
|
@@ -40,18 +40,18 @@ import { type ContractArtifact } from '@aztec/foundation/abi';
|
|
|
40
40
|
import { type AztecAddress } from '@aztec/foundation/aztec-address';
|
|
41
41
|
import { type EthAddress } from '@aztec/foundation/eth-address';
|
|
42
42
|
import { Fr } from '@aztec/foundation/fields';
|
|
43
|
-
import { type
|
|
43
|
+
import { type Logger, createLogger } from '@aztec/foundation/log';
|
|
44
44
|
import { RunningPromise } from '@aztec/foundation/running-promise';
|
|
45
45
|
import { count } from '@aztec/foundation/string';
|
|
46
46
|
import { elapsed } from '@aztec/foundation/timer';
|
|
47
47
|
import { InboxAbi, RollupAbi } from '@aztec/l1-artifacts';
|
|
48
48
|
import {
|
|
49
49
|
ContractClassRegisteredEvent,
|
|
50
|
-
ContractInstanceDeployedEvent,
|
|
51
50
|
PrivateFunctionBroadcastedEvent,
|
|
52
51
|
UnconstrainedFunctionBroadcastedEvent,
|
|
53
|
-
} from '@aztec/protocol-contracts';
|
|
54
|
-
import {
|
|
52
|
+
} from '@aztec/protocol-contracts/class-registerer';
|
|
53
|
+
import { ContractInstanceDeployedEvent } from '@aztec/protocol-contracts/instance-deployer';
|
|
54
|
+
import { Attributes, type TelemetryClient, type Traceable, type Tracer, trackSpan } from '@aztec/telemetry-client';
|
|
55
55
|
|
|
56
56
|
import groupBy from 'lodash.groupby';
|
|
57
57
|
import {
|
|
@@ -85,7 +85,7 @@ export type ArchiveSource = L2BlockSource &
|
|
|
85
85
|
* Responsible for handling robust L1 polling so that other components do not need to
|
|
86
86
|
* concern themselves with it.
|
|
87
87
|
*/
|
|
88
|
-
export class Archiver implements ArchiveSource {
|
|
88
|
+
export class Archiver implements ArchiveSource, Traceable {
|
|
89
89
|
/**
|
|
90
90
|
* A promise in which we will be continually fetching new L2 blocks.
|
|
91
91
|
*/
|
|
@@ -99,6 +99,8 @@ export class Archiver implements ArchiveSource {
|
|
|
99
99
|
public l1BlockNumber: bigint | undefined;
|
|
100
100
|
public l1Timestamp: bigint | undefined;
|
|
101
101
|
|
|
102
|
+
public readonly tracer: Tracer;
|
|
103
|
+
|
|
102
104
|
/**
|
|
103
105
|
* Creates a new instance of the Archiver.
|
|
104
106
|
* @param publicClient - A client for interacting with the Ethereum node.
|
|
@@ -116,8 +118,9 @@ export class Archiver implements ArchiveSource {
|
|
|
116
118
|
private readonly config: { pollingIntervalMs: number; batchSize: number },
|
|
117
119
|
private readonly instrumentation: ArchiverInstrumentation,
|
|
118
120
|
private readonly l1constants: L1RollupConstants,
|
|
119
|
-
private readonly log:
|
|
121
|
+
private readonly log: Logger = createLogger('archiver'),
|
|
120
122
|
) {
|
|
123
|
+
this.tracer = instrumentation.tracer;
|
|
121
124
|
this.store = new ArchiverStoreHelper(dataStore);
|
|
122
125
|
|
|
123
126
|
this.rollup = getContract({
|
|
@@ -174,7 +177,7 @@ export class Archiver implements ArchiveSource {
|
|
|
174
177
|
pollingIntervalMs: config.archiverPollingIntervalMS ?? 10_000,
|
|
175
178
|
batchSize: config.archiverBatchSize ?? 100,
|
|
176
179
|
},
|
|
177
|
-
|
|
180
|
+
await ArchiverInstrumentation.new(telemetry, () => archiverStore.estimateSize()),
|
|
178
181
|
{ l1StartBlock, l1GenesisTime, epochDuration, slotDuration, ethereumSlotDuration },
|
|
179
182
|
);
|
|
180
183
|
await archiver.start(blockUntilSynced);
|
|
@@ -194,24 +197,14 @@ export class Archiver implements ArchiveSource {
|
|
|
194
197
|
await this.sync(blockUntilSynced);
|
|
195
198
|
}
|
|
196
199
|
|
|
197
|
-
this.runningPromise = new RunningPromise(() => this.
|
|
200
|
+
this.runningPromise = new RunningPromise(() => this.sync(false), this.log, this.config.pollingIntervalMs);
|
|
198
201
|
this.runningPromise.start();
|
|
199
202
|
}
|
|
200
203
|
|
|
201
|
-
/**
|
|
202
|
-
* Syncs and catches exceptions.
|
|
203
|
-
*/
|
|
204
|
-
private async safeSync() {
|
|
205
|
-
try {
|
|
206
|
-
await this.sync(false);
|
|
207
|
-
} catch (error) {
|
|
208
|
-
this.log.error('Error syncing archiver', error);
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
|
|
212
204
|
/**
|
|
213
205
|
* Fetches logs from L1 contracts and processes them.
|
|
214
206
|
*/
|
|
207
|
+
@trackSpan('Archiver.sync', initialRun => ({ [Attributes.INITIAL_SYNC]: initialRun }))
|
|
215
208
|
private async sync(initialRun: boolean) {
|
|
216
209
|
/**
|
|
217
210
|
* We keep track of three "pointers" to L1 blocks:
|
|
@@ -491,6 +484,8 @@ export class Archiver implements ArchiveSource {
|
|
|
491
484
|
this.log.info(`Downloaded L2 block ${block.data.number}`, {
|
|
492
485
|
blockHash: block.data.hash(),
|
|
493
486
|
blockNumber: block.data.number,
|
|
487
|
+
txCount: block.data.body.txEffects.length,
|
|
488
|
+
globalVariables: block.data.header.globalVariables.toInspect(),
|
|
494
489
|
});
|
|
495
490
|
}
|
|
496
491
|
} while (searchEndBlock < currentL1BlockNumber);
|
|
@@ -617,7 +612,7 @@ export class Archiver implements ArchiveSource {
|
|
|
617
612
|
return blocks.length === 0 ? undefined : blocks[0].data;
|
|
618
613
|
}
|
|
619
614
|
|
|
620
|
-
public async getBlockHeader(number: number | 'latest'): Promise<
|
|
615
|
+
public async getBlockHeader(number: number | 'latest'): Promise<BlockHeader | undefined> {
|
|
621
616
|
if (number === 'latest') {
|
|
622
617
|
number = await this.store.getSynchedL2BlockNumber();
|
|
623
618
|
}
|
|
@@ -836,7 +831,7 @@ class ArchiverStoreHelper
|
|
|
836
831
|
| 'addFunctions'
|
|
837
832
|
>
|
|
838
833
|
{
|
|
839
|
-
#log =
|
|
834
|
+
#log = createLogger('archiver:block-helper');
|
|
840
835
|
|
|
841
836
|
constructor(private readonly store: ArchiverDataStore) {}
|
|
842
837
|
|
|
@@ -919,7 +914,7 @@ class ArchiverStoreHelper
|
|
|
919
914
|
for (const [classIdString, classEvents] of Object.entries(
|
|
920
915
|
groupBy([...privateFnEvents, ...unconstrainedFnEvents], e => e.contractClassId.toString()),
|
|
921
916
|
)) {
|
|
922
|
-
const contractClassId = Fr.
|
|
917
|
+
const contractClassId = Fr.fromHexString(classIdString);
|
|
923
918
|
const contractClass = await this.getContractClass(contractClassId);
|
|
924
919
|
if (!contractClass) {
|
|
925
920
|
this.#log.warn(`Skipping broadcasted functions as contract class ${contractClassId.toString()} was not found`);
|
|
@@ -1014,7 +1009,7 @@ class ArchiverStoreHelper
|
|
|
1014
1009
|
getBlocks(from: number, limit: number): Promise<L1Published<L2Block>[]> {
|
|
1015
1010
|
return this.store.getBlocks(from, limit);
|
|
1016
1011
|
}
|
|
1017
|
-
getBlockHeaders(from: number, limit: number): Promise<
|
|
1012
|
+
getBlockHeaders(from: number, limit: number): Promise<BlockHeader[]> {
|
|
1018
1013
|
return this.store.getBlockHeaders(from, limit);
|
|
1019
1014
|
}
|
|
1020
1015
|
getTxEffect(txHash: TxHash): Promise<InBlock<TxEffect> | undefined> {
|
|
@@ -10,11 +10,11 @@ import {
|
|
|
10
10
|
type TxScopedL2Log,
|
|
11
11
|
} from '@aztec/circuit-types';
|
|
12
12
|
import {
|
|
13
|
+
type BlockHeader,
|
|
13
14
|
type ContractClassPublic,
|
|
14
15
|
type ContractInstanceWithAddress,
|
|
15
16
|
type ExecutablePrivateFunctionWithMembershipProof,
|
|
16
17
|
type Fr,
|
|
17
|
-
type Header,
|
|
18
18
|
type PrivateLog,
|
|
19
19
|
type UnconstrainedFunctionWithMembershipProof,
|
|
20
20
|
} from '@aztec/circuits.js';
|
|
@@ -71,7 +71,7 @@ export interface ArchiverDataStore {
|
|
|
71
71
|
* @param limit - The number of blocks to return.
|
|
72
72
|
* @returns The requested L2 block headers.
|
|
73
73
|
*/
|
|
74
|
-
getBlockHeaders(from: number, limit: number): Promise<
|
|
74
|
+
getBlockHeaders(from: number, limit: number): Promise<BlockHeader[]>;
|
|
75
75
|
|
|
76
76
|
/**
|
|
77
77
|
* Gets a tx effect.
|
package/src/archiver/config.ts
CHANGED
|
@@ -21,6 +21,9 @@ export type ArchiverConfig = {
|
|
|
21
21
|
/** URL for an archiver service. If set, will return an archiver client as opposed to starting a new one. */
|
|
22
22
|
archiverUrl?: string;
|
|
23
23
|
|
|
24
|
+
/** URL for an L1 consensus client */
|
|
25
|
+
l1ConsensusClientUrl: string;
|
|
26
|
+
|
|
24
27
|
/** The polling interval in ms for retrieving new L2 blocks and encrypted logs. */
|
|
25
28
|
archiverPollingIntervalMS?: number;
|
|
26
29
|
|
|
@@ -44,6 +47,11 @@ export const archiverConfigMappings: ConfigMappingsType<ArchiverConfig> = {
|
|
|
44
47
|
description:
|
|
45
48
|
'URL for an archiver service. If set, will return an archiver client as opposed to starting a new one.',
|
|
46
49
|
},
|
|
50
|
+
l1ConsensusClientUrl: {
|
|
51
|
+
env: 'L1_CONSENSUS_CLIENT_URL',
|
|
52
|
+
description: 'URL for an L1 consensus client.',
|
|
53
|
+
parseEnv: (val: string) => (val ? val : 'http://localhost:5052'),
|
|
54
|
+
},
|
|
47
55
|
archiverPollingIntervalMS: {
|
|
48
56
|
env: 'ARCHIVER_POLLING_INTERVAL_MS',
|
|
49
57
|
description: 'The polling interval in ms for retrieving new L2 blocks and encrypted logs.',
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { Body, InboxLeaf, L2Block } from '@aztec/circuit-types';
|
|
2
|
-
import { AppendOnlyTreeSnapshot,
|
|
2
|
+
import { AppendOnlyTreeSnapshot, BlockHeader, Fr, Proof } from '@aztec/circuits.js';
|
|
3
3
|
import { asyncPool } from '@aztec/foundation/async-pool';
|
|
4
|
+
import { Blob } from '@aztec/foundation/blob';
|
|
4
5
|
import { type EthAddress } from '@aztec/foundation/eth-address';
|
|
5
6
|
import { type ViemSignature } from '@aztec/foundation/eth-signature';
|
|
6
|
-
import { type
|
|
7
|
+
import { type Logger, createLogger } from '@aztec/foundation/log';
|
|
7
8
|
import { numToUInt32BE } from '@aztec/foundation/serialize';
|
|
8
9
|
import { type InboxAbi, RollupAbi } from '@aztec/l1-artifacts';
|
|
9
10
|
|
|
@@ -36,20 +37,22 @@ export async function retrieveBlocksFromRollup(
|
|
|
36
37
|
publicClient: PublicClient,
|
|
37
38
|
searchStartBlock: bigint,
|
|
38
39
|
searchEndBlock: bigint,
|
|
39
|
-
logger:
|
|
40
|
+
logger: Logger = createLogger('archiver'),
|
|
40
41
|
): Promise<L1Published<L2Block>[]> {
|
|
41
42
|
const retrievedBlocks: L1Published<L2Block>[] = [];
|
|
42
43
|
do {
|
|
43
44
|
if (searchStartBlock > searchEndBlock) {
|
|
44
45
|
break;
|
|
45
46
|
}
|
|
46
|
-
const l2BlockProposedLogs =
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
47
|
+
const l2BlockProposedLogs = (
|
|
48
|
+
await rollup.getEvents.L2BlockProposed(
|
|
49
|
+
{},
|
|
50
|
+
{
|
|
51
|
+
fromBlock: searchStartBlock,
|
|
52
|
+
toBlock: searchEndBlock,
|
|
53
|
+
},
|
|
54
|
+
)
|
|
55
|
+
).filter(log => log.blockNumber! >= searchStartBlock && log.blockNumber! <= searchEndBlock);
|
|
53
56
|
|
|
54
57
|
if (l2BlockProposedLogs.length === 0) {
|
|
55
58
|
break;
|
|
@@ -78,7 +81,7 @@ export async function processL2BlockProposedLogs(
|
|
|
78
81
|
rollup: GetContractReturnType<typeof RollupAbi, PublicClient<HttpTransport, Chain>>,
|
|
79
82
|
publicClient: PublicClient,
|
|
80
83
|
logs: GetContractEventsReturnType<typeof RollupAbi, 'L2BlockProposed'>,
|
|
81
|
-
logger:
|
|
84
|
+
logger: Logger,
|
|
82
85
|
): Promise<L1Published<L2Block>[]> {
|
|
83
86
|
const retrievedBlocks: L1Published<L2Block>[] = [];
|
|
84
87
|
await asyncPool(10, logs, async log => {
|
|
@@ -135,7 +138,8 @@ async function getBlockFromRollupTx(
|
|
|
135
138
|
if (!allowedMethods.includes(functionName)) {
|
|
136
139
|
throw new Error(`Unexpected method called ${functionName}`);
|
|
137
140
|
}
|
|
138
|
-
|
|
141
|
+
// TODO(#9101): 'bodyHex' will be removed from below
|
|
142
|
+
const [decodedArgs, , bodyHex, blobInputs] = args! as readonly [
|
|
139
143
|
{
|
|
140
144
|
header: Hex;
|
|
141
145
|
archive: Hex;
|
|
@@ -148,11 +152,38 @@ async function getBlockFromRollupTx(
|
|
|
148
152
|
},
|
|
149
153
|
ViemSignature[],
|
|
150
154
|
Hex,
|
|
155
|
+
Hex,
|
|
151
156
|
];
|
|
152
157
|
|
|
153
|
-
const header =
|
|
158
|
+
const header = BlockHeader.fromBuffer(Buffer.from(hexToBytes(decodedArgs.header)));
|
|
159
|
+
// TODO(#9101): Retreiving the block body from calldata is a temporary soln before we have
|
|
160
|
+
// either a beacon chain client or link to some blob store. Web2 is ok because we will
|
|
161
|
+
// verify the block body vs the blob as below.
|
|
154
162
|
const blockBody = Body.fromBuffer(Buffer.from(hexToBytes(bodyHex)));
|
|
155
163
|
|
|
164
|
+
const blockFields = blockBody.toBlobFields();
|
|
165
|
+
// TODO(#9101): The below reconstruction is currently redundant, but once we extract blobs will be the way to construct blocks.
|
|
166
|
+
// The blob source will give us blockFields, and we must construct the body from them:
|
|
167
|
+
// TODO(#8954): When logs are refactored into fields, we won't need to inject them here.
|
|
168
|
+
const reconstructedBlock = Body.fromBlobFields(blockFields, blockBody.unencryptedLogs, blockBody.contractClassLogs);
|
|
169
|
+
|
|
170
|
+
if (!reconstructedBlock.toBuffer().equals(blockBody.toBuffer())) {
|
|
171
|
+
// TODO(#9101): Remove below check (without calldata there will be nothing to check against)
|
|
172
|
+
throw new Error(`Block reconstructed from blob fields does not match`);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
// TODO(#9101): Once we stop publishing calldata, we will still need the blobCheck below to ensure that the block we are building does correspond to the blob fields
|
|
176
|
+
const blobCheck = Blob.getBlobs(blockFields);
|
|
177
|
+
if (Blob.getEthBlobEvaluationInputs(blobCheck) !== blobInputs) {
|
|
178
|
+
// NB: We can just check the blobhash here, which is the first 32 bytes of blobInputs
|
|
179
|
+
// A mismatch means that the fields published in the blob in propose() do NOT match those in the extracted block.
|
|
180
|
+
throw new Error(
|
|
181
|
+
`Block body mismatched with blob for block number ${l2BlockNum}. \nExpected: ${Blob.getEthBlobEvaluationInputs(
|
|
182
|
+
blobCheck,
|
|
183
|
+
)} \nGot: ${blobInputs}`,
|
|
184
|
+
);
|
|
185
|
+
}
|
|
186
|
+
|
|
156
187
|
const blockNumberFromHeader = header.globalVariables.blockNumber.toBigInt();
|
|
157
188
|
|
|
158
189
|
if (blockNumberFromHeader !== l2BlockNum) {
|
|
@@ -189,13 +220,15 @@ export async function retrieveL1ToL2Messages(
|
|
|
189
220
|
break;
|
|
190
221
|
}
|
|
191
222
|
|
|
192
|
-
const messageSentLogs =
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
223
|
+
const messageSentLogs = (
|
|
224
|
+
await inbox.getEvents.MessageSent(
|
|
225
|
+
{},
|
|
226
|
+
{
|
|
227
|
+
fromBlock: searchStartBlock,
|
|
228
|
+
toBlock: searchEndBlock,
|
|
229
|
+
},
|
|
230
|
+
)
|
|
231
|
+
).filter(log => log.blockNumber! >= searchStartBlock && log.blockNumber! <= searchEndBlock);
|
|
199
232
|
|
|
200
233
|
if (messageSentLogs.length === 0) {
|
|
201
234
|
break;
|
|
@@ -203,7 +236,7 @@ export async function retrieveL1ToL2Messages(
|
|
|
203
236
|
|
|
204
237
|
for (const log of messageSentLogs) {
|
|
205
238
|
const { index, hash } = log.args;
|
|
206
|
-
retrievedL1ToL2Messages.push(new InboxLeaf(index!, Fr.
|
|
239
|
+
retrievedL1ToL2Messages.push(new InboxLeaf(index!, Fr.fromHexString(hash!)));
|
|
207
240
|
}
|
|
208
241
|
|
|
209
242
|
// handles the case when there are no new messages:
|
|
@@ -222,7 +255,7 @@ export async function retrieveL2ProofVerifiedEvents(
|
|
|
222
255
|
const logs = await publicClient.getLogs({
|
|
223
256
|
address: rollupAddress.toString(),
|
|
224
257
|
fromBlock: searchStartBlock,
|
|
225
|
-
toBlock: searchEndBlock ? searchEndBlock
|
|
258
|
+
toBlock: searchEndBlock ? searchEndBlock : undefined,
|
|
226
259
|
strict: true,
|
|
227
260
|
event: getAbiItem({ abi: RollupAbi, name: 'L2ProofVerified' }),
|
|
228
261
|
});
|
|
@@ -230,7 +263,7 @@ export async function retrieveL2ProofVerifiedEvents(
|
|
|
230
263
|
return logs.map(log => ({
|
|
231
264
|
l1BlockNumber: log.blockNumber,
|
|
232
265
|
l2BlockNumber: log.args.blockNumber,
|
|
233
|
-
proverId: Fr.
|
|
266
|
+
proverId: Fr.fromHexString(log.args.proverId),
|
|
234
267
|
txHash: log.transactionHash,
|
|
235
268
|
}));
|
|
236
269
|
}
|
|
@@ -297,8 +330,8 @@ export async function getProofFromSubmitProofTx(
|
|
|
297
330
|
];
|
|
298
331
|
|
|
299
332
|
aggregationObject = Buffer.from(hexToBytes(decodedArgs.aggregationObject));
|
|
300
|
-
proverId = Fr.
|
|
301
|
-
archiveRoot = Fr.
|
|
333
|
+
proverId = Fr.fromHexString(decodedArgs.args[6]);
|
|
334
|
+
archiveRoot = Fr.fromHexString(decodedArgs.args[1]);
|
|
302
335
|
proof = Proof.fromBuffer(Buffer.from(hexToBytes(decodedArgs.proof)));
|
|
303
336
|
} else {
|
|
304
337
|
throw new Error(`Unexpected proof method called ${functionName}`);
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type L2Block } from '@aztec/circuit-types';
|
|
2
|
-
import {
|
|
2
|
+
import { createLogger } from '@aztec/foundation/log';
|
|
3
3
|
import {
|
|
4
4
|
Attributes,
|
|
5
5
|
type Gauge,
|
|
@@ -8,23 +8,26 @@ import {
|
|
|
8
8
|
type LmdbStatsCallback,
|
|
9
9
|
Metrics,
|
|
10
10
|
type TelemetryClient,
|
|
11
|
+
type Tracer,
|
|
11
12
|
type UpDownCounter,
|
|
12
13
|
ValueType,
|
|
13
|
-
exponentialBuckets,
|
|
14
|
-
millisecondBuckets,
|
|
15
14
|
} from '@aztec/telemetry-client';
|
|
16
15
|
|
|
17
16
|
export class ArchiverInstrumentation {
|
|
17
|
+
public readonly tracer: Tracer;
|
|
18
|
+
|
|
18
19
|
private blockHeight: Gauge;
|
|
19
20
|
private blockSize: Gauge;
|
|
20
21
|
private syncDuration: Histogram;
|
|
22
|
+
private l1BlocksSynced: UpDownCounter;
|
|
21
23
|
private proofsSubmittedDelay: Histogram;
|
|
22
24
|
private proofsSubmittedCount: UpDownCounter;
|
|
23
25
|
private dbMetrics: LmdbMetrics;
|
|
24
26
|
|
|
25
|
-
private log =
|
|
27
|
+
private log = createLogger('archiver:instrumentation');
|
|
26
28
|
|
|
27
|
-
constructor(private telemetry: TelemetryClient, lmdbStats?: LmdbStatsCallback) {
|
|
29
|
+
private constructor(private telemetry: TelemetryClient, lmdbStats?: LmdbStatsCallback) {
|
|
30
|
+
this.tracer = telemetry.getTracer('Archiver');
|
|
28
31
|
const meter = telemetry.getMeter('Archiver');
|
|
29
32
|
this.blockHeight = meter.createGauge(Metrics.ARCHIVER_BLOCK_HEIGHT, {
|
|
30
33
|
description: 'The height of the latest block processed by the archiver',
|
|
@@ -40,9 +43,6 @@ export class ArchiverInstrumentation {
|
|
|
40
43
|
unit: 'ms',
|
|
41
44
|
description: 'Duration to sync a block',
|
|
42
45
|
valueType: ValueType.INT,
|
|
43
|
-
advice: {
|
|
44
|
-
explicitBucketBoundaries: exponentialBuckets(1, 16),
|
|
45
|
-
},
|
|
46
46
|
});
|
|
47
47
|
|
|
48
48
|
this.proofsSubmittedCount = meter.createUpDownCounter(Metrics.ARCHIVER_ROLLUP_PROOF_COUNT, {
|
|
@@ -54,29 +54,32 @@ export class ArchiverInstrumentation {
|
|
|
54
54
|
unit: 'ms',
|
|
55
55
|
description: 'Time after a block is submitted until its proof is published',
|
|
56
56
|
valueType: ValueType.INT,
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
this.l1BlocksSynced = meter.createUpDownCounter(Metrics.ARCHIVER_L1_BLOCKS_SYNCED, {
|
|
60
|
+
description: 'Number of blocks synced from L1',
|
|
61
|
+
valueType: ValueType.INT,
|
|
60
62
|
});
|
|
61
63
|
|
|
62
64
|
this.dbMetrics = new LmdbMetrics(
|
|
63
65
|
meter,
|
|
64
66
|
{
|
|
65
|
-
|
|
66
|
-
description: 'Database map size for the archiver',
|
|
67
|
-
},
|
|
68
|
-
{
|
|
69
|
-
name: Metrics.ARCHIVER_DB_USED_SIZE,
|
|
70
|
-
description: 'Database used size for the archiver',
|
|
71
|
-
},
|
|
72
|
-
{
|
|
73
|
-
name: Metrics.ARCHIVER_DB_NUM_ITEMS,
|
|
74
|
-
description: 'Num items in the archiver database',
|
|
67
|
+
[Attributes.DB_DATA_TYPE]: 'archiver',
|
|
75
68
|
},
|
|
76
69
|
lmdbStats,
|
|
77
70
|
);
|
|
78
71
|
}
|
|
79
72
|
|
|
73
|
+
public static async new(telemetry: TelemetryClient, lmdbStats?: LmdbStatsCallback) {
|
|
74
|
+
const instance = new ArchiverInstrumentation(telemetry, lmdbStats);
|
|
75
|
+
|
|
76
|
+
instance.l1BlocksSynced.add(0);
|
|
77
|
+
|
|
78
|
+
await instance.telemetry.flush();
|
|
79
|
+
|
|
80
|
+
return instance;
|
|
81
|
+
}
|
|
82
|
+
|
|
80
83
|
public isEnabled(): boolean {
|
|
81
84
|
return this.telemetry.isEnabled();
|
|
82
85
|
}
|
|
@@ -84,6 +87,7 @@ export class ArchiverInstrumentation {
|
|
|
84
87
|
public processNewBlocks(syncTimePerBlock: number, blocks: L2Block[]) {
|
|
85
88
|
this.syncDuration.record(Math.ceil(syncTimePerBlock));
|
|
86
89
|
this.blockHeight.record(Math.max(...blocks.map(b => b.number)));
|
|
90
|
+
this.l1BlocksSynced.add(blocks.length);
|
|
87
91
|
for (const block of blocks) {
|
|
88
92
|
this.blockSize.record(block.body.txEffects.length);
|
|
89
93
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Body, type InBlock, L2Block, L2BlockHash, type TxEffect, type TxHash, TxReceipt } from '@aztec/circuit-types';
|
|
2
|
-
import { AppendOnlyTreeSnapshot, type AztecAddress,
|
|
3
|
-
import {
|
|
2
|
+
import { AppendOnlyTreeSnapshot, type AztecAddress, BlockHeader, INITIAL_L2_BLOCK_NUM } from '@aztec/circuits.js';
|
|
3
|
+
import { createLogger } from '@aztec/foundation/log';
|
|
4
4
|
import { type AztecKVStore, type AztecMap, type AztecSingleton, type Range } from '@aztec/kv-store';
|
|
5
5
|
|
|
6
6
|
import { type L1Published, type L1PublishedData } from '../structs/published.js';
|
|
@@ -38,7 +38,7 @@ export class BlockStore {
|
|
|
38
38
|
/** Index mapping a contract's address (as a string) to its location in a block */
|
|
39
39
|
#contractIndex: AztecMap<string, BlockIndexValue>;
|
|
40
40
|
|
|
41
|
-
#log =
|
|
41
|
+
#log = createLogger('archiver:block_store');
|
|
42
42
|
|
|
43
43
|
constructor(private db: AztecKVStore) {
|
|
44
44
|
this.#blocks = db.openMap('archiver_blocks');
|
|
@@ -147,14 +147,14 @@ export class BlockStore {
|
|
|
147
147
|
* @param limit - The number of blocks to return.
|
|
148
148
|
* @returns The requested L2 block headers
|
|
149
149
|
*/
|
|
150
|
-
*getBlockHeaders(start: number, limit: number): IterableIterator<
|
|
150
|
+
*getBlockHeaders(start: number, limit: number): IterableIterator<BlockHeader> {
|
|
151
151
|
for (const blockStorage of this.#blocks.values(this.#computeBlockRange(start, limit))) {
|
|
152
|
-
yield
|
|
152
|
+
yield BlockHeader.fromBuffer(blockStorage.header);
|
|
153
153
|
}
|
|
154
154
|
}
|
|
155
155
|
|
|
156
156
|
private getBlockFromBlockStorage(blockStorage: BlockStorage) {
|
|
157
|
-
const header =
|
|
157
|
+
const header = BlockHeader.fromBuffer(blockStorage.header);
|
|
158
158
|
const archive = AppendOnlyTreeSnapshot.fromBuffer(blockStorage.archive);
|
|
159
159
|
const blockHash = header.hash().toString();
|
|
160
160
|
const blockBodyBuffer = this.#blockBodies.get(blockHash);
|
|
@@ -53,7 +53,7 @@ export class ContractClassStore {
|
|
|
53
53
|
}
|
|
54
54
|
|
|
55
55
|
getContractClassIds(): Fr[] {
|
|
56
|
-
return Array.from(this.#contractClasses.keys()).map(key => Fr.
|
|
56
|
+
return Array.from(this.#contractClasses.keys()).map(key => Fr.fromHexString(key));
|
|
57
57
|
}
|
|
58
58
|
|
|
59
59
|
async addFunctions(
|
|
@@ -9,17 +9,17 @@ import {
|
|
|
9
9
|
type TxScopedL2Log,
|
|
10
10
|
} from '@aztec/circuit-types';
|
|
11
11
|
import {
|
|
12
|
+
type BlockHeader,
|
|
12
13
|
type ContractClassPublic,
|
|
13
14
|
type ContractInstanceWithAddress,
|
|
14
15
|
type ExecutablePrivateFunctionWithMembershipProof,
|
|
15
16
|
type Fr,
|
|
16
|
-
type Header,
|
|
17
17
|
type PrivateLog,
|
|
18
18
|
type UnconstrainedFunctionWithMembershipProof,
|
|
19
19
|
} from '@aztec/circuits.js';
|
|
20
20
|
import { type ContractArtifact, FunctionSelector } from '@aztec/foundation/abi';
|
|
21
21
|
import { type AztecAddress } from '@aztec/foundation/aztec-address';
|
|
22
|
-
import {
|
|
22
|
+
import { createLogger } from '@aztec/foundation/log';
|
|
23
23
|
import { type AztecKVStore } from '@aztec/kv-store';
|
|
24
24
|
|
|
25
25
|
import { type ArchiverDataStore, type ArchiverL1SynchPoint } from '../archiver_store.js';
|
|
@@ -46,7 +46,7 @@ export class KVArchiverDataStore implements ArchiverDataStore {
|
|
|
46
46
|
#contractArtifactStore: ContractArtifactsStore;
|
|
47
47
|
private functionNames = new Map<string, string>();
|
|
48
48
|
|
|
49
|
-
#log =
|
|
49
|
+
#log = createLogger('archiver:data-store');
|
|
50
50
|
|
|
51
51
|
constructor(private db: AztecKVStore, logsMaxPageSize: number = 1000) {
|
|
52
52
|
this.#blockStore = new BlockStore(db);
|
|
@@ -171,7 +171,7 @@ export class KVArchiverDataStore implements ArchiverDataStore {
|
|
|
171
171
|
* @param limit - The number of blocks to return.
|
|
172
172
|
* @returns The requested L2 blocks
|
|
173
173
|
*/
|
|
174
|
-
getBlockHeaders(start: number, limit: number): Promise<
|
|
174
|
+
getBlockHeaders(start: number, limit: number): Promise<BlockHeader[]> {
|
|
175
175
|
try {
|
|
176
176
|
return Promise.resolve(Array.from(this.#blockStore.getBlockHeaders(start, limit)));
|
|
177
177
|
} catch (err) {
|
|
@@ -11,7 +11,7 @@ import {
|
|
|
11
11
|
} from '@aztec/circuit-types';
|
|
12
12
|
import { Fr, PrivateLog } from '@aztec/circuits.js';
|
|
13
13
|
import { INITIAL_L2_BLOCK_NUM, MAX_NOTE_HASHES_PER_TX } from '@aztec/circuits.js/constants';
|
|
14
|
-
import {
|
|
14
|
+
import { createLogger } from '@aztec/foundation/log';
|
|
15
15
|
import { BufferReader } from '@aztec/foundation/serialize';
|
|
16
16
|
import { type AztecKVStore, type AztecMap } from '@aztec/kv-store';
|
|
17
17
|
|
|
@@ -27,7 +27,7 @@ export class LogStore {
|
|
|
27
27
|
#unencryptedLogsByBlock: AztecMap<number, Buffer>;
|
|
28
28
|
#contractClassLogsByBlock: AztecMap<number, Buffer>;
|
|
29
29
|
#logsMaxPageSize: number;
|
|
30
|
-
#log =
|
|
30
|
+
#log = createLogger('archiver:log_store');
|
|
31
31
|
|
|
32
32
|
constructor(private db: AztecKVStore, private blockStore: BlockStore, logsMaxPageSize: number = 1000) {
|
|
33
33
|
this.#logsByTag = db.openMap('archiver_tagged_logs_by_tag');
|