@aztec/validator-client 2.1.0-rc.22 → 2.1.0-rc.24

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/metrics.d.ts CHANGED
@@ -2,15 +2,17 @@ import type { BlockProposal } from '@aztec/stdlib/p2p';
2
2
  import { type TelemetryClient } from '@aztec/telemetry-client';
3
3
  export declare class ValidatorMetrics {
4
4
  private failedReexecutionCounter;
5
- private attestationsCount;
6
- private failedAttestationsCount;
5
+ private successfulAttestationsCount;
6
+ private failedAttestationsBadProposalCount;
7
+ private failedAttestationsNodeIssueCount;
7
8
  private reexMana;
8
9
  private reexTx;
9
10
  private reexDuration;
10
11
  constructor(telemetryClient: TelemetryClient);
11
12
  recordReex(time: number, txs: number, mManaTotal: number): void;
12
13
  recordFailedReexecution(proposal: BlockProposal): void;
13
- incAttestations(num: number): void;
14
- incFailedAttestations(num: number, reason: string, inCommittee: boolean): void;
14
+ incSuccessfulAttestations(num: number): void;
15
+ incFailedAttestationsBadProposal(num: number, reason: string): void;
16
+ incFailedAttestationsNodeIssue(num: number, reason: string): void;
15
17
  }
16
18
  //# sourceMappingURL=metrics.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../src/metrics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAIL,KAAK,eAAe,EAGrB,MAAM,yBAAyB,CAAC;AAEjC,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,wBAAwB,CAAgB;IAChD,OAAO,CAAC,iBAAiB,CAAgB;IACzC,OAAO,CAAC,uBAAuB,CAAgB;IAE/C,OAAO,CAAC,QAAQ,CAAY;IAC5B,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,YAAY,CAAY;gBAEpB,eAAe,EAAE,eAAe;IAsCrC,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM;IAMxD,uBAAuB,CAAC,QAAQ,EAAE,aAAa;IAQ/C,eAAe,CAAC,GAAG,EAAE,MAAM;IAI3B,qBAAqB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO;CAM/E"}
1
+ {"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../src/metrics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAIL,KAAK,eAAe,EAGrB,MAAM,yBAAyB,CAAC;AAEjC,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,wBAAwB,CAAgB;IAChD,OAAO,CAAC,2BAA2B,CAAgB;IACnD,OAAO,CAAC,kCAAkC,CAAgB;IAC1D,OAAO,CAAC,gCAAgC,CAAgB;IAExD,OAAO,CAAC,QAAQ,CAAY;IAC5B,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,YAAY,CAAY;gBAEpB,eAAe,EAAE,eAAe;IAiDrC,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM;IAMxD,uBAAuB,CAAC,QAAQ,EAAE,aAAa;IAQ/C,yBAAyB,CAAC,GAAG,EAAE,MAAM;IAIrC,gCAAgC,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAM5D,8BAA8B,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;CAKlE"}
package/dest/metrics.js CHANGED
@@ -1,8 +1,9 @@
1
1
  import { Attributes, Metrics, ValueType } from '@aztec/telemetry-client';
2
2
  export class ValidatorMetrics {
3
3
  failedReexecutionCounter;
4
- attestationsCount;
5
- failedAttestationsCount;
4
+ successfulAttestationsCount;
5
+ failedAttestationsBadProposalCount;
6
+ failedAttestationsNodeIssueCount;
6
7
  reexMana;
7
8
  reexTx;
8
9
  reexDuration;
@@ -13,12 +14,16 @@ export class ValidatorMetrics {
13
14
  unit: 'count',
14
15
  valueType: ValueType.INT
15
16
  });
16
- this.attestationsCount = meter.createUpDownCounter(Metrics.VALIDATOR_ATTESTATION_COUNT, {
17
- description: 'The number of attestations',
17
+ this.successfulAttestationsCount = meter.createUpDownCounter(Metrics.VALIDATOR_ATTESTATION_SUCCESS_COUNT, {
18
+ description: 'The number of successful attestations',
18
19
  valueType: ValueType.INT
19
20
  });
20
- this.failedAttestationsCount = meter.createUpDownCounter(Metrics.VALIDATOR_FAILED_ATTESTATION_COUNT, {
21
- description: 'The number of failed attestations',
21
+ this.failedAttestationsBadProposalCount = meter.createUpDownCounter(Metrics.VALIDATOR_ATTESTATION_FAILED_BAD_PROPOSAL_COUNT, {
22
+ description: 'The number of failed attestations due to invalid block proposals',
23
+ valueType: ValueType.INT
24
+ });
25
+ this.failedAttestationsNodeIssueCount = meter.createUpDownCounter(Metrics.VALIDATOR_ATTESTATION_FAILED_NODE_ISSUE_COUNT, {
26
+ description: 'The number of failed attestations due to node issues (timeout, missing data, etc.)',
22
27
  valueType: ValueType.INT
23
28
  });
24
29
  this.reexMana = meter.createHistogram(Metrics.VALIDATOR_RE_EXECUTION_MANA, {
@@ -49,13 +54,17 @@ export class ValidatorMetrics {
49
54
  [Attributes.BLOCK_PROPOSER]: proposer?.toString() ?? 'unknown'
50
55
  });
51
56
  }
52
- incAttestations(num) {
53
- this.attestationsCount.add(num);
57
+ incSuccessfulAttestations(num) {
58
+ this.successfulAttestationsCount.add(num);
59
+ }
60
+ incFailedAttestationsBadProposal(num, reason) {
61
+ this.failedAttestationsBadProposalCount.add(num, {
62
+ [Attributes.ERROR_TYPE]: reason
63
+ });
54
64
  }
55
- incFailedAttestations(num, reason, inCommittee) {
56
- this.failedAttestationsCount.add(num, {
57
- [Attributes.ERROR_TYPE]: reason,
58
- [Attributes.VALIDATOR_STATUS]: inCommittee ? 'in-committee' : 'none'
65
+ incFailedAttestationsNodeIssue(num, reason) {
66
+ this.failedAttestationsNodeIssueCount.add(num, {
67
+ [Attributes.ERROR_TYPE]: reason
59
68
  });
60
69
  }
61
70
  }
@@ -1 +1 @@
1
- {"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../src/validator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../src/validator.ts"],"names":[],"mappings":"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"}
package/dest/validator.js CHANGED
@@ -167,7 +167,6 @@ const SLASHABLE_BLOCK_PROPOSAL_VALIDATION_RESULT = [
167
167
  // Check that I have any address in current committee before attesting
168
168
  const inCommittee = await this.epochCache.filterInCommittee(slotNumber, this.getValidatorAddresses());
169
169
  const partOfCommittee = inCommittee.length > 0;
170
- const incFailedAttestation = (reason)=>this.metrics.incFailedAttestations(1, reason, partOfCommittee);
171
170
  const proposalInfo = {
172
171
  ...proposal.toBlockInfo(),
173
172
  proposer: proposer.toString()
@@ -183,8 +182,24 @@ const SLASHABLE_BLOCK_PROPOSAL_VALIDATION_RESULT = [
183
182
  const validationResult = await this.blockProposalHandler.handleBlockProposal(proposal, proposalSender, !!shouldReexecute);
184
183
  if (!validationResult.isValid) {
185
184
  this.log.warn(`Proposal validation failed: ${validationResult.reason}`, proposalInfo);
186
- incFailedAttestation(validationResult.reason || 'unknown');
187
- // Slash invalid block proposals
185
+ // Only track attestation failure metrics if we're actually in the committee
186
+ if (partOfCommittee) {
187
+ const reason = validationResult.reason || 'unknown';
188
+ // Classify failure reason: bad proposal vs node issue
189
+ const badProposalReasons = [
190
+ 'invalid_proposal',
191
+ 'state_mismatch',
192
+ 'failed_txs',
193
+ 'in_hash_mismatch',
194
+ 'parent_block_wrong_slot'
195
+ ];
196
+ if (badProposalReasons.includes(reason)) {
197
+ this.metrics.incFailedAttestationsBadProposal(1, reason);
198
+ } else {
199
+ this.metrics.incFailedAttestationsNodeIssue(1, reason);
200
+ }
201
+ }
202
+ // Slash invalid block proposals (can happen even when not in committee)
188
203
  if (validationResult.reason && SLASHABLE_BLOCK_PROPOSAL_VALIDATION_RESULT.includes(validationResult.reason) && slashBroadcastedInvalidBlockPenalty > 0n) {
189
204
  this.log.warn(`Slashing proposer for invalid block proposal`, proposalInfo);
190
205
  this.slashInvalidBlock(proposal);
@@ -198,7 +213,7 @@ const SLASHABLE_BLOCK_PROPOSAL_VALIDATION_RESULT = [
198
213
  }
199
214
  // Provided all of the above checks pass, we can attest to the proposal
200
215
  this.log.info(`Attesting to proposal for block at slot ${slotNumber}`, proposalInfo);
201
- this.metrics.incAttestations(inCommittee.length);
216
+ this.metrics.incSuccessfulAttestations(inCommittee.length);
202
217
  // If the above function does not throw an error, then we can attest to the proposal
203
218
  return this.createBlockAttestationsFromProposal(proposal, inCommittee);
204
219
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aztec/validator-client",
3
- "version": "2.1.0-rc.22",
3
+ "version": "2.1.0-rc.24",
4
4
  "main": "dest/index.js",
5
5
  "type": "module",
6
6
  "exports": {
@@ -64,16 +64,16 @@
64
64
  ]
65
65
  },
66
66
  "dependencies": {
67
- "@aztec/constants": "2.1.0-rc.22",
68
- "@aztec/epoch-cache": "2.1.0-rc.22",
69
- "@aztec/ethereum": "2.1.0-rc.22",
70
- "@aztec/foundation": "2.1.0-rc.22",
71
- "@aztec/node-keystore": "2.1.0-rc.22",
72
- "@aztec/p2p": "2.1.0-rc.22",
73
- "@aztec/prover-client": "2.1.0-rc.22",
74
- "@aztec/slasher": "2.1.0-rc.22",
75
- "@aztec/stdlib": "2.1.0-rc.22",
76
- "@aztec/telemetry-client": "2.1.0-rc.22",
67
+ "@aztec/constants": "2.1.0-rc.24",
68
+ "@aztec/epoch-cache": "2.1.0-rc.24",
69
+ "@aztec/ethereum": "2.1.0-rc.24",
70
+ "@aztec/foundation": "2.1.0-rc.24",
71
+ "@aztec/node-keystore": "2.1.0-rc.24",
72
+ "@aztec/p2p": "2.1.0-rc.24",
73
+ "@aztec/prover-client": "2.1.0-rc.24",
74
+ "@aztec/slasher": "2.1.0-rc.24",
75
+ "@aztec/stdlib": "2.1.0-rc.24",
76
+ "@aztec/telemetry-client": "2.1.0-rc.24",
77
77
  "koa": "^2.16.1",
78
78
  "koa-router": "^13.1.1",
79
79
  "tslib": "^2.4.0",
package/src/metrics.ts CHANGED
@@ -10,8 +10,9 @@ import {
10
10
 
11
11
  export class ValidatorMetrics {
12
12
  private failedReexecutionCounter: UpDownCounter;
13
- private attestationsCount: UpDownCounter;
14
- private failedAttestationsCount: UpDownCounter;
13
+ private successfulAttestationsCount: UpDownCounter;
14
+ private failedAttestationsBadProposalCount: UpDownCounter;
15
+ private failedAttestationsNodeIssueCount: UpDownCounter;
15
16
 
16
17
  private reexMana: Histogram;
17
18
  private reexTx: Histogram;
@@ -26,15 +27,26 @@ export class ValidatorMetrics {
26
27
  valueType: ValueType.INT,
27
28
  });
28
29
 
29
- this.attestationsCount = meter.createUpDownCounter(Metrics.VALIDATOR_ATTESTATION_COUNT, {
30
- description: 'The number of attestations',
30
+ this.successfulAttestationsCount = meter.createUpDownCounter(Metrics.VALIDATOR_ATTESTATION_SUCCESS_COUNT, {
31
+ description: 'The number of successful attestations',
31
32
  valueType: ValueType.INT,
32
33
  });
33
34
 
34
- this.failedAttestationsCount = meter.createUpDownCounter(Metrics.VALIDATOR_FAILED_ATTESTATION_COUNT, {
35
- description: 'The number of failed attestations',
36
- valueType: ValueType.INT,
37
- });
35
+ this.failedAttestationsBadProposalCount = meter.createUpDownCounter(
36
+ Metrics.VALIDATOR_ATTESTATION_FAILED_BAD_PROPOSAL_COUNT,
37
+ {
38
+ description: 'The number of failed attestations due to invalid block proposals',
39
+ valueType: ValueType.INT,
40
+ },
41
+ );
42
+
43
+ this.failedAttestationsNodeIssueCount = meter.createUpDownCounter(
44
+ Metrics.VALIDATOR_ATTESTATION_FAILED_NODE_ISSUE_COUNT,
45
+ {
46
+ description: 'The number of failed attestations due to node issues (timeout, missing data, etc.)',
47
+ valueType: ValueType.INT,
48
+ },
49
+ );
38
50
 
39
51
  this.reexMana = meter.createHistogram(Metrics.VALIDATOR_RE_EXECUTION_MANA, {
40
52
  description: 'The mana consumed by blocks',
@@ -69,14 +81,19 @@ export class ValidatorMetrics {
69
81
  });
70
82
  }
71
83
 
72
- public incAttestations(num: number) {
73
- this.attestationsCount.add(num);
84
+ public incSuccessfulAttestations(num: number) {
85
+ this.successfulAttestationsCount.add(num);
86
+ }
87
+
88
+ public incFailedAttestationsBadProposal(num: number, reason: string) {
89
+ this.failedAttestationsBadProposalCount.add(num, {
90
+ [Attributes.ERROR_TYPE]: reason,
91
+ });
74
92
  }
75
93
 
76
- public incFailedAttestations(num: number, reason: string, inCommittee: boolean) {
77
- this.failedAttestationsCount.add(num, {
94
+ public incFailedAttestationsNodeIssue(num: number, reason: string) {
95
+ this.failedAttestationsNodeIssueCount.add(num, {
78
96
  [Attributes.ERROR_TYPE]: reason,
79
- [Attributes.VALIDATOR_STATUS]: inCommittee ? 'in-committee' : 'none',
80
97
  });
81
98
  }
82
99
  }
package/src/validator.ts CHANGED
@@ -265,7 +265,6 @@ export class ValidatorClient extends (EventEmitter as new () => WatcherEmitter)
265
265
  // Check that I have any address in current committee before attesting
266
266
  const inCommittee = await this.epochCache.filterInCommittee(slotNumber, this.getValidatorAddresses());
267
267
  const partOfCommittee = inCommittee.length > 0;
268
- const incFailedAttestation = (reason: string) => this.metrics.incFailedAttestations(1, reason, partOfCommittee);
269
268
 
270
269
  const proposalInfo = { ...proposal.toBlockInfo(), proposer: proposer.toString() };
271
270
  this.log.info(`Received proposal for slot ${slotNumber}`, {
@@ -289,9 +288,27 @@ export class ValidatorClient extends (EventEmitter as new () => WatcherEmitter)
289
288
 
290
289
  if (!validationResult.isValid) {
291
290
  this.log.warn(`Proposal validation failed: ${validationResult.reason}`, proposalInfo);
292
- incFailedAttestation(validationResult.reason || 'unknown');
293
291
 
294
- // Slash invalid block proposals
292
+ // Only track attestation failure metrics if we're actually in the committee
293
+ if (partOfCommittee) {
294
+ const reason = validationResult.reason || 'unknown';
295
+ // Classify failure reason: bad proposal vs node issue
296
+ const badProposalReasons: BlockProposalValidationFailureReason[] = [
297
+ 'invalid_proposal',
298
+ 'state_mismatch',
299
+ 'failed_txs',
300
+ 'in_hash_mismatch',
301
+ 'parent_block_wrong_slot',
302
+ ];
303
+
304
+ if (badProposalReasons.includes(reason as BlockProposalValidationFailureReason)) {
305
+ this.metrics.incFailedAttestationsBadProposal(1, reason);
306
+ } else {
307
+ this.metrics.incFailedAttestationsNodeIssue(1, reason);
308
+ }
309
+ }
310
+
311
+ // Slash invalid block proposals (can happen even when not in committee)
295
312
  if (
296
313
  validationResult.reason &&
297
314
  SLASHABLE_BLOCK_PROPOSAL_VALIDATION_RESULT.includes(validationResult.reason) &&
@@ -311,7 +328,7 @@ export class ValidatorClient extends (EventEmitter as new () => WatcherEmitter)
311
328
 
312
329
  // Provided all of the above checks pass, we can attest to the proposal
313
330
  this.log.info(`Attesting to proposal for block at slot ${slotNumber}`, proposalInfo);
314
- this.metrics.incAttestations(inCommittee.length);
331
+ this.metrics.incSuccessfulAttestations(inCommittee.length);
315
332
 
316
333
  // If the above function does not throw an error, then we can attest to the proposal
317
334
  return this.createBlockAttestationsFromProposal(proposal, inCommittee);