@aztec/sequencer-client 3.0.0-nightly.20251221 → 3.0.0-nightly.20251223
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 +9 -8
- package/dest/client/sequencer-client.d.ts.map +1 -1
- package/dest/client/sequencer-client.js +28 -24
- package/dest/config.d.ts +7 -1
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +63 -26
- package/dest/global_variable_builder/global_builder.d.ts +16 -8
- package/dest/global_variable_builder/global_builder.d.ts.map +1 -1
- package/dest/global_variable_builder/global_builder.js +35 -26
- package/dest/index.d.ts +2 -2
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +1 -1
- package/dest/publisher/config.d.ts +3 -3
- package/dest/publisher/config.d.ts.map +1 -1
- package/dest/publisher/config.js +2 -2
- package/dest/publisher/sequencer-publisher-factory.d.ts +3 -3
- package/dest/publisher/sequencer-publisher-factory.d.ts.map +1 -1
- package/dest/publisher/sequencer-publisher-factory.js +1 -1
- package/dest/publisher/sequencer-publisher-metrics.d.ts +3 -3
- package/dest/publisher/sequencer-publisher-metrics.d.ts.map +1 -1
- package/dest/publisher/sequencer-publisher.d.ts +11 -24
- package/dest/publisher/sequencer-publisher.d.ts.map +1 -1
- package/dest/publisher/sequencer-publisher.js +50 -62
- package/dest/sequencer/block_builder.d.ts +1 -3
- package/dest/sequencer/block_builder.d.ts.map +1 -1
- package/dest/sequencer/block_builder.js +4 -2
- package/dest/sequencer/checkpoint_builder.d.ts +63 -0
- package/dest/sequencer/checkpoint_builder.d.ts.map +1 -0
- package/dest/sequencer/checkpoint_builder.js +131 -0
- package/dest/sequencer/checkpoint_proposal_job.d.ts +73 -0
- package/dest/sequencer/checkpoint_proposal_job.d.ts.map +1 -0
- package/dest/sequencer/checkpoint_proposal_job.js +638 -0
- package/dest/sequencer/checkpoint_voter.d.ts +34 -0
- package/dest/sequencer/checkpoint_voter.d.ts.map +1 -0
- package/dest/sequencer/checkpoint_voter.js +85 -0
- package/dest/sequencer/events.d.ts +46 -0
- package/dest/sequencer/events.d.ts.map +1 -0
- package/dest/sequencer/events.js +1 -0
- package/dest/sequencer/index.d.ts +5 -1
- package/dest/sequencer/index.d.ts.map +1 -1
- package/dest/sequencer/index.js +4 -0
- package/dest/sequencer/metrics.d.ts +3 -1
- package/dest/sequencer/metrics.d.ts.map +1 -1
- package/dest/sequencer/metrics.js +9 -0
- package/dest/sequencer/sequencer.d.ts +87 -127
- package/dest/sequencer/sequencer.d.ts.map +1 -1
- package/dest/sequencer/sequencer.js +179 -596
- package/dest/sequencer/timetable.d.ts +33 -13
- package/dest/sequencer/timetable.d.ts.map +1 -1
- package/dest/sequencer/timetable.js +73 -39
- package/dest/sequencer/types.d.ts +3 -0
- package/dest/sequencer/types.d.ts.map +1 -0
- package/dest/sequencer/types.js +1 -0
- package/dest/sequencer/utils.d.ts +14 -8
- package/dest/sequencer/utils.d.ts.map +1 -1
- package/dest/sequencer/utils.js +7 -4
- package/dest/test/index.d.ts +3 -1
- package/dest/test/index.d.ts.map +1 -1
- package/package.json +27 -27
- package/src/client/sequencer-client.ts +24 -31
- package/src/config.ts +68 -25
- package/src/global_variable_builder/global_builder.ts +45 -39
- package/src/index.ts +2 -0
- package/src/publisher/config.ts +3 -3
- package/src/publisher/sequencer-publisher-factory.ts +3 -3
- package/src/publisher/sequencer-publisher-metrics.ts +2 -2
- package/src/publisher/sequencer-publisher.ts +71 -74
- package/src/sequencer/block_builder.ts +4 -1
- package/src/sequencer/checkpoint_builder.ts +217 -0
- package/src/sequencer/checkpoint_proposal_job.ts +701 -0
- package/src/sequencer/checkpoint_voter.ts +105 -0
- package/src/sequencer/events.ts +27 -0
- package/src/sequencer/index.ts +4 -0
- package/src/sequencer/metrics.ts +11 -0
- package/src/sequencer/sequencer.ts +275 -804
- package/src/sequencer/timetable.ts +84 -49
- package/src/sequencer/types.ts +6 -0
- package/src/sequencer/utils.ts +18 -9
- package/src/test/index.ts +2 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/publisher/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/publisher/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,gBAAgB,EAA2B,MAAM,kCAAkC,CAAC;AAClG,OAAO,EAAE,KAAK,cAAc,EAA0B,MAAM,2BAA2B,CAAC;AACxF,OAAO,EAAE,KAAK,eAAe,EAA2B,MAAM,oCAAoC,CAAC;AACnG,OAAO,EACL,KAAK,kBAAkB,EACvB,WAAW,EAGZ,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAE3D;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,cAAc,GAAG;IAC5C;;OAEG;IACH,oBAAoB,CAAC,EAAE,WAAW,CAAC,KAAK,MAAM,EAAE,CAAC,EAAE,CAAC;IAEpD;;OAEG;IACH,kBAAkB,CAAC,EAAE,UAAU,EAAE,CAAC;CACnC,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG,eAAe,GAC3C,gBAAgB,GAAG;IACjB,oGAAoG;IACpG,2BAA2B,CAAC,EAAE,OAAO,CAAC;IACtC,4GAA4G;IAC5G,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,wGAAwG;IACxG,yBAAyB,CAAC,EAAE,UAAU,CAAC;CACxC,CAAC;AAEJ,eAAO,MAAM,yBAAyB,EAAE,CACtC,KAAK,EAAE,QAAQ,GAAG,KAAK,KACpB,kBAAkB,CAAC,IAAI,CAAC,cAAc,EAAE,aAAa,CAAC,CAezD,CAAC;AAEH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,QAAQ,GAAG,KAAK,GAAG,IAAI,CAAC,cAAc,EAAE,aAAa,CAAC,CAErG;AAED,eAAO,MAAM,0BAA0B,EAAE,CACvC,KAAK,EAAE,QAAQ,GAAG,KAAK,KACpB,kBAAkB,CAAC,eAAe,GAAG,eAAe,CAmBvD,CAAC;AAEH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,QAAQ,GAAG,KAAK,GAAG,eAAe,CAElF"}
|
package/dest/publisher/config.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { blobClientConfigMapping } from '@aztec/blob-client/client/config';
|
|
2
2
|
import { l1ReaderConfigMappings } from '@aztec/ethereum/l1-reader';
|
|
3
3
|
import { l1TxUtilsConfigMappings } from '@aztec/ethereum/l1-tx-utils/config';
|
|
4
4
|
import { SecretValue, booleanConfigHelper, getConfigFromMappings } from '@aztec/foundation/config';
|
|
@@ -41,7 +41,7 @@ export const getPublisherConfigMappings = (scope)=>({
|
|
|
41
41
|
parseEnv: (val)=>val ? EthAddress.fromString(val) : undefined
|
|
42
42
|
},
|
|
43
43
|
...l1TxUtilsConfigMappings,
|
|
44
|
-
...
|
|
44
|
+
...blobClientConfigMapping
|
|
45
45
|
});
|
|
46
46
|
export function getPublisherConfigFromEnv(scope) {
|
|
47
47
|
return getConfigFromMappings(getPublisherConfigMappings(scope));
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { EthAddress } from '@aztec/aztec.js/addresses';
|
|
2
2
|
import { type Logger } from '@aztec/aztec.js/log';
|
|
3
|
-
import type {
|
|
3
|
+
import type { BlobClientInterface } from '@aztec/blob-client/client';
|
|
4
4
|
import type { EpochCache } from '@aztec/epoch-cache';
|
|
5
5
|
import type { GovernanceProposerContract, RollupContract } from '@aztec/ethereum/contracts';
|
|
6
6
|
import type { L1TxUtilsWithBlobs } from '@aztec/ethereum/l1-tx-utils-with-blobs';
|
|
@@ -25,7 +25,7 @@ export declare class SequencerPublisherFactory {
|
|
|
25
25
|
constructor(sequencerConfig: SequencerClientConfig, deps: {
|
|
26
26
|
telemetry: TelemetryClient;
|
|
27
27
|
publisherManager: PublisherManager<L1TxUtilsWithBlobs>;
|
|
28
|
-
|
|
28
|
+
blobClient?: BlobClientInterface;
|
|
29
29
|
dateProvider: DateProvider;
|
|
30
30
|
epochCache: EpochCache;
|
|
31
31
|
rollupContract: RollupContract;
|
|
@@ -41,4 +41,4 @@ export declare class SequencerPublisherFactory {
|
|
|
41
41
|
*/
|
|
42
42
|
create(validatorAddress?: EthAddress): Promise<AttestorPublisherPair>;
|
|
43
43
|
}
|
|
44
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
44
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VxdWVuY2VyLXB1Ymxpc2hlci1mYWN0b3J5LmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcHVibGlzaGVyL3NlcXVlbmNlci1wdWJsaXNoZXItZmFjdG9yeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDdkQsT0FBTyxFQUFFLEtBQUssTUFBTSxFQUFnQixNQUFNLHFCQUFxQixDQUFDO0FBQ2hFLE9BQU8sS0FBSyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDckUsT0FBTyxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDckQsT0FBTyxLQUFLLEVBQUUsMEJBQTBCLEVBQUUsY0FBYyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDNUYsT0FBTyxLQUFLLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUNqRixPQUFPLEtBQUssRUFBbUIsZ0JBQWdCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUUzRixPQUFPLEtBQUssRUFBRSxZQUFZLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUM1RCxPQUFPLEtBQUssRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3ZFLE9BQU8sS0FBSyxFQUFFLGVBQWUsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQy9ELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRTlELE9BQU8sS0FBSyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRTFELE9BQU8sRUFBZSxrQkFBa0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRTNFLE1BQU0sTUFBTSxxQkFBcUIsR0FBRztJQUNsQyxlQUFlLEVBQUUsVUFBVSxDQUFDO0lBQzVCLFNBQVMsRUFBRSxrQkFBa0IsQ0FBQztDQUMvQixDQUFDO0FBRUYscUJBQWEseUJBQXlCO0lBU2xDLE9BQU8sQ0FBQyxlQUFlO0lBQ3ZCLE9BQU8sQ0FBQyxJQUFJO0lBVGQsT0FBTyxDQUFDLGdCQUFnQixDQUE0QjtJQUVwRCxnRkFBZ0Y7SUFDaEYsT0FBTyxDQUFDLFdBQVcsQ0FBMkM7SUFFOUQsT0FBTyxDQUFDLE1BQU0sQ0FBUztJQUV2QixZQUNVLGVBQWUsRUFBRSxxQkFBcUIsRUFDdEMsSUFBSSxFQUFFO1FBQ1osU0FBUyxFQUFFLGVBQWUsQ0FBQztRQUMzQixnQkFBZ0IsRUFBRSxnQkFBZ0IsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQ3ZELFVBQVUsQ0FBQyxFQUFFLG1CQUFtQixDQUFDO1FBQ2pDLFlBQVksRUFBRSxZQUFZLENBQUM7UUFDM0IsVUFBVSxFQUFFLFVBQVUsQ0FBQztRQUN2QixjQUFjLEVBQUUsY0FBYyxDQUFDO1FBQy9CLDBCQUEwQixFQUFFLDBCQUEwQixDQUFDO1FBQ3ZELG9CQUFvQixFQUFFLG9CQUFvQixDQUFDO1FBQzNDLFlBQVksRUFBRSxtQkFBbUIsQ0FBQztRQUNsQyxNQUFNLENBQUMsRUFBRSxNQUFNLENBQUM7S0FDakIsRUFJRjtJQUNEOzs7O09BSUc7SUFDVSxNQUFNLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxVQUFVLEdBQUcsT0FBTyxDQUFDLHFCQUFxQixDQUFDLENBcUNqRjtDQUNGIn0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sequencer-publisher-factory.d.ts","sourceRoot":"","sources":["../../src/publisher/sequencer-publisher-factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,qBAAqB,CAAC;AAChE,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"sequencer-publisher-factory.d.ts","sourceRoot":"","sources":["../../src/publisher/sequencer-publisher-factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,qBAAqB,CAAC;AAChE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,KAAK,EAAE,0BAA0B,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC5F,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wCAAwC,CAAC;AACjF,OAAO,KAAK,EAAmB,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAE3F,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AACvE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAE9D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAE1D,OAAO,EAAe,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAE3E,MAAM,MAAM,qBAAqB,GAAG;IAClC,eAAe,EAAE,UAAU,CAAC;IAC5B,SAAS,EAAE,kBAAkB,CAAC;CAC/B,CAAC;AAEF,qBAAa,yBAAyB;IASlC,OAAO,CAAC,eAAe;IACvB,OAAO,CAAC,IAAI;IATd,OAAO,CAAC,gBAAgB,CAA4B;IAEpD,gFAAgF;IAChF,OAAO,CAAC,WAAW,CAA2C;IAE9D,OAAO,CAAC,MAAM,CAAS;IAEvB,YACU,eAAe,EAAE,qBAAqB,EACtC,IAAI,EAAE;QACZ,SAAS,EAAE,eAAe,CAAC;QAC3B,gBAAgB,EAAE,gBAAgB,CAAC,kBAAkB,CAAC,CAAC;QACvD,UAAU,CAAC,EAAE,mBAAmB,CAAC;QACjC,YAAY,EAAE,YAAY,CAAC;QAC3B,UAAU,EAAE,UAAU,CAAC;QACvB,cAAc,EAAE,cAAc,CAAC;QAC/B,0BAA0B,EAAE,0BAA0B,CAAC;QACvD,oBAAoB,EAAE,oBAAoB,CAAC;QAC3C,YAAY,EAAE,mBAAmB,CAAC;QAClC,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,EAIF;IACD;;;;OAIG;IACU,MAAM,CAAC,gBAAgB,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAqCjF;CACF"}
|
|
@@ -32,7 +32,7 @@ export class SequencerPublisherFactory {
|
|
|
32
32
|
const publisher = new SequencerPublisher(this.sequencerConfig, {
|
|
33
33
|
l1TxUtils: l1Publisher,
|
|
34
34
|
telemetry: this.deps.telemetry,
|
|
35
|
-
|
|
35
|
+
blobClient: this.deps.blobClient,
|
|
36
36
|
rollupContract: this.deps.rollupContract,
|
|
37
37
|
epochCache: this.deps.epochCache,
|
|
38
38
|
governanceProposerContract: this.deps.governanceProposerContract,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { L1PublishCheckpointStats } from '@aztec/stdlib/stats';
|
|
2
2
|
import { type TelemetryClient } from '@aztec/telemetry-client';
|
|
3
3
|
export type L1TxType = 'process';
|
|
4
4
|
export declare class SequencerPublisherMetrics {
|
|
@@ -19,8 +19,8 @@ export declare class SequencerPublisherMetrics {
|
|
|
19
19
|
private senderBalance;
|
|
20
20
|
constructor(client: TelemetryClient, name?: string, logger?: import("@aztec/aztec.js/log").Logger);
|
|
21
21
|
recordFailedTx(txType: L1TxType): void;
|
|
22
|
-
recordProcessBlockTx(durationMs: number, stats:
|
|
22
|
+
recordProcessBlockTx(durationMs: number, stats: L1PublishCheckpointStats): void;
|
|
23
23
|
recordSenderBalance(wei: bigint, senderAddress: string): void;
|
|
24
24
|
private recordTx;
|
|
25
25
|
}
|
|
26
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
26
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VxdWVuY2VyLXB1Ymxpc2hlci1tZXRyaWNzLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcHVibGlzaGVyL3NlcXVlbmNlci1wdWJsaXNoZXItbWV0cmljcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEtBQUssRUFBRSx3QkFBd0IsRUFBa0IsTUFBTSxxQkFBcUIsQ0FBQztBQUNwRixPQUFPLEVBS0wsS0FBSyxlQUFlLEVBR3JCLE1BQU0seUJBQXlCLENBQUM7QUFJakMsTUFBTSxNQUFNLFFBQVEsR0FBRyxTQUFTLENBQUM7QUFFakMscUJBQWEseUJBQXlCO0lBc0JsQyxPQUFPLENBQUMsTUFBTTtJQXJCaEIsT0FBTyxDQUFDLFFBQVEsQ0FBWTtJQUU1QixPQUFPLENBQUMsT0FBTyxDQUFnQjtJQUMvQixPQUFPLENBQUMsVUFBVSxDQUFZO0lBQzlCLE9BQU8sQ0FBQyxLQUFLLENBQVk7SUFDekIsT0FBTyxDQUFDLGNBQWMsQ0FBWTtJQUNsQyxPQUFPLENBQUMsYUFBYSxDQUFZO0lBQ2pDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBWTtJQUNyQyxPQUFPLENBQUMsaUJBQWlCLENBQVk7SUFDckMsT0FBTyxDQUFDLFVBQVUsQ0FBWTtJQUU5QixPQUFPLENBQUMsUUFBUSxDQUFDLGtCQUFrQixDQUFZO0lBQy9DLE9BQU8sQ0FBQyxRQUFRLENBQUMsNEJBQTRCLENBQVk7SUFDekQsT0FBTyxDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBZ0I7SUFDckQsT0FBTyxDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBZ0I7SUFFckQsT0FBTyxDQUFDLGFBQWEsQ0FBUTtJQUU3QixZQUNFLE1BQU0sRUFBRSxlQUFlLEVBQ3ZCLElBQUksU0FBdUIsRUFDbkIsTUFBTSx1Q0FBOEMsRUFzRjdEO0lBRUQsY0FBYyxDQUFDLE1BQU0sRUFBRSxRQUFRLFFBUzlCO0lBRUQsb0JBQW9CLENBQUMsVUFBVSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsd0JBQXdCLFFBWXZFO0lBRUQsbUJBQW1CLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsTUFBTSxRQUtyRDtJQUVELE9BQU8sQ0FBQyxRQUFRO0NBdUNqQiJ9
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sequencer-publisher-metrics.d.ts","sourceRoot":"","sources":["../../src/publisher/sequencer-publisher-metrics.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"sequencer-publisher-metrics.d.ts","sourceRoot":"","sources":["../../src/publisher/sequencer-publisher-metrics.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,wBAAwB,EAAkB,MAAM,qBAAqB,CAAC;AACpF,OAAO,EAKL,KAAK,eAAe,EAGrB,MAAM,yBAAyB,CAAC;AAIjC,MAAM,MAAM,QAAQ,GAAG,SAAS,CAAC;AAEjC,qBAAa,yBAAyB;IAsBlC,OAAO,CAAC,MAAM;IArBhB,OAAO,CAAC,QAAQ,CAAY;IAE5B,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,UAAU,CAAY;IAC9B,OAAO,CAAC,KAAK,CAAY;IACzB,OAAO,CAAC,cAAc,CAAY;IAClC,OAAO,CAAC,aAAa,CAAY;IACjC,OAAO,CAAC,iBAAiB,CAAY;IACrC,OAAO,CAAC,iBAAiB,CAAY;IACrC,OAAO,CAAC,UAAU,CAAY;IAE9B,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAY;IAC/C,OAAO,CAAC,QAAQ,CAAC,4BAA4B,CAAY;IACzD,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAgB;IACrD,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAgB;IAErD,OAAO,CAAC,aAAa,CAAQ;IAE7B,YACE,MAAM,EAAE,eAAe,EACvB,IAAI,SAAuB,EACnB,MAAM,uCAA8C,EAsF7D;IAED,cAAc,CAAC,MAAM,EAAE,QAAQ,QAS9B;IAED,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,wBAAwB,QAYvE;IAED,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,QAKrD;IAED,OAAO,CAAC,QAAQ;CAuCjB"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { type BlobSinkClientInterface } from '@aztec/blob-sink/client';
|
|
1
|
+
import { type BlobClientInterface } from '@aztec/blob-client/client';
|
|
3
2
|
import type { EpochCache } from '@aztec/epoch-cache';
|
|
4
3
|
import type { L1ContractsConfig } from '@aztec/ethereum/config';
|
|
5
4
|
import { type EmpireSlashingProposerContract, type GovernanceProposerContract, RollupContract, type TallySlashingProposerContract } from '@aztec/ethereum/contracts';
|
|
@@ -15,6 +14,7 @@ import { type Logger } from '@aztec/foundation/log';
|
|
|
15
14
|
import { DateProvider } from '@aztec/foundation/timer';
|
|
16
15
|
import { type ProposerSlashAction } from '@aztec/slasher';
|
|
17
16
|
import { CommitteeAttestationsAndSigners, type ValidateBlockResult } from '@aztec/stdlib/block';
|
|
17
|
+
import type { Checkpoint } from '@aztec/stdlib/checkpoint';
|
|
18
18
|
import { SlashFactoryContract } from '@aztec/stdlib/l1-contracts';
|
|
19
19
|
import type { CheckpointHeader } from '@aztec/stdlib/rollup';
|
|
20
20
|
import { type TelemetryClient } from '@aztec/telemetry-client';
|
|
@@ -54,7 +54,7 @@ export declare class SequencerPublisher {
|
|
|
54
54
|
private isPayloadEmptyCache;
|
|
55
55
|
protected log: Logger;
|
|
56
56
|
protected ethereumSlotDuration: bigint;
|
|
57
|
-
private
|
|
57
|
+
private blobClient;
|
|
58
58
|
/** Address to use for simulations in fisherman mode (actual proposer's address) */
|
|
59
59
|
private proposerAddressForSimulation?;
|
|
60
60
|
/** L1 fee analyzer for fisherman mode */
|
|
@@ -70,7 +70,7 @@ export declare class SequencerPublisher {
|
|
|
70
70
|
protected requests: RequestWithExpiry[];
|
|
71
71
|
constructor(config: TxSenderConfig & PublisherConfig & Pick<L1ContractsConfig, 'ethereumSlotDuration'>, deps: {
|
|
72
72
|
telemetry?: TelemetryClient;
|
|
73
|
-
|
|
73
|
+
blobClient?: BlobClientInterface;
|
|
74
74
|
l1TxUtils: L1TxUtilsWithBlobs;
|
|
75
75
|
rollupContract: RollupContract;
|
|
76
76
|
slashingProposerContract: EmpireSlashingProposerContract | TallySlashingProposerContract | undefined;
|
|
@@ -106,7 +106,7 @@ export declare class SequencerPublisher {
|
|
|
106
106
|
* @param onComplete - Optional callback to invoke when analysis completes (after block is mined)
|
|
107
107
|
* @returns The analysis result (incomplete until block mines), or undefined if no requests
|
|
108
108
|
*/
|
|
109
|
-
analyzeL1Fees(l2SlotNumber:
|
|
109
|
+
analyzeL1Fees(l2SlotNumber: SlotNumber, onComplete?: (analysis: L1FeeAnalysisResult) => void): Promise<L1FeeAnalysisResult | undefined>;
|
|
110
110
|
/**
|
|
111
111
|
* Sends all requests that are still valid.
|
|
112
112
|
* @returns one of:
|
|
@@ -157,16 +157,8 @@ export declare class SequencerPublisher {
|
|
|
157
157
|
*/
|
|
158
158
|
simulateInvalidateBlock(validationResult: ValidateBlockResult): Promise<InvalidateBlockRequest | undefined>;
|
|
159
159
|
private buildInvalidateBlockRequest;
|
|
160
|
-
/**
|
|
161
|
-
|
|
162
|
-
*
|
|
163
|
-
* @dev Throws if unable to propose
|
|
164
|
-
*
|
|
165
|
-
* @param block - The block to propose
|
|
166
|
-
* @param attestationData - The block's attestation data
|
|
167
|
-
*
|
|
168
|
-
*/
|
|
169
|
-
validateBlockForSubmission(block: L2Block, attestationsAndSigners: CommitteeAttestationsAndSigners, attestationsAndSignersSignature: Signature, options: {
|
|
160
|
+
/** Simulates `propose` to make sure that the checkpoint is valid for submission */
|
|
161
|
+
validateCheckpointForSubmission(checkpoint: Checkpoint, attestationsAndSigners: CommitteeAttestationsAndSigners, attestationsAndSignersSignature: Signature, options: {
|
|
170
162
|
forcePendingBlockNumber?: BlockNumber;
|
|
171
163
|
}): Promise<bigint>;
|
|
172
164
|
private enqueueCastSignalHelper;
|
|
@@ -180,16 +172,11 @@ export declare class SequencerPublisher {
|
|
|
180
172
|
enqueueGovernanceCastSignal(governancePayload: EthAddress, slotNumber: SlotNumber, timestamp: bigint, signerAddress: EthAddress, signer: (msg: TypedDataDefinition) => Promise<`0x${string}`>): Promise<boolean>;
|
|
181
173
|
/** Enqueues all slashing actions as returned by the slasher client. */
|
|
182
174
|
enqueueSlashingActions(actions: ProposerSlashAction[], slotNumber: SlotNumber, timestamp: bigint, signerAddress: EthAddress, signer: (msg: TypedDataDefinition) => Promise<`0x${string}`>): Promise<boolean>;
|
|
183
|
-
/**
|
|
184
|
-
|
|
185
|
-
*
|
|
186
|
-
* @param block - L2 block to propose.
|
|
187
|
-
* @returns True if the tx has been enqueued, throws otherwise. See #9315
|
|
188
|
-
*/
|
|
189
|
-
enqueueProposeL2Block(block: L2Block, attestationsAndSigners: CommitteeAttestationsAndSigners, attestationsAndSignersSignature: Signature, opts?: {
|
|
175
|
+
/** Simulates and enqueues a proposal for a checkpoint on L1 */
|
|
176
|
+
enqueueProposeCheckpoint(checkpoint: Checkpoint, attestationsAndSigners: CommitteeAttestationsAndSigners, attestationsAndSignersSignature: Signature, opts?: {
|
|
190
177
|
txTimeoutAt?: Date;
|
|
191
178
|
forcePendingBlockNumber?: BlockNumber;
|
|
192
|
-
}): Promise<
|
|
179
|
+
}): Promise<void>;
|
|
193
180
|
enqueueInvalidateBlock(request: InvalidateBlockRequest | undefined, opts?: {
|
|
194
181
|
txTimeoutAt?: Date;
|
|
195
182
|
}): void;
|
|
@@ -208,4 +195,4 @@ export declare class SequencerPublisher {
|
|
|
208
195
|
private addProposeTx;
|
|
209
196
|
}
|
|
210
197
|
export {};
|
|
211
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
198
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VxdWVuY2VyLXB1Ymxpc2hlci5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3B1Ymxpc2hlci9zZXF1ZW5jZXItcHVibGlzaGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLG1CQUFtQixFQUFvQixNQUFNLDJCQUEyQixDQUFDO0FBRXZGLE9BQU8sS0FBSyxFQUFFLFVBQVUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3JELE9BQU8sS0FBSyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDaEUsT0FBTyxFQUNMLEtBQUssOEJBQThCLEVBQ25DLEtBQUssMEJBQTBCLEVBSS9CLGNBQWMsRUFDZCxLQUFLLDZCQUE2QixFQUduQyxNQUFNLDJCQUEyQixDQUFDO0FBQ25DLE9BQU8sRUFBRSxLQUFLLG1CQUFtQixFQUFFLGFBQWEsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQzFGLE9BQU8sRUFDTCxLQUFLLFlBQVksRUFDakIsS0FBSyxVQUFVLEVBQ2YsS0FBSyxXQUFXLEVBQ2hCLEtBQUssZ0JBQWdCLEVBRXRCLE1BQU0sNkJBQTZCLENBQUM7QUFDckMsT0FBTyxLQUFLLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUNqRixPQUFPLEVBQUUsa0JBQWtCLEVBQW9DLE1BQU0sdUJBQXVCLENBQUM7QUFHN0YsT0FBTyxFQUFFLFdBQVcsRUFBRSxnQkFBZ0IsRUFBRSxVQUFVLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUU1RixPQUFPLEtBQUssRUFBRSxFQUFFLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN6RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDM0QsT0FBTyxFQUFFLFNBQVMsRUFBc0IsTUFBTSxpQ0FBaUMsQ0FBQztBQUNoRixPQUFPLEVBQUUsS0FBSyxNQUFNLEVBQWdCLE1BQU0sdUJBQXVCLENBQUM7QUFFbEUsT0FB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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sequencer-publisher.d.ts","sourceRoot":"","sources":["../../src/publisher/sequencer-publisher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"sequencer-publisher.d.ts","sourceRoot":"","sources":["../../src/publisher/sequencer-publisher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,mBAAmB,EAAoB,MAAM,2BAA2B,CAAC;AAEvF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EACL,KAAK,8BAA8B,EACnC,KAAK,0BAA0B,EAI/B,cAAc,EACd,KAAK,6BAA6B,EAGnC,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,KAAK,mBAAmB,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAC1F,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,KAAK,gBAAgB,EAEtB,MAAM,6BAA6B,CAAC;AACrC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wCAAwC,CAAC;AACjF,OAAO,EAAE,kBAAkB,EAAoC,MAAM,uBAAuB,CAAC;AAG7F,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAE5F,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAsB,MAAM,iCAAiC,CAAC;AAChF,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,uBAAuB,CAAC;AAElE,OAAO,EAAE,YAAY,EAAS,MAAM,yBAAyB,CAAC;AAE9D,OAAO,EAAE,KAAK,mBAAmB,EAA6B,MAAM,gBAAgB,CAAC;AACrF,OAAO,EAAE,+BAA+B,EAAE,KAAK,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAChG,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAE7D,OAAO,EAAE,KAAK,eAAe,EAAsB,MAAM,yBAAyB,CAAC;AAEnF,OAAO,EAAsB,KAAK,kBAAkB,EAAE,KAAK,mBAAmB,EAA6B,MAAM,MAAM,CAAC;AAExH,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,EAAE,yBAAyB,EAAE,MAAM,kCAAkC,CAAC;AAgB7E,eAAO,MAAM,OAAO,0OAUV,CAAC;AAEX,MAAM,MAAM,MAAM,GAAG,CAAC,OAAO,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC;AAK9C,eAAO,MAAM,cAAc,geAAoE,CAAC;AAEhG,MAAM,MAAM,sBAAsB,GAAG;IACnC,OAAO,EAAE,WAAW,CAAC;IACrB,MAAM,EAAE,qBAAqB,GAAG,2BAA2B,CAAC;IAC5D,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,WAAW,CAAC;IACzB,uBAAuB,EAAE,WAAW,CAAC;CACtC,CAAC;AAEF,UAAU,iBAAiB;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,WAAW,CAAC;IACrB,eAAe,EAAE,UAAU,CAAC;IAC5B,SAAS,CAAC,EAAE,IAAI,CAAC,UAAU,EAAE,aAAa,GAAG,UAAU,CAAC,CAAC;IACzD,UAAU,CAAC,EAAE,YAAY,CAAC;IAC1B,YAAY,EAAE,CACZ,OAAO,EAAE,WAAW,EACpB,MAAM,CAAC,EAAE;QAAE,OAAO,EAAE,kBAAkB,CAAC;QAAC,KAAK,CAAC,EAAE,gBAAgB,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,KAClF,OAAO,CAAC;CACd;AAED,qBAAa,kBAAkB;IA0C3B,OAAO,CAAC,MAAM;IAzChB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,OAAO,CAA4B;IACpC,UAAU,EAAE,UAAU,CAAC;IAE9B,SAAS,CAAC,aAAa,SAAkD;IACzE,SAAS,CAAC,WAAW,SAAgD;IAErE,SAAS,CAAC,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAM;IAEhE,OAAO,CAAC,mBAAmB,CAAoD;IAE/E,SAAS,CAAC,GAAG,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,oBAAoB,EAAE,MAAM,CAAC;IAEvC,OAAO,CAAC,UAAU,CAAsB;IAExC,mFAAmF;IACnF,OAAO,CAAC,4BAA4B,CAAC,CAAa;IAElD,yCAAyC;IACzC,OAAO,CAAC,aAAa,CAAC,CAAgB;IAItC,OAAc,iBAAiB,EAAE,MAAM,CAAe;IAGtD,OAAc,4BAA4B,SAAS;IAGnD,OAAc,cAAc,EAAE,MAAM,CAAY;IAEzC,SAAS,EAAE,kBAAkB,CAAC;IAC9B,cAAc,EAAE,cAAc,CAAC;IAC/B,mBAAmB,EAAE,0BAA0B,CAAC;IAChD,wBAAwB,EAAE,8BAA8B,GAAG,6BAA6B,GAAG,SAAS,CAAC;IACrG,oBAAoB,EAAE,oBAAoB,CAAC;IAElD,SAAS,CAAC,QAAQ,EAAE,iBAAiB,EAAE,CAAM;IAE7C,YACU,MAAM,EAAE,cAAc,GAAG,eAAe,GAAG,IAAI,CAAC,iBAAiB,EAAE,sBAAsB,CAAC,EAClG,IAAI,EAAE;QACJ,SAAS,CAAC,EAAE,eAAe,CAAC;QAC5B,UAAU,CAAC,EAAE,mBAAmB,CAAC;QACjC,SAAS,EAAE,kBAAkB,CAAC;QAC9B,cAAc,EAAE,cAAc,CAAC;QAC/B,wBAAwB,EAAE,8BAA8B,GAAG,6BAA6B,GAAG,SAAS,CAAC;QACrG,0BAA0B,EAAE,0BAA0B,CAAC;QACvD,oBAAoB,EAAE,oBAAoB,CAAC;QAC3C,UAAU,EAAE,UAAU,CAAC;QACvB,YAAY,EAAE,YAAY,CAAC;QAC3B,OAAO,EAAE,yBAAyB,CAAC;QACnC,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;QACjD,GAAG,CAAC,EAAE,MAAM,CAAC;KACd,EAkCF;IAEM,iBAAiB,IAAI,cAAc,CAEzC;IAEM,gBAAgB,eAEtB;IAED;;OAEG;IACI,gBAAgB,IAAI,aAAa,GAAG,SAAS,CAEnD;IAED;;;OAGG;IACI,+BAA+B,CAAC,eAAe,EAAE,UAAU,GAAG,SAAS,QAE7E;IAEM,UAAU,CAAC,OAAO,EAAE,iBAAiB,QAE3C;IAEM,gBAAgB,IAAI,UAAU,CAEpC;IAED;;OAEG;IACI,oBAAoB,IAAI,IAAI,CAMlC;IAED;;;;;;OAMG;IACU,aAAa,CACxB,YAAY,EAAE,UAAU,EACxB,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,mBAAmB,KAAK,IAAI,GACnD,OAAO,CAAC,mBAAmB,GAAG,SAAS,CAAC,CA4C1C;IAED;;;;;;OAMG;IACU,YAAY;;;;;;;;;;;;;;mBAoFxB;IAED,OAAO,CAAC,2BAA2B;IAuBnC;;;;OAIG;IACI,wBAAwB,CAC7B,UAAU,EAAE,EAAE,EACd,SAAS,EAAE,UAAU,EACrB,IAAI,GAAE;QAAE,uBAAuB,CAAC,EAAE,WAAW,CAAA;KAAO;;;;mBAsBrD;IACD;;;;;OAKG;IACU,mBAAmB,CAC9B,MAAM,EAAE,gBAAgB,EACxB,IAAI,CAAC,EAAE;QAAE,uBAAuB,EAAE,WAAW,GAAG,SAAS,CAAA;KAAE,iBA6C5D;IAED;;;OAGG;IACU,uBAAuB,CAClC,gBAAgB,EAAE,mBAAmB,GACpC,OAAO,CAAC,sBAAsB,GAAG,SAAS,CAAC,CAwD7C;IAED,OAAO,CAAC,2BAA2B;IAgCnC,mFAAmF;IACtE,+BAA+B,CAC1C,UAAU,EAAE,UAAU,EACtB,sBAAsB,EAAE,+BAA+B,EACvD,+BAA+B,EAAE,SAAS,EAC1C,OAAO,EAAE;QAAE,uBAAuB,CAAC,EAAE,WAAW,CAAA;KAAE,GACjD,OAAO,CAAC,MAAM,CAAC,CAsCjB;YAEa,uBAAuB;YA+FvB,cAAc;IAW5B;;;;;OAKG;IACI,2BAA2B,CAChC,iBAAiB,EAAE,UAAU,EAC7B,UAAU,EAAE,UAAU,EACtB,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,UAAU,EACzB,MAAM,EAAE,CAAC,GAAG,EAAE,mBAAmB,KAAK,OAAO,CAAC,KAAK,MAAM,EAAE,CAAC,GAC3D,OAAO,CAAC,OAAO,CAAC,CAUlB;IAED,uEAAuE;IAC1D,sBAAsB,CACjC,OAAO,EAAE,mBAAmB,EAAE,EAC9B,UAAU,EAAE,UAAU,EACtB,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,UAAU,EACzB,MAAM,EAAE,CAAC,GAAG,EAAE,mBAAmB,KAAK,OAAO,CAAC,KAAK,MAAM,EAAE,CAAC,GAC3D,OAAO,CAAC,OAAO,CAAC,CAkHlB;IAED,+DAA+D;IAClD,wBAAwB,CACnC,UAAU,EAAE,UAAU,EACtB,sBAAsB,EAAE,+BAA+B,EACvD,+BAA+B,EAAE,SAAS,EAC1C,IAAI,GAAE;QAAE,WAAW,CAAC,EAAE,IAAI,CAAC;QAAC,uBAAuB,CAAC,EAAE,WAAW,CAAA;KAAO,GACvE,OAAO,CAAC,IAAI,CAAC,CAuCf;IAEM,sBAAsB,CAAC,OAAO,EAAE,sBAAsB,GAAG,SAAS,EAAE,IAAI,GAAE;QAAE,WAAW,CAAC,EAAE,IAAI,CAAA;KAAO,QA8B3G;YAEa,yBAAyB;IAoDvC;;;;;OAKG;IACI,SAAS,SAGf;IAED,wDAAwD;IACjD,OAAO,SAGb;YAEa,gBAAgB;YAqEhB,iBAAiB;YA2FjB,YAAY;CAyF3B"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
+
import { createBlobClient } from '@aztec/blob-client/client';
|
|
1
2
|
import { Blob, getBlobsPerL1Block, getPrefixedEthBlobCommitments } from '@aztec/blob-lib';
|
|
2
|
-
import { createBlobSinkClient } from '@aztec/blob-sink/client';
|
|
3
3
|
import { MULTI_CALL_3_ADDRESS, Multicall3, RollupContract } from '@aztec/ethereum/contracts';
|
|
4
4
|
import { L1FeeAnalyzer } from '@aztec/ethereum/l1-fee-analysis';
|
|
5
5
|
import { WEI_CONST } from '@aztec/ethereum/l1-tx-utils';
|
|
@@ -7,6 +7,7 @@ import { FormattedViemError, formatViemError, tryExtractEvent } from '@aztec/eth
|
|
|
7
7
|
import { sumBigint } from '@aztec/foundation/bigint';
|
|
8
8
|
import { toHex as toPaddedHex } from '@aztec/foundation/bigint-buffer';
|
|
9
9
|
import { BlockNumber, CheckpointNumber, SlotNumber } from '@aztec/foundation/branded-types';
|
|
10
|
+
import { pick } from '@aztec/foundation/collection';
|
|
10
11
|
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
11
12
|
import { Signature } from '@aztec/foundation/eth-signature';
|
|
12
13
|
import { createLogger } from '@aztec/foundation/log';
|
|
@@ -14,7 +15,7 @@ import { bufferToHex } from '@aztec/foundation/string';
|
|
|
14
15
|
import { Timer } from '@aztec/foundation/timer';
|
|
15
16
|
import { EmpireBaseAbi, ErrorsAbi, RollupAbi } from '@aztec/l1-artifacts';
|
|
16
17
|
import { encodeSlashConsensusVotes } from '@aztec/slasher';
|
|
17
|
-
import {
|
|
18
|
+
import { CommitteeAttestationsAndSigners } from '@aztec/stdlib/block';
|
|
18
19
|
import { getTelemetryClient } from '@aztec/telemetry-client';
|
|
19
20
|
import { encodeFunctionData, toHex } from 'viem';
|
|
20
21
|
import { SequencerPublisherMetrics } from './sequencer-publisher-metrics.js';
|
|
@@ -42,7 +43,7 @@ export class SequencerPublisher {
|
|
|
42
43
|
isPayloadEmptyCache;
|
|
43
44
|
log;
|
|
44
45
|
ethereumSlotDuration;
|
|
45
|
-
|
|
46
|
+
blobClient;
|
|
46
47
|
/** Address to use for simulations in fisherman mode (actual proposer's address) */ proposerAddressForSimulation;
|
|
47
48
|
/** L1 fee analyzer for fisherman mode */ l1FeeAnalyzer;
|
|
48
49
|
// @note - with blobs, the below estimate seems too large.
|
|
@@ -71,8 +72,8 @@ export class SequencerPublisher {
|
|
|
71
72
|
this.ethereumSlotDuration = BigInt(config.ethereumSlotDuration);
|
|
72
73
|
this.epochCache = deps.epochCache;
|
|
73
74
|
this.lastActions = deps.lastActions;
|
|
74
|
-
this.
|
|
75
|
-
logger: createLogger('sequencer:blob-
|
|
75
|
+
this.blobClient = deps.blobClient ?? createBlobClient(config, {
|
|
76
|
+
logger: createLogger('sequencer:blob-client:client')
|
|
76
77
|
});
|
|
77
78
|
const telemetry = deps.telemetry ?? getTelemetryClient();
|
|
78
79
|
this.metrics = deps.metrics ?? new SequencerPublisherMetrics(telemetry, 'SequencerPublisher');
|
|
@@ -174,7 +175,7 @@ export class SequencerPublisher {
|
|
|
174
175
|
...this.requests
|
|
175
176
|
];
|
|
176
177
|
this.requests = [];
|
|
177
|
-
if (this.interrupted) {
|
|
178
|
+
if (this.interrupted || requestsToProcess.length === 0) {
|
|
178
179
|
return undefined;
|
|
179
180
|
}
|
|
180
181
|
const currentL2Slot = this.getCurrentL2Slot();
|
|
@@ -433,34 +434,29 @@ export class SequencerPublisher {
|
|
|
433
434
|
throw new Error(`Unknown reason for invalidation`);
|
|
434
435
|
}
|
|
435
436
|
}
|
|
436
|
-
/**
|
|
437
|
-
* @notice Will simulate `propose` to make sure that the block is valid for submission
|
|
438
|
-
*
|
|
439
|
-
* @dev Throws if unable to propose
|
|
440
|
-
*
|
|
441
|
-
* @param block - The block to propose
|
|
442
|
-
* @param attestationData - The block's attestation data
|
|
443
|
-
*
|
|
444
|
-
*/ async validateBlockForSubmission(block, attestationsAndSigners, attestationsAndSignersSignature, options) {
|
|
437
|
+
/** Simulates `propose` to make sure that the checkpoint is valid for submission */ async validateCheckpointForSubmission(checkpoint, attestationsAndSigners, attestationsAndSignersSignature, options) {
|
|
445
438
|
const ts = BigInt((await this.l1TxUtils.getBlock()).timestamp + this.ethereumSlotDuration);
|
|
439
|
+
// TODO(palla/mbps): This should not be needed, there's no flow where we propose with zero attestations. Or is there?
|
|
446
440
|
// If we have no attestations, we still need to provide the empty attestations
|
|
447
441
|
// so that the committee is recalculated correctly
|
|
448
|
-
const ignoreSignatures = attestationsAndSigners.attestations.length === 0;
|
|
449
|
-
if (ignoreSignatures) {
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
442
|
+
// const ignoreSignatures = attestationsAndSigners.attestations.length === 0;
|
|
443
|
+
// if (ignoreSignatures) {
|
|
444
|
+
// const { committee } = await this.epochCache.getCommittee(block.header.globalVariables.slotNumber);
|
|
445
|
+
// if (!committee) {
|
|
446
|
+
// this.log.warn(`No committee found for slot ${block.header.globalVariables.slotNumber}`);
|
|
447
|
+
// throw new Error(`No committee found for slot ${block.header.globalVariables.slotNumber}`);
|
|
448
|
+
// }
|
|
449
|
+
// attestationsAndSigners.attestations = committee.map(committeeMember =>
|
|
450
|
+
// CommitteeAttestation.fromAddress(committeeMember),
|
|
451
|
+
// );
|
|
452
|
+
// }
|
|
453
|
+
const blobFields = checkpoint.toBlobFields();
|
|
458
454
|
const blobs = getBlobsPerL1Block(blobFields);
|
|
459
455
|
const blobInput = getPrefixedEthBlobCommitments(blobs);
|
|
460
456
|
const args = [
|
|
461
457
|
{
|
|
462
|
-
header:
|
|
463
|
-
archive: toHex(
|
|
458
|
+
header: checkpoint.header.toViem(),
|
|
459
|
+
archive: toHex(checkpoint.archive.root.toBuffer()),
|
|
464
460
|
oracleInput: {
|
|
465
461
|
feeAssetPriceModifier: 0n
|
|
466
462
|
}
|
|
@@ -535,11 +531,11 @@ export class SequencerPublisher {
|
|
|
535
531
|
payload: payload.toString()
|
|
536
532
|
};
|
|
537
533
|
if (!success) {
|
|
538
|
-
this.log.error(`Signaling in
|
|
534
|
+
this.log.error(`Signaling in ${action} for ${payload} at slot ${slotNumber} in round ${round} failed`, logData);
|
|
539
535
|
this.lastActions[signalType] = cachedLastVote;
|
|
540
536
|
return false;
|
|
541
537
|
} else {
|
|
542
|
-
this.log.info(`Signaling in
|
|
538
|
+
this.log.info(`Signaling in ${action} for ${payload} at slot ${slotNumber} in round ${round} succeeded`, logData);
|
|
543
539
|
return true;
|
|
544
540
|
}
|
|
545
541
|
}
|
|
@@ -651,19 +647,13 @@ export class SequencerPublisher {
|
|
|
651
647
|
}
|
|
652
648
|
return true;
|
|
653
649
|
}
|
|
654
|
-
/**
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
* @param block - L2 block to propose.
|
|
658
|
-
* @returns True if the tx has been enqueued, throws otherwise. See #9315
|
|
659
|
-
*/ async enqueueProposeL2Block(block, attestationsAndSigners, attestationsAndSignersSignature, opts = {}) {
|
|
660
|
-
const checkpointHeader = block.getCheckpointHeader();
|
|
661
|
-
const blobFields = block.getCheckpointBlobFields();
|
|
650
|
+
/** Simulates and enqueues a proposal for a checkpoint on L1 */ async enqueueProposeCheckpoint(checkpoint, attestationsAndSigners, attestationsAndSignersSignature, opts = {}) {
|
|
651
|
+
const checkpointHeader = checkpoint.header;
|
|
652
|
+
const blobFields = checkpoint.toBlobFields();
|
|
662
653
|
const blobs = getBlobsPerL1Block(blobFields);
|
|
663
654
|
const proposeTxArgs = {
|
|
664
655
|
header: checkpointHeader,
|
|
665
|
-
archive:
|
|
666
|
-
body: block.body.toBuffer(),
|
|
656
|
+
archive: checkpoint.archive.root.toBuffer(),
|
|
667
657
|
blobs,
|
|
668
658
|
attestationsAndSigners,
|
|
669
659
|
attestationsAndSignersSignature
|
|
@@ -675,21 +665,20 @@ export class SequencerPublisher {
|
|
|
675
665
|
// By simulation issue, I mean the fact that the block.timestamp is equal to the last block, not the next, which
|
|
676
666
|
// make time consistency checks break.
|
|
677
667
|
// TODO(palla): Check whether we're validating twice, once here and once within addProposeTx, since we call simulateProposeTx in both places.
|
|
678
|
-
ts = await this.
|
|
668
|
+
ts = await this.validateCheckpointForSubmission(checkpoint, attestationsAndSigners, attestationsAndSignersSignature, opts);
|
|
679
669
|
} catch (err) {
|
|
680
|
-
this.log.error(`
|
|
681
|
-
...
|
|
682
|
-
slotNumber:
|
|
670
|
+
this.log.error(`Checkpoint validation failed. ${err instanceof Error ? err.message : 'No error message'}`, err, {
|
|
671
|
+
...checkpoint.getStats(),
|
|
672
|
+
slotNumber: checkpoint.header.slotNumber,
|
|
683
673
|
forcePendingBlockNumber: opts.forcePendingBlockNumber
|
|
684
674
|
});
|
|
685
675
|
throw err;
|
|
686
676
|
}
|
|
687
|
-
this.log.verbose(`Enqueuing
|
|
688
|
-
...
|
|
677
|
+
this.log.verbose(`Enqueuing checkpoint propose transaction`, {
|
|
678
|
+
...checkpoint.toCheckpointInfo(),
|
|
689
679
|
...opts
|
|
690
680
|
});
|
|
691
|
-
await this.addProposeTx(
|
|
692
|
-
return true;
|
|
681
|
+
await this.addProposeTx(checkpoint, proposeTxArgs, opts, ts);
|
|
693
682
|
}
|
|
694
683
|
enqueueInvalidateBlock(request, opts = {}) {
|
|
695
684
|
if (!request) {
|
|
@@ -927,16 +916,17 @@ export class SequencerPublisher {
|
|
|
927
916
|
simulationResult
|
|
928
917
|
};
|
|
929
918
|
}
|
|
930
|
-
async addProposeTx(
|
|
919
|
+
async addProposeTx(checkpoint, encodedData, opts = {}, timestamp) {
|
|
920
|
+
const slot = checkpoint.header.slotNumber;
|
|
931
921
|
const timer = new Timer();
|
|
932
922
|
const kzg = Blob.getViemKzgInstance();
|
|
933
923
|
const { rollupData, simulationResult, blobEvaluationGas } = await this.prepareProposeTx(encodedData, timestamp, opts);
|
|
934
924
|
const startBlock = await this.l1TxUtils.getBlockNumber();
|
|
935
925
|
const gasLimit = this.l1TxUtils.bumpGasLimit(BigInt(Math.ceil(Number(simulationResult.gasUsed) * 64 / 63)) + blobEvaluationGas + SequencerPublisher.MULTICALL_OVERHEAD_GAS_GUESS);
|
|
936
|
-
// Send the blobs to the blob
|
|
937
|
-
// tx fails but it does get mined. We make sure that the blobs are sent to the blob
|
|
938
|
-
void Promise.resolve().then(()=>this.
|
|
939
|
-
this.log.error('Failed to send blobs to blob
|
|
926
|
+
// Send the blobs to the blob client preemptively. This helps in tests where the sequencer mistakingly thinks that the propose
|
|
927
|
+
// tx fails but it does get mined. We make sure that the blobs are sent to the blob client regardless of the tx outcome.
|
|
928
|
+
void Promise.resolve().then(()=>this.blobClient.sendBlobsToFilestore(encodedData.blobs).catch((_err)=>{
|
|
929
|
+
this.log.error('Failed to send blobs to blob client');
|
|
940
930
|
}));
|
|
941
931
|
return this.addRequest({
|
|
942
932
|
action: 'propose',
|
|
@@ -944,7 +934,7 @@ export class SequencerPublisher {
|
|
|
944
934
|
to: this.rollupContract.address,
|
|
945
935
|
data: rollupData
|
|
946
936
|
},
|
|
947
|
-
lastValidL2Slot:
|
|
937
|
+
lastValidL2Slot: checkpoint.header.slotNumber,
|
|
948
938
|
gasConfig: {
|
|
949
939
|
...opts,
|
|
950
940
|
gasLimit
|
|
@@ -972,25 +962,23 @@ export class SequencerPublisher {
|
|
|
972
962
|
calldataGas,
|
|
973
963
|
calldataSize,
|
|
974
964
|
sender,
|
|
975
|
-
...
|
|
965
|
+
...checkpoint.getStats(),
|
|
976
966
|
eventName: 'rollup-published-to-l1',
|
|
977
967
|
blobCount: encodedData.blobs.length,
|
|
978
968
|
inclusionBlocks
|
|
979
969
|
};
|
|
980
|
-
this.log.info(`Published
|
|
970
|
+
this.log.info(`Published checkpoint ${checkpoint.number} at slot ${slot} to rollup contract`, {
|
|
981
971
|
...stats,
|
|
982
|
-
...
|
|
983
|
-
...receipt
|
|
972
|
+
...checkpoint.getStats(),
|
|
973
|
+
...pick(receipt, 'transactionHash', 'blockHash')
|
|
984
974
|
});
|
|
985
975
|
this.metrics.recordProcessBlockTx(timer.ms(), publishStats);
|
|
986
976
|
return true;
|
|
987
977
|
} else {
|
|
988
978
|
this.metrics.recordFailedTx('process');
|
|
989
|
-
this.log.error(`
|
|
990
|
-
...
|
|
991
|
-
receipt
|
|
992
|
-
txHash: receipt.transactionHash,
|
|
993
|
-
slotNumber: block.header.globalVariables.slotNumber
|
|
979
|
+
this.log.error(`Publishing checkpoint at slot ${slot} failed with ${errorMsg ?? 'no error message'}`, undefined, {
|
|
980
|
+
...checkpoint.getStats(),
|
|
981
|
+
...receipt
|
|
994
982
|
});
|
|
995
983
|
return false;
|
|
996
984
|
}
|
|
@@ -3,11 +3,9 @@ import type { Fr } from '@aztec/foundation/curves/bn254';
|
|
|
3
3
|
import { DateProvider } from '@aztec/foundation/timer';
|
|
4
4
|
import { PublicProcessor } from '@aztec/simulator/server';
|
|
5
5
|
import type { ContractDataSource } from '@aztec/stdlib/contract';
|
|
6
|
-
import { type L1RollupConstants } from '@aztec/stdlib/epoch-helpers';
|
|
7
6
|
import type { BuildBlockResult, FullNodeBlockBuilderConfig, IFullNodeBlockBuilder, MerkleTreeWriteOperations, PublicProcessorLimits, PublicProcessorValidator, WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server';
|
|
8
7
|
import { GlobalVariables, Tx } from '@aztec/stdlib/tx';
|
|
9
8
|
import { type TelemetryClient } from '@aztec/telemetry-client';
|
|
10
|
-
export declare function buildBlock(pendingTxs: Iterable<Tx> | AsyncIterable<Tx>, l1ToL2Messages: Fr[], newGlobalVariables: GlobalVariables, opts: PublicProcessorLimits | undefined, worldStateFork: MerkleTreeWriteOperations, processor: PublicProcessor, validator: PublicProcessorValidator, l1Constants: Pick<L1RollupConstants, 'l1GenesisTime' | 'slotDuration'>, dateProvider: DateProvider, telemetryClient?: TelemetryClient): Promise<BuildBlockResult>;
|
|
11
9
|
export declare class FullNodeBlockBuilder implements IFullNodeBlockBuilder {
|
|
12
10
|
private config;
|
|
13
11
|
private worldState;
|
|
@@ -25,4 +23,4 @@ export declare class FullNodeBlockBuilder implements IFullNodeBlockBuilder {
|
|
|
25
23
|
buildBlock(pendingTxs: Iterable<Tx> | AsyncIterable<Tx>, l1ToL2Messages: Fr[], globalVariables: GlobalVariables, opts: PublicProcessorLimits, suppliedFork?: MerkleTreeWriteOperations): Promise<BuildBlockResult>;
|
|
26
24
|
getFork(blockNumber: BlockNumber): Promise<MerkleTreeWriteOperations>;
|
|
27
25
|
}
|
|
28
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
26
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmxvY2tfYnVpbGRlci5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcXVlbmNlci9ibG9ja19idWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUU5RCxPQUFPLEtBQUssRUFBRSxFQUFFLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUl6RCxPQUFPLEVBQUUsWUFBWSxFQUFrQixNQUFNLHlCQUF5QixDQUFDO0FBR3ZFLE9BQU8sRUFHTCxlQUFlLEVBRWhCLE1BQU0seUJBQXlCLENBQUM7QUFDakMsT0FBTyxLQUFLLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUdqRSxPQUFPLEtBQUssRUFDVixnQkFBZ0IsRUFDaEIsMEJBQTBCLEVBQzFCLHFCQUFxQixFQUNyQix5QkFBeUIsRUFDekIscUJBQXFCLEVBQ3JCLHdCQUF3QixFQUN4QixzQkFBc0IsRUFDdkIsTUFBTSxpQ0FBaUMsQ0FBQztBQUN6QyxPQUFPLEVBQUUsZUFBZSxFQUFFLEVBQUUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxLQUFLLGVBQWUsRUFBc0IsTUFBTSx5QkFBeUIsQ0FBQztBQTJFbkYscUJBQWEsb0JBQXFCLFlBQVcscUJBQXFCO0lBRTlELE9BQU8sQ0FBQyxNQUFNO0lBQ2QsT0FBTyxDQUFDLFVBQVU7SUFDbEIsT0FBTyxDQUFDLGtCQUFrQjtJQUMxQixPQUFPLENBQUMsWUFBWTtJQUNwQixPQUFPLENBQUMsZUFBZTtJQUx6QixZQUNVLE1BQU0sRUFBRSwwQkFBMEIsRUFDbEMsVUFBVSxFQUFFLHNCQUFzQixFQUNsQyxrQkFBa0IsRUFBRSxrQkFBa0IsRUFDdEMsWUFBWSxFQUFFLFlBQVksRUFDMUIsZUFBZSxHQUFFLGVBQXNDLEVBQzdEO0lBRUcsU0FBUyxJQUFJLDBCQUEwQixDQUU3QztJQUVNLFlBQVksQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLDBCQUEwQixDQUFDLFFBRTlEO0lBRVksb0JBQW9CLENBQUMsZUFBZSxFQUFFLGVBQWUsRUFBRSxJQUFJLEVBQUUseUJBQXlCOzs7T0FrQ2xHO1lBRWEsbUJBQW1CO0lBVTNCLFVBQVUsQ0FDZCxVQUFVLEVBQUUsUUFBUSxDQUFDLEVBQUUsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxFQUFFLENBQUMsRUFDNUMsY0FBYyxFQUFFLEVBQUUsRUFBRSxFQUNwQixlQUFlLEVBQUUsZUFBZSxFQUNoQyxJQUFJLEVBQUUscUJBQXFCLEVBQzNCLFlBQVksQ0FBQyxFQUFFLHlCQUF5QixHQUN2QyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FzQzNCO0lBRUQsT0FBTyxDQUFDLFdBQVcsRUFBRSxXQUFXLEdBQUcsT0FBTyxDQUFDLHlCQUF5QixDQUFDLENBRXBFO0NBQ0YifQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"block_builder.d.ts","sourceRoot":"","sources":["../../src/sequencer/block_builder.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAE9D,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AAIzD,OAAO,EAAE,YAAY,EAAkB,MAAM,yBAAyB,CAAC;AAGvE,OAAO,EAGL,eAAe,EAEhB,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"block_builder.d.ts","sourceRoot":"","sources":["../../src/sequencer/block_builder.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAE9D,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AAIzD,OAAO,EAAE,YAAY,EAAkB,MAAM,yBAAyB,CAAC;AAGvE,OAAO,EAGL,eAAe,EAEhB,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAGjE,OAAO,KAAK,EACV,gBAAgB,EAChB,0BAA0B,EAC1B,qBAAqB,EACrB,yBAAyB,EACzB,qBAAqB,EACrB,wBAAwB,EACxB,sBAAsB,EACvB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,KAAK,eAAe,EAAsB,MAAM,yBAAyB,CAAC;AA2EnF,qBAAa,oBAAqB,YAAW,qBAAqB;IAE9D,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,kBAAkB;IAC1B,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,eAAe;IALzB,YACU,MAAM,EAAE,0BAA0B,EAClC,UAAU,EAAE,sBAAsB,EAClC,kBAAkB,EAAE,kBAAkB,EACtC,YAAY,EAAE,YAAY,EAC1B,eAAe,GAAE,eAAsC,EAC7D;IAEG,SAAS,IAAI,0BAA0B,CAE7C;IAEM,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,0BAA0B,CAAC,QAE9D;IAEY,oBAAoB,CAAC,eAAe,EAAE,eAAe,EAAE,IAAI,EAAE,yBAAyB;;;OAkClG;YAEa,mBAAmB;IAU3B,UAAU,CACd,UAAU,EAAE,QAAQ,CAAC,EAAE,CAAC,GAAG,aAAa,CAAC,EAAE,CAAC,EAC5C,cAAc,EAAE,EAAE,EAAE,EACpB,eAAe,EAAE,eAAe,EAChC,IAAI,EAAE,qBAAqB,EAC3B,YAAY,CAAC,EAAE,yBAAyB,GACvC,OAAO,CAAC,gBAAgB,CAAC,CAsC3B;IAED,OAAO,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAEpE;CACF"}
|
|
@@ -13,7 +13,7 @@ import { Gas } from '@aztec/stdlib/gas';
|
|
|
13
13
|
import { getTelemetryClient } from '@aztec/telemetry-client';
|
|
14
14
|
import { createValidatorForBlockBuilding } from '../tx_validator/tx_validator_factory.js';
|
|
15
15
|
const log = createLogger('block-builder');
|
|
16
|
-
|
|
16
|
+
/** Builds a block out of pending txs */ async function buildBlock(pendingTxs, l1ToL2Messages, newGlobalVariables, opts = {}, worldStateFork, processor, validator, l1Constants, dateProvider, telemetryClient = getTelemetryClient()) {
|
|
17
17
|
const blockBuildingTimer = new Timer();
|
|
18
18
|
const blockNumber = newGlobalVariables.blockNumber;
|
|
19
19
|
const slot = newGlobalVariables.slotNumber;
|
|
@@ -57,8 +57,10 @@ const FullNodeBlockBuilderConfigKeys = [
|
|
|
57
57
|
'l1ChainId',
|
|
58
58
|
'rollupVersion',
|
|
59
59
|
'txPublicSetupAllowList',
|
|
60
|
-
'fakeProcessingDelayPerTxMs'
|
|
60
|
+
'fakeProcessingDelayPerTxMs',
|
|
61
|
+
'fakeThrowAfterProcessingTxCount'
|
|
61
62
|
];
|
|
63
|
+
// TODO(palla/mbps): Try killing this in favor of the CheckpointsBuilder
|
|
62
64
|
export class FullNodeBlockBuilder {
|
|
63
65
|
config;
|
|
64
66
|
worldState;
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { BlockNumber, CheckpointNumber } from '@aztec/foundation/branded-types';
|
|
2
|
+
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
3
|
+
import { DateProvider, Timer } from '@aztec/foundation/timer';
|
|
4
|
+
import { LightweightCheckpointBuilder } from '@aztec/prover-client/light';
|
|
5
|
+
import { PublicProcessor } from '@aztec/simulator/server';
|
|
6
|
+
import { L2BlockNew } from '@aztec/stdlib/block';
|
|
7
|
+
import { Checkpoint } from '@aztec/stdlib/checkpoint';
|
|
8
|
+
import type { ContractDataSource } from '@aztec/stdlib/contract';
|
|
9
|
+
import { Gas } from '@aztec/stdlib/gas';
|
|
10
|
+
import { type FullNodeBlockBuilderConfig, type MerkleTreeWriteOperations, type PublicProcessorLimits } from '@aztec/stdlib/interfaces/server';
|
|
11
|
+
import { type CheckpointGlobalVariables, type FailedTx, GlobalVariables, Tx } from '@aztec/stdlib/tx';
|
|
12
|
+
import { type TelemetryClient } from '@aztec/telemetry-client';
|
|
13
|
+
export interface BuildBlockInCheckpointResult {
|
|
14
|
+
block: L2BlockNew;
|
|
15
|
+
publicGas: Gas;
|
|
16
|
+
publicProcessorDuration: number;
|
|
17
|
+
numTxs: number;
|
|
18
|
+
failedTxs: FailedTx[];
|
|
19
|
+
blockBuildingTimer: Timer;
|
|
20
|
+
usedTxs: Tx[];
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Builder for a single checkpoint. Handles building blocks within the checkpoint
|
|
24
|
+
* and completing it.
|
|
25
|
+
*/
|
|
26
|
+
export declare class CheckpointBuilder {
|
|
27
|
+
private checkpointBuilder;
|
|
28
|
+
private fork;
|
|
29
|
+
private config;
|
|
30
|
+
private contractDataSource;
|
|
31
|
+
private dateProvider;
|
|
32
|
+
private telemetryClient;
|
|
33
|
+
constructor(checkpointBuilder: LightweightCheckpointBuilder, fork: MerkleTreeWriteOperations, config: FullNodeBlockBuilderConfig, contractDataSource: ContractDataSource, dateProvider: DateProvider, telemetryClient: TelemetryClient);
|
|
34
|
+
getConstantData(): CheckpointGlobalVariables;
|
|
35
|
+
/**
|
|
36
|
+
* Builds a single block within this checkpoint.
|
|
37
|
+
*/
|
|
38
|
+
buildBlock(pendingTxs: Iterable<Tx> | AsyncIterable<Tx>, blockNumber: BlockNumber, timestamp: bigint, opts: PublicProcessorLimits): Promise<BuildBlockInCheckpointResult>;
|
|
39
|
+
/** Completes the checkpoint and returns it. */
|
|
40
|
+
completeCheckpoint(): Promise<Checkpoint>;
|
|
41
|
+
/** Gets the checkpoint currently in progress. */
|
|
42
|
+
getCheckpoint(): Promise<Checkpoint>;
|
|
43
|
+
protected makeBlockBuilderDeps(globalVariables: GlobalVariables, fork: MerkleTreeWriteOperations): Promise<{
|
|
44
|
+
processor: PublicProcessor;
|
|
45
|
+
validator: import("@aztec/stdlib/interfaces/server").PublicProcessorValidator;
|
|
46
|
+
}>;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Factory for creating checkpoint builders.
|
|
50
|
+
*/
|
|
51
|
+
export declare class FullNodeCheckpointsBuilder {
|
|
52
|
+
private config;
|
|
53
|
+
private contractDataSource;
|
|
54
|
+
private dateProvider;
|
|
55
|
+
private telemetryClient;
|
|
56
|
+
constructor(config: FullNodeBlockBuilderConfig, contractDataSource: ContractDataSource, dateProvider: DateProvider, telemetryClient?: TelemetryClient);
|
|
57
|
+
updateConfig(config: Partial<FullNodeBlockBuilderConfig>): void;
|
|
58
|
+
/**
|
|
59
|
+
* Starts a new checkpoint and returns a CheckpointBuilder to build blocks within it.
|
|
60
|
+
*/
|
|
61
|
+
startCheckpoint(checkpointNumber: CheckpointNumber, constants: CheckpointGlobalVariables, l1ToL2Messages: Fr[], fork: MerkleTreeWriteOperations): Promise<CheckpointBuilder>;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2twb2ludF9idWlsZGVyLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VxdWVuY2VyL2NoZWNrcG9pbnRfYnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsV0FBVyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFFaEYsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBR3BELE9BQU8sRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFXLE1BQU0seUJBQXlCLENBQUM7QUFFdkUsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDMUUsT0FBTyxFQUdMLGVBQWUsRUFFaEIsTUFBTSx5QkFBeUIsQ0FBQztBQUNqQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDakQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3RELE9BQU8sS0FBSyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDakUsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3hDLE9BQU8sRUFDTCxLQUFLLDBCQUEwQixFQUUvQixLQUFLLHlCQUF5QixFQUM5QixLQUFLLHFCQUFxQixFQUMzQixNQUFNLGlDQUFpQyxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxLQUFLLHlCQUF5QixFQUFFLEtBQUssUUFBUSxFQUFFLGVBQWUsRUFBRSxFQUFFLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUN0RyxPQUFPLEVBQUUsS0FBSyxlQUFlLEVBQXNCLE1BQU0seUJBQXlCLENBQUM7QUFNbkYsTUFBTSxXQUFXLDRCQUE0QjtJQUMzQyxLQUFLLEVBQUUsVUFBVSxDQUFDO0lBQ2xCLFNBQVMsRUFBRSxHQUFHLENBQUM7SUFDZix1QkFBdUIsRUFBRSxNQUFNLENBQUM7SUFDaEMsTUFBTSxFQUFFLE1BQU0sQ0FBQztJQUNmLFNBQVMsRUFBRSxRQUFRLEVBQUUsQ0FBQztJQUN0QixrQkFBa0IsRUFBRSxLQUFLLENBQUM7SUFDMUIsT0FBTyxFQUFFLEVBQUUsRUFBRSxDQUFDO0NBQ2Y7QUFFRDs7O0dBR0c7QUFDSCxxQkFBYSxpQkFBaUI7SUFFMUIsT0FBTyxDQUFDLGlCQUFpQjtJQUN6QixPQUFPLENBQUMsSUFBSTtJQUNaLE9BQU8sQ0FBQyxNQUFNO0lBQ2QsT0FBTyxDQUFDLGtCQUFrQjtJQUMxQixPQUFPLENBQUMsWUFBWTtJQUNwQixPQUFPLENBQUMsZUFBZTtJQU56QixZQUNVLGlCQUFpQixFQUFFLDRCQUE0QixFQUMvQyxJQUFJLEVBQUUseUJBQXlCLEVBQy9CLE1BQU0sRUFBRSwwQkFBMEIsRUFDbEMsa0JBQWtCLEVBQUUsa0JBQWtCLEVBQ3RDLFlBQVksRUFBRSxZQUFZLEVBQzFCLGVBQWUsRUFBRSxlQUFlLEVBQ3RDO0lBRUosZUFBZSxJQUFJLHlCQUF5QixDQUUzQztJQUVEOztPQUVHO0lBQ0csVUFBVSxDQUNkLFVBQVUsRUFBRSxRQUFRLENBQUMsRUFBRSxDQUFDLEdBQUcsYUFBYSxDQUFDLEVBQUUsQ0FBQyxFQUM1QyxXQUFXLEVBQUUsV0FBVyxFQUN4QixTQUFTLEVBQUUsTUFBTSxFQUNqQixJQUFJLEVBQUUscUJBQXFCLEdBQzFCLE9BQU8sQ0FBQyw0QkFBNEIsQ0FBQyxDQXdDdkM7SUFFRCwrQ0FBK0M7SUFDekMsa0JBQWtCLElBQUksT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQVU5QztJQUVELGlEQUFpRDtJQUNqRCxhQUFhLElBQUksT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUVuQztJQUVELFVBQWdCLG9CQUFvQixDQUFDLGVBQWUsRUFBRSxlQUFlLEVBQUUsSUFBSSxFQUFFLHlCQUF5Qjs7O09Ba0NyRztDQUNGO0FBRUQ7O0dBRUc7QUFDSCxxQkFBYSwwQkFBMEI7SUFFbkMsT0FBTyxDQUFDLE1BQU07SUFDZCxPQUFPLENBQUMsa0JBQWtCO0lBQzFCLE9BQU8sQ0FBQyxZQUFZO0lBQ3BCLE9BQU8sQ0FBQyxlQUFlO0lBSnpCLFlBQ1UsTUFBTSxFQUFFLDBCQUEwQixFQUNsQyxrQkFBa0IsRUFBRSxrQkFBa0IsRUFDdEMsWUFBWSxFQUFFLFlBQVksRUFDMUIsZUFBZSxHQUFFLGVBQXNDLEVBQzdEO0lBRUcsWUFBWSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsMEJBQTBCLENBQUMsUUFFOUQ7SUFFRDs7T0FFRztJQUNHLGVBQWUsQ0FDbkIsZ0JBQWdCLEVBQUUsZ0JBQWdCLEVBQ2xDLFNBQVMsRUFBRSx5QkFBeUIsRUFDcEMsY0FBYyxFQUFFLEVBQUUsRUFBRSxFQUNwQixJQUFJLEVBQUUseUJBQXlCLEdBQzlCLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQTJCNUI7Q0FDRiJ9
|