@aztec-labs/slasher 6.0.0-rc.1 → 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 +5 -2
- package/dest/slasher_client.d.ts.map +1 -1
- package/dest/slasher_client.js +22 -3
- package/dest/watchers/data_withholding_watcher.d.ts +1 -1
- package/dest/watchers/data_withholding_watcher.d.ts.map +1 -1
- package/dest/watchers/data_withholding_watcher.js +15 -15
- package/package.json +7 -7
- package/src/slasher_client.ts +20 -2
- package/src/watchers/data_withholding_watcher.ts +17 -16
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);
|
|
@@ -66,4 +66,4 @@ export declare class DataWithholdingWatcher extends DataWithholdingWatcher_base
|
|
|
66
66
|
protected extractAttesters(published: PublishedCheckpoint): Promise<EthAddress[]>;
|
|
67
67
|
}
|
|
68
68
|
export {};
|
|
69
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
69
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YV93aXRoaG9sZGluZ193YXRjaGVyLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvd2F0Y2hlcnMvZGF0YV93aXRoaG9sZGluZ193YXRjaGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLFVBQVUsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRzFELE9BQU8sS0FBSyxFQUFFLFVBQVUsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxLQUFLLE1BQU0sRUFBZ0IsTUFBTSw0QkFBNEIsQ0FBQztBQUV2RSxPQUFPLEtBQUssRUFBRSxhQUFhLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUU5RCxPQUFPLEtBQUssRUFBRSw0QkFBNEIsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ3ZHLE9BQU8sS0FBSyxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDL0YsT0FBTyxFQUFvQixLQUFLLDRCQUE0QixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFLN0YsT0FBTyxFQUE2QyxLQUFLLE9BQU8sRUFBRSxLQUFLLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUU3RyxRQUFBLE1BQU0sZ0NBQWdDLGdGQUFpRixDQUFDO0FBRXhILEtBQUssNEJBQTRCLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLE9BQU8sZ0NBQWdDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDOztBQUUzRzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBQ0gscUJBQWEsc0JBQXVCLFNBQVEsMkJBQTJDLFlBQVcsT0FBTztJQVFyRyxPQUFPLENBQUMsUUFBUSxDQUFDLFVBQVU7SUFDM0IsT0FBTyxDQUFDLFFBQVEsQ0FBQyxhQUFhO0lBQzlCLE9BQU8sQ0FBQyxRQUFRLENBQUMsVUFBVTtJQUMzQixPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUc7SUFDcEIsT0FBTyxDQUFDLFFBQVEsQ0FBQyxrQkFBa0I7SUFDbkMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0I7SUFFakMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHO0lBZHRCLE9BQU8sQ0FBQyxjQUFjLENBQWlCO0lBQ3ZDLE9BQU8sQ0FBQyxXQUFXLENBQXlCO0lBQzVDLE9BQU8sQ0FBQyxlQUFlLENBQXlCO0lBQ2hELE9BQU8sQ0FBQyxNQUFNLENBQStCO0lBQzdDLE9BQU8sQ0FBQyxjQUFjLENBQVM7SUFFL0IsWUFDbUIsVUFBVSxFQUFFLFVBQVUsRUFDdEIsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsZUFBZSxHQUFHLHVCQUF1QixDQUFDLEVBQzdFLFVBQVUsRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxFQUN2QyxHQUFHLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxrQ0FBa0MsR0FBRyxvQkFBb0IsQ0FBQyxFQUM1RSxrQkFBa0IsRUFBRSxJQUFJLENBQUMsNEJBQTRCLEVBQUUsdUJBQXVCLENBQUMsRUFDL0UsZ0JBQWdCLEVBQUUsNEJBQTRCLEVBQy9ELE1BQU0sRUFBRSw0QkFBNEIsRUFDbkIsR0FBRyxHQUFFLE1BQWlELEVBT3hFO0lBRVksS0FBSyxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FRbEM7SUFFTSxJQUFJLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxDQUUzQjtJQUVNLFlBQVksQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLGFBQWEsQ0FBQyxHQUFHLElBQUksQ0FHeEQ7SUFFRDs7O09BR0c7SUFDVSxJQUFJLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxDQXlEakM7WUFHYSxXQUFXO0lBNkV6Qjs7Ozs7Ozs7Ozs7T0FXRztJQUNILFVBQWdCLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxtQkFBbUIsR0FBRyxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FtQnRGO0NBQ0YifQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data_withholding_watcher.d.ts","sourceRoot":"","sources":["../../src/watchers/data_withholding_watcher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAG1D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAC;AACrE,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,4BAA4B,CAAC;AAEvE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAE9D,OAAO,KAAK,EAAE,4BAA4B,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACvG,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAC;AAC/F,OAAO,EAAoB,KAAK,4BAA4B,EAAE,MAAM,wBAAwB,CAAC;AAK7F,OAAO,EAA6C,KAAK,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,eAAe,CAAC;AAE7G,QAAA,MAAM,gCAAgC,gFAAiF,CAAC;AAExH,KAAK,4BAA4B,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC,OAAO,gCAAgC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;;AAE3G;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,sBAAuB,SAAQ,2BAA2C,YAAW,OAAO;IAQrG,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,kBAAkB;IACnC,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IAEjC,OAAO,CAAC,QAAQ,CAAC,GAAG;IAdtB,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,WAAW,CAAyB;IAC5C,OAAO,CAAC,eAAe,CAAyB;IAChD,OAAO,CAAC,MAAM,CAA+B;IAC7C,OAAO,CAAC,cAAc,CAAS;IAE/B,YACmB,UAAU,EAAE,UAAU,EACtB,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE,eAAe,GAAG,uBAAuB,CAAC,EAC7E,UAAU,EAAE,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,EACvC,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,kCAAkC,GAAG,oBAAoB,CAAC,EAC5E,kBAAkB,EAAE,IAAI,CAAC,4BAA4B,EAAE,uBAAuB,CAAC,EAC/E,gBAAgB,EAAE,4BAA4B,EAC/D,MAAM,EAAE,4BAA4B,EACnB,GAAG,GAAE,MAAiD,EAOxE;IAEY,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAQlC;IAEM,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAE3B;IAEM,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,IAAI,CAGxD;IAED;;;OAGG;IACU,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"data_withholding_watcher.d.ts","sourceRoot":"","sources":["../../src/watchers/data_withholding_watcher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAG1D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAC;AACrE,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,4BAA4B,CAAC;AAEvE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAE9D,OAAO,KAAK,EAAE,4BAA4B,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACvG,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAC;AAC/F,OAAO,EAAoB,KAAK,4BAA4B,EAAE,MAAM,wBAAwB,CAAC;AAK7F,OAAO,EAA6C,KAAK,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,eAAe,CAAC;AAE7G,QAAA,MAAM,gCAAgC,gFAAiF,CAAC;AAExH,KAAK,4BAA4B,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC,OAAO,gCAAgC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;;AAE3G;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,sBAAuB,SAAQ,2BAA2C,YAAW,OAAO;IAQrG,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,kBAAkB;IACnC,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IAEjC,OAAO,CAAC,QAAQ,CAAC,GAAG;IAdtB,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,WAAW,CAAyB;IAC5C,OAAO,CAAC,eAAe,CAAyB;IAChD,OAAO,CAAC,MAAM,CAA+B;IAC7C,OAAO,CAAC,cAAc,CAAS;IAE/B,YACmB,UAAU,EAAE,UAAU,EACtB,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE,eAAe,GAAG,uBAAuB,CAAC,EAC7E,UAAU,EAAE,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,EACvC,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,kCAAkC,GAAG,oBAAoB,CAAC,EAC5E,kBAAkB,EAAE,IAAI,CAAC,4BAA4B,EAAE,uBAAuB,CAAC,EAC/E,gBAAgB,EAAE,4BAA4B,EAC/D,MAAM,EAAE,4BAA4B,EACnB,GAAG,GAAE,MAAiD,EAOxE;IAEY,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAQlC;IAEM,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAE3B;IAEM,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,IAAI,CAGxD;IAED;;;OAGG;IACU,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAyDjC;YAGa,WAAW;IA6EzB;;;;;;;;;;;OAWG;IACH,UAAgB,gBAAgB,CAAC,SAAS,EAAE,mBAAmB,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAmBtF;CACF"}
|
|
@@ -79,37 +79,37 @@ const DataWithholdingWatcherConfigKeys = [
|
|
|
79
79
|
// fully ingested yet (archiver may lag behind L1).
|
|
80
80
|
const tolerance = this.config.slashDataWithholdingToleranceSlots;
|
|
81
81
|
const currentSlot = await this.l2BlockSource.getSyncedL2SlotNumber() ?? this.epochCache.getSlotNow();
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
}
|
|
85
|
-
const targetSlot = SlotNumber(currentSlot - tolerance - 1);
|
|
86
|
-
if (targetSlot <= this.initialSlot) {
|
|
87
|
-
return;
|
|
88
|
-
}
|
|
89
|
-
// Missing txs are only evidence of withholding if we could have received them. Slots probed
|
|
90
|
-
// while gossip is down are skipped for good rather than deferred: once peers return, txs from
|
|
91
|
-
// those checkpoints may already have been evicted from the pool as mined, so a late probe would
|
|
92
|
-
// still report them missing. An unknown must not turn into an offense. Note this deliberately
|
|
93
|
-
// ignores whether p2p is enabled: a node with no p2p stack sees even less than a peerless one.
|
|
82
|
+
// Bound outages by wallclock time too: the archiver may be stalled while peers are disconnected.
|
|
83
|
+
// Keep the cursor monotonic across sync rollbacks and include startup and tolerance windows.
|
|
94
84
|
const connectivity = await this.p2p.getP2PConnectivity();
|
|
95
85
|
if (connectivity.connectedPeers === 0) {
|
|
86
|
+
const outageSlot = SlotNumber(Math.max(currentSlot, this.epochCache.getSlotNow()));
|
|
96
87
|
if (!this.gossipDegraded) {
|
|
97
88
|
this.gossipDegraded = true;
|
|
98
89
|
this.log.warn(`Skipping data-withholding checks while no peers are connected`, {
|
|
99
|
-
|
|
90
|
+
currentSlot,
|
|
100
91
|
lastCheckedSlot: this.lastCheckedSlot
|
|
101
92
|
});
|
|
102
93
|
}
|
|
103
|
-
this.lastCheckedSlot
|
|
94
|
+
if (this.lastCheckedSlot === undefined || outageSlot > this.lastCheckedSlot) {
|
|
95
|
+
this.lastCheckedSlot = outageSlot;
|
|
96
|
+
}
|
|
104
97
|
return;
|
|
105
98
|
}
|
|
106
99
|
if (this.gossipDegraded) {
|
|
107
100
|
this.gossipDegraded = false;
|
|
108
101
|
this.log.info(`Resuming data-withholding checks now that peers are connected`, {
|
|
109
|
-
|
|
102
|
+
currentSlot,
|
|
110
103
|
connectedPeers: connectivity.connectedPeers
|
|
111
104
|
});
|
|
112
105
|
}
|
|
106
|
+
if (currentSlot <= tolerance) {
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
const targetSlot = SlotNumber(currentSlot - tolerance - 1);
|
|
110
|
+
if (targetSlot <= this.initialSlot) {
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
113
|
const startSlot = this.lastCheckedSlot === undefined ? this.initialSlot : this.lastCheckedSlot;
|
|
114
114
|
for(let slot = SlotNumber(startSlot + 1); slot <= targetSlot; slot = SlotNumber(slot + 1)){
|
|
115
115
|
try {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec-labs/slasher",
|
|
3
|
-
"version": "6.0.0-rc.
|
|
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-rc.
|
|
60
|
-
"@aztec-labs/ethereum": "6.0.0-rc.
|
|
61
|
-
"@aztec-labs/foundation": "6.0.0-rc.
|
|
62
|
-
"@aztec-labs/kv-store": "6.0.0-rc.
|
|
63
|
-
"@aztec-labs/stdlib": "6.0.0-rc.
|
|
64
|
-
"@aztec-labs/telemetry-client": "6.0.0-rc.
|
|
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);
|
|
@@ -97,41 +97,42 @@ export class DataWithholdingWatcher extends (EventEmitter as new () => WatcherEm
|
|
|
97
97
|
// fully ingested yet (archiver may lag behind L1).
|
|
98
98
|
const tolerance = this.config.slashDataWithholdingToleranceSlots;
|
|
99
99
|
const currentSlot = (await this.l2BlockSource.getSyncedL2SlotNumber()) ?? this.epochCache.getSlotNow();
|
|
100
|
-
if (currentSlot <= tolerance) {
|
|
101
|
-
return;
|
|
102
|
-
}
|
|
103
100
|
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
return;
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
// Missing txs are only evidence of withholding if we could have received them. Slots probed
|
|
110
|
-
// while gossip is down are skipped for good rather than deferred: once peers return, txs from
|
|
111
|
-
// those checkpoints may already have been evicted from the pool as mined, so a late probe would
|
|
112
|
-
// still report them missing. An unknown must not turn into an offense. Note this deliberately
|
|
113
|
-
// ignores whether p2p is enabled: a node with no p2p stack sees even less than a peerless one.
|
|
101
|
+
// Bound outages by wallclock time too: the archiver may be stalled while peers are disconnected.
|
|
102
|
+
// Keep the cursor monotonic across sync rollbacks and include startup and tolerance windows.
|
|
114
103
|
const connectivity = await this.p2p.getP2PConnectivity();
|
|
115
104
|
if (connectivity.connectedPeers === 0) {
|
|
105
|
+
const outageSlot = SlotNumber(Math.max(currentSlot, this.epochCache.getSlotNow()));
|
|
116
106
|
if (!this.gossipDegraded) {
|
|
117
107
|
this.gossipDegraded = true;
|
|
118
108
|
this.log.warn(`Skipping data-withholding checks while no peers are connected`, {
|
|
119
|
-
|
|
109
|
+
currentSlot,
|
|
120
110
|
lastCheckedSlot: this.lastCheckedSlot,
|
|
121
111
|
});
|
|
122
112
|
}
|
|
123
|
-
this.lastCheckedSlot
|
|
113
|
+
if (this.lastCheckedSlot === undefined || outageSlot > this.lastCheckedSlot) {
|
|
114
|
+
this.lastCheckedSlot = outageSlot;
|
|
115
|
+
}
|
|
124
116
|
return;
|
|
125
117
|
}
|
|
126
118
|
|
|
127
119
|
if (this.gossipDegraded) {
|
|
128
120
|
this.gossipDegraded = false;
|
|
129
121
|
this.log.info(`Resuming data-withholding checks now that peers are connected`, {
|
|
130
|
-
|
|
122
|
+
currentSlot,
|
|
131
123
|
connectedPeers: connectivity.connectedPeers,
|
|
132
124
|
});
|
|
133
125
|
}
|
|
134
126
|
|
|
127
|
+
if (currentSlot <= tolerance) {
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
const targetSlot = SlotNumber(currentSlot - tolerance - 1);
|
|
132
|
+
if (targetSlot <= this.initialSlot) {
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
|
|
135
136
|
const startSlot = this.lastCheckedSlot === undefined ? this.initialSlot : this.lastCheckedSlot;
|
|
136
137
|
for (let slot = SlotNumber(startSlot + 1); slot <= targetSlot; slot = SlotNumber(slot + 1)) {
|
|
137
138
|
try {
|