@aztec/validator-client 2.1.7 → 2.1.8

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.
@@ -1 +1 @@
1
- {"version":3,"file":"block_proposal_handler.d.ts","sourceRoot":"","sources":["../src/block_proposal_handler.ts"],"names":[],"mappings":"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"}
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) {
@@ -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,CAsDnF,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,gBAAgB,IAAI,qBAAqB,CAExD"}
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
  /**
@@ -2,6 +2,7 @@ import type { EpochCache } from '@aztec/epoch-cache';
2
2
  import type { EthAddress } from '@aztec/foundation/eth-address';
3
3
  import type { Signature } from '@aztec/foundation/eth-signature';
4
4
  import { Fr } from '@aztec/foundation/fields';
5
+ import { type Logger } from '@aztec/foundation/log';
5
6
  import { DateProvider } from '@aztec/foundation/timer';
6
7
  import type { KeystoreManager } from '@aztec/node-keystore';
7
8
  import type { P2P, PeerId, TxProvider } from '@aztec/p2p';
@@ -27,16 +28,16 @@ export declare class ValidatorClient extends ValidatorClient_base implements Val
27
28
  private blockProposalHandler;
28
29
  private config;
29
30
  private dateProvider;
30
- private log;
31
31
  readonly tracer: Tracer;
32
32
  private validationService;
33
33
  private metrics;
34
+ private log;
34
35
  private hasRegisteredHandlers;
35
36
  private previousProposal?;
36
37
  private lastEpochForCommitteeUpdateLoop;
37
38
  private epochCacheUpdateLoop;
38
39
  private proposersOfInvalidBlocks;
39
- protected constructor(keyStore: NodeKeystoreAdapter, epochCache: EpochCache, p2pClient: P2P, blockProposalHandler: BlockProposalHandler, config: ValidatorClientFullConfig, dateProvider?: DateProvider, telemetry?: TelemetryClient, log?: import("@aztec/foundation/log").Logger);
40
+ protected constructor(keyStore: NodeKeystoreAdapter, epochCache: EpochCache, p2pClient: P2P, blockProposalHandler: BlockProposalHandler, config: ValidatorClientFullConfig, dateProvider?: DateProvider, telemetry?: TelemetryClient, log?: Logger);
40
41
  static validateKeyStoreConfiguration(keyStoreManager: KeystoreManager): void;
41
42
  private handleEpochCommitteeUpdate;
42
43
  static new(config: ValidatorClientFullConfig, blockBuilder: IFullNodeBlockBuilder, epochCache: EpochCache, p2pClient: P2P, blockSource: L2BlockSource, l1ToL2MessageSource: L1ToL2MessageSource, txProvider: TxProvider, keyStoreManager: KeystoreManager, dateProvider?: DateProvider, telemetry?: TelemetryClient): ValidatorClient;
@@ -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
@@ -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.log = log, this.hasRegisteredHandlers = false, this.proposersOfInvalidBlocks = new Set();
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
48
  this.validationService = new ValidationService(keyStore);
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
  }
@@ -173,12 +175,14 @@ const SLASHABLE_BLOCK_PROPOSAL_VALIDATION_RESULT = [
173
175
  };
174
176
  this.log.info(`Received proposal for slot ${slotNumber}`, {
175
177
  ...proposalInfo,
176
- txHashes: proposal.txHashes.map((t)=>t.toString())
178
+ txHashes: proposal.txHashes.map((t)=>t.toString()),
179
+ fishermanMode: this.config.fishermanMode || false
177
180
  });
178
181
  // Reexecute txs if we are part of the committee so we can attest, or if slashing is enabled so we can slash
179
182
  // invalid proposals even when not in the committee, or if we are configured to always reexecute for monitoring purposes.
180
- const { validatorReexecute, slashBroadcastedInvalidBlockPenalty, alwaysReexecuteBlockProposals } = this.config;
181
- const shouldReexecute = slashBroadcastedInvalidBlockPenalty > 0n && validatorReexecute || partOfCommittee && validatorReexecute || alwaysReexecuteBlockProposals;
183
+ // In fisherman mode, we always reexecute to validate proposals.
184
+ const { validatorReexecute, slashBroadcastedInvalidBlockPenalty, alwaysReexecuteBlockProposals, fishermanMode } = this.config;
185
+ const shouldReexecute = fishermanMode || slashBroadcastedInvalidBlockPenalty > 0n && validatorReexecute || partOfCommittee && validatorReexecute || alwaysReexecuteBlockProposals;
182
186
  const validationResult = await this.blockProposalHandler.handleBlockProposal(proposal, proposalSender, !!shouldReexecute);
183
187
  if (!validationResult.isValid) {
184
188
  this.log.warn(`Proposal validation failed: ${validationResult.reason}`, proposalInfo);
@@ -205,15 +209,42 @@ const SLASHABLE_BLOCK_PROPOSAL_VALIDATION_RESULT = [
205
209
  return undefined;
206
210
  }
207
211
  // Check that I have any address in current committee before attesting
208
- if (!partOfCommittee) {
212
+ // In fisherman mode, we still create attestations for validation even if not in committee
213
+ if (!partOfCommittee && !this.config.fishermanMode) {
209
214
  this.log.verbose(`No validator in the current committee, skipping attestation`, proposalInfo);
210
215
  return undefined;
211
216
  }
212
217
  // Provided all of the above checks pass, we can attest to the proposal
213
- this.log.info(`Attesting to proposal for block at slot ${slotNumber}`, proposalInfo);
218
+ this.log.info(`${partOfCommittee ? 'Attesting to' : 'Validated'} proposal for slot ${slotNumber}`, {
219
+ ...proposalInfo,
220
+ inCommittee: partOfCommittee,
221
+ fishermanMode: this.config.fishermanMode || false
222
+ });
214
223
  this.metrics.incSuccessfulAttestations(inCommittee.length);
215
224
  // If the above function does not throw an error, then we can attest to the proposal
216
- return this.createBlockAttestationsFromProposal(proposal, inCommittee);
225
+ // Determine which validators should attest
226
+ let attestors;
227
+ if (partOfCommittee) {
228
+ attestors = inCommittee;
229
+ } else if (this.config.fishermanMode) {
230
+ // In fisherman mode, create attestations for validation purposes even if not in committee. These won't be broadcast.
231
+ attestors = this.getValidatorAddresses();
232
+ } else {
233
+ attestors = [];
234
+ }
235
+ // Only create attestations if we have attestors
236
+ if (attestors.length === 0) {
237
+ return undefined;
238
+ }
239
+ if (this.config.fishermanMode) {
240
+ // bail out early and don't save attestations to the pool in fisherman mode
241
+ this.log.info(`Creating attestations for proposal for slot ${slotNumber}`, {
242
+ ...proposalInfo,
243
+ attestors: attestors.map((a)=>a.toString())
244
+ });
245
+ return undefined;
246
+ }
247
+ return this.createBlockAttestationsFromProposal(proposal, attestors);
217
248
  }
218
249
  slashInvalidBlock(proposal) {
219
250
  const proposer = proposal.getSender();
@@ -258,7 +289,14 @@ const SLASHABLE_BLOCK_PROPOSAL_VALIDATION_RESULT = [
258
289
  this.log.debug(`Collecting ${inCommittee.length} self-attestations for slot ${slot}`, {
259
290
  inCommittee
260
291
  });
261
- return this.createBlockAttestationsFromProposal(proposal, inCommittee);
292
+ const attestations = await this.createBlockAttestationsFromProposal(proposal, inCommittee);
293
+ // We broadcast our own attestations to our peers so, in case our block does not get mined on L1,
294
+ // other nodes can see that our validators did attest to this block proposal, and do not slash us
295
+ // due to inactivity for missed attestations.
296
+ void this.p2pClient.broadcastAttestations(attestations).catch((err)=>{
297
+ this.log.error(`Failed to broadcast self-attestations for slot ${slot}`, err);
298
+ });
299
+ return attestations;
262
300
  }
263
301
  async collectAttestations(proposal, required, deadline) {
264
302
  // Wait and poll the p2pClient's attestation pool for this block until we have enough attestations
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aztec/validator-client",
3
- "version": "2.1.7",
3
+ "version": "2.1.8",
4
4
  "main": "dest/index.js",
5
5
  "type": "module",
6
6
  "exports": {
@@ -64,20 +64,20 @@
64
64
  ]
65
65
  },
66
66
  "dependencies": {
67
- "@aztec/constants": "2.1.7",
68
- "@aztec/epoch-cache": "2.1.7",
69
- "@aztec/ethereum": "2.1.7",
70
- "@aztec/foundation": "2.1.7",
71
- "@aztec/node-keystore": "2.1.7",
72
- "@aztec/p2p": "2.1.7",
73
- "@aztec/prover-client": "2.1.7",
74
- "@aztec/slasher": "2.1.7",
75
- "@aztec/stdlib": "2.1.7",
76
- "@aztec/telemetry-client": "2.1.7",
67
+ "@aztec/constants": "2.1.8",
68
+ "@aztec/epoch-cache": "2.1.8",
69
+ "@aztec/ethereum": "2.1.8",
70
+ "@aztec/foundation": "2.1.8",
71
+ "@aztec/node-keystore": "2.1.8",
72
+ "@aztec/p2p": "2.1.8",
73
+ "@aztec/prover-client": "2.1.8",
74
+ "@aztec/slasher": "2.1.8",
75
+ "@aztec/stdlib": "2.1.8",
76
+ "@aztec/telemetry-client": "2.1.8",
77
77
  "koa": "^2.16.1",
78
78
  "koa-router": "^13.1.1",
79
79
  "tslib": "^2.4.0",
80
- "viem": "npm:@spalladino/viem@2.38.2-eip7594.2"
80
+ "viem": "npm:@aztec/viem@2.38.2"
81
81
  },
82
82
  "devDependencies": {
83
83
  "@jest/globals": "^30.0.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
@@ -2,7 +2,7 @@ import type { EpochCache } from '@aztec/epoch-cache';
2
2
  import type { EthAddress } from '@aztec/foundation/eth-address';
3
3
  import type { Signature } from '@aztec/foundation/eth-signature';
4
4
  import { Fr } from '@aztec/foundation/fields';
5
- import { createLogger } from '@aztec/foundation/log';
5
+ import { type Logger, createLogger } from '@aztec/foundation/log';
6
6
  import { RunningPromise } from '@aztec/foundation/running-promise';
7
7
  import { sleep } from '@aztec/foundation/sleep';
8
8
  import { DateProvider } from '@aztec/foundation/timer';
@@ -44,6 +44,7 @@ export class ValidatorClient extends (EventEmitter as new () => WatcherEmitter)
44
44
  public readonly tracer: Tracer;
45
45
  private validationService: ValidationService;
46
46
  private metrics: ValidatorMetrics;
47
+ private log: Logger;
47
48
 
48
49
  // Whether it has already registered handlers on the p2p client
49
50
  private hasRegisteredHandlers = false;
@@ -64,16 +65,20 @@ export class ValidatorClient extends (EventEmitter as new () => WatcherEmitter)
64
65
  private config: ValidatorClientFullConfig,
65
66
  private dateProvider: DateProvider = new DateProvider(),
66
67
  telemetry: TelemetryClient = getTelemetryClient(),
67
- private log = createLogger('validator'),
68
+ log = createLogger('validator'),
68
69
  ) {
69
70
  super();
71
+
72
+ // Create child logger with fisherman prefix if in fisherman mode
73
+ this.log = config.fishermanMode ? log.createChild('[FISHERMAN]') : log;
74
+
70
75
  this.tracer = telemetry.getTracer('Validator');
71
76
  this.metrics = new ValidatorMetrics(telemetry);
72
77
 
73
78
  this.validationService = new ValidationService(keyStore);
74
79
 
75
80
  // Refresh epoch cache every second to trigger alert if participation in committee changes
76
- this.epochCacheUpdateLoop = new RunningPromise(this.handleEpochCommitteeUpdate.bind(this), log, 1000);
81
+ this.epochCacheUpdateLoop = new RunningPromise(this.handleEpochCommitteeUpdate.bind(this), this.log, 1000);
77
82
 
78
83
  const myAddresses = this.getValidatorAddresses();
79
84
  this.log.verbose(`Initialized validator with addresses: ${myAddresses.map(a => a.toString()).join(', ')}`);
@@ -270,12 +275,16 @@ export class ValidatorClient extends (EventEmitter as new () => WatcherEmitter)
270
275
  this.log.info(`Received proposal for slot ${slotNumber}`, {
271
276
  ...proposalInfo,
272
277
  txHashes: proposal.txHashes.map(t => t.toString()),
278
+ fishermanMode: this.config.fishermanMode || false,
273
279
  });
274
280
 
275
281
  // Reexecute txs if we are part of the committee so we can attest, or if slashing is enabled so we can slash
276
282
  // invalid proposals even when not in the committee, or if we are configured to always reexecute for monitoring purposes.
277
- const { validatorReexecute, slashBroadcastedInvalidBlockPenalty, alwaysReexecuteBlockProposals } = this.config;
283
+ // In fisherman mode, we always reexecute to validate proposals.
284
+ const { validatorReexecute, slashBroadcastedInvalidBlockPenalty, alwaysReexecuteBlockProposals, fishermanMode } =
285
+ this.config;
278
286
  const shouldReexecute =
287
+ fishermanMode ||
279
288
  (slashBroadcastedInvalidBlockPenalty > 0n && validatorReexecute) ||
280
289
  (partOfCommittee && validatorReexecute) ||
281
290
  alwaysReexecuteBlockProposals;
@@ -319,17 +328,47 @@ export class ValidatorClient extends (EventEmitter as new () => WatcherEmitter)
319
328
  }
320
329
 
321
330
  // Check that I have any address in current committee before attesting
322
- if (!partOfCommittee) {
331
+ // In fisherman mode, we still create attestations for validation even if not in committee
332
+ if (!partOfCommittee && !this.config.fishermanMode) {
323
333
  this.log.verbose(`No validator in the current committee, skipping attestation`, proposalInfo);
324
334
  return undefined;
325
335
  }
326
336
 
327
337
  // Provided all of the above checks pass, we can attest to the proposal
328
- this.log.info(`Attesting to proposal for block at slot ${slotNumber}`, proposalInfo);
338
+ this.log.info(`${partOfCommittee ? 'Attesting to' : 'Validated'} proposal for slot ${slotNumber}`, {
339
+ ...proposalInfo,
340
+ inCommittee: partOfCommittee,
341
+ fishermanMode: this.config.fishermanMode || false,
342
+ });
343
+
329
344
  this.metrics.incSuccessfulAttestations(inCommittee.length);
330
345
 
331
346
  // If the above function does not throw an error, then we can attest to the proposal
332
- return this.createBlockAttestationsFromProposal(proposal, inCommittee);
347
+ // Determine which validators should attest
348
+ let attestors: EthAddress[];
349
+ if (partOfCommittee) {
350
+ attestors = inCommittee;
351
+ } else if (this.config.fishermanMode) {
352
+ // In fisherman mode, create attestations for validation purposes even if not in committee. These won't be broadcast.
353
+ attestors = this.getValidatorAddresses();
354
+ } else {
355
+ attestors = [];
356
+ }
357
+
358
+ // Only create attestations if we have attestors
359
+ if (attestors.length === 0) {
360
+ return undefined;
361
+ }
362
+
363
+ if (this.config.fishermanMode) {
364
+ // bail out early and don't save attestations to the pool in fisherman mode
365
+ this.log.info(`Creating attestations for proposal for slot ${slotNumber}`, {
366
+ ...proposalInfo,
367
+ attestors: attestors.map(a => a.toString()),
368
+ });
369
+ return undefined;
370
+ }
371
+ return this.createBlockAttestationsFromProposal(proposal, attestors);
333
372
  }
334
373
 
335
374
  private slashInvalidBlock(proposal: BlockProposal) {
@@ -400,7 +439,15 @@ export class ValidatorClient extends (EventEmitter as new () => WatcherEmitter)
400
439
  const slot = proposal.payload.header.slotNumber.toBigInt();
401
440
  const inCommittee = await this.epochCache.filterInCommittee(slot, this.getValidatorAddresses());
402
441
  this.log.debug(`Collecting ${inCommittee.length} self-attestations for slot ${slot}`, { inCommittee });
403
- return this.createBlockAttestationsFromProposal(proposal, inCommittee);
442
+ const attestations = await this.createBlockAttestationsFromProposal(proposal, inCommittee);
443
+
444
+ // We broadcast our own attestations to our peers so, in case our block does not get mined on L1,
445
+ // other nodes can see that our validators did attest to this block proposal, and do not slash us
446
+ // due to inactivity for missed attestations.
447
+ void this.p2pClient.broadcastAttestations(attestations).catch(err => {
448
+ this.log.error(`Failed to broadcast self-attestations for slot ${slot}`, err);
449
+ });
450
+ return attestations;
404
451
  }
405
452
 
406
453
  async collectAttestations(proposal: BlockProposal, required: number, deadline: Date): Promise<BlockAttestation[]> {