@aztec/sequencer-client 0.0.1-commit.b655e406 → 0.0.1-commit.fce3e4f
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/client/index.d.ts +1 -1
- package/dest/client/sequencer-client.d.ts +1 -1
- package/dest/client/sequencer-client.d.ts.map +1 -1
- package/dest/client/sequencer-client.js +2 -1
- package/dest/config.d.ts +1 -1
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +9 -0
- package/dest/global_variable_builder/global_builder.d.ts +3 -6
- package/dest/global_variable_builder/global_builder.d.ts.map +1 -1
- package/dest/global_variable_builder/global_builder.js +9 -6
- package/dest/global_variable_builder/index.d.ts +1 -1
- package/dest/index.d.ts +1 -1
- package/dest/publisher/config.d.ts +3 -1
- package/dest/publisher/config.d.ts.map +1 -1
- package/dest/publisher/config.js +5 -0
- package/dest/publisher/index.d.ts +1 -1
- package/dest/publisher/sequencer-publisher-factory.d.ts +1 -1
- package/dest/publisher/sequencer-publisher-factory.d.ts.map +1 -1
- package/dest/publisher/sequencer-publisher-metrics.d.ts +1 -1
- package/dest/publisher/sequencer-publisher-metrics.d.ts.map +1 -1
- package/dest/publisher/sequencer-publisher.d.ts +29 -23
- package/dest/publisher/sequencer-publisher.d.ts.map +1 -1
- package/dest/publisher/sequencer-publisher.js +108 -57
- package/dest/sequencer/block_builder.d.ts +1 -1
- package/dest/sequencer/block_builder.d.ts.map +1 -1
- package/dest/sequencer/block_builder.js +10 -6
- package/dest/sequencer/config.d.ts +1 -1
- package/dest/sequencer/errors.d.ts +1 -1
- package/dest/sequencer/errors.d.ts.map +1 -1
- package/dest/sequencer/index.d.ts +1 -1
- package/dest/sequencer/metrics.d.ts +11 -2
- package/dest/sequencer/metrics.d.ts.map +1 -1
- package/dest/sequencer/metrics.js +38 -0
- package/dest/sequencer/sequencer.d.ts +17 -25
- package/dest/sequencer/sequencer.d.ts.map +1 -1
- package/dest/sequencer/sequencer.js +169 -46
- package/dest/sequencer/timetable.d.ts +1 -1
- package/dest/sequencer/timetable.d.ts.map +1 -1
- package/dest/sequencer/utils.d.ts +1 -1
- package/dest/test/index.d.ts +1 -1
- package/dest/tx_validator/nullifier_cache.d.ts +1 -1
- package/dest/tx_validator/nullifier_cache.d.ts.map +1 -1
- package/dest/tx_validator/tx_validator_factory.d.ts +2 -2
- package/dest/tx_validator/tx_validator_factory.d.ts.map +1 -1
- package/package.json +31 -30
- package/src/client/sequencer-client.ts +2 -2
- package/src/config.ts +10 -0
- package/src/global_variable_builder/global_builder.ts +12 -8
- package/src/publisher/config.ts +8 -0
- package/src/publisher/sequencer-publisher-factory.ts +2 -1
- package/src/publisher/sequencer-publisher.ts +125 -70
- package/src/sequencer/block_builder.ts +10 -6
- package/src/sequencer/metrics.ts +51 -2
- package/src/sequencer/sequencer.ts +204 -60
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { L2Block } from '@aztec/aztec.js/block';
|
|
2
2
|
import type { EpochCache } from '@aztec/epoch-cache';
|
|
3
3
|
import { type RollupContract } from '@aztec/ethereum';
|
|
4
|
+
import { SlotNumber } from '@aztec/foundation/branded-types';
|
|
4
5
|
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
5
6
|
import { Signature } from '@aztec/foundation/eth-signature';
|
|
6
7
|
import { Fr } from '@aztec/foundation/fields';
|
|
@@ -8,7 +9,7 @@ import { type DateProvider } from '@aztec/foundation/timer';
|
|
|
8
9
|
import { type TypedEventEmitter } from '@aztec/foundation/types';
|
|
9
10
|
import type { P2P } from '@aztec/p2p';
|
|
10
11
|
import type { SlasherClientInterface } from '@aztec/slasher';
|
|
11
|
-
import {
|
|
12
|
+
import { CommitteeAttestationsAndSigners, type L2BlockSource, type ValidateBlockResult } from '@aztec/stdlib/block';
|
|
12
13
|
import { type L1RollupConstants } from '@aztec/stdlib/epoch-helpers';
|
|
13
14
|
import { type IFullNodeBlockBuilder, type PublicProcessorLimits, type WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server';
|
|
14
15
|
import type { L1ToL2MessageSource } from '@aztec/stdlib/messaging';
|
|
@@ -28,7 +29,7 @@ export type SequencerEvents = {
|
|
|
28
29
|
oldState: SequencerState;
|
|
29
30
|
newState: SequencerState;
|
|
30
31
|
secondsIntoSlot?: number;
|
|
31
|
-
slotNumber?:
|
|
32
|
+
slotNumber?: SlotNumber;
|
|
32
33
|
}) => void;
|
|
33
34
|
['proposer-rollup-check-failed']: (args: {
|
|
34
35
|
reason: string;
|
|
@@ -91,12 +92,13 @@ export declare class Sequencer extends Sequencer_base {
|
|
|
91
92
|
private governanceProposerPayload;
|
|
92
93
|
/** The last slot for which we attempted to vote when sync failed, to prevent duplicate attempts. */
|
|
93
94
|
private lastSlotForVoteWhenSyncFailed;
|
|
95
|
+
/** The last slot for which we built a validation block in fisherman mode, to prevent duplicate attempts. */
|
|
96
|
+
private lastSlotForValidationBlock;
|
|
94
97
|
/** The maximum number of seconds that the sequencer can be into a slot to transition to a particular state. */
|
|
95
98
|
protected timetable: SequencerTimetable;
|
|
96
99
|
protected enforceTimeTable: boolean;
|
|
97
100
|
protected publisher: SequencerPublisher | undefined;
|
|
98
|
-
constructor(publisherFactory: SequencerPublisherFactory, validatorClient: ValidatorClient | undefined,
|
|
99
|
-
globalsBuilder: GlobalVariableBuilder, p2pClient: P2P, worldState: WorldStateSynchronizer, slasherClient: SlasherClientInterface | undefined, l2BlockSource: L2BlockSource, l1ToL2MessageSource: L1ToL2MessageSource, blockBuilder: IFullNodeBlockBuilder, l1Constants: SequencerRollupConstants, dateProvider: DateProvider, epochCache: EpochCache, rollupContract: RollupContract, config: SequencerConfig, telemetry?: TelemetryClient, log?: import("@aztec/foundation/log").Logger);
|
|
101
|
+
constructor(publisherFactory: SequencerPublisherFactory, validatorClient: ValidatorClient | undefined, globalsBuilder: GlobalVariableBuilder, p2pClient: P2P, worldState: WorldStateSynchronizer, slasherClient: SlasherClientInterface | undefined, l2BlockSource: L2BlockSource, l1ToL2MessageSource: L1ToL2MessageSource, blockBuilder: IFullNodeBlockBuilder, l1Constants: SequencerRollupConstants, dateProvider: DateProvider, epochCache: EpochCache, rollupContract: RollupContract, config: SequencerConfig, telemetry?: TelemetryClient, log?: import("@aztec/foundation/log").Logger);
|
|
100
102
|
get tracer(): Tracer;
|
|
101
103
|
getValidatorAddresses(): EthAddress[] | undefined;
|
|
102
104
|
getConfig(): SequencerConfig;
|
|
@@ -131,7 +133,6 @@ export declare class Sequencer extends Sequencer_base {
|
|
|
131
133
|
* - If our block for some reason is not included, revert the state
|
|
132
134
|
*/
|
|
133
135
|
protected work(): Promise<void>;
|
|
134
|
-
/** Tries building a block proposal, and if successful, enqueues it for publishing. */
|
|
135
136
|
private tryBuildBlockAndEnqueuePublish;
|
|
136
137
|
protected safeWork(): Promise<void>;
|
|
137
138
|
/**
|
|
@@ -140,27 +141,18 @@ export declare class Sequencer extends Sequencer_base {
|
|
|
140
141
|
* @param slotNumber - The current slot number.
|
|
141
142
|
* @param force - Whether to force the transition even if the sequencer is stopped.
|
|
142
143
|
*/
|
|
143
|
-
setState(proposedState: SequencerStateWithSlot, slotNumber:
|
|
144
|
+
setState(proposedState: SequencerStateWithSlot, slotNumber: SlotNumber, opts?: {
|
|
144
145
|
force?: boolean;
|
|
145
146
|
}): void;
|
|
146
147
|
setState(proposedState: Exclude<SequencerState, SequencerStateWithSlot>, slotNumber?: undefined, opts?: {
|
|
147
148
|
force?: boolean;
|
|
148
149
|
}): void;
|
|
149
150
|
private dropFailedTxsFromP2P;
|
|
150
|
-
protected getBlockBuilderOptions(slot:
|
|
151
|
-
/**
|
|
152
|
-
* @notice Build and propose a block to the chain
|
|
153
|
-
*
|
|
154
|
-
* @dev MUST throw instead of exiting early to ensure that world-state
|
|
155
|
-
* is being rolled back if the block is dropped.
|
|
156
|
-
*
|
|
157
|
-
* @param pendingTxs - Iterable of pending transactions to construct the block from
|
|
158
|
-
* @param proposalHeader - The partial header constructed for the proposal
|
|
159
|
-
* @param newGlobalVariables - The global variables for the new block
|
|
160
|
-
* @param proposerAddress - The address of the proposer
|
|
161
|
-
*/
|
|
151
|
+
protected getBlockBuilderOptions(slot: SlotNumber): PublicProcessorLimits;
|
|
162
152
|
private buildBlockAndEnqueuePublish;
|
|
163
|
-
protected collectAttestations(block: L2Block, txs: Tx[], proposerAddress: EthAddress | undefined): Promise<
|
|
153
|
+
protected collectAttestations(block: L2Block, txs: Tx[], proposerAddress: EthAddress | undefined): Promise<CommitteeAttestationsAndSigners>;
|
|
154
|
+
/** Breaks the attestations before publishing based on attack configs */
|
|
155
|
+
private manipulateAttestations;
|
|
164
156
|
/**
|
|
165
157
|
* Publishes the L2Block to the rollup contract.
|
|
166
158
|
* @param block - The L2Block to be published.
|
|
@@ -172,7 +164,7 @@ export declare class Sequencer extends Sequencer_base {
|
|
|
172
164
|
*/
|
|
173
165
|
protected checkSync(args: {
|
|
174
166
|
ts: bigint;
|
|
175
|
-
slot:
|
|
167
|
+
slot: SlotNumber;
|
|
176
168
|
}): Promise<{
|
|
177
169
|
block?: L2Block;
|
|
178
170
|
blockNumber: number;
|
|
@@ -189,18 +181,18 @@ export declare class Sequencer extends Sequencer_base {
|
|
|
189
181
|
* @param context - Optional context for logging (e.g., block number)
|
|
190
182
|
* @returns A tuple of [governanceEnqueued, slashingEnqueued]
|
|
191
183
|
*/
|
|
192
|
-
protected enqueueGovernanceAndSlashingVotes(publisher: SequencerPublisher, attestorAddress: EthAddress, slot:
|
|
184
|
+
protected enqueueGovernanceAndSlashingVotes(publisher: SequencerPublisher, attestorAddress: EthAddress, slot: SlotNumber, timestamp: bigint): [Promise<boolean> | undefined, Promise<boolean> | undefined];
|
|
193
185
|
/**
|
|
194
186
|
* Checks if we are the proposer for the next slot.
|
|
195
187
|
* @returns True if we can propose, and the proposer address (undefined if anyone can propose)
|
|
196
188
|
*/
|
|
197
|
-
protected checkCanPropose(slot:
|
|
189
|
+
protected checkCanPropose(slot: SlotNumber): Promise<[boolean, EthAddress | undefined]>;
|
|
198
190
|
/**
|
|
199
191
|
* Tries to vote on slashing actions and governance when the sync check fails but we're past the max time for initializing a proposal.
|
|
200
192
|
* This allows the sequencer to participate in governance/slashing votes even when it cannot build blocks.
|
|
201
193
|
*/
|
|
202
194
|
protected tryVoteWhenSyncFails(args: {
|
|
203
|
-
slot:
|
|
195
|
+
slot: SlotNumber;
|
|
204
196
|
ts: bigint;
|
|
205
197
|
}): Promise<void>;
|
|
206
198
|
/**
|
|
@@ -209,11 +201,11 @@ export declare class Sequencer extends Sequencer_base {
|
|
|
209
201
|
* have the proposer try to invalidate, but if they fail, the sequencers in the committee are expected to try,
|
|
210
202
|
* and if they fail, any sequencer will try as well.
|
|
211
203
|
*/
|
|
212
|
-
protected considerInvalidatingBlock(syncedTo: NonNullable<Awaited<ReturnType<Sequencer['checkSync']>>>, currentSlot:
|
|
204
|
+
protected considerInvalidatingBlock(syncedTo: NonNullable<Awaited<ReturnType<Sequencer['checkSync']>>>, currentSlot: SlotNumber): Promise<void>;
|
|
213
205
|
private getSlotStartBuildTimestamp;
|
|
214
206
|
private getSecondsIntoSlot;
|
|
215
207
|
get aztecSlotDuration(): number;
|
|
216
208
|
get maxL2BlockGas(): number | undefined;
|
|
217
209
|
getSlasherClient(): SlasherClientInterface | undefined;
|
|
218
210
|
}
|
|
219
|
-
//# sourceMappingURL=
|
|
211
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VxdWVuY2VyLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VxdWVuY2VyL3NlcXVlbmNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFaEQsT0FBTyxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDckQsT0FBTyxFQUF3QyxLQUFLLGNBQWMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzVGLE9BQU8sRUFBZSxVQUFVLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUcxRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDM0QsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQzVELE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUc5QyxPQUFPLEVBQUUsS0FBSyxZQUFZLEVBQVMsTUFBTSx5QkFBeUIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsS0FBSyxpQkFBaUIsRUFBWSxNQUFNLHlCQUF5QixDQUFDO0FBQzNFLE9BQU8sS0FBSyxFQUFFLEdBQUcsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUN0QyxPQUFPLEtBQUssRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdELE9BQU8sRUFFTCwrQkFBK0IsRUFDL0IsS0FBSyxhQUFhLEVBRWxCLEtBQUssbUJBQW1CLEVBQ3pCLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFFLEtBQUssaUJBQWlCLEVBQWtELE1BQU0sNkJBQTZCLENBQUM7QUFFckgsT0FBTyxFQUNMLEtBQUsscUJBQXFCLEVBQzFCLEtBQUsscUJBQXFCLEVBRTFCLEtBQUssc0JBQXNCLEVBQzVCLE1BQU0saUNBQWlDLENBQUM7QUFDekMsT0FBTyxLQUFLLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQU9u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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sequencer.d.ts","sourceRoot":"","sources":["../../src/sequencer/sequencer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAEhD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAwC,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"sequencer.d.ts","sourceRoot":"","sources":["../../src/sequencer/sequencer.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,7 +4,7 @@ function _ts_decorate(decorators, target, key, desc) {
|
|
|
4
4
|
else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
5
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
6
|
}
|
|
7
|
-
import {
|
|
7
|
+
import { BLOBS_PER_CHECKPOINT, FIELDS_PER_BLOB, INITIAL_L2_BLOCK_NUM } from '@aztec/constants';
|
|
8
8
|
import { FormattedViemError, NoCommitteeError } from '@aztec/ethereum';
|
|
9
9
|
import { omit, pick } from '@aztec/foundation/collection';
|
|
10
10
|
import { randomInt } from '@aztec/foundation/crypto';
|
|
@@ -15,7 +15,7 @@ import { createLogger } from '@aztec/foundation/log';
|
|
|
15
15
|
import { RunningPromise } from '@aztec/foundation/running-promise';
|
|
16
16
|
import { Timer } from '@aztec/foundation/timer';
|
|
17
17
|
import { unfreeze } from '@aztec/foundation/types';
|
|
18
|
-
import { CommitteeAttestationsAndSigners } from '@aztec/stdlib/block';
|
|
18
|
+
import { CommitteeAttestationsAndSigners, MaliciousCommitteeAttestationsAndSigners } from '@aztec/stdlib/block';
|
|
19
19
|
import { getSlotAtTimestamp, getSlotStartBuildTimestamp } from '@aztec/stdlib/epoch-helpers';
|
|
20
20
|
import { Gas } from '@aztec/stdlib/gas';
|
|
21
21
|
import { SequencerConfigSchema } from '@aztec/stdlib/interfaces/server';
|
|
@@ -69,6 +69,7 @@ export { SequencerState };
|
|
|
69
69
|
lastBlockPublished;
|
|
70
70
|
governanceProposerPayload;
|
|
71
71
|
/** The last slot for which we attempted to vote when sync failed, to prevent duplicate attempts. */ lastSlotForVoteWhenSyncFailed;
|
|
72
|
+
/** The last slot for which we built a validation block in fisherman mode, to prevent duplicate attempts. */ lastSlotForValidationBlock;
|
|
72
73
|
/** The maximum number of seconds that the sequencer can be into a slot to transition to a particular state. */ timetable;
|
|
73
74
|
enforceTimeTable;
|
|
74
75
|
// This shouldn't be here as this gets re-created each time we build/propose a block.
|
|
@@ -79,6 +80,10 @@ export { SequencerState };
|
|
|
79
80
|
publisher;
|
|
80
81
|
constructor(publisherFactory, validatorClient, globalsBuilder, p2pClient, worldState, slasherClient, l2BlockSource, l1ToL2MessageSource, blockBuilder, l1Constants, dateProvider, epochCache, rollupContract, config, telemetry = getTelemetryClient(), log = createLogger('sequencer')){
|
|
81
82
|
super(), this.publisherFactory = publisherFactory, this.validatorClient = validatorClient, this.globalsBuilder = globalsBuilder, this.p2pClient = p2pClient, this.worldState = worldState, this.slasherClient = slasherClient, this.l2BlockSource = l2BlockSource, this.l1ToL2MessageSource = l1ToL2MessageSource, this.blockBuilder = blockBuilder, this.l1Constants = l1Constants, this.dateProvider = dateProvider, this.epochCache = epochCache, this.rollupContract = rollupContract, this.config = config, this.telemetry = telemetry, this.log = log, this.pollingIntervalMs = 1000, this.maxTxsPerBlock = 32, this.minTxsPerBlock = 1, this.maxL1TxInclusionTimeIntoSlot = 0, this.state = SequencerState.STOPPED, this.maxBlockSizeInBytes = 1024 * 1024, this.maxBlockGas = new Gas(100e9, 100e9), this.enforceTimeTable = false;
|
|
83
|
+
// Add [FISHERMAN] prefix to logger if in fisherman mode
|
|
84
|
+
if (this.config.fishermanMode) {
|
|
85
|
+
this.log = log.createChild('[FISHERMAN]');
|
|
86
|
+
}
|
|
82
87
|
this.metrics = new SequencerMetrics(telemetry, this.rollupContract, 'Sequencer');
|
|
83
88
|
// Initialize config
|
|
84
89
|
this.updateConfig(this.config);
|
|
@@ -215,25 +220,50 @@ export { SequencerState };
|
|
|
215
220
|
// Check that we are a proposer for the next slot
|
|
216
221
|
this.setState(SequencerState.PROPOSER_CHECK, slot);
|
|
217
222
|
const [canPropose, proposer] = await this.checkCanPropose(slot);
|
|
218
|
-
// If we are not a proposer
|
|
223
|
+
// If we are not a proposer check if we should invalidate a invalid block, and bail
|
|
219
224
|
if (!canPropose) {
|
|
220
225
|
await this.considerInvalidatingBlock(syncedTo, slot);
|
|
221
226
|
return;
|
|
222
227
|
}
|
|
228
|
+
// In fisherman mode, check if we've already validated this slot to prevent duplicate attempts
|
|
229
|
+
if (this.config.fishermanMode) {
|
|
230
|
+
if (this.lastSlotForValidationBlock === slot) {
|
|
231
|
+
this.log.trace(`Already validated block building for slot ${slot} (skipping)`, {
|
|
232
|
+
slot
|
|
233
|
+
});
|
|
234
|
+
return;
|
|
235
|
+
}
|
|
236
|
+
this.log.debug(`Building validation block for slot ${slot} (actual proposer: ${proposer?.toString() ?? 'none'})`, {
|
|
237
|
+
slot,
|
|
238
|
+
proposer: proposer?.toString()
|
|
239
|
+
});
|
|
240
|
+
// Mark this slot as being validated
|
|
241
|
+
this.lastSlotForValidationBlock = slot;
|
|
242
|
+
}
|
|
223
243
|
// Check that the slot is not taken by a block already (should never happen, since only us can propose for this slot)
|
|
224
244
|
if (syncedTo.block && syncedTo.block.header.getSlot() >= slot) {
|
|
225
245
|
this.log.warn(`Cannot propose block at next L2 slot ${slot} since that slot was taken by block ${syncedTo.blockNumber}`, {
|
|
226
246
|
...syncLogData,
|
|
227
247
|
block: syncedTo.block.header.toInspect()
|
|
228
248
|
});
|
|
249
|
+
this.metrics.recordBlockProposalPrecheckFailed('slot_already_taken');
|
|
229
250
|
return;
|
|
230
251
|
}
|
|
231
252
|
// We now need to get ourselves a publisher.
|
|
232
253
|
// The returned attestor will be the one we provided if we provided one.
|
|
233
254
|
// Otherwise it will be a valid attestor for the returned publisher.
|
|
234
|
-
|
|
255
|
+
// In fisherman mode, pass undefined to use the fisherman's own keystore instead of the actual proposer's
|
|
256
|
+
const { attestorAddress, publisher } = await this.publisherFactory.create(this.config.fishermanMode ? undefined : proposer);
|
|
235
257
|
this.log.verbose(`Created publisher at address ${publisher.getSenderAddress()} for attestor ${attestorAddress}`);
|
|
236
258
|
this.publisher = publisher;
|
|
259
|
+
// In fisherman mode, set the actual proposer's address for simulations
|
|
260
|
+
if (this.config.fishermanMode) {
|
|
261
|
+
if (proposer) {
|
|
262
|
+
publisher.setProposerAddressForSimulation(proposer);
|
|
263
|
+
this.log.debug(`Set proposer address ${proposer} for simulation in fisherman mode`);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
// Get proposer credentials
|
|
237
267
|
const coinbase = this.validatorClient.getCoinbaseForAttestor(attestorAddress);
|
|
238
268
|
const feeRecipient = this.validatorClient.getFeeRecipientForAttestor(attestorAddress);
|
|
239
269
|
// Prepare invalidation request if the pending chain is invalid (returns undefined if no need)
|
|
@@ -246,6 +276,7 @@ export { SequencerState };
|
|
|
246
276
|
this.emit('proposer-rollup-check-failed', {
|
|
247
277
|
reason: 'Rollup contract check failed'
|
|
248
278
|
});
|
|
279
|
+
this.metrics.recordBlockProposalPrecheckFailed('rollup_contract_check_failed');
|
|
249
280
|
return;
|
|
250
281
|
} else if (canProposeCheck.slot !== slot) {
|
|
251
282
|
this.log.warn(`Cannot propose block due to slot mismatch with rollup contract (this can be caused by a clock out of sync). Expected slot ${slot} but got ${canProposeCheck.slot}.`, {
|
|
@@ -257,9 +288,10 @@ export { SequencerState };
|
|
|
257
288
|
this.emit('proposer-rollup-check-failed', {
|
|
258
289
|
reason: 'Slot mismatch'
|
|
259
290
|
});
|
|
291
|
+
this.metrics.recordBlockProposalPrecheckFailed('slot_mismatch');
|
|
260
292
|
return;
|
|
261
|
-
} else if (canProposeCheck.
|
|
262
|
-
this.log.warn(`Cannot propose block due to block mismatch with rollup contract (this can be caused by a pending archiver sync). Expected block ${newBlockNumber} but got ${canProposeCheck.
|
|
293
|
+
} else if (canProposeCheck.checkpointNumber !== BigInt(newBlockNumber)) {
|
|
294
|
+
this.log.warn(`Cannot propose block due to block mismatch with rollup contract (this can be caused by a pending archiver sync). Expected block ${newBlockNumber} but got ${canProposeCheck.checkpointNumber}.`, {
|
|
263
295
|
...syncLogData,
|
|
264
296
|
rollup: canProposeCheck,
|
|
265
297
|
newBlockNumber,
|
|
@@ -268,6 +300,7 @@ export { SequencerState };
|
|
|
268
300
|
this.emit('proposer-rollup-check-failed', {
|
|
269
301
|
reason: 'Block mismatch'
|
|
270
302
|
});
|
|
303
|
+
this.metrics.recordBlockProposalPrecheckFailed('block_number_mismatch');
|
|
271
304
|
return;
|
|
272
305
|
}
|
|
273
306
|
this.log.debug(`Can propose block ${newBlockNumber} at slot ${slot} as ${proposer}`, {
|
|
@@ -275,6 +308,7 @@ export { SequencerState };
|
|
|
275
308
|
});
|
|
276
309
|
const newGlobalVariables = await this.globalsBuilder.buildGlobalVariables(newBlockNumber, coinbase, feeRecipient, slot);
|
|
277
310
|
// Enqueue governance and slashing votes (returns promises that will be awaited later)
|
|
311
|
+
// In fisherman mode, we simulate slashing but don't actually publish to L1
|
|
278
312
|
const votesPromises = this.enqueueGovernanceAndSlashingVotes(publisher, attestorAddress, slot, newGlobalVariables.timestamp);
|
|
279
313
|
// Enqueues block invalidation
|
|
280
314
|
if (invalidateBlock && !this.config.skipInvalidateBlockAsProposer) {
|
|
@@ -282,21 +316,45 @@ export { SequencerState };
|
|
|
282
316
|
}
|
|
283
317
|
// Actual block building
|
|
284
318
|
this.setState(SequencerState.INITIALIZING_PROPOSAL, slot);
|
|
319
|
+
this.metrics.incOpenSlot(slot, proposer?.toString() ?? 'unknown');
|
|
285
320
|
const block = await this.tryBuildBlockAndEnqueuePublish(slot, proposer, newBlockNumber, publisher, newGlobalVariables, chainTipArchive, invalidateBlock);
|
|
286
321
|
// Wait until the voting promises have resolved, so all requests are enqueued
|
|
287
322
|
await Promise.all(votesPromises);
|
|
288
|
-
//
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
323
|
+
// In fisherman mode, we don't publish to L1
|
|
324
|
+
if (this.config.fishermanMode) {
|
|
325
|
+
// Clear pending requests
|
|
326
|
+
publisher.clearPendingRequests();
|
|
327
|
+
if (block) {
|
|
328
|
+
this.log.info(`Validation block building SUCCEEDED for slot ${slot}`, {
|
|
329
|
+
blockNumber: newBlockNumber,
|
|
330
|
+
slot: Number(slot),
|
|
331
|
+
archive: block.archive.toString(),
|
|
332
|
+
txCount: block.body.txEffects.length
|
|
333
|
+
});
|
|
334
|
+
this.lastBlockPublished = block;
|
|
335
|
+
this.metrics.recordBlockProposalSuccess();
|
|
336
|
+
} else {
|
|
337
|
+
// Block building failed in fisherman mode
|
|
338
|
+
this.log.warn(`Validation block building FAILED for slot ${slot}`, {
|
|
339
|
+
blockNumber: newBlockNumber,
|
|
340
|
+
slot: Number(slot)
|
|
341
|
+
});
|
|
342
|
+
this.metrics.recordBlockProposalFailed('block_build_failed');
|
|
343
|
+
}
|
|
344
|
+
} else {
|
|
345
|
+
// Normal mode: send the tx to L1
|
|
346
|
+
const l1Response = await publisher.sendRequests();
|
|
347
|
+
const proposedBlock = l1Response?.successfulActions.find((a)=>a === 'propose');
|
|
348
|
+
if (proposedBlock) {
|
|
349
|
+
this.lastBlockPublished = block;
|
|
350
|
+
this.emit('block-published', {
|
|
351
|
+
blockNumber: newBlockNumber,
|
|
352
|
+
slot: Number(slot)
|
|
353
|
+
});
|
|
354
|
+
await this.metrics.incFilledSlot(publisher.getSenderAddress().toString(), coinbase);
|
|
355
|
+
} else if (block) {
|
|
356
|
+
this.emit('block-publish-failed', l1Response ?? {});
|
|
357
|
+
}
|
|
300
358
|
}
|
|
301
359
|
this.setState(SequencerState.IDLE, undefined);
|
|
302
360
|
}
|
|
@@ -313,6 +371,7 @@ export { SequencerState };
|
|
|
313
371
|
...newGlobalVariables,
|
|
314
372
|
timestamp: newGlobalVariables.timestamp,
|
|
315
373
|
lastArchiveRoot: chainTipArchive,
|
|
374
|
+
blockHeadersHash: Fr.ZERO,
|
|
316
375
|
contentCommitment: ContentCommitment.empty(),
|
|
317
376
|
totalManaUsed: Fr.ZERO
|
|
318
377
|
});
|
|
@@ -336,6 +395,7 @@ export { SequencerState };
|
|
|
336
395
|
slot
|
|
337
396
|
});
|
|
338
397
|
}
|
|
398
|
+
this.metrics.recordBlockProposalFailed(err.name || 'unknown_error');
|
|
339
399
|
}
|
|
340
400
|
} else {
|
|
341
401
|
this.log.verbose(`Not enough txs to build block ${newBlockNumber} at slot ${slot} (got ${pendingTxCount} txs, need ${this.minTxsPerBlock})`, {
|
|
@@ -347,6 +407,7 @@ export { SequencerState };
|
|
|
347
407
|
minTxs: this.minTxsPerBlock,
|
|
348
408
|
availableTxs: pendingTxCount
|
|
349
409
|
});
|
|
410
|
+
this.metrics.recordBlockProposalFailed('insufficient_txs');
|
|
350
411
|
}
|
|
351
412
|
return block;
|
|
352
413
|
}
|
|
@@ -421,7 +482,7 @@ export { SequencerState };
|
|
|
421
482
|
maxTransactions: this.maxTxsPerBlock,
|
|
422
483
|
maxBlockSize: this.maxBlockSizeInBytes,
|
|
423
484
|
maxBlockGas: this.maxBlockGas,
|
|
424
|
-
maxBlobFields:
|
|
485
|
+
maxBlobFields: BLOBS_PER_CHECKPOINT * FIELDS_PER_BLOB,
|
|
425
486
|
deadline
|
|
426
487
|
};
|
|
427
488
|
}
|
|
@@ -438,12 +499,12 @@ export { SequencerState };
|
|
|
438
499
|
*/ async buildBlockAndEnqueuePublish(pendingTxs, proposalHeader, newGlobalVariables, proposerAddress, invalidateBlock, publisher) {
|
|
439
500
|
await publisher.validateBlockHeader(proposalHeader, invalidateBlock);
|
|
440
501
|
const blockNumber = newGlobalVariables.blockNumber;
|
|
441
|
-
const slot = proposalHeader.slotNumber
|
|
502
|
+
const slot = proposalHeader.slotNumber;
|
|
442
503
|
const l1ToL2Messages = await this.l1ToL2MessageSource.getL1ToL2Messages(blockNumber);
|
|
443
504
|
const workTimer = new Timer();
|
|
444
505
|
this.setState(SequencerState.CREATING_BLOCK, slot);
|
|
445
506
|
try {
|
|
446
|
-
const blockBuilderOptions = this.getBlockBuilderOptions(
|
|
507
|
+
const blockBuilderOptions = this.getBlockBuilderOptions(slot);
|
|
447
508
|
const buildBlockRes = await this.blockBuilder.buildBlock(pendingTxs, l1ToL2Messages, newGlobalVariables, blockBuilderOptions);
|
|
448
509
|
const { publicGas, block, publicProcessorDuration, numTxs, numMsgs, blockBuildingTimer, usedTxs, failedTxs } = buildBlockRes;
|
|
449
510
|
const blockBuildDuration = workTimer.ms();
|
|
@@ -476,16 +537,22 @@ export { SequencerState };
|
|
|
476
537
|
txHashes,
|
|
477
538
|
...blockStats
|
|
478
539
|
});
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
if (
|
|
482
|
-
this.log.
|
|
540
|
+
// In fisherman mode, skip attestation collection
|
|
541
|
+
let attestationsAndSigners;
|
|
542
|
+
if (this.config.fishermanMode) {
|
|
543
|
+
this.log.debug('Skipping attestation collection');
|
|
544
|
+
attestationsAndSigners = CommitteeAttestationsAndSigners.empty();
|
|
545
|
+
} else {
|
|
546
|
+
this.log.debug('Collecting attestations');
|
|
547
|
+
attestationsAndSigners = await this.collectAttestations(block, usedTxs, proposerAddress);
|
|
548
|
+
this.log.verbose(`Collected ${attestationsAndSigners.attestations.length} attestations for block ${blockNumber} at slot ${slot}`, {
|
|
483
549
|
blockHash,
|
|
484
|
-
blockNumber
|
|
550
|
+
blockNumber,
|
|
551
|
+
slot
|
|
485
552
|
});
|
|
486
553
|
}
|
|
487
|
-
|
|
488
|
-
const attestationsAndSignersSignature = this.validatorClient ? await this.validatorClient.signAttestationsAndSigners(attestationsAndSigners, proposerAddress ?? publisher.getSenderAddress())
|
|
554
|
+
// In fisherman mode, skip attestation signing
|
|
555
|
+
const attestationsAndSignersSignature = this.config.fishermanMode || !this.validatorClient ? Signature.empty() : await this.validatorClient.signAttestationsAndSigners(attestationsAndSigners, proposerAddress ?? publisher.getSenderAddress());
|
|
489
556
|
await this.enqueuePublishL2Block(block, attestationsAndSigners, attestationsAndSignersSignature, invalidateBlock, publisher);
|
|
490
557
|
this.metrics.recordBuiltBlock(blockBuildDuration, publicGas.l2Gas);
|
|
491
558
|
return block;
|
|
@@ -495,38 +562,36 @@ export { SequencerState };
|
|
|
495
562
|
}
|
|
496
563
|
}
|
|
497
564
|
async collectAttestations(block, txs, proposerAddress) {
|
|
498
|
-
const { committee } = await this.epochCache.getCommittee(block.
|
|
565
|
+
const { committee, seed, epoch } = await this.epochCache.getCommittee(block.slot);
|
|
499
566
|
// We checked above that the committee is defined, so this should never happen.
|
|
500
567
|
if (!committee) {
|
|
501
568
|
throw new Error('No committee when collecting attestations');
|
|
502
569
|
}
|
|
503
570
|
if (committee.length === 0) {
|
|
504
571
|
this.log.verbose(`Attesting committee is empty`);
|
|
505
|
-
return
|
|
572
|
+
return CommitteeAttestationsAndSigners.empty();
|
|
506
573
|
} else {
|
|
507
574
|
this.log.debug(`Attesting committee length is ${committee.length}`);
|
|
508
575
|
}
|
|
509
576
|
if (!this.validatorClient) {
|
|
510
|
-
|
|
511
|
-
this.log.error(msg);
|
|
512
|
-
throw new Error(msg);
|
|
577
|
+
throw new Error('Missing validator client: Cannot collect attestations');
|
|
513
578
|
}
|
|
514
579
|
const numberOfRequiredAttestations = Math.floor(committee.length * 2 / 3) + 1;
|
|
515
|
-
const slotNumber = block.header.globalVariables.slotNumber
|
|
580
|
+
const slotNumber = block.header.globalVariables.slotNumber;
|
|
516
581
|
this.setState(SequencerState.COLLECTING_ATTESTATIONS, slotNumber);
|
|
517
582
|
this.log.debug('Creating block proposal for validators');
|
|
518
583
|
const blockProposalOptions = {
|
|
519
584
|
publishFullTxs: !!this.config.publishTxsWithProposals,
|
|
520
585
|
broadcastInvalidBlockProposal: this.config.broadcastInvalidBlockProposal
|
|
521
586
|
};
|
|
522
|
-
const proposal = await this.validatorClient.createBlockProposal(block.header.globalVariables.blockNumber, block.getCheckpointHeader(), block.archive.root,
|
|
587
|
+
const proposal = await this.validatorClient.createBlockProposal(block.header.globalVariables.blockNumber, block.getCheckpointHeader(), block.archive.root, txs, proposerAddress, blockProposalOptions);
|
|
523
588
|
if (!proposal) {
|
|
524
589
|
throw new Error(`Failed to create block proposal`);
|
|
525
590
|
}
|
|
526
591
|
if (this.config.skipCollectingAttestations) {
|
|
527
592
|
this.log.warn('Skipping attestation collection as per config (attesting with own keys only)');
|
|
528
593
|
const attestations = await this.validatorClient?.collectOwnAttestations(proposal);
|
|
529
|
-
return orderAttestations(attestations ?? [], committee);
|
|
594
|
+
return new CommitteeAttestationsAndSigners(orderAttestations(attestations ?? [], committee));
|
|
530
595
|
}
|
|
531
596
|
this.log.debug('Broadcasting block proposal to validators');
|
|
532
597
|
await this.validatorClient.broadcastBlockProposal(proposal);
|
|
@@ -540,13 +605,11 @@ export { SequencerState };
|
|
|
540
605
|
collectedAttestationsCount = attestations.length;
|
|
541
606
|
// note: the smart contract requires that the signatures are provided in the order of the committee
|
|
542
607
|
const sorted = orderAttestations(attestations, committee);
|
|
543
|
-
if
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
this.log.warn(`Injecting fake attestation in block ${block.number}`);
|
|
547
|
-
unfreeze(nonEmpty[randomIndex]).signature = Signature.random();
|
|
608
|
+
// manipulate the attestations if we've been configured to do so
|
|
609
|
+
if (this.config.injectFakeAttestation || this.config.shuffleAttestationOrdering) {
|
|
610
|
+
return this.manipulateAttestations(block, epoch, seed, committee, sorted);
|
|
548
611
|
}
|
|
549
|
-
return sorted;
|
|
612
|
+
return new CommitteeAttestationsAndSigners(sorted);
|
|
550
613
|
} catch (err) {
|
|
551
614
|
if (err && err instanceof AttestationTimeoutError) {
|
|
552
615
|
collectedAttestationsCount = err.collectedCount;
|
|
@@ -556,14 +619,51 @@ export { SequencerState };
|
|
|
556
619
|
this.metrics.recordCollectedAttestations(collectedAttestationsCount, timer.ms());
|
|
557
620
|
}
|
|
558
621
|
}
|
|
622
|
+
/** Breaks the attestations before publishing based on attack configs */ manipulateAttestations(block, epoch, seed, committee, attestations) {
|
|
623
|
+
// Compute the proposer index in the committee, since we dont want to tweak it.
|
|
624
|
+
// Otherwise, the L1 rollup contract will reject the block outright.
|
|
625
|
+
const proposerIndex = Number(this.epochCache.computeProposerIndex(block.slot, epoch, seed, BigInt(committee.length)));
|
|
626
|
+
if (this.config.injectFakeAttestation) {
|
|
627
|
+
// Find non-empty attestations that are not from the proposer
|
|
628
|
+
const nonProposerIndices = [];
|
|
629
|
+
for(let i = 0; i < attestations.length; i++){
|
|
630
|
+
if (!attestations[i].signature.isEmpty() && i !== proposerIndex) {
|
|
631
|
+
nonProposerIndices.push(i);
|
|
632
|
+
}
|
|
633
|
+
}
|
|
634
|
+
if (nonProposerIndices.length > 0) {
|
|
635
|
+
const targetIndex = nonProposerIndices[randomInt(nonProposerIndices.length)];
|
|
636
|
+
this.log.warn(`Injecting fake attestation in block ${block.number} at index ${targetIndex}`);
|
|
637
|
+
unfreeze(attestations[targetIndex]).signature = Signature.random();
|
|
638
|
+
}
|
|
639
|
+
return new CommitteeAttestationsAndSigners(attestations);
|
|
640
|
+
}
|
|
641
|
+
if (this.config.shuffleAttestationOrdering) {
|
|
642
|
+
this.log.warn(`Shuffling attestation ordering in block ${block.number} (proposer index ${proposerIndex})`);
|
|
643
|
+
const shuffled = [
|
|
644
|
+
...attestations
|
|
645
|
+
];
|
|
646
|
+
const [i, j] = [
|
|
647
|
+
(proposerIndex + 1) % shuffled.length,
|
|
648
|
+
(proposerIndex + 2) % shuffled.length
|
|
649
|
+
];
|
|
650
|
+
const valueI = shuffled[i];
|
|
651
|
+
const valueJ = shuffled[j];
|
|
652
|
+
shuffled[i] = valueJ;
|
|
653
|
+
shuffled[j] = valueI;
|
|
654
|
+
const signers = new CommitteeAttestationsAndSigners(attestations).getSigners();
|
|
655
|
+
return new MaliciousCommitteeAttestationsAndSigners(shuffled, signers);
|
|
656
|
+
}
|
|
657
|
+
return new CommitteeAttestationsAndSigners(attestations);
|
|
658
|
+
}
|
|
559
659
|
/**
|
|
560
660
|
* Publishes the L2Block to the rollup contract.
|
|
561
661
|
* @param block - The L2Block to be published.
|
|
562
662
|
*/ async enqueuePublishL2Block(block, attestationsAndSigners, attestationsAndSignersSignature, invalidateBlock, publisher) {
|
|
563
663
|
// Publishes new block to the network and awaits the tx to be mined
|
|
564
|
-
this.setState(SequencerState.PUBLISHING_BLOCK, block.header.globalVariables.slotNumber
|
|
664
|
+
this.setState(SequencerState.PUBLISHING_BLOCK, block.header.globalVariables.slotNumber);
|
|
565
665
|
// Time out tx at the end of the slot
|
|
566
|
-
const slot = block.header.globalVariables.slotNumber
|
|
666
|
+
const slot = block.header.globalVariables.slotNumber;
|
|
567
667
|
const txTimeoutAt = new Date((this.getSlotStartBuildTimestamp(slot) + this.aztecSlotDuration) * 1000);
|
|
568
668
|
const enqueued = await publisher.enqueueProposeL2Block(block, attestationsAndSigners, attestationsAndSignersSignature, {
|
|
569
669
|
txTimeoutAt,
|
|
@@ -655,7 +755,18 @@ export { SequencerState };
|
|
|
655
755
|
});
|
|
656
756
|
return false;
|
|
657
757
|
}) : undefined;
|
|
658
|
-
const enqueueSlashingPromise = this.slasherClient ? this.slasherClient.getProposerActions(slot).then((actions)=>
|
|
758
|
+
const enqueueSlashingPromise = this.slasherClient ? this.slasherClient.getProposerActions(slot).then((actions)=>{
|
|
759
|
+
// Record metrics for fisherman mode
|
|
760
|
+
if (this.config.fishermanMode && actions.length > 0) {
|
|
761
|
+
this.log.debug(`Fisherman mode: simulating ${actions.length} slashing action(s) for slot ${slot}`, {
|
|
762
|
+
slot,
|
|
763
|
+
actionCount: actions.length
|
|
764
|
+
});
|
|
765
|
+
this.metrics.recordSlashingAttempt(actions.length);
|
|
766
|
+
}
|
|
767
|
+
// Enqueue the actions to fully simulate L1 tx building (they won't be sent in fisherman mode)
|
|
768
|
+
return publisher.enqueueSlashingActions(actions, slot, timestamp, attestorAddress, signerFn);
|
|
769
|
+
}).catch((err)=>{
|
|
659
770
|
this.log.error(`Error enqueuing slashing actions`, err, {
|
|
660
771
|
slot
|
|
661
772
|
});
|
|
@@ -701,6 +812,13 @@ export { SequencerState };
|
|
|
701
812
|
undefined
|
|
702
813
|
];
|
|
703
814
|
}
|
|
815
|
+
// In fisherman mode, just return the current proposer
|
|
816
|
+
if (this.config.fishermanMode) {
|
|
817
|
+
return [
|
|
818
|
+
true,
|
|
819
|
+
proposer
|
|
820
|
+
];
|
|
821
|
+
}
|
|
704
822
|
const validatorAddresses = this.validatorClient.getValidatorAddresses();
|
|
705
823
|
const weAreProposer = validatorAddresses.some((addr)=>addr.equals(proposer));
|
|
706
824
|
if (!weAreProposer) {
|
|
@@ -812,7 +930,12 @@ export { SequencerState };
|
|
|
812
930
|
}
|
|
813
931
|
this.log.info(invalidateAsCommitteeMember ? `Invalidating block ${invalidBlockNumber} as committee member` : `Invalidating block ${invalidBlockNumber} as non-committee member`, logData);
|
|
814
932
|
publisher.enqueueInvalidateBlock(invalidateBlock);
|
|
815
|
-
|
|
933
|
+
if (!this.config.fishermanMode) {
|
|
934
|
+
await publisher.sendRequests();
|
|
935
|
+
} else {
|
|
936
|
+
this.log.info('Invalidating block in fisherman mode, clearing pending requests');
|
|
937
|
+
publisher.clearPendingRequests();
|
|
938
|
+
}
|
|
816
939
|
}
|
|
817
940
|
getSlotStartBuildTimestamp(slotNumber) {
|
|
818
941
|
return getSlotStartBuildTimestamp(slotNumber, this.l1Constants);
|
|
@@ -47,4 +47,4 @@ export declare class SequencerTimetable {
|
|
|
47
47
|
getMaxAllowedTime(state: SequencerState): number | undefined;
|
|
48
48
|
assertTimeLeft(newState: SequencerState, secondsIntoSlot: number): void;
|
|
49
49
|
}
|
|
50
|
-
//# sourceMappingURL=
|
|
50
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZXRhYmxlLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VxdWVuY2VyL3RpbWV0YWJsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFJQSxPQUFPLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNyRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBTTVDLHFCQUFhLGtCQUFrQjtJQStDM0IsT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUM7SUFDekIsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHO0lBL0N0Qjs7OztPQUlHO0lBQ0gsU0FBZ0Isa0JBQWtCLEVBQUUsTUFBTSxDQUFDO0lBRTNDOzs7O09BSUc7SUFDSCxTQUFnQixnQkFBZ0IsU0FBQztJQUVqQyxzSEFBc0g7SUFDdEgsU0FBZ0IsZ0JBQWdCLEVBQUUsTUFBTSxDQUFzQjtJQUU5RCx1REFBdUQ7SUFDdkQsU0FBZ0IsZ0JBQWdCLEVBQUUsTUFBTSxDQUFzQjtJQUU5RCxtR0FBbUc7SUFDbkcsU0FBZ0IsMEJBQTBCLEVBQUUsTUFBTSxDQUFDO0lBRW5ELG1JQUFtSTtJQUNuSSxTQUFnQixtQkFBbUIsRUFBRSxNQUFNLENBQXlCO0lBRXBFLHdDQUF3QztJQUN4QyxTQUFnQixvQkFBb0IsRUFBRSxNQUFNLENBQUM7SUFFN0Msa0ZBQWtGO0lBQ2xGLFNBQWdCLGlCQUFpQixFQUFFLE1BQU0sQ0FBQztJQUUxQywySUFBMkk7SUFDM0ksU0FBZ0IsNEJBQTRCLEVBQUUsTUFBTSxDQUFDO0lBRXJELDREQUE0RDtJQUM1RCxTQUFnQixPQUFPLEVBQUUsT0FBTyxDQUFDO0lBRWpDLFlBQ0UsSUFBSSxFQUFFO1FBQ0osb0JBQW9CLEVBQUUsTUFBTSxDQUFDO1FBQzdCLGlCQUFpQixFQUFFLE1BQU0sQ0FBQztRQUMxQiw0QkFBNEIsRUFBRSxNQUFNLENBQUM7UUFDckMsMEJBQTBCLENBQUMsRUFBRSxNQUFNLENBQUM7UUFDcEMsT0FBTyxFQUFFLE9BQU8sQ0FBQztLQUNsQixFQUNnQixPQUFPLENBQUMsOEJBQWtCLEVBQzFCLEdBQUcsdUNBQXNDLEVBNkMzRDtJQUVELE9BQU8sS0FBSyx5Q0FBeUMsR0FFcEQ7SUFFTSwyQkFBMkIsQ0FBQyxlQUFlLEVBQUUsTUFBTSxHQUFHLE1BQU0sQ0FhbEU7SUFFRCxPQUFPLEtBQUssMEJBQTBCLEdBRXJDO0lBRU0seUJBQXlCLENBQUMsZUFBZSxDQUFDLEVBQUUsTUFBTSxHQUFHLE1BQU0sQ0FRakU7SUFFTSxpQkFBaUIsQ0FDdEIsS0FBSyxFQUFFLE9BQU8sQ0FBQyxjQUFjLEVBQUUsY0FBYyxDQUFDLE9BQU8sR0FBRyxjQUFjLENBQUMsSUFBSSxHQUFHLGNBQWMsQ0FBQyxhQUFhLENBQUMsR0FDMUcsU0FBUyxDQUFDO0lBQ04saUJBQWlCLENBQ3RCLEtBQUssRUFBRSxPQUFPLENBQUMsY0FBYyxFQUFFLGNBQWMsQ0FBQyxPQUFPLEdBQUcsY0FBYyxDQUFDLElBQUksR0FBRyxjQUFjLENBQUMsYUFBYSxDQUFDLEdBQzFHLE1BQU0sQ0FBQztJQUNILGlCQUFpQixDQUFDLEtBQUssRUFBRSxjQUFjLEdBQUcsTUFBTSxHQUFHLFNBQVMsQ0FBQztJQXdCN0QsY0FBYyxDQUFDLFFBQVEsRUFBRSxjQUFjLEVBQUUsZUFBZSxFQUFFLE1BQU0sUUFpQnRFO0NBQ0YifQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"timetable.d.ts","sourceRoot":"","sources":["../../src/sequencer/timetable.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAM5C,qBAAa,kBAAkB;IA+C3B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;IACzB,OAAO,CAAC,QAAQ,CAAC,GAAG;IA/CtB;;;;OAIG;IACH,SAAgB,kBAAkB,EAAE,MAAM,CAAC;IAE3C;;;;OAIG;IACH,SAAgB,gBAAgB,SAAC;IAEjC,sHAAsH;IACtH,SAAgB,gBAAgB,EAAE,MAAM,CAAsB;IAE9D,uDAAuD;IACvD,SAAgB,gBAAgB,EAAE,MAAM,CAAsB;IAE9D,mGAAmG;IACnG,SAAgB,0BAA0B,EAAE,MAAM,CAAC;IAEnD,mIAAmI;IACnI,SAAgB,mBAAmB,EAAE,MAAM,CAAyB;IAEpE,wCAAwC;IACxC,SAAgB,oBAAoB,EAAE,MAAM,CAAC;IAE7C,kFAAkF;IAClF,SAAgB,iBAAiB,EAAE,MAAM,CAAC;IAE1C,2IAA2I;IAC3I,SAAgB,4BAA4B,EAAE,MAAM,CAAC;IAErD,4DAA4D;IAC5D,SAAgB,OAAO,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"timetable.d.ts","sourceRoot":"","sources":["../../src/sequencer/timetable.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAM5C,qBAAa,kBAAkB;IA+C3B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;IACzB,OAAO,CAAC,QAAQ,CAAC,GAAG;IA/CtB;;;;OAIG;IACH,SAAgB,kBAAkB,EAAE,MAAM,CAAC;IAE3C;;;;OAIG;IACH,SAAgB,gBAAgB,SAAC;IAEjC,sHAAsH;IACtH,SAAgB,gBAAgB,EAAE,MAAM,CAAsB;IAE9D,uDAAuD;IACvD,SAAgB,gBAAgB,EAAE,MAAM,CAAsB;IAE9D,mGAAmG;IACnG,SAAgB,0BAA0B,EAAE,MAAM,CAAC;IAEnD,mIAAmI;IACnI,SAAgB,mBAAmB,EAAE,MAAM,CAAyB;IAEpE,wCAAwC;IACxC,SAAgB,oBAAoB,EAAE,MAAM,CAAC;IAE7C,kFAAkF;IAClF,SAAgB,iBAAiB,EAAE,MAAM,CAAC;IAE1C,2IAA2I;IAC3I,SAAgB,4BAA4B,EAAE,MAAM,CAAC;IAErD,4DAA4D;IAC5D,SAAgB,OAAO,EAAE,OAAO,CAAC;IAEjC,YACE,IAAI,EAAE;QACJ,oBAAoB,EAAE,MAAM,CAAC;QAC7B,iBAAiB,EAAE,MAAM,CAAC;QAC1B,4BAA4B,EAAE,MAAM,CAAC;QACrC,0BAA0B,CAAC,EAAE,MAAM,CAAC;QACpC,OAAO,EAAE,OAAO,CAAC;KAClB,EACgB,OAAO,CAAC,8BAAkB,EAC1B,GAAG,uCAAsC,EA6C3D;IAED,OAAO,KAAK,yCAAyC,GAEpD;IAEM,2BAA2B,CAAC,eAAe,EAAE,MAAM,GAAG,MAAM,CAalE;IAED,OAAO,KAAK,0BAA0B,GAErC;IAEM,yBAAyB,CAAC,eAAe,CAAC,EAAE,MAAM,GAAG,MAAM,CAQjE;IAEM,iBAAiB,CACtB,KAAK,EAAE,OAAO,CAAC,cAAc,EAAE,cAAc,CAAC,OAAO,GAAG,cAAc,CAAC,IAAI,GAAG,cAAc,CAAC,aAAa,CAAC,GAC1G,SAAS,CAAC;IACN,iBAAiB,CACtB,KAAK,EAAE,OAAO,CAAC,cAAc,EAAE,cAAc,CAAC,OAAO,GAAG,cAAc,CAAC,IAAI,GAAG,cAAc,CAAC,aAAa,CAAC,GAC1G,MAAM,CAAC;IACH,iBAAiB,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,GAAG,SAAS,CAAC;IAwB7D,cAAc,CAAC,QAAQ,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,QAiBtE;CACF"}
|
|
@@ -21,4 +21,4 @@ export declare enum SequencerState {
|
|
|
21
21
|
export type SequencerStateWithSlot = SequencerState.INITIALIZING_PROPOSAL | SequencerState.CREATING_BLOCK | SequencerState.COLLECTING_ATTESTATIONS | SequencerState.PUBLISHING_BLOCK | SequencerState.PROPOSER_CHECK;
|
|
22
22
|
export type SequencerStateCallback = () => SequencerState;
|
|
23
23
|
export declare function sequencerStateToNumber(state: SequencerState): number;
|
|
24
|
-
//# sourceMappingURL=
|
|
24
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXF1ZW5jZXIvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsb0JBQVksY0FBYztJQUN4QixxRUFBcUU7SUFDckUsT0FBTyxZQUFZO0lBQ25CLGdFQUFnRTtJQUNoRSxRQUFRLGFBQWE7SUFDckIscURBQXFEO0lBQ3JELElBQUksU0FBUztJQUNiLHVDQUF1QztJQUN2QyxhQUFhLGtCQUFrQjtJQUMvQiw0REFBNEQ7SUFDNUQsY0FBYyxtQkFBbUI7SUFDakMsMElBQTBJO0lBQzFJLHFCQUFxQiwwQkFBMEI7SUFDL0MsNklBQTZJO0lBQzdJLGNBQWMsbUJBQW1CO0lBQ2pDLDZFQUE2RTtJQUM3RSx1QkFBdUIsNEJBQTRCO0lBQ25ELDJHQUEyRztJQUMzRyxnQkFBZ0IscUJBQXFCO0NBQ3RDO0FBRUQsTUFBTSxNQUFNLHNCQUFzQixHQUM5QixjQUFjLENBQUMscUJBQXFCLEdBQ3BDLGNBQWMsQ0FBQyxjQUFjLEdBQzdCLGNBQWMsQ0FBQyx1QkFBdUIsR0FDdEMsY0FBYyxDQUFDLGdCQUFnQixHQUMvQixjQUFjLENBQUMsY0FBYyxDQUFDO0FBRWxDLE1BQU0sTUFBTSxzQkFBc0IsR0FBRyxNQUFNLGNBQWMsQ0FBQztBQUUxRCx3QkFBZ0Isc0JBQXNCLENBQUMsS0FBSyxFQUFFLGNBQWMsR0FBRyxNQUFNLENBRXBFIn0=
|