@aztec-labs/slasher 6.0.0-nightly.20261007 → 6.0.0-rc.2
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/slasher_client.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { EpochCache } from '@aztec-labs/epoch-cache';
|
|
2
2
|
import { RollupContract, SlasherContract, SlashingProposerContract } from '@aztec-labs/ethereum/contracts';
|
|
3
|
+
import { AmsterdamForkDetector } from '@aztec-labs/ethereum/l1-tx-utils';
|
|
3
4
|
import { SlotNumber } from '@aztec-labs/foundation/branded-types';
|
|
4
5
|
import { EthAddress } from '@aztec-labs/foundation/eth-address';
|
|
5
6
|
import type { DateProvider } from '@aztec-labs/foundation/timer';
|
|
@@ -64,11 +65,12 @@ export declare class SlasherClient implements ProposerSlashActionProvider, Slash
|
|
|
64
65
|
private readonly ownValidators;
|
|
65
66
|
private log;
|
|
66
67
|
private readonly metrics;
|
|
68
|
+
private readonly amsterdamFork;
|
|
67
69
|
protected unwatchCallbacks: (() => void)[];
|
|
68
70
|
protected roundMonitor: SlashRoundMonitor;
|
|
69
71
|
protected offensesCollector: SlashOffensesCollector;
|
|
70
72
|
protected readonly ownValidatorMonitor: OwnValidatorSlashMonitor;
|
|
71
|
-
constructor(config: SlasherClientConfig, settings: SlasherSettings, slashingProposer: SlashingProposerContract, slasher: SlasherContract, rollup: RollupContract, watchers: Watcher[], epochCache: EpochCache, dateProvider: DateProvider, offensesStore: SlasherOffensesStore, ownValidators?: EthAddress[], log?: import("@aztec-labs/foundation/log").Logger, metrics?: SlasherMetrics);
|
|
73
|
+
constructor(config: SlasherClientConfig, settings: SlasherSettings, slashingProposer: SlashingProposerContract, slasher: SlasherContract, rollup: RollupContract, watchers: Watcher[], epochCache: EpochCache, dateProvider: DateProvider, offensesStore: SlasherOffensesStore, ownValidators?: EthAddress[], log?: import("@aztec-labs/foundation/log").Logger, metrics?: SlasherMetrics, amsterdamFork?: Pick<AmsterdamForkDetector, 'isActive'>);
|
|
72
74
|
start(): Promise<void>;
|
|
73
75
|
/** Stop the slasher client */
|
|
74
76
|
stop(): Promise<void>;
|
|
@@ -94,6 +96,7 @@ export declare class SlasherClient implements ProposerSlashActionProvider, Slash
|
|
|
94
96
|
private tryGetRoundExecuteAction;
|
|
95
97
|
/** Returns a vote action based on offenses from the target round (with offset applied) */
|
|
96
98
|
protected getVoteOffensesAction(slotNumber: SlotNumber): Promise<ProposerSlashAction | undefined>;
|
|
99
|
+
private getMaxSlashedValidators;
|
|
97
100
|
/** Returns the committees that were active during the timespan of a given round */
|
|
98
101
|
private collectCommitteesActiveDuringRound;
|
|
99
102
|
/**
|
|
@@ -115,4 +118,4 @@ export declare class SlasherClient implements ProposerSlashActionProvider, Slash
|
|
|
115
118
|
*/
|
|
116
119
|
private getSlashedRound;
|
|
117
120
|
}
|
|
118
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
121
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xhc2hlcl9jbGllbnQuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9zbGFzaGVyX2NsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxVQUFVLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsY0FBYyxFQUFFLGVBQWUsRUFBRSx3QkFBd0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQzNHLE9BQU8sRUFBOEMscUJBQXFCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUVySCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFFbEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBRWhFLE9BQU8sS0FBSyxFQUFFLFlBQVksRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2pFLE9BQU8sS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzdELE9BQU8sS0FBSyxFQUFFLGFBQWEsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQzFFLE9BQU8sRUFDTCxLQUFLLE9BQU8sRUFFWixLQUFLLG1CQUFtQixFQUN4QixLQUFLLDJCQUEyQixFQUlqQyxNQUFNLDZCQUE2QixDQUFDO0FBRXJDLE9BQU8sS0FBSyxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUVoQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzlDLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQzVFLE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsS0FBSyw0QkFBNEIsRUFDakMsS0FBSyw4QkFBOEIsRUFDcEMsTUFBTSwrQkFBK0IsQ0FBQztBQUN2QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsS0FBSyx5QkFBeUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzdGLE9BQU8sS0FBSyxFQUFFLHNCQUFzQixFQUFF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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slasher_client.d.ts","sourceRoot":"","sources":["../src/slasher_client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,wBAAwB,EAAE,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"slasher_client.d.ts","sourceRoot":"","sources":["../src/slasher_client.ts"],"names":[],"mappings":"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"}
|
package/dest/slasher_client.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { AMSTERDAM_MAX_SLASHED_VALIDATORS_PER_ROUND, AmsterdamForkDetector } from '@aztec-labs/ethereum/l1-tx-utils';
|
|
1
2
|
import { maxBigint } from '@aztec-labs/foundation/bigint';
|
|
2
3
|
import { compactArray, partition, times } from '@aztec-labs/foundation/collection';
|
|
3
4
|
import { EthAddress } from '@aztec-labs/foundation/eth-address';
|
|
@@ -45,11 +46,15 @@ import { SlashRoundMonitor } from './slash_round_monitor.js';
|
|
|
45
46
|
ownValidators;
|
|
46
47
|
log;
|
|
47
48
|
metrics;
|
|
49
|
+
amsterdamFork;
|
|
48
50
|
unwatchCallbacks;
|
|
49
51
|
roundMonitor;
|
|
50
52
|
offensesCollector;
|
|
51
53
|
ownValidatorMonitor;
|
|
52
|
-
constructor(config, settings, slashingProposer, slasher, rollup, watchers, epochCache, dateProvider, offensesStore, ownValidators = [], log = createLogger('slasher:consensus'), metrics = new SlasherMetrics(getTelemetryClient())
|
|
54
|
+
constructor(config, settings, slashingProposer, slasher, rollup, watchers, epochCache, dateProvider, offensesStore, ownValidators = [], log = createLogger('slasher:consensus'), metrics = new SlasherMetrics(getTelemetryClient()), amsterdamFork = new AmsterdamForkDetector(rollup.client, {
|
|
55
|
+
dateProvider,
|
|
56
|
+
log
|
|
57
|
+
})){
|
|
53
58
|
this.config = config;
|
|
54
59
|
this.settings = settings;
|
|
55
60
|
this.slashingProposer = slashingProposer;
|
|
@@ -61,6 +66,7 @@ import { SlashRoundMonitor } from './slash_round_monitor.js';
|
|
|
61
66
|
this.ownValidators = ownValidators;
|
|
62
67
|
this.log = log;
|
|
63
68
|
this.metrics = metrics;
|
|
69
|
+
this.amsterdamFork = amsterdamFork;
|
|
64
70
|
this.unwatchCallbacks = [];
|
|
65
71
|
this.roundMonitor = new SlashRoundMonitor(settings, dateProvider);
|
|
66
72
|
this.offensesCollector = new SlashOffensesCollector(config, settings, watchers, offensesStore);
|
|
@@ -299,10 +305,10 @@ import { SlashRoundMonitor } from './slash_round_monitor.js';
|
|
|
299
305
|
});
|
|
300
306
|
const committees = await this.collectCommitteesActiveDuringRound(slashedRound);
|
|
301
307
|
const epochsForCommittees = getEpochsForRound(slashedRound, this.settings);
|
|
302
|
-
const
|
|
308
|
+
const maxSlashedValidators = await this.getMaxSlashedValidators();
|
|
303
309
|
const votes = getSlashConsensusVotesFromOffenses(offensesToSlash, committees, epochsForCommittees.map((e)=>BigInt(e)), {
|
|
304
310
|
...this.settings,
|
|
305
|
-
maxSlashedValidators
|
|
311
|
+
maxSlashedValidators
|
|
306
312
|
}, this.log);
|
|
307
313
|
if (votes.every((v)=>v === 0)) {
|
|
308
314
|
this.log.warn(`Computed votes for offenses are all zero. Skipping vote.`, {
|
|
@@ -335,6 +341,19 @@ import { SlashRoundMonitor } from './slash_round_monitor.js';
|
|
|
335
341
|
committees
|
|
336
342
|
};
|
|
337
343
|
}
|
|
344
|
+
/**
|
|
345
|
+
* Returns how many validators we vote to slash at most in a round: the configured payload size, further capped once
|
|
346
|
+
* Amsterdam is active so the round still fits in an L1 tx when executed. If the fork cannot be detected, the cap
|
|
347
|
+
* applies, since a smaller vote is harmless while one too large for the round to execute is not.
|
|
348
|
+
*/ async getMaxSlashedValidators() {
|
|
349
|
+
const { slashMaxPayloadSize } = this.config;
|
|
350
|
+
if (!await this.amsterdamFork.isActive({
|
|
351
|
+
assumeActiveOnError: true
|
|
352
|
+
})) {
|
|
353
|
+
return slashMaxPayloadSize;
|
|
354
|
+
}
|
|
355
|
+
return Math.min(slashMaxPayloadSize, AMSTERDAM_MAX_SLASHED_VALIDATORS_PER_ROUND);
|
|
356
|
+
}
|
|
338
357
|
/** Returns the committees that were active during the timespan of a given round */ collectCommitteesActiveDuringRound(round) {
|
|
339
358
|
const epochsToSlash = getEpochsForRound(round, this.settings);
|
|
340
359
|
const emptyCommittee = times(Number(this.settings.targetCommitteeSize), ()=>EthAddress.ZERO);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec-labs/slasher",
|
|
3
|
-
"version": "6.0.0-
|
|
3
|
+
"version": "6.0.0-rc.2",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": "./dest/index.js",
|
|
@@ -56,12 +56,12 @@
|
|
|
56
56
|
]
|
|
57
57
|
},
|
|
58
58
|
"dependencies": {
|
|
59
|
-
"@aztec-labs/epoch-cache": "6.0.0-
|
|
60
|
-
"@aztec-labs/ethereum": "6.0.0-
|
|
61
|
-
"@aztec-labs/foundation": "6.0.0-
|
|
62
|
-
"@aztec-labs/kv-store": "6.0.0-
|
|
63
|
-
"@aztec-labs/stdlib": "6.0.0-
|
|
64
|
-
"@aztec-labs/telemetry-client": "6.0.0-
|
|
59
|
+
"@aztec-labs/epoch-cache": "6.0.0-rc.2",
|
|
60
|
+
"@aztec-labs/ethereum": "6.0.0-rc.2",
|
|
61
|
+
"@aztec-labs/foundation": "6.0.0-rc.2",
|
|
62
|
+
"@aztec-labs/kv-store": "6.0.0-rc.2",
|
|
63
|
+
"@aztec-labs/stdlib": "6.0.0-rc.2",
|
|
64
|
+
"@aztec-labs/telemetry-client": "6.0.0-rc.2",
|
|
65
65
|
"source-map-support": "^0.5.21",
|
|
66
66
|
"tslib": "^2.4.0",
|
|
67
67
|
"viem": "npm:@aztec/viem@2.38.3",
|
package/src/slasher_client.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { EpochCache } from '@aztec-labs/epoch-cache';
|
|
2
2
|
import { RollupContract, SlasherContract, SlashingProposerContract } from '@aztec-labs/ethereum/contracts';
|
|
3
|
+
import { AMSTERDAM_MAX_SLASHED_VALIDATORS_PER_ROUND, AmsterdamForkDetector } from '@aztec-labs/ethereum/l1-tx-utils';
|
|
3
4
|
import { maxBigint } from '@aztec-labs/foundation/bigint';
|
|
4
5
|
import { SlotNumber } from '@aztec-labs/foundation/branded-types';
|
|
5
6
|
import { compactArray, partition, times } from '@aztec-labs/foundation/collection';
|
|
@@ -106,6 +107,10 @@ export class SlasherClient implements ProposerSlashActionProvider, SlasherClient
|
|
|
106
107
|
private readonly ownValidators: EthAddress[] = [],
|
|
107
108
|
private log = createLogger('slasher:consensus'),
|
|
108
109
|
private readonly metrics = new SlasherMetrics(getTelemetryClient()),
|
|
110
|
+
private readonly amsterdamFork: Pick<AmsterdamForkDetector, 'isActive'> = new AmsterdamForkDetector(rollup.client, {
|
|
111
|
+
dateProvider,
|
|
112
|
+
log,
|
|
113
|
+
}),
|
|
109
114
|
) {
|
|
110
115
|
this.roundMonitor = new SlashRoundMonitor(settings, dateProvider);
|
|
111
116
|
this.offensesCollector = new SlashOffensesCollector(config, settings, watchers, offensesStore);
|
|
@@ -385,12 +390,12 @@ export class SlasherClient implements ProposerSlashActionProvider, SlasherClient
|
|
|
385
390
|
|
|
386
391
|
const committees = await this.collectCommitteesActiveDuringRound(slashedRound);
|
|
387
392
|
const epochsForCommittees = getEpochsForRound(slashedRound, this.settings);
|
|
388
|
-
const
|
|
393
|
+
const maxSlashedValidators = await this.getMaxSlashedValidators();
|
|
389
394
|
const votes = getSlashConsensusVotesFromOffenses(
|
|
390
395
|
offensesToSlash,
|
|
391
396
|
committees,
|
|
392
397
|
epochsForCommittees.map(e => BigInt(e)),
|
|
393
|
-
{ ...this.settings, maxSlashedValidators
|
|
398
|
+
{ ...this.settings, maxSlashedValidators },
|
|
394
399
|
this.log,
|
|
395
400
|
);
|
|
396
401
|
if (votes.every(v => v === 0)) {
|
|
@@ -428,6 +433,19 @@ export class SlasherClient implements ProposerSlashActionProvider, SlasherClient
|
|
|
428
433
|
};
|
|
429
434
|
}
|
|
430
435
|
|
|
436
|
+
/**
|
|
437
|
+
* Returns how many validators we vote to slash at most in a round: the configured payload size, further capped once
|
|
438
|
+
* Amsterdam is active so the round still fits in an L1 tx when executed. If the fork cannot be detected, the cap
|
|
439
|
+
* applies, since a smaller vote is harmless while one too large for the round to execute is not.
|
|
440
|
+
*/
|
|
441
|
+
private async getMaxSlashedValidators(): Promise<number> {
|
|
442
|
+
const { slashMaxPayloadSize } = this.config;
|
|
443
|
+
if (!(await this.amsterdamFork.isActive({ assumeActiveOnError: true }))) {
|
|
444
|
+
return slashMaxPayloadSize;
|
|
445
|
+
}
|
|
446
|
+
return Math.min(slashMaxPayloadSize, AMSTERDAM_MAX_SLASHED_VALIDATORS_PER_ROUND);
|
|
447
|
+
}
|
|
448
|
+
|
|
431
449
|
/** Returns the committees that were active during the timespan of a given round */
|
|
432
450
|
private collectCommitteesActiveDuringRound(round: bigint): Promise<EthAddress[][]> {
|
|
433
451
|
const epochsToSlash = getEpochsForRound(round, this.settings);
|