@aztec/sequencer-client 0.70.0 → 0.71.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dest/client/sequencer-client.js +2 -2
- package/dest/config.js +2 -2
- package/dest/publisher/l1-publisher.d.ts.map +1 -1
- package/dest/publisher/l1-publisher.js +3 -3
- package/dest/sequencer/sequencer.d.ts +19 -21
- package/dest/sequencer/sequencer.d.ts.map +1 -1
- package/dest/sequencer/sequencer.js +32 -109
- package/dest/sequencer/timetable.d.ts +38 -0
- package/dest/sequencer/timetable.d.ts.map +1 -0
- package/dest/sequencer/timetable.js +96 -0
- package/dest/slasher/factory.d.ts.map +1 -1
- package/dest/slasher/factory.js +3 -3
- package/dest/slasher/slasher_client.d.ts.map +1 -1
- package/dest/slasher/slasher_client.js +3 -4
- package/dest/test/index.d.ts +2 -3
- package/dest/test/index.d.ts.map +1 -1
- package/dest/test/index.js +1 -1
- package/package.json +20 -20
- package/src/client/sequencer-client.ts +1 -1
- package/src/config.ts +1 -1
- package/src/publisher/l1-publisher.ts +2 -3
- package/src/sequencer/sequencer.ts +45 -140
- package/src/sequencer/timetable.ts +123 -0
- package/src/slasher/factory.ts +2 -3
- package/src/slasher/slasher_client.ts +2 -3
- package/src/test/index.ts +2 -3
|
@@ -4,8 +4,7 @@ import { createEthereumChain } from '@aztec/ethereum';
|
|
|
4
4
|
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
5
5
|
import { createLogger } from '@aztec/foundation/log';
|
|
6
6
|
import { SlashFactoryAbi } from '@aztec/l1-artifacts';
|
|
7
|
-
import { WithTracer } from '@aztec/telemetry-client';
|
|
8
|
-
import { NoopTelemetryClient } from '@aztec/telemetry-client/noop';
|
|
7
|
+
import { WithTracer, getTelemetryClient } from '@aztec/telemetry-client';
|
|
9
8
|
import { createPublicClient, getAddress, getContract, http, } from 'viem';
|
|
10
9
|
/**
|
|
11
10
|
* Enum defining the possible states of the Slasher client.
|
|
@@ -43,7 +42,7 @@ export var SlasherClientState;
|
|
|
43
42
|
* slashing only the first, because the "lifetime" of the second would have passed after that vote
|
|
44
43
|
*/
|
|
45
44
|
export class SlasherClient extends WithTracer {
|
|
46
|
-
constructor(config, store, l2BlockSource, telemetry =
|
|
45
|
+
constructor(config, store, l2BlockSource, telemetry = getTelemetryClient(), log = createLogger('slasher')) {
|
|
47
46
|
super(telemetry, 'slasher');
|
|
48
47
|
this.config = config;
|
|
49
48
|
this.store = store;
|
|
@@ -302,4 +301,4 @@ export class SlasherClient extends WithTracer {
|
|
|
302
301
|
this.log.debug(`Moved to state ${SlasherClientState[this.currentState]}`);
|
|
303
302
|
}
|
|
304
303
|
}
|
|
305
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xhc2hlcl9jbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2xhc2hlci9zbGFzaGVyX2NsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBSUwsYUFBYSxHQUdkLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDcEUsT0FBTyxFQUErQyxtQkFBbUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ25HLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUMzRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFckQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBd0IsVUFBVSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDM0UsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFFbkUsT0FBTyxFQUtMLGtCQUFrQixFQUNsQixVQUFVLEVBQ1YsV0FBVyxFQUNYLElBQUksR0FDTCxNQUFNLE1BQU0sQ0FBQztBQUVkOztHQUVHO0FBQ0gsTUFBTSxDQUFOLElBQVksa0JBS1g7QUFMRCxXQUFZLGtCQUFrQjtJQUM1QiwyREFBSSxDQUFBO0lBQ0osbUVBQVEsQ0FBQTtJQUNSLGlFQUFPLENBQUE7SUFDUCxpRUFBTyxDQUFBO0FBQ1QsQ0FBQyxFQUxXLGtCQUFrQixLQUFsQixrQkFBa0IsUUFLN0I7QUEyQkQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXdCRztBQUNILE1BQU0sT0FBTyxhQUFjLFNBQVEsVUFBVTtJQXVCM0MsWUFDVSxNQUEwRCxFQUMxRCxLQUFtQixFQUNuQixhQUE0QixFQUNwQyxZQUE2QixJQUFJLG1CQUFtQixFQUFFLEVBQzlDLE1BQU0sWUFBWSxDQUFDLFNBQVMsQ0FBQztRQUVyQyxLQUFLLENBQUMsU0FB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
|
|
304
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xhc2hlcl9jbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2xhc2hlci9zbGFzaGVyX2NsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBSUwsYUFBYSxHQUdkLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDcEUsT0FBTyxFQUErQyxtQkFBbUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ25HLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUMzRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFckQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBd0IsVUFBVSxFQUFFLGtCQUFrQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFL0YsT0FBTyxFQUtMLGtCQUFrQixFQUNsQixVQUFVLEVBQ1YsV0FBVyxFQUNYLElBQUksR0FDTCxNQUFNLE1BQU0sQ0FBQztBQUVkOztHQUVHO0FBQ0gsTUFBTSxDQUFOLElBQVksa0JBS1g7QUFMRCxXQUFZLGtCQUFrQjtJQUM1QiwyREFBSSxDQUFBO0lBQ0osbUVBQVEsQ0FBQTtJQUNSLGlFQUFPLENBQUE7SUFDUCxpRUFBTyxDQUFBO0FBQ1QsQ0FBQyxFQUxXLGtCQUFrQixLQUFsQixrQkFBa0IsUUFLN0I7QUEyQkQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXdCRztBQUNILE1BQU0sT0FBTyxhQUFjLFNBQVEsVUFBVTtJQXVCM0MsWUFDVSxNQUEwRCxFQUMxRCxLQUFtQixFQUNuQixhQUE0QixFQUNwQyxZQUE2QixrQkFBa0IsRUFBRSxFQUN6QyxNQUFNLFlBQVksQ0FBQyxTQUFTLENBQUM7UUFFckMsS0FBSyxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQztRQU5wQixXQUFNLEdBQU4s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
|
package/dest/test/index.d.ts
CHANGED
|
@@ -2,11 +2,10 @@ import { type PublicProcessorFactory } from '@aztec/simulator/server';
|
|
|
2
2
|
import { SequencerClient } from '../client/sequencer-client.js';
|
|
3
3
|
import { type L1Publisher } from '../publisher/l1-publisher.js';
|
|
4
4
|
import { Sequencer } from '../sequencer/sequencer.js';
|
|
5
|
-
import { type
|
|
5
|
+
import { type SequencerTimetable } from '../sequencer/timetable.js';
|
|
6
6
|
declare class TestSequencer_ extends Sequencer {
|
|
7
7
|
publicProcessorFactory: PublicProcessorFactory;
|
|
8
|
-
|
|
9
|
-
processTxTime: number;
|
|
8
|
+
timetable: SequencerTimetable;
|
|
10
9
|
publisher: L1Publisher;
|
|
11
10
|
}
|
|
12
11
|
export type TestSequencer = TestSequencer_;
|
package/dest/test/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/test/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAEtE,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,KAAK,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/test/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAEtE,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAEpE,cAAM,cAAe,SAAQ,SAAS;IACpB,sBAAsB,EAAG,sBAAsB,CAAC;IAChD,SAAS,EAAG,kBAAkB,CAAC;IAC/B,SAAS,EAAG,WAAW,CAAC;CACzC;AAED,MAAM,MAAM,aAAa,GAAG,cAAc,CAAC;AAE3C,cAAM,oBAAqB,SAAQ,eAAe;IAChC,SAAS,EAAG,aAAa,CAAC;CAC3C;AAED,MAAM,MAAM,mBAAmB,GAAG,oBAAoB,CAAC;AAEvD,cAAc,wBAAwB,CAAC"}
|
package/dest/test/index.js
CHANGED
|
@@ -5,4 +5,4 @@ class TestSequencer_ extends Sequencer {
|
|
|
5
5
|
class TestSequencerClient_ extends SequencerClient {
|
|
6
6
|
}
|
|
7
7
|
export * from './test-l1-publisher.js';
|
|
8
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVzdC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFaEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBR3RELE1BQU0sY0FBZSxTQUFRLFNBQVM7Q0FJckM7QUFJRCxNQUFNLG9CQUFxQixTQUFRLGVBQWU7Q0FFakQ7QUFJRCxjQUFjLHdCQUF3QixDQUFDIn0=
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/sequencer-client",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.71.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": "./dest/index.js",
|
|
@@ -28,25 +28,25 @@
|
|
|
28
28
|
"test:integration:run": "NODE_NO_WARNINGS=1 node --experimental-vm-modules $(yarn bin jest) --no-cache --config jest.integration.config.json"
|
|
29
29
|
},
|
|
30
30
|
"dependencies": {
|
|
31
|
-
"@aztec/aztec.js": "0.
|
|
32
|
-
"@aztec/bb-prover": "0.
|
|
33
|
-
"@aztec/blob-sink": "0.
|
|
34
|
-
"@aztec/circuit-types": "0.
|
|
35
|
-
"@aztec/circuits.js": "0.
|
|
36
|
-
"@aztec/ethereum": "0.
|
|
37
|
-
"@aztec/foundation": "0.
|
|
38
|
-
"@aztec/l1-artifacts": "0.
|
|
39
|
-
"@aztec/merkle-tree": "0.
|
|
40
|
-
"@aztec/noir-contracts.js": "0.
|
|
41
|
-
"@aztec/noir-protocol-circuits-types": "0.
|
|
42
|
-
"@aztec/p2p": "0.
|
|
43
|
-
"@aztec/protocol-contracts": "0.
|
|
44
|
-
"@aztec/prover-client": "0.
|
|
45
|
-
"@aztec/simulator": "0.
|
|
46
|
-
"@aztec/telemetry-client": "0.
|
|
47
|
-
"@aztec/types": "0.
|
|
48
|
-
"@aztec/validator-client": "0.
|
|
49
|
-
"@aztec/world-state": "0.
|
|
31
|
+
"@aztec/aztec.js": "0.71.0",
|
|
32
|
+
"@aztec/bb-prover": "0.71.0",
|
|
33
|
+
"@aztec/blob-sink": "0.71.0",
|
|
34
|
+
"@aztec/circuit-types": "0.71.0",
|
|
35
|
+
"@aztec/circuits.js": "0.71.0",
|
|
36
|
+
"@aztec/ethereum": "0.71.0",
|
|
37
|
+
"@aztec/foundation": "0.71.0",
|
|
38
|
+
"@aztec/l1-artifacts": "0.71.0",
|
|
39
|
+
"@aztec/merkle-tree": "0.71.0",
|
|
40
|
+
"@aztec/noir-contracts.js": "0.71.0",
|
|
41
|
+
"@aztec/noir-protocol-circuits-types": "0.71.0",
|
|
42
|
+
"@aztec/p2p": "0.71.0",
|
|
43
|
+
"@aztec/protocol-contracts": "0.71.0",
|
|
44
|
+
"@aztec/prover-client": "0.71.0",
|
|
45
|
+
"@aztec/simulator": "0.71.0",
|
|
46
|
+
"@aztec/telemetry-client": "0.71.0",
|
|
47
|
+
"@aztec/types": "0.71.0",
|
|
48
|
+
"@aztec/validator-client": "0.71.0",
|
|
49
|
+
"@aztec/world-state": "0.71.0",
|
|
50
50
|
"@noir-lang/acvm_js": "portal:../../noir/packages/acvm_js",
|
|
51
51
|
"@noir-lang/types": "portal:../../noir/packages/types",
|
|
52
52
|
"lodash.chunk": "^4.2.0",
|
|
@@ -104,8 +104,8 @@ export class SequencerClient {
|
|
|
104
104
|
contractDataSource,
|
|
105
105
|
l1Constants,
|
|
106
106
|
deps.dateProvider,
|
|
107
|
-
telemetryClient,
|
|
108
107
|
{ ...config, maxL1TxInclusionTimeIntoSlot },
|
|
108
|
+
telemetryClient,
|
|
109
109
|
);
|
|
110
110
|
await validatorClient?.start();
|
|
111
111
|
await sequencer.start();
|
package/src/config.ts
CHANGED
|
@@ -47,7 +47,7 @@ export const sequencerConfigMappings: ConfigMappingsType<SequencerConfig> = {
|
|
|
47
47
|
transactionPollingIntervalMS: {
|
|
48
48
|
env: 'SEQ_TX_POLLING_INTERVAL_MS',
|
|
49
49
|
description: 'The number of ms to wait between polling for pending txs.',
|
|
50
|
-
...numberConfigHelper(
|
|
50
|
+
...numberConfigHelper(500),
|
|
51
51
|
},
|
|
52
52
|
maxTxsPerBlock: {
|
|
53
53
|
env: 'SEQ_MAX_TX_PER_BLOCK',
|
|
@@ -36,8 +36,7 @@ import { type Tuple, serializeToBuffer } from '@aztec/foundation/serialize';
|
|
|
36
36
|
import { InterruptibleSleep } from '@aztec/foundation/sleep';
|
|
37
37
|
import { Timer } from '@aztec/foundation/timer';
|
|
38
38
|
import { EmpireBaseAbi, RollupAbi, SlasherAbi } from '@aztec/l1-artifacts';
|
|
39
|
-
import { type TelemetryClient } from '@aztec/telemetry-client';
|
|
40
|
-
import { NoopTelemetryClient } from '@aztec/telemetry-client/noop';
|
|
39
|
+
import { type TelemetryClient, getTelemetryClient } from '@aztec/telemetry-client';
|
|
41
40
|
|
|
42
41
|
import pick from 'lodash.pick';
|
|
43
42
|
import {
|
|
@@ -209,7 +208,7 @@ export class L1Publisher {
|
|
|
209
208
|
this.sleepTimeMs = config?.l1PublishRetryIntervalMS ?? 60_000;
|
|
210
209
|
this.ethereumSlotDuration = BigInt(config.ethereumSlotDuration);
|
|
211
210
|
|
|
212
|
-
const telemetry = deps.telemetry ??
|
|
211
|
+
const telemetry = deps.telemetry ?? getTelemetryClient();
|
|
213
212
|
this.blobSinkClient = deps.blobSinkClient ?? createBlobSinkClient(config.blobSinkUrl);
|
|
214
213
|
|
|
215
214
|
this.metrics = new L1PublisherMetrics(telemetry, 'L1Publisher');
|
|
@@ -33,11 +33,9 @@ import { type DateProvider, Timer, elapsed } from '@aztec/foundation/timer';
|
|
|
33
33
|
import { type P2P } from '@aztec/p2p';
|
|
34
34
|
import { type BlockBuilderFactory } from '@aztec/prover-client/block-builder';
|
|
35
35
|
import { type PublicProcessorFactory } from '@aztec/simulator/server';
|
|
36
|
-
import { Attributes, type TelemetryClient, type Tracer, trackSpan } from '@aztec/telemetry-client';
|
|
36
|
+
import { Attributes, type TelemetryClient, type Tracer, getTelemetryClient, trackSpan } from '@aztec/telemetry-client';
|
|
37
37
|
import { type ValidatorClient } from '@aztec/validator-client';
|
|
38
38
|
|
|
39
|
-
import assert from 'assert';
|
|
40
|
-
|
|
41
39
|
import { type GlobalVariableBuilder } from '../global_variable_builder/global_builder.js';
|
|
42
40
|
import { type L1Publisher, VoteType } from '../publisher/l1-publisher.js';
|
|
43
41
|
import { type SlasherClient } from '../slasher/slasher_client.js';
|
|
@@ -45,24 +43,11 @@ import { createValidatorsForBlockBuilding } from '../tx_validator/tx_validator_f
|
|
|
45
43
|
import { getDefaultAllowedSetupFunctions } from './allowed.js';
|
|
46
44
|
import { type SequencerConfig } from './config.js';
|
|
47
45
|
import { SequencerMetrics } from './metrics.js';
|
|
46
|
+
import { SequencerTimetable, SequencerTooSlowError } from './timetable.js';
|
|
48
47
|
import { SequencerState, orderAttestations } from './utils.js';
|
|
49
48
|
|
|
50
49
|
export { SequencerState };
|
|
51
50
|
|
|
52
|
-
export class SequencerTooSlowError extends Error {
|
|
53
|
-
constructor(
|
|
54
|
-
public readonly currentState: SequencerState,
|
|
55
|
-
public readonly proposedState: SequencerState,
|
|
56
|
-
public readonly maxAllowedTime: number,
|
|
57
|
-
public readonly currentTime: number,
|
|
58
|
-
) {
|
|
59
|
-
super(
|
|
60
|
-
`Too far into slot to transition to ${proposedState} (max allowed: ${maxAllowedTime}s, time into slot: ${currentTime}s)`,
|
|
61
|
-
);
|
|
62
|
-
this.name = 'SequencerTooSlowError';
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
|
|
66
51
|
type SequencerRollupConstants = Pick<L1RollupConstants, 'ethereumSlotDuration' | 'l1GenesisTime' | 'slotDuration'>;
|
|
67
52
|
|
|
68
53
|
/**
|
|
@@ -78,7 +63,7 @@ export class Sequencer {
|
|
|
78
63
|
private runningPromise?: RunningPromise;
|
|
79
64
|
private pollingIntervalMs: number = 1000;
|
|
80
65
|
private maxTxsPerBlock = 32;
|
|
81
|
-
private
|
|
66
|
+
private minTxsPerBlock = 1;
|
|
82
67
|
private maxL1TxInclusionTimeIntoSlot = 0;
|
|
83
68
|
// TODO: zero values should not be allowed for the following 2 values in PROD
|
|
84
69
|
private _coinbase = EthAddress.ZERO;
|
|
@@ -86,17 +71,13 @@ export class Sequencer {
|
|
|
86
71
|
private state = SequencerState.STOPPED;
|
|
87
72
|
private allowedInSetup: AllowedElement[] = getDefaultAllowedSetupFunctions();
|
|
88
73
|
private maxBlockSizeInBytes: number = 1024 * 1024;
|
|
89
|
-
private maxBlockGas: Gas = new Gas(
|
|
90
|
-
protected processTxTime: number = 12;
|
|
91
|
-
private attestationPropagationTime: number = 2;
|
|
74
|
+
private maxBlockGas: Gas = new Gas(100e9, 100e9);
|
|
92
75
|
private metrics: SequencerMetrics;
|
|
93
76
|
private isFlushing: boolean = false;
|
|
94
77
|
|
|
95
|
-
/**
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
*/
|
|
99
|
-
protected timeTable!: Record<SequencerState, number>;
|
|
78
|
+
/** The maximum number of seconds that the sequencer can be into a slot to transition to a particular state. */
|
|
79
|
+
protected timetable!: SequencerTimetable;
|
|
80
|
+
|
|
100
81
|
protected enforceTimeTable: boolean = false;
|
|
101
82
|
|
|
102
83
|
constructor(
|
|
@@ -113,8 +94,8 @@ export class Sequencer {
|
|
|
113
94
|
protected contractDataSource: ContractDataSource,
|
|
114
95
|
protected l1Constants: SequencerRollupConstants,
|
|
115
96
|
protected dateProvider: DateProvider,
|
|
116
|
-
telemetry: TelemetryClient,
|
|
117
97
|
protected config: SequencerConfig = {},
|
|
98
|
+
telemetry: TelemetryClient = getTelemetryClient(),
|
|
118
99
|
protected log = createLogger('sequencer'),
|
|
119
100
|
) {
|
|
120
101
|
this.updateConfig(config);
|
|
@@ -145,7 +126,7 @@ export class Sequencer {
|
|
|
145
126
|
this.maxTxsPerBlock = config.maxTxsPerBlock;
|
|
146
127
|
}
|
|
147
128
|
if (config.minTxsPerBlock !== undefined) {
|
|
148
|
-
this.
|
|
129
|
+
this.minTxsPerBlock = config.minTxsPerBlock;
|
|
149
130
|
}
|
|
150
131
|
if (config.maxDABlockGas !== undefined) {
|
|
151
132
|
this.maxBlockGas = new Gas(config.maxDABlockGas, this.maxBlockGas.l2Gas);
|
|
@@ -182,78 +163,15 @@ export class Sequencer {
|
|
|
182
163
|
}
|
|
183
164
|
|
|
184
165
|
private setTimeTable() {
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
const attestationPropagationTime = 2;
|
|
193
|
-
this.attestationPropagationTime = attestationPropagationTime;
|
|
194
|
-
|
|
195
|
-
// How long it takes to get a published block into L1. L1 builders typically accept txs up to 4 seconds into their slot,
|
|
196
|
-
// but we'll timeout sooner to give it more time to propagate (remember we also have blobs!). Still, when working in anvil,
|
|
197
|
-
// we can just post in the very last second of the L1 slot and still expect the tx to be accepted.
|
|
198
|
-
const l1PublishingTime = this.l1Constants.ethereumSlotDuration - this.maxL1TxInclusionTimeIntoSlot;
|
|
199
|
-
|
|
200
|
-
// How much time we spend validating and processing a block after building it,
|
|
201
|
-
// and assembling the proposal to send to attestors
|
|
202
|
-
const blockValidationTime = 1;
|
|
203
|
-
|
|
204
|
-
// How much time we have left in the slot for actually processing txs and building the block.
|
|
205
|
-
const remainingTimeInSlot =
|
|
206
|
-
this.aztecSlotDuration -
|
|
207
|
-
initialTime -
|
|
208
|
-
blockPrepareTime -
|
|
209
|
-
blockValidationTime -
|
|
210
|
-
2 * attestationPropagationTime -
|
|
211
|
-
l1PublishingTime;
|
|
212
|
-
|
|
213
|
-
// Check that we actually have time left for processing txs
|
|
214
|
-
if (this.enforceTimeTable && remainingTimeInSlot < 0) {
|
|
215
|
-
throw new Error(`Not enough time for block building in ${this.aztecSlotDuration}s slot`);
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
// How much time we have for actually processing txs. Note that we need both the sequencer and the validators to execute txs.
|
|
219
|
-
const processTxsTime = remainingTimeInSlot / 2;
|
|
220
|
-
this.processTxTime = processTxsTime;
|
|
221
|
-
|
|
222
|
-
// Sanity check
|
|
223
|
-
const totalSlotTime =
|
|
224
|
-
initialTime + // Archiver, world-state, and p2p sync
|
|
225
|
-
blockPrepareTime + // Setup globals, initial checks, etc
|
|
226
|
-
processTxsTime + // Processing public txs for building the block
|
|
227
|
-
blockValidationTime + // Validating the block produced
|
|
228
|
-
attestationPropagationTime + // Propagating the block proposal to validators
|
|
229
|
-
processTxsTime + // Validators run public txs before signing
|
|
230
|
-
attestationPropagationTime + // Attestations fly back to the proposer
|
|
231
|
-
l1PublishingTime; // The publish tx sits on the L1 mempool waiting to be picked up
|
|
232
|
-
|
|
233
|
-
assert(
|
|
234
|
-
totalSlotTime === this.aztecSlotDuration,
|
|
235
|
-
`Computed total slot time does not match slot duration: ${totalSlotTime}s`,
|
|
166
|
+
this.timetable = new SequencerTimetable(
|
|
167
|
+
this.l1Constants.ethereumSlotDuration,
|
|
168
|
+
this.aztecSlotDuration,
|
|
169
|
+
this.maxL1TxInclusionTimeIntoSlot,
|
|
170
|
+
this.enforceTimeTable,
|
|
171
|
+
this.metrics,
|
|
172
|
+
this.log,
|
|
236
173
|
);
|
|
237
|
-
|
|
238
|
-
const newTimeTable: Record<SequencerState, number> = {
|
|
239
|
-
// No checks needed for any of these transitions
|
|
240
|
-
[SequencerState.STOPPED]: this.aztecSlotDuration,
|
|
241
|
-
[SequencerState.IDLE]: this.aztecSlotDuration,
|
|
242
|
-
[SequencerState.SYNCHRONIZING]: this.aztecSlotDuration,
|
|
243
|
-
// We always want to allow the full slot to check if we are the proposer
|
|
244
|
-
[SequencerState.PROPOSER_CHECK]: this.aztecSlotDuration,
|
|
245
|
-
// How late we can start initializing a new block proposal
|
|
246
|
-
[SequencerState.INITIALIZING_PROPOSAL]: initialTime,
|
|
247
|
-
// When we start building a block
|
|
248
|
-
[SequencerState.CREATING_BLOCK]: initialTime + blockPrepareTime,
|
|
249
|
-
// We start collecting attestations after building the block
|
|
250
|
-
[SequencerState.COLLECTING_ATTESTATIONS]: initialTime + blockPrepareTime + processTxsTime + blockValidationTime,
|
|
251
|
-
// We publish the block after collecting attestations
|
|
252
|
-
[SequencerState.PUBLISHING_BLOCK]: this.aztecSlotDuration - l1PublishingTime,
|
|
253
|
-
};
|
|
254
|
-
|
|
255
|
-
this.log.verbose(`Sequencer time table updated with ${processTxsTime}s for processing txs`, newTimeTable);
|
|
256
|
-
this.timeTable = newTimeTable;
|
|
174
|
+
this.log.verbose(`Sequencer timetable updated`, { enforceTimeTable: this.enforceTimeTable });
|
|
257
175
|
}
|
|
258
176
|
|
|
259
177
|
/**
|
|
@@ -349,8 +267,8 @@ export class Sequencer {
|
|
|
349
267
|
|
|
350
268
|
// Check the pool has enough txs to build a block
|
|
351
269
|
const pendingTxCount = this.p2pClient.getPendingTxCount();
|
|
352
|
-
if (pendingTxCount < this.
|
|
353
|
-
this.log.verbose(`Not enough txs to propose block. Got ${pendingTxCount} min ${this.
|
|
270
|
+
if (pendingTxCount < this.minTxsPerBlock && !this.isFlushing) {
|
|
271
|
+
this.log.verbose(`Not enough txs to propose block. Got ${pendingTxCount} min ${this.minTxsPerBlock}.`, {
|
|
354
272
|
slot,
|
|
355
273
|
blockNumber: newBlockNumber,
|
|
356
274
|
});
|
|
@@ -427,29 +345,6 @@ export class Sequencer {
|
|
|
427
345
|
}
|
|
428
346
|
}
|
|
429
347
|
|
|
430
|
-
doIHaveEnoughTimeLeft(proposedState: SequencerState, secondsIntoSlot: number): boolean {
|
|
431
|
-
if (!this.enforceTimeTable) {
|
|
432
|
-
return true;
|
|
433
|
-
}
|
|
434
|
-
|
|
435
|
-
const maxAllowedTime = this.timeTable[proposedState];
|
|
436
|
-
if (maxAllowedTime === this.aztecSlotDuration) {
|
|
437
|
-
return true;
|
|
438
|
-
}
|
|
439
|
-
|
|
440
|
-
const bufferSeconds = maxAllowedTime - secondsIntoSlot;
|
|
441
|
-
|
|
442
|
-
if (bufferSeconds < 0) {
|
|
443
|
-
this.log.debug(`Too far into slot to transition to ${proposedState}`, { maxAllowedTime, secondsIntoSlot });
|
|
444
|
-
return false;
|
|
445
|
-
}
|
|
446
|
-
|
|
447
|
-
this.metrics.recordStateTransitionBufferMs(Math.floor(bufferSeconds * 1000), proposedState);
|
|
448
|
-
|
|
449
|
-
this.log.trace(`Enough time to transition to ${proposedState}`, { maxAllowedTime, secondsIntoSlot });
|
|
450
|
-
return true;
|
|
451
|
-
}
|
|
452
|
-
|
|
453
348
|
/**
|
|
454
349
|
* Sets the sequencer state and checks if we have enough time left in the slot to transition to the new state.
|
|
455
350
|
* @param proposedState - The new state to transition to.
|
|
@@ -465,9 +360,7 @@ export class Sequencer {
|
|
|
465
360
|
return;
|
|
466
361
|
}
|
|
467
362
|
const secondsIntoSlot = this.getSecondsIntoSlot(currentSlotNumber);
|
|
468
|
-
|
|
469
|
-
throw new SequencerTooSlowError(this.state, proposedState, this.timeTable[proposedState], secondsIntoSlot);
|
|
470
|
-
}
|
|
363
|
+
this.timetable.assertTimeLeft(proposedState, secondsIntoSlot);
|
|
471
364
|
this.log.debug(`Transitioning from ${this.state} to ${proposedState}`);
|
|
472
365
|
this.state = proposedState;
|
|
473
366
|
}
|
|
@@ -482,7 +375,7 @@ export class Sequencer {
|
|
|
482
375
|
* @param historicalHeader - The historical header of the parent
|
|
483
376
|
* @param opts - Whether to just validate the block as a validator, as opposed to building it as a proposal
|
|
484
377
|
*/
|
|
485
|
-
|
|
378
|
+
protected async buildBlock(
|
|
486
379
|
pendingTxs: Iterable<Tx>,
|
|
487
380
|
newGlobalVariables: GlobalVariables,
|
|
488
381
|
historicalHeader?: BlockHeader,
|
|
@@ -521,13 +414,11 @@ export class Sequencer {
|
|
|
521
414
|
const blockBuilder = this.blockBuilderFactory.create(orchestratorFork);
|
|
522
415
|
await blockBuilder.startNewBlock(newGlobalVariables, l1ToL2Messages);
|
|
523
416
|
|
|
524
|
-
//
|
|
525
|
-
|
|
526
|
-
// the time for tx processing from the start of the COLLECTING_ATTESTATIONS phase plus the attestation
|
|
527
|
-
// propagation time. See the comments in setTimeTable for more details.
|
|
417
|
+
// Deadline for processing depends on whether we're proposing a block
|
|
418
|
+
const secondsIntoSlot = this.getSecondsIntoSlot(slot);
|
|
528
419
|
const processingEndTimeWithinSlot = opts.validateOnly
|
|
529
|
-
? this.
|
|
530
|
-
: this.
|
|
420
|
+
? this.timetable.getValidatorReexecTimeEnd(secondsIntoSlot)
|
|
421
|
+
: this.timetable.getBlockProposalExecTimeEnd(secondsIntoSlot);
|
|
531
422
|
|
|
532
423
|
// Deadline is only set if enforceTimeTable is enabled.
|
|
533
424
|
const deadline = this.enforceTimeTable
|
|
@@ -552,7 +443,12 @@ export class Sequencer {
|
|
|
552
443
|
// TODO(#11000): Public processor should just handle processing, one tx at a time. It should be responsibility
|
|
553
444
|
// of the sequencer to update world state and iterate over txs. We should refactor this along with unifying the
|
|
554
445
|
// publicProcessorFork and orchestratorFork, to avoid doing tree insertions twice when building the block.
|
|
555
|
-
const
|
|
446
|
+
const proposerLimits = {
|
|
447
|
+
maxTransactions: this.maxTxsPerBlock,
|
|
448
|
+
maxBlockSize: this.maxBlockSizeInBytes,
|
|
449
|
+
maxBlockGas: this.maxBlockGas,
|
|
450
|
+
};
|
|
451
|
+
const limits = opts.validateOnly ? { deadline } : { deadline, ...proposerLimits };
|
|
556
452
|
const [publicProcessorDuration, [processedTxs, failedTxs]] = await elapsed(() =>
|
|
557
453
|
processor.process(pendingTxs, limits, validators),
|
|
558
454
|
);
|
|
@@ -566,11 +462,11 @@ export class Sequencer {
|
|
|
566
462
|
if (
|
|
567
463
|
!opts.validateOnly && // We check for minTxCount only if we are proposing a block, not if we are validating it
|
|
568
464
|
!this.isFlushing && // And we skip the check when flushing, since we want all pending txs to go out, no matter if too few
|
|
569
|
-
this.
|
|
570
|
-
processedTxs.length < this.
|
|
465
|
+
this.minTxsPerBlock !== undefined &&
|
|
466
|
+
processedTxs.length < this.minTxsPerBlock
|
|
571
467
|
) {
|
|
572
468
|
this.log.warn(
|
|
573
|
-
`Block ${blockNumber} has too few txs to be proposed (got ${processedTxs.length} but required ${this.
|
|
469
|
+
`Block ${blockNumber} has too few txs to be proposed (got ${processedTxs.length} but required ${this.minTxsPerBlock})`,
|
|
574
470
|
{ slot, blockNumber, processedTxCount: processedTxs.length },
|
|
575
471
|
);
|
|
576
472
|
throw new Error(`Block has too few successful txs to be proposed`);
|
|
@@ -606,7 +502,8 @@ export class Sequencer {
|
|
|
606
502
|
await publicProcessorFork.close();
|
|
607
503
|
await orchestratorFork.close();
|
|
608
504
|
} catch (err) {
|
|
609
|
-
|
|
505
|
+
// This can happen if the sequencer is stopped before we hit this timeout.
|
|
506
|
+
this.log.warn(`Error closing forks for block processing`, err);
|
|
610
507
|
}
|
|
611
508
|
}, 5000);
|
|
612
509
|
}
|
|
@@ -750,7 +647,15 @@ export class Sequencer {
|
|
|
750
647
|
this.log.debug('Broadcasting block proposal to validators');
|
|
751
648
|
this.validatorClient.broadcastBlockProposal(proposal);
|
|
752
649
|
|
|
753
|
-
const
|
|
650
|
+
const attestationTimeAllowed = this.enforceTimeTable
|
|
651
|
+
? this.timetable.getMaxAllowedTime(SequencerState.PUBLISHING_BLOCK)!
|
|
652
|
+
: this.aztecSlotDuration;
|
|
653
|
+
const attestationDeadline = new Date(this.dateProvider.now() + attestationTimeAllowed * 1000);
|
|
654
|
+
const attestations = await this.validatorClient.collectAttestations(
|
|
655
|
+
proposal,
|
|
656
|
+
numberOfRequiredAttestations,
|
|
657
|
+
attestationDeadline,
|
|
658
|
+
);
|
|
754
659
|
|
|
755
660
|
// note: the smart contract requires that the signatures are provided in the order of the committee
|
|
756
661
|
return orderAttestations(attestations, committee);
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { createLogger } from '@aztec/aztec.js';
|
|
2
|
+
|
|
3
|
+
import { type SequencerMetrics } from './metrics.js';
|
|
4
|
+
import { SequencerState } from './utils.js';
|
|
5
|
+
|
|
6
|
+
export class SequencerTimetable {
|
|
7
|
+
/** How late into the slot can we be to start working */
|
|
8
|
+
public readonly initialTime = 3;
|
|
9
|
+
|
|
10
|
+
/** How long it takes to get ready to start building */
|
|
11
|
+
public readonly blockPrepareTime = 1;
|
|
12
|
+
|
|
13
|
+
/** How long it takes to for proposals and attestations to travel across the p2p layer (one-way) */
|
|
14
|
+
public readonly attestationPropagationTime = 2;
|
|
15
|
+
|
|
16
|
+
/** How much time we spend validating and processing a block after building it, and assembling the proposal to send to attestors */
|
|
17
|
+
public readonly blockValidationTime = 1;
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* How long it takes to get a published block into L1. L1 builders typically accept txs up to 4 seconds into their slot,
|
|
21
|
+
* but we'll timeout sooner to give it more time to propagate (remember we also have blobs!). Still, when working in anvil,
|
|
22
|
+
* we can just post in the very last second of the L1 slot and still expect the tx to be accepted.
|
|
23
|
+
*/
|
|
24
|
+
public readonly l1PublishingTime;
|
|
25
|
+
|
|
26
|
+
constructor(
|
|
27
|
+
private readonly ethereumSlotDuration: number,
|
|
28
|
+
private readonly aztecSlotDuration: number,
|
|
29
|
+
private readonly maxL1TxInclusionTimeIntoSlot: number,
|
|
30
|
+
private readonly enforce: boolean = true,
|
|
31
|
+
private readonly metrics?: SequencerMetrics,
|
|
32
|
+
private readonly log = createLogger('sequencer:timetable'),
|
|
33
|
+
) {
|
|
34
|
+
this.l1PublishingTime = this.ethereumSlotDuration - this.maxL1TxInclusionTimeIntoSlot;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
private get afterBlockBuildingTimeNeededWithoutReexec() {
|
|
38
|
+
return this.blockValidationTime + this.attestationPropagationTime * 2 + this.l1PublishingTime;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
public getBlockProposalExecTimeEnd(secondsIntoSlot: number): number {
|
|
42
|
+
// We are N seconds into the slot. We need to account for `afterBlockBuildingTimeNeededWithoutReexec` seconds,
|
|
43
|
+
// send then split the remaining time between the re-execution and the block building.
|
|
44
|
+
const maxAllowed = this.aztecSlotDuration - this.afterBlockBuildingTimeNeededWithoutReexec;
|
|
45
|
+
const available = maxAllowed - secondsIntoSlot;
|
|
46
|
+
const executionTimeEnd = secondsIntoSlot + available / 2;
|
|
47
|
+
this.log.debug(`Block proposal execution time deadline is ${executionTimeEnd}`, {
|
|
48
|
+
secondsIntoSlot,
|
|
49
|
+
maxAllowed,
|
|
50
|
+
available,
|
|
51
|
+
executionTimeEnd,
|
|
52
|
+
});
|
|
53
|
+
return executionTimeEnd;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
private get afterBlockReexecTimeNeeded() {
|
|
57
|
+
return this.attestationPropagationTime + this.l1PublishingTime;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
public getValidatorReexecTimeEnd(secondsIntoSlot: number): number {
|
|
61
|
+
// We need to leave for `afterBlockReexecTimeNeeded` seconds available.
|
|
62
|
+
const validationTimeEnd = this.aztecSlotDuration - this.afterBlockReexecTimeNeeded;
|
|
63
|
+
this.log.debug(`Validator re-execution time deadline is ${validationTimeEnd}`, {
|
|
64
|
+
secondsIntoSlot,
|
|
65
|
+
validationTimeEnd,
|
|
66
|
+
});
|
|
67
|
+
return validationTimeEnd;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
public getMaxAllowedTime(state: SequencerState): number | undefined {
|
|
71
|
+
switch (state) {
|
|
72
|
+
case SequencerState.STOPPED:
|
|
73
|
+
case SequencerState.IDLE:
|
|
74
|
+
case SequencerState.SYNCHRONIZING:
|
|
75
|
+
case SequencerState.PROPOSER_CHECK:
|
|
76
|
+
return; // We don't really care about times for this states
|
|
77
|
+
case SequencerState.INITIALIZING_PROPOSAL:
|
|
78
|
+
return this.initialTime;
|
|
79
|
+
case SequencerState.CREATING_BLOCK:
|
|
80
|
+
return this.initialTime + this.blockPrepareTime;
|
|
81
|
+
case SequencerState.COLLECTING_ATTESTATIONS:
|
|
82
|
+
return this.aztecSlotDuration - this.l1PublishingTime - 2 * this.attestationPropagationTime;
|
|
83
|
+
case SequencerState.PUBLISHING_BLOCK:
|
|
84
|
+
return this.aztecSlotDuration - this.l1PublishingTime;
|
|
85
|
+
default: {
|
|
86
|
+
const _exhaustiveCheck: never = state;
|
|
87
|
+
throw new Error(`Unexpected state: ${state}`);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
public assertTimeLeft(newState: SequencerState, secondsIntoSlot: number) {
|
|
93
|
+
if (!this.enforce) {
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
const maxAllowedTime = this.getMaxAllowedTime(newState);
|
|
98
|
+
if (maxAllowedTime === undefined) {
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
const bufferSeconds = maxAllowedTime - secondsIntoSlot;
|
|
103
|
+
if (bufferSeconds < 0) {
|
|
104
|
+
throw new SequencerTooSlowError(newState, maxAllowedTime, secondsIntoSlot);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
this.metrics?.recordStateTransitionBufferMs(Math.floor(bufferSeconds * 1000), newState);
|
|
108
|
+
this.log.trace(`Enough time to transition to ${newState}`, { maxAllowedTime, secondsIntoSlot });
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
export class SequencerTooSlowError extends Error {
|
|
113
|
+
constructor(
|
|
114
|
+
public readonly proposedState: SequencerState,
|
|
115
|
+
public readonly maxAllowedTime: number,
|
|
116
|
+
public readonly currentTime: number,
|
|
117
|
+
) {
|
|
118
|
+
super(
|
|
119
|
+
`Too far into slot for ${proposedState} (time into slot ${currentTime}s greater than ${maxAllowedTime}s allowance)`,
|
|
120
|
+
);
|
|
121
|
+
this.name = 'SequencerTooSlowError';
|
|
122
|
+
}
|
|
123
|
+
}
|