@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 +6 -4
- package/dest/metrics.d.ts.map +1 -1
- package/dest/metrics.js +21 -12
- package/dest/validator.d.ts.map +1 -1
- package/dest/validator.js +19 -4
- package/package.json +11 -11
- package/src/metrics.ts +30 -13
- package/src/validator.ts +21 -4
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
|
|
6
|
-
private
|
|
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
|
-
|
|
14
|
-
|
|
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
|
package/dest/metrics.d.ts.map
CHANGED
|
@@ -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,
|
|
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
|
-
|
|
5
|
-
|
|
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.
|
|
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.
|
|
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
|
-
|
|
53
|
-
this.
|
|
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
|
-
|
|
56
|
-
this.
|
|
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
|
}
|
package/dest/validator.d.ts.map
CHANGED
|
@@ -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
|
-
|
|
187
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
68
|
-
"@aztec/epoch-cache": "2.1.0-rc.
|
|
69
|
-
"@aztec/ethereum": "2.1.0-rc.
|
|
70
|
-
"@aztec/foundation": "2.1.0-rc.
|
|
71
|
-
"@aztec/node-keystore": "2.1.0-rc.
|
|
72
|
-
"@aztec/p2p": "2.1.0-rc.
|
|
73
|
-
"@aztec/prover-client": "2.1.0-rc.
|
|
74
|
-
"@aztec/slasher": "2.1.0-rc.
|
|
75
|
-
"@aztec/stdlib": "2.1.0-rc.
|
|
76
|
-
"@aztec/telemetry-client": "2.1.0-rc.
|
|
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
|
|
14
|
-
private
|
|
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.
|
|
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.
|
|
35
|
-
|
|
36
|
-
|
|
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
|
|
73
|
-
this.
|
|
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
|
|
77
|
-
this.
|
|
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
|
-
//
|
|
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.
|
|
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);
|