@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 +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 +20 -4
- package/package.json +11 -11
- package/src/metrics.ts +30 -13
- package/src/validator.ts +22 -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;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
|
-
|
|
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, {
|
|
@@ -48,13 +53,17 @@ export class ValidatorMetrics {
|
|
|
48
53
|
[Attributes.BLOCK_PROPOSER]: proposal.getSender().toString()
|
|
49
54
|
});
|
|
50
55
|
}
|
|
51
|
-
|
|
52
|
-
this.
|
|
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
|
-
|
|
55
|
-
this.
|
|
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
|
}
|
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
|
@@ -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
|
-
|
|
183
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
68
|
-
"@aztec/epoch-cache": "3.0.0-nightly.
|
|
69
|
-
"@aztec/ethereum": "3.0.0-nightly.
|
|
70
|
-
"@aztec/foundation": "3.0.0-nightly.
|
|
71
|
-
"@aztec/node-keystore": "3.0.0-nightly.
|
|
72
|
-
"@aztec/p2p": "3.0.0-nightly.
|
|
73
|
-
"@aztec/prover-client": "3.0.0-nightly.
|
|
74
|
-
"@aztec/slasher": "3.0.0-nightly.
|
|
75
|
-
"@aztec/stdlib": "3.0.0-nightly.
|
|
76
|
-
"@aztec/telemetry-client": "3.0.0-nightly.
|
|
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
|
|
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',
|
|
@@ -68,14 +80,19 @@ export class ValidatorMetrics {
|
|
|
68
80
|
});
|
|
69
81
|
}
|
|
70
82
|
|
|
71
|
-
public
|
|
72
|
-
this.
|
|
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
|
|
76
|
-
this.
|
|
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
|
-
//
|
|
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.
|
|
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);
|