@aztec/archiver 0.0.1-commit.e588bc7e5 → 0.0.1-commit.e5a3663dd
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.d.ts +19 -11
- package/dest/archiver.d.ts.map +1 -1
- package/dest/archiver.js +96 -53
- package/dest/config.d.ts +3 -1
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +14 -3
- package/dest/errors.d.ts +32 -5
- package/dest/errors.d.ts.map +1 -1
- package/dest/errors.js +51 -6
- package/dest/factory.d.ts +4 -4
- package/dest/factory.d.ts.map +1 -1
- package/dest/factory.js +13 -10
- package/dest/index.d.ts +10 -3
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +9 -2
- package/dest/l1/calldata_retriever.d.ts +2 -1
- package/dest/l1/calldata_retriever.d.ts.map +1 -1
- package/dest/l1/calldata_retriever.js +9 -4
- package/dest/l1/data_retrieval.d.ts +18 -9
- package/dest/l1/data_retrieval.d.ts.map +1 -1
- package/dest/l1/data_retrieval.js +13 -19
- package/dest/l1/validate_historical_logs.d.ts +23 -0
- package/dest/l1/validate_historical_logs.d.ts.map +1 -0
- package/dest/l1/validate_historical_logs.js +108 -0
- package/dest/modules/contract_data_source_adapter.d.ts +25 -0
- package/dest/modules/contract_data_source_adapter.d.ts.map +1 -0
- package/dest/modules/contract_data_source_adapter.js +42 -0
- package/dest/modules/data_source_base.d.ts +16 -10
- package/dest/modules/data_source_base.d.ts.map +1 -1
- package/dest/modules/data_source_base.js +71 -60
- package/dest/modules/data_store_updater.d.ts +16 -9
- package/dest/modules/data_store_updater.d.ts.map +1 -1
- package/dest/modules/data_store_updater.js +52 -40
- package/dest/modules/instrumentation.d.ts +7 -2
- package/dest/modules/instrumentation.d.ts.map +1 -1
- package/dest/modules/instrumentation.js +22 -6
- package/dest/modules/l1_synchronizer.d.ts +8 -4
- package/dest/modules/l1_synchronizer.d.ts.map +1 -1
- package/dest/modules/l1_synchronizer.js +212 -79
- package/dest/modules/validation.d.ts +4 -3
- package/dest/modules/validation.d.ts.map +1 -1
- package/dest/modules/validation.js +4 -4
- package/dest/store/block_store.d.ts +60 -21
- package/dest/store/block_store.d.ts.map +1 -1
- package/dest/store/block_store.js +229 -70
- package/dest/store/contract_class_store.d.ts +17 -3
- package/dest/store/contract_class_store.d.ts.map +1 -1
- package/dest/store/contract_class_store.js +17 -1
- package/dest/store/contract_instance_store.d.ts +28 -1
- package/dest/store/contract_instance_store.d.ts.map +1 -1
- package/dest/store/contract_instance_store.js +31 -0
- package/dest/store/data_stores.d.ts +68 -0
- package/dest/store/data_stores.d.ts.map +1 -0
- package/dest/store/data_stores.js +50 -0
- package/dest/store/function_names_cache.d.ts +17 -0
- package/dest/store/function_names_cache.d.ts.map +1 -0
- package/dest/store/function_names_cache.js +30 -0
- package/dest/store/l2_tips_cache.d.ts +1 -1
- package/dest/store/l2_tips_cache.d.ts.map +1 -1
- package/dest/store/l2_tips_cache.js +3 -3
- package/dest/store/log_store.d.ts +1 -1
- package/dest/store/log_store.d.ts.map +1 -1
- package/dest/store/log_store.js +2 -4
- package/dest/store/message_store.d.ts +9 -3
- package/dest/store/message_store.d.ts.map +1 -1
- package/dest/store/message_store.js +31 -1
- package/dest/test/fake_l1_state.d.ts +14 -3
- package/dest/test/fake_l1_state.d.ts.map +1 -1
- package/dest/test/fake_l1_state.js +55 -15
- package/dest/test/mock_l2_block_source.d.ts +12 -3
- package/dest/test/mock_l2_block_source.d.ts.map +1 -1
- package/dest/test/mock_l2_block_source.js +24 -2
- package/dest/test/noop_l1_archiver.d.ts +4 -4
- package/dest/test/noop_l1_archiver.d.ts.map +1 -1
- package/dest/test/noop_l1_archiver.js +9 -7
- package/package.json +13 -13
- package/src/archiver.ts +113 -52
- package/src/config.ts +15 -1
- package/src/errors.ts +75 -8
- package/src/factory.ts +11 -10
- package/src/index.ts +17 -2
- package/src/l1/calldata_retriever.ts +15 -4
- package/src/l1/data_retrieval.ts +30 -35
- package/src/l1/validate_historical_logs.ts +140 -0
- package/src/modules/contract_data_source_adapter.ts +59 -0
- package/src/modules/data_source_base.ts +75 -57
- package/src/modules/data_store_updater.ts +71 -39
- package/src/modules/instrumentation.ts +27 -7
- package/src/modules/l1_synchronizer.ts +301 -83
- package/src/modules/validation.ts +8 -7
- package/src/store/block_store.ts +264 -77
- package/src/store/contract_class_store.ts +28 -2
- package/src/store/contract_instance_store.ts +43 -0
- package/src/store/data_stores.ts +108 -0
- package/src/store/function_names_cache.ts +37 -0
- package/src/store/l2_tips_cache.ts +9 -3
- package/src/store/log_store.ts +2 -5
- package/src/store/message_store.ts +35 -2
- package/src/test/fake_l1_state.ts +62 -24
- package/src/test/mock_l2_block_source.ts +23 -2
- package/src/test/noop_l1_archiver.ts +9 -7
- package/dest/store/kv_archiver_store.d.ts +0 -377
- package/dest/store/kv_archiver_store.d.ts.map +0 -1
- package/dest/store/kv_archiver_store.js +0 -494
- package/src/store/kv_archiver_store.ts +0 -713
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { BlockNumber, CheckpointNumber } from '@aztec/foundation/branded-types';
|
|
2
|
-
import type { L2Block, ValidateCheckpointResult } from '@aztec/stdlib/block';
|
|
3
|
-
import { type ProposedCheckpointInput, type PublishedCheckpoint } from '@aztec/stdlib/checkpoint';
|
|
4
|
-
import type {
|
|
2
|
+
import type { CommitteeAttestation, L2Block, ValidateCheckpointResult } from '@aztec/stdlib/block';
|
|
3
|
+
import { type L1PublishedData, type ProposedCheckpointInput, type PublishedCheckpoint } from '@aztec/stdlib/checkpoint';
|
|
4
|
+
import type { ArchiverDataStores } from '../store/data_stores.js';
|
|
5
5
|
import type { L2TipsCache } from '../store/l2_tips_cache.js';
|
|
6
6
|
/** Result of adding checkpoints with information about any pruned blocks. */
|
|
7
7
|
type ReconcileCheckpointsResult = {
|
|
@@ -12,11 +12,11 @@ type ReconcileCheckpointsResult = {
|
|
|
12
12
|
};
|
|
13
13
|
/** Archiver helper module to handle updates to the data store. */
|
|
14
14
|
export declare class ArchiverDataStoreUpdater {
|
|
15
|
-
private
|
|
15
|
+
private stores;
|
|
16
16
|
private l2TipsCache?;
|
|
17
17
|
private opts;
|
|
18
18
|
private readonly log;
|
|
19
|
-
constructor(
|
|
19
|
+
constructor(stores: ArchiverDataStores, l2TipsCache?: L2TipsCache | undefined, opts?: {
|
|
20
20
|
rollupManaLimit?: number;
|
|
21
21
|
});
|
|
22
22
|
/**
|
|
@@ -34,13 +34,20 @@ export declare class ArchiverDataStoreUpdater {
|
|
|
34
34
|
* Adds new checkpoints to the store with contract class/instance extraction from logs.
|
|
35
35
|
* Prunes any local blocks that conflict with checkpoint data (by comparing archive roots).
|
|
36
36
|
* Extracts ContractClassPublished, ContractInstancePublished, ContractInstanceUpdated events from the checkpoint block logs.
|
|
37
|
+
* If `promoteProposed` is supplied, the proposed-checkpoint promotion runs inside the same transaction
|
|
38
|
+
* as the added checkpoints so both updates are applied atomically.
|
|
37
39
|
*
|
|
38
|
-
* @param checkpoints - The published checkpoints to add.
|
|
40
|
+
* @param checkpoints - The published checkpoints to add (excluding any being promoted from proposed).
|
|
39
41
|
* @param pendingChainValidationStatus - Optional validation status to set.
|
|
42
|
+
* @param promoteProposed - Optional promotion of the current proposed checkpoint (fast path when blocks are already local).
|
|
40
43
|
* @returns Result with information about any pruned blocks.
|
|
41
44
|
*/
|
|
42
|
-
addCheckpoints(checkpoints: PublishedCheckpoint[], pendingChainValidationStatus?: ValidateCheckpointResult
|
|
43
|
-
|
|
45
|
+
addCheckpoints(checkpoints: PublishedCheckpoint[], pendingChainValidationStatus?: ValidateCheckpointResult, promoteProposed?: {
|
|
46
|
+
l1: L1PublishedData;
|
|
47
|
+
attestations: CommitteeAttestation[];
|
|
48
|
+
checkpoint: PublishedCheckpoint;
|
|
49
|
+
}, evictProposedFrom?: CheckpointNumber): Promise<ReconcileCheckpointsResult>;
|
|
50
|
+
addProposedCheckpoint(proposedCheckpoint: ProposedCheckpointInput): Promise<void>;
|
|
44
51
|
private pruneMismatchingLocalBlocks;
|
|
45
52
|
/**
|
|
46
53
|
* Removes all uncheckpointed blocks strictly after the specified block number and cleans up associated contract data.
|
|
@@ -83,4 +90,4 @@ export declare class ArchiverDataStoreUpdater {
|
|
|
83
90
|
private updateUpdatedContractInstances;
|
|
84
91
|
}
|
|
85
92
|
export {};
|
|
86
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
93
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YV9zdG9yZV91cGRhdGVyLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbW9kdWxlcy9kYXRhX3N0b3JlX3VwZGF0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFdBQVcsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBUWhGLE9BQU8sS0FBSyxFQUFFLG9CQUFvQixFQUFFLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ25HLE9BQU8sRUFDTCxLQUFLLGVBQWUsRUFDcEIsS0FBSyx1QkFBdUIsRUFDNUIsS0FBSyxtQkFBbUIsRUFFekIsTUFBTSwwQkFBMEIsQ0FBQztBQVNsQyxPQUFPLEtBQUssRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ2xFLE9BQU8sS0FBSyxFQUFFLFdBQVcsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBUTdELDZFQUE2RTtBQUM3RSxLQUFLLDBCQUEwQixHQUFHO0lBQ2hDLG1FQUFtRTtJQUNuRSxZQUFZLEVBQUUsT0FBTyxFQUFFLEdBQUcsU0FBUyxDQUFDO0lBQ3BDLGlGQUFpRjtJQUNqRiw4QkFBOEIsRUFBRSxXQUFXLEdBQUcsU0FBUyxDQUFDO0NBQ3pELENBQUM7QUFFRixrRUFBa0U7QUFDbEUscUJBQWEsd0JBQXdCO0lBSWpDLE9BQU8sQ0FBQyxNQUFNO0lBQ2QsT0FBTyxDQUFDLFdBQVcsQ0FBQztJQUNwQixPQUFPLENBQUMsSUFBSTtJQUxkLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUEwQztJQUU5RCxZQUNVLE1BQU0sRUFBRSxrQkFBa0IsRUFDMUIsV0FBVyxDQUFDLHlCQUFhLEVBQ3pCLElBQUksR0FBRTtRQUFFLGVBQWUsQ0FBQyxFQUFFLE1BQU0sQ0FBQTtLQUFPLEVBQzdDO0lBRUo7Ozs7Ozs7O09BUUc7SUFDVSxnQkFBZ0IsQ0FDM0IsS0FBSyxFQUFFLE9BQU8sRUFDZCw0QkFBNEIsQ0FBQyxFQUFFLHdCQUF3QixHQUN0RCxPQUFPLENBQUMsT0FBTyxDQUFDLENBa0JsQjtJQUVEOzs7Ozs7Ozs7Ozs7T0FZRztJQUNVLGNBQWMsQ0FDekIsV0FBVyxFQUFFLG1CQUFtQixFQUFFLEVBQ2xDLDRCQUE0QixDQUFDLEVBQUUsd0JBQXdCLEVBQ3ZELGVBQWUsQ0FBQyxFQUFFO1FBQ2hCLEVBQUUsRUFBRSxlQUFlLENBQUM7UUFDcEIsWUFBWSxFQUFFLG9CQUFvQixFQUFFLENBQUM7UUFDckMsVUFBVSxFQUFFLG1CQUFtQixDQUFDO0tBQ2pDLEVBQ0QsaUJBQWlCLENBQUMsRUFBRSxnQkFBZ0IsR0FDbkMsT0FBTyxDQUFDLDBCQUEwQixDQUFDLENBOENyQztJQUVZLHFCQUFxQixDQUFDLGtCQUFrQixFQUFFLHVCQUF1QixpQkFPN0U7WUFRYSwyQkFBMkI7SUFtRXpDOzs7Ozs7OztPQVFHO0lBQ1UsK0JBQStCLENBQUMsV0FBVyxFQUFFLFdBQVcsR0FBRyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FtQnpGO1lBTWEsaUJBQWlCO0lBYS9COzs7Ozs7OztPQVFHO0lBQ1Usc0JBQXNCLENBQUMsZ0JBQWdCLEVBQUUsZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQWV4RjtJQUVEOzs7T0FHRztJQUNVLHlCQUF5QixDQUFDLGdCQUFnQixFQUFFLGdCQUFnQixHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FLeEY7SUFFRDs7O09BR0c7SUFDVSw0QkFBNEIsQ0FBQyxnQkFBZ0IsRUFBRSxnQkFBZ0IsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBSzNGO0lBRUQsNkRBQTZEO0lBQzdELE9BQU8sQ0FBQyxtQkFBbUI7SUFJM0IscURBQXFEO0lBQ3JELE9BQU8sQ0FBQyx3QkFBd0I7WUFLbEIsc0JBQXNCO1lBaUJ0Qiw4QkFBOEI7WUErQzlCLCtCQUErQjtZQTBDL0IsOEJBQThCO0NBc0I3QyJ9
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data_store_updater.d.ts","sourceRoot":"","sources":["../../src/modules/data_store_updater.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAQhF,OAAO,KAAK,EAAE,OAAO,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"data_store_updater.d.ts","sourceRoot":"","sources":["../../src/modules/data_store_updater.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAQhF,OAAO,KAAK,EAAE,oBAAoB,EAAE,OAAO,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AACnG,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,uBAAuB,EAC5B,KAAK,mBAAmB,EAEzB,MAAM,0BAA0B,CAAC;AASlC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAQ7D,6EAA6E;AAC7E,KAAK,0BAA0B,GAAG;IAChC,mEAAmE;IACnE,YAAY,EAAE,OAAO,EAAE,GAAG,SAAS,CAAC;IACpC,iFAAiF;IACjF,8BAA8B,EAAE,WAAW,GAAG,SAAS,CAAC;CACzD,CAAC;AAEF,kEAAkE;AAClE,qBAAa,wBAAwB;IAIjC,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,WAAW,CAAC;IACpB,OAAO,CAAC,IAAI;IALd,OAAO,CAAC,QAAQ,CAAC,GAAG,CAA0C;IAE9D,YACU,MAAM,EAAE,kBAAkB,EAC1B,WAAW,CAAC,yBAAa,EACzB,IAAI,GAAE;QAAE,eAAe,CAAC,EAAE,MAAM,CAAA;KAAO,EAC7C;IAEJ;;;;;;;;OAQG;IACU,gBAAgB,CAC3B,KAAK,EAAE,OAAO,EACd,4BAA4B,CAAC,EAAE,wBAAwB,GACtD,OAAO,CAAC,OAAO,CAAC,CAkBlB;IAED;;;;;;;;;;;;OAYG;IACU,cAAc,CACzB,WAAW,EAAE,mBAAmB,EAAE,EAClC,4BAA4B,CAAC,EAAE,wBAAwB,EACvD,eAAe,CAAC,EAAE;QAChB,EAAE,EAAE,eAAe,CAAC;QACpB,YAAY,EAAE,oBAAoB,EAAE,CAAC;QACrC,UAAU,EAAE,mBAAmB,CAAC;KACjC,EACD,iBAAiB,CAAC,EAAE,gBAAgB,GACnC,OAAO,CAAC,0BAA0B,CAAC,CA8CrC;IAEY,qBAAqB,CAAC,kBAAkB,EAAE,uBAAuB,iBAO7E;YAQa,2BAA2B;IAmEzC;;;;;;;;OAQG;IACU,+BAA+B,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAmBzF;YAMa,iBAAiB;IAa/B;;;;;;;;OAQG;IACU,sBAAsB,CAAC,gBAAgB,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC,CAexF;IAED;;;OAGG;IACU,yBAAyB,CAAC,gBAAgB,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAKxF;IAED;;;OAGG;IACU,4BAA4B,CAAC,gBAAgB,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAK3F;IAED,6DAA6D;IAC7D,OAAO,CAAC,mBAAmB;IAI3B,qDAAqD;IACrD,OAAO,CAAC,wBAAwB;YAKlB,sBAAsB;YAiBtB,8BAA8B;YA+C9B,+BAA+B;YA0C/B,8BAA8B;CAsB7C"}
|
|
@@ -11,12 +11,12 @@ import { computeContractAddressFromInstance, computeContractClassId } from '@azt
|
|
|
11
11
|
return Operation;
|
|
12
12
|
}(Operation || {});
|
|
13
13
|
/** Archiver helper module to handle updates to the data store. */ export class ArchiverDataStoreUpdater {
|
|
14
|
-
|
|
14
|
+
stores;
|
|
15
15
|
l2TipsCache;
|
|
16
16
|
opts;
|
|
17
17
|
log;
|
|
18
|
-
constructor(
|
|
19
|
-
this.
|
|
18
|
+
constructor(stores, l2TipsCache, opts = {}){
|
|
19
|
+
this.stores = stores;
|
|
20
20
|
this.l2TipsCache = l2TipsCache;
|
|
21
21
|
this.opts = opts;
|
|
22
22
|
this.log = createLogger('archiver:store_updater');
|
|
@@ -30,13 +30,13 @@ import { computeContractAddressFromInstance, computeContractClassId } from '@azt
|
|
|
30
30
|
* @param pendingChainValidationStatus - Optional validation status to set.
|
|
31
31
|
* @returns True if the operation is successful.
|
|
32
32
|
*/ async addProposedBlock(block, pendingChainValidationStatus) {
|
|
33
|
-
const result = await this.
|
|
34
|
-
await this.
|
|
33
|
+
const result = await this.stores.db.transactionAsync(async ()=>{
|
|
34
|
+
await this.stores.blocks.addProposedBlock(block);
|
|
35
35
|
const opResults = await Promise.all([
|
|
36
36
|
// Update the pending chain validation status if provided
|
|
37
|
-
pendingChainValidationStatus && this.
|
|
37
|
+
pendingChainValidationStatus && this.stores.blocks.setPendingChainValidationStatus(pendingChainValidationStatus),
|
|
38
38
|
// Add any logs emitted during the retrieved block
|
|
39
|
-
this.
|
|
39
|
+
this.stores.logs.addLogs([
|
|
40
40
|
block
|
|
41
41
|
]),
|
|
42
42
|
// Unroll all logs emitted during the retrieved block and extract any contract classes and instances from it
|
|
@@ -52,29 +52,41 @@ import { computeContractAddressFromInstance, computeContractClassId } from '@azt
|
|
|
52
52
|
* Adds new checkpoints to the store with contract class/instance extraction from logs.
|
|
53
53
|
* Prunes any local blocks that conflict with checkpoint data (by comparing archive roots).
|
|
54
54
|
* Extracts ContractClassPublished, ContractInstancePublished, ContractInstanceUpdated events from the checkpoint block logs.
|
|
55
|
+
* If `promoteProposed` is supplied, the proposed-checkpoint promotion runs inside the same transaction
|
|
56
|
+
* as the added checkpoints so both updates are applied atomically.
|
|
55
57
|
*
|
|
56
|
-
* @param checkpoints - The published checkpoints to add.
|
|
58
|
+
* @param checkpoints - The published checkpoints to add (excluding any being promoted from proposed).
|
|
57
59
|
* @param pendingChainValidationStatus - Optional validation status to set.
|
|
60
|
+
* @param promoteProposed - Optional promotion of the current proposed checkpoint (fast path when blocks are already local).
|
|
58
61
|
* @returns Result with information about any pruned blocks.
|
|
59
|
-
*/ async addCheckpoints(checkpoints, pendingChainValidationStatus) {
|
|
62
|
+
*/ async addCheckpoints(checkpoints, pendingChainValidationStatus, promoteProposed, evictProposedFrom) {
|
|
60
63
|
for (const checkpoint of checkpoints){
|
|
61
64
|
validateCheckpoint(checkpoint.checkpoint, {
|
|
62
65
|
rollupManaLimit: this.opts?.rollupManaLimit
|
|
63
66
|
});
|
|
64
67
|
}
|
|
65
|
-
|
|
68
|
+
if (promoteProposed) {
|
|
69
|
+
validateCheckpoint(promoteProposed.checkpoint.checkpoint, {
|
|
70
|
+
rollupManaLimit: this.opts?.rollupManaLimit
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
const result = await this.stores.db.transactionAsync(async ()=>{
|
|
66
74
|
// Before adding checkpoints, check for conflicts with local blocks if any
|
|
67
75
|
const { prunedBlocks, lastAlreadyInsertedBlockNumber } = await this.pruneMismatchingLocalBlocks(checkpoints);
|
|
68
|
-
await this.
|
|
76
|
+
await this.stores.blocks.addCheckpoints(checkpoints);
|
|
69
77
|
// Filter out blocks that were already inserted via addProposedBlock() to avoid duplicating logs/contract data
|
|
70
78
|
const newBlocks = checkpoints.flatMap((ch)=>ch.checkpoint.blocks).filter((b)=>lastAlreadyInsertedBlockNumber === undefined || b.number > lastAlreadyInsertedBlockNumber);
|
|
71
79
|
await Promise.all([
|
|
72
80
|
// Update the pending chain validation status if provided
|
|
73
|
-
pendingChainValidationStatus && this.
|
|
81
|
+
pendingChainValidationStatus && this.stores.blocks.setPendingChainValidationStatus(pendingChainValidationStatus),
|
|
74
82
|
// Add any logs emitted during the retrieved blocks
|
|
75
|
-
this.
|
|
83
|
+
this.stores.logs.addLogs(newBlocks),
|
|
76
84
|
// Unroll all logs emitted during the retrieved blocks and extract any contract classes and instances from them
|
|
77
|
-
...newBlocks.map((block)=>this.addContractDataToDb(block))
|
|
85
|
+
...newBlocks.map((block)=>this.addContractDataToDb(block)),
|
|
86
|
+
// Promote the proposed checkpoint if requested (uses explicit checkpoint number)
|
|
87
|
+
promoteProposed ? this.stores.blocks.promoteProposedToCheckpointed(promoteProposed.checkpoint.checkpoint.number, promoteProposed.l1, promoteProposed.attestations, promoteProposed.checkpoint.checkpoint.archive.root) : undefined,
|
|
88
|
+
// Evict pending checkpoints that diverged from what L1 mined
|
|
89
|
+
evictProposedFrom !== undefined ? this.stores.blocks.evictProposedCheckpointsFrom(evictProposedFrom) : undefined
|
|
78
90
|
]);
|
|
79
91
|
await this.l2TipsCache?.refresh();
|
|
80
92
|
return {
|
|
@@ -84,9 +96,9 @@ import { computeContractAddressFromInstance, computeContractClassId } from '@azt
|
|
|
84
96
|
});
|
|
85
97
|
return result;
|
|
86
98
|
}
|
|
87
|
-
async
|
|
88
|
-
const result = await this.
|
|
89
|
-
await this.
|
|
99
|
+
async addProposedCheckpoint(proposedCheckpoint) {
|
|
100
|
+
const result = await this.stores.db.transactionAsync(async ()=>{
|
|
101
|
+
await this.stores.blocks.addProposedCheckpoint(proposedCheckpoint);
|
|
90
102
|
await this.l2TipsCache?.refresh();
|
|
91
103
|
});
|
|
92
104
|
return result;
|
|
@@ -98,8 +110,8 @@ import { computeContractAddressFromInstance, computeContractClassId } from '@azt
|
|
|
98
110
|
* and when checkpoints are added afterward, they include all the correct blocks.
|
|
99
111
|
*/ async pruneMismatchingLocalBlocks(checkpoints) {
|
|
100
112
|
const [lastCheckpointedBlockNumber, lastBlockNumber] = await Promise.all([
|
|
101
|
-
this.
|
|
102
|
-
this.
|
|
113
|
+
this.stores.blocks.getCheckpointedL2BlockNumber(),
|
|
114
|
+
this.stores.blocks.getLatestL2BlockNumber()
|
|
103
115
|
]);
|
|
104
116
|
// Exit early if there are no local uncheckpointed blocks
|
|
105
117
|
if (lastBlockNumber === lastCheckpointedBlockNumber) {
|
|
@@ -109,7 +121,7 @@ import { computeContractAddressFromInstance, computeContractClassId } from '@azt
|
|
|
109
121
|
};
|
|
110
122
|
}
|
|
111
123
|
// Get all uncheckpointed local blocks
|
|
112
|
-
const uncheckpointedLocalBlocks = await this.
|
|
124
|
+
const uncheckpointedLocalBlocks = await this.stores.blocks.getBlocks(BlockNumber.add(lastCheckpointedBlockNumber, 1), lastBlockNumber - lastCheckpointedBlockNumber);
|
|
113
125
|
let lastAlreadyInsertedBlockNumber;
|
|
114
126
|
for (const publishedCheckpoint of checkpoints){
|
|
115
127
|
const checkpointBlocks = publishedCheckpoint.checkpoint.blocks;
|
|
@@ -168,15 +180,15 @@ import { computeContractAddressFromInstance, computeContractClassId } from '@azt
|
|
|
168
180
|
* @returns The removed blocks.
|
|
169
181
|
* @throws Error if any block to be removed is checkpointed.
|
|
170
182
|
*/ async removeUncheckpointedBlocksAfter(blockNumber) {
|
|
171
|
-
const result = await this.
|
|
183
|
+
const result = await this.stores.db.transactionAsync(async ()=>{
|
|
172
184
|
// Verify we're only removing uncheckpointed blocks
|
|
173
|
-
const lastCheckpointedBlockNumber = await this.
|
|
185
|
+
const lastCheckpointedBlockNumber = await this.stores.blocks.getCheckpointedL2BlockNumber();
|
|
174
186
|
if (blockNumber < lastCheckpointedBlockNumber) {
|
|
175
187
|
throw new Error(`Cannot remove blocks after ${blockNumber} because checkpointed blocks exist up to ${lastCheckpointedBlockNumber}`);
|
|
176
188
|
}
|
|
177
189
|
const result = await this.removeBlocksAfter(blockNumber);
|
|
178
|
-
// Clear
|
|
179
|
-
await this.
|
|
190
|
+
// Clear all pending proposed checkpoints since their blocks have been pruned
|
|
191
|
+
await this.stores.blocks.deleteProposedCheckpoints();
|
|
180
192
|
await this.l2TipsCache?.refresh();
|
|
181
193
|
return result;
|
|
182
194
|
});
|
|
@@ -187,10 +199,10 @@ import { computeContractAddressFromInstance, computeContractClassId } from '@azt
|
|
|
187
199
|
* Does not remove their checkpoints.
|
|
188
200
|
*/ async removeBlocksAfter(blockNumber) {
|
|
189
201
|
// First get the blocks to be removed so we can clean up contract data
|
|
190
|
-
const removedBlocks = await this.
|
|
202
|
+
const removedBlocks = await this.stores.blocks.removeBlocksAfter(blockNumber);
|
|
191
203
|
// Clean up contract data and logs for the removed blocks
|
|
192
204
|
await Promise.all([
|
|
193
|
-
this.
|
|
205
|
+
this.stores.logs.deleteLogs(removedBlocks),
|
|
194
206
|
...removedBlocks.map((block)=>this.removeContractDataFromDb(block))
|
|
195
207
|
]);
|
|
196
208
|
return removedBlocks;
|
|
@@ -204,16 +216,16 @@ import { computeContractAddressFromInstance, computeContractClassId } from '@azt
|
|
|
204
216
|
* @param checkpointNumber - Remove all checkpoints strictly after this one.
|
|
205
217
|
* @returns True if the operation is successful.
|
|
206
218
|
*/ async removeCheckpointsAfter(checkpointNumber) {
|
|
207
|
-
return await this.
|
|
208
|
-
const { blocksRemoved = [] } = await this.
|
|
219
|
+
return await this.stores.db.transactionAsync(async ()=>{
|
|
220
|
+
const { blocksRemoved = [] } = await this.stores.blocks.removeCheckpointsAfter(checkpointNumber);
|
|
209
221
|
const opResults = await Promise.all([
|
|
210
222
|
// Prune rolls back to the last proven block, which is by definition valid
|
|
211
|
-
this.
|
|
223
|
+
this.stores.blocks.setPendingChainValidationStatus({
|
|
212
224
|
valid: true
|
|
213
225
|
}),
|
|
214
226
|
// Remove contract data for all blocks being removed
|
|
215
227
|
...blocksRemoved.map((block)=>this.removeContractDataFromDb(block)),
|
|
216
|
-
this.
|
|
228
|
+
this.stores.logs.deleteLogs(blocksRemoved)
|
|
217
229
|
]);
|
|
218
230
|
await this.l2TipsCache?.refresh();
|
|
219
231
|
return opResults.every(Boolean);
|
|
@@ -223,8 +235,8 @@ import { computeContractAddressFromInstance, computeContractClassId } from '@azt
|
|
|
223
235
|
* Updates the proven checkpoint number and refreshes the L2 tips cache.
|
|
224
236
|
* @param checkpointNumber - The checkpoint number to set as proven.
|
|
225
237
|
*/ async setProvenCheckpointNumber(checkpointNumber) {
|
|
226
|
-
await this.
|
|
227
|
-
await this.
|
|
238
|
+
await this.stores.db.transactionAsync(async ()=>{
|
|
239
|
+
await this.stores.blocks.setProvenCheckpointNumber(checkpointNumber);
|
|
228
240
|
await this.l2TipsCache?.refresh();
|
|
229
241
|
});
|
|
230
242
|
}
|
|
@@ -232,8 +244,8 @@ import { computeContractAddressFromInstance, computeContractClassId } from '@azt
|
|
|
232
244
|
* Updates the finalized checkpoint number and refreshes the L2 tips cache.
|
|
233
245
|
* @param checkpointNumber - The checkpoint number to set as finalized.
|
|
234
246
|
*/ async setFinalizedCheckpointNumber(checkpointNumber) {
|
|
235
|
-
await this.
|
|
236
|
-
await this.
|
|
247
|
+
await this.stores.db.transactionAsync(async ()=>{
|
|
248
|
+
await this.stores.blocks.setFinalizedCheckpointNumber(checkpointNumber);
|
|
237
249
|
await this.l2TipsCache?.refresh();
|
|
238
250
|
});
|
|
239
251
|
}
|
|
@@ -261,7 +273,7 @@ import { computeContractAddressFromInstance, computeContractClassId } from '@azt
|
|
|
261
273
|
const contractClasses = contractClassPublishedEvents.map((e)=>e.toContractClassPublic());
|
|
262
274
|
if (contractClasses.length > 0) {
|
|
263
275
|
contractClasses.forEach((c)=>this.log.verbose(`${Operation[operation]} contract class ${c.id.toString()}`));
|
|
264
|
-
return await this.
|
|
276
|
+
return await this.stores.contractClasses.deleteContractClasses(contractClasses, blockNum);
|
|
265
277
|
}
|
|
266
278
|
return true;
|
|
267
279
|
}
|
|
@@ -285,7 +297,7 @@ import { computeContractAddressFromInstance, computeContractClassId } from '@azt
|
|
|
285
297
|
}
|
|
286
298
|
if (contractClasses.length > 0) {
|
|
287
299
|
contractClasses.forEach((c)=>this.log.verbose(`${Operation[operation]} contract class ${c.id.toString()}`));
|
|
288
|
-
return await this.
|
|
300
|
+
return await this.stores.contractClasses.addContractClasses(contractClasses, blockNum);
|
|
289
301
|
}
|
|
290
302
|
return true;
|
|
291
303
|
}
|
|
@@ -309,9 +321,9 @@ import { computeContractAddressFromInstance, computeContractClassId } from '@azt
|
|
|
309
321
|
if (contractInstances.length > 0) {
|
|
310
322
|
contractInstances.forEach((c)=>this.log.verbose(`${Operation[operation]} contract instance at ${c.address.toString()}`));
|
|
311
323
|
if (operation == 0) {
|
|
312
|
-
return await this.
|
|
324
|
+
return await this.stores.contractInstances.addContractInstances(contractInstances, blockNum);
|
|
313
325
|
} else if (operation == 1) {
|
|
314
|
-
return await this.
|
|
326
|
+
return await this.stores.contractInstances.deleteContractInstances(contractInstances);
|
|
315
327
|
}
|
|
316
328
|
}
|
|
317
329
|
return true;
|
|
@@ -323,9 +335,9 @@ import { computeContractAddressFromInstance, computeContractClassId } from '@azt
|
|
|
323
335
|
if (contractUpdates.length > 0) {
|
|
324
336
|
contractUpdates.forEach((c)=>this.log.verbose(`${Operation[operation]} contract instance update at ${c.address.toString()}`));
|
|
325
337
|
if (operation == 0) {
|
|
326
|
-
return await this.
|
|
338
|
+
return await this.stores.contractInstances.addContractInstanceUpdates(contractUpdates, timestamp);
|
|
327
339
|
} else if (operation == 1) {
|
|
328
|
-
return await this.
|
|
340
|
+
return await this.stores.contractInstances.deleteContractInstanceUpdates(contractUpdates, timestamp);
|
|
329
341
|
}
|
|
330
342
|
}
|
|
331
343
|
return true;
|
|
@@ -16,6 +16,7 @@ export declare class ArchiverInstrumentation {
|
|
|
16
16
|
private pruneDuration;
|
|
17
17
|
private pruneCount;
|
|
18
18
|
private syncDurationPerBlock;
|
|
19
|
+
private syncDurationPerCheckpoint;
|
|
19
20
|
private syncBlockCount;
|
|
20
21
|
private manaPerBlock;
|
|
21
22
|
private txsPerBlock;
|
|
@@ -23,11 +24,13 @@ export declare class ArchiverInstrumentation {
|
|
|
23
24
|
private syncMessageCount;
|
|
24
25
|
private blockProposalTxTargetCount;
|
|
25
26
|
private checkpointL1InclusionDelay;
|
|
27
|
+
private checkpointPromotedCount;
|
|
26
28
|
private log;
|
|
27
29
|
private constructor();
|
|
28
30
|
static new(telemetry: TelemetryClient, lmdbStats?: LmdbStatsCallback): Promise<ArchiverInstrumentation>;
|
|
29
31
|
isEnabled(): boolean;
|
|
30
|
-
|
|
32
|
+
processNewProposedBlock(syncTimePerBlock: number, block: L2Block): void;
|
|
33
|
+
processNewCheckpointedBlocks(syncTimePerCheckpoint: number, blocks: L2Block[]): void;
|
|
31
34
|
processNewMessages(count: number, syncPerMessageMs: number): void;
|
|
32
35
|
processPrune(duration: number): void;
|
|
33
36
|
updateLastProvenCheckpoint(checkpoint: CheckpointData): void;
|
|
@@ -38,6 +41,8 @@ export declare class ArchiverInstrumentation {
|
|
|
38
41
|
}[]): void;
|
|
39
42
|
updateL1BlockHeight(blockNumber: bigint): void;
|
|
40
43
|
recordBlockProposalTxTarget(target: string, usedTrace: boolean): void;
|
|
44
|
+
/** Records a checkpoint promoted from proposed (blob fetch skipped). */
|
|
45
|
+
processCheckpointPromoted(): void;
|
|
41
46
|
/**
|
|
42
47
|
* Records L1 inclusion timing for a checkpoint observed on L1 (seconds into the L2 slot).
|
|
43
48
|
*/
|
|
@@ -47,4 +52,4 @@ export declare class ArchiverInstrumentation {
|
|
|
47
52
|
l1Constants: Pick<L1RollupConstants, 'l1GenesisTime' | 'slotDuration'>;
|
|
48
53
|
}): void;
|
|
49
54
|
}
|
|
50
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
55
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdHJ1bWVudGF0aW9uLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbW9kdWxlcy9pbnN0cnVtZW50YXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFFbEUsT0FBTyxLQUFLLEVBQUUsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDbkQsT0FBTyxLQUFLLEVBQUUsY0FBYyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDL0QsT0FBTyxLQUFLLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUVyRSxPQUFPLEVBS0wsS0FBSyxpQkFBaUIsRUFFdEIsS0FBSyxlQUFlLEVBQ3BCLEtBQUssTUFBTSxFQUdaLE1BQU0seUJBQXlCLENBQUM7QUFFakMscUJBQWEsdUJBQXVCO0lBK0JoQyxPQUFPLENBQUMsU0FBUztJQTlCbkIsU0FBZ0IsTUFBTSxFQUFFLE1BQU0sQ0FBQztJQUUvQixPQUFPLENBQUMsV0FBVyxDQUFRO0lBQzNCLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBUTtJQUNoQyxPQUFPLENBQUMsT0FBTyxDQUFnQjtJQUMvQixPQUFPLENBQUMsYUFBYSxDQUFRO0lBQzdCLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBWTtJQUN4QyxPQUFPLENBQUMsb0JBQW9CLENBQWdCO0lBQzVDLE9BQU8sQ0FBQyxTQUFTLENBQWM7SUFFL0IsT0FBTyxDQUFDLGFBQWEsQ0FBWTtJQUNqQyxPQUFPLENBQUMsVUFBVSxDQUFnQjtJQUVsQyxPQUFPLENBQUMsb0JBQW9CLENBQVk7SUFDeEMsT0FBTyxDQUFDLHlCQUF5QixDQUFZO0lBQzdDLE9BQU8sQ0FBQyxjQUFjLENBQWdCO0lBQ3RDLE9BQU8sQ0FBQyxZQUFZLENBQVk7SUFDaEMsT0FBTyxDQUFDLFdBQVcsQ0FBWTtJQUUvQixPQUFPLENBQUMsc0JBQXNCLENBQVk7SUFDMUMsT0FBTyxDQUFDLGdCQUFnQixDQUFnQjtJQUV4QyxPQUFPLENBQUMsMEJBQTBCLENBQWdCO0lBRWxELE9BQU8sQ0FBQywwQkFBMEIsQ0FBWTtJQUM5QyxPQUFPLENBQUMsdUJBQXVCLENBQWdCO0lBRS9DLE9BQU8sQ0FBQyxHQUFHLENBQTRDO0lBRXZELE9BQU8sZUEwRE47SUFFRCxPQUFvQixHQUFHLENBQUMsU0FBUyxFQUFFLGVBQWUsRUFBRSxTQUFTLENBQUMsRUFBRSxpQkFBaUIsb0NBTWhGO0lBRU0sU0FBUyxJQUFJLE9BQU8sQ0FFMUI7SUFFTSx1QkFBdUIsQ0FBQyxnQkFBZ0IsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE9BQU8sUUFTdEU7SUFFTSw0QkFBNEIsQ0FBQyxxQkFBcUIsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxRQVNuRjtJQUVNLGtCQUFrQixDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxRQU1oRTtJQUVNLFlBQVksQ0FBQyxRQUFRLEVBQUUsTUFBTSxRQUduQztJQUVNLDBCQUEwQixDQUFDLFVBQVUsRUFBRSxjQUFjLFFBSTNEO0lBRU0scUJBQXFCLENBQUMsSUFBSSxFQUFFO1FBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQztRQUFDLGFBQWEsRUFBRSxNQUFNLENBQUM7UUFBQyxLQUFLLEVBQUUsTUFBTSxDQUFBO0tBQUUsRUFBRSxRQVc5RjtJQUVNLG1CQUFtQixDQUFDLFdBQVcsRUFBRSxNQUFNLFFBRTdDO0lBRU0sMkJBQTJCLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsT0FBTyxRQUtwRTtJQUVELHdFQUF3RTtJQUNqRSx5QkFBeUIsU0FFL0I7SUFFRDs7T0FFRztJQUNJLHlCQUF5QixDQUFDLElBQUksRUFBRTtRQUNyQyxVQUFVLEVBQUUsVUFBVSxDQUFDO1FBQ3ZCLFdBQVcsRUFBRSxNQUFNLENBQUM7UUFDcEIsV0FBVyxFQUFFLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxlQUFlLEdBQUcsY0FBYyxDQUFDLENBQUM7S0FDeEUsR0FBRyxJQUFJLENBSVA7Q0FDRiJ9
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instrumentation.d.ts","sourceRoot":"","sources":["../../src/modules/instrumentation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAElE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAErE,OAAO,EAKL,KAAK,iBAAiB,EAEtB,KAAK,eAAe,EACpB,KAAK,MAAM,EAGZ,MAAM,yBAAyB,CAAC;AAEjC,qBAAa,uBAAuB;
|
|
1
|
+
{"version":3,"file":"instrumentation.d.ts","sourceRoot":"","sources":["../../src/modules/instrumentation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAElE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAErE,OAAO,EAKL,KAAK,iBAAiB,EAEtB,KAAK,eAAe,EACpB,KAAK,MAAM,EAGZ,MAAM,yBAAyB,CAAC;AAEjC,qBAAa,uBAAuB;IA+BhC,OAAO,CAAC,SAAS;IA9BnB,SAAgB,MAAM,EAAE,MAAM,CAAC;IAE/B,OAAO,CAAC,WAAW,CAAQ;IAC3B,OAAO,CAAC,gBAAgB,CAAQ;IAChC,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,aAAa,CAAQ;IAC7B,OAAO,CAAC,oBAAoB,CAAY;IACxC,OAAO,CAAC,oBAAoB,CAAgB;IAC5C,OAAO,CAAC,SAAS,CAAc;IAE/B,OAAO,CAAC,aAAa,CAAY;IACjC,OAAO,CAAC,UAAU,CAAgB;IAElC,OAAO,CAAC,oBAAoB,CAAY;IACxC,OAAO,CAAC,yBAAyB,CAAY;IAC7C,OAAO,CAAC,cAAc,CAAgB;IACtC,OAAO,CAAC,YAAY,CAAY;IAChC,OAAO,CAAC,WAAW,CAAY;IAE/B,OAAO,CAAC,sBAAsB,CAAY;IAC1C,OAAO,CAAC,gBAAgB,CAAgB;IAExC,OAAO,CAAC,0BAA0B,CAAgB;IAElD,OAAO,CAAC,0BAA0B,CAAY;IAC9C,OAAO,CAAC,uBAAuB,CAAgB;IAE/C,OAAO,CAAC,GAAG,CAA4C;IAEvD,OAAO,eA0DN;IAED,OAAoB,GAAG,CAAC,SAAS,EAAE,eAAe,EAAE,SAAS,CAAC,EAAE,iBAAiB,oCAMhF;IAEM,SAAS,IAAI,OAAO,CAE1B;IAEM,uBAAuB,CAAC,gBAAgB,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,QAStE;IAEM,4BAA4B,CAAC,qBAAqB,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,QASnF;IAEM,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,QAMhE;IAEM,YAAY,CAAC,QAAQ,EAAE,MAAM,QAGnC;IAEM,0BAA0B,CAAC,UAAU,EAAE,cAAc,QAI3D;IAEM,qBAAqB,CAAC,IAAI,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,QAW9F;IAEM,mBAAmB,CAAC,WAAW,EAAE,MAAM,QAE7C;IAEM,2BAA2B,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,QAKpE;IAED,wEAAwE;IACjE,yBAAyB,SAE/B;IAED;;OAEG;IACI,yBAAyB,CAAC,IAAI,EAAE;QACrC,UAAU,EAAE,UAAU,CAAC;QACvB,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,IAAI,CAAC,iBAAiB,EAAE,eAAe,GAAG,cAAc,CAAC,CAAC;KACxE,GAAG,IAAI,CAIP;CACF"}
|
|
@@ -14,6 +14,7 @@ export class ArchiverInstrumentation {
|
|
|
14
14
|
pruneDuration;
|
|
15
15
|
pruneCount;
|
|
16
16
|
syncDurationPerBlock;
|
|
17
|
+
syncDurationPerCheckpoint;
|
|
17
18
|
syncBlockCount;
|
|
18
19
|
manaPerBlock;
|
|
19
20
|
txsPerBlock;
|
|
@@ -21,6 +22,7 @@ export class ArchiverInstrumentation {
|
|
|
21
22
|
syncMessageCount;
|
|
22
23
|
blockProposalTxTargetCount;
|
|
23
24
|
checkpointL1InclusionDelay;
|
|
25
|
+
checkpointPromotedCount;
|
|
24
26
|
log;
|
|
25
27
|
constructor(telemetry, lmdbStats){
|
|
26
28
|
this.telemetry = telemetry;
|
|
@@ -39,6 +41,7 @@ export class ArchiverInstrumentation {
|
|
|
39
41
|
});
|
|
40
42
|
this.proofsSubmittedDelay = meter.createHistogram(Metrics.ARCHIVER_ROLLUP_PROOF_DELAY);
|
|
41
43
|
this.syncDurationPerBlock = meter.createHistogram(Metrics.ARCHIVER_SYNC_PER_BLOCK);
|
|
44
|
+
this.syncDurationPerCheckpoint = meter.createHistogram(Metrics.ARCHIVER_SYNC_PER_CHECKPOINT);
|
|
42
45
|
this.syncBlockCount = createUpDownCounterWithDefault(meter, Metrics.ARCHIVER_SYNC_BLOCK_COUNT);
|
|
43
46
|
this.manaPerBlock = meter.createHistogram(Metrics.ARCHIVER_MANA_PER_BLOCK);
|
|
44
47
|
this.txsPerBlock = meter.createHistogram(Metrics.ARCHIVER_TXS_PER_BLOCK);
|
|
@@ -53,6 +56,7 @@ export class ArchiverInstrumentation {
|
|
|
53
56
|
]
|
|
54
57
|
});
|
|
55
58
|
this.checkpointL1InclusionDelay = meter.createHistogram(Metrics.ARCHIVER_CHECKPOINT_L1_INCLUSION_DELAY);
|
|
59
|
+
this.checkpointPromotedCount = createUpDownCounterWithDefault(meter, Metrics.ARCHIVER_CHECKPOINT_PROMOTED_COUNT);
|
|
56
60
|
this.dbMetrics = new LmdbMetrics(meter, {
|
|
57
61
|
[Attributes.DB_DATA_TYPE]: 'archiver'
|
|
58
62
|
}, lmdbStats);
|
|
@@ -65,16 +69,25 @@ export class ArchiverInstrumentation {
|
|
|
65
69
|
isEnabled() {
|
|
66
70
|
return this.telemetry.isEnabled();
|
|
67
71
|
}
|
|
68
|
-
|
|
72
|
+
processNewProposedBlock(syncTimePerBlock, block) {
|
|
73
|
+
const attrs = {
|
|
74
|
+
[Attributes.STATUS]: 'proposed'
|
|
75
|
+
};
|
|
76
|
+
this.blockHeight.record(block.number, attrs);
|
|
69
77
|
this.syncDurationPerBlock.record(Math.ceil(syncTimePerBlock));
|
|
78
|
+
// Per block metrics
|
|
79
|
+
this.txCount.add(block.body.txEffects.length);
|
|
80
|
+
this.txsPerBlock.record(block.body.txEffects.length);
|
|
81
|
+
this.manaPerBlock.record(block.header.totalManaUsed.toNumber() / 1e6);
|
|
82
|
+
}
|
|
83
|
+
processNewCheckpointedBlocks(syncTimePerCheckpoint, blocks) {
|
|
84
|
+
if (blocks.length === 0) {
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
this.syncDurationPerCheckpoint.record(Math.ceil(syncTimePerCheckpoint));
|
|
70
88
|
this.blockHeight.record(Math.max(...blocks.map((b)=>b.number)));
|
|
71
89
|
this.checkpointHeight.record(Math.max(...blocks.map((b)=>b.checkpointNumber)));
|
|
72
90
|
this.syncBlockCount.add(blocks.length);
|
|
73
|
-
for (const block of blocks){
|
|
74
|
-
this.txCount.add(block.body.txEffects.length);
|
|
75
|
-
this.txsPerBlock.record(block.body.txEffects.length);
|
|
76
|
-
this.manaPerBlock.record(block.header.totalManaUsed.toNumber() / 1e6);
|
|
77
|
-
}
|
|
78
91
|
}
|
|
79
92
|
processNewMessages(count, syncPerMessageMs) {
|
|
80
93
|
if (count === 0) {
|
|
@@ -117,6 +130,9 @@ export class ArchiverInstrumentation {
|
|
|
117
130
|
[Attributes.L1_BLOCK_PROPOSAL_USED_TRACE]: usedTrace
|
|
118
131
|
});
|
|
119
132
|
}
|
|
133
|
+
/** Records a checkpoint promoted from proposed (blob fetch skipped). */ processCheckpointPromoted() {
|
|
134
|
+
this.checkpointPromotedCount.add(1);
|
|
135
|
+
}
|
|
120
136
|
/**
|
|
121
137
|
* Records L1 inclusion timing for a checkpoint observed on L1 (seconds into the L2 slot).
|
|
122
138
|
*/ processCheckpointL1Timing(data) {
|
|
@@ -9,7 +9,7 @@ import { DateProvider } from '@aztec/foundation/timer';
|
|
|
9
9
|
import { type ArchiverEmitter } from '@aztec/stdlib/block';
|
|
10
10
|
import { type L1RollupConstants } from '@aztec/stdlib/epoch-helpers';
|
|
11
11
|
import { type Traceable, type Tracer } from '@aztec/telemetry-client';
|
|
12
|
-
import type
|
|
12
|
+
import { type ArchiverDataStores } from '../store/data_stores.js';
|
|
13
13
|
import type { L2TipsCache } from '../store/l2_tips_cache.js';
|
|
14
14
|
import type { ArchiverInstrumentation } from './instrumentation.js';
|
|
15
15
|
/**
|
|
@@ -21,7 +21,7 @@ export declare class ArchiverL1Synchronizer implements Traceable {
|
|
|
21
21
|
private readonly debugClient;
|
|
22
22
|
private readonly rollup;
|
|
23
23
|
private readonly inbox;
|
|
24
|
-
private readonly
|
|
24
|
+
private readonly stores;
|
|
25
25
|
private config;
|
|
26
26
|
private readonly blobClient;
|
|
27
27
|
private readonly epochCache;
|
|
@@ -35,9 +35,10 @@ export declare class ArchiverL1Synchronizer implements Traceable {
|
|
|
35
35
|
private l1Timestamp;
|
|
36
36
|
private readonly updater;
|
|
37
37
|
readonly tracer: Tracer;
|
|
38
|
-
constructor(publicClient: ViemPublicClient, debugClient: ViemPublicDebugClient, rollup: RollupContract, inbox: InboxContract,
|
|
38
|
+
constructor(publicClient: ViemPublicClient, debugClient: ViemPublicDebugClient, rollup: RollupContract, inbox: InboxContract, stores: ArchiverDataStores, config: {
|
|
39
39
|
batchSize: number;
|
|
40
40
|
skipValidateCheckpointAttestations?: boolean;
|
|
41
|
+
skipPromoteProposedCheckpointDuringL1Sync?: boolean;
|
|
41
42
|
maxAllowedEthClientDriftSeconds: number;
|
|
42
43
|
}, blobClient: BlobClientInterface, epochCache: EpochCache, dateProvider: DateProvider, instrumentation: ArchiverInstrumentation, l1Constants: L1RollupConstants & {
|
|
43
44
|
l1StartBlockHash: Buffer32;
|
|
@@ -47,12 +48,14 @@ export declare class ArchiverL1Synchronizer implements Traceable {
|
|
|
47
48
|
setConfig(newConfig: {
|
|
48
49
|
batchSize: number;
|
|
49
50
|
skipValidateCheckpointAttestations?: boolean;
|
|
51
|
+
skipPromoteProposedCheckpointDuringL1Sync?: boolean;
|
|
50
52
|
maxAllowedEthClientDriftSeconds: number;
|
|
51
53
|
}): void;
|
|
52
54
|
/** Returns the last L1 block number that was synced. */
|
|
53
55
|
getL1BlockNumber(): bigint | undefined;
|
|
54
56
|
/** Returns the last L1 timestamp that was synced. */
|
|
55
57
|
getL1Timestamp(): bigint | undefined;
|
|
58
|
+
private getSignatureContext;
|
|
56
59
|
/** Checks that the ethereum node we are connected to has a latest timestamp no more than the allowed drift. Throw if not. */
|
|
57
60
|
testEthereumNodeSynced(): Promise<void>;
|
|
58
61
|
syncFromL1(initialSyncComplete: boolean): Promise<void>;
|
|
@@ -67,7 +70,8 @@ export declare class ArchiverL1Synchronizer implements Traceable {
|
|
|
67
70
|
private rollbackL1ToL2Messages;
|
|
68
71
|
private getL1BlockHash;
|
|
69
72
|
private handleCheckpoints;
|
|
73
|
+
private tryBuildPublishedCheckpointFromProposed;
|
|
70
74
|
private checkForNewCheckpointsBeforeL1SyncPoint;
|
|
71
75
|
private getCheckpointHeader;
|
|
72
76
|
}
|
|
73
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
77
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibDFfc3luY2hyb25pemVyLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbW9kdWxlcy9sMV9zeW5jaHJvbml6ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNyRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDaEQsT0FBTyxFQUFFLGFBQWEsRUFBMkIsY0FBYyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFHbkcsT0FBTyxLQUFLLEVBQUUsZ0JBQWdCLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUlyRixPQUFPLEVBQVksUUFBUSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFOUQsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRXBELE9BQU8sRUFBRSxLQUFLLE1BQU0sRUFBZ0IsTUFBTSx1QkFBdUIsQ0FBQztBQUdsRSxPQUFPLEVBQUUsWUFBWSxFQUFrQixNQUFNLHlCQUF5QixDQUFDO0FBRXZFLE9BQU8sRUFBRSxLQUFLLGVBQWUsRUFBc0QsTUFBTSxxQkFBcUIsQ0FBQztBQUUvRyxPQUFPLEVBQUUsS0FBSyxpQkFBaUIsRUFBd0MsTUFBTSw2QkFBNkIsQ0FBQztBQUczRyxPQUFPLEVBQUUsS0FBSyxTQUFTLEVBQUUsS0FBSyxNQUFNLEVBQXlCLE1BQU0seUJBQXlCLENBQUM7QUFXN0YsT0FBTyxFQUFFLEtBQUssa0JBQWtCLEVBQXlCLE1BQU0seUJBQXlCLENBQUM7QUFDekYsT0FBTyxLQUFLLEVBQUUsV0FBVyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFJN0QsT0FBTyxLQUFLLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQWFwRTs7O0dBR0c7QUFDSCxxQkFBYSxzQkFBdUIsWUFBVyxTQUFTO0lBU3BELE9BQU8sQ0FBQyxRQUFRLENBQUMs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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"l1_synchronizer.d.ts","sourceRoot":"","sources":["../../src/modules/l1_synchronizer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,aAAa,EAA2B,cAAc,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"l1_synchronizer.d.ts","sourceRoot":"","sources":["../../src/modules/l1_synchronizer.ts"],"names":[],"mappings":"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"}
|