@aztec/validator-client 3.0.0-nightly.20251012 → 3.0.0-nightly.20251014

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;IAO/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;IAO/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, {
@@ -48,13 +53,17 @@ export class ValidatorMetrics {
48
53
  [Attributes.BLOCK_PROPOSER]: proposal.getSender().toString()
49
54
  });
50
55
  }
51
- incAttestations(num) {
52
- this.attestationsCount.add(num);
56
+ incSuccessfulAttestations(num) {
57
+ this.successfulAttestationsCount.add(num);
58
+ }
59
+ incFailedAttestationsBadProposal(num, reason) {
60
+ this.failedAttestationsBadProposalCount.add(num, {
61
+ [Attributes.ERROR_TYPE]: reason
62
+ });
53
63
  }
54
- incFailedAttestations(num, reason, inCommittee) {
55
- this.failedAttestationsCount.add(num, {
56
- [Attributes.ERROR_TYPE]: reason,
57
- [Attributes.VALIDATOR_STATUS]: inCommittee ? 'in-committee' : 'none'
64
+ incFailedAttestationsNodeIssue(num, reason) {
65
+ this.failedAttestationsNodeIssueCount.add(num, {
66
+ [Attributes.ERROR_TYPE]: reason
58
67
  });
59
68
  }
60
69
  }
@@ -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
@@ -163,7 +163,6 @@ const SLASHABLE_BLOCK_PROPOSAL_VALIDATION_RESULT = [
163
163
  // Check that I have any address in current committee before attesting
164
164
  const inCommittee = await this.epochCache.filterInCommittee(slotNumber, this.getValidatorAddresses());
165
165
  const partOfCommittee = inCommittee.length > 0;
166
- const incFailedAttestation = (reason)=>this.metrics.incFailedAttestations(1, reason, partOfCommittee);
167
166
  const proposalInfo = {
168
167
  ...proposal.toBlockInfo(),
169
168
  proposer: proposer.toString()
@@ -179,8 +178,25 @@ const SLASHABLE_BLOCK_PROPOSAL_VALIDATION_RESULT = [
179
178
  const validationResult = await this.blockProposalHandler.handleBlockProposal(proposal, proposalSender, !!shouldReexecute);
180
179
  if (!validationResult.isValid) {
181
180
  this.log.warn(`Proposal validation failed: ${validationResult.reason}`, proposalInfo);
182
- incFailedAttestation(validationResult.reason || 'unknown');
183
- // Slash invalid block proposals
181
+ // Only track attestation failure metrics if we're actually in the committee
182
+ if (partOfCommittee) {
183
+ const reason = validationResult.reason || 'unknown';
184
+ // Classify failure reason: bad proposal vs node issue
185
+ const badProposalReasons = [
186
+ 'invalid_proposal',
187
+ 'state_mismatch',
188
+ 'failed_txs',
189
+ 'in_hash_mismatch',
190
+ 'parent_block_does_not_match'
191
+ ];
192
+ if (badProposalReasons.includes(reason)) {
193
+ this.metrics.incFailedAttestationsBadProposal(1, reason);
194
+ } else {
195
+ // Node issues: parent_block_not_found, block_number_already_exists, txs_not_available, timeout, unknown_error
196
+ this.metrics.incFailedAttestationsNodeIssue(1, reason);
197
+ }
198
+ }
199
+ // Slash invalid block proposals (can happen even when not in committee)
184
200
  if (validationResult.reason && SLASHABLE_BLOCK_PROPOSAL_VALIDATION_RESULT.includes(validationResult.reason) && slashBroadcastedInvalidBlockPenalty > 0n) {
185
201
  this.log.warn(`Slashing proposer for invalid block proposal`, proposalInfo);
186
202
  this.slashInvalidBlock(proposal);
@@ -194,7 +210,7 @@ const SLASHABLE_BLOCK_PROPOSAL_VALIDATION_RESULT = [
194
210
  }
195
211
  // Provided all of the above checks pass, we can attest to the proposal
196
212
  this.log.info(`Attesting to proposal for block ${proposal.blockNumber} at slot ${slotNumber}`, proposalInfo);
197
- this.metrics.incAttestations(inCommittee.length);
213
+ this.metrics.incSuccessfulAttestations(inCommittee.length);
198
214
  // If the above function does not throw an error, then we can attest to the proposal
199
215
  return this.createBlockAttestationsFromProposal(proposal, inCommittee);
200
216
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aztec/validator-client",
3
- "version": "3.0.0-nightly.20251012",
3
+ "version": "3.0.0-nightly.20251014",
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": "3.0.0-nightly.20251012",
68
- "@aztec/epoch-cache": "3.0.0-nightly.20251012",
69
- "@aztec/ethereum": "3.0.0-nightly.20251012",
70
- "@aztec/foundation": "3.0.0-nightly.20251012",
71
- "@aztec/node-keystore": "3.0.0-nightly.20251012",
72
- "@aztec/p2p": "3.0.0-nightly.20251012",
73
- "@aztec/prover-client": "3.0.0-nightly.20251012",
74
- "@aztec/slasher": "3.0.0-nightly.20251012",
75
- "@aztec/stdlib": "3.0.0-nightly.20251012",
76
- "@aztec/telemetry-client": "3.0.0-nightly.20251012",
67
+ "@aztec/constants": "3.0.0-nightly.20251014",
68
+ "@aztec/epoch-cache": "3.0.0-nightly.20251014",
69
+ "@aztec/ethereum": "3.0.0-nightly.20251014",
70
+ "@aztec/foundation": "3.0.0-nightly.20251014",
71
+ "@aztec/node-keystore": "3.0.0-nightly.20251014",
72
+ "@aztec/p2p": "3.0.0-nightly.20251014",
73
+ "@aztec/prover-client": "3.0.0-nightly.20251014",
74
+ "@aztec/slasher": "3.0.0-nightly.20251014",
75
+ "@aztec/stdlib": "3.0.0-nightly.20251014",
76
+ "@aztec/telemetry-client": "3.0.0-nightly.20251014",
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',
@@ -68,14 +80,19 @@ export class ValidatorMetrics {
68
80
  });
69
81
  }
70
82
 
71
- public incAttestations(num: number) {
72
- this.attestationsCount.add(num);
83
+ public incSuccessfulAttestations(num: number) {
84
+ this.successfulAttestationsCount.add(num);
85
+ }
86
+
87
+ public incFailedAttestationsBadProposal(num: number, reason: string) {
88
+ this.failedAttestationsBadProposalCount.add(num, {
89
+ [Attributes.ERROR_TYPE]: reason,
90
+ });
73
91
  }
74
92
 
75
- public incFailedAttestations(num: number, reason: string, inCommittee: boolean) {
76
- this.failedAttestationsCount.add(num, {
93
+ public incFailedAttestationsNodeIssue(num: number, reason: string) {
94
+ this.failedAttestationsNodeIssueCount.add(num, {
77
95
  [Attributes.ERROR_TYPE]: reason,
78
- [Attributes.VALIDATOR_STATUS]: inCommittee ? 'in-committee' : 'none',
79
96
  });
80
97
  }
81
98
  }
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 block ${proposal.blockNumber} at slot ${slotNumber}`, {
@@ -289,9 +288,28 @@ 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_does_not_match',
302
+ ];
303
+
304
+ if (badProposalReasons.includes(reason as BlockProposalValidationFailureReason)) {
305
+ this.metrics.incFailedAttestationsBadProposal(1, reason);
306
+ } else {
307
+ // Node issues: parent_block_not_found, block_number_already_exists, txs_not_available, timeout, unknown_error
308
+ this.metrics.incFailedAttestationsNodeIssue(1, reason);
309
+ }
310
+ }
311
+
312
+ // Slash invalid block proposals (can happen even when not in committee)
295
313
  if (
296
314
  validationResult.reason &&
297
315
  SLASHABLE_BLOCK_PROPOSAL_VALIDATION_RESULT.includes(validationResult.reason) &&
@@ -311,7 +329,7 @@ export class ValidatorClient extends (EventEmitter as new () => WatcherEmitter)
311
329
 
312
330
  // Provided all of the above checks pass, we can attest to the proposal
313
331
  this.log.info(`Attesting to proposal for block ${proposal.blockNumber} at slot ${slotNumber}`, proposalInfo);
314
- this.metrics.incAttestations(inCommittee.length);
332
+ this.metrics.incSuccessfulAttestations(inCommittee.length);
315
333
 
316
334
  // If the above function does not throw an error, then we can attest to the proposal
317
335
  return this.createBlockAttestationsFromProposal(proposal, inCommittee);