@aztec/sequencer-client 3.0.0-canary.a9708bd → 3.0.0-devnet.20251212
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/client/index.d.ts +1 -1
- package/dest/client/sequencer-client.d.ts +7 -6
- package/dest/client/sequencer-client.d.ts.map +1 -1
- package/dest/client/sequencer-client.js +23 -14
- package/dest/config.d.ts +5 -3
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +21 -1
- package/dest/global_variable_builder/global_builder.d.ts +5 -7
- package/dest/global_variable_builder/global_builder.d.ts.map +1 -1
- package/dest/global_variable_builder/global_builder.js +12 -8
- package/dest/global_variable_builder/index.d.ts +1 -1
- package/dest/index.d.ts +1 -1
- package/dest/publisher/config.d.ts +9 -10
- package/dest/publisher/config.d.ts.map +1 -1
- package/dest/publisher/config.js +19 -17
- package/dest/publisher/index.d.ts +2 -2
- package/dest/publisher/index.d.ts.map +1 -1
- package/dest/publisher/index.js +1 -1
- package/dest/publisher/sequencer-publisher-factory.d.ts +9 -3
- package/dest/publisher/sequencer-publisher-factory.d.ts.map +1 -1
- package/dest/publisher/sequencer-publisher-factory.js +8 -1
- package/dest/publisher/sequencer-publisher-metrics.d.ts +2 -2
- package/dest/publisher/sequencer-publisher-metrics.d.ts.map +1 -1
- package/dest/publisher/sequencer-publisher-metrics.js +1 -1
- package/dest/publisher/sequencer-publisher.d.ts +53 -50
- package/dest/publisher/sequencer-publisher.d.ts.map +1 -1
- package/dest/publisher/sequencer-publisher.js +187 -132
- package/dest/sequencer/block_builder.d.ts +6 -8
- package/dest/sequencer/block_builder.d.ts.map +1 -1
- package/dest/sequencer/block_builder.js +18 -9
- package/dest/sequencer/config.d.ts +2 -2
- package/dest/sequencer/config.d.ts.map +1 -1
- package/dest/sequencer/errors.d.ts +11 -0
- package/dest/sequencer/errors.d.ts.map +1 -0
- package/dest/sequencer/errors.js +15 -0
- package/dest/sequencer/index.d.ts +1 -1
- package/dest/sequencer/metrics.d.ts +17 -20
- package/dest/sequencer/metrics.d.ts.map +1 -1
- package/dest/sequencer/metrics.js +59 -87
- package/dest/sequencer/sequencer.d.ts +54 -32
- package/dest/sequencer/sequencer.d.ts.map +1 -1
- package/dest/sequencer/sequencer.js +458 -184
- package/dest/sequencer/timetable.d.ts +4 -8
- package/dest/sequencer/timetable.d.ts.map +1 -1
- package/dest/sequencer/timetable.js +3 -10
- package/dest/sequencer/utils.d.ts +11 -25
- package/dest/sequencer/utils.d.ts.map +1 -1
- package/dest/sequencer/utils.js +9 -24
- package/dest/test/index.d.ts +2 -2
- package/dest/test/index.d.ts.map +1 -1
- package/dest/tx_validator/nullifier_cache.d.ts +1 -1
- package/dest/tx_validator/nullifier_cache.d.ts.map +1 -1
- package/dest/tx_validator/tx_validator_factory.d.ts +4 -3
- package/dest/tx_validator/tx_validator_factory.d.ts.map +1 -1
- package/dest/tx_validator/tx_validator_factory.js +12 -9
- package/package.json +32 -31
- package/src/client/sequencer-client.ts +24 -18
- package/src/config.ts +23 -6
- package/src/global_variable_builder/global_builder.ts +19 -17
- package/src/publisher/config.ts +29 -27
- package/src/publisher/index.ts +1 -1
- package/src/publisher/sequencer-publisher-factory.ts +16 -3
- package/src/publisher/sequencer-publisher-metrics.ts +1 -1
- package/src/publisher/sequencer-publisher.ts +257 -183
- package/src/sequencer/block_builder.ts +23 -28
- package/src/sequencer/config.ts +1 -1
- package/src/sequencer/errors.ts +21 -0
- package/src/sequencer/metrics.ts +71 -98
- package/src/sequencer/sequencer.ts +546 -237
- package/src/sequencer/timetable.ts +10 -14
- package/src/sequencer/utils.ts +10 -24
- package/src/test/index.ts +1 -1
- package/src/tx_validator/tx_validator_factory.ts +13 -7
|
@@ -1,14 +1,13 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { BlockNumber } from '@aztec/foundation/branded-types';
|
|
2
|
+
import type { Fr } from '@aztec/foundation/curves/bn254';
|
|
2
3
|
import { DateProvider } from '@aztec/foundation/timer';
|
|
3
4
|
import { PublicProcessor } from '@aztec/simulator/server';
|
|
4
|
-
import type { ChainConfig, SequencerConfig } from '@aztec/stdlib/config';
|
|
5
5
|
import type { ContractDataSource } from '@aztec/stdlib/contract';
|
|
6
6
|
import { type L1RollupConstants } from '@aztec/stdlib/epoch-helpers';
|
|
7
|
-
import type { BuildBlockResult, IFullNodeBlockBuilder, MerkleTreeWriteOperations, PublicProcessorLimits, PublicProcessorValidator, WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server';
|
|
7
|
+
import type { BuildBlockResult, FullNodeBlockBuilderConfig, IFullNodeBlockBuilder, MerkleTreeWriteOperations, PublicProcessorLimits, PublicProcessorValidator, WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server';
|
|
8
8
|
import { GlobalVariables, Tx } from '@aztec/stdlib/tx';
|
|
9
9
|
import { type TelemetryClient } from '@aztec/telemetry-client';
|
|
10
10
|
export declare function buildBlock(pendingTxs: Iterable<Tx> | AsyncIterable<Tx>, l1ToL2Messages: Fr[], newGlobalVariables: GlobalVariables, opts: PublicProcessorLimits | undefined, worldStateFork: MerkleTreeWriteOperations, processor: PublicProcessor, validator: PublicProcessorValidator, l1Constants: Pick<L1RollupConstants, 'l1GenesisTime' | 'slotDuration'>, dateProvider: DateProvider, telemetryClient?: TelemetryClient): Promise<BuildBlockResult>;
|
|
11
|
-
type FullNodeBlockBuilderConfig = Pick<L1RollupConstants, 'l1GenesisTime' | 'slotDuration'> & Pick<ChainConfig, 'l1ChainId' | 'rollupVersion'> & Pick<SequencerConfig, 'txPublicSetupAllowList' | 'fakeProcessingDelayPerTxMs'>;
|
|
12
11
|
export declare class FullNodeBlockBuilder implements IFullNodeBlockBuilder {
|
|
13
12
|
private config;
|
|
14
13
|
private worldState;
|
|
@@ -17,14 +16,13 @@ export declare class FullNodeBlockBuilder implements IFullNodeBlockBuilder {
|
|
|
17
16
|
private telemetryClient;
|
|
18
17
|
constructor(config: FullNodeBlockBuilderConfig, worldState: WorldStateSynchronizer, contractDataSource: ContractDataSource, dateProvider: DateProvider, telemetryClient?: TelemetryClient);
|
|
19
18
|
getConfig(): FullNodeBlockBuilderConfig;
|
|
20
|
-
updateConfig(config: FullNodeBlockBuilderConfig): void;
|
|
19
|
+
updateConfig(config: Partial<FullNodeBlockBuilderConfig>): void;
|
|
21
20
|
makeBlockBuilderDeps(globalVariables: GlobalVariables, fork: MerkleTreeWriteOperations): Promise<{
|
|
22
21
|
processor: PublicProcessor;
|
|
23
22
|
validator: PublicProcessorValidator;
|
|
24
23
|
}>;
|
|
25
24
|
private syncToPreviousBlock;
|
|
26
25
|
buildBlock(pendingTxs: Iterable<Tx> | AsyncIterable<Tx>, l1ToL2Messages: Fr[], globalVariables: GlobalVariables, opts: PublicProcessorLimits, suppliedFork?: MerkleTreeWriteOperations): Promise<BuildBlockResult>;
|
|
27
|
-
getFork(blockNumber:
|
|
26
|
+
getFork(blockNumber: BlockNumber): Promise<MerkleTreeWriteOperations>;
|
|
28
27
|
}
|
|
29
|
-
|
|
30
|
-
//# sourceMappingURL=block_builder.d.ts.map
|
|
28
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmxvY2tfYnVpbGRlci5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcXVlbmNlci9ibG9ja19idWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUU5RCxPQUFPLEtBQUssRUFBRSxFQUFFLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUl6RCxPQUFPLEVBQUUsWUFBWSxFQUFrQixNQUFNLHlCQUF5QixDQUFDO0FBR3ZFLE9BQU8sRUFHTCxlQUFlLEVBRWhCLE1BQU0seUJBQXlCLENBQUM7QUFDakMsT0FBTyxLQUFLLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNqRSxPQUFPLEVBQUUsS0FBSyxpQkFBaUIsRUFBdUIsTUFBTSw2QkFBNkIsQ0FBQztBQUUxRixPQUFPLEtBQUssRUFDVixnQkFBZ0IsRUFDaEIsMEJBQTBCLEVBQzFCLHFCQUFxQixFQUNyQix5QkFBeUIsRUFDekIscUJBQXFCLEVBQ3JCLHdCQUF3QixFQUN4QixzQkFBc0IsRUFDdkIsTUFBTSxpQ0FBaUMsQ0FBQztBQUN6QyxPQUFPLEVBQUUsZUFBZSxFQUFFLEVBQUUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxLQUFLLGVBQWUsRUFBc0IsTUFBTSx5QkFBeUIsQ0FBQztBQU1uRix3QkFBc0IsVUFBVSxDQUM5QixVQUFVLEVBQUUsUUFBUSxDQUFDLEVBQUUsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxFQUFFLENBQUMsRUFDNUMsY0FBYyxFQUFFLEVBQUUsRUFBRSxFQUNwQixrQkFBa0IsRUFBRSxlQUFlLEVBQ25DLElBQUksbUNBQTRCLEVBQ2hDLGNBQWMsRUFBRSx5QkFBeUIsRUFDekMsU0FBUyxFQUFFLGVBQWUsRUFDMUIsU0FBUyxFQUFFLHdCQUF3QixFQUNuQyxXQUFXLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixFQUFFLGVBQWUsR0FBRyxjQUFjLENBQUMsRUFDdEUsWUFBWSxFQUFFLFlBQVksRUFDMUIsZUFBZSxHQUFFLGVBQXNDLEdBQ3RELE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQTRDM0I7QUFXRCxxQkFBYSxvQkFBcUIsWUFBVyxxQkFBcUI7SUFFOUQsT0FBTyxDQUFDLE1BQU07SUFDZCxPQUFPLENBQUMsVUFBVTtJQUNsQixPQUFPLENBQUMsa0JBQWtCO0lBQzFCLE9BQU8sQ0FBQyxZQUFZO0lBQ3BCLE9BQU8sQ0FBQyxlQUFlO0lBTHpCLFlBQ1UsTUFBTSxFQUFFLDBCQUEwQixFQUNsQyxVQUFVLEVBQUUsc0JBQXNCLEVBQ2xDLGtCQUFrQixFQUFFLGtCQUFrQixFQUN0QyxZQUFZLEVBQUUsWUFBWSxFQUMxQixlQUFlLEdBQUUsZUFBc0MsRUFDN0Q7SUFFRyxTQUFTLElBQUksMEJBQTBCLENBRTdDO0lBRU0sWUFBWSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsMEJBQTBCLENBQUMsUUFFOUQ7SUFFWSxvQkFBb0IsQ0FBQyxlQUFlLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSx5QkFBeUI7OztPQWtDbEc7WUFFYSxtQkFBbUI7SUFVM0IsVUFBVSxDQUNkLFVBQVUsRUFBRSxRQUFRLENBQUMsRUFBRSxDQUFDLEdBQUcsYUFBYSxDQUFDLEVBQUUsQ0FBQyxFQUM1QyxjQUFjLEVBQUUsRUFBRSxFQUFFLEVBQ3BCLGVBQWUsRUFBRSxlQUFlLEVBQ2hDLElBQUksRUFBRSxxQkFBcUIsRUFDM0IsWUFBWSxDQUFDLEVBQUUseUJBQXlCLEdBQ3ZDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQXNDM0I7SUFFRCxPQUFPLENBQUMsV0FBVyxFQUFFLFdBQVcsR0FBRyxPQUFPLENBQUMseUJBQXlCLENBQUMsQ0FFcEU7Q0FDRiJ9
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"block_builder.d.ts","sourceRoot":"","sources":["../../src/sequencer/block_builder.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"block_builder.d.ts","sourceRoot":"","sources":["../../src/sequencer/block_builder.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAE9D,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AAIzD,OAAO,EAAE,YAAY,EAAkB,MAAM,yBAAyB,CAAC;AAGvE,OAAO,EAGL,eAAe,EAEhB,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,KAAK,iBAAiB,EAAuB,MAAM,6BAA6B,CAAC;AAE1F,OAAO,KAAK,EACV,gBAAgB,EAChB,0BAA0B,EAC1B,qBAAqB,EACrB,yBAAyB,EACzB,qBAAqB,EACrB,wBAAwB,EACxB,sBAAsB,EACvB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,KAAK,eAAe,EAAsB,MAAM,yBAAyB,CAAC;AAMnF,wBAAsB,UAAU,CAC9B,UAAU,EAAE,QAAQ,CAAC,EAAE,CAAC,GAAG,aAAa,CAAC,EAAE,CAAC,EAC5C,cAAc,EAAE,EAAE,EAAE,EACpB,kBAAkB,EAAE,eAAe,EACnC,IAAI,mCAA4B,EAChC,cAAc,EAAE,yBAAyB,EACzC,SAAS,EAAE,eAAe,EAC1B,SAAS,EAAE,wBAAwB,EACnC,WAAW,EAAE,IAAI,CAAC,iBAAiB,EAAE,eAAe,GAAG,cAAc,CAAC,EACtE,YAAY,EAAE,YAAY,EAC1B,eAAe,GAAE,eAAsC,GACtD,OAAO,CAAC,gBAAgB,CAAC,CA4C3B;AAWD,qBAAa,oBAAqB,YAAW,qBAAqB;IAE9D,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,kBAAkB;IAC1B,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,eAAe;IALzB,YACU,MAAM,EAAE,0BAA0B,EAClC,UAAU,EAAE,sBAAsB,EAClC,kBAAkB,EAAE,kBAAkB,EACtC,YAAY,EAAE,YAAY,EAC1B,eAAe,GAAE,eAAsC,EAC7D;IAEG,SAAS,IAAI,0BAA0B,CAE7C;IAEM,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,0BAA0B,CAAC,QAE9D;IAEY,oBAAoB,CAAC,eAAe,EAAE,eAAe,EAAE,IAAI,EAAE,yBAAyB;;;OAkClG;YAEa,mBAAmB;IAU3B,UAAU,CACd,UAAU,EAAE,QAAQ,CAAC,EAAE,CAAC,GAAG,aAAa,CAAC,EAAE,CAAC,EAC5C,cAAc,EAAE,EAAE,EAAE,EACpB,eAAe,EAAE,eAAe,EAChC,IAAI,EAAE,qBAAqB,EAC3B,YAAY,CAAC,EAAE,yBAAyB,GACvC,OAAO,CAAC,gBAAgB,CAAC,CAsC3B;IAED,OAAO,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAEpE;CACF"}
|
|
@@ -1,12 +1,13 @@
|
|
|
1
|
-
import { MerkleTreeId
|
|
2
|
-
import {
|
|
1
|
+
import { MerkleTreeId } from '@aztec/aztec.js/trees';
|
|
2
|
+
import { BlockNumber } from '@aztec/foundation/branded-types';
|
|
3
|
+
import { merge, pick } from '@aztec/foundation/collection';
|
|
3
4
|
import { createLogger } from '@aztec/foundation/log';
|
|
4
5
|
import { retryUntil } from '@aztec/foundation/retry';
|
|
5
6
|
import { bufferToHex } from '@aztec/foundation/string';
|
|
6
|
-
import { Timer } from '@aztec/foundation/timer';
|
|
7
|
+
import { Timer, elapsed } from '@aztec/foundation/timer';
|
|
7
8
|
import { getDefaultAllowedSetupFunctions } from '@aztec/p2p/msg_validators';
|
|
8
9
|
import { LightweightBlockFactory } from '@aztec/prover-client/block-factory';
|
|
9
|
-
import { GuardedMerkleTreeOperations, PublicContractsDB, PublicProcessor,
|
|
10
|
+
import { GuardedMerkleTreeOperations, PublicContractsDB, PublicProcessor, createPublicTxSimulatorForBlockBuilding } from '@aztec/simulator/server';
|
|
10
11
|
import { getTimestampForSlot } from '@aztec/stdlib/epoch-helpers';
|
|
11
12
|
import { Gas } from '@aztec/stdlib/gas';
|
|
12
13
|
import { getTelemetryClient } from '@aztec/telemetry-client';
|
|
@@ -15,7 +16,7 @@ const log = createLogger('block-builder');
|
|
|
15
16
|
export async function buildBlock(pendingTxs, l1ToL2Messages, newGlobalVariables, opts = {}, worldStateFork, processor, validator, l1Constants, dateProvider, telemetryClient = getTelemetryClient()) {
|
|
16
17
|
const blockBuildingTimer = new Timer();
|
|
17
18
|
const blockNumber = newGlobalVariables.blockNumber;
|
|
18
|
-
const slot = newGlobalVariables.slotNumber
|
|
19
|
+
const slot = newGlobalVariables.slotNumber;
|
|
19
20
|
const msgCount = l1ToL2Messages.length;
|
|
20
21
|
const stateReference = await worldStateFork.getStateReference();
|
|
21
22
|
const archiveTree = await worldStateFork.getTreeInfo(MerkleTreeId.ARCHIVE);
|
|
@@ -50,6 +51,14 @@ export async function buildBlock(pendingTxs, l1ToL2Messages, newGlobalVariables,
|
|
|
50
51
|
log.trace('Built block', res.block.header);
|
|
51
52
|
return res;
|
|
52
53
|
}
|
|
54
|
+
const FullNodeBlockBuilderConfigKeys = [
|
|
55
|
+
'l1GenesisTime',
|
|
56
|
+
'slotDuration',
|
|
57
|
+
'l1ChainId',
|
|
58
|
+
'rollupVersion',
|
|
59
|
+
'txPublicSetupAllowList',
|
|
60
|
+
'fakeProcessingDelayPerTxMs'
|
|
61
|
+
];
|
|
53
62
|
export class FullNodeBlockBuilder {
|
|
54
63
|
config;
|
|
55
64
|
worldState;
|
|
@@ -64,16 +73,16 @@ export class FullNodeBlockBuilder {
|
|
|
64
73
|
this.telemetryClient = telemetryClient;
|
|
65
74
|
}
|
|
66
75
|
getConfig() {
|
|
67
|
-
return pick(this.config,
|
|
76
|
+
return pick(this.config, ...FullNodeBlockBuilderConfigKeys);
|
|
68
77
|
}
|
|
69
78
|
updateConfig(config) {
|
|
70
|
-
this.config = config;
|
|
79
|
+
this.config = merge(this.config, pick(config, ...FullNodeBlockBuilderConfigKeys));
|
|
71
80
|
}
|
|
72
81
|
async makeBlockBuilderDeps(globalVariables, fork) {
|
|
73
82
|
const txPublicSetupAllowList = this.config.txPublicSetupAllowList ?? await getDefaultAllowedSetupFunctions();
|
|
74
83
|
const contractsDB = new PublicContractsDB(this.contractDataSource);
|
|
75
84
|
const guardedFork = new GuardedMerkleTreeOperations(fork);
|
|
76
|
-
const publicTxSimulator =
|
|
85
|
+
const publicTxSimulator = createPublicTxSimulatorForBlockBuilding(guardedFork, contractsDB, globalVariables, this.telemetryClient);
|
|
77
86
|
const processor = new PublicProcessor(globalVariables, guardedFork, contractsDB, publicTxSimulator, this.dateProvider, this.telemetryClient, undefined, this.config);
|
|
78
87
|
const validator = createValidatorForBlockBuilding(fork, this.contractDataSource, globalVariables, txPublicSetupAllowList);
|
|
79
88
|
return {
|
|
@@ -86,7 +95,7 @@ export class FullNodeBlockBuilder {
|
|
|
86
95
|
log.debug(`Synced to previous block ${parentBlockNumber}`);
|
|
87
96
|
}
|
|
88
97
|
async buildBlock(pendingTxs, l1ToL2Messages, globalVariables, opts, suppliedFork) {
|
|
89
|
-
const parentBlockNumber = globalVariables.blockNumber - 1;
|
|
98
|
+
const parentBlockNumber = BlockNumber(globalVariables.blockNumber - 1);
|
|
90
99
|
const syncTimeout = opts.deadline ? (opts.deadline.getTime() - this.dateProvider.now()) / 1000 : undefined;
|
|
91
100
|
await this.syncToPreviousBlock(parentBlockNumber, syncTimeout);
|
|
92
101
|
const fork = suppliedFork ?? await this.worldState.fork(parentBlockNumber);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import type { GovernanceProposerContract, RollupContract } from '@aztec/ethereum';
|
|
1
|
+
import type { GovernanceProposerContract, RollupContract } from '@aztec/ethereum/contracts';
|
|
2
2
|
export { type SequencerConfig } from '@aztec/stdlib/config';
|
|
3
3
|
export type SequencerContracts = {
|
|
4
4
|
rollupContract: RollupContract;
|
|
5
5
|
governanceProposerContract: GovernanceProposerContract;
|
|
6
6
|
};
|
|
7
|
-
//# sourceMappingURL=
|
|
7
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VxdWVuY2VyL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSwwQkFBMEIsRUFBRSxjQUFjLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUU1RixPQUFPLEVBQUUsS0FBSyxlQUFlLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUU1RCxNQUFNLE1BQU0sa0JBQWtCLEdBQUc7SUFDL0IsY0FBYyxFQUFFLGNBQWMsQ0FBQztJQUMvQiwwQkFBMEIsRUFBRSwwQkFBMEIsQ0FBQztDQUN4RCxDQUFDIn0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/sequencer/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAE,cAAc,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/sequencer/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAE5F,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAE5D,MAAM,MAAM,kBAAkB,GAAG;IAC/B,cAAc,EAAE,cAAc,CAAC;IAC/B,0BAA0B,EAAE,0BAA0B,CAAC;CACxD,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { SequencerState } from './utils.js';
|
|
2
|
+
export declare class SequencerTooSlowError extends Error {
|
|
3
|
+
readonly proposedState: SequencerState;
|
|
4
|
+
readonly maxAllowedTime: number;
|
|
5
|
+
readonly currentTime: number;
|
|
6
|
+
constructor(proposedState: SequencerState, maxAllowedTime: number, currentTime: number);
|
|
7
|
+
}
|
|
8
|
+
export declare class SequencerInterruptedError extends Error {
|
|
9
|
+
constructor();
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JzLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VxdWVuY2VyL2Vycm9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxjQUFjLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFakQscUJBQWEscUJBQXNCLFNBQVEsS0FBSzthQUU1QixhQUFhLEVBQUUsY0FBYzthQUM3QixjQUFjLEVBQUUsTUFBTTthQUN0QixXQUFXLEVBQUUsTUFBTTtJQUhyQyxZQUNrQixhQUFhLEVBQUUsY0FBYyxFQUM3QixjQUFjLEVBQUUsTUFBTSxFQUN0QixXQUFXLEVBQUUsTUFBTSxFQU1wQztDQUNGO0FBRUQscUJBQWEseUJBQTBCLFNBQVEsS0FBSztJQUNsRCxjQUdDO0NBQ0YifQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/sequencer/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,qBAAa,qBAAsB,SAAQ,KAAK;aAE5B,aAAa,EAAE,cAAc;aAC7B,cAAc,EAAE,MAAM;aACtB,WAAW,EAAE,MAAM;IAHrC,YACkB,aAAa,EAAE,cAAc,EAC7B,cAAc,EAAE,MAAM,EACtB,WAAW,EAAE,MAAM,EAMpC;CACF;AAED,qBAAa,yBAA0B,SAAQ,KAAK;IAClD,cAGC;CACF"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export class SequencerTooSlowError extends Error {
|
|
2
|
+
proposedState;
|
|
3
|
+
maxAllowedTime;
|
|
4
|
+
currentTime;
|
|
5
|
+
constructor(proposedState, maxAllowedTime, currentTime){
|
|
6
|
+
super(`Too far into slot for ${proposedState} (time into slot ${currentTime}s greater than ${maxAllowedTime}s allowance)`), this.proposedState = proposedState, this.maxAllowedTime = maxAllowedTime, this.currentTime = currentTime;
|
|
7
|
+
this.name = 'SequencerTooSlowError';
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
export class SequencerInterruptedError extends Error {
|
|
11
|
+
constructor(){
|
|
12
|
+
super(`Sequencer was interrupted`);
|
|
13
|
+
this.name = 'SequencerInterruptedError';
|
|
14
|
+
}
|
|
15
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
export * from './block_builder.js';
|
|
2
2
|
export * from './config.js';
|
|
3
3
|
export * from './sequencer.js';
|
|
4
|
-
//# sourceMappingURL=
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXF1ZW5jZXIvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxvQkFBb0IsQ0FBQztBQUNuQyxjQUFjLGFBQWEsQ0FBQztBQUM1QixjQUFjLGdCQUFnQixDQUFDIn0=
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import
|
|
2
|
-
import type { RollupContract } from '@aztec/ethereum';
|
|
1
|
+
import { EthAddress } from '@aztec/aztec.js/addresses';
|
|
2
|
+
import type { RollupContract } from '@aztec/ethereum/contracts';
|
|
3
|
+
import type { SlotNumber } from '@aztec/foundation/branded-types';
|
|
3
4
|
import { type TelemetryClient, type Tracer } from '@aztec/telemetry-client';
|
|
4
|
-
import { type
|
|
5
|
+
import { type Hex } from 'viem';
|
|
6
|
+
import type { SequencerState } from './utils.js';
|
|
5
7
|
export declare class SequencerMetrics {
|
|
6
|
-
private coinbase;
|
|
7
8
|
private rollup;
|
|
8
9
|
readonly tracer: Tracer;
|
|
9
10
|
private meter;
|
|
@@ -11,9 +12,6 @@ export declare class SequencerMetrics {
|
|
|
11
12
|
private blockBuildDuration;
|
|
12
13
|
private blockBuildManaPerSecond;
|
|
13
14
|
private stateTransitionBufferDuration;
|
|
14
|
-
private currentBlockNumber;
|
|
15
|
-
private currentBlockSize;
|
|
16
|
-
private blockBuilderInsertions;
|
|
17
15
|
private timeToCollectAttestations;
|
|
18
16
|
private allowanceToCollectAttestations;
|
|
19
17
|
private requiredAttestions;
|
|
@@ -21,23 +19,22 @@ export declare class SequencerMetrics {
|
|
|
21
19
|
private rewards;
|
|
22
20
|
private slots;
|
|
23
21
|
private filledSlots;
|
|
24
|
-
private
|
|
22
|
+
private blockProposalFailed;
|
|
23
|
+
private blockProposalSuccess;
|
|
24
|
+
private blockProposalPrecheckFailed;
|
|
25
|
+
private slashingAttempts;
|
|
25
26
|
private lastSeenSlot?;
|
|
26
|
-
constructor(client: TelemetryClient,
|
|
27
|
-
setCoinbase(coinbase: EthAddress): void;
|
|
28
|
-
start(): void;
|
|
29
|
-
stop(): void;
|
|
30
|
-
private observe;
|
|
27
|
+
constructor(client: TelemetryClient, rollup: RollupContract, name?: string);
|
|
31
28
|
recordRequiredAttestations(requiredAttestationsCount: number, allowanceMs: number): void;
|
|
32
29
|
recordCollectedAttestations(count: number, durationMs: number): void;
|
|
33
|
-
recordBlockBuilderTreeInsertions(timeUs: number): void;
|
|
34
|
-
recordCancelledBlock(): void;
|
|
35
30
|
recordBuiltBlock(buildDurationMs: number, totalMana: number): void;
|
|
36
31
|
recordFailedBlock(): void;
|
|
37
|
-
recordNewBlock(blockNumber: number, txCount: number): void;
|
|
38
32
|
recordStateTransitionBufferMs(durationMs: number, state: SequencerState): void;
|
|
39
|
-
|
|
40
|
-
incFilledSlot(proposer: string): void
|
|
41
|
-
|
|
33
|
+
incOpenSlot(slot: SlotNumber, proposer: string): void;
|
|
34
|
+
incFilledSlot(proposer: string, coinbase: Hex | EthAddress | undefined): Promise<void>;
|
|
35
|
+
recordBlockProposalFailed(reason?: string): void;
|
|
36
|
+
recordBlockProposalSuccess(): void;
|
|
37
|
+
recordBlockProposalPrecheckFailed(checkType: string): void;
|
|
38
|
+
recordSlashingAttempt(actionCount: number): void;
|
|
42
39
|
}
|
|
43
|
-
//# sourceMappingURL=
|
|
40
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0cmljcy5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcXVlbmNlci9tZXRyaWNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN2RCxPQUFPLEtBQUssRUFBRSxjQUFjLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNoRSxPQUFPLEtBQUssRUFBRSxVQUFVLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNsRSxPQUFPLEVBTUwsS0FBSyxlQUFlLEVBQ3BCLEtBQUssTUFBTSxFQUdaLE1BQU0seUJBQXlCLENBQUM7QUFFakMsT0FBTyxFQUFFLEtBQUssR0FBRyxFQUFlLE1BQU0sTUFBTSxDQUFDO0FBRTdDLE9BQU8sS0FBSyxFQUFFLGNBQWMsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUVqRCxxQkFBYSxnQkFBZ0I7SUE2QnpCLE9BQU8sQ0FBQyxNQUFNO0lBNUJoQixTQUFnQixNQUFNLEVBQUUsTUFBTSxDQUFDO0lBQy9CLE9BQU8sQ0FBQyxLQUFLLENBQVE7SUFFckIsT0FBTyxDQUFDLFlBQVksQ0FBZ0I7SUFDcEMsT0FBTyxDQUFDLGtCQUFrQixDQUFZO0lBQ3RDLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBUTtJQUN2QyxPQUFPLENBQUMsNkJBQTZCLENBQVk7SUFHakQsT0FBTyxDQUFDLHlCQUF5QixDQUFRO0lBQ3pDLE9BQU8sQ0FBQyw4QkFBOEIsQ0FBUTtJQUM5QyxPQUFPLENBQUMsa0JBQWtCLENBQVE7SUFDbEMsT0FBTyxDQUFDLG1CQUFtQixDQUFRO0lBRW5DLE9BQU8sQ0FBQyxPQUFPLENBQVE7SUFFdkIsT0FBTyxDQUFDLEtBQUssQ0FBZ0I7SUFDN0IsT0FBTyxDQUFDLFdBQVcsQ0FBZ0I7SUFFbkMsT0FBTyxDQUFDLG1CQUFtQixDQUFnQjtJQUMzQyxPQUFPLENBQUMsb0JBQW9CLENBQWdCO0lBQzVDLE9BQU8sQ0FBQywyQkFBMkIsQ0FBZ0I7SUFDbkQsT0FBTyxDQUFDLGdCQUFnQixDQUFnQjtJQUV4QyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQWE7SUFFbEMsWUFDRSxNQUFNLEVBQUUsZUFBZSxFQUNmLE1BQU0sRUFBRSxjQUFjLEVBQzlCLElBQUksU0FBYyxFQXVHbkI7SUFFTSwwQkFBMEIsQ0FBQyx5QkFBeUIsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLE1BQU0sUUFPdkY7SUFFTSwyQkFBMkIsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLFFBR25FO0lBRUQsZ0JBQWdCLENBQUMsZUFBZSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxRQU0xRDtJQUVELGlCQUFpQixTQUloQjtJQUVELDZCQUE2QixDQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLGNBQWMsUUFJdEU7SUFFRCxXQUFXLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxRQVc3QztJQUVLLGFBQWEsQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxHQUFHLEdBQUcsVUFBVSxHQUFHLFNBQVMsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBaUIzRjtJQUVELHlCQUF5QixDQUFDLE1BQU0sQ0FBQyxFQUFFLE1BQU0sUUFJeEM7SUFFRCwwQkFBMEIsU0FFekI7SUFFRCxpQ0FBaUMsQ0FBQyxTQUFTLEVBQUUsTUFBTSxRQUlsRDtJQUVELHFCQUFxQixDQUFDLFdBQVcsRUFBRSxNQUFNLFFBRXhDO0NBQ0YifQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../src/sequencer/metrics.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../src/sequencer/metrics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAML,KAAK,eAAe,EACpB,KAAK,MAAM,EAGZ,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAAE,KAAK,GAAG,EAAe,MAAM,MAAM,CAAC;AAE7C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,qBAAa,gBAAgB;IA6BzB,OAAO,CAAC,MAAM;IA5BhB,SAAgB,MAAM,EAAE,MAAM,CAAC;IAC/B,OAAO,CAAC,KAAK,CAAQ;IAErB,OAAO,CAAC,YAAY,CAAgB;IACpC,OAAO,CAAC,kBAAkB,CAAY;IACtC,OAAO,CAAC,uBAAuB,CAAQ;IACvC,OAAO,CAAC,6BAA6B,CAAY;IAGjD,OAAO,CAAC,yBAAyB,CAAQ;IACzC,OAAO,CAAC,8BAA8B,CAAQ;IAC9C,OAAO,CAAC,kBAAkB,CAAQ;IAClC,OAAO,CAAC,mBAAmB,CAAQ;IAEnC,OAAO,CAAC,OAAO,CAAQ;IAEvB,OAAO,CAAC,KAAK,CAAgB;IAC7B,OAAO,CAAC,WAAW,CAAgB;IAEnC,OAAO,CAAC,mBAAmB,CAAgB;IAC3C,OAAO,CAAC,oBAAoB,CAAgB;IAC5C,OAAO,CAAC,2BAA2B,CAAgB;IACnD,OAAO,CAAC,gBAAgB,CAAgB;IAExC,OAAO,CAAC,YAAY,CAAC,CAAa;IAElC,YACE,MAAM,EAAE,eAAe,EACf,MAAM,EAAE,cAAc,EAC9B,IAAI,SAAc,EAuGnB;IAEM,0BAA0B,CAAC,yBAAyB,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,QAOvF;IAEM,2BAA2B,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,QAGnE;IAED,gBAAgB,CAAC,eAAe,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,QAM1D;IAED,iBAAiB,SAIhB;IAED,6BAA6B,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,QAItE;IAED,WAAW,CAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,QAW7C;IAEK,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,GAAG,UAAU,GAAG,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAiB3F;IAED,yBAAyB,CAAC,MAAM,CAAC,EAAE,MAAM,QAIxC;IAED,0BAA0B,SAEzB;IAED,iCAAiC,CAAC,SAAS,EAAE,MAAM,QAIlD;IAED,qBAAqB,CAAC,WAAW,EAAE,MAAM,QAExC;CACF"}
|
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
import { Attributes, Metrics, ValueType } from '@aztec/telemetry-client';
|
|
2
2
|
import { formatUnits } from 'viem';
|
|
3
|
-
import { sequencerStateToNumber } from './utils.js';
|
|
4
3
|
export class SequencerMetrics {
|
|
5
|
-
coinbase;
|
|
6
4
|
rollup;
|
|
7
5
|
tracer;
|
|
8
6
|
meter;
|
|
@@ -10,9 +8,6 @@ export class SequencerMetrics {
|
|
|
10
8
|
blockBuildDuration;
|
|
11
9
|
blockBuildManaPerSecond;
|
|
12
10
|
stateTransitionBufferDuration;
|
|
13
|
-
currentBlockNumber;
|
|
14
|
-
currentBlockSize;
|
|
15
|
-
blockBuilderInsertions;
|
|
16
11
|
// these are gauges because for individual sequencers building a block is not something that happens often enough to warrant a histogram
|
|
17
12
|
timeToCollectAttestations;
|
|
18
13
|
allowanceToCollectAttestations;
|
|
@@ -21,19 +16,13 @@ export class SequencerMetrics {
|
|
|
21
16
|
rewards;
|
|
22
17
|
slots;
|
|
23
18
|
filledSlots;
|
|
24
|
-
|
|
19
|
+
blockProposalFailed;
|
|
20
|
+
blockProposalSuccess;
|
|
21
|
+
blockProposalPrecheckFailed;
|
|
22
|
+
slashingAttempts;
|
|
25
23
|
lastSeenSlot;
|
|
26
|
-
constructor(client,
|
|
27
|
-
this.coinbase = coinbase;
|
|
24
|
+
constructor(client, rollup, name = 'Sequencer'){
|
|
28
25
|
this.rollup = rollup;
|
|
29
|
-
this.observe = async (observer)=>{
|
|
30
|
-
let rewards = 0n;
|
|
31
|
-
rewards = await this.rollup.getSequencerRewards(this.coinbase);
|
|
32
|
-
const fmt = parseFloat(formatUnits(rewards, 18));
|
|
33
|
-
observer.observe(this.rewards, fmt, {
|
|
34
|
-
[Attributes.COINBASE]: this.coinbase.toString()
|
|
35
|
-
});
|
|
36
|
-
};
|
|
37
26
|
this.meter = client.getMeter(name);
|
|
38
27
|
this.tracer = client.getTracer(name);
|
|
39
28
|
this.blockCounter = this.meter.createUpDownCounter(Metrics.SEQUENCER_BLOCK_COUNT);
|
|
@@ -52,37 +41,14 @@ export class SequencerMetrics {
|
|
|
52
41
|
description: 'The time difference between when the sequencer needed to transition to a new state and when it actually did.',
|
|
53
42
|
valueType: ValueType.INT
|
|
54
43
|
});
|
|
55
|
-
const currentState = this.meter.createObservableGauge(Metrics.SEQUENCER_CURRENT_STATE, {
|
|
56
|
-
description: 'Current state of the sequencer'
|
|
57
|
-
});
|
|
58
|
-
currentState.addCallback((observer)=>{
|
|
59
|
-
observer.observe(sequencerStateToNumber(getState()));
|
|
60
|
-
});
|
|
61
|
-
this.currentBlockNumber = this.meter.createGauge(Metrics.SEQUENCER_CURRENT_BLOCK_NUMBER, {
|
|
62
|
-
description: 'Current block number',
|
|
63
|
-
valueType: ValueType.INT
|
|
64
|
-
});
|
|
65
|
-
this.currentBlockSize = this.meter.createGauge(Metrics.SEQUENCER_CURRENT_BLOCK_SIZE, {
|
|
66
|
-
description: 'Current block size',
|
|
67
|
-
valueType: ValueType.INT
|
|
68
|
-
});
|
|
69
|
-
this.blockBuilderInsertions = this.meter.createHistogram(Metrics.SEQUENCER_BLOCK_BUILD_INSERTION_TIME, {
|
|
70
|
-
description: 'Timer for tree insertions performed by the block builder',
|
|
71
|
-
unit: 'us',
|
|
72
|
-
valueType: ValueType.INT
|
|
73
|
-
});
|
|
74
44
|
// Init gauges and counters
|
|
75
|
-
this.setCurrentBlock(0, 0);
|
|
76
|
-
this.blockCounter.add(0, {
|
|
77
|
-
[Attributes.STATUS]: 'cancelled'
|
|
78
|
-
});
|
|
79
45
|
this.blockCounter.add(0, {
|
|
80
46
|
[Attributes.STATUS]: 'failed'
|
|
81
47
|
});
|
|
82
48
|
this.blockCounter.add(0, {
|
|
83
49
|
[Attributes.STATUS]: 'built'
|
|
84
50
|
});
|
|
85
|
-
this.rewards = this.meter.
|
|
51
|
+
this.rewards = this.meter.createGauge(Metrics.SEQUENCER_CURRENT_BLOCK_REWARDS, {
|
|
86
52
|
valueType: ValueType.DOUBLE,
|
|
87
53
|
description: 'The rewards earned'
|
|
88
54
|
});
|
|
@@ -90,14 +56,13 @@ export class SequencerMetrics {
|
|
|
90
56
|
valueType: ValueType.INT,
|
|
91
57
|
description: 'The number of slots this sequencer was selected for'
|
|
92
58
|
});
|
|
93
|
-
|
|
59
|
+
/**
|
|
60
|
+
* NOTE: we do not track missed slots as a separate metric. That would be difficult to determine
|
|
61
|
+
* Instead, use a computed metric, `slots - filledSlots` to get the number of slots a sequencer has missed.
|
|
62
|
+
*/ this.filledSlots = this.meter.createUpDownCounter(Metrics.SEQUENCER_FILLED_SLOT_COUNT, {
|
|
94
63
|
valueType: ValueType.INT,
|
|
95
64
|
description: 'The number of slots this sequencer has filled'
|
|
96
65
|
});
|
|
97
|
-
this.missedSlots = this.meter.createUpDownCounter(Metrics.SEQUENCER_MISSED_SLOT_COUNT, {
|
|
98
|
-
valueType: ValueType.INT,
|
|
99
|
-
description: 'The number of slots this sequencer has missed to fill'
|
|
100
|
-
});
|
|
101
66
|
this.timeToCollectAttestations = this.meter.createGauge(Metrics.SEQUENCER_COLLECT_ATTESTATIONS_DURATION, {
|
|
102
67
|
description: 'The time spent collecting attestations from committee members',
|
|
103
68
|
unit: 'ms',
|
|
@@ -116,21 +81,23 @@ export class SequencerMetrics {
|
|
|
116
81
|
valueType: ValueType.INT,
|
|
117
82
|
description: 'The minimum number of attestations required to publish a block'
|
|
118
83
|
});
|
|
84
|
+
this.blockProposalFailed = this.meter.createUpDownCounter(Metrics.SEQUENCER_BLOCK_PROPOSAL_FAILED_COUNT, {
|
|
85
|
+
valueType: ValueType.INT,
|
|
86
|
+
description: 'The number of times block proposal failed (including validation builds)'
|
|
87
|
+
});
|
|
88
|
+
this.blockProposalSuccess = this.meter.createUpDownCounter(Metrics.SEQUENCER_BLOCK_PROPOSAL_SUCCESS_COUNT, {
|
|
89
|
+
valueType: ValueType.INT,
|
|
90
|
+
description: 'The number of times block proposal succeeded (including validation builds)'
|
|
91
|
+
});
|
|
92
|
+
this.blockProposalPrecheckFailed = this.meter.createUpDownCounter(Metrics.SEQUENCER_BLOCK_PROPOSAL_PRECHECK_FAILED_COUNT, {
|
|
93
|
+
valueType: ValueType.INT,
|
|
94
|
+
description: 'The number of times block proposal pre-build checks failed'
|
|
95
|
+
});
|
|
96
|
+
this.slashingAttempts = this.meter.createUpDownCounter(Metrics.SEQUENCER_SLASHING_ATTEMPTS_COUNT, {
|
|
97
|
+
valueType: ValueType.INT,
|
|
98
|
+
description: 'The number of slashing action attempts'
|
|
99
|
+
});
|
|
119
100
|
}
|
|
120
|
-
setCoinbase(coinbase) {
|
|
121
|
-
this.coinbase = coinbase;
|
|
122
|
-
}
|
|
123
|
-
start() {
|
|
124
|
-
this.meter.addBatchObservableCallback(this.observe, [
|
|
125
|
-
this.rewards
|
|
126
|
-
]);
|
|
127
|
-
}
|
|
128
|
-
stop() {
|
|
129
|
-
this.meter.removeBatchObservableCallback(this.observe, [
|
|
130
|
-
this.rewards
|
|
131
|
-
]);
|
|
132
|
-
}
|
|
133
|
-
observe;
|
|
134
101
|
recordRequiredAttestations(requiredAttestationsCount, allowanceMs) {
|
|
135
102
|
this.requiredAttestions.record(requiredAttestationsCount);
|
|
136
103
|
this.allowanceToCollectAttestations.record(Math.ceil(allowanceMs));
|
|
@@ -142,15 +109,6 @@ export class SequencerMetrics {
|
|
|
142
109
|
this.collectedAttestions.record(count);
|
|
143
110
|
this.timeToCollectAttestations.record(Math.ceil(durationMs));
|
|
144
111
|
}
|
|
145
|
-
recordBlockBuilderTreeInsertions(timeUs) {
|
|
146
|
-
this.blockBuilderInsertions.record(Math.ceil(timeUs));
|
|
147
|
-
}
|
|
148
|
-
recordCancelledBlock() {
|
|
149
|
-
this.blockCounter.add(1, {
|
|
150
|
-
[Attributes.STATUS]: 'cancelled'
|
|
151
|
-
});
|
|
152
|
-
this.setCurrentBlock(0, 0);
|
|
153
|
-
}
|
|
154
112
|
recordBuiltBlock(buildDurationMs, totalMana) {
|
|
155
113
|
this.blockCounter.add(1, {
|
|
156
114
|
[Attributes.STATUS]: 'built'
|
|
@@ -162,41 +120,55 @@ export class SequencerMetrics {
|
|
|
162
120
|
this.blockCounter.add(1, {
|
|
163
121
|
[Attributes.STATUS]: 'failed'
|
|
164
122
|
});
|
|
165
|
-
this.setCurrentBlock(0, 0);
|
|
166
|
-
}
|
|
167
|
-
recordNewBlock(blockNumber, txCount) {
|
|
168
|
-
this.setCurrentBlock(blockNumber, txCount);
|
|
169
123
|
}
|
|
170
124
|
recordStateTransitionBufferMs(durationMs, state) {
|
|
171
125
|
this.stateTransitionBufferDuration.record(durationMs, {
|
|
172
126
|
[Attributes.SEQUENCER_STATE]: state
|
|
173
127
|
});
|
|
174
128
|
}
|
|
175
|
-
|
|
129
|
+
incOpenSlot(slot, proposer) {
|
|
176
130
|
// sequencer went through the loop a second time. Noop
|
|
177
131
|
if (slot === this.lastSeenSlot) {
|
|
178
132
|
return;
|
|
179
133
|
}
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
});
|
|
184
|
-
}
|
|
185
|
-
if (typeof slot === 'bigint') {
|
|
186
|
-
this.slots.add(1, {
|
|
187
|
-
[Attributes.BLOCK_PROPOSER]: proposer
|
|
188
|
-
});
|
|
189
|
-
}
|
|
134
|
+
this.slots.add(1, {
|
|
135
|
+
[Attributes.BLOCK_PROPOSER]: proposer
|
|
136
|
+
});
|
|
190
137
|
this.lastSeenSlot = slot;
|
|
191
138
|
}
|
|
192
|
-
incFilledSlot(proposer) {
|
|
139
|
+
async incFilledSlot(proposer, coinbase) {
|
|
193
140
|
this.filledSlots.add(1, {
|
|
194
141
|
[Attributes.BLOCK_PROPOSER]: proposer
|
|
195
142
|
});
|
|
196
143
|
this.lastSeenSlot = undefined;
|
|
144
|
+
if (coinbase) {
|
|
145
|
+
try {
|
|
146
|
+
const rewards = await this.rollup.getSequencerRewards(coinbase);
|
|
147
|
+
const fmt = parseFloat(formatUnits(rewards, 18));
|
|
148
|
+
this.rewards.record(fmt, {
|
|
149
|
+
[Attributes.COINBASE]: coinbase.toString()
|
|
150
|
+
});
|
|
151
|
+
} catch {
|
|
152
|
+
// no-op
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
recordBlockProposalFailed(reason) {
|
|
157
|
+
this.blockProposalFailed.add(1, {
|
|
158
|
+
...reason && {
|
|
159
|
+
[Attributes.ERROR_TYPE]: reason
|
|
160
|
+
}
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
recordBlockProposalSuccess() {
|
|
164
|
+
this.blockProposalSuccess.add(1);
|
|
165
|
+
}
|
|
166
|
+
recordBlockProposalPrecheckFailed(checkType) {
|
|
167
|
+
this.blockProposalPrecheckFailed.add(1, {
|
|
168
|
+
[Attributes.ERROR_TYPE]: checkType
|
|
169
|
+
});
|
|
197
170
|
}
|
|
198
|
-
|
|
199
|
-
this.
|
|
200
|
-
this.currentBlockSize.record(txCount);
|
|
171
|
+
recordSlashingAttempt(actionCount) {
|
|
172
|
+
this.slashingAttempts.add(actionCount);
|
|
201
173
|
}
|
|
202
174
|
}
|