@aztec-labs/slasher 6.0.0-nightly.20260922 → 6.0.0-rc.1
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/slash_offenses_collector.d.ts +7 -2
- package/dest/slash_offenses_collector.d.ts.map +1 -1
- package/dest/slash_offenses_collector.js +9 -0
- package/dest/slasher_client.d.ts +1 -1
- package/dest/slasher_client.d.ts.map +1 -1
- package/dest/slasher_client.js +3 -0
- package/dest/watchers/attestations_block_watcher.d.ts +8 -4
- package/dest/watchers/attestations_block_watcher.d.ts.map +1 -1
- package/dest/watchers/attestations_block_watcher.js +20 -3
- package/package.json +8 -8
- package/src/slash_offenses_collector.ts +9 -1
- package/src/slasher_client.ts +3 -0
- package/src/watchers/attestations_block_watcher.ts +25 -3
|
@@ -16,7 +16,7 @@ export type SlashOffensesCollectorSettings = Prettify<Pick<L1RollupConstants, 'e
|
|
|
16
16
|
* storing offenses, and retrieving pending offenses for slashing.
|
|
17
17
|
*/
|
|
18
18
|
export declare class SlashOffensesCollector {
|
|
19
|
-
private
|
|
19
|
+
private config;
|
|
20
20
|
private readonly settings;
|
|
21
21
|
private readonly watchers;
|
|
22
22
|
private readonly offensesStore;
|
|
@@ -24,6 +24,11 @@ export declare class SlashOffensesCollector {
|
|
|
24
24
|
private readonly unwatchCallbacks;
|
|
25
25
|
private readonly storeMutationQueue;
|
|
26
26
|
constructor(config: SlashOffensesCollectorConfig, settings: SlashOffensesCollectorSettings, watchers: Watcher[], offensesStore: SlasherOffensesStore, log?: import("@aztec-labs/foundation/log").Logger);
|
|
27
|
+
/**
|
|
28
|
+
* Applies a live config update (e.g. a widened slashGracePeriodL2Slots) so newly collected
|
|
29
|
+
* offenses are evaluated against the current grace window, not the value captured at startup.
|
|
30
|
+
*/
|
|
31
|
+
updateConfig(config: Partial<SlashOffensesCollectorConfig>): void;
|
|
27
32
|
start(): Promise<void>;
|
|
28
33
|
stop(): Promise<void>;
|
|
29
34
|
/**
|
|
@@ -43,4 +48,4 @@ export declare class SlashOffensesCollector {
|
|
|
43
48
|
private getOffenseLogData;
|
|
44
49
|
private enqueueStoreMutation;
|
|
45
50
|
}
|
|
46
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
51
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xhc2hfb2ZmZW5zZXNfY29sbGVjdG9yLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvc2xhc2hfb2ZmZW5zZXNfY29sbGVjdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBR3ZFLE9BQU8sS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzdELE9BQU8sS0FBSyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDMUUsT0FBTyxLQUFLLEVBQUUsYUFBYSxFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFHMUUsT0FBTyxLQUFLLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN2RSxPQUFPLEVBR0wsS0FBSyxvQkFBb0IsRUFDekIsS0FBSyxlQUFlLEVBQ3BCLEtBQUssT0FBTyxFQUNiLE1BQU0sY0FBYyxDQUFDO0FBRXRCLE1BQU0sTUFBTSw0QkFBNEIsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSx5QkFBeUIsQ0FBQyxDQUFDLENBQUM7QUFDcEcsTUFBTSxNQUFNLDhCQUE4QixHQUFHLFFBQVEsQ0FDbkQsSUFBSSxDQUFDLGlCQUFpQixFQUFFLGVBQWUsQ0FBQyxHQUFHO0lBQ3pDLGVBQWUsRUFBRSxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLEdBQUcsU0FBUyxDQUFDO0lBQ3RELHNIQUFzSDtJQUN0SCx3QkFBd0IsRUFBRSxVQUFVLENBQUM7Q0FDdEMsQ0FDRixDQUFDO0FBRUY7Ozs7R0FJRztBQUNILHFCQUFhLHNCQUFzQjtJQUsvQixPQUFPLENBQUMsTUFBTTtJQUNkLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUTtJQUN6QixPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVE7SUFDekIsT0FBTyxDQUFDLFFBQVEsQ0FBQyxhQUFhO0lBQzlCLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRztJQVJ0QixPQUFPLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFzQjtJQUN2RCxPQUFPLENBQUMsUUFBUSxDQUFDLGtCQUFrQixDQUFxQjtJQUV4RCxZQUNVLE1BQU0sRUFBRSw0QkFBNEIsRUFDM0IsUUFBUSxFQUFFLDhCQUE4QixFQUN4QyxRQUFRLEVBQUUsT0FBTyxFQUFFLEVBQ25CLGFBQWEsRUFBRSxvQkFBb0IsRUFDbkMsR0FBRyw4Q0FBNkMsRUFDL0Q7SUFFSjs7O09BR0c7SUFDSSxZQUFZLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyw0QkFBNEIsQ0FBQyxRQUVoRTtJQUVNLEtBQUssa0JBbUJYO0lBRVksSUFBSSxrQkFVaEI7SUFFRDs7OztPQUlHO0lBQ1UsaUJBQWlCLENBQUMsSUFBSSxFQUFFLGVBQWUsRUFBRSxpQkErQnJEO0lBRVksc0JBQXNCLENBQUMsSUFBSSxFQUFFLG9CQUFvQixFQUFFLGlCQVcvRDtJQUVEOzs7T0FHRztJQUNVLGNBQWMsQ0FBQyxLQUFLLEVBQUUsTUFBTSxpQkFLeEM7SUFFRCwwR0FBMEc7SUFDMUcsT0FBTyxDQUFDLGlCQUFpQjtJQUt6QixPQUFPLENBQUMsaUJBQWlCO0lBUXpCLE9BQU8sQ0FBQyxvQkFBb0I7Q0FHN0IifQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slash_offenses_collector.d.ts","sourceRoot":"","sources":["../src/slash_offenses_collector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sCAAsC,CAAC;AAGvE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAC1E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAC;AAG1E,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AACvE,OAAO,EAGL,KAAK,oBAAoB,EACzB,KAAK,eAAe,EACpB,KAAK,OAAO,EACb,MAAM,cAAc,CAAC;AAEtB,MAAM,MAAM,4BAA4B,GAAG,QAAQ,CAAC,IAAI,CAAC,aAAa,EAAE,yBAAyB,CAAC,CAAC,CAAC;AACpG,MAAM,MAAM,8BAA8B,GAAG,QAAQ,CACnD,IAAI,CAAC,iBAAiB,EAAE,eAAe,CAAC,GAAG;IACzC,eAAe,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;IACtD,sHAAsH;IACtH,wBAAwB,EAAE,UAAU,CAAC;CACtC,CACF,CAAC;AAEF;;;;GAIG;AACH,qBAAa,sBAAsB;IAK/B,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"slash_offenses_collector.d.ts","sourceRoot":"","sources":["../src/slash_offenses_collector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sCAAsC,CAAC;AAGvE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAC1E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAC;AAG1E,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AACvE,OAAO,EAGL,KAAK,oBAAoB,EACzB,KAAK,eAAe,EACpB,KAAK,OAAO,EACb,MAAM,cAAc,CAAC;AAEtB,MAAM,MAAM,4BAA4B,GAAG,QAAQ,CAAC,IAAI,CAAC,aAAa,EAAE,yBAAyB,CAAC,CAAC,CAAC;AACpG,MAAM,MAAM,8BAA8B,GAAG,QAAQ,CACnD,IAAI,CAAC,iBAAiB,EAAE,eAAe,CAAC,GAAG;IACzC,eAAe,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;IACtD,sHAAsH;IACtH,wBAAwB,EAAE,UAAU,CAAC;CACtC,CACF,CAAC;AAEF;;;;GAIG;AACH,qBAAa,sBAAsB;IAK/B,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,GAAG;IARtB,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAsB;IACvD,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAqB;IAExD,YACU,MAAM,EAAE,4BAA4B,EAC3B,QAAQ,EAAE,8BAA8B,EACxC,QAAQ,EAAE,OAAO,EAAE,EACnB,aAAa,EAAE,oBAAoB,EACnC,GAAG,8CAA6C,EAC/D;IAEJ;;;OAGG;IACI,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,4BAA4B,CAAC,QAEhE;IAEM,KAAK,kBAmBX;IAEY,IAAI,kBAUhB;IAED;;;;OAIG;IACU,iBAAiB,CAAC,IAAI,EAAE,eAAe,EAAE,iBA+BrD;IAEY,sBAAsB,CAAC,IAAI,EAAE,oBAAoB,EAAE,iBAW/D;IAED;;;OAGG;IACU,cAAc,CAAC,KAAK,EAAE,MAAM,iBAKxC;IAED,0GAA0G;IAC1G,OAAO,CAAC,iBAAiB;IAKzB,OAAO,CAAC,iBAAiB;IAQzB,OAAO,CAAC,oBAAoB;CAG7B"}
|
|
@@ -23,6 +23,15 @@ import { WANT_TO_CLEAR_SLASH_EVENT, WANT_TO_SLASH_EVENT } from './watcher.js';
|
|
|
23
23
|
this.unwatchCallbacks = [];
|
|
24
24
|
this.storeMutationQueue = new SerialQueue();
|
|
25
25
|
}
|
|
26
|
+
/**
|
|
27
|
+
* Applies a live config update (e.g. a widened slashGracePeriodL2Slots) so newly collected
|
|
28
|
+
* offenses are evaluated against the current grace window, not the value captured at startup.
|
|
29
|
+
*/ updateConfig(config) {
|
|
30
|
+
this.config = {
|
|
31
|
+
...this.config,
|
|
32
|
+
...config
|
|
33
|
+
};
|
|
34
|
+
}
|
|
26
35
|
start() {
|
|
27
36
|
this.log.debug('Starting SlashOffensesCollector...');
|
|
28
37
|
this.storeMutationQueue.start();
|
package/dest/slasher_client.d.ts
CHANGED
|
@@ -115,4 +115,4 @@ export declare class SlasherClient implements ProposerSlashActionProvider, Slash
|
|
|
115
115
|
*/
|
|
116
116
|
private getSlashedRound;
|
|
117
117
|
}
|
|
118
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
118
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xhc2hlcl9jbGllbnQuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9zbGFzaGVyX2NsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxVQUFVLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsY0FBYyxFQUFFLGVBQWUsRUFBRSx3QkFBd0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRTNHLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUVsRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFFaEUsT0FBTyxLQUFLLEVBQUUsWUFBWSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDakUsT0FBTyxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDN0QsT0FBTyxLQUFLLEVBQUUsYUFBYSxFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDMUUsT0FBTyxFQUNMLEtBQUssT0FBTyxFQUVaLEtBQUssbUJBQW1CLEVBQ3hCLEtBQUssMkJBQTJCLEVBSWpDLE1BQU0sNkJBQTZCLENBQUM7QUFFckMsT0FBTyxLQUFLLEVBQUUsR0FBRyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRWhDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDOUMsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDNUUsT0FBTyxFQUNMLHNCQUFzQixFQUN0QixLQUFLLDRCQUE0QixFQUNqQyxLQUFLLDhCQUE4QixFQUNwQyxNQUFNLCtCQUErQixDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxLQUFLLHlCQUF5QixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDN0YsT0FBTyxLQUFLLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUM1RSxPQUFPLEtBQUssRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3ZFLE9BQU8sS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUU1Qyw4RkFBOEY7QUFDOUYsTUFBTSxNQUFNLGVBQWUsR0FBRyxRQUFRLENBQ3BDLHlCQUF5QixHQUN2Qiw4QkFBOEIsR0FBRztJQUMvQix3QkFBd0IsRUFBRSxNQUFNLENBQUM7SUFDakMsOEJBQThCLEVBQUUsTUFBTSxDQUFDO0lBQ3ZDLHlCQUF5QixFQUFFLE1BQU0sQ0FBQztJQUNsQyxzQkFBc0IsRUFBRSxNQUFNLENBQUM7SUFDL0Isa0JBQWtCLEVBQUUsTUFBTSxDQUFDO0lBQzNCLGVBQWUsRUFBRSxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDMUMsd0NBQXdDO0lBQ3hDLG1CQUFtQixFQUFFLE1BQU0sQ0FBQztDQUM3QixDQUNKLENBQUM7QUFFRixNQUFNLE1BQU0sbUJBQW1CLEdBQUcsNEJBQTRCLEdBQzVELElBQUksQ0FDRixhQUFhLEVBQ2IsdUJBQXVCLEdBQUcsc0JBQXNCLEdBQUcsNEJBQTRCLEdBQUcscUJBQXFCLENBQ3hHLENBQUM7QUFVSjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXlCRztBQUNILHFCQUFhLGFBQWMsWUFBVywyQkFBMkIsRUFBRSxzQkFBc0I7SUFPckYsT0FBTyxDQUFDLE1BQU07SUFDZCxPQUFPLENBQUMsUUFBUTtJQUNoQixPQUFPLENBQUMsZ0JBQWdCO0lBQ3hCLE9BQU8sQ0FBQyxPQUFPO0lBQ2YsT0FBTyxDQUFDLE1BQU07SUFFZCxPQUFPLENBQUMsVUFBVTtJQUNsQixPQUFPLENBQUMsWUFBWTtJQUNwQixPQUFPLENBQUMsYUFBYTtJQUNyQixPQUFPLENBQUMsUUFBUSxDQUFDLGFBQWE7SUFDOUIsT0FBTyxDQUFDLEdBQUc7SUFDWCxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU87SUFqQjFCLFNBQVMsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUUsQ0FBTTtJQUNoRCxTQUFTLENBQUMsWUFBWSxFQUFFLGlCQUFpQixDQUFDO0lBQzFDLFNBQVMsQ0FBQyxpQkFBaUIsRUFBRSxzQkFBc0IsQ0FBQztJQUNwRCxTQUFTLENBQUMsUUFBUSxDQUFDLG1CQUFtQixFQUFFLHdCQUF3QixDQUFDO0lBRWpFLFlBQ1UsTUFBTSxFQUFFLG1CQUFtQixFQUMzQixRQUFRLEVBQUUsZUFBZSxFQUN6QixnQkFBZ0IsRUFBRSx3QkFBd0IsRUFDMUMsT0FBTyxFQUFFLGVBQWUsRUFDeEIsTUFBTSxFQUFFLGNBQWMsRUFDOUIsUUFBUSxFQUFFLE9BQU8sRUFBRSxFQUNYLFVBQVUsRUFBRSxVQUFVLEVBQ3RCLFlBQVksRUFBRSxZQUFZLEVBQzFCLGFBQWEsRUFBRSxvQkFBb0IsRUFDMUIsYUFBYSxHQUFFLFVBQVUsRUFBTyxFQUN6QyxHQUFHLDhDQUFvQyxFQUM5QixPQUFPLGlCQUEyQyxFQUtwRTtJQUVZLEtBQUssa0JBZ0NqQjtJQUVELDhCQUE4QjtJQUNqQixJQUFJLGtCQVloQjtJQUVELGlDQUFpQztJQUMxQixTQUFTLElBQUksYUFBYSxDQUVoQztJQUVELDhDQUE4QztJQUN2QyxZQUFZLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxhQUFhLENBQUMsUUFLakQ7SUFFRCw2RkFBNkY7SUFDN0YsVUFBZ0IsY0FBYyxDQUFDLEtBQUssRUFBRSxNQUFNLGlCQUkzQztJQUVELHVHQUF1RztJQUN2RyxVQUFnQixtQkFBbUIsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLEdBQUcsaUJBS3RGO0lBRUQ7Ozs7T0FJRztJQUNVLGtCQUFrQixDQUFDLFVBQVUsRUFBRSxVQUFVLEdBQUcsT0FBTyxDQUFDLG1CQUFtQixFQUFFLENBQUMsQ0FPdEY7SUFFRDs7O09BR0c7SUFDSCxVQUFnQixxQkFBcUIsQ0FBQyxVQUFVLEVBQUUsVUFBVSxHQUFHLE9BQU8sQ0FBQyxtQkFBbUIsR0FBRyxTQUFTLENBQUMsQ0EwQ3RHO1lBT2Esd0JBQXdCO0lBMEV0QywwRkFBMEY7SUFDMUYsVUFBZ0IscUJBQXFCLENBQUMsVUFBVSxFQUFFLFVBQVUsR0FBRyxPQUFPLENBQUMsbUJBQW1CLEdBQUcsU0FBUyxDQUFDLENBK0Z0RztJQUVELG1GQUFtRjtJQUNuRixPQUFPLENBQUMsa0NBQWtDO0lBUTFDOzs7OztPQUtHO0lBQ1Usc0JBQXNCLENBQUMsS0FBSyxDQUFDLEVBQUUsTUFBTSxHQUFHLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQU90RTtJQUVELGtDQUFrQztJQUMzQixXQUFXLElBQUksT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBRXZDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILE9BQU8sQ0FBQyxlQUFlO0NBSXhCIn0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slasher_client.d.ts","sourceRoot":"","sources":["../src/slasher_client.ts"],"names":[],"mappings":"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
|
|
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
|
@@ -101,6 +101,9 @@ import { SlashRoundMonitor } from './slash_round_monitor.js';
|
|
|
101
101
|
...this.config,
|
|
102
102
|
...config
|
|
103
103
|
};
|
|
104
|
+
// The offenses collector is a long-lived sub-component with its own config copy; forward the
|
|
105
|
+
// update so live changes (e.g. slashGracePeriodL2Slots) reach the sole grace-period enforcer.
|
|
106
|
+
this.offensesCollector.updateConfig(config);
|
|
104
107
|
}
|
|
105
108
|
/** Triggered on a time basis when we enter a new slashing round. Clears expired offenses. */ async handleNewRound(round) {
|
|
106
109
|
this.log.info(`Starting new slashing round ${round}`);
|
|
@@ -20,8 +20,10 @@ declare const AttestationsBlockWatcher_base: new () => WatcherEmitter;
|
|
|
20
20
|
* - Descendant of an invalid checkpoint: the proposer published a checkpoint that extends a
|
|
21
21
|
* previously-rejected one. The descendant may itself have valid attestations, but it is still
|
|
22
22
|
* unusable. Triggered by the archiver's `CheckpointBuiltOnInvalidAncestorDetected` event
|
|
23
|
-
* when the descendant has valid attestations (skipped before ingestion). Slashes the
|
|
24
|
-
* proposer
|
|
23
|
+
* when the descendant has valid attestations (skipped before ingestion). Slashes the committee member
|
|
24
|
+
* that proposer rotation assigns to the descendant's slot via
|
|
25
|
+
* {@link OffenseType.PROPOSED_DESCENDANT_OF_CHECKPOINT_WITH_INVALID_ATTESTATIONS}, unless the epoch's
|
|
26
|
+
* escape hatch is open, in which case rotation does not identify the publisher and no offense is raised.
|
|
25
27
|
*/
|
|
26
28
|
export declare class AttestationsBlockWatcher extends AttestationsBlockWatcher_base implements Watcher {
|
|
27
29
|
private l2BlockSource;
|
|
@@ -38,10 +40,12 @@ export declare class AttestationsBlockWatcher extends AttestationsBlockWatcher_b
|
|
|
38
40
|
handleInvalidCheckpoint(event: InvalidCheckpointDetectedEvent): void;
|
|
39
41
|
/**
|
|
40
42
|
* Event handler for valid-attestations checkpoints that build on a previously-rejected ancestor.
|
|
41
|
-
* The archiver emits this when ingesting the descendant, and we slash
|
|
43
|
+
* The archiver emits this when ingesting the descendant, and we slash the committee member that
|
|
44
|
+
* proposer rotation assigns to its slot. No offense is raised when the epoch's escape hatch is open,
|
|
45
|
+
* since rotation does not identify who published the checkpoint then.
|
|
42
46
|
*/
|
|
43
47
|
handleDescendantOfInvalid(event: DescendentOfInvalidAttestationsCheckpointEvent): Promise<void>;
|
|
44
48
|
private getOffenseFromInvalidationReason;
|
|
45
49
|
}
|
|
46
50
|
export {};
|
|
47
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
51
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0ZXN0YXRpb25zX2Jsb2NrX3dhdGNoZXIuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy93YXRjaGVycy9hdHRlc3RhdGlvbnNfYmxvY2tfd2F0Y2hlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFHckQsT0FBTyxFQUFlLEtBQUssY0FBYyxFQUFnQixNQUFNLDRCQUE0QixDQUFDO0FBQzVGLE9BQU8sRUFDTCxLQUFLLDhDQUE4QyxFQUNuRCxLQUFLLDhCQUE4QixFQUNuQyxLQUFLLHlCQUF5QixFQUcvQixNQUFNLDBCQUEwQixDQUFDO0FBS2xDLE9BQU8sS0FBSyxFQUFFLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNsRCxPQUFPLEVBQTZDLEtBQUssT0FBTyxFQUFFLEtBQUssY0FBYyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTdHLFFBQUEsTUFBTSxrQ0FBa0MseUhBRzlCLENBQUM7QUFFWCxLQUFLLDhCQUE4QixHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxPQUFPLGtDQUFrQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQzs7QUFFL0c7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtCRztBQUNILHFCQUFhLHdCQUF5QixTQUFRLDZCQUEyQyxZQUFXLE9BQU87SUF5QnZHLE9BQU8sQ0FBQyxhQUFhO0lBQ3JCLE9BQU8sQ0FBQyxVQUFVO0lBekJwQixPQUFPLENBQUMsR0FBRyxDQUFTO0lBQ3BCLE9BQU8sQ0FBQyxNQUFNLENBQWlDO0lBRS9DLE9BQU8sQ0FBQyw0QkFBNEIsQ0FTbEM7SUFFRixPQUFPLENBQUMsOEJBQThCLENBT3BDO0lBRUYsWUFDVSxhQUFhLEVBQUUseUJBQXlCLEVBQ3hDLFVBQVUsRUFBRSxVQUFVLEVBQzlCLE1BQU0sRUFBRSw4QkFBOEIsRUFDdEMsUUFBUSxDQUFDLEVBQUUsY0FBYyxFQU0xQjtJQUVNLFlBQVksQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLDhCQUE4QixDQUFDLFFBR3JFO0lBRU0sS0FBSyxrQkFVWDtJQUVNLElBQUksa0JBVVY7SUFFRCxzR0FBc0c7SUFDL0YsdUJBQXVCLENBQUMsS0FBSyxFQUFFLDhCQUE4QixHQUFHLElBQUksQ0FxQzFFO0lBRUQ7Ozs7O09BS0c7SUFDVSx5QkFBeUIsQ0FBQyxLQUFLLEVBQUUsOENBQThDLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQW1EM0c7SUFFRCxPQUFPLENBQUMsZ0NBQWdDO0NBWXpDIn0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"attestations_block_watcher.d.ts","sourceRoot":"","sources":["../../src/watchers/attestations_block_watcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAGrD,OAAO,EAAe,KAAK,cAAc,EAAgB,MAAM,4BAA4B,CAAC;AAC5F,OAAO,EACL,KAAK,8CAA8C,EACnD,KAAK,8BAA8B,EACnC,KAAK,yBAAyB,EAG/B,MAAM,0BAA0B,CAAC;AAKlC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAA6C,KAAK,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,eAAe,CAAC;AAE7G,QAAA,MAAM,kCAAkC,yHAG9B,CAAC;AAEX,KAAK,8BAA8B,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC,OAAO,kCAAkC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;;AAE/G
|
|
1
|
+
{"version":3,"file":"attestations_block_watcher.d.ts","sourceRoot":"","sources":["../../src/watchers/attestations_block_watcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAGrD,OAAO,EAAe,KAAK,cAAc,EAAgB,MAAM,4BAA4B,CAAC;AAC5F,OAAO,EACL,KAAK,8CAA8C,EACnD,KAAK,8BAA8B,EACnC,KAAK,yBAAyB,EAG/B,MAAM,0BAA0B,CAAC;AAKlC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAA6C,KAAK,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,eAAe,CAAC;AAE7G,QAAA,MAAM,kCAAkC,yHAG9B,CAAC;AAEX,KAAK,8BAA8B,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC,OAAO,kCAAkC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;;AAE/G;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,wBAAyB,SAAQ,6BAA2C,YAAW,OAAO;IAyBvG,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,UAAU;IAzBpB,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,MAAM,CAAiC;IAE/C,OAAO,CAAC,4BAA4B,CASlC;IAEF,OAAO,CAAC,8BAA8B,CAOpC;IAEF,YACU,aAAa,EAAE,yBAAyB,EACxC,UAAU,EAAE,UAAU,EAC9B,MAAM,EAAE,8BAA8B,EACtC,QAAQ,CAAC,EAAE,cAAc,EAM1B;IAEM,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,8BAA8B,CAAC,QAGrE;IAEM,KAAK,kBAUX;IAEM,IAAI,kBAUV;IAED,sGAAsG;IAC/F,uBAAuB,CAAC,KAAK,EAAE,8BAA8B,GAAG,IAAI,CAqC1E;IAED;;;;;OAKG;IACU,yBAAyB,CAAC,KAAK,EAAE,8CAA8C,GAAG,OAAO,CAAC,IAAI,CAAC,CAmD3G;IAED,OAAO,CAAC,gCAAgC;CAYzC"}
|
|
@@ -24,8 +24,10 @@ const AttestationsBlockWatcherConfigKeys = [
|
|
|
24
24
|
* - Descendant of an invalid checkpoint: the proposer published a checkpoint that extends a
|
|
25
25
|
* previously-rejected one. The descendant may itself have valid attestations, but it is still
|
|
26
26
|
* unusable. Triggered by the archiver's `CheckpointBuiltOnInvalidAncestorDetected` event
|
|
27
|
-
* when the descendant has valid attestations (skipped before ingestion). Slashes the
|
|
28
|
-
* proposer
|
|
27
|
+
* when the descendant has valid attestations (skipped before ingestion). Slashes the committee member
|
|
28
|
+
* that proposer rotation assigns to the descendant's slot via
|
|
29
|
+
* {@link OffenseType.PROPOSED_DESCENDANT_OF_CHECKPOINT_WITH_INVALID_ATTESTATIONS}, unless the epoch's
|
|
30
|
+
* escape hatch is open, in which case rotation does not identify the publisher and no offense is raised.
|
|
29
31
|
*/ export class AttestationsBlockWatcher extends EventEmitter {
|
|
30
32
|
l2BlockSource;
|
|
31
33
|
epochCache;
|
|
@@ -108,12 +110,27 @@ const AttestationsBlockWatcherConfigKeys = [
|
|
|
108
110
|
}
|
|
109
111
|
/**
|
|
110
112
|
* Event handler for valid-attestations checkpoints that build on a previously-rejected ancestor.
|
|
111
|
-
* The archiver emits this when ingesting the descendant, and we slash
|
|
113
|
+
* The archiver emits this when ingesting the descendant, and we slash the committee member that
|
|
114
|
+
* proposer rotation assigns to its slot. No offense is raised when the epoch's escape hatch is open,
|
|
115
|
+
* since rotation does not identify who published the checkpoint then.
|
|
112
116
|
*/ async handleDescendantOfInvalid(event) {
|
|
113
117
|
const { checkpoint, ancestorCheckpointNumber, ancestorArchiveRoot } = event;
|
|
114
118
|
const slot = checkpoint.slotNumber;
|
|
115
119
|
const epoch = EpochNumber(getEpochAtSlot(slot, this.epochCache.getL1Constants()));
|
|
116
120
|
const epochCommitteeInfo = await this.epochCache.getCommitteeForEpoch(epoch);
|
|
121
|
+
// While the escape hatch is open, checkpoints are published outside the committee's proposer rotation, so
|
|
122
|
+
// the committee member that rotation yields for this slot did not necessarily publish the checkpoint and
|
|
123
|
+
// must not be attributed the offense. We have no way to identify the actual publisher here, so we skip.
|
|
124
|
+
if (epochCommitteeInfo.isEscapeHatchOpen) {
|
|
125
|
+
this.log.verbose(`Skipping descendant-of-invalid attribution for checkpoint ${checkpoint.checkpointNumber} as the escape hatch is open`, {
|
|
126
|
+
...checkpoint,
|
|
127
|
+
slot,
|
|
128
|
+
epoch,
|
|
129
|
+
ancestorCheckpointNumber,
|
|
130
|
+
ancestorArchiveRoot: ancestorArchiveRoot.toString()
|
|
131
|
+
});
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
117
134
|
const proposer = this.epochCache.getProposerFromEpochCommittee({
|
|
118
135
|
...epochCommitteeInfo,
|
|
119
136
|
epoch
|
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.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": "./dest/index.js",
|
|
@@ -56,15 +56,15 @@
|
|
|
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.1",
|
|
60
|
+
"@aztec-labs/ethereum": "6.0.0-rc.1",
|
|
61
|
+
"@aztec-labs/foundation": "6.0.0-rc.1",
|
|
62
|
+
"@aztec-labs/kv-store": "6.0.0-rc.1",
|
|
63
|
+
"@aztec-labs/stdlib": "6.0.0-rc.1",
|
|
64
|
+
"@aztec-labs/telemetry-client": "6.0.0-rc.1",
|
|
65
65
|
"source-map-support": "^0.5.21",
|
|
66
66
|
"tslib": "^2.4.0",
|
|
67
|
-
"viem": "npm:@aztec/viem@2.38.
|
|
67
|
+
"viem": "npm:@aztec/viem@2.38.3",
|
|
68
68
|
"zod": "~4.4.3"
|
|
69
69
|
},
|
|
70
70
|
"devDependencies": {
|
|
@@ -34,13 +34,21 @@ export class SlashOffensesCollector {
|
|
|
34
34
|
private readonly storeMutationQueue = new SerialQueue();
|
|
35
35
|
|
|
36
36
|
constructor(
|
|
37
|
-
private
|
|
37
|
+
private config: SlashOffensesCollectorConfig,
|
|
38
38
|
private readonly settings: SlashOffensesCollectorSettings,
|
|
39
39
|
private readonly watchers: Watcher[],
|
|
40
40
|
private readonly offensesStore: SlasherOffensesStore,
|
|
41
41
|
private readonly log = createLogger('slasher:offenses-collector'),
|
|
42
42
|
) {}
|
|
43
43
|
|
|
44
|
+
/**
|
|
45
|
+
* Applies a live config update (e.g. a widened slashGracePeriodL2Slots) so newly collected
|
|
46
|
+
* offenses are evaluated against the current grace window, not the value captured at startup.
|
|
47
|
+
*/
|
|
48
|
+
public updateConfig(config: Partial<SlashOffensesCollectorConfig>) {
|
|
49
|
+
this.config = { ...this.config, ...config };
|
|
50
|
+
}
|
|
51
|
+
|
|
44
52
|
public start() {
|
|
45
53
|
this.log.debug('Starting SlashOffensesCollector...');
|
|
46
54
|
this.storeMutationQueue.start();
|
package/src/slasher_client.ts
CHANGED
|
@@ -169,6 +169,9 @@ export class SlasherClient implements ProposerSlashActionProvider, SlasherClient
|
|
|
169
169
|
/** Update the config of the slasher client */
|
|
170
170
|
public updateConfig(config: Partial<SlasherConfig>) {
|
|
171
171
|
this.config = { ...this.config, ...config };
|
|
172
|
+
// The offenses collector is a long-lived sub-component with its own config copy; forward the
|
|
173
|
+
// update so live changes (e.g. slashGracePeriodL2Slots) reach the sole grace-period enforcer.
|
|
174
|
+
this.offensesCollector.updateConfig(config);
|
|
172
175
|
}
|
|
173
176
|
|
|
174
177
|
/** Triggered on a time basis when we enter a new slashing round. Clears expired offenses. */
|
|
@@ -37,8 +37,10 @@ type AttestationsBlockWatcherConfig = Pick<SlasherConfig, (typeof AttestationsBl
|
|
|
37
37
|
* - Descendant of an invalid checkpoint: the proposer published a checkpoint that extends a
|
|
38
38
|
* previously-rejected one. The descendant may itself have valid attestations, but it is still
|
|
39
39
|
* unusable. Triggered by the archiver's `CheckpointBuiltOnInvalidAncestorDetected` event
|
|
40
|
-
* when the descendant has valid attestations (skipped before ingestion). Slashes the
|
|
41
|
-
* proposer
|
|
40
|
+
* when the descendant has valid attestations (skipped before ingestion). Slashes the committee member
|
|
41
|
+
* that proposer rotation assigns to the descendant's slot via
|
|
42
|
+
* {@link OffenseType.PROPOSED_DESCENDANT_OF_CHECKPOINT_WITH_INVALID_ATTESTATIONS}, unless the epoch's
|
|
43
|
+
* escape hatch is open, in which case rotation does not identify the publisher and no offense is raised.
|
|
42
44
|
*/
|
|
43
45
|
export class AttestationsBlockWatcher extends (EventEmitter as new () => WatcherEmitter) implements Watcher {
|
|
44
46
|
private log: Logger;
|
|
@@ -147,7 +149,9 @@ export class AttestationsBlockWatcher extends (EventEmitter as new () => Watcher
|
|
|
147
149
|
|
|
148
150
|
/**
|
|
149
151
|
* Event handler for valid-attestations checkpoints that build on a previously-rejected ancestor.
|
|
150
|
-
* The archiver emits this when ingesting the descendant, and we slash
|
|
152
|
+
* The archiver emits this when ingesting the descendant, and we slash the committee member that
|
|
153
|
+
* proposer rotation assigns to its slot. No offense is raised when the epoch's escape hatch is open,
|
|
154
|
+
* since rotation does not identify who published the checkpoint then.
|
|
151
155
|
*/
|
|
152
156
|
public async handleDescendantOfInvalid(event: DescendentOfInvalidAttestationsCheckpointEvent): Promise<void> {
|
|
153
157
|
const { checkpoint, ancestorCheckpointNumber, ancestorArchiveRoot } = event;
|
|
@@ -155,6 +159,24 @@ export class AttestationsBlockWatcher extends (EventEmitter as new () => Watcher
|
|
|
155
159
|
const slot = checkpoint.slotNumber;
|
|
156
160
|
const epoch = EpochNumber(getEpochAtSlot(slot, this.epochCache.getL1Constants()));
|
|
157
161
|
const epochCommitteeInfo = await this.epochCache.getCommitteeForEpoch(epoch);
|
|
162
|
+
|
|
163
|
+
// While the escape hatch is open, checkpoints are published outside the committee's proposer rotation, so
|
|
164
|
+
// the committee member that rotation yields for this slot did not necessarily publish the checkpoint and
|
|
165
|
+
// must not be attributed the offense. We have no way to identify the actual publisher here, so we skip.
|
|
166
|
+
if (epochCommitteeInfo.isEscapeHatchOpen) {
|
|
167
|
+
this.log.verbose(
|
|
168
|
+
`Skipping descendant-of-invalid attribution for checkpoint ${checkpoint.checkpointNumber} as the escape hatch is open`,
|
|
169
|
+
{
|
|
170
|
+
...checkpoint,
|
|
171
|
+
slot,
|
|
172
|
+
epoch,
|
|
173
|
+
ancestorCheckpointNumber,
|
|
174
|
+
ancestorArchiveRoot: ancestorArchiveRoot.toString(),
|
|
175
|
+
},
|
|
176
|
+
);
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
|
|
158
180
|
const proposer = this.epochCache.getProposerFromEpochCommittee({ ...epochCommitteeInfo, epoch }, slot);
|
|
159
181
|
|
|
160
182
|
if (!proposer) {
|