@aztec/sequencer-client 0.67.1 → 0.68.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.
Files changed (55) hide show
  1. package/dest/client/sequencer-client.d.ts +3 -1
  2. package/dest/client/sequencer-client.d.ts.map +1 -1
  3. package/dest/client/sequencer-client.js +17 -3
  4. package/dest/config.d.ts +3 -3
  5. package/dest/config.d.ts.map +1 -1
  6. package/dest/config.js +8 -56
  7. package/dest/index.d.ts +1 -1
  8. package/dest/index.d.ts.map +1 -1
  9. package/dest/index.js +2 -2
  10. package/dest/publisher/index.d.ts +0 -1
  11. package/dest/publisher/index.d.ts.map +1 -1
  12. package/dest/publisher/index.js +1 -2
  13. package/dest/publisher/l1-publisher-metrics.d.ts +5 -2
  14. package/dest/publisher/l1-publisher-metrics.d.ts.map +1 -1
  15. package/dest/publisher/l1-publisher-metrics.js +16 -1
  16. package/dest/publisher/l1-publisher.d.ts +4 -1
  17. package/dest/publisher/l1-publisher.d.ts.map +1 -1
  18. package/dest/publisher/l1-publisher.js +200 -44
  19. package/dest/publisher/utils.d.ts +1 -3
  20. package/dest/publisher/utils.d.ts.map +1 -1
  21. package/dest/publisher/utils.js +2 -8
  22. package/dest/sequencer/allowed.d.ts +3 -0
  23. package/dest/sequencer/allowed.d.ts.map +1 -0
  24. package/dest/sequencer/allowed.js +34 -0
  25. package/dest/sequencer/config.d.ts +1 -1
  26. package/dest/sequencer/config.d.ts.map +1 -1
  27. package/dest/sequencer/metrics.d.ts +2 -0
  28. package/dest/sequencer/metrics.d.ts.map +1 -1
  29. package/dest/sequencer/metrics.js +13 -2
  30. package/dest/sequencer/sequencer.d.ts +14 -11
  31. package/dest/sequencer/sequencer.d.ts.map +1 -1
  32. package/dest/sequencer/sequencer.js +160 -87
  33. package/dest/sequencer/utils.d.ts +2 -7
  34. package/dest/sequencer/utils.d.ts.map +1 -1
  35. package/dest/sequencer/utils.js +3 -11
  36. package/dest/tx_validator/gas_validator.d.ts +3 -4
  37. package/dest/tx_validator/gas_validator.d.ts.map +1 -1
  38. package/dest/tx_validator/gas_validator.js +25 -8
  39. package/dest/tx_validator/tx_validator_factory.d.ts.map +1 -1
  40. package/dest/tx_validator/tx_validator_factory.js +6 -4
  41. package/package.json +26 -23
  42. package/src/client/sequencer-client.ts +25 -5
  43. package/src/config.ts +10 -60
  44. package/src/index.ts +1 -1
  45. package/src/publisher/index.ts +0 -1
  46. package/src/publisher/l1-publisher-metrics.ts +24 -3
  47. package/src/publisher/l1-publisher.ts +241 -68
  48. package/src/publisher/utils.ts +1 -10
  49. package/src/sequencer/allowed.ts +36 -0
  50. package/src/sequencer/config.ts +1 -1
  51. package/src/sequencer/metrics.ts +15 -1
  52. package/src/sequencer/sequencer.ts +195 -109
  53. package/src/sequencer/utils.ts +2 -11
  54. package/src/tx_validator/gas_validator.ts +32 -6
  55. package/src/tx_validator/tx_validator_factory.ts +11 -3
@@ -11,8 +11,10 @@ import { pickFromSchema } from '@aztec/foundation/schemas';
11
11
  import { Timer, elapsed } from '@aztec/foundation/timer';
12
12
  import { Attributes, trackSpan } from '@aztec/telemetry-client';
13
13
  import { prettyLogViemErrorMsg } from '../publisher/utils.js';
14
+ import { getDefaultAllowedSetupFunctions } from './allowed.js';
14
15
  import { SequencerMetrics } from './metrics.js';
15
- import { SequencerState, getSecondsIntoSlot, orderAttestations } from './utils.js';
16
+ import { SequencerState, orderAttestations } from './utils.js';
17
+ export { SequencerState };
16
18
  export class SequencerTooSlowError extends Error {
17
19
  constructor(currentState, proposedState, maxAllowedTime, currentTime) {
18
20
  super(`Too far into slot to transition to ${proposedState}. max allowed: ${maxAllowedTime}s, time into slot: ${currentTime}s`);
@@ -35,12 +37,14 @@ export class SequencerTooSlowError extends Error {
35
37
  let Sequencer = (() => {
36
38
  var _a;
37
39
  let _instanceExtraInitializers = [];
40
+ let _work_decorators;
38
41
  let _buildBlockAndAttemptToPublish_decorators;
39
42
  let _collectAttestations_decorators;
40
43
  let _publishL2Block_decorators;
44
+ let _claimEpochProofRightIfAvailable_decorators;
41
45
  return _a = class Sequencer {
42
46
  constructor(publisher, validatorClient, // During migration the validator client can be inactive
43
- globalsBuilder, p2pClient, worldState, blockBuilderFactory, l2BlockSource, l1ToL2MessageSource, publicProcessorFactory, txValidatorFactory, l1GenesisTime, aztecSlotDuration, telemetry, config = {}, log = createLogger('sequencer')) {
47
+ globalsBuilder, p2pClient, worldState, blockBuilderFactory, l2BlockSource, l1ToL2MessageSource, publicProcessorFactory, txValidatorFactory, l1Constants, dateProvider, telemetry, config = {}, log = createLogger('sequencer')) {
44
48
  this.publisher = (__runInitializers(this, _instanceExtraInitializers), publisher);
45
49
  this.validatorClient = validatorClient;
46
50
  this.globalsBuilder = globalsBuilder;
@@ -51,21 +55,21 @@ let Sequencer = (() => {
51
55
  this.l1ToL2MessageSource = l1ToL2MessageSource;
52
56
  this.publicProcessorFactory = publicProcessorFactory;
53
57
  this.txValidatorFactory = txValidatorFactory;
54
- this.l1GenesisTime = l1GenesisTime;
55
- this.aztecSlotDuration = aztecSlotDuration;
58
+ this.l1Constants = l1Constants;
59
+ this.dateProvider = dateProvider;
56
60
  this.config = config;
57
61
  this.log = log;
58
62
  this.pollingIntervalMs = 1000;
59
63
  this.maxTxsPerBlock = 32;
60
64
  this.minTxsPerBLock = 1;
61
- this.minSecondsBetweenBlocks = 0;
62
- this.maxSecondsBetweenBlocks = 0;
65
+ this.maxL1TxInclusionTimeIntoSlot = 0;
63
66
  // TODO: zero values should not be allowed for the following 2 values in PROD
64
67
  this._coinbase = EthAddress.ZERO;
65
68
  this._feeRecipient = AztecAddress.ZERO;
66
69
  this.state = SequencerState.STOPPED;
67
- this.allowedInSetup = [];
70
+ this.allowedInSetup = getDefaultAllowedSetupFunctions();
68
71
  this.maxBlockSizeInBytes = 1024 * 1024;
72
+ this.processTxTime = 12;
69
73
  this.isFlushing = false;
70
74
  this.enforceTimeTable = false;
71
75
  this.updateConfig(config);
@@ -81,7 +85,7 @@ let Sequencer = (() => {
81
85
  * @param config - New parameters.
82
86
  */
83
87
  updateConfig(config) {
84
- this.log.info(`Sequencer config set`, omit(pickFromSchema(this.config, SequencerConfigSchema), 'allowedInSetup', 'allowedInTeardown'));
88
+ this.log.info(`Sequencer config set`, omit(pickFromSchema(config, SequencerConfigSchema), 'allowedInSetup'));
85
89
  if (config.transactionPollingIntervalMS !== undefined) {
86
90
  this.pollingIntervalMs = config.transactionPollingIntervalMS;
87
91
  }
@@ -91,12 +95,6 @@ let Sequencer = (() => {
91
95
  if (config.minTxsPerBlock !== undefined) {
92
96
  this.minTxsPerBLock = config.minTxsPerBlock;
93
97
  }
94
- if (config.minSecondsBetweenBlocks !== undefined) {
95
- this.minSecondsBetweenBlocks = config.minSecondsBetweenBlocks;
96
- }
97
- if (config.maxSecondsBetweenBlocks !== undefined) {
98
- this.maxSecondsBetweenBlocks = config.maxSecondsBetweenBlocks;
99
- }
100
98
  if (config.coinbase) {
101
99
  this._coinbase = config.coinbase;
102
100
  }
@@ -112,33 +110,65 @@ let Sequencer = (() => {
112
110
  if (config.governanceProposerPayload) {
113
111
  this.publisher.setPayload(config.governanceProposerPayload);
114
112
  }
113
+ if (config.maxL1TxInclusionTimeIntoSlot !== undefined) {
114
+ this.maxL1TxInclusionTimeIntoSlot = config.maxL1TxInclusionTimeIntoSlot;
115
+ }
115
116
  this.enforceTimeTable = config.enforceTimeTable === true;
116
117
  this.setTimeTable();
117
118
  // TODO: Just read everything from the config object as needed instead of copying everything into local vars.
118
119
  this.config = config;
119
120
  }
120
121
  setTimeTable() {
122
+ // How late into the slot can we be to start working
123
+ const initialTime = 1;
124
+ // How long it takes to validate the txs collected and get ready to start building
125
+ const blockPrepareTime = 2;
126
+ // How long it takes to for attestations to travel across the p2p layer.
127
+ const attestationPropagationTime = 2;
128
+ // How long it takes to get a published block into L1. L1 builders typically accept txs up to 4 seconds into their slot,
129
+ // but we'll timeout sooner to give it more time to propagate (remember we also have blobs!). Still, when working in anvil,
130
+ // we can just post in the very last second of the L1 slot.
131
+ const l1PublishingTime = this.l1Constants.ethereumSlotDuration - this.maxL1TxInclusionTimeIntoSlot;
132
+ // How much time we spend validating and processing a block after building it
133
+ const blockValidationTime = 1;
134
+ // How much time we have left in the slot for actually processing txs and building the block.
135
+ const remainingTimeInSlot = this.aztecSlotDuration -
136
+ initialTime -
137
+ blockPrepareTime -
138
+ l1PublishingTime -
139
+ 2 * attestationPropagationTime -
140
+ blockValidationTime;
141
+ // Check that numbers make sense
142
+ if (this.enforceTimeTable && remainingTimeInSlot < 0) {
143
+ throw new Error(`Not enough time for block building in ${this.aztecSlotDuration}s slot`);
144
+ }
145
+ // How much time we have for actually processing txs. Note that we need both the sequencer and the validators to execute txs.
146
+ const processTxsTime = remainingTimeInSlot / 2;
147
+ this.processTxTime = processTxsTime;
121
148
  const newTimeTable = {
149
+ // No checks needed for any of these transitions
122
150
  [SequencerState.STOPPED]: this.aztecSlotDuration,
123
151
  [SequencerState.IDLE]: this.aztecSlotDuration,
124
152
  [SequencerState.SYNCHRONIZING]: this.aztecSlotDuration,
125
- [SequencerState.PROPOSER_CHECK]: this.aztecSlotDuration, // We always want to allow the full slot to check if we are the proposer
126
- [SequencerState.WAITING_FOR_TXS]: 5,
127
- [SequencerState.CREATING_BLOCK]: 7,
128
- [SequencerState.PUBLISHING_BLOCK_TO_PEERS]: 7 + this.maxTxsPerBlock * 2, // if we take 5 seconds to create block, then 4 transactions at 2 seconds each
129
- [SequencerState.WAITING_FOR_ATTESTATIONS]: 7 + this.maxTxsPerBlock * 2 + 3, // it shouldn't take 3 seconds to publish to peers
130
- [SequencerState.PUBLISHING_BLOCK]: 7 + this.maxTxsPerBlock * 2 + 3 + 5, // wait 5 seconds for attestations
153
+ // We always want to allow the full slot to check if we are the proposer
154
+ [SequencerState.PROPOSER_CHECK]: this.aztecSlotDuration,
155
+ // First transition towards building a block
156
+ [SequencerState.WAITING_FOR_TXS]: initialTime,
157
+ // We then validate the txs and prepare to start building the block
158
+ [SequencerState.CREATING_BLOCK]: initialTime + blockPrepareTime,
159
+ // We start collecting attestations after building the block
160
+ [SequencerState.COLLECTING_ATTESTATIONS]: initialTime + blockPrepareTime + processTxsTime + blockValidationTime,
161
+ // We publish the block after collecting attestations
162
+ [SequencerState.PUBLISHING_BLOCK]: this.aztecSlotDuration - l1PublishingTime,
131
163
  };
132
- if (this.enforceTimeTable && newTimeTable[SequencerState.PUBLISHING_BLOCK] > this.aztecSlotDuration) {
133
- throw new Error('Sequencer cannot publish block in less than a slot');
134
- }
164
+ this.log.verbose(`Sequencer time table updated with ${processTxsTime}s for processing txs`, newTimeTable);
135
165
  this.timeTable = newTimeTable;
136
166
  }
137
167
  /**
138
168
  * Starts the sequencer and moves to IDLE state.
139
169
  */
140
170
  start() {
141
- this.runningPromise = new RunningPromise(this.work.bind(this), this.pollingIntervalMs);
171
+ this.runningPromise = new RunningPromise(this.work.bind(this), this.log, this.pollingIntervalMs);
142
172
  this.setState(SequencerState.IDLE, 0n, true /** force */);
143
173
  this.runningPromise.start();
144
174
  this.log.info(`Sequencer started with address ${this.publisher.getSenderAddress().toString()}`);
@@ -217,11 +247,13 @@ let Sequencer = (() => {
217
247
  // Get txs to build the new block.
218
248
  const pendingTxs = await this.p2pClient.getPendingTxs();
219
249
  if (!this.shouldProposeBlock(historicalHeader, { pendingTxsCount: pendingTxs.length })) {
250
+ await this.claimEpochProofRightIfAvailable(slot);
220
251
  return;
221
252
  }
222
253
  // If I created a "partial" header here that should make our job much easier.
223
254
  const proposalHeader = new BlockHeader(new AppendOnlyTreeSnapshot(Fr.fromBuffer(chainTipArchive), 1), ContentCommitment.empty(), StateReference.empty(), newGlobalVariables, Fr.ZERO, Fr.ZERO);
224
- // TODO: It should be responsibility of the P2P layer to validate txs before passing them on here
255
+ // TODO: It should be responsibility of the P2P layer to validate txs before passing them on here.
256
+ // TODO: We should validate only the number of txs we need to speed up this process.
225
257
  const allValidTxs = await this.takeValidTxs(pendingTxs, this.txValidatorFactory.validatorForNewTxs(newGlobalVariables, this.allowedInSetup));
226
258
  // TODO: We are taking the size of the tx from private-land, but we should be doing this after running
227
259
  // public functions. Only reason why we do it here now is because the public processor and orchestrator
@@ -232,6 +264,7 @@ let Sequencer = (() => {
232
264
  this.log.verbose(`Collected ${validTxs.length} txs out of ${allValidTxs.length} valid txs out of ${pendingTxs.length} total pending txs for block ${newBlockNumber}`);
233
265
  // Bail if we don't have enough valid txs
234
266
  if (!this.shouldProposeBlock(historicalHeader, { validTxsCount: validTxs.length })) {
267
+ await this.claimEpochProofRightIfAvailable(slot);
235
268
  return;
236
269
  }
237
270
  try {
@@ -262,13 +295,6 @@ let Sequencer = (() => {
262
295
  this.setState(SequencerState.IDLE, 0n);
263
296
  }
264
297
  }
265
- /** Whether to skip the check of min txs per block if more than maxSecondsBetweenBlocks has passed since the previous block. */
266
- skipMinTxsPerBlockCheck(historicalHeader) {
267
- const lastBlockTime = historicalHeader?.globalVariables.timestamp.toNumber() || 0;
268
- const currentTime = Math.floor(Date.now() / 1000);
269
- const elapsed = currentTime - lastBlockTime;
270
- return this.maxSecondsBetweenBlocks > 0 && elapsed >= this.maxSecondsBetweenBlocks;
271
- }
272
298
  async mayProposeBlock(tipArchive, proposalBlockNumber) {
273
299
  // This checks that we can propose, and gives us the slot that we are to propose for
274
300
  try {
@@ -290,16 +316,17 @@ let Sequencer = (() => {
290
316
  if (!this.enforceTimeTable) {
291
317
  return true;
292
318
  }
293
- if (this.timeTable[proposedState] === this.aztecSlotDuration) {
319
+ const maxAllowedTime = this.timeTable[proposedState];
320
+ if (maxAllowedTime === this.aztecSlotDuration) {
294
321
  return true;
295
322
  }
296
- const bufferSeconds = this.timeTable[proposedState] - secondsIntoSlot;
323
+ const bufferSeconds = maxAllowedTime - secondsIntoSlot;
297
324
  if (bufferSeconds < 0) {
298
- this.log.warn(`Too far into slot to transition to ${proposedState}. max allowed: ${this.timeTable[proposedState]}s, time into slot: ${secondsIntoSlot}s`);
325
+ this.log.warn(`Too far into slot to transition to ${proposedState}`, { maxAllowedTime, secondsIntoSlot });
299
326
  return false;
300
327
  }
301
328
  this.metrics.recordStateTransitionBufferMs(Math.floor(bufferSeconds * 1000), proposedState);
302
- this.log.debug(`Enough time to transition to ${proposedState}, max allowed: ${this.timeTable[proposedState]}s, time into slot: ${secondsIntoSlot}s`);
329
+ this.log.trace(`Enough time to transition to ${proposedState}`, { maxAllowedTime, secondsIntoSlot });
303
330
  return true;
304
331
  }
305
332
  /**
@@ -316,7 +343,7 @@ let Sequencer = (() => {
316
343
  this.log.warn(`Cannot set sequencer from ${this.state} to ${proposedState} as it is stopped.`);
317
344
  return;
318
345
  }
319
- const secondsIntoSlot = getSecondsIntoSlot(this.l1GenesisTime, this.aztecSlotDuration, Number(currentSlotNumber));
346
+ const secondsIntoSlot = this.getSecondsIntoSlot(currentSlotNumber);
320
347
  if (!this.doIHaveEnoughTimeLeft(proposedState, secondsIntoSlot)) {
321
348
  throw new SequencerTooSlowError(this.state, proposedState, this.timeTable[proposedState], secondsIntoSlot);
322
349
  }
@@ -333,42 +360,23 @@ let Sequencer = (() => {
333
360
  const currentTime = Math.floor(Date.now() / 1000);
334
361
  const elapsedSinceLastBlock = currentTime - lastBlockTime;
335
362
  this.log.debug(`Last block mined at ${lastBlockTime} current time is ${currentTime} (elapsed ${elapsedSinceLastBlock})`);
336
- // If we haven't hit the maxSecondsBetweenBlocks, we need to have at least minTxsPerBLock txs.
337
- // Do not go forward with new block if not enough time has passed since last block
338
- if (this.minSecondsBetweenBlocks > 0 && elapsedSinceLastBlock < this.minSecondsBetweenBlocks) {
339
- this.log.verbose(`Not creating block because not enough time ${this.minSecondsBetweenBlocks} has passed since last block`);
363
+ // We need to have at least minTxsPerBLock txs.
364
+ if (args.pendingTxsCount !== undefined && args.pendingTxsCount < this.minTxsPerBLock) {
365
+ this.log.verbose(`Not creating block because not enough txs in the pool (got ${args.pendingTxsCount} min ${this.minTxsPerBLock})`);
340
366
  return false;
341
367
  }
342
- const skipCheck = this.skipMinTxsPerBlockCheck(historicalHeader);
343
- // If we haven't hit the maxSecondsBetweenBlocks, we need to have at least minTxsPerBLock txs.
344
- if (args.pendingTxsCount != undefined) {
345
- if (args.pendingTxsCount < this.minTxsPerBLock) {
346
- if (skipCheck) {
347
- this.log.debug(`Creating block with only ${args.pendingTxsCount} txs as more than ${this.maxSecondsBetweenBlocks}s have passed since last block`);
348
- }
349
- else {
350
- this.log.verbose(`Not creating block because not enough txs in the pool (got ${args.pendingTxsCount} min ${this.minTxsPerBLock})`);
351
- return false;
352
- }
353
- }
354
- }
355
368
  // Bail if we don't have enough valid txs
356
- if (args.validTxsCount != undefined) {
357
- // Bail if we don't have enough valid txs
358
- if (!skipCheck && args.validTxsCount < this.minTxsPerBLock) {
359
- this.log.verbose(`Not creating block because not enough valid txs loaded from the pool (got ${args.validTxsCount} min ${this.minTxsPerBLock})`);
360
- return false;
361
- }
369
+ if (args.validTxsCount !== undefined && args.validTxsCount < this.minTxsPerBLock) {
370
+ this.log.verbose(`Not creating block because not enough valid txs loaded from the pool (got ${args.validTxsCount} min ${this.minTxsPerBLock})`);
371
+ return false;
362
372
  }
363
373
  // TODO: This check should be processedTxs.length < this.minTxsPerBLock, so we don't publish a block with
364
374
  // less txs than the minimum. But that'd cause the entire block to be aborted and retried. Instead, we should
365
375
  // go back to the p2p pool and load more txs until we hit our minTxsPerBLock target. Only if there are no txs
366
376
  // we should bail.
367
- if (args.processedTxsCount != undefined) {
368
- if (args.processedTxsCount === 0 && !skipCheck && this.minTxsPerBLock > 0) {
369
- this.log.verbose('No txs processed correctly to build block.');
370
- return false;
371
- }
377
+ if (args.processedTxsCount === 0 && this.minTxsPerBLock > 0) {
378
+ this.log.verbose('No txs processed correctly to build block.');
379
+ return false;
372
380
  }
373
381
  return true;
374
382
  }
@@ -381,8 +389,9 @@ let Sequencer = (() => {
381
389
  * @param newGlobalVariables - The global variables for the new block
382
390
  * @param historicalHeader - The historical header of the parent
383
391
  * @param interrupt - The interrupt callback, used to validate the block for submission and check if we should propose the block
392
+ * @param opts - Whether to just validate the block as a validator, as opposed to building it as a proposal
384
393
  */
385
- async buildBlock(validTxs, newGlobalVariables, historicalHeader, interrupt) {
394
+ async buildBlock(validTxs, newGlobalVariables, historicalHeader, interrupt, opts = {}) {
386
395
  const blockNumber = newGlobalVariables.blockNumber.toBigInt();
387
396
  const slot = newGlobalVariables.slotNumber.toBigInt();
388
397
  this.log.debug(`Requesting L1 to L2 messages from contract for block ${blockNumber}`);
@@ -402,18 +411,43 @@ let Sequencer = (() => {
402
411
  const publicProcessorFork = await this.worldState.fork();
403
412
  const orchestratorFork = await this.worldState.fork();
404
413
  try {
405
- const processor = this.publicProcessorFactory.create(publicProcessorFork, historicalHeader, newGlobalVariables);
414
+ const processor = this.publicProcessorFactory.create(publicProcessorFork, historicalHeader, newGlobalVariables, true);
406
415
  const blockBuildingTimer = new Timer();
407
416
  const blockBuilder = this.blockBuilderFactory.create(orchestratorFork);
408
- await blockBuilder.startNewBlock(blockSize, newGlobalVariables, l1ToL2Messages);
409
- const [publicProcessorDuration, [processedTxs, failedTxs]] = await elapsed(() => processor.process(validTxs, blockSize, blockBuilder, this.txValidatorFactory.validatorForProcessedTxs(publicProcessorFork)));
417
+ await blockBuilder.startNewBlock(newGlobalVariables, l1ToL2Messages);
418
+ // We set the deadline for tx processing to the start of the CREATING_BLOCK phase, plus the expected time for tx processing.
419
+ // Deadline is only set if enforceTimeTable is enabled.
420
+ const processingEndTimeWithinSlot = this.timeTable[SequencerState.CREATING_BLOCK] + this.processTxTime;
421
+ const processingDeadline = this.enforceTimeTable
422
+ ? new Date((this.getSlotStartTimestamp(slot) + processingEndTimeWithinSlot) * 1000)
423
+ : undefined;
424
+ this.log.verbose(`Processing ${validTxs.length} txs`, {
425
+ slot,
426
+ slotStart: new Date(this.getSlotStartTimestamp(slot) * 1000),
427
+ now: new Date(this.dateProvider.now()),
428
+ deadline: processingDeadline,
429
+ });
430
+ const processingTxValidator = this.txValidatorFactory.validatorForProcessedTxs(publicProcessorFork);
431
+ const [publicProcessorDuration, [processedTxs, failedTxs]] = await elapsed(() => processor.process(validTxs, blockSize, processingTxValidator, processingDeadline));
410
432
  if (failedTxs.length > 0) {
411
433
  const failedTxData = failedTxs.map(fail => fail.tx);
412
434
  this.log.verbose(`Dropping failed txs ${Tx.getHashes(failedTxData).join(', ')}`);
413
435
  await this.p2pClient.deleteTxs(Tx.getHashes(failedTxData));
414
436
  }
437
+ if (!opts.validateOnly && // We check for minTxCount only if we are proposing a block, not if we are validating it
438
+ !this.isFlushing && // And we skip the check when flushing, since we want all pending txs to go out, no matter if too few
439
+ this.minTxsPerBLock !== undefined &&
440
+ processedTxs.length < this.minTxsPerBLock) {
441
+ this.log.warn(`Block ${blockNumber} has too few txs to be proposed (got ${processedTxs.length} but required ${this.minTxsPerBLock})`, { slot, blockNumber, processedTxCount: processedTxs.length });
442
+ throw new Error(`Block has too few successful txs to be proposed`);
443
+ }
444
+ const start = process.hrtime.bigint();
445
+ await blockBuilder.addTxs(processedTxs);
446
+ const end = process.hrtime.bigint();
447
+ const duration = Number(end - start) / 1000;
448
+ this.metrics.recordBlockBuilderTreeInsertions(duration);
415
449
  await interrupt?.(processedTxs);
416
- // All real transactions have been added, set the block as full and complete the proving.
450
+ // All real transactions have been added, set the block as full and pad if needed
417
451
  const block = await blockBuilder.setBlockCompleted();
418
452
  return {
419
453
  block,
@@ -425,8 +459,17 @@ let Sequencer = (() => {
425
459
  }
426
460
  finally {
427
461
  // We create a fresh processor each time to reset any cached state (eg storage writes)
428
- await publicProcessorFork.close();
429
- await orchestratorFork.close();
462
+ // We wait a bit to close the forks since the processor may still be working on a dangling tx
463
+ // which was interrupted due to the processingDeadline being hit.
464
+ setTimeout(async () => {
465
+ try {
466
+ await publicProcessorFork.close();
467
+ await orchestratorFork.close();
468
+ }
469
+ catch (err) {
470
+ this.log.error(`Error closing forks`, err);
471
+ }
472
+ }, 5000);
430
473
  }
431
474
  }
432
475
  /**
@@ -463,6 +506,8 @@ let Sequencer = (() => {
463
506
  throw new Error('Should not propose the block');
464
507
  }
465
508
  };
509
+ // Start collecting proof quotes for the previous epoch if needed in the background
510
+ const proofQuotePromise = this.createProofClaimForPreviousEpoch(slot);
466
511
  try {
467
512
  const buildBlockRes = await this.buildBlock(validTxs, newGlobalVariables, historicalHeader, interrupt);
468
513
  const { block, publicProcessorDuration, numProcessedTxs, numMsgs, blockBuildingTimer } = buildBlockRes;
@@ -481,7 +526,6 @@ let Sequencer = (() => {
481
526
  const blockHash = block.hash();
482
527
  const txHashes = validTxs.map(tx => tx.getTxHash());
483
528
  this.log.info(`Built block ${block.number} with hash ${blockHash}`, {
484
- txEffectsHash: block.header.contentCommitment.txsEffectsHash.toString('hex'),
485
529
  blockHash,
486
530
  globalVariables: block.header.globalVariables.toInspect(),
487
531
  txHashes,
@@ -495,11 +539,11 @@ let Sequencer = (() => {
495
539
  const stopCollectingAttestationsTimer = this.metrics.startCollectingAttestationsTimer();
496
540
  const attestations = await this.collectAttestations(block, txHashes);
497
541
  if (attestations !== undefined) {
498
- this.log.verbose(`Collected ${attestations.length} attestations`);
542
+ this.log.verbose(`Collected ${attestations.length} attestations`, { blockHash, blockNumber });
499
543
  }
500
544
  stopCollectingAttestationsTimer();
501
- this.log.debug('Collecting proof quotes');
502
- const proofQuote = await this.createProofClaimForPreviousEpoch(newGlobalVariables.slotNumber.toBigInt());
545
+ // Get the proof quote for the previous epoch, if any
546
+ const proofQuote = await proofQuotePromise;
503
547
  await this.publishL2Block(block, attestations, txHashes, proofQuote);
504
548
  this.metrics.recordPublishedBlock(workDuration);
505
549
  this.log.info(`Published rollup block ${block.number} with ${numProcessedTxs} transactions and ${numMsgs} messages in ${Math.ceil(workDuration)}ms`, {
@@ -537,17 +581,16 @@ let Sequencer = (() => {
537
581
  throw new Error(msg);
538
582
  }
539
583
  const numberOfRequiredAttestations = Math.floor((committee.length * 2) / 3) + 1;
540
- this.log.debug('Creating block proposal');
584
+ const slotNumber = block.header.globalVariables.slotNumber.toBigInt();
585
+ this.setState(SequencerState.COLLECTING_ATTESTATIONS, slotNumber);
586
+ this.log.debug('Creating block proposal for validators');
541
587
  const proposal = await this.validatorClient.createBlockProposal(block.header, block.archive.root, txHashes);
542
588
  if (!proposal) {
543
589
  this.log.warn(`Failed to create block proposal, skipping collecting attestations`);
544
590
  return undefined;
545
591
  }
546
- const slotNumber = block.header.globalVariables.slotNumber.toBigInt();
547
- this.setState(SequencerState.PUBLISHING_BLOCK_TO_PEERS, slotNumber);
548
592
  this.log.debug('Broadcasting block proposal to validators');
549
593
  this.validatorClient.broadcastBlockProposal(proposal);
550
- this.setState(SequencerState.WAITING_FOR_ATTESTATIONS, slotNumber);
551
594
  const attestations = await this.validatorClient.collectAttestations(proposal, numberOfRequiredAttestations);
552
595
  // note: the smart contract requires that the signatures are provided in the order of the committee
553
596
  return orderAttestations(attestations, committee);
@@ -557,10 +600,11 @@ let Sequencer = (() => {
557
600
  // Find out which epoch we are currently in
558
601
  const epochToProve = await this.publisher.getClaimableEpoch();
559
602
  if (epochToProve === undefined) {
560
- this.log.debug(`No epoch to prove`);
603
+ this.log.trace(`No epoch to prove at slot ${slotNumber}`);
561
604
  return undefined;
562
605
  }
563
606
  // Get quotes for the epoch to be proven
607
+ this.log.debug(`Collecting proof quotes for epoch ${epochToProve}`);
564
608
  const quotes = await this.p2pClient.getEpochProofQuotes(epochToProve);
565
609
  this.log.verbose(`Retrieved ${quotes.length} quotes for slot ${slotNumber} epoch ${epochToProve}`, {
566
610
  epochToProve,
@@ -568,7 +612,10 @@ let Sequencer = (() => {
568
612
  quotes: quotes.map(q => q.payload),
569
613
  });
570
614
  // ensure these quotes are still valid for the slot and have the contract validate them
571
- const validQuotesPromise = Promise.all(quotes.filter(x => x.payload.validUntilSlot >= slotNumber).map(x => this.publisher.validateProofQuote(x)));
615
+ const validQuotesPromise = Promise.all(quotes
616
+ .filter(x => x.payload.validUntilSlot >= slotNumber)
617
+ .filter(x => x.payload.epochToProve === epochToProve)
618
+ .map(x => this.publisher.validateProofQuote(x)));
572
619
  const validQuotes = (await validQuotesPromise).filter((q) => !!q);
573
620
  if (!validQuotes.length) {
574
621
  this.log.warn(`Failed to find any valid proof quotes`);
@@ -577,7 +624,7 @@ let Sequencer = (() => {
577
624
  // pick the quote with the lowest fee
578
625
  const sortedQuotes = validQuotes.sort((a, b) => a.payload.basisPointFee - b.payload.basisPointFee);
579
626
  const quote = sortedQuotes[0];
580
- this.log.info(`Selected proof quote for proof claim`, quote.payload);
627
+ this.log.info(`Selected proof quote for proof claim`, { quote: quote.toInspect() });
581
628
  return quote;
582
629
  }
583
630
  catch (err) {
@@ -620,6 +667,21 @@ let Sequencer = (() => {
620
667
  }
621
668
  return toReturn;
622
669
  }
670
+ async claimEpochProofRightIfAvailable(slotNumber) {
671
+ const proofQuote = await this.createProofClaimForPreviousEpoch(slotNumber);
672
+ if (proofQuote === undefined) {
673
+ return;
674
+ }
675
+ const epoch = proofQuote.payload.epochToProve;
676
+ const ctx = { slotNumber, epoch, quote: proofQuote.toInspect() };
677
+ this.log.verbose(`Claiming proof right for epoch ${epoch}`, ctx);
678
+ const success = await this.publisher.claimEpochProofRight(proofQuote);
679
+ if (!success) {
680
+ throw new Error(`Failed to claim proof right for epoch ${epoch}`);
681
+ }
682
+ this.log.info(`Claimed proof right for epoch ${epoch}`, ctx);
683
+ return epoch;
684
+ }
623
685
  /**
624
686
  * Returns whether all dependencies have caught up.
625
687
  * We don't check against the previous block submitted since it may have been reorg'd out.
@@ -654,6 +716,16 @@ let Sequencer = (() => {
654
716
  });
655
717
  return result;
656
718
  }
719
+ getSlotStartTimestamp(slotNumber) {
720
+ return Number(this.l1Constants.l1GenesisTime) + Number(slotNumber) * this.l1Constants.slotDuration;
721
+ }
722
+ getSecondsIntoSlot(slotNumber) {
723
+ const slotStartTimestamp = this.getSlotStartTimestamp(slotNumber);
724
+ return Number((this.dateProvider.now() / 1000 - slotStartTimestamp).toFixed(3));
725
+ }
726
+ get aztecSlotDuration() {
727
+ return this.l1Constants.slotDuration;
728
+ }
657
729
  get coinbase() {
658
730
  return this._coinbase;
659
731
  }
@@ -663,6 +735,7 @@ let Sequencer = (() => {
663
735
  },
664
736
  (() => {
665
737
  const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
738
+ _work_decorators = [trackSpan('Sequencer.work')];
666
739
  _buildBlockAndAttemptToPublish_decorators = [trackSpan('Sequencer.buildBlockAndAttemptToPublish', (_validTxs, proposalHeader, _historicalHeader) => ({
667
740
  [Attributes.BLOCK_NUMBER]: proposalHeader.globalVariables.blockNumber.toNumber(),
668
741
  }))];
@@ -674,15 +747,15 @@ let Sequencer = (() => {
674
747
  _publishL2Block_decorators = [trackSpan('Sequencer.publishL2Block', block => ({
675
748
  [Attributes.BLOCK_NUMBER]: block.number,
676
749
  }))];
750
+ _claimEpochProofRightIfAvailable_decorators = [trackSpan('Sequencer.claimEpochProofRightIfAvailable', slotNumber => ({ [Attributes.SLOT_NUMBER]: Number(slotNumber) }), epoch => ({ [Attributes.EPOCH_NUMBER]: Number(epoch) }))];
751
+ __esDecorate(_a, null, _work_decorators, { kind: "method", name: "work", static: false, private: false, access: { has: obj => "work" in obj, get: obj => obj.work }, metadata: _metadata }, null, _instanceExtraInitializers);
677
752
  __esDecorate(_a, null, _buildBlockAndAttemptToPublish_decorators, { kind: "method", name: "buildBlockAndAttemptToPublish", static: false, private: false, access: { has: obj => "buildBlockAndAttemptToPublish" in obj, get: obj => obj.buildBlockAndAttemptToPublish }, metadata: _metadata }, null, _instanceExtraInitializers);
678
753
  __esDecorate(_a, null, _collectAttestations_decorators, { kind: "method", name: "collectAttestations", static: false, private: false, access: { has: obj => "collectAttestations" in obj, get: obj => obj.collectAttestations }, metadata: _metadata }, null, _instanceExtraInitializers);
679
754
  __esDecorate(_a, null, _publishL2Block_decorators, { kind: "method", name: "publishL2Block", static: false, private: false, access: { has: obj => "publishL2Block" in obj, get: obj => obj.publishL2Block }, metadata: _metadata }, null, _instanceExtraInitializers);
755
+ __esDecorate(_a, null, _claimEpochProofRightIfAvailable_decorators, { kind: "method", name: "claimEpochProofRightIfAvailable", static: false, private: false, access: { has: obj => "claimEpochProofRightIfAvailable" in obj, get: obj => obj.claimEpochProofRightIfAvailable }, metadata: _metadata }, null, _instanceExtraInitializers);
680
756
  if (_metadata) Object.defineProperty(_a, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
681
757
  })(),
682
758
  _a;
683
759
  })();
684
760
  export { Sequencer };
685
- /**
686
- * State of the sequencer.
687
- */
688
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VxdWVuY2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcXVlbmNlci9zZXF1ZW5jZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFNTCxxQkFBcUIsRUFDckIsRUFBRSxHQUlILE1BQU0sc0JBQXNCLENBQUM7QUFHOUIsT0FBTyxFQUNMLHNCQUFzQixFQUN0QixXQUFXLEVBQ1gsaUJBQWlCLEVBQ2pCLG9CQUFvQixFQUVwQixjQUFjLEdBQ2YsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDL0QsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3BELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUMzRCxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDOUMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNuRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDM0QsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUl6RCxPQUFPLEVBQUUsVUFBVSxFQUFxQyxTQUFTLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUtuRyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUc5RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDaEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxrQkFBa0IsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLFlBQVksQ0FBQztBQVFuRixNQUFNLE9BQU8scUJBQXNCLFNBQVEsS0FBSztJQUM5QyxZQUNrQixZQUE0QixFQUM1QixhQUE2QixFQUM3Qixj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
761
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VxdWVuY2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcXVlbmNlci9zZXF1ZW5jZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFPTCxxQkFBcUIsRUFDckIsRUFBRSxHQUlILE1BQU0sc0JBQXNCLENBQUM7QUFHOUIsT0FBTyxFQUNMLHNCQUFzQixFQUN0QixXQUFXLEVBQ1gsaUJBQWlCLEVBQ2pCLG9CQUFvQixFQUVwQixjQUFjLEdBQ2YsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDL0QsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3BELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUMzRCxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDOUMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNuRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDM0QsT0FBTyxFQUFxQixLQUFLLEVBQUUsT0FBTyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFJNUUsT0FBTyxFQUFFLFVBQVUsRUFBcUMsU0FBUyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFLbkcsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFOUQsT0FBTyxFQUFFLCtCQUErQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRS9ELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNoRCxPQUFPLEVBQUUsY0FBYyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRS9ELE9BQU8sRUFBRSxjQUFjLEVBQUUsQ0FBQztBQVExQixN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