@aztec/sequencer-client 4.0.0-nightly.20260112 → 4.0.0-nightly.20260114
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/sequencer-client.d.ts +4 -5
- package/dest/client/sequencer-client.d.ts.map +1 -1
- package/dest/config.d.ts +1 -1
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +8 -1
- package/dest/index.d.ts +2 -3
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +1 -2
- package/dest/publisher/sequencer-publisher.d.ts +15 -15
- package/dest/publisher/sequencer-publisher.d.ts.map +1 -1
- package/dest/publisher/sequencer-publisher.js +44 -46
- package/dest/sequencer/block_builder.d.ts +2 -2
- package/dest/sequencer/block_builder.d.ts.map +1 -1
- package/dest/sequencer/block_builder.js +5 -5
- package/dest/sequencer/checkpoint_proposal_job.d.ts +11 -8
- package/dest/sequencer/checkpoint_proposal_job.d.ts.map +1 -1
- package/dest/sequencer/checkpoint_proposal_job.js +56 -30
- package/dest/sequencer/index.d.ts +1 -2
- package/dest/sequencer/index.d.ts.map +1 -1
- package/dest/sequencer/index.js +0 -1
- package/dest/sequencer/metrics.d.ts +3 -3
- package/dest/sequencer/metrics.d.ts.map +1 -1
- package/dest/sequencer/metrics.js +4 -4
- package/dest/sequencer/sequencer.d.ts +13 -12
- package/dest/sequencer/sequencer.d.ts.map +1 -1
- package/dest/sequencer/sequencer.js +30 -28
- package/dest/test/index.d.ts +2 -3
- package/dest/test/index.d.ts.map +1 -1
- package/dest/test/mock_checkpoint_builder.d.ts +13 -3
- package/dest/test/mock_checkpoint_builder.d.ts.map +1 -1
- package/dest/test/mock_checkpoint_builder.js +27 -2
- package/dest/test/utils.d.ts +8 -4
- package/dest/test/utils.d.ts.map +1 -1
- package/dest/test/utils.js +19 -9
- package/package.json +27 -27
- package/src/client/sequencer-client.ts +3 -4
- package/src/config.ts +7 -0
- package/src/index.ts +0 -3
- package/src/publisher/sequencer-publisher.ts +75 -70
- package/src/sequencer/block_builder.ts +5 -3
- package/src/sequencer/checkpoint_proposal_job.ts +68 -38
- package/src/sequencer/index.ts +0 -1
- package/src/sequencer/metrics.ts +4 -4
- package/src/sequencer/sequencer.ts +47 -34
- package/src/test/index.ts +1 -2
- package/src/test/mock_checkpoint_builder.ts +45 -3
- package/src/test/utils.ts +36 -9
- package/dest/sequencer/checkpoint_builder.d.ts +0 -63
- package/dest/sequencer/checkpoint_builder.d.ts.map +0 -1
- package/dest/sequencer/checkpoint_builder.js +0 -131
- package/dest/tx_validator/nullifier_cache.d.ts +0 -14
- package/dest/tx_validator/nullifier_cache.d.ts.map +0 -1
- package/dest/tx_validator/nullifier_cache.js +0 -24
- package/dest/tx_validator/tx_validator_factory.d.ts +0 -18
- package/dest/tx_validator/tx_validator_factory.d.ts.map +0 -1
- package/dest/tx_validator/tx_validator_factory.js +0 -53
- package/src/sequencer/checkpoint_builder.ts +0 -217
- package/src/tx_validator/nullifier_cache.ts +0 -30
- package/src/tx_validator/tx_validator_factory.ts +0 -133
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
import type { EpochCache } from '@aztec/epoch-cache';
|
|
2
|
-
import { BlockNumber, CheckpointNumber, SlotNumber } from '@aztec/foundation/branded-types';
|
|
2
|
+
import { BlockNumber, CheckpointNumber, EpochNumber, SlotNumber } from '@aztec/foundation/branded-types';
|
|
3
3
|
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
4
4
|
import type { Logger } from '@aztec/foundation/log';
|
|
5
5
|
import { type DateProvider } from '@aztec/foundation/timer';
|
|
6
6
|
import { type TypedEventEmitter } from '@aztec/foundation/types';
|
|
7
7
|
import type { P2P } from '@aztec/p2p';
|
|
8
8
|
import type { SlasherClientInterface } from '@aztec/slasher';
|
|
9
|
+
import { type L2BlockSink, type L2BlockSource } from '@aztec/stdlib/block';
|
|
9
10
|
import type { Checkpoint } from '@aztec/stdlib/checkpoint';
|
|
10
11
|
import type { ResolvedSequencerConfig, WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server';
|
|
11
|
-
import type
|
|
12
|
+
import { type L1ToL2MessageSource } from '@aztec/stdlib/messaging';
|
|
12
13
|
import { type Traceable, type Tracer } from '@aztec/telemetry-client';
|
|
13
|
-
import type
|
|
14
|
+
import { type FullNodeCheckpointsBuilder, type ValidatorClient } from '@aztec/validator-client';
|
|
14
15
|
import type { GlobalVariableBuilder } from '../global_variable_builder/global_builder.js';
|
|
15
|
-
import type {
|
|
16
|
-
import { type FullNodeCheckpointsBuilder } from './checkpoint_builder.js';
|
|
16
|
+
import type { InvalidateCheckpointRequest, SequencerPublisher } from '../publisher/sequencer-publisher.js';
|
|
17
17
|
import type { SequencerEvents } from './events.js';
|
|
18
18
|
import type { SequencerMetrics } from './metrics.js';
|
|
19
19
|
import type { SequencerTimetable } from './timetable.js';
|
|
@@ -26,19 +26,22 @@ import { SequencerState } from './utils.js';
|
|
|
26
26
|
* the Sequencer once the check for being the proposer for the slot has succeeded.
|
|
27
27
|
*/
|
|
28
28
|
export declare class CheckpointProposalJob implements Traceable {
|
|
29
|
+
private readonly epoch;
|
|
29
30
|
private readonly slot;
|
|
30
31
|
private readonly checkpointNumber;
|
|
31
32
|
private readonly syncedToBlockNumber;
|
|
32
33
|
private readonly proposer;
|
|
33
34
|
private readonly publisher;
|
|
34
35
|
private readonly attestorAddress;
|
|
35
|
-
private readonly
|
|
36
|
+
private readonly invalidateCheckpoint;
|
|
36
37
|
private readonly validatorClient;
|
|
37
38
|
private readonly globalsBuilder;
|
|
38
39
|
private readonly p2pClient;
|
|
39
40
|
private readonly worldState;
|
|
40
41
|
private readonly l1ToL2MessageSource;
|
|
42
|
+
private readonly l2BlockSource;
|
|
41
43
|
private readonly checkpointsBuilder;
|
|
44
|
+
private readonly blockSink;
|
|
42
45
|
private readonly l1Constants;
|
|
43
46
|
protected config: ResolvedSequencerConfig;
|
|
44
47
|
protected timetable: SequencerTimetable;
|
|
@@ -50,7 +53,7 @@ export declare class CheckpointProposalJob implements Traceable {
|
|
|
50
53
|
private readonly setStateFn;
|
|
51
54
|
protected readonly log: Logger;
|
|
52
55
|
readonly tracer: Tracer;
|
|
53
|
-
constructor(slot: SlotNumber, checkpointNumber: CheckpointNumber, syncedToBlockNumber: BlockNumber, proposer: EthAddress | undefined, publisher: SequencerPublisher, attestorAddress: EthAddress,
|
|
56
|
+
constructor(epoch: EpochNumber, slot: SlotNumber, checkpointNumber: CheckpointNumber, syncedToBlockNumber: BlockNumber, proposer: EthAddress | undefined, publisher: SequencerPublisher, attestorAddress: EthAddress, invalidateCheckpoint: InvalidateCheckpointRequest | undefined, validatorClient: ValidatorClient, globalsBuilder: GlobalVariableBuilder, p2pClient: P2P, worldState: WorldStateSynchronizer, l1ToL2MessageSource: L1ToL2MessageSource, l2BlockSource: L2BlockSource, checkpointsBuilder: FullNodeCheckpointsBuilder, blockSink: L2BlockSink, l1Constants: SequencerRollupConstants, config: ResolvedSequencerConfig, timetable: SequencerTimetable, slasherClient: SlasherClientInterface | undefined, epochCache: EpochCache, dateProvider: DateProvider, metrics: SequencerMetrics, eventEmitter: TypedEventEmitter<SequencerEvents>, setStateFn: (state: SequencerState, slot?: SlotNumber) => void, log: Logger, tracer: Tracer);
|
|
54
57
|
/**
|
|
55
58
|
* Executes the checkpoint proposal job.
|
|
56
59
|
* Returns the published checkpoint if successful, undefined otherwise.
|
|
@@ -73,4 +76,4 @@ export declare class CheckpointProposalJob implements Traceable {
|
|
|
73
76
|
private getSecondsIntoSlot;
|
|
74
77
|
getPublisher(): SequencerPublisher;
|
|
75
78
|
}
|
|
76
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
79
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2twb2ludF9wcm9wb3NhbF9qb2IuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXF1ZW5jZXIvY2hlY2twb2ludF9wcm9wb3NhbF9qb2IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDckQsT0FBTyxFQUFFLFdBQVcsRUFBRSxnQkFBZ0IsRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFHekcsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBRzNELE9BQU8sS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRXBELE9BQU8sRUFBRSxLQUFLLFlBQVksRUFBUyxNQUFNLHlCQUF5QixDQUFDO0FBQ25FLE9BQU8sRUFBRSxLQUFLLGlCQUFpQixFQUFZLE1BQU0seUJBQXlCLENBQUM7QUFDM0UsT0FBTyxLQUFLLEVBQUUsR0FBRyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3RDLE9BQU8sS0FBSyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0QsT0FBTyxFQUlMLEtBQUssV0FBVyxFQUNoQixLQUFLLGFBQWEsRUFFbkIsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEtBQUssRUFBRSxVQUFVLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUczRCxPQUFPLEtBQUssRUFFVix1QkFBdUIsRUFDdkIsc0JBQXNCLEVBQ3ZCLE1BQU0saUNBQWlDLENBQUM7QUFDekMsT0FBTyxFQUFFLEtBQUssbUJBQW1CLEVBQW1DLE1BQU0seUJBQXlCLENBQUM7QUFNcEcsT0FBTyxFQUFjLEtBQUssU0FBUyxFQUFFLEtBQUssTUFBTSxFQUFhLE1BQU0seUJBQXlCLENBQUM7QUFDN0YsT0FBTyxFQUFxQixLQUFLLDBCQUEwQixFQUFFLEtBQUssZUFBZSxFQUFFLE1B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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checkpoint_proposal_job.d.ts","sourceRoot":"","sources":["../../src/sequencer/checkpoint_proposal_job.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,gBAAgB,
|
|
1
|
+
{"version":3,"file":"checkpoint_proposal_job.d.ts","sourceRoot":"","sources":["../../src/sequencer/checkpoint_proposal_job.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAGzG,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAG3D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAEpD,OAAO,EAAE,KAAK,YAAY,EAAS,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,KAAK,iBAAiB,EAAY,MAAM,yBAAyB,CAAC;AAC3E,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EAIL,KAAK,WAAW,EAChB,KAAK,aAAa,EAEnB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAG3D,OAAO,KAAK,EAEV,uBAAuB,EACvB,sBAAsB,EACvB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,KAAK,mBAAmB,EAAmC,MAAM,yBAAyB,CAAC;AAMpG,OAAO,EAAc,KAAK,SAAS,EAAE,KAAK,MAAM,EAAa,MAAM,yBAAyB,CAAC;AAC7F,OAAO,EAAqB,KAAK,0BAA0B,EAAE,KAAK,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAEnH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,8CAA8C,CAAC;AAC1F,OAAO,KAAK,EAAE,2BAA2B,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAG3G,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAK5C;;;;;GAKG;AACH,qBAAa,qBAAsB,YAAW,SAAS;IAEnD,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IACjC,OAAO,CAAC,QAAQ,CAAC,mBAAmB;IAEpC,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,eAAe;IAChC,OAAO,CAAC,QAAQ,CAAC,oBAAoB;IACrC,OAAO,CAAC,QAAQ,CAAC,eAAe;IAChC,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,mBAAmB;IACpC,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,kBAAkB;IACnC,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,SAAS,CAAC,MAAM,EAAE,uBAAuB;IACzC,SAAS,CAAC,SAAS,EAAE,kBAAkB;IACvC,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,SAAS,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM;aACd,MAAM,EAAE,MAAM;IA5BhC,YACmB,KAAK,EAAE,WAAW,EAClB,IAAI,EAAE,UAAU,EAChB,gBAAgB,EAAE,gBAAgB,EAClC,mBAAmB,EAAE,WAAW,EAEhC,QAAQ,EAAE,UAAU,GAAG,SAAS,EAChC,SAAS,EAAE,kBAAkB,EAC7B,eAAe,EAAE,UAAU,EAC3B,oBAAoB,EAAE,2BAA2B,GAAG,SAAS,EAC7D,eAAe,EAAE,eAAe,EAChC,cAAc,EAAE,qBAAqB,EACrC,SAAS,EAAE,GAAG,EACd,UAAU,EAAE,sBAAsB,EAClC,mBAAmB,EAAE,mBAAmB,EACxC,aAAa,EAAE,aAAa,EAC5B,kBAAkB,EAAE,0BAA0B,EAC9C,SAAS,EAAE,WAAW,EACtB,WAAW,EAAE,wBAAwB,EAC5C,MAAM,EAAE,uBAAuB,EAC/B,SAAS,EAAE,kBAAkB,EACtB,aAAa,EAAE,sBAAsB,GAAG,SAAS,EACjD,UAAU,EAAE,UAAU,EACtB,YAAY,EAAE,YAAY,EAC1B,OAAO,EAAE,gBAAgB,EACzB,YAAY,EAAE,iBAAiB,CAAC,eAAe,CAAC,EAChD,UAAU,EAAE,CAAC,KAAK,EAAE,cAAc,EAAE,IAAI,CAAC,EAAE,UAAU,KAAK,IAAI,EAC5D,GAAG,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EAC5B;IAEJ;;;OAGG;IAEU,OAAO,IAAI,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CA4CtD;YASa,iBAAiB;YA2IjB,wBAAwB;YAqHxB,oBAAoB;YAQpB,gBAAgB;YAgHhB,aAAa;YAyCb,mBAAmB;IA+DjC,wEAAwE;IACxE,OAAO,CAAC,sBAAsB;YA8ChB,oBAAoB;YAepB,2BAA2B;YAiB3B,8BAA8B;IAwB5C,0DAA0D;IAC1D,UACgB,mBAAmB,CAAC,qBAAqB,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAIhF;IAED,OAAO,CAAC,0BAA0B;IAIlC,OAAO,CAAC,kBAAkB;IAKnB,YAAY,uBAElB;CACF"}
|
|
@@ -447,6 +447,7 @@ import { unfreeze } from '@aztec/foundation/types';
|
|
|
447
447
|
import { CommitteeAttestationsAndSigners, MaliciousCommitteeAttestationsAndSigners } from '@aztec/stdlib/block';
|
|
448
448
|
import { getSlotStartBuildTimestamp } from '@aztec/stdlib/epoch-helpers';
|
|
449
449
|
import { Gas } from '@aztec/stdlib/gas';
|
|
450
|
+
import { computeInHashFromL1ToL2Messages } from '@aztec/stdlib/messaging';
|
|
450
451
|
import { orderAttestations } from '@aztec/stdlib/p2p';
|
|
451
452
|
import { AttestationTimeoutError } from '@aztec/stdlib/validators';
|
|
452
453
|
import { Attributes, trackSpan } from '@aztec/telemetry-client';
|
|
@@ -467,19 +468,22 @@ _dec = trackSpan('CheckpointProposalJob.execute'), _dec1 = trackSpan('Checkpoint
|
|
|
467
468
|
* as well as enqueueing votes for slashing and governance proposals. This class is created from
|
|
468
469
|
* the Sequencer once the check for being the proposer for the slot has succeeded.
|
|
469
470
|
*/ export class CheckpointProposalJob {
|
|
471
|
+
epoch;
|
|
470
472
|
slot;
|
|
471
473
|
checkpointNumber;
|
|
472
474
|
syncedToBlockNumber;
|
|
473
475
|
proposer;
|
|
474
476
|
publisher;
|
|
475
477
|
attestorAddress;
|
|
476
|
-
|
|
478
|
+
invalidateCheckpoint;
|
|
477
479
|
validatorClient;
|
|
478
480
|
globalsBuilder;
|
|
479
481
|
p2pClient;
|
|
480
482
|
worldState;
|
|
481
483
|
l1ToL2MessageSource;
|
|
484
|
+
l2BlockSource;
|
|
482
485
|
checkpointsBuilder;
|
|
486
|
+
blockSink;
|
|
483
487
|
l1Constants;
|
|
484
488
|
config;
|
|
485
489
|
timetable;
|
|
@@ -535,21 +539,24 @@ _dec = trackSpan('CheckpointProposalJob.execute'), _dec1 = trackSpan('Checkpoint
|
|
|
535
539
|
]
|
|
536
540
|
], []));
|
|
537
541
|
}
|
|
538
|
-
constructor(slot, checkpointNumber, syncedToBlockNumber, // TODO(palla/mbps): Can we remove the proposer in favor of attestorAddress? Need to check fisherman-node flows.
|
|
539
|
-
proposer, publisher, attestorAddress,
|
|
542
|
+
constructor(epoch, slot, checkpointNumber, syncedToBlockNumber, // TODO(palla/mbps): Can we remove the proposer in favor of attestorAddress? Need to check fisherman-node flows.
|
|
543
|
+
proposer, publisher, attestorAddress, invalidateCheckpoint, validatorClient, globalsBuilder, p2pClient, worldState, l1ToL2MessageSource, l2BlockSource, checkpointsBuilder, blockSink, l1Constants, config, timetable, slasherClient, epochCache, dateProvider, metrics, eventEmitter, setStateFn, log, tracer){
|
|
544
|
+
this.epoch = epoch;
|
|
540
545
|
this.slot = slot;
|
|
541
546
|
this.checkpointNumber = checkpointNumber;
|
|
542
547
|
this.syncedToBlockNumber = syncedToBlockNumber;
|
|
543
548
|
this.proposer = proposer;
|
|
544
549
|
this.publisher = publisher;
|
|
545
550
|
this.attestorAddress = attestorAddress;
|
|
546
|
-
this.
|
|
551
|
+
this.invalidateCheckpoint = invalidateCheckpoint;
|
|
547
552
|
this.validatorClient = validatorClient;
|
|
548
553
|
this.globalsBuilder = globalsBuilder;
|
|
549
554
|
this.p2pClient = p2pClient;
|
|
550
555
|
this.worldState = worldState;
|
|
551
556
|
this.l1ToL2MessageSource = l1ToL2MessageSource;
|
|
557
|
+
this.l2BlockSource = l2BlockSource;
|
|
552
558
|
this.checkpointsBuilder = checkpointsBuilder;
|
|
559
|
+
this.blockSink = blockSink;
|
|
553
560
|
this.l1Constants = l1Constants;
|
|
554
561
|
this.config = config;
|
|
555
562
|
this.timetable = timetable;
|
|
@@ -616,26 +623,34 @@ _dec = trackSpan('CheckpointProposalJob.execute'), _dec1 = trackSpan('Checkpoint
|
|
|
616
623
|
// Start the checkpoint
|
|
617
624
|
this.setStateFn(SequencerState.INITIALIZING_CHECKPOINT, this.slot);
|
|
618
625
|
this.metrics.incOpenSlot(this.slot, this.proposer?.toString() ?? 'unknown');
|
|
619
|
-
// Enqueues
|
|
620
|
-
if (this.
|
|
621
|
-
this.publisher.
|
|
626
|
+
// Enqueues checkpoint invalidation (constant for the whole slot)
|
|
627
|
+
if (this.invalidateCheckpoint && !this.config.skipInvalidateBlockAsProposer) {
|
|
628
|
+
this.publisher.enqueueInvalidateCheckpoint(this.invalidateCheckpoint);
|
|
622
629
|
}
|
|
623
630
|
// Create checkpoint builder for the slot
|
|
624
631
|
const checkpointGlobalVariables = await this.globalsBuilder.buildCheckpointGlobalVariables(coinbase, feeRecipient, this.slot);
|
|
625
|
-
// Collect L1 to L2 messages for the checkpoint
|
|
632
|
+
// Collect L1 to L2 messages for the checkpoint and compute their hash
|
|
626
633
|
const l1ToL2Messages = await this.l1ToL2MessageSource.getL1ToL2Messages(this.checkpointNumber);
|
|
634
|
+
const inHash = computeInHashFromL1ToL2Messages(l1ToL2Messages);
|
|
635
|
+
// Collect the out hashes of all the checkpoints before this one in the same epoch
|
|
636
|
+
const previousCheckpoints = (await this.l2BlockSource.getCheckpointsForEpoch(this.epoch)).filter((c)=>c.number < this.checkpointNumber);
|
|
637
|
+
const previousCheckpointOutHashes = previousCheckpoints.map((c)=>c.getCheckpointOutHash());
|
|
627
638
|
const fork = _ts_add_disposable_resource(env, await this.worldState.fork(this.syncedToBlockNumber, {
|
|
628
639
|
closeDelayMs: 12_000
|
|
629
640
|
}), false);
|
|
630
641
|
// Create checkpoint builder for the entire slot
|
|
631
|
-
const checkpointBuilder = await this.checkpointsBuilder.startCheckpoint(this.checkpointNumber, checkpointGlobalVariables, l1ToL2Messages, fork);
|
|
642
|
+
const checkpointBuilder = await this.checkpointsBuilder.startCheckpoint(this.checkpointNumber, checkpointGlobalVariables, l1ToL2Messages, previousCheckpointOutHashes, fork);
|
|
632
643
|
// Options for the validator client when creating block and checkpoint proposals
|
|
633
644
|
const blockProposalOptions = {
|
|
634
645
|
publishFullTxs: !!this.config.publishTxsWithProposals,
|
|
635
646
|
broadcastInvalidBlockProposal: this.config.broadcastInvalidBlockProposal
|
|
636
647
|
};
|
|
648
|
+
const checkpointProposalOptions = {
|
|
649
|
+
publishFullTxs: !!this.config.publishTxsWithProposals,
|
|
650
|
+
broadcastInvalidCheckpointProposal: this.config.broadcastInvalidBlockProposal
|
|
651
|
+
};
|
|
637
652
|
// Main loop: build blocks for the checkpoint
|
|
638
|
-
const { blocksInCheckpoint,
|
|
653
|
+
const { blocksInCheckpoint, blockPendingBroadcast } = await this.buildBlocksForCheckpoint(checkpointBuilder, checkpointGlobalVariables.timestamp, inHash, blockProposalOptions);
|
|
639
654
|
if (blocksInCheckpoint.length === 0) {
|
|
640
655
|
this.log.warn(`No blocks were built for slot ${this.slot}`, {
|
|
641
656
|
slot: this.slot
|
|
@@ -659,14 +674,20 @@ _dec = trackSpan('CheckpointProposalJob.execute'), _dec1 = trackSpan('Checkpoint
|
|
|
659
674
|
this.metrics.recordCheckpointSuccess();
|
|
660
675
|
return checkpoint;
|
|
661
676
|
}
|
|
662
|
-
//
|
|
663
|
-
const
|
|
677
|
+
// Include the block pending broadcast in the checkpoint proposal if any
|
|
678
|
+
const lastBlock = blockPendingBroadcast && {
|
|
679
|
+
blockHeader: blockPendingBroadcast.block.header,
|
|
680
|
+
indexWithinCheckpoint: blockPendingBroadcast.block.indexWithinCheckpoint,
|
|
681
|
+
txs: blockPendingBroadcast.txs
|
|
682
|
+
};
|
|
683
|
+
// Create the checkpoint proposal and broadcast it
|
|
684
|
+
const proposal = await this.validatorClient.createCheckpointProposal(checkpoint.header, checkpoint.archive.root, lastBlock, this.proposer, checkpointProposalOptions);
|
|
664
685
|
const blockProposedAt = this.dateProvider.now();
|
|
665
|
-
await this.p2pClient.
|
|
686
|
+
await this.p2pClient.broadcastCheckpointProposal(proposal);
|
|
666
687
|
this.setStateFn(SequencerState.COLLECTING_ATTESTATIONS, this.slot);
|
|
667
688
|
const attestations = await this.waitForAttestations(proposal);
|
|
668
689
|
const blockAttestedAt = this.dateProvider.now();
|
|
669
|
-
this.metrics.
|
|
690
|
+
this.metrics.recordCheckpointAttestationDelay(blockAttestedAt - blockProposedAt);
|
|
670
691
|
// Proposer must sign over the attestations before pushing them to L1
|
|
671
692
|
const signer = this.proposer ?? this.publisher.getSenderAddress();
|
|
672
693
|
const attestationsSignature = await this.validatorClient.signAttestationsAndSigners(attestations, signer);
|
|
@@ -677,7 +698,7 @@ _dec = trackSpan('CheckpointProposalJob.execute'), _dec1 = trackSpan('Checkpoint
|
|
|
677
698
|
const txTimeoutAt = new Date((slotStartBuildTimestamp + aztecSlotDuration) * 1000);
|
|
678
699
|
await this.publisher.enqueueProposeCheckpoint(checkpoint, attestations, attestationsSignature, {
|
|
679
700
|
txTimeoutAt,
|
|
680
|
-
|
|
701
|
+
forcePendingCheckpointNumber: this.invalidateCheckpoint?.forcePendingCheckpointNumber
|
|
681
702
|
});
|
|
682
703
|
return checkpoint;
|
|
683
704
|
} catch (e) {
|
|
@@ -693,12 +714,12 @@ _dec = trackSpan('CheckpointProposalJob.execute'), _dec1 = trackSpan('Checkpoint
|
|
|
693
714
|
}
|
|
694
715
|
/**
|
|
695
716
|
* Builds blocks for a checkpoint within the current slot.
|
|
696
|
-
*/ async buildBlocksForCheckpoint(checkpointBuilder, timestamp, blockProposalOptions) {
|
|
717
|
+
*/ async buildBlocksForCheckpoint(checkpointBuilder, timestamp, inHash, blockProposalOptions) {
|
|
697
718
|
const blocksInCheckpoint = [];
|
|
698
719
|
const txHashesAlreadyIncluded = new Set();
|
|
699
720
|
const initialBlockNumber = BlockNumber(this.syncedToBlockNumber + 1);
|
|
700
721
|
// Last block in the checkpoint will usually be flagged as pending broadcast, so we send it along with the checkpoint proposal
|
|
701
|
-
let
|
|
722
|
+
let blockPendingBroadcast = undefined;
|
|
702
723
|
while(true){
|
|
703
724
|
const blocksBuilt = blocksInCheckpoint.length;
|
|
704
725
|
const indexWithinCheckpoint = blocksBuilt;
|
|
@@ -756,7 +777,7 @@ _dec = trackSpan('CheckpointProposalJob.execute'), _dec1 = trackSpan('Checkpoint
|
|
|
756
777
|
blockNumber,
|
|
757
778
|
blocksBuilt
|
|
758
779
|
});
|
|
759
|
-
|
|
780
|
+
blockPendingBroadcast = {
|
|
760
781
|
block,
|
|
761
782
|
txs: usedTxs
|
|
762
783
|
};
|
|
@@ -765,8 +786,7 @@ _dec = trackSpan('CheckpointProposalJob.execute'), _dec1 = trackSpan('Checkpoint
|
|
|
765
786
|
// For non-last blocks, broadcast the block proposal (unless we're in fisherman mode)
|
|
766
787
|
// If the block is the last one, we'll broadcast it along with the checkpoint at the end of the loop
|
|
767
788
|
if (!this.config.fishermanMode) {
|
|
768
|
-
|
|
769
|
-
const proposal = await this.validatorClient.createBlockProposal(block.header.globalVariables.blockNumber, (await checkpointBuilder.getCheckpoint()).header, block.archive.root, usedTxs, this.proposer, blockProposalOptions);
|
|
789
|
+
const proposal = await this.validatorClient.createBlockProposal(block.header, block.indexWithinCheckpoint, inHash, block.archive.root, usedTxs, this.proposer, blockProposalOptions);
|
|
770
790
|
await this.p2pClient.broadcastProposal(proposal);
|
|
771
791
|
}
|
|
772
792
|
// Wait until the next block's start time
|
|
@@ -778,7 +798,7 @@ _dec = trackSpan('CheckpointProposalJob.execute'), _dec1 = trackSpan('Checkpoint
|
|
|
778
798
|
});
|
|
779
799
|
return {
|
|
780
800
|
blocksInCheckpoint,
|
|
781
|
-
|
|
801
|
+
blockPendingBroadcast
|
|
782
802
|
};
|
|
783
803
|
}
|
|
784
804
|
/** Sleeps until it is time to produce the next block in the slot */ async waitUntilNextSubslot(nextSubslotStart) {
|
|
@@ -962,8 +982,7 @@ _dec = trackSpan('CheckpointProposalJob.execute'), _dec1 = trackSpan('Checkpoint
|
|
|
962
982
|
const sorted = orderAttestations(attestations, committee);
|
|
963
983
|
// Manipulate the attestations if we've been configured to do so
|
|
964
984
|
if (this.config.injectFakeAttestation || this.config.shuffleAttestationOrdering) {
|
|
965
|
-
|
|
966
|
-
return this.manipulateAttestations(checkpoint, epoch, seed, committee, sorted);
|
|
985
|
+
return this.manipulateAttestations(proposal.slotNumber, epoch, seed, committee, sorted);
|
|
967
986
|
}
|
|
968
987
|
return new CommitteeAttestationsAndSigners(sorted);
|
|
969
988
|
} catch (err) {
|
|
@@ -975,10 +994,9 @@ _dec = trackSpan('CheckpointProposalJob.execute'), _dec1 = trackSpan('Checkpoint
|
|
|
975
994
|
this.metrics.recordCollectedAttestations(collectedAttestationsCount, collectAttestationsTimer.ms());
|
|
976
995
|
}
|
|
977
996
|
}
|
|
978
|
-
/** Breaks the attestations before publishing based on attack configs */ manipulateAttestations(
|
|
997
|
+
/** Breaks the attestations before publishing based on attack configs */ manipulateAttestations(slotNumber, epoch, seed, committee, attestations) {
|
|
979
998
|
// Compute the proposer index in the committee, since we dont want to tweak it.
|
|
980
999
|
// Otherwise, the L1 rollup contract will reject the block outright.
|
|
981
|
-
const { slotNumber } = checkpoint;
|
|
982
1000
|
const proposerIndex = Number(this.epochCache.computeProposerIndex(slotNumber, epoch, seed, BigInt(committee.length)));
|
|
983
1001
|
if (this.config.injectFakeAttestation) {
|
|
984
1002
|
// Find non-empty attestations that are not from the proposer
|
|
@@ -1023,15 +1041,23 @@ _dec = trackSpan('CheckpointProposalJob.execute'), _dec1 = trackSpan('Checkpoint
|
|
|
1023
1041
|
await this.p2pClient.deleteTxs(failedTxHashes);
|
|
1024
1042
|
}
|
|
1025
1043
|
/**
|
|
1026
|
-
*
|
|
1027
|
-
*
|
|
1044
|
+
* Adds the proposed block to the archiver so it's available via P2P.
|
|
1045
|
+
* Gossip doesn't echo messages back to the sender, so the proposer's archiver/world-state
|
|
1046
|
+
* would never receive its own block without this explicit sync.
|
|
1028
1047
|
*/ async syncProposedBlockToArchiver(block) {
|
|
1029
|
-
|
|
1048
|
+
// TODO(palla/mbps): Change default to false once block sync is stable.
|
|
1049
|
+
if (this.config.skipPushProposedBlocksToArchiver !== false) {
|
|
1050
|
+
this.log.warn(`Skipping push of proposed block ${block.number} to archiver`, {
|
|
1051
|
+
blockNumber: block.number,
|
|
1052
|
+
slot: block.header.globalVariables.slotNumber
|
|
1053
|
+
});
|
|
1054
|
+
return;
|
|
1055
|
+
}
|
|
1056
|
+
this.log.debug(`Syncing proposed block ${block.number} to archiver`, {
|
|
1030
1057
|
blockNumber: block.number,
|
|
1031
1058
|
slot: block.header.globalVariables.slotNumber
|
|
1032
1059
|
});
|
|
1033
|
-
|
|
1034
|
-
await Promise.resolve();
|
|
1060
|
+
await this.blockSink.addBlock(block);
|
|
1035
1061
|
}
|
|
1036
1062
|
/** Runs fee analysis and logs checkpoint outcome as fisherman */ async handleCheckpointEndAsFisherman(checkpoint) {
|
|
1037
1063
|
// Perform L1 fee analysis before clearing requests
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
export * from './block_builder.js';
|
|
2
|
-
export * from './checkpoint_builder.js';
|
|
3
2
|
export * from './checkpoint_proposal_job.js';
|
|
4
3
|
export * from './checkpoint_voter.js';
|
|
5
4
|
export * from './config.js';
|
|
6
5
|
export * from './events.js';
|
|
7
6
|
export * from './sequencer.js';
|
|
8
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
7
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXF1ZW5jZXIvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxvQkFBb0IsQ0FBQztBQUNuQyxjQUFjLDhCQUE4QixDQUFDO0FBQzdDLGNBQWMsdUJBQXVCLENBQUM7QUFDdEMsY0FBYyxhQUFhLENBQUM7QUFDNUIsY0FBYyxhQUFhLENBQUM7QUFDNUIsY0FBYyxnQkFBZ0IsQ0FBQyJ9
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sequencer/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sequencer/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,uBAAuB,CAAC;AACtC,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC"}
|
package/dest/sequencer/index.js
CHANGED
|
@@ -25,7 +25,7 @@ export declare class SequencerMetrics {
|
|
|
25
25
|
private blockProposalPrecheckFailed;
|
|
26
26
|
private checkpointSuccess;
|
|
27
27
|
private slashingAttempts;
|
|
28
|
-
private
|
|
28
|
+
private checkpointAttestationDelay;
|
|
29
29
|
private fishermanWouldBeIncluded;
|
|
30
30
|
private fishermanTimeBeforeBlock;
|
|
31
31
|
private fishermanPendingBlobTxCount;
|
|
@@ -39,7 +39,7 @@ export declare class SequencerMetrics {
|
|
|
39
39
|
private lastSeenSlot?;
|
|
40
40
|
constructor(client: TelemetryClient, rollup: RollupContract, name?: string);
|
|
41
41
|
recordRequiredAttestations(requiredAttestationsCount: number, allowanceMs: number): void;
|
|
42
|
-
|
|
42
|
+
recordCheckpointAttestationDelay(duration: number): void;
|
|
43
43
|
recordCollectedAttestations(count: number, durationMs: number): void;
|
|
44
44
|
recordBuiltBlock(buildDurationMs: number, totalMana: number): void;
|
|
45
45
|
recordFailedBlock(): void;
|
|
@@ -57,4 +57,4 @@ export declare class SequencerMetrics {
|
|
|
57
57
|
*/
|
|
58
58
|
recordFishermanFeeAnalysis(analysis: L1FeeAnalysisResult): void;
|
|
59
59
|
}
|
|
60
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
60
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0cmljcy5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcXVlbmNlci9tZXRyaWNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN2RCxPQUFPLEtBQUssRUFBRSxjQUFjLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNoRSxPQUFPLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQzNFLE9BQU8sS0FBSyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ2xFLE9BQU8sRUFNTCxLQUFLLGVBQWUsRUFDcEIsS0FBSyxNQUFNLEVBRVosTUFBTSx5QkFBeUIsQ0FBQztBQUVqQyxPQUFPLEVBQUUsS0FBSyxHQUFHLEVBQWUsTUFBTSxNQUFNLENBQUM7QUFFN0MsT0FBTyxLQUFLLEVBQUUsY0FBYyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBR2pELHFCQUFhLGdCQUFnQjtJQTJDekIsT0FBTyxDQUFDLE1BQU07SUExQ2hCLFNBQWdCLE1BQU0sRUFBRSxNQUFNLENBQUM7SUFDL0IsT0FBTyxDQUFDLEtBQUssQ0FBUTtJQUVyQixPQUFPLENBQUMsWUFBWSxDQUFnQjtJQUNwQyxPQUFPLENBQUMsa0JBQWtCLENBQVk7SUFDdEMsT0FBTyxDQUFDLHVCQUF1QixDQUFRO0lBQ3ZDLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBWTtJQUdqRCxPQUFPLENBQUMseUJBQXlCLENBQVE7SUFDekMsT0FBTyxDQUFDLDhCQUE4QixDQUFRO0lBQzlDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBUTtJQUNsQyxPQUFPLENBQUMsbUJBQW1CLENBQVE7SUFFbkMsT0FBTyxDQUFDLE9BQU8sQ0FBUTtJQUV2QixPQUFPLENBQUMsS0FBSyxDQUFnQjtJQUM3QixPQUFPLENBQUMsV0FBVyxDQUFnQjtJQUVuQyxPQUFPLENBQUMsbUJBQW1CLENBQWdCO0lBQzNDLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBZ0I7SUFDNUMsT0FBTyxDQUFDLDJCQUEyQixDQUFnQjtJQUNuRCxPQUFPLENBQUMsaUJBQWlCLENBQWdCO0lBQ3pDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBZ0I7SUFDeEMsT0FBTyxDQUFDLDBCQUEwQixDQUFZO0lBRzlDLE9BQU8sQ0FBQyx3QkFBd0IsQ0FBZ0I7SUFDaEQsT0FBTyxDQUFDLHdCQUF3QixDQUFZO0lBQzVDLE9BQU8sQ0FBQywyQkFBMkIsQ0FBWTtJQUMvQyxPQUFPLENBQUMsNEJBQTRCLENBQVk7SUFDaEQsT0FBTyxDQUFDLDhCQUE4QixDQUFZO0lBQ2xELE9BQU8sQ0FBQyx5QkFBeUIsQ0FBWTtJQUM3QyxPQUFPLENBQUMsc0JBQXNCLENBQVk7SUFDMUMsT0FBTyxDQUFDLDZCQUE2QixDQUFZO0lBQ2pELE9BQU8sQ0FBQywrQkFBK0IsQ0FBWTtJQUNuRCxPQUFPLENBQUMsNkJBQTZCLENBQVk7SUFFakQsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFhO0lBRWxDLFlBQ0UsTUFBTSxFQUFFLGVBQWUsRUFDZixNQUFNLEVBQUUsY0FBYyxFQUM5QixJQUFJLFNBQWMsRUFtRm5CO0lBRU0sMEJBQTBCLENBQUMseUJBQXlCLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxNQUFNLFFBT3ZGO0lBRU0sZ0NBQWdDLENBQUMsUUFBUSxFQUFFLE1BQU0sUUFFdkQ7SUFFTSwyQkFBMkIsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLFFBR25FO0lBRUQsZ0JBQWdCLENBQUMsZUFBZSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxRQU0xRDtJQUVELGlCQUFpQixTQUloQjtJQUVELDZCQUE2QixDQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLGNBQWMsUUFJdEU7SUFFRCxXQUFXLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxRQVc3QztJQUVLLGFBQWEsQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxHQUFHLEdBQUcsVUFBVSxHQUFHLFNBQVMsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBaUIzRjtJQUVELHVCQUF1QixTQUV0QjtJQUVELHlCQUF5QixDQUFDLE1BQU0sQ0FBQyxFQUFFLE1BQU0sUUFJeEM7SUFFRCwwQkFBMEIsU0FFekI7SUFFRCxpQ0FBaUMsQ0FBQyxTQUFTLEVBQUUsTUFBTSxRQUlsRDtJQUVELHFCQUFxQixDQUFDLFdBQVcsRUFBRSxNQUFNLFFBRXhDO0lBRUQ7OztPQUdHO0lBQ0gsMEJBQTBCLENBQUMsUUFBUSxFQUFFLG1CQUFtQixRQXFGdkQ7Q0FDRiJ9
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../src/sequencer/metrics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAC3E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAML,KAAK,eAAe,EACpB,KAAK,MAAM,EAEZ,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAAE,KAAK,GAAG,EAAe,MAAM,MAAM,CAAC;AAE7C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAGjD,qBAAa,gBAAgB;IA2CzB,OAAO,CAAC,MAAM;IA1ChB,SAAgB,MAAM,EAAE,MAAM,CAAC;IAC/B,OAAO,CAAC,KAAK,CAAQ;IAErB,OAAO,CAAC,YAAY,CAAgB;IACpC,OAAO,CAAC,kBAAkB,CAAY;IACtC,OAAO,CAAC,uBAAuB,CAAQ;IACvC,OAAO,CAAC,6BAA6B,CAAY;IAGjD,OAAO,CAAC,yBAAyB,CAAQ;IACzC,OAAO,CAAC,8BAA8B,CAAQ;IAC9C,OAAO,CAAC,kBAAkB,CAAQ;IAClC,OAAO,CAAC,mBAAmB,CAAQ;IAEnC,OAAO,CAAC,OAAO,CAAQ;IAEvB,OAAO,CAAC,KAAK,CAAgB;IAC7B,OAAO,CAAC,WAAW,CAAgB;IAEnC,OAAO,CAAC,mBAAmB,CAAgB;IAC3C,OAAO,CAAC,oBAAoB,CAAgB;IAC5C,OAAO,CAAC,2BAA2B,CAAgB;IACnD,OAAO,CAAC,iBAAiB,CAAgB;IACzC,OAAO,CAAC,gBAAgB,CAAgB;IACxC,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../src/sequencer/metrics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAC3E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAML,KAAK,eAAe,EACpB,KAAK,MAAM,EAEZ,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAAE,KAAK,GAAG,EAAe,MAAM,MAAM,CAAC;AAE7C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAGjD,qBAAa,gBAAgB;IA2CzB,OAAO,CAAC,MAAM;IA1ChB,SAAgB,MAAM,EAAE,MAAM,CAAC;IAC/B,OAAO,CAAC,KAAK,CAAQ;IAErB,OAAO,CAAC,YAAY,CAAgB;IACpC,OAAO,CAAC,kBAAkB,CAAY;IACtC,OAAO,CAAC,uBAAuB,CAAQ;IACvC,OAAO,CAAC,6BAA6B,CAAY;IAGjD,OAAO,CAAC,yBAAyB,CAAQ;IACzC,OAAO,CAAC,8BAA8B,CAAQ;IAC9C,OAAO,CAAC,kBAAkB,CAAQ;IAClC,OAAO,CAAC,mBAAmB,CAAQ;IAEnC,OAAO,CAAC,OAAO,CAAQ;IAEvB,OAAO,CAAC,KAAK,CAAgB;IAC7B,OAAO,CAAC,WAAW,CAAgB;IAEnC,OAAO,CAAC,mBAAmB,CAAgB;IAC3C,OAAO,CAAC,oBAAoB,CAAgB;IAC5C,OAAO,CAAC,2BAA2B,CAAgB;IACnD,OAAO,CAAC,iBAAiB,CAAgB;IACzC,OAAO,CAAC,gBAAgB,CAAgB;IACxC,OAAO,CAAC,0BAA0B,CAAY;IAG9C,OAAO,CAAC,wBAAwB,CAAgB;IAChD,OAAO,CAAC,wBAAwB,CAAY;IAC5C,OAAO,CAAC,2BAA2B,CAAY;IAC/C,OAAO,CAAC,4BAA4B,CAAY;IAChD,OAAO,CAAC,8BAA8B,CAAY;IAClD,OAAO,CAAC,yBAAyB,CAAY;IAC7C,OAAO,CAAC,sBAAsB,CAAY;IAC1C,OAAO,CAAC,6BAA6B,CAAY;IACjD,OAAO,CAAC,+BAA+B,CAAY;IACnD,OAAO,CAAC,6BAA6B,CAAY;IAEjD,OAAO,CAAC,YAAY,CAAC,CAAa;IAElC,YACE,MAAM,EAAE,eAAe,EACf,MAAM,EAAE,cAAc,EAC9B,IAAI,SAAc,EAmFnB;IAEM,0BAA0B,CAAC,yBAAyB,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,QAOvF;IAEM,gCAAgC,CAAC,QAAQ,EAAE,MAAM,QAEvD;IAEM,2BAA2B,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,QAGnE;IAED,gBAAgB,CAAC,eAAe,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,QAM1D;IAED,iBAAiB,SAIhB;IAED,6BAA6B,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,QAItE;IAED,WAAW,CAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,QAW7C;IAEK,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,GAAG,UAAU,GAAG,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAiB3F;IAED,uBAAuB,SAEtB;IAED,yBAAyB,CAAC,MAAM,CAAC,EAAE,MAAM,QAIxC;IAED,0BAA0B,SAEzB;IAED,iCAAiC,CAAC,SAAS,EAAE,MAAM,QAIlD;IAED,qBAAqB,CAAC,WAAW,EAAE,MAAM,QAExC;IAED;;;OAGG;IACH,0BAA0B,CAAC,QAAQ,EAAE,mBAAmB,QAqFvD;CACF"}
|
|
@@ -22,7 +22,7 @@ export class SequencerMetrics {
|
|
|
22
22
|
blockProposalPrecheckFailed;
|
|
23
23
|
checkpointSuccess;
|
|
24
24
|
slashingAttempts;
|
|
25
|
-
|
|
25
|
+
checkpointAttestationDelay;
|
|
26
26
|
// Fisherman fee analysis metrics
|
|
27
27
|
fishermanWouldBeIncluded;
|
|
28
28
|
fishermanTimeBeforeBlock;
|
|
@@ -43,7 +43,7 @@ export class SequencerMetrics {
|
|
|
43
43
|
this.blockBuildDuration = this.meter.createHistogram(Metrics.SEQUENCER_BLOCK_BUILD_DURATION);
|
|
44
44
|
this.blockBuildManaPerSecond = this.meter.createGauge(Metrics.SEQUENCER_BLOCK_BUILD_MANA_PER_SECOND);
|
|
45
45
|
this.stateTransitionBufferDuration = this.meter.createHistogram(Metrics.SEQUENCER_STATE_TRANSITION_BUFFER_DURATION);
|
|
46
|
-
this.
|
|
46
|
+
this.checkpointAttestationDelay = this.meter.createHistogram(Metrics.SEQUENCER_CHECKPOINT_ATTESTATION_DELAY);
|
|
47
47
|
// Init gauges and counters
|
|
48
48
|
this.blockCounter.add(0, {
|
|
49
49
|
[Attributes.STATUS]: 'failed'
|
|
@@ -85,8 +85,8 @@ export class SequencerMetrics {
|
|
|
85
85
|
this.collectedAttestions.record(0);
|
|
86
86
|
this.timeToCollectAttestations.record(0);
|
|
87
87
|
}
|
|
88
|
-
|
|
89
|
-
this.
|
|
88
|
+
recordCheckpointAttestationDelay(duration) {
|
|
89
|
+
this.checkpointAttestationDelay.record(duration);
|
|
90
90
|
}
|
|
91
91
|
recordCollectedAttestations(count, durationMs) {
|
|
92
92
|
this.collectedAttestions.record(count);
|
|
@@ -1,22 +1,21 @@
|
|
|
1
1
|
import type { EpochCache } from '@aztec/epoch-cache';
|
|
2
2
|
import { type RollupContract } from '@aztec/ethereum/contracts';
|
|
3
|
-
import { BlockNumber, CheckpointNumber, SlotNumber } from '@aztec/foundation/branded-types';
|
|
3
|
+
import { BlockNumber, CheckpointNumber, EpochNumber, SlotNumber } from '@aztec/foundation/branded-types';
|
|
4
4
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
5
5
|
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
6
6
|
import type { DateProvider } from '@aztec/foundation/timer';
|
|
7
7
|
import type { TypedEventEmitter } from '@aztec/foundation/types';
|
|
8
8
|
import type { P2P } from '@aztec/p2p';
|
|
9
9
|
import type { SlasherClientInterface } from '@aztec/slasher';
|
|
10
|
-
import type { L2BlockNew, L2BlockSource,
|
|
10
|
+
import type { L2BlockNew, L2BlockSink, L2BlockSource, ValidateCheckpointResult } from '@aztec/stdlib/block';
|
|
11
11
|
import type { Checkpoint } from '@aztec/stdlib/checkpoint';
|
|
12
12
|
import { type ResolvedSequencerConfig, type SequencerConfig, type WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server';
|
|
13
13
|
import type { L1ToL2MessageSource } from '@aztec/stdlib/messaging';
|
|
14
14
|
import { type TelemetryClient, type Tracer } from '@aztec/telemetry-client';
|
|
15
|
-
import type
|
|
15
|
+
import { FullNodeCheckpointsBuilder, type ValidatorClient } from '@aztec/validator-client';
|
|
16
16
|
import type { GlobalVariableBuilder } from '../global_variable_builder/global_builder.js';
|
|
17
17
|
import type { SequencerPublisherFactory } from '../publisher/sequencer-publisher-factory.js';
|
|
18
|
-
import type {
|
|
19
|
-
import { FullNodeCheckpointsBuilder } from './checkpoint_builder.js';
|
|
18
|
+
import type { InvalidateCheckpointRequest, SequencerPublisher } from '../publisher/sequencer-publisher.js';
|
|
20
19
|
import { CheckpointProposalJob } from './checkpoint_proposal_job.js';
|
|
21
20
|
import type { SequencerEvents } from './events.js';
|
|
22
21
|
import { SequencerTimetable } from './timetable.js';
|
|
@@ -39,7 +38,7 @@ export declare class Sequencer extends Sequencer_base {
|
|
|
39
38
|
protected p2pClient: P2P;
|
|
40
39
|
protected worldState: WorldStateSynchronizer;
|
|
41
40
|
protected slasherClient: SlasherClientInterface | undefined;
|
|
42
|
-
protected l2BlockSource: L2BlockSource;
|
|
41
|
+
protected l2BlockSource: L2BlockSource & L2BlockSink;
|
|
43
42
|
protected l1ToL2MessageSource: L1ToL2MessageSource;
|
|
44
43
|
protected checkpointsBuilder: FullNodeCheckpointsBuilder;
|
|
45
44
|
protected l1Constants: SequencerRollupConstants;
|
|
@@ -64,7 +63,7 @@ export declare class Sequencer extends Sequencer_base {
|
|
|
64
63
|
protected publisher: SequencerPublisher | undefined;
|
|
65
64
|
/** Config for the sequencer */
|
|
66
65
|
protected config: ResolvedSequencerConfig;
|
|
67
|
-
constructor(publisherFactory: SequencerPublisherFactory, validatorClient: ValidatorClient, globalsBuilder: GlobalVariableBuilder, p2pClient: P2P, worldState: WorldStateSynchronizer, slasherClient: SlasherClientInterface | undefined, l2BlockSource: L2BlockSource, l1ToL2MessageSource: L1ToL2MessageSource, checkpointsBuilder: FullNodeCheckpointsBuilder, l1Constants: SequencerRollupConstants, dateProvider: DateProvider, epochCache: EpochCache, rollupContract: RollupContract, config: SequencerConfig, telemetry?: TelemetryClient, log?: import("@aztec/foundation/log").Logger);
|
|
66
|
+
constructor(publisherFactory: SequencerPublisherFactory, validatorClient: ValidatorClient, globalsBuilder: GlobalVariableBuilder, p2pClient: P2P, worldState: WorldStateSynchronizer, slasherClient: SlasherClientInterface | undefined, l2BlockSource: L2BlockSource & L2BlockSink, l1ToL2MessageSource: L1ToL2MessageSource, checkpointsBuilder: FullNodeCheckpointsBuilder, l1Constants: SequencerRollupConstants, dateProvider: DateProvider, epochCache: EpochCache, rollupContract: RollupContract, config: SequencerConfig, telemetry?: TelemetryClient, log?: import("@aztec/foundation/log").Logger);
|
|
68
67
|
/** Updates sequencer config by the defined values and updates the timetable */
|
|
69
68
|
updateConfig(config: Partial<SequencerConfig>): void;
|
|
70
69
|
/** Initializes the sequencer (precomputes tables and creates a publisher). Takes about 3s. */
|
|
@@ -89,7 +88,7 @@ export declare class Sequencer extends Sequencer_base {
|
|
|
89
88
|
*/
|
|
90
89
|
protected work(): Promise<Checkpoint | undefined>;
|
|
91
90
|
private prepareCheckpointProposal;
|
|
92
|
-
protected createCheckpointProposalJob(slot: SlotNumber, checkpointNumber: CheckpointNumber, syncedToBlockNumber: BlockNumber, proposer: EthAddress | undefined, publisher: SequencerPublisher, attestorAddress: EthAddress,
|
|
91
|
+
protected createCheckpointProposalJob(epoch: EpochNumber, slot: SlotNumber, checkpointNumber: CheckpointNumber, syncedToBlockNumber: BlockNumber, proposer: EthAddress | undefined, publisher: SequencerPublisher, attestorAddress: EthAddress, invalidateCheckpoint: InvalidateCheckpointRequest | undefined): CheckpointProposalJob;
|
|
93
92
|
/**
|
|
94
93
|
* Internal helper for setting the sequencer state and checks if we have enough time left in the slot to transition to the new state.
|
|
95
94
|
* @param proposedState - The new state to transition to.
|
|
@@ -121,12 +120,12 @@ export declare class Sequencer extends Sequencer_base {
|
|
|
121
120
|
ts: bigint;
|
|
122
121
|
}): Promise<void>;
|
|
123
122
|
/**
|
|
124
|
-
* Considers invalidating a
|
|
123
|
+
* Considers invalidating a checkpoint if the pending chain is invalid. Depends on how long the invalid checkpoint
|
|
125
124
|
* has been there without being invalidated and whether the sequencer is in the committee or not. We always
|
|
126
125
|
* have the proposer try to invalidate, but if they fail, the sequencers in the committee are expected to try,
|
|
127
126
|
* and if they fail, any sequencer will try as well.
|
|
128
127
|
*/
|
|
129
|
-
protected
|
|
128
|
+
protected considerInvalidatingCheckpoint(syncedTo: SequencerSyncCheckResult, currentSlot: SlotNumber): Promise<void>;
|
|
130
129
|
private logStrategyComparison;
|
|
131
130
|
private getSlotStartBuildTimestamp;
|
|
132
131
|
private getSecondsIntoSlot;
|
|
@@ -165,14 +164,16 @@ export declare class Sequencer extends Sequencer_base {
|
|
|
165
164
|
shuffleAttestationOrdering: boolean;
|
|
166
165
|
blockDurationMs?: number | undefined;
|
|
167
166
|
buildCheckpointIfEmpty: boolean;
|
|
167
|
+
skipPushProposedBlocksToArchiver: boolean;
|
|
168
168
|
};
|
|
169
169
|
private get l1PublishingTime();
|
|
170
170
|
}
|
|
171
171
|
type SequencerSyncCheckResult = {
|
|
172
172
|
block?: L2BlockNew;
|
|
173
|
+
checkpointNumber: CheckpointNumber;
|
|
173
174
|
blockNumber: BlockNumber;
|
|
174
175
|
archive: Fr;
|
|
175
176
|
l1Timestamp: bigint;
|
|
176
|
-
pendingChainValidationStatus:
|
|
177
|
+
pendingChainValidationStatus: ValidateCheckpointResult;
|
|
177
178
|
};
|
|
178
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
179
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VxdWVuY2VyLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VxdWVuY2VyL3NlcXVlbmNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEtBQUssRUFBRSxVQUFVLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNyRCxPQUFPLEVBQW9CLEtBQUssY0FBYyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDbEYsT0FBTyxFQUFFLFdBQVcsRUFBRSxnQkFBZ0IsRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFFekcsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3BELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUczRCxPQUFPLEtBQUssRUFBRSxZQUFZLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUM1RCxPQUFPLEtBQUssRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ2pFLE9BQU8sS0FBSyxFQUFFLEdBQUcsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUN0QyxPQUFPLEtBQUssRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdELE9BQU8sS0FBSyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsYUFBYSxFQUFFLHdCQUF3QixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDNUcsT0FBTyxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFM0QsT0FBTyxFQUNMLEtBQUssdUJBQXVCLEVBQzVCLEtBQUssZUFBZSxFQUVwQixLQUFLLHNCQUFzQixFQUM1QixNQUFNLGlDQUFpQyxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxFQUFFLG1CQUFtQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFHbkUsT0FBTyxFQUFjLEtBQUssZUFBZSxFQUFFLEtBQUssTUFBTSxFQUFpQyxNQUFNLHlCQUF5QixDQUFD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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sequencer.d.ts","sourceRoot":"","sources":["../../src/sequencer/sequencer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAoB,KAAK,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAClF,OAAO,EAAE,WAAW,EAAE,gBAAgB,
|
|
1
|
+
{"version":3,"file":"sequencer.d.ts","sourceRoot":"","sources":["../../src/sequencer/sequencer.ts"],"names":[],"mappings":"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"}
|