@aztec/validator-client 3.0.0-nightly.20251111 → 3.0.0-nightly.20251113
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/block_proposal_handler.d.ts.map +1 -1
- package/dest/block_proposal_handler.js +3 -0
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +5 -0
- package/dest/validator.d.ts +1 -1
- package/dest/validator.d.ts.map +1 -1
- package/dest/validator.js +41 -10
- package/package.json +11 -11
- package/src/block_proposal_handler.ts +3 -0
- package/src/config.ts +6 -0
- package/src/validator.ts +46 -7
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"block_proposal_handler.d.ts","sourceRoot":"","sources":["../src/block_proposal_handler.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAC;AAG9C,OAAO,EAAE,YAAY,EAAS,MAAM,yBAAyB,CAAC;AAC9D,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AAEnE,OAAO,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAElE,OAAO,KAAK,EAAE,qBAAqB,EAAE,yBAAyB,EAAE,MAAM,iCAAiC,CAAC;AACxG,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,KAAK,aAAa,EAAoB,MAAM,mBAAmB,CAAC;AACzE,OAAO,EAAe,KAAK,QAAQ,EAAmB,KAAK,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAOxF,OAAO,EAAE,KAAK,eAAe,EAAE,KAAK,MAAM,EAAsB,MAAM,yBAAyB,CAAC;AAEhG,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAErD,MAAM,MAAM,oCAAoC,GAC5C,kBAAkB,GAClB,wBAAwB,GACxB,yBAAyB,GACzB,kBAAkB,GAClB,6BAA6B,GAC7B,mBAAmB,GACnB,gBAAgB,GAChB,YAAY,GACZ,SAAS,GACT,eAAe,CAAC;AAEpB,KAAK,2BAA2B,GAAG;IACjC,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,oCAAoC,GAAG;IACjD,OAAO,EAAE,IAAI,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,2BAA2B,CAAC;CACjD,CAAC;AAEF,MAAM,MAAM,oCAAoC,GAAG;IACjD,OAAO,EAAE,KAAK,CAAC;IACf,MAAM,EAAE,oCAAoC,CAAC;IAC7C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iBAAiB,CAAC,EAAE,2BAA2B,CAAC;CACjD,CAAC;AAEF,MAAM,MAAM,6BAA6B,GAAG,oCAAoC,GAAG,oCAAoC,CAAC;AAExH,qBAAa,oBAAoB;IAI7B,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,WAAW;IACnB,OAAO,CAAC,mBAAmB;IAC3B,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,sBAAsB;IAC9B,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,OAAO,CAAC;IAChB,OAAO,CAAC,YAAY;IAEpB,OAAO,CAAC,GAAG;IAZb,SAAgB,MAAM,EAAE,MAAM,CAAC;gBAGrB,YAAY,EAAE,qBAAqB,EACnC,WAAW,EAAE,aAAa,EAC1B,mBAAmB,EAAE,mBAAmB,EACxC,UAAU,EAAE,UAAU,EACtB,sBAAsB,EAAE,sBAAsB,EAC9C,MAAM,EAAE,yBAAyB,EACjC,OAAO,CAAC,EAAE,gBAAgB,YAAA,EAC1B,YAAY,GAAE,YAAiC,EACvD,SAAS,GAAE,eAAsC,EACzC,GAAG,yCAAmD;
|
|
1
|
+
{"version":3,"file":"block_proposal_handler.d.ts","sourceRoot":"","sources":["../src/block_proposal_handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -31,6 +31,9 @@ export class BlockProposalHandler {
|
|
|
31
31
|
this.metrics = metrics;
|
|
32
32
|
this.dateProvider = dateProvider;
|
|
33
33
|
this.log = log;
|
|
34
|
+
if (config.fishermanMode) {
|
|
35
|
+
this.log = this.log.createChild('[FISHERMAN]');
|
|
36
|
+
}
|
|
34
37
|
this.tracer = telemetry.getTracer('BlockProposalHandler');
|
|
35
38
|
}
|
|
36
39
|
registerForReexecution(p2pClient) {
|
package/dest/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,kBAAkB,EAKxB,MAAM,0BAA0B,CAAC;AAElC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AAE7E,YAAY,EAAE,qBAAqB,EAAE,CAAC;AAEtC,eAAO,MAAM,6BAA6B,EAAE,kBAAkB,CAAC,qBAAqB,
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,kBAAkB,EAKxB,MAAM,0BAA0B,CAAC;AAElC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AAE7E,YAAY,EAAE,qBAAqB,EAAE,CAAC;AAEtC,eAAO,MAAM,6BAA6B,EAAE,kBAAkB,CAAC,qBAAqB,CA4DnF,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,gBAAgB,IAAI,qBAAqB,CAExD"}
|
package/dest/config.js
CHANGED
|
@@ -44,6 +44,11 @@ export const validatorClientConfigMappings = {
|
|
|
44
44
|
env: 'ALWAYS_REEXECUTE_BLOCK_PROPOSALS',
|
|
45
45
|
description: 'Whether to always reexecute block proposals, even for non-validator nodes (useful for monitoring network status).',
|
|
46
46
|
...booleanConfigHelper(false)
|
|
47
|
+
},
|
|
48
|
+
fishermanMode: {
|
|
49
|
+
env: 'FISHERMAN_MODE',
|
|
50
|
+
description: 'Whether to run in fisherman mode: validates all proposals and attestations but does not broadcast attestations or participate in consensus.',
|
|
51
|
+
...booleanConfigHelper(false)
|
|
47
52
|
}
|
|
48
53
|
};
|
|
49
54
|
/**
|
package/dest/validator.d.ts
CHANGED
|
@@ -29,10 +29,10 @@ export declare class ValidatorClient extends ValidatorClient_base implements Val
|
|
|
29
29
|
private blockProposalHandler;
|
|
30
30
|
private config;
|
|
31
31
|
private dateProvider;
|
|
32
|
-
private log;
|
|
33
32
|
readonly tracer: Tracer;
|
|
34
33
|
private validationService;
|
|
35
34
|
private metrics;
|
|
35
|
+
private log;
|
|
36
36
|
private hasRegisteredHandlers;
|
|
37
37
|
private previousProposal?;
|
|
38
38
|
private lastEpochForCommitteeUpdateLoop;
|
package/dest/validator.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../src/validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAC;AACjE,OAAO,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAC;AAC9C,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,uBAAuB,CAAC;AAGlE,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE1D,OAAO,EAAoC,KAAK,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACrG,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,EAAE,+BAA+B,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAC1F,OAAO,KAAK,EAAE,qBAAqB,EAAE,SAAS,EAAE,yBAAyB,EAAE,MAAM,iCAAiC,CAAC;AACnH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAC/F,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAE3D,OAAO,EAAE,KAAK,eAAe,EAAE,KAAK,MAAM,EAAsB,MAAM,yBAAyB,CAAC;AAGhG,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,MAAM,CAAC;AAEhD,OAAO,EAAE,oBAAoB,EAA6C,MAAM,6BAA6B,CAAC;AAE9G,OAAO,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;oCAgBrB,UAAU,cAAc;AAH9E;;GAEG;AACH,qBAAa,eAAgB,SAAQ,oBAA2C,YAAW,SAAS,EAAE,OAAO;
|
|
1
|
+
{"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../src/validator.ts"],"names":[],"mappings":"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"}
|
package/dest/validator.js
CHANGED
|
@@ -28,10 +28,10 @@ const SLASHABLE_BLOCK_PROPOSAL_VALIDATION_RESULT = [
|
|
|
28
28
|
blockProposalHandler;
|
|
29
29
|
config;
|
|
30
30
|
dateProvider;
|
|
31
|
-
log;
|
|
32
31
|
tracer;
|
|
33
32
|
validationService;
|
|
34
33
|
metrics;
|
|
34
|
+
log;
|
|
35
35
|
// Whether it has already registered handlers on the p2p client
|
|
36
36
|
hasRegisteredHandlers;
|
|
37
37
|
// Used to check if we are sending the same proposal twice
|
|
@@ -40,12 +40,14 @@ const SLASHABLE_BLOCK_PROPOSAL_VALIDATION_RESULT = [
|
|
|
40
40
|
epochCacheUpdateLoop;
|
|
41
41
|
proposersOfInvalidBlocks;
|
|
42
42
|
constructor(keyStore, epochCache, p2pClient, blockProposalHandler, config, dateProvider = new DateProvider(), telemetry = getTelemetryClient(), log = createLogger('validator')){
|
|
43
|
-
super(), this.keyStore = keyStore, this.epochCache = epochCache, this.p2pClient = p2pClient, this.blockProposalHandler = blockProposalHandler, this.config = config, this.dateProvider = dateProvider, this.
|
|
43
|
+
super(), this.keyStore = keyStore, this.epochCache = epochCache, this.p2pClient = p2pClient, this.blockProposalHandler = blockProposalHandler, this.config = config, this.dateProvider = dateProvider, this.hasRegisteredHandlers = false, this.proposersOfInvalidBlocks = new Set();
|
|
44
|
+
// Create child logger with fisherman prefix if in fisherman mode
|
|
45
|
+
this.log = config.fishermanMode ? log.createChild('[FISHERMAN]') : log;
|
|
44
46
|
this.tracer = telemetry.getTracer('Validator');
|
|
45
47
|
this.metrics = new ValidatorMetrics(telemetry);
|
|
46
|
-
this.validationService = new ValidationService(keyStore, log.createChild('validation-service'));
|
|
48
|
+
this.validationService = new ValidationService(keyStore, this.log.createChild('validation-service'));
|
|
47
49
|
// Refresh epoch cache every second to trigger alert if participation in committee changes
|
|
48
|
-
this.epochCacheUpdateLoop = new RunningPromise(this.handleEpochCommitteeUpdate.bind(this), log, 1000);
|
|
50
|
+
this.epochCacheUpdateLoop = new RunningPromise(this.handleEpochCommitteeUpdate.bind(this), this.log, 1000);
|
|
49
51
|
const myAddresses = this.getValidatorAddresses();
|
|
50
52
|
this.log.verbose(`Initialized validator with addresses: ${myAddresses.map((a)=>a.toString()).join(', ')}`);
|
|
51
53
|
}
|
|
@@ -176,12 +178,14 @@ const SLASHABLE_BLOCK_PROPOSAL_VALIDATION_RESULT = [
|
|
|
176
178
|
};
|
|
177
179
|
this.log.info(`Received proposal for slot ${slotNumber}`, {
|
|
178
180
|
...proposalInfo,
|
|
179
|
-
txHashes: proposal.txHashes.map((t)=>t.toString())
|
|
181
|
+
txHashes: proposal.txHashes.map((t)=>t.toString()),
|
|
182
|
+
fishermanMode: this.config.fishermanMode || false
|
|
180
183
|
});
|
|
181
184
|
// Reexecute txs if we are part of the committee so we can attest, or if slashing is enabled so we can slash
|
|
182
185
|
// invalid proposals even when not in the committee, or if we are configured to always reexecute for monitoring purposes.
|
|
183
|
-
|
|
184
|
-
const
|
|
186
|
+
// In fisherman mode, we always reexecute to validate proposals.
|
|
187
|
+
const { validatorReexecute, slashBroadcastedInvalidBlockPenalty, alwaysReexecuteBlockProposals, fishermanMode } = this.config;
|
|
188
|
+
const shouldReexecute = fishermanMode || slashBroadcastedInvalidBlockPenalty > 0n && validatorReexecute || partOfCommittee && validatorReexecute || alwaysReexecuteBlockProposals;
|
|
185
189
|
const validationResult = await this.blockProposalHandler.handleBlockProposal(proposal, proposalSender, !!shouldReexecute);
|
|
186
190
|
if (!validationResult.isValid) {
|
|
187
191
|
this.log.warn(`Proposal validation failed: ${validationResult.reason}`, proposalInfo);
|
|
@@ -208,15 +212,42 @@ const SLASHABLE_BLOCK_PROPOSAL_VALIDATION_RESULT = [
|
|
|
208
212
|
return undefined;
|
|
209
213
|
}
|
|
210
214
|
// Check that I have any address in current committee before attesting
|
|
211
|
-
if
|
|
215
|
+
// In fisherman mode, we still create attestations for validation even if not in committee
|
|
216
|
+
if (!partOfCommittee && !this.config.fishermanMode) {
|
|
212
217
|
this.log.verbose(`No validator in the current committee, skipping attestation`, proposalInfo);
|
|
213
218
|
return undefined;
|
|
214
219
|
}
|
|
215
220
|
// Provided all of the above checks pass, we can attest to the proposal
|
|
216
|
-
this.log.info(
|
|
221
|
+
this.log.info(`${partOfCommittee ? 'Attesting to' : 'Validated'} proposal for slot ${slotNumber}`, {
|
|
222
|
+
...proposalInfo,
|
|
223
|
+
inCommittee: partOfCommittee,
|
|
224
|
+
fishermanMode: this.config.fishermanMode || false
|
|
225
|
+
});
|
|
217
226
|
this.metrics.incSuccessfulAttestations(inCommittee.length);
|
|
218
227
|
// If the above function does not throw an error, then we can attest to the proposal
|
|
219
|
-
|
|
228
|
+
// Determine which validators should attest
|
|
229
|
+
let attestors;
|
|
230
|
+
if (partOfCommittee) {
|
|
231
|
+
attestors = inCommittee;
|
|
232
|
+
} else if (this.config.fishermanMode) {
|
|
233
|
+
// In fisherman mode, create attestations for validation purposes even if not in committee. These won't be broadcast.
|
|
234
|
+
attestors = this.getValidatorAddresses();
|
|
235
|
+
} else {
|
|
236
|
+
attestors = [];
|
|
237
|
+
}
|
|
238
|
+
// Only create attestations if we have attestors
|
|
239
|
+
if (attestors.length === 0) {
|
|
240
|
+
return undefined;
|
|
241
|
+
}
|
|
242
|
+
if (this.config.fishermanMode) {
|
|
243
|
+
// bail out early and don't save attestations to the pool in fisherman mode
|
|
244
|
+
this.log.info(`Creating attestations for proposal for slot ${slotNumber}`, {
|
|
245
|
+
...proposalInfo,
|
|
246
|
+
attestors: attestors.map((a)=>a.toString())
|
|
247
|
+
});
|
|
248
|
+
return undefined;
|
|
249
|
+
}
|
|
250
|
+
return this.createBlockAttestationsFromProposal(proposal, attestors);
|
|
220
251
|
}
|
|
221
252
|
slashInvalidBlock(proposal) {
|
|
222
253
|
const proposer = proposal.getSender();
|
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.20251113",
|
|
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.20251113",
|
|
68
|
+
"@aztec/epoch-cache": "3.0.0-nightly.20251113",
|
|
69
|
+
"@aztec/ethereum": "3.0.0-nightly.20251113",
|
|
70
|
+
"@aztec/foundation": "3.0.0-nightly.20251113",
|
|
71
|
+
"@aztec/node-keystore": "3.0.0-nightly.20251113",
|
|
72
|
+
"@aztec/p2p": "3.0.0-nightly.20251113",
|
|
73
|
+
"@aztec/prover-client": "3.0.0-nightly.20251113",
|
|
74
|
+
"@aztec/slasher": "3.0.0-nightly.20251113",
|
|
75
|
+
"@aztec/stdlib": "3.0.0-nightly.20251113",
|
|
76
|
+
"@aztec/telemetry-client": "3.0.0-nightly.20251113",
|
|
77
77
|
"koa": "^2.16.1",
|
|
78
78
|
"koa-router": "^13.1.1",
|
|
79
79
|
"tslib": "^2.4.0",
|
|
@@ -73,6 +73,9 @@ export class BlockProposalHandler {
|
|
|
73
73
|
telemetry: TelemetryClient = getTelemetryClient(),
|
|
74
74
|
private log = createLogger('validator:block-proposal-handler'),
|
|
75
75
|
) {
|
|
76
|
+
if (config.fishermanMode) {
|
|
77
|
+
this.log = this.log.createChild('[FISHERMAN]');
|
|
78
|
+
}
|
|
76
79
|
this.tracer = telemetry.getTracer('BlockProposalHandler');
|
|
77
80
|
}
|
|
78
81
|
|
package/src/config.ts
CHANGED
|
@@ -64,6 +64,12 @@ export const validatorClientConfigMappings: ConfigMappingsType<ValidatorClientCo
|
|
|
64
64
|
'Whether to always reexecute block proposals, even for non-validator nodes (useful for monitoring network status).',
|
|
65
65
|
...booleanConfigHelper(false),
|
|
66
66
|
},
|
|
67
|
+
fishermanMode: {
|
|
68
|
+
env: 'FISHERMAN_MODE',
|
|
69
|
+
description:
|
|
70
|
+
'Whether to run in fisherman mode: validates all proposals and attestations but does not broadcast attestations or participate in consensus.',
|
|
71
|
+
...booleanConfigHelper(false),
|
|
72
|
+
},
|
|
67
73
|
};
|
|
68
74
|
|
|
69
75
|
/**
|
package/src/validator.ts
CHANGED
|
@@ -45,6 +45,7 @@ export class ValidatorClient extends (EventEmitter as new () => WatcherEmitter)
|
|
|
45
45
|
public readonly tracer: Tracer;
|
|
46
46
|
private validationService: ValidationService;
|
|
47
47
|
private metrics: ValidatorMetrics;
|
|
48
|
+
private log: Logger;
|
|
48
49
|
|
|
49
50
|
// Whether it has already registered handlers on the p2p client
|
|
50
51
|
private hasRegisteredHandlers = false;
|
|
@@ -65,16 +66,20 @@ export class ValidatorClient extends (EventEmitter as new () => WatcherEmitter)
|
|
|
65
66
|
private config: ValidatorClientFullConfig,
|
|
66
67
|
private dateProvider: DateProvider = new DateProvider(),
|
|
67
68
|
telemetry: TelemetryClient = getTelemetryClient(),
|
|
68
|
-
|
|
69
|
+
log = createLogger('validator'),
|
|
69
70
|
) {
|
|
70
71
|
super();
|
|
72
|
+
|
|
73
|
+
// Create child logger with fisherman prefix if in fisherman mode
|
|
74
|
+
this.log = config.fishermanMode ? log.createChild('[FISHERMAN]') : log;
|
|
75
|
+
|
|
71
76
|
this.tracer = telemetry.getTracer('Validator');
|
|
72
77
|
this.metrics = new ValidatorMetrics(telemetry);
|
|
73
78
|
|
|
74
|
-
this.validationService = new ValidationService(keyStore, log.createChild('validation-service'));
|
|
79
|
+
this.validationService = new ValidationService(keyStore, this.log.createChild('validation-service'));
|
|
75
80
|
|
|
76
81
|
// Refresh epoch cache every second to trigger alert if participation in committee changes
|
|
77
|
-
this.epochCacheUpdateLoop = new RunningPromise(this.handleEpochCommitteeUpdate.bind(this), log, 1000);
|
|
82
|
+
this.epochCacheUpdateLoop = new RunningPromise(this.handleEpochCommitteeUpdate.bind(this), this.log, 1000);
|
|
78
83
|
|
|
79
84
|
const myAddresses = this.getValidatorAddresses();
|
|
80
85
|
this.log.verbose(`Initialized validator with addresses: ${myAddresses.map(a => a.toString()).join(', ')}`);
|
|
@@ -276,12 +281,16 @@ export class ValidatorClient extends (EventEmitter as new () => WatcherEmitter)
|
|
|
276
281
|
this.log.info(`Received proposal for slot ${slotNumber}`, {
|
|
277
282
|
...proposalInfo,
|
|
278
283
|
txHashes: proposal.txHashes.map(t => t.toString()),
|
|
284
|
+
fishermanMode: this.config.fishermanMode || false,
|
|
279
285
|
});
|
|
280
286
|
|
|
281
287
|
// Reexecute txs if we are part of the committee so we can attest, or if slashing is enabled so we can slash
|
|
282
288
|
// invalid proposals even when not in the committee, or if we are configured to always reexecute for monitoring purposes.
|
|
283
|
-
|
|
289
|
+
// In fisherman mode, we always reexecute to validate proposals.
|
|
290
|
+
const { validatorReexecute, slashBroadcastedInvalidBlockPenalty, alwaysReexecuteBlockProposals, fishermanMode } =
|
|
291
|
+
this.config;
|
|
284
292
|
const shouldReexecute =
|
|
293
|
+
fishermanMode ||
|
|
285
294
|
(slashBroadcastedInvalidBlockPenalty > 0n && validatorReexecute) ||
|
|
286
295
|
(partOfCommittee && validatorReexecute) ||
|
|
287
296
|
alwaysReexecuteBlockProposals;
|
|
@@ -325,17 +334,47 @@ export class ValidatorClient extends (EventEmitter as new () => WatcherEmitter)
|
|
|
325
334
|
}
|
|
326
335
|
|
|
327
336
|
// Check that I have any address in current committee before attesting
|
|
328
|
-
if
|
|
337
|
+
// In fisherman mode, we still create attestations for validation even if not in committee
|
|
338
|
+
if (!partOfCommittee && !this.config.fishermanMode) {
|
|
329
339
|
this.log.verbose(`No validator in the current committee, skipping attestation`, proposalInfo);
|
|
330
340
|
return undefined;
|
|
331
341
|
}
|
|
332
342
|
|
|
333
343
|
// Provided all of the above checks pass, we can attest to the proposal
|
|
334
|
-
this.log.info(
|
|
344
|
+
this.log.info(`${partOfCommittee ? 'Attesting to' : 'Validated'} proposal for slot ${slotNumber}`, {
|
|
345
|
+
...proposalInfo,
|
|
346
|
+
inCommittee: partOfCommittee,
|
|
347
|
+
fishermanMode: this.config.fishermanMode || false,
|
|
348
|
+
});
|
|
349
|
+
|
|
335
350
|
this.metrics.incSuccessfulAttestations(inCommittee.length);
|
|
336
351
|
|
|
337
352
|
// If the above function does not throw an error, then we can attest to the proposal
|
|
338
|
-
|
|
353
|
+
// Determine which validators should attest
|
|
354
|
+
let attestors: EthAddress[];
|
|
355
|
+
if (partOfCommittee) {
|
|
356
|
+
attestors = inCommittee;
|
|
357
|
+
} else if (this.config.fishermanMode) {
|
|
358
|
+
// In fisherman mode, create attestations for validation purposes even if not in committee. These won't be broadcast.
|
|
359
|
+
attestors = this.getValidatorAddresses();
|
|
360
|
+
} else {
|
|
361
|
+
attestors = [];
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
// Only create attestations if we have attestors
|
|
365
|
+
if (attestors.length === 0) {
|
|
366
|
+
return undefined;
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
if (this.config.fishermanMode) {
|
|
370
|
+
// bail out early and don't save attestations to the pool in fisherman mode
|
|
371
|
+
this.log.info(`Creating attestations for proposal for slot ${slotNumber}`, {
|
|
372
|
+
...proposalInfo,
|
|
373
|
+
attestors: attestors.map(a => a.toString()),
|
|
374
|
+
});
|
|
375
|
+
return undefined;
|
|
376
|
+
}
|
|
377
|
+
return this.createBlockAttestationsFromProposal(proposal, attestors);
|
|
339
378
|
}
|
|
340
379
|
|
|
341
380
|
private slashInvalidBlock(proposal: BlockProposal) {
|