@aztec/validator-client 5.0.0-nightly.20260512 → 5.0.0-nightly.20260515
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/factory.js +1 -1
- package/dest/proposal_handler.d.ts +1 -1
- package/dest/proposal_handler.d.ts.map +1 -1
- package/dest/proposal_handler.js +22 -5
- package/dest/validator.d.ts +9 -1
- package/dest/validator.d.ts.map +1 -1
- package/dest/validator.js +84 -10
- package/package.json +19 -19
- package/src/factory.ts +1 -1
- package/src/proposal_handler.ts +22 -9
- package/src/validator.ts +106 -9
package/dest/factory.js
CHANGED
|
@@ -10,7 +10,7 @@ export function createProposalHandler(config, deps) {
|
|
|
10
10
|
maxBlocksPerCheckpoint: config.maxBlocksPerCheckpoint,
|
|
11
11
|
signatureContext: {
|
|
12
12
|
chainId: config.l1ChainId,
|
|
13
|
-
rollupAddress: config.
|
|
13
|
+
rollupAddress: config.rollupAddress
|
|
14
14
|
}
|
|
15
15
|
});
|
|
16
16
|
return new ProposalHandler(deps.checkpointsBuilder, deps.worldState, deps.blockSource, deps.l1ToL2MessageSource, deps.p2pClient.getTxProvider(), blockProposalValidator, deps.epochCache, config, deps.blobClient, metrics, deps.dateProvider, deps.telemetry, undefined);
|
|
@@ -107,4 +107,4 @@ export declare class ProposalHandler {
|
|
|
107
107
|
private setProposedCheckpointFromBlocks;
|
|
108
108
|
}
|
|
109
109
|
export {};
|
|
110
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
110
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcG9zYWxfaGFuZGxlci5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3Byb3Bvc2FsX2hhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDaEQsT0FBTyxLQUFLLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUdyRSxPQUFPLEtBQUssRUFBRSxVQUFVLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUVyRCxPQUFPLEVBQ0wsV0FBVyxFQUNYLGdCQUFnQixFQUdqQixNQUFNLGlDQUFpQyxDQUFDO0FBRXpDLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUVwRCxPQUFPLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUdyRCxPQUFPLEVBQUUsWUFBWSxFQUFTLE1BQU0seUJBQXlCLENBQUM7QUFDOUQsT0FBTyxLQUFLLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxNQUFNLFlBQVksQ0FBQztBQUM5QyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNuRSxPQUFPLEtBQUssRUFBYSxPQUFPLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBSTFGLE9BQU8sS0FBSyxFQUFFLFdBQVcsRUFBRSx5QkFBeUIsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3RILE9BQU8sRUFDTCxLQUFLLG1CQUFtQixFQUd6QixNQUFNLHlCQUF5QixDQUFDO0FBQ2pDLE9BQU8sS0FBSyxFQUFFLGFBQWEsRUFBeUIsc0JBQXNCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUV0RyxPQUFPLEtBQUssRUFBNkIsUUFBUSxFQUFFLEVBQUUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBUWhGLE9BQU8sRUFBRSxLQUFLLGVBQWUsRUFB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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proposal_handler.d.ts","sourceRoot":"","sources":["../src/proposal_handler.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"proposal_handler.d.ts","sourceRoot":"","sources":["../src/proposal_handler.ts"],"names":[],"mappings":"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"}
|
package/dest/proposal_handler.js
CHANGED
|
@@ -73,7 +73,7 @@ import { TimeoutError } from '@aztec/foundation/error';
|
|
|
73
73
|
import { createLogger } from '@aztec/foundation/log';
|
|
74
74
|
import { retryUntil } from '@aztec/foundation/retry';
|
|
75
75
|
import { DateProvider, Timer } from '@aztec/foundation/timer';
|
|
76
|
-
import { validateCheckpoint } from '@aztec/stdlib/checkpoint';
|
|
76
|
+
import { getPreviousCheckpointOutHashes, validateCheckpoint } from '@aztec/stdlib/checkpoint';
|
|
77
77
|
import { getEpochAtSlot, getTimestampForSlot } from '@aztec/stdlib/epoch-helpers';
|
|
78
78
|
import { Gas } from '@aztec/stdlib/gas';
|
|
79
79
|
import { accumulateCheckpointOutHashes, computeInHashFromL1ToL2Messages } from '@aztec/stdlib/messaging';
|
|
@@ -335,9 +335,18 @@ import { getTelemetryClient } from '@aztec/telemetry-client';
|
|
|
335
335
|
reason: 'txs_not_available'
|
|
336
336
|
};
|
|
337
337
|
}
|
|
338
|
-
// Collect the out hashes of all the checkpoints before this one in the same epoch
|
|
338
|
+
// Collect the out hashes of all the checkpoints before this one in the same epoch.
|
|
339
|
+
// Mirror the proposer-side fallback: under pipelining the immediately-preceding cp may not
|
|
340
|
+
// yet be on L1, in which case the helper grafts the locally-known proposed cp's outHash.
|
|
339
341
|
const epoch = getEpochAtSlot(slotNumber, this.epochCache.getL1Constants());
|
|
340
|
-
const previousCheckpointOutHashes =
|
|
342
|
+
const previousCheckpointOutHashes = await getPreviousCheckpointOutHashes({
|
|
343
|
+
blockSource: this.blockSource,
|
|
344
|
+
epoch,
|
|
345
|
+
checkpointNumber,
|
|
346
|
+
l1Constants: this.epochCache.getL1Constants(),
|
|
347
|
+
pipeliningEnabled: this.epochCache.isProposerPipeliningEnabled(),
|
|
348
|
+
log: this.log
|
|
349
|
+
});
|
|
341
350
|
// Try re-executing the transactions in the proposal if needed
|
|
342
351
|
let reexecutionResult;
|
|
343
352
|
try {
|
|
@@ -807,9 +816,17 @@ import { getTelemetryClient } from '@aztec/telemetry-client';
|
|
|
807
816
|
const checkpointNumber = firstBlock.checkpointNumber;
|
|
808
817
|
// Get L1-to-L2 messages for this checkpoint
|
|
809
818
|
const l1ToL2Messages = await this.l1ToL2MessageSource.getL1ToL2Messages(checkpointNumber);
|
|
810
|
-
// Collect the out hashes of all the checkpoints before this one in the same epoch
|
|
819
|
+
// Collect the out hashes of all the checkpoints before this one in the same epoch.
|
|
820
|
+
// See note on the analogous block-proposal site: the helper handles pipelining lag.
|
|
811
821
|
const epoch = getEpochAtSlot(slot, this.epochCache.getL1Constants());
|
|
812
|
-
const previousCheckpointOutHashes =
|
|
822
|
+
const previousCheckpointOutHashes = await getPreviousCheckpointOutHashes({
|
|
823
|
+
blockSource: this.blockSource,
|
|
824
|
+
epoch,
|
|
825
|
+
checkpointNumber,
|
|
826
|
+
l1Constants: this.epochCache.getL1Constants(),
|
|
827
|
+
pipeliningEnabled: this.epochCache.isProposerPipeliningEnabled(),
|
|
828
|
+
log: this.log
|
|
829
|
+
});
|
|
813
830
|
// Fork world state at the block before the first block
|
|
814
831
|
const parentBlockNumber = BlockNumber(firstBlock.number - 1);
|
|
815
832
|
const fork = _ts_add_disposable_resource(env, await this.checkpointsBuilder.getFork(parentBlockNumber), true);
|
package/dest/validator.d.ts
CHANGED
|
@@ -54,6 +54,9 @@ export declare class ValidatorClient extends ValidatorClient_base implements Val
|
|
|
54
54
|
/** Tracks the last epoch in which each attester successfully submitted at least one attestation. */
|
|
55
55
|
private lastAttestedEpochByAttester;
|
|
56
56
|
private proposersOfInvalidBlocks;
|
|
57
|
+
private slotsWithInvalidBlockProposals;
|
|
58
|
+
private slotsWithProposalEquivocation;
|
|
59
|
+
private badAttestationOffenseKeys;
|
|
57
60
|
/** Tracks the last checkpoint proposal we attested to, to prevent equivocation. */
|
|
58
61
|
private lastAttestedProposal?;
|
|
59
62
|
protected constructor(keyStore: ExtendedValidatorKeyStore, epochCache: EpochCache, p2pClient: P2P, proposalHandler: ProposalHandler, blockSource: L2BlockSource, checkpointsBuilder: FullNodeCheckpointsBuilder, worldState: WorldStateSynchronizer, l1ToL2MessageSource: L1ToL2MessageSource, config: ValidatorClientFullConfig, blobClient: BlobClientInterface, slashingProtectionSigner: ValidatorHASigner, dateProvider?: DateProvider, telemetry?: TelemetryClient, log?: Logger);
|
|
@@ -97,6 +100,9 @@ export declare class ValidatorClient extends ValidatorClient_base implements Val
|
|
|
97
100
|
*/
|
|
98
101
|
protected uploadBlobsForCheckpoint(proposal: CheckpointProposalCore, proposalInfo: LogData): Promise<void>;
|
|
99
102
|
private slashInvalidBlock;
|
|
103
|
+
private markInvalidProposalSlot;
|
|
104
|
+
private handleCheckpointAttestation;
|
|
105
|
+
private slashAttestedToInvalidCheckpointProposal;
|
|
100
106
|
/**
|
|
101
107
|
* Handle detection of a duplicate proposal (equivocation).
|
|
102
108
|
* Emits a slash event when a proposer sends multiple proposals for the same position.
|
|
@@ -107,6 +113,8 @@ export declare class ValidatorClient extends ValidatorClient_base implements Val
|
|
|
107
113
|
* Emits a slash event when an attester signs attestations for different proposals at the same slot.
|
|
108
114
|
*/
|
|
109
115
|
private handleDuplicateAttestation;
|
|
116
|
+
private getSlotKey;
|
|
117
|
+
private addToBoundedSet;
|
|
110
118
|
createBlockProposal(blockHeader: BlockHeader, checkpointNumber: CheckpointNumber, indexWithinCheckpoint: IndexWithinCheckpoint, inHash: Fr, archive: Fr, txs: Tx[], proposerAddress: EthAddress | undefined, options?: BlockProposalOptions): Promise<BlockProposal>;
|
|
111
119
|
createCheckpointProposal(checkpointHeader: CheckpointHeader, archive: Fr, checkpointNumber: CheckpointNumber, feeAssetPriceModifier: bigint, lastBlockProposal: BlockProposal | undefined, proposerAddress: EthAddress | undefined, options?: CheckpointProposalOptions): Promise<CheckpointProposal>;
|
|
112
120
|
broadcastBlockProposal(proposal: BlockProposal): Promise<void>;
|
|
@@ -116,4 +124,4 @@ export declare class ValidatorClient extends ValidatorClient_base implements Val
|
|
|
116
124
|
private handleAuthRequest;
|
|
117
125
|
}
|
|
118
126
|
export {};
|
|
119
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
127
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdG9yLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdmFsaWRhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFckUsT0FBTyxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDckQsT0FBTyxFQUFFLGdCQUFnQixFQUFlLHFCQUFxQixFQUFFLFVBQVUsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ25ILE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNwRCxPQUFPLEtBQUssRUFBRSxVQUFVLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNoRSxPQUFPLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNqRSxPQUFPLEVBQUUsS0FBSyxPQUFPLEVBQUUsS0FBSyxNQUFNLEVBQWdCLE1BQU0sdUJBQXVCLENBQUM7QUFHaEYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3ZELE9BQU8sS0FBSyxFQUFFLGVBQWUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzVELE9BQU8sS0FBSyxFQUFtRCxHQUFHLEVBQUUsTUFBTSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRS9GLE9BQU8sRUFJTCxLQUFLLE9BQU8sRUFDWixLQUFLLGNBQWMsRUFDcEIsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEtBQUssRUFBRSxZQUFZLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNoRSxPQUFPLEtBQUssRUFBRSwrQkFBK0IsRUFBRSxXQUFXLEVBQUUsYUFBYSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFdkcsT0FBTyxLQUFLLEVBQ1YsV0FBVyxFQUNYLFNBQVMsRUFDVCx5QkFBeUIsRUFDekIsc0JBQXNCLEVBQ3ZCLE1BQU0saUNBQWlDLENBQUM7QUFDekMsT0FB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
|
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,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAErE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAe,qBAAqB,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AACnH,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AACpD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAC;AACjE,OAAO,EAAE,KAAK,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,uBAAuB,CAAC;AAGhF,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,KAAK,EAAmD,GAAG,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAE/F,OAAO,
|
|
1
|
+
{"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../src/validator.ts"],"names":[],"mappings":"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"}
|
package/dest/validator.js
CHANGED
|
@@ -5,7 +5,7 @@ import { RunningPromise } from '@aztec/foundation/running-promise';
|
|
|
5
5
|
import { sleep } from '@aztec/foundation/sleep';
|
|
6
6
|
import { DateProvider } from '@aztec/foundation/timer';
|
|
7
7
|
import { AuthRequest, AuthResponse, BlockProposalValidator, ReqRespSubProtocol } from '@aztec/p2p';
|
|
8
|
-
import { OffenseType, WANT_TO_SLASH_EVENT } from '@aztec/slasher';
|
|
8
|
+
import { OffenseType, WANT_TO_CLEAR_SLASH_EVENT, WANT_TO_SLASH_EVENT } from '@aztec/slasher';
|
|
9
9
|
import { getEpochAtSlot } from '@aztec/stdlib/epoch-helpers';
|
|
10
10
|
import { AttestationTimeoutError } from '@aztec/stdlib/validators';
|
|
11
11
|
import { getTelemetryClient } from '@aztec/telemetry-client';
|
|
@@ -20,6 +20,8 @@ import { ProposalHandler } from './proposal_handler.js';
|
|
|
20
20
|
// We maintain a set of proposers who have proposed invalid blocks.
|
|
21
21
|
// Just cap the set to avoid unbounded growth.
|
|
22
22
|
const MAX_PROPOSERS_OF_INVALID_BLOCKS = 1000;
|
|
23
|
+
const MAX_TRACKED_INVALID_PROPOSAL_SLOTS = 1000;
|
|
24
|
+
const MAX_TRACKED_BAD_ATTESTATIONS = 10_000;
|
|
23
25
|
// What errors from the block proposal handler result in slashing
|
|
24
26
|
const SLASHABLE_BLOCK_PROPOSAL_VALIDATION_RESULT = [
|
|
25
27
|
'state_mismatch',
|
|
@@ -52,9 +54,12 @@ const SLASHABLE_BLOCK_PROPOSAL_VALIDATION_RESULT = [
|
|
|
52
54
|
epochCacheUpdateLoop;
|
|
53
55
|
/** Tracks the last epoch in which each attester successfully submitted at least one attestation. */ lastAttestedEpochByAttester;
|
|
54
56
|
proposersOfInvalidBlocks;
|
|
57
|
+
slotsWithInvalidBlockProposals;
|
|
58
|
+
slotsWithProposalEquivocation;
|
|
59
|
+
badAttestationOffenseKeys;
|
|
55
60
|
/** Tracks the last checkpoint proposal we attested to, to prevent equivocation. */ lastAttestedProposal;
|
|
56
61
|
constructor(keyStore, epochCache, p2pClient, proposalHandler, blockSource, checkpointsBuilder, worldState, l1ToL2MessageSource, config, blobClient, slashingProtectionSigner, dateProvider = new DateProvider(), telemetry = getTelemetryClient(), log = createLogger('validator')){
|
|
57
|
-
super(), this.keyStore = keyStore, this.epochCache = epochCache, this.p2pClient = p2pClient, this.proposalHandler = proposalHandler, this.blockSource = blockSource, this.checkpointsBuilder = checkpointsBuilder, this.worldState = worldState, this.l1ToL2MessageSource = l1ToL2MessageSource, this.config = config, this.blobClient = blobClient, this.slashingProtectionSigner = slashingProtectionSigner, this.dateProvider = dateProvider, this.hasRegisteredHandlers = false, this.lastAttestedEpochByAttester = new Map(), this.proposersOfInvalidBlocks = new Set();
|
|
62
|
+
super(), this.keyStore = keyStore, this.epochCache = epochCache, this.p2pClient = p2pClient, this.proposalHandler = proposalHandler, this.blockSource = blockSource, this.checkpointsBuilder = checkpointsBuilder, this.worldState = worldState, this.l1ToL2MessageSource = l1ToL2MessageSource, this.config = config, this.blobClient = blobClient, this.slashingProtectionSigner = slashingProtectionSigner, this.dateProvider = dateProvider, this.hasRegisteredHandlers = false, this.lastAttestedEpochByAttester = new Map(), this.proposersOfInvalidBlocks = new Set(), this.slotsWithInvalidBlockProposals = new Set(), this.slotsWithProposalEquivocation = new Set(), this.badAttestationOffenseKeys = new Set();
|
|
58
63
|
// Create child logger with fisherman prefix if in fisherman mode
|
|
59
64
|
this.log = config.fishermanMode ? log.createChild('[FISHERMAN]') : log;
|
|
60
65
|
this.tracer = telemetry.getTracer('Validator');
|
|
@@ -117,7 +122,7 @@ const SLASHABLE_BLOCK_PROPOSAL_VALIDATION_RESULT = [
|
|
|
117
122
|
maxBlocksPerCheckpoint: config.maxBlocksPerCheckpoint,
|
|
118
123
|
signatureContext: {
|
|
119
124
|
chainId: config.l1ChainId,
|
|
120
|
-
rollupAddress: config.
|
|
125
|
+
rollupAddress: config.rollupAddress
|
|
121
126
|
}
|
|
122
127
|
});
|
|
123
128
|
const proposalHandler = new ProposalHandler(checkpointsBuilder, worldState, blockSource, l1ToL2MessageSource, txProvider, blockProposalValidator, epochCache, config, blobClient, metrics, dateProvider, telemetry, undefined);
|
|
@@ -164,7 +169,7 @@ const SLASHABLE_BLOCK_PROPOSAL_VALIDATION_RESULT = [
|
|
|
164
169
|
getSignatureContext() {
|
|
165
170
|
return {
|
|
166
171
|
chainId: this.config.l1ChainId,
|
|
167
|
-
rollupAddress: this.config.
|
|
172
|
+
rollupAddress: this.config.rollupAddress
|
|
168
173
|
};
|
|
169
174
|
}
|
|
170
175
|
getCoinbaseForAttestor(attestor) {
|
|
@@ -227,6 +232,9 @@ const SLASHABLE_BLOCK_PROPOSAL_VALIDATION_RESULT = [
|
|
|
227
232
|
this.p2pClient.registerDuplicateAttestationCallback((info)=>{
|
|
228
233
|
this.handleDuplicateAttestation(info);
|
|
229
234
|
});
|
|
235
|
+
this.p2pClient.registerCheckpointAttestationCallback((attestation)=>{
|
|
236
|
+
this.handleCheckpointAttestation(attestation);
|
|
237
|
+
});
|
|
230
238
|
const myAddresses = this.getValidatorAddresses();
|
|
231
239
|
this.p2pClient.registerThisValidatorAddresses(myAddresses);
|
|
232
240
|
await this.p2pClient.addReqRespSubProtocol(ReqRespSubProtocol.AUTH, this.handleAuthRequest.bind(this));
|
|
@@ -268,8 +276,8 @@ const SLASHABLE_BLOCK_PROPOSAL_VALIDATION_RESULT = [
|
|
|
268
276
|
});
|
|
269
277
|
// Reexecute txs if we are part of the committee, or if slashing is enabled, or if we are configured to always reexecute.
|
|
270
278
|
// In fisherman mode, we always reexecute to validate proposals.
|
|
271
|
-
const { slashBroadcastedInvalidBlockPenalty, alwaysReexecuteBlockProposals, fishermanMode } = this.config;
|
|
272
|
-
const shouldReexecute = fishermanMode || slashBroadcastedInvalidBlockPenalty > 0n || partOfCommittee || alwaysReexecuteBlockProposals || this.blobClient.canUpload();
|
|
279
|
+
const { slashBroadcastedInvalidBlockPenalty, slashAttestInvalidCheckpointProposalPenalty, alwaysReexecuteBlockProposals, fishermanMode } = this.config;
|
|
280
|
+
const shouldReexecute = fishermanMode || slashBroadcastedInvalidBlockPenalty > 0n || slashAttestInvalidCheckpointProposalPenalty > 0n || partOfCommittee || alwaysReexecuteBlockProposals || this.blobClient.canUpload();
|
|
273
281
|
const validationResult = await this.proposalHandler.handleBlockProposal(proposal, proposalSender, !!shouldReexecute && !escapeHatchOpen);
|
|
274
282
|
if (!validationResult.isValid) {
|
|
275
283
|
const reason = validationResult.reason || 'unknown';
|
|
@@ -288,10 +296,14 @@ const SLASHABLE_BLOCK_PROPOSAL_VALIDATION_RESULT = [
|
|
|
288
296
|
// Node issues so we can't validate
|
|
289
297
|
this.metrics.incFailedAttestationsNodeIssue(1, reason, partOfCommittee);
|
|
290
298
|
}
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
299
|
+
if (!escapeHatchOpen && validationResult.reason && SLASHABLE_BLOCK_PROPOSAL_VALIDATION_RESULT.includes(validationResult.reason)) {
|
|
300
|
+
if (slashBroadcastedInvalidBlockPenalty > 0n) {
|
|
301
|
+
this.log.warn(`Slashing proposer for invalid block proposal`, proposalInfo);
|
|
302
|
+
this.slashInvalidBlock(proposal);
|
|
303
|
+
}
|
|
304
|
+
if (slashAttestInvalidCheckpointProposalPenalty > 0n) {
|
|
305
|
+
this.markInvalidProposalSlot(proposal.slotNumber);
|
|
306
|
+
}
|
|
295
307
|
}
|
|
296
308
|
return false;
|
|
297
309
|
}
|
|
@@ -476,11 +488,54 @@ const SLASHABLE_BLOCK_PROPOSAL_VALIDATION_RESULT = [
|
|
|
476
488
|
}
|
|
477
489
|
]);
|
|
478
490
|
}
|
|
491
|
+
markInvalidProposalSlot(slotNumber) {
|
|
492
|
+
const slotKey = this.getSlotKey(slotNumber);
|
|
493
|
+
this.addToBoundedSet(this.slotsWithInvalidBlockProposals, slotKey, MAX_TRACKED_INVALID_PROPOSAL_SLOTS);
|
|
494
|
+
}
|
|
495
|
+
handleCheckpointAttestation(attestation) {
|
|
496
|
+
const slotNumber = attestation.slotNumber;
|
|
497
|
+
const slotKey = this.getSlotKey(slotNumber);
|
|
498
|
+
if (!this.slotsWithInvalidBlockProposals.has(slotKey) || this.slotsWithProposalEquivocation.has(slotKey)) {
|
|
499
|
+
return;
|
|
500
|
+
}
|
|
501
|
+
const attester = attestation.getSender();
|
|
502
|
+
if (!attester) {
|
|
503
|
+
this.log.warn(`Cannot slash checkpoint attestation with invalid signature`, {
|
|
504
|
+
slotNumber,
|
|
505
|
+
archive: attestation.archive.toString()
|
|
506
|
+
});
|
|
507
|
+
return;
|
|
508
|
+
}
|
|
509
|
+
this.slashAttestedToInvalidCheckpointProposal(slotNumber, attester);
|
|
510
|
+
}
|
|
511
|
+
slashAttestedToInvalidCheckpointProposal(slotNumber, attester) {
|
|
512
|
+
if (this.config.slashAttestInvalidCheckpointProposalPenalty <= 0n) {
|
|
513
|
+
return;
|
|
514
|
+
}
|
|
515
|
+
const offenseKey = `${this.getSlotKey(slotNumber)}:${attester.toString()}`;
|
|
516
|
+
if (!this.addToBoundedSet(this.badAttestationOffenseKeys, offenseKey, MAX_TRACKED_BAD_ATTESTATIONS)) {
|
|
517
|
+
return;
|
|
518
|
+
}
|
|
519
|
+
this.log.warn(`Slashing attester for attesting to invalid checkpoint proposal`, {
|
|
520
|
+
attester: attester.toString(),
|
|
521
|
+
slotNumber
|
|
522
|
+
});
|
|
523
|
+
this.emit(WANT_TO_SLASH_EVENT, [
|
|
524
|
+
{
|
|
525
|
+
validator: attester,
|
|
526
|
+
amount: this.config.slashAttestInvalidCheckpointProposalPenalty,
|
|
527
|
+
offenseType: OffenseType.ATTESTED_TO_INVALID_CHECKPOINT_PROPOSAL,
|
|
528
|
+
epochOrSlot: BigInt(slotNumber)
|
|
529
|
+
}
|
|
530
|
+
]);
|
|
531
|
+
}
|
|
479
532
|
/**
|
|
480
533
|
* Handle detection of a duplicate proposal (equivocation).
|
|
481
534
|
* Emits a slash event when a proposer sends multiple proposals for the same position.
|
|
482
535
|
*/ handleDuplicateProposal(info) {
|
|
483
536
|
const { slot, proposer, type } = info;
|
|
537
|
+
const slotKey = this.getSlotKey(slot);
|
|
538
|
+
this.addToBoundedSet(this.slotsWithProposalEquivocation, slotKey, MAX_TRACKED_INVALID_PROPOSAL_SLOTS);
|
|
484
539
|
this.log.warn(`Triggering slash event for duplicate ${type} proposal from ${proposer.toString()} at slot ${slot}`, {
|
|
485
540
|
proposer: proposer.toString(),
|
|
486
541
|
slot,
|
|
@@ -495,6 +550,12 @@ const SLASHABLE_BLOCK_PROPOSAL_VALIDATION_RESULT = [
|
|
|
495
550
|
epochOrSlot: BigInt(slot)
|
|
496
551
|
}
|
|
497
552
|
]);
|
|
553
|
+
this.emit(WANT_TO_CLEAR_SLASH_EVENT, [
|
|
554
|
+
{
|
|
555
|
+
offenseType: OffenseType.ATTESTED_TO_INVALID_CHECKPOINT_PROPOSAL,
|
|
556
|
+
epochOrSlot: BigInt(slot)
|
|
557
|
+
}
|
|
558
|
+
]);
|
|
498
559
|
}
|
|
499
560
|
/**
|
|
500
561
|
* Handle detection of a duplicate attestation (equivocation).
|
|
@@ -514,6 +575,19 @@ const SLASHABLE_BLOCK_PROPOSAL_VALIDATION_RESULT = [
|
|
|
514
575
|
}
|
|
515
576
|
]);
|
|
516
577
|
}
|
|
578
|
+
getSlotKey(slot) {
|
|
579
|
+
return slot.toString();
|
|
580
|
+
}
|
|
581
|
+
addToBoundedSet(set, value, maxSize) {
|
|
582
|
+
if (set.has(value)) {
|
|
583
|
+
return false;
|
|
584
|
+
}
|
|
585
|
+
if (set.size >= maxSize) {
|
|
586
|
+
set.delete(set.values().next().value);
|
|
587
|
+
}
|
|
588
|
+
set.add(value);
|
|
589
|
+
return true;
|
|
590
|
+
}
|
|
517
591
|
async createBlockProposal(blockHeader, checkpointNumber, indexWithinCheckpoint, inHash, archive, txs, proposerAddress, options = {}) {
|
|
518
592
|
// Validate that we're not creating a proposal for an older or equal position
|
|
519
593
|
if (this.lastProposedBlock) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/validator-client",
|
|
3
|
-
"version": "5.0.0-nightly.
|
|
3
|
+
"version": "5.0.0-nightly.20260515",
|
|
4
4
|
"main": "dest/index.js",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
@@ -64,30 +64,30 @@
|
|
|
64
64
|
]
|
|
65
65
|
},
|
|
66
66
|
"dependencies": {
|
|
67
|
-
"@aztec/blob-client": "5.0.0-nightly.
|
|
68
|
-
"@aztec/blob-lib": "5.0.0-nightly.
|
|
69
|
-
"@aztec/constants": "5.0.0-nightly.
|
|
70
|
-
"@aztec/epoch-cache": "5.0.0-nightly.
|
|
71
|
-
"@aztec/ethereum": "5.0.0-nightly.
|
|
72
|
-
"@aztec/foundation": "5.0.0-nightly.
|
|
73
|
-
"@aztec/node-keystore": "5.0.0-nightly.
|
|
74
|
-
"@aztec/noir-protocol-circuits-types": "5.0.0-nightly.
|
|
75
|
-
"@aztec/p2p": "5.0.0-nightly.
|
|
76
|
-
"@aztec/protocol-contracts": "5.0.0-nightly.
|
|
77
|
-
"@aztec/prover-client": "5.0.0-nightly.
|
|
78
|
-
"@aztec/simulator": "5.0.0-nightly.
|
|
79
|
-
"@aztec/slasher": "5.0.0-nightly.
|
|
80
|
-
"@aztec/stdlib": "5.0.0-nightly.
|
|
81
|
-
"@aztec/telemetry-client": "5.0.0-nightly.
|
|
82
|
-
"@aztec/validator-ha-signer": "5.0.0-nightly.
|
|
67
|
+
"@aztec/blob-client": "5.0.0-nightly.20260515",
|
|
68
|
+
"@aztec/blob-lib": "5.0.0-nightly.20260515",
|
|
69
|
+
"@aztec/constants": "5.0.0-nightly.20260515",
|
|
70
|
+
"@aztec/epoch-cache": "5.0.0-nightly.20260515",
|
|
71
|
+
"@aztec/ethereum": "5.0.0-nightly.20260515",
|
|
72
|
+
"@aztec/foundation": "5.0.0-nightly.20260515",
|
|
73
|
+
"@aztec/node-keystore": "5.0.0-nightly.20260515",
|
|
74
|
+
"@aztec/noir-protocol-circuits-types": "5.0.0-nightly.20260515",
|
|
75
|
+
"@aztec/p2p": "5.0.0-nightly.20260515",
|
|
76
|
+
"@aztec/protocol-contracts": "5.0.0-nightly.20260515",
|
|
77
|
+
"@aztec/prover-client": "5.0.0-nightly.20260515",
|
|
78
|
+
"@aztec/simulator": "5.0.0-nightly.20260515",
|
|
79
|
+
"@aztec/slasher": "5.0.0-nightly.20260515",
|
|
80
|
+
"@aztec/stdlib": "5.0.0-nightly.20260515",
|
|
81
|
+
"@aztec/telemetry-client": "5.0.0-nightly.20260515",
|
|
82
|
+
"@aztec/validator-ha-signer": "5.0.0-nightly.20260515",
|
|
83
83
|
"koa": "^2.16.1",
|
|
84
84
|
"koa-router": "^13.1.1",
|
|
85
85
|
"tslib": "^2.4.0",
|
|
86
86
|
"viem": "npm:@aztec/viem@2.38.2"
|
|
87
87
|
},
|
|
88
88
|
"devDependencies": {
|
|
89
|
-
"@aztec/archiver": "5.0.0-nightly.
|
|
90
|
-
"@aztec/world-state": "5.0.0-nightly.
|
|
89
|
+
"@aztec/archiver": "5.0.0-nightly.20260515",
|
|
90
|
+
"@aztec/world-state": "5.0.0-nightly.20260515",
|
|
91
91
|
"@electric-sql/pglite": "^0.3.14",
|
|
92
92
|
"@jest/globals": "^30.0.0",
|
|
93
93
|
"@types/jest": "^30.0.0",
|
package/src/factory.ts
CHANGED
|
@@ -35,7 +35,7 @@ export function createProposalHandler(
|
|
|
35
35
|
maxBlocksPerCheckpoint: config.maxBlocksPerCheckpoint,
|
|
36
36
|
signatureContext: {
|
|
37
37
|
chainId: config.l1ChainId,
|
|
38
|
-
rollupAddress: config.
|
|
38
|
+
rollupAddress: config.rollupAddress,
|
|
39
39
|
},
|
|
40
40
|
});
|
|
41
41
|
return new ProposalHandler(
|
package/src/proposal_handler.ts
CHANGED
|
@@ -20,7 +20,7 @@ import { DateProvider, Timer } from '@aztec/foundation/timer';
|
|
|
20
20
|
import type { P2P, PeerId } from '@aztec/p2p';
|
|
21
21
|
import { BlockProposalValidator } from '@aztec/p2p/msg_validators';
|
|
22
22
|
import type { BlockData, L2Block, L2BlockSink, L2BlockSource } from '@aztec/stdlib/block';
|
|
23
|
-
import { validateCheckpoint } from '@aztec/stdlib/checkpoint';
|
|
23
|
+
import { getPreviousCheckpointOutHashes, validateCheckpoint } from '@aztec/stdlib/checkpoint';
|
|
24
24
|
import { getEpochAtSlot, getTimestampForSlot } from '@aztec/stdlib/epoch-helpers';
|
|
25
25
|
import { Gas } from '@aztec/stdlib/gas';
|
|
26
26
|
import type { ITxProvider, ValidatorClientFullConfig, WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server';
|
|
@@ -347,11 +347,18 @@ export class ProposalHandler {
|
|
|
347
347
|
return { isValid: false, blockNumber, reason: 'txs_not_available' };
|
|
348
348
|
}
|
|
349
349
|
|
|
350
|
-
// Collect the out hashes of all the checkpoints before this one in the same epoch
|
|
350
|
+
// Collect the out hashes of all the checkpoints before this one in the same epoch.
|
|
351
|
+
// Mirror the proposer-side fallback: under pipelining the immediately-preceding cp may not
|
|
352
|
+
// yet be on L1, in which case the helper grafts the locally-known proposed cp's outHash.
|
|
351
353
|
const epoch = getEpochAtSlot(slotNumber, this.epochCache.getL1Constants());
|
|
352
|
-
const previousCheckpointOutHashes =
|
|
353
|
-
|
|
354
|
-
|
|
354
|
+
const previousCheckpointOutHashes = await getPreviousCheckpointOutHashes({
|
|
355
|
+
blockSource: this.blockSource,
|
|
356
|
+
epoch,
|
|
357
|
+
checkpointNumber,
|
|
358
|
+
l1Constants: this.epochCache.getL1Constants(),
|
|
359
|
+
pipeliningEnabled: this.epochCache.isProposerPipeliningEnabled(),
|
|
360
|
+
log: this.log,
|
|
361
|
+
});
|
|
355
362
|
|
|
356
363
|
// Try re-executing the transactions in the proposal if needed
|
|
357
364
|
let reexecutionResult;
|
|
@@ -854,11 +861,17 @@ export class ProposalHandler {
|
|
|
854
861
|
// Get L1-to-L2 messages for this checkpoint
|
|
855
862
|
const l1ToL2Messages = await this.l1ToL2MessageSource.getL1ToL2Messages(checkpointNumber);
|
|
856
863
|
|
|
857
|
-
// Collect the out hashes of all the checkpoints before this one in the same epoch
|
|
864
|
+
// Collect the out hashes of all the checkpoints before this one in the same epoch.
|
|
865
|
+
// See note on the analogous block-proposal site: the helper handles pipelining lag.
|
|
858
866
|
const epoch = getEpochAtSlot(slot, this.epochCache.getL1Constants());
|
|
859
|
-
const previousCheckpointOutHashes =
|
|
860
|
-
|
|
861
|
-
|
|
867
|
+
const previousCheckpointOutHashes = await getPreviousCheckpointOutHashes({
|
|
868
|
+
blockSource: this.blockSource,
|
|
869
|
+
epoch,
|
|
870
|
+
checkpointNumber,
|
|
871
|
+
l1Constants: this.epochCache.getL1Constants(),
|
|
872
|
+
pipeliningEnabled: this.epochCache.isProposerPipeliningEnabled(),
|
|
873
|
+
log: this.log,
|
|
874
|
+
});
|
|
862
875
|
|
|
863
876
|
// Fork world state at the block before the first block
|
|
864
877
|
const parentBlockNumber = BlockNumber(firstBlock.number - 1);
|
package/src/validator.ts
CHANGED
|
@@ -12,7 +12,13 @@ import { DateProvider } from '@aztec/foundation/timer';
|
|
|
12
12
|
import type { KeystoreManager } from '@aztec/node-keystore';
|
|
13
13
|
import type { DuplicateAttestationInfo, DuplicateProposalInfo, P2P, PeerId } from '@aztec/p2p';
|
|
14
14
|
import { AuthRequest, AuthResponse, BlockProposalValidator, ReqRespSubProtocol } from '@aztec/p2p';
|
|
15
|
-
import {
|
|
15
|
+
import {
|
|
16
|
+
OffenseType,
|
|
17
|
+
WANT_TO_CLEAR_SLASH_EVENT,
|
|
18
|
+
WANT_TO_SLASH_EVENT,
|
|
19
|
+
type Watcher,
|
|
20
|
+
type WatcherEmitter,
|
|
21
|
+
} from '@aztec/slasher';
|
|
16
22
|
import type { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
17
23
|
import type { CommitteeAttestationsAndSigners, L2BlockSink, L2BlockSource } from '@aztec/stdlib/block';
|
|
18
24
|
import { getEpochAtSlot } from '@aztec/stdlib/epoch-helpers';
|
|
@@ -58,6 +64,8 @@ import { type BlockProposalValidationFailureReason, ProposalHandler } from './pr
|
|
|
58
64
|
// We maintain a set of proposers who have proposed invalid blocks.
|
|
59
65
|
// Just cap the set to avoid unbounded growth.
|
|
60
66
|
const MAX_PROPOSERS_OF_INVALID_BLOCKS = 1000;
|
|
67
|
+
const MAX_TRACKED_INVALID_PROPOSAL_SLOTS = 1000;
|
|
68
|
+
const MAX_TRACKED_BAD_ATTESTATIONS = 10_000;
|
|
61
69
|
|
|
62
70
|
// What errors from the block proposal handler result in slashing
|
|
63
71
|
const SLASHABLE_BLOCK_PROPOSAL_VALIDATION_RESULT: BlockProposalValidationFailureReason[] = [
|
|
@@ -88,6 +96,9 @@ export class ValidatorClient extends (EventEmitter as new () => WatcherEmitter)
|
|
|
88
96
|
private lastAttestedEpochByAttester: Map<string, EpochNumber> = new Map();
|
|
89
97
|
|
|
90
98
|
private proposersOfInvalidBlocks: Set<string> = new Set();
|
|
99
|
+
private slotsWithInvalidBlockProposals: Set<string> = new Set();
|
|
100
|
+
private slotsWithProposalEquivocation: Set<string> = new Set();
|
|
101
|
+
private badAttestationOffenseKeys: Set<string> = new Set();
|
|
91
102
|
|
|
92
103
|
/** Tracks the last checkpoint proposal we attested to, to prevent equivocation. */
|
|
93
104
|
private lastAttestedProposal?: CheckpointProposalCore;
|
|
@@ -204,7 +215,7 @@ export class ValidatorClient extends (EventEmitter as new () => WatcherEmitter)
|
|
|
204
215
|
maxBlocksPerCheckpoint: config.maxBlocksPerCheckpoint,
|
|
205
216
|
signatureContext: {
|
|
206
217
|
chainId: config.l1ChainId,
|
|
207
|
-
rollupAddress: config.
|
|
218
|
+
rollupAddress: config.rollupAddress,
|
|
208
219
|
},
|
|
209
220
|
});
|
|
210
221
|
const proposalHandler = new ProposalHandler(
|
|
@@ -288,7 +299,7 @@ export class ValidatorClient extends (EventEmitter as new () => WatcherEmitter)
|
|
|
288
299
|
private getSignatureContext(): CoordinationSignatureContext {
|
|
289
300
|
return {
|
|
290
301
|
chainId: this.config.l1ChainId,
|
|
291
|
-
rollupAddress: this.config.
|
|
302
|
+
rollupAddress: this.config.rollupAddress,
|
|
292
303
|
};
|
|
293
304
|
}
|
|
294
305
|
|
|
@@ -374,6 +385,10 @@ export class ValidatorClient extends (EventEmitter as new () => WatcherEmitter)
|
|
|
374
385
|
this.handleDuplicateAttestation(info);
|
|
375
386
|
});
|
|
376
387
|
|
|
388
|
+
this.p2pClient.registerCheckpointAttestationCallback((attestation: CheckpointAttestation) => {
|
|
389
|
+
this.handleCheckpointAttestation(attestation);
|
|
390
|
+
});
|
|
391
|
+
|
|
377
392
|
const myAddresses = this.getValidatorAddresses();
|
|
378
393
|
this.p2pClient.registerThisValidatorAddresses(myAddresses);
|
|
379
394
|
|
|
@@ -422,10 +437,16 @@ export class ValidatorClient extends (EventEmitter as new () => WatcherEmitter)
|
|
|
422
437
|
|
|
423
438
|
// Reexecute txs if we are part of the committee, or if slashing is enabled, or if we are configured to always reexecute.
|
|
424
439
|
// In fisherman mode, we always reexecute to validate proposals.
|
|
425
|
-
const {
|
|
440
|
+
const {
|
|
441
|
+
slashBroadcastedInvalidBlockPenalty,
|
|
442
|
+
slashAttestInvalidCheckpointProposalPenalty,
|
|
443
|
+
alwaysReexecuteBlockProposals,
|
|
444
|
+
fishermanMode,
|
|
445
|
+
} = this.config;
|
|
426
446
|
const shouldReexecute =
|
|
427
447
|
fishermanMode ||
|
|
428
448
|
slashBroadcastedInvalidBlockPenalty > 0n ||
|
|
449
|
+
slashAttestInvalidCheckpointProposalPenalty > 0n ||
|
|
429
450
|
partOfCommittee ||
|
|
430
451
|
alwaysReexecuteBlockProposals ||
|
|
431
452
|
this.blobClient.canUpload();
|
|
@@ -457,15 +478,18 @@ export class ValidatorClient extends (EventEmitter as new () => WatcherEmitter)
|
|
|
457
478
|
this.metrics.incFailedAttestationsNodeIssue(1, reason, partOfCommittee);
|
|
458
479
|
}
|
|
459
480
|
|
|
460
|
-
// Slash invalid block proposals (can happen even when not in committee)
|
|
461
481
|
if (
|
|
462
482
|
!escapeHatchOpen &&
|
|
463
483
|
validationResult.reason &&
|
|
464
|
-
SLASHABLE_BLOCK_PROPOSAL_VALIDATION_RESULT.includes(validationResult.reason)
|
|
465
|
-
slashBroadcastedInvalidBlockPenalty > 0n
|
|
484
|
+
SLASHABLE_BLOCK_PROPOSAL_VALIDATION_RESULT.includes(validationResult.reason)
|
|
466
485
|
) {
|
|
467
|
-
|
|
468
|
-
|
|
486
|
+
if (slashBroadcastedInvalidBlockPenalty > 0n) {
|
|
487
|
+
this.log.warn(`Slashing proposer for invalid block proposal`, proposalInfo);
|
|
488
|
+
this.slashInvalidBlock(proposal);
|
|
489
|
+
}
|
|
490
|
+
if (slashAttestInvalidCheckpointProposalPenalty > 0n) {
|
|
491
|
+
this.markInvalidProposalSlot(proposal.slotNumber);
|
|
492
|
+
}
|
|
469
493
|
}
|
|
470
494
|
return false;
|
|
471
495
|
}
|
|
@@ -696,12 +720,63 @@ export class ValidatorClient extends (EventEmitter as new () => WatcherEmitter)
|
|
|
696
720
|
]);
|
|
697
721
|
}
|
|
698
722
|
|
|
723
|
+
private markInvalidProposalSlot(slotNumber: SlotNumber): void {
|
|
724
|
+
const slotKey = this.getSlotKey(slotNumber);
|
|
725
|
+
this.addToBoundedSet(this.slotsWithInvalidBlockProposals, slotKey, MAX_TRACKED_INVALID_PROPOSAL_SLOTS);
|
|
726
|
+
}
|
|
727
|
+
|
|
728
|
+
private handleCheckpointAttestation(attestation: CheckpointAttestation): void {
|
|
729
|
+
const slotNumber = attestation.slotNumber;
|
|
730
|
+
const slotKey = this.getSlotKey(slotNumber);
|
|
731
|
+
if (!this.slotsWithInvalidBlockProposals.has(slotKey) || this.slotsWithProposalEquivocation.has(slotKey)) {
|
|
732
|
+
return;
|
|
733
|
+
}
|
|
734
|
+
|
|
735
|
+
const attester = attestation.getSender();
|
|
736
|
+
if (!attester) {
|
|
737
|
+
this.log.warn(`Cannot slash checkpoint attestation with invalid signature`, {
|
|
738
|
+
slotNumber,
|
|
739
|
+
archive: attestation.archive.toString(),
|
|
740
|
+
});
|
|
741
|
+
return;
|
|
742
|
+
}
|
|
743
|
+
|
|
744
|
+
this.slashAttestedToInvalidCheckpointProposal(slotNumber, attester);
|
|
745
|
+
}
|
|
746
|
+
|
|
747
|
+
private slashAttestedToInvalidCheckpointProposal(slotNumber: SlotNumber, attester: EthAddress): void {
|
|
748
|
+
if (this.config.slashAttestInvalidCheckpointProposalPenalty <= 0n) {
|
|
749
|
+
return;
|
|
750
|
+
}
|
|
751
|
+
|
|
752
|
+
const offenseKey = `${this.getSlotKey(slotNumber)}:${attester.toString()}`;
|
|
753
|
+
if (!this.addToBoundedSet(this.badAttestationOffenseKeys, offenseKey, MAX_TRACKED_BAD_ATTESTATIONS)) {
|
|
754
|
+
return;
|
|
755
|
+
}
|
|
756
|
+
|
|
757
|
+
this.log.warn(`Slashing attester for attesting to invalid checkpoint proposal`, {
|
|
758
|
+
attester: attester.toString(),
|
|
759
|
+
slotNumber,
|
|
760
|
+
});
|
|
761
|
+
|
|
762
|
+
this.emit(WANT_TO_SLASH_EVENT, [
|
|
763
|
+
{
|
|
764
|
+
validator: attester,
|
|
765
|
+
amount: this.config.slashAttestInvalidCheckpointProposalPenalty,
|
|
766
|
+
offenseType: OffenseType.ATTESTED_TO_INVALID_CHECKPOINT_PROPOSAL,
|
|
767
|
+
epochOrSlot: BigInt(slotNumber),
|
|
768
|
+
},
|
|
769
|
+
]);
|
|
770
|
+
}
|
|
771
|
+
|
|
699
772
|
/**
|
|
700
773
|
* Handle detection of a duplicate proposal (equivocation).
|
|
701
774
|
* Emits a slash event when a proposer sends multiple proposals for the same position.
|
|
702
775
|
*/
|
|
703
776
|
private handleDuplicateProposal(info: DuplicateProposalInfo): void {
|
|
704
777
|
const { slot, proposer, type } = info;
|
|
778
|
+
const slotKey = this.getSlotKey(slot);
|
|
779
|
+
this.addToBoundedSet(this.slotsWithProposalEquivocation, slotKey, MAX_TRACKED_INVALID_PROPOSAL_SLOTS);
|
|
705
780
|
|
|
706
781
|
this.log.warn(`Triggering slash event for duplicate ${type} proposal from ${proposer.toString()} at slot ${slot}`, {
|
|
707
782
|
proposer: proposer.toString(),
|
|
@@ -718,6 +793,13 @@ export class ValidatorClient extends (EventEmitter as new () => WatcherEmitter)
|
|
|
718
793
|
epochOrSlot: BigInt(slot),
|
|
719
794
|
},
|
|
720
795
|
]);
|
|
796
|
+
|
|
797
|
+
this.emit(WANT_TO_CLEAR_SLASH_EVENT, [
|
|
798
|
+
{
|
|
799
|
+
offenseType: OffenseType.ATTESTED_TO_INVALID_CHECKPOINT_PROPOSAL,
|
|
800
|
+
epochOrSlot: BigInt(slot),
|
|
801
|
+
},
|
|
802
|
+
]);
|
|
721
803
|
}
|
|
722
804
|
|
|
723
805
|
/**
|
|
@@ -742,6 +824,21 @@ export class ValidatorClient extends (EventEmitter as new () => WatcherEmitter)
|
|
|
742
824
|
]);
|
|
743
825
|
}
|
|
744
826
|
|
|
827
|
+
private getSlotKey(slot: SlotNumber): string {
|
|
828
|
+
return slot.toString();
|
|
829
|
+
}
|
|
830
|
+
|
|
831
|
+
private addToBoundedSet(set: Set<string>, value: string, maxSize: number): boolean {
|
|
832
|
+
if (set.has(value)) {
|
|
833
|
+
return false;
|
|
834
|
+
}
|
|
835
|
+
if (set.size >= maxSize) {
|
|
836
|
+
set.delete(set.values().next().value!);
|
|
837
|
+
}
|
|
838
|
+
set.add(value);
|
|
839
|
+
return true;
|
|
840
|
+
}
|
|
841
|
+
|
|
745
842
|
async createBlockProposal(
|
|
746
843
|
blockHeader: BlockHeader,
|
|
747
844
|
checkpointNumber: CheckpointNumber,
|