@aztec/sequencer-client 0.69.0-devnet → 0.69.0

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.
@@ -36,9 +36,8 @@ import { Attributes, type TelemetryClient, type Tracer, trackSpan } from '@aztec
36
36
  import { type ValidatorClient } from '@aztec/validator-client';
37
37
 
38
38
  import { type GlobalVariableBuilder } from '../global_variable_builder/global_builder.js';
39
- import { type L1Publisher, VoteType } from '../publisher/l1-publisher.js';
39
+ import { type L1Publisher } from '../publisher/l1-publisher.js';
40
40
  import { prettyLogViemErrorMsg } from '../publisher/utils.js';
41
- import { type SlasherClient } from '../slasher/slasher_client.js';
42
41
  import { type TxValidatorFactory } from '../tx_validator/tx_validator_factory.js';
43
42
  import { getDefaultAllowedSetupFunctions } from './allowed.js';
44
43
  import { type SequencerConfig } from './config.js';
@@ -107,7 +106,6 @@ export class Sequencer {
107
106
  private globalsBuilder: GlobalVariableBuilder,
108
107
  private p2pClient: P2P,
109
108
  private worldState: WorldStateSynchronizer,
110
- private slasherClient: SlasherClient,
111
109
  private blockBuilderFactory: BlockBuilderFactory,
112
110
  private l2BlockSource: L2BlockSource,
113
111
  private l1ToL2MessageSource: L1ToL2MessageSource,
@@ -124,9 +122,6 @@ export class Sequencer {
124
122
 
125
123
  // Register the block builder with the validator client for re-execution
126
124
  this.validatorClient?.registerBlockBuilder(this.buildBlock.bind(this));
127
-
128
- // Register the slasher on the publisher to fetch slashing payloads
129
- this.publisher.registerSlashPayloadGetter(this.slasherClient.getSlashPayload.bind(this.slasherClient));
130
125
  }
131
126
 
132
127
  get tracer(): Tracer {
@@ -162,7 +157,7 @@ export class Sequencer {
162
157
  this.maxBlockSizeInBytes = config.maxBlockSizeInBytes;
163
158
  }
164
159
  if (config.governanceProposerPayload) {
165
- this.publisher.setGovernancePayload(config.governanceProposerPayload);
160
+ this.publisher.setPayload(config.governanceProposerPayload);
166
161
  }
167
162
  if (config.maxL1TxInclusionTimeIntoSlot !== undefined) {
168
163
  this.maxL1TxInclusionTimeIntoSlot = config.maxL1TxInclusionTimeIntoSlot;
@@ -250,7 +245,6 @@ export class Sequencer {
250
245
  this.log.debug(`Stopping sequencer`);
251
246
  await this.validatorClient?.stop();
252
247
  await this.runningPromise?.stop();
253
- await this.slasherClient?.stop();
254
248
  this.publisher.interrupt();
255
249
  this.setState(SequencerState.STOPPED, 0n, true /** force */);
256
250
  this.log.info('Stopped sequencer');
@@ -320,8 +314,7 @@ export class Sequencer {
320
314
  slot,
321
315
  );
322
316
 
323
- void this.publisher.castVote(slot, newGlobalVariables.timestamp.toBigInt(), VoteType.GOVERNANCE);
324
- void this.publisher.castVote(slot, newGlobalVariables.timestamp.toBigInt(), VoteType.SLASHING);
317
+ void this.publisher.castVote(slot, newGlobalVariables.timestamp.toBigInt());
325
318
 
326
319
  if (!this.shouldProposeBlock(historicalHeader, {})) {
327
320
  return;
@@ -1,11 +0,0 @@
1
- import type { L2BlockSource } from '@aztec/circuit-types';
2
- import { type L1ContractsConfig, type L1ReaderConfig } from '@aztec/ethereum';
3
- import { type AztecKVStore } from '@aztec/kv-store';
4
- import { type DataStoreConfig } from '@aztec/kv-store/config';
5
- import { type TelemetryClient } from '@aztec/telemetry-client';
6
- import { SlasherClient } from './slasher_client.js';
7
- import { type SlasherConfig } from './slasher_client.js';
8
- export declare const createSlasherClient: (_config: SlasherConfig & DataStoreConfig & L1ContractsConfig & L1ReaderConfig, l2BlockSource: L2BlockSource, telemetry?: TelemetryClient, deps?: {
9
- store?: AztecKVStore;
10
- }) => Promise<SlasherClient>;
11
- //# sourceMappingURL=factory.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/slasher/factory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,KAAK,iBAAiB,EAAE,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAE9E,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAE9D,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAG/D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzD,eAAO,MAAM,mBAAmB,YACrB,aAAa,GAAG,eAAe,GAAG,iBAAiB,GAAG,cAAc,iBAC9D,aAAa,cACjB,eAAe,SACpB;IAAE,KAAK,CAAC,EAAE,YAAY,CAAA;CAAE,2BAK/B,CAAC"}
@@ -1,10 +0,0 @@
1
- import { createLogger } from '@aztec/foundation/log';
2
- import { createStore } from '@aztec/kv-store/lmdb';
3
- import { NoopTelemetryClient } from '@aztec/telemetry-client/noop';
4
- import { SlasherClient } from './slasher_client.js';
5
- export const createSlasherClient = async (_config, l2BlockSource, telemetry = new NoopTelemetryClient(), deps = {}) => {
6
- const config = { ..._config };
7
- const store = deps.store ?? (await createStore('slasher', config, createLogger('slasher:lmdb')));
8
- return new SlasherClient(config, store, l2BlockSource, telemetry);
9
- };
10
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFjdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zbGFzaGVyL2ZhY3RvcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBR3JELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUVuRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUVuRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFHcEQsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsS0FBSyxFQUN0QyxPQUE2RSxFQUM3RSxhQUE0QixFQUM1QixZQUE2QixJQUFJLG1CQUFtQixFQUFFLEVBQ3RELE9BQWlDLEVBQUUsRUFDbkMsRUFBRTtJQUNGLE1BQU0sTUFBTSxHQUFHLEVBQUUsR0FBRyxPQUFPLEVBQUUsQ0FBQztJQUM5QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsTUFBTSxXQUFXLENBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxZQUFZLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2pHLE9BQU8sSUFBSSxhQUFhLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDcEUsQ0FBQyxDQUFDIn0=
@@ -1,3 +0,0 @@
1
- export * from './slasher_client.js';
2
- export { createSlasherClient } from './factory.js';
3
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/slasher/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC"}
@@ -1,3 +0,0 @@
1
- export * from './slasher_client.js';
2
- export { createSlasherClient } from './factory.js';
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2xhc2hlci9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGNBQWMsQ0FBQyJ9
@@ -1,127 +0,0 @@
1
- import { type L2BlockId, type L2BlockSource, type L2BlockStreamEvent, type L2Tips } from '@aztec/circuit-types';
2
- import { type L1ContractsConfig, type L1ReaderConfig } from '@aztec/ethereum';
3
- import { EthAddress } from '@aztec/foundation/eth-address';
4
- import { type AztecKVStore } from '@aztec/kv-store';
5
- import { SlashFactoryAbi } from '@aztec/l1-artifacts';
6
- import { type TelemetryClient, WithTracer } from '@aztec/telemetry-client';
7
- import { type Chain, type GetContractReturnType, type HttpTransport, type PublicClient } from 'viem';
8
- /**
9
- * Enum defining the possible states of the Slasher client.
10
- */
11
- export declare enum SlasherClientState {
12
- IDLE = 0,
13
- SYNCHING = 1,
14
- RUNNING = 2,
15
- STOPPED = 3
16
- }
17
- /**
18
- * The synchronization status of the Slasher client.
19
- */
20
- export interface SlasherSyncState {
21
- /**
22
- * The current state of the slasher client.
23
- */
24
- state: SlasherClientState;
25
- /**
26
- * The block number that the slasher client is synced to.
27
- */
28
- syncedToL2Block: L2BlockId;
29
- }
30
- export interface SlasherConfig {
31
- blockCheckIntervalMS: number;
32
- blockRequestBatchSize: number;
33
- }
34
- /**
35
- * @notice A Hypomeiones slasher client implementation
36
- *
37
- * Hypomeiones: a class of individuals in ancient Sparta who were considered inferior or lesser citizens compared
38
- * to the full Spartan citizens.
39
- *
40
- * The implementation here is less than ideal. It exists, not to be the end all be all, but to show that
41
- * slashing can be done with this mechanism.
42
- *
43
- * The implementation is VERY brute in the sense that it only looks for pruned blocks and then tries to slash
44
- * the full committee of that.
45
- * If it sees a prune, it will mark the full epoch as "to be slashed".
46
- *
47
- * Also, it is not particularly smart around what it should if there were to be multiple slashing events.
48
- *
49
- * A few improvements:
50
- * - Only vote on the proposal if it is possible to reach, e.g., if 6 votes are needed and only 4 slots are left don't vote.
51
- * - Stop voting on a payload once it is processed.
52
- * - Only vote on the proposal if it have not already been executed
53
- * - Caveat, we need to fully decide if it is acceptable to have the same payload address multiple times. In the current
54
- * slash factory that could mean slashing the same committee for the same error multiple times.
55
- * - Decide how to deal with multiple slashing events in the same round.
56
- * - This could be that multiple epochs are pruned in the same round, but with the current naive implementation we could end up
57
- * slashing only the first, because the "lifetime" of the second would have passed after that vote
58
- */
59
- export declare class SlasherClient extends WithTracer {
60
- private config;
61
- private store;
62
- private l2BlockSource;
63
- private log;
64
- private currentState;
65
- private syncPromise;
66
- private syncResolve?;
67
- private latestBlockNumberAtStart;
68
- private provenBlockNumberAtStart;
69
- private synchedBlockHashes;
70
- private synchedLatestBlockNumber;
71
- private synchedProvenBlockNumber;
72
- private blockStream;
73
- private slashEvents;
74
- protected slashFactoryContract?: GetContractReturnType<typeof SlashFactoryAbi, PublicClient<HttpTransport, Chain>>;
75
- private slashingAmount;
76
- constructor(config: SlasherConfig & L1ContractsConfig & L1ReaderConfig, store: AztecKVStore, l2BlockSource: L2BlockSource, telemetry?: TelemetryClient, log?: import("@aztec/foundation/log").Logger);
77
- getSlashPayload(slotNumber: bigint): Promise<EthAddress | undefined>;
78
- getL2BlockHash(number: number): Promise<string | undefined>;
79
- getL2Tips(): Promise<L2Tips>;
80
- handleBlockStreamEvent(event: L2BlockStreamEvent): Promise<void>;
81
- start(): Promise<void>;
82
- /**
83
- * Allows consumers to stop the instance of the slasher client.
84
- * 'ready' will now return 'false' and the running promise that keeps the client synced is interrupted.
85
- */
86
- stop(): Promise<void>;
87
- /**
88
- * Public function to check if the slasher client is fully synced and ready to receive txs.
89
- * @returns True if the slasher client is ready to receive txs.
90
- */
91
- isReady(): boolean;
92
- /**
93
- * Public function to check the latest block number that the slasher client is synced to.
94
- * @returns Block number of latest L2 Block we've synced with.
95
- */
96
- getSyncedLatestBlockNum(): number;
97
- /**
98
- * Public function to check the latest proven block number that the slasher client is synced to.
99
- * @returns Block number of latest proven L2 Block we've synced with.
100
- */
101
- getSyncedProvenBlockNum(): number;
102
- /**
103
- * Method to check the status of the slasher client.
104
- * @returns Information about slasher client status: state & syncedToBlockNum.
105
- */
106
- getStatus(): Promise<SlasherSyncState>;
107
- /**
108
- * Handles new blocks
109
- * @param blocks - A list of blocks that the slasher client needs to store block hashes for
110
- * @returns Empty promise.
111
- */
112
- private handleLatestL2Blocks;
113
- /**
114
- * Handles new proven blocks by updating the proven block number
115
- * @param blocks - A list of proven L2 blocks.
116
- * @returns Empty promise.
117
- */
118
- private handleProvenL2Blocks;
119
- private handlePruneL2Blocks;
120
- private startServiceIfSynched;
121
- /**
122
- * Method to set the value of the current state.
123
- * @param newState - New state value.
124
- */
125
- private setCurrentState;
126
- }
127
- //# sourceMappingURL=slasher_client.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"slasher_client.d.ts","sourceRoot":"","sources":["../../src/slasher/slasher_client.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,SAAS,EACd,KAAK,aAAa,EAElB,KAAK,kBAAkB,EACvB,KAAK,MAAM,EACZ,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,KAAK,iBAAiB,EAAE,KAAK,cAAc,EAAuB,MAAM,iBAAiB,CAAC;AACnG,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAE3D,OAAO,EAAE,KAAK,YAAY,EAAsC,MAAM,iBAAiB,CAAC;AACxF,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,KAAK,eAAe,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAG3E,OAAO,EACL,KAAK,KAAK,EACV,KAAK,qBAAqB,EAC1B,KAAK,aAAa,EAClB,KAAK,YAAY,EAKlB,MAAM,MAAM,CAAC;AAEd;;GAEG;AACH,oBAAY,kBAAkB;IAC5B,IAAI,IAAA;IACJ,QAAQ,IAAA;IACR,OAAO,IAAA;IACP,OAAO,IAAA;CACR;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;OAEG;IACH,KAAK,EAAE,kBAAkB,CAAC;IAC1B;;OAEG;IACH,eAAe,EAAE,SAAS,CAAC;CAC5B;AAED,MAAM,WAAW,aAAa;IAC5B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,qBAAqB,EAAE,MAAM,CAAC;CAC/B;AAQD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,qBAAa,aAAc,SAAQ,UAAU;IAwBzC,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,aAAa;IAErB,OAAO,CAAC,GAAG;IA3Bb,OAAO,CAAC,YAAY,CAA2B;IAC/C,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,WAAW,CAAC,CAAyB;IAC7C,OAAO,CAAC,wBAAwB,CAAM;IACtC,OAAO,CAAC,wBAAwB,CAAM;IAEtC,OAAO,CAAC,kBAAkB,CAA2B;IACrD,OAAO,CAAC,wBAAwB,CAAyB;IACzD,OAAO,CAAC,wBAAwB,CAAyB;IAEzD,OAAO,CAAC,WAAW,CAAC;IAEpB,OAAO,CAAC,WAAW,CAAoB;IAEvC,SAAS,CAAC,oBAAoB,CAAC,EAAE,qBAAqB,CAAC,OAAO,eAAe,EAAE,YAAY,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC,CACtG;IAKZ,OAAO,CAAC,cAAc,CAAc;gBAG1B,MAAM,EAAE,aAAa,GAAG,iBAAiB,GAAG,cAAc,EAC1D,KAAK,EAAE,YAAY,EACnB,aAAa,EAAE,aAAa,EACpC,SAAS,GAAE,eAA2C,EAC9C,GAAG,yCAA0B;IAkC1B,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC;IA8B1E,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAI3D,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC;IA6BtB,sBAAsB,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAyBhE,KAAK;IAmClB;;;OAGG;IACU,IAAI;IAQjB;;;OAGG;IACI,OAAO;IAId;;;OAGG;IACI,uBAAuB;IAI9B;;;OAGG;IACI,uBAAuB;IAI9B;;;OAGG;IACU,SAAS,IAAI,OAAO,CAAC,gBAAgB,CAAC;IAYnD;;;;OAIG;YACW,oBAAoB;IAYlC;;;;OAIG;YACW,oBAAoB;YAWpB,mBAAmB;IAqBjC,OAAO,CAAC,qBAAqB;IAc7B;;;OAGG;IACH,OAAO,CAAC,eAAe;CAIxB"}
@@ -1,305 +0,0 @@
1
- import { L2BlockStream, } from '@aztec/circuit-types';
2
- import { INITIAL_L2_BLOCK_NUM } from '@aztec/circuits.js/constants';
3
- import { createEthereumChain } from '@aztec/ethereum';
4
- import { EthAddress } from '@aztec/foundation/eth-address';
5
- import { createLogger } from '@aztec/foundation/log';
6
- import { SlashFactoryAbi } from '@aztec/l1-artifacts';
7
- import { WithTracer } from '@aztec/telemetry-client';
8
- import { NoopTelemetryClient } from '@aztec/telemetry-client/noop';
9
- import { createPublicClient, getAddress, getContract, http, } from 'viem';
10
- /**
11
- * Enum defining the possible states of the Slasher client.
12
- */
13
- export var SlasherClientState;
14
- (function (SlasherClientState) {
15
- SlasherClientState[SlasherClientState["IDLE"] = 0] = "IDLE";
16
- SlasherClientState[SlasherClientState["SYNCHING"] = 1] = "SYNCHING";
17
- SlasherClientState[SlasherClientState["RUNNING"] = 2] = "RUNNING";
18
- SlasherClientState[SlasherClientState["STOPPED"] = 3] = "STOPPED";
19
- })(SlasherClientState || (SlasherClientState = {}));
20
- /**
21
- * @notice A Hypomeiones slasher client implementation
22
- *
23
- * Hypomeiones: a class of individuals in ancient Sparta who were considered inferior or lesser citizens compared
24
- * to the full Spartan citizens.
25
- *
26
- * The implementation here is less than ideal. It exists, not to be the end all be all, but to show that
27
- * slashing can be done with this mechanism.
28
- *
29
- * The implementation is VERY brute in the sense that it only looks for pruned blocks and then tries to slash
30
- * the full committee of that.
31
- * If it sees a prune, it will mark the full epoch as "to be slashed".
32
- *
33
- * Also, it is not particularly smart around what it should if there were to be multiple slashing events.
34
- *
35
- * A few improvements:
36
- * - Only vote on the proposal if it is possible to reach, e.g., if 6 votes are needed and only 4 slots are left don't vote.
37
- * - Stop voting on a payload once it is processed.
38
- * - Only vote on the proposal if it have not already been executed
39
- * - Caveat, we need to fully decide if it is acceptable to have the same payload address multiple times. In the current
40
- * slash factory that could mean slashing the same committee for the same error multiple times.
41
- * - Decide how to deal with multiple slashing events in the same round.
42
- * - This could be that multiple epochs are pruned in the same round, but with the current naive implementation we could end up
43
- * slashing only the first, because the "lifetime" of the second would have passed after that vote
44
- */
45
- export class SlasherClient extends WithTracer {
46
- constructor(config, store, l2BlockSource, telemetry = new NoopTelemetryClient(), log = createLogger('slasher')) {
47
- super(telemetry, 'slasher');
48
- this.config = config;
49
- this.store = store;
50
- this.l2BlockSource = l2BlockSource;
51
- this.log = log;
52
- this.currentState = SlasherClientState.IDLE;
53
- this.syncPromise = Promise.resolve();
54
- this.syncResolve = undefined;
55
- this.latestBlockNumberAtStart = -1;
56
- this.provenBlockNumberAtStart = -1;
57
- this.slashEvents = [];
58
- this.slashFactoryContract = undefined;
59
- // The amount to slash for a prune.
60
- // Note that we set it to 0, such that no actual slashing will happen, but the event will be fired,
61
- // showing that the slashing mechanism is working.
62
- this.slashingAmount = 0n;
63
- this.blockStream = new L2BlockStream(l2BlockSource, this, this, createLogger('slasher:block_stream'), {
64
- batchSize: config.blockRequestBatchSize,
65
- pollIntervalMS: config.blockCheckIntervalMS,
66
- });
67
- this.synchedBlockHashes = store.openMap('slasher_block_hashes');
68
- this.synchedLatestBlockNumber = store.openSingleton('slasher_last_l2_block');
69
- this.synchedProvenBlockNumber = store.openSingleton('slasher_last_proven_l2_block');
70
- if (config.l1Contracts.slashFactoryAddress && config.l1Contracts.slashFactoryAddress !== EthAddress.ZERO) {
71
- const chain = createEthereumChain(config.l1RpcUrl, config.l1ChainId);
72
- const publicClient = createPublicClient({
73
- chain: chain.chainInfo,
74
- transport: http(chain.rpcUrl),
75
- pollingInterval: config.viemPollingIntervalMS,
76
- });
77
- this.slashFactoryContract = getContract({
78
- address: getAddress(config.l1Contracts.slashFactoryAddress.toString()),
79
- abi: SlashFactoryAbi,
80
- client: publicClient,
81
- });
82
- }
83
- else {
84
- this.log.warn('No slash factory address found, slashing will not be enabled');
85
- }
86
- this.log.info(`Slasher client initialized`);
87
- }
88
- // This is where we should put a bunch of the improvements mentioned earlier.
89
- async getSlashPayload(slotNumber) {
90
- if (!this.slashFactoryContract) {
91
- return undefined;
92
- }
93
- // As long as the slot is greater than the lifetime, we want to keep deleting the first element
94
- // since it will not make sense to include anymore.
95
- while (this.slashEvents.length > 0 && this.slashEvents[0].lifetime < slotNumber) {
96
- this.slashEvents.shift();
97
- }
98
- if (this.slashEvents.length == 0) {
99
- return undefined;
100
- }
101
- const slashEvent = this.slashEvents[0];
102
- const [payloadAddress, isDeployed] = await this.slashFactoryContract.read.getAddressAndIsDeployed([
103
- slashEvent.epoch,
104
- slashEvent.amount,
105
- ]);
106
- if (!isDeployed) {
107
- // The proposal cannot be executed until it is deployed
108
- this.log.verbose(`Voting on not yet deployed payload: ${payloadAddress}`);
109
- }
110
- return EthAddress.fromString(payloadAddress);
111
- }
112
- getL2BlockHash(number) {
113
- return Promise.resolve(this.synchedBlockHashes.get(number));
114
- }
115
- getL2Tips() {
116
- const latestBlockNumber = this.getSyncedLatestBlockNum();
117
- let latestBlockHash;
118
- const provenBlockNumber = this.getSyncedProvenBlockNum();
119
- let provenBlockHash;
120
- if (latestBlockNumber > 0) {
121
- latestBlockHash = this.synchedBlockHashes.get(latestBlockNumber);
122
- if (typeof latestBlockHash === 'undefined') {
123
- this.log.warn(`Block hash for latest block ${latestBlockNumber} not found`);
124
- throw new Error();
125
- }
126
- }
127
- if (provenBlockNumber > 0) {
128
- provenBlockHash = this.synchedBlockHashes.get(provenBlockNumber);
129
- if (typeof provenBlockHash === 'undefined') {
130
- this.log.warn(`Block hash for proven block ${provenBlockNumber} not found`);
131
- throw new Error();
132
- }
133
- }
134
- return Promise.resolve({
135
- latest: { hash: latestBlockHash, number: latestBlockNumber },
136
- proven: { hash: provenBlockHash, number: provenBlockNumber },
137
- finalized: { hash: provenBlockHash, number: provenBlockNumber },
138
- });
139
- }
140
- async handleBlockStreamEvent(event) {
141
- this.log.debug(`Handling block stream event ${event.type}`);
142
- switch (event.type) {
143
- case 'blocks-added':
144
- await this.handleLatestL2Blocks(event.blocks);
145
- break;
146
- case 'chain-finalized':
147
- // TODO (alexg): I think we can prune the block hashes map here
148
- break;
149
- case 'chain-proven': {
150
- const from = this.getSyncedProvenBlockNum() + 1;
151
- const limit = event.blockNumber - from + 1;
152
- await this.handleProvenL2Blocks(await this.l2BlockSource.getBlocks(from, limit));
153
- break;
154
- }
155
- case 'chain-pruned':
156
- await this.handlePruneL2Blocks(event.blockNumber);
157
- break;
158
- default: {
159
- const _ = event;
160
- break;
161
- }
162
- }
163
- }
164
- async start() {
165
- if (this.currentState === SlasherClientState.STOPPED) {
166
- throw new Error('Slasher already stopped');
167
- }
168
- if (this.currentState !== SlasherClientState.IDLE) {
169
- return this.syncPromise;
170
- }
171
- // get the current latest block numbers
172
- this.latestBlockNumberAtStart = await this.l2BlockSource.getBlockNumber();
173
- this.provenBlockNumberAtStart = await this.l2BlockSource.getProvenBlockNumber();
174
- const syncedLatestBlock = this.getSyncedLatestBlockNum() + 1;
175
- const syncedProvenBlock = this.getSyncedProvenBlockNum() + 1;
176
- // if there are blocks to be retrieved, go to a synching state
177
- if (syncedLatestBlock <= this.latestBlockNumberAtStart || syncedProvenBlock <= this.provenBlockNumberAtStart) {
178
- this.setCurrentState(SlasherClientState.SYNCHING);
179
- this.syncPromise = new Promise(resolve => {
180
- this.syncResolve = resolve;
181
- });
182
- this.log.verbose(`Starting sync from ${syncedLatestBlock} (last proven ${syncedProvenBlock})`);
183
- }
184
- else {
185
- // if no blocks to be retrieved, go straight to running
186
- this.setCurrentState(SlasherClientState.RUNNING);
187
- this.syncPromise = Promise.resolve();
188
- this.log.verbose(`Block ${syncedLatestBlock} (proven ${syncedProvenBlock}) already beyond current block`);
189
- }
190
- this.blockStream.start();
191
- this.log.verbose(`Started block downloader from block ${syncedLatestBlock}`);
192
- return this.syncPromise;
193
- }
194
- /**
195
- * Allows consumers to stop the instance of the slasher client.
196
- * 'ready' will now return 'false' and the running promise that keeps the client synced is interrupted.
197
- */
198
- async stop() {
199
- this.log.debug('Stopping Slasher client...');
200
- await this.blockStream.stop();
201
- this.log.debug('Stopped block downloader');
202
- this.setCurrentState(SlasherClientState.STOPPED);
203
- this.log.info('Slasher client stopped.');
204
- }
205
- /**
206
- * Public function to check if the slasher client is fully synced and ready to receive txs.
207
- * @returns True if the slasher client is ready to receive txs.
208
- */
209
- isReady() {
210
- return this.currentState === SlasherClientState.RUNNING;
211
- }
212
- /**
213
- * Public function to check the latest block number that the slasher client is synced to.
214
- * @returns Block number of latest L2 Block we've synced with.
215
- */
216
- getSyncedLatestBlockNum() {
217
- return this.synchedLatestBlockNumber.get() ?? INITIAL_L2_BLOCK_NUM - 1;
218
- }
219
- /**
220
- * Public function to check the latest proven block number that the slasher client is synced to.
221
- * @returns Block number of latest proven L2 Block we've synced with.
222
- */
223
- getSyncedProvenBlockNum() {
224
- return this.synchedProvenBlockNumber.get() ?? INITIAL_L2_BLOCK_NUM - 1;
225
- }
226
- /**
227
- * Method to check the status of the slasher client.
228
- * @returns Information about slasher client status: state & syncedToBlockNum.
229
- */
230
- async getStatus() {
231
- const blockNumber = this.getSyncedLatestBlockNum();
232
- const blockHash = blockNumber == 0
233
- ? ''
234
- : await this.l2BlockSource.getBlockHeader(blockNumber).then(header => header?.hash().toString());
235
- return Promise.resolve({
236
- state: this.currentState,
237
- syncedToL2Block: { number: blockNumber, hash: blockHash },
238
- });
239
- }
240
- /**
241
- * Handles new blocks
242
- * @param blocks - A list of blocks that the slasher client needs to store block hashes for
243
- * @returns Empty promise.
244
- */
245
- async handleLatestL2Blocks(blocks) {
246
- if (!blocks.length) {
247
- return Promise.resolve();
248
- }
249
- const lastBlockNum = blocks[blocks.length - 1].number;
250
- await Promise.all(blocks.map(block => this.synchedBlockHashes.set(block.number, block.hash().toString())));
251
- await this.synchedLatestBlockNumber.set(lastBlockNum);
252
- this.log.debug(`Synched to latest block ${lastBlockNum}`);
253
- this.startServiceIfSynched();
254
- }
255
- /**
256
- * Handles new proven blocks by updating the proven block number
257
- * @param blocks - A list of proven L2 blocks.
258
- * @returns Empty promise.
259
- */
260
- async handleProvenL2Blocks(blocks) {
261
- if (!blocks.length) {
262
- return Promise.resolve();
263
- }
264
- const lastBlockNum = blocks[blocks.length - 1].number;
265
- await this.synchedProvenBlockNumber.set(lastBlockNum);
266
- this.log.debug(`Synched to proven block ${lastBlockNum}`);
267
- this.startServiceIfSynched();
268
- }
269
- async handlePruneL2Blocks(latestBlock) {
270
- const blockHeader = await this.l2BlockSource.getBlockHeader(latestBlock);
271
- const slotNumber = blockHeader ? blockHeader.globalVariables.slotNumber.toBigInt() : BigInt(0);
272
- const epochNumber = slotNumber / BigInt(this.config.aztecEpochDuration);
273
- this.log.info(`Detected chain prune. Punishing the validators at epoch ${epochNumber}`);
274
- // Set the lifetime such that we have a full round that we could vote throughout.
275
- const slotsIntoRound = slotNumber % BigInt(this.config.slashingRoundSize);
276
- const toNext = slotsIntoRound == 0n ? 0n : BigInt(this.config.slashingRoundSize) - slotsIntoRound;
277
- const lifetime = slotNumber + toNext + BigInt(this.config.slashingRoundSize);
278
- this.slashEvents.push({
279
- epoch: epochNumber,
280
- amount: this.slashingAmount,
281
- lifetime,
282
- });
283
- await this.synchedLatestBlockNumber.set(latestBlock);
284
- }
285
- startServiceIfSynched() {
286
- if (this.currentState === SlasherClientState.SYNCHING &&
287
- this.getSyncedLatestBlockNum() >= this.latestBlockNumberAtStart &&
288
- this.getSyncedProvenBlockNum() >= this.provenBlockNumberAtStart) {
289
- this.log.debug(`Synched to blocks at start`);
290
- this.setCurrentState(SlasherClientState.RUNNING);
291
- if (this.syncResolve !== undefined) {
292
- this.syncResolve();
293
- }
294
- }
295
- }
296
- /**
297
- * Method to set the value of the current state.
298
- * @param newState - New state value.
299
- */
300
- setCurrentState(newState) {
301
- this.currentState = newState;
302
- this.log.debug(`Moved to state ${SlasherClientState[this.currentState]}`);
303
- }
304
- }
305
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xhc2hlcl9jbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2xhc2hlci9zbGFzaGVyX2NsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBSUwsYUFBYSxHQUdkLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDcEUsT0FBTyxFQUErQyxtQkFBbUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ25HLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUMzRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFckQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBd0IsVUFBVSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDM0UsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFFbkUsT0FBTyxFQUtMLGtCQUFrQixFQUNsQixVQUFVLEVBQ1YsV0FBVyxFQUNYLElBQUksR0FDTCxNQUFNLE1BQU0sQ0FBQztBQUVkOztHQUVHO0FBQ0gsTUFBTSxDQUFOLElBQVksa0JBS1g7QUFMRCxXQUFZLGtCQUFrQjtJQUM1QiwyREFBSSxDQUFBO0lBQ0osbUVBQVEsQ0FBQTtJQUNSLGlFQUFPLENBQUE7SUFDUCxpRUFBTyxDQUFBO0FBQ1QsQ0FBQyxFQUxXLGtCQUFrQixLQUFsQixrQkFBa0IsUUFLN0I7QUEyQkQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXdCRztBQUNILE1BQU0sT0FBTyxhQUFjLFNBQVEsVUFBVTtJQXVCM0MsWUFDVSxNQUEwRCxFQUMxRCxLQUFtQixFQUNuQixhQUE0QixFQUNwQyxZQUE2QixJQUFJLG1CQUFtQixFQUFFLEVBQzlDLE1BQU0sWUFBWSxDQUFDLFNBQVMsQ0FBQztRQUVyQyxLQUFLLENBQUMsU0FB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
@@ -1,22 +0,0 @@
1
- import type { L2BlockSource } from '@aztec/circuit-types';
2
- import { type L1ContractsConfig, type L1ReaderConfig } from '@aztec/ethereum';
3
- import { createLogger } from '@aztec/foundation/log';
4
- import { type AztecKVStore } from '@aztec/kv-store';
5
- import { type DataStoreConfig } from '@aztec/kv-store/config';
6
- import { createStore } from '@aztec/kv-store/lmdb';
7
- import { type TelemetryClient } from '@aztec/telemetry-client';
8
- import { NoopTelemetryClient } from '@aztec/telemetry-client/noop';
9
-
10
- import { SlasherClient } from './slasher_client.js';
11
- import { type SlasherConfig } from './slasher_client.js';
12
-
13
- export const createSlasherClient = async (
14
- _config: SlasherConfig & DataStoreConfig & L1ContractsConfig & L1ReaderConfig,
15
- l2BlockSource: L2BlockSource,
16
- telemetry: TelemetryClient = new NoopTelemetryClient(),
17
- deps: { store?: AztecKVStore } = {},
18
- ) => {
19
- const config = { ..._config };
20
- const store = deps.store ?? (await createStore('slasher', config, createLogger('slasher:lmdb')));
21
- return new SlasherClient(config, store, l2BlockSource, telemetry);
22
- };
@@ -1,2 +0,0 @@
1
- export * from './slasher_client.js';
2
- export { createSlasherClient } from './factory.js';