@aztec/prover-node 3.0.0-canary.a9708bd → 3.0.0-devnet.2

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.
@@ -18,7 +18,7 @@ async function rerunFailedEpoch(provingJobUrl, baseLocalDir) {
18
18
  const config = {
19
19
  ...getProverNodeConfigFromEnv(),
20
20
  dataDirectory: dataDir,
21
- dataStoreMapSizeKB: env.dataStoreMapSizeKB ?? 1024 * 1024,
21
+ dataStoreMapSizeKb: env.dataStoreMapSizeKb ?? 1024 * 1024,
22
22
  proverId: env.proverId ?? EthAddress.random()
23
23
  };
24
24
  let metadata;
package/dest/config.d.ts CHANGED
@@ -16,6 +16,8 @@ export type SpecificProverNodeConfig = {
16
16
  proverNodePollingIntervalMs: number;
17
17
  proverNodeMaxParallelBlocksPerEpoch: number;
18
18
  proverNodeFailedEpochStore: string | undefined;
19
+ proverNodeEpochProvingDelayMs: number | undefined;
20
+ proverNodeDisableProofPublish?: boolean;
19
21
  txGatheringTimeoutMs: number;
20
22
  txGatheringIntervalMs: number;
21
23
  txGatheringBatchSize: number;
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAA0B,MAAM,wBAAwB,CAAC;AACrF,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,KAAK,kBAAkB,EAA8B,MAAM,iBAAiB,CAAC;AACtF,OAAO,EAAE,KAAK,kBAAkB,EAA6C,MAAM,0BAA0B,CAAC;AAC9G,OAAO,EAAE,KAAK,eAAe,EAAsB,MAAM,wBAAwB,CAAC;AAClF,OAAO,EAIL,KAAK,QAAQ,EACb,KAAK,cAAc,EAEpB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,KAAK,gBAAgB,EAA4B,MAAM,wBAAwB,CAAC;AACzF,OAAO,EAAE,KAAK,SAAS,EAAqB,MAAM,mBAAmB,CAAC;AACtE,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EAGxB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,KAAK,sBAAsB,EAAgD,MAAM,6BAA6B,CAAC;AACxH,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,cAAc,EAGpB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,KAAK,gBAAgB,EAA4B,MAAM,2BAA2B,CAAC;AAE5F,MAAM,MAAM,gBAAgB,GAAG,cAAc,GAC3C,sBAAsB,GACtB,SAAS,GACT,gBAAgB,GAChB,eAAe,GACf,cAAc,GACd,eAAe,GACf,cAAc,GACd,gBAAgB,GAChB,wBAAwB,GACxB,kBAAkB,CAAC;AAErB,MAAM,MAAM,wBAAwB,GAAG;IACrC,wBAAwB,EAAE,MAAM,CAAC;IACjC,2BAA2B,EAAE,MAAM,CAAC;IACpC,mCAAmC,EAAE,MAAM,CAAC;IAC5C,0BAA0B,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/C,oBAAoB,EAAE,MAAM,CAAC;IAC7B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,qCAAqC,EAAE,MAAM,CAAC;CAC/C,CAAC;AA6CF,eAAO,MAAM,wBAAwB,EAAE,kBAAkB,CAAC,gBAAgB,CAYzE,CAAC;AAEF,wBAAgB,0BAA0B,IAAI,gBAAgB,CAE7D;AAED,wBAAgB,gCAAgC,IAAI,kBAAkB,CAIrE;AAED,wBAAgB,+BAA+B,IAAI,iBAAiB,GAAG,QAAQ,GAAG,UAAU,CAK3F;AAkED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,gBAAgB,wBAM/D"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAA0B,MAAM,wBAAwB,CAAC;AACrF,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,KAAK,kBAAkB,EAA8B,MAAM,iBAAiB,CAAC;AACtF,OAAO,EACL,KAAK,kBAAkB,EAIxB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,KAAK,eAAe,EAAsB,MAAM,wBAAwB,CAAC;AAClF,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,cAAc,EAA+C,MAAM,sBAAsB,CAAC;AACvH,OAAO,EAAE,KAAK,gBAAgB,EAA4B,MAAM,wBAAwB,CAAC;AACzF,OAAO,EAAE,KAAK,SAAS,EAAqB,MAAM,mBAAmB,CAAC;AACtE,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EAGxB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,KAAK,sBAAsB,EAAgD,MAAM,6BAA6B,CAAC;AACxH,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,cAAc,EAGpB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,KAAK,gBAAgB,EAA4B,MAAM,2BAA2B,CAAC;AAE5F,MAAM,MAAM,gBAAgB,GAAG,cAAc,GAC3C,sBAAsB,GACtB,SAAS,GACT,gBAAgB,GAChB,eAAe,GACf,cAAc,GACd,eAAe,GACf,cAAc,GACd,gBAAgB,GAChB,wBAAwB,GACxB,kBAAkB,CAAC;AAErB,MAAM,MAAM,wBAAwB,GAAG;IACrC,wBAAwB,EAAE,MAAM,CAAC;IACjC,2BAA2B,EAAE,MAAM,CAAC;IACpC,mCAAmC,EAAE,MAAM,CAAC;IAC5C,0BAA0B,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/C,6BAA6B,EAAE,MAAM,GAAG,SAAS,CAAC;IAClD,6BAA6B,CAAC,EAAE,OAAO,CAAC;IACxC,oBAAoB,EAAE,MAAM,CAAC;IAC7B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,qCAAqC,EAAE,MAAM,CAAC;CAC/C,CAAC;AAsDF,eAAO,MAAM,wBAAwB,EAAE,kBAAkB,CAAC,gBAAgB,CAYzE,CAAC;AAEF,wBAAgB,0BAA0B,IAAI,gBAAgB,CAE7D;AAED,wBAAgB,gCAAgC,IAAI,kBAAkB,CAIrE;AAED,wBAAgB,+BAA+B,IAAI,iBAAiB,GAAG,QAAQ,GAAG,UAAU,CAK3F;AA0DD,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,gBAAgB,GAAG,QAAQ,GAAG,SAAS,CAMtF"}
package/dest/config.js CHANGED
@@ -1,8 +1,8 @@
1
1
  import { archiverConfigMappings } from '@aztec/archiver/config';
2
2
  import { genesisStateConfigMappings } from '@aztec/ethereum';
3
- import { getConfigFromMappings, numberConfigHelper } from '@aztec/foundation/config';
3
+ import { booleanConfigHelper, getConfigFromMappings, numberConfigHelper } from '@aztec/foundation/config';
4
4
  import { dataConfigMappings } from '@aztec/kv-store/config';
5
- import { keyStoreConfigMappings } from '@aztec/node-keystore';
5
+ import { ethPrivateKeySchema, keyStoreConfigMappings } from '@aztec/node-keystore';
6
6
  import { sharedNodeConfigMappings } from '@aztec/node-lib/config';
7
7
  import { p2pConfigMappings } from '@aztec/p2p/config';
8
8
  import { proverAgentConfigMappings, proverBrokerConfigMappings } from '@aztec/prover-client/broker';
@@ -30,6 +30,10 @@ const specificProverNodeConfigMappings = {
30
30
  description: 'File store where to upload node state when an epoch fails to be proven',
31
31
  defaultValue: undefined
32
32
  },
33
+ proverNodeEpochProvingDelayMs: {
34
+ description: 'Optional delay in milliseconds to wait before proving a new epoch',
35
+ defaultValue: undefined
36
+ },
33
37
  txGatheringIntervalMs: {
34
38
  env: 'PROVER_NODE_TX_GATHERING_INTERVAL_MS',
35
39
  description: 'How often to check that tx data is available',
@@ -49,6 +53,11 @@ const specificProverNodeConfigMappings = {
49
53
  env: 'PROVER_NODE_TX_GATHERING_TIMEOUT_MS',
50
54
  description: 'How long to wait for tx data to be available before giving up',
51
55
  ...numberConfigHelper(120_000)
56
+ },
57
+ proverNodeDisableProofPublish: {
58
+ env: 'PROVER_NODE_DISABLE_PROOF_PUBLISH',
59
+ description: 'Whether the prover node skips publishing proofs to L1',
60
+ ...booleanConfigHelper(false)
52
61
  }
53
62
  };
54
63
  export const proverNodeConfigMappings = {
@@ -79,14 +88,12 @@ export function getProverNodeAgentConfigFromEnv() {
79
88
  };
80
89
  }
81
90
  function createKeyStoreFromWeb3Signer(config) {
82
- // See what we have been given for proverId.
83
- const proverId = config.proverId ? config.proverId.toString() : undefined;
84
91
  // If we don't have a valid prover Id then we can't build a valid key store with remote signers
85
- if (proverId === undefined) {
92
+ if (config.proverId === undefined) {
86
93
  return undefined;
87
94
  }
88
95
  // Also, we need at least one publisher address.
89
- const publishers = config.publisherAddresses ? config.publisherAddresses.map((k)=>k.toChecksumString()) : [];
96
+ const publishers = config.publisherAddresses ?? [];
90
97
  if (publishers.length === 0) {
91
98
  return undefined;
92
99
  }
@@ -94,7 +101,7 @@ function createKeyStoreFromWeb3Signer(config) {
94
101
  schemaVersion: 1,
95
102
  slasher: undefined,
96
103
  prover: {
97
- id: proverId,
104
+ id: config.proverId,
98
105
  publisher: publishers
99
106
  },
100
107
  remoteSigner: config.web3SignerUrl,
@@ -104,21 +111,19 @@ function createKeyStoreFromWeb3Signer(config) {
104
111
  }
105
112
  function createKeyStoreFromPublisherKeys(config) {
106
113
  // Extract the publisher keys from the provided config.
107
- const publisherKeys = config.publisherPrivateKeys ? config.publisherPrivateKeys.map((k)=>k.getValue()) : [];
114
+ const publisherKeys = config.publisherPrivateKeys ? config.publisherPrivateKeys.map((k)=>ethPrivateKeySchema.parse(k.getValue())) : [];
108
115
  // There must be at least 1.
109
116
  if (publisherKeys.length === 0) {
110
117
  return undefined;
111
118
  }
112
- // Now see what we have been given for proverId.
113
- const proverId = config.proverId ? config.proverId.toString() : undefined;
114
119
  // If we have a valid proverId then create a prover key store of the form { id, publisher: [publisherKeys] }
115
120
  // Otherwise create one of the form ("0x12345678....." as EthAccount).
116
121
  const keyStore = {
117
122
  schemaVersion: 1,
118
123
  slasher: undefined,
119
- prover: proverId === undefined ? publisherKeys[0] : {
120
- id: proverId,
121
- publisher: publisherKeys.map((key)=>key)
124
+ prover: config.proverId === undefined ? publisherKeys[0] : {
125
+ id: config.proverId,
126
+ publisher: publisherKeys
122
127
  },
123
128
  remoteSigner: undefined,
124
129
  validators: undefined
@@ -1 +1 @@
1
- {"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../src/factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAkB,MAAM,iBAAiB,CAAC;AAEhE,OAAO,EAAE,KAAK,uBAAuB,EAAwB,MAAM,yBAAyB,CAAC;AAE7F,OAAO,EAEL,SAAS,EAKV,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,KAAK,cAAc,EAAkD,MAAM,sBAAsB,CAAC;AAK3G,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAEnF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAE9D,OAAO,EAAa,KAAK,eAAe,EAAsB,MAAM,yBAAyB,CAAC;AAK9F,OAAO,EAAE,KAAK,gBAAgB,EAA2B,MAAM,aAAa,CAAC;AAE7E,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAEvE,MAAM,MAAM,cAAc,GAAG;IAC3B,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,mBAAmB,CAAC,EAAE,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IACtD,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,gBAAgB,CAAC,EAAE,sBAAsB,CAAC;IAC1C,cAAc,CAAC,EAAE,uBAAuB,CAAC;IACzC,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B,CAAC;AAEF,gDAAgD;AAChD,wBAAsB,gBAAgB,CACpC,UAAU,EAAE,gBAAgB,GAAG,eAAe,GAAG,cAAc,EAC/D,IAAI,GAAE,cAAmB,EACzB,OAAO,GAAE;IACP,mBAAmB,CAAC,EAAE,kBAAkB,EAAE,CAAC;CACvC,uBAgKP"}
1
+ {"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../src/factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAkB,MAAM,iBAAiB,CAAC;AAEhE,OAAO,EAAE,KAAK,uBAAuB,EAAwB,MAAM,yBAAyB,CAAC;AAE7F,OAAO,EAAE,SAAS,EAAyD,MAAM,iBAAiB,CAAC;AAEnG,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,KAAK,cAAc,EAAkD,MAAM,sBAAsB,CAAC;AAM3G,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAEnF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAE9D,OAAO,EAAa,KAAK,eAAe,EAAsB,MAAM,yBAAyB,CAAC;AAK9F,OAAO,EAAE,KAAK,gBAAgB,EAA2B,MAAM,aAAa,CAAC;AAE7E,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAEvE,MAAM,MAAM,cAAc,GAAG;IAC3B,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,mBAAmB,CAAC,EAAE,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IACtD,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,gBAAgB,CAAC,EAAE,sBAAsB,CAAC;IAC1C,cAAc,CAAC,EAAE,uBAAuB,CAAC;IACzC,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B,CAAC;AAEF,gDAAgD;AAChD,wBAAsB,gBAAgB,CACpC,UAAU,EAAE,gBAAgB,GAAG,eAAe,GAAG,cAAc,EAC/D,IAAI,GAAE,cAAmB,EACzB,OAAO,GAAE;IACP,mBAAmB,CAAC,EAAE,kBAAkB,EAAE,CAAC;CACvC,uBAwKP"}
package/dest/factory.js CHANGED
@@ -2,12 +2,13 @@ import { createArchiver } from '@aztec/archiver';
2
2
  import { BBCircuitVerifier, QueuedIVCVerifier, TestCircuitVerifier } from '@aztec/bb-prover';
3
3
  import { createBlobSinkClient } from '@aztec/blob-sink/client';
4
4
  import { EpochCache } from '@aztec/epoch-cache';
5
- import { PublisherManager, RollupContract, createEthereumChain, createL1TxUtilsFromEthSigner } from '@aztec/ethereum';
5
+ import { PublisherManager, RollupContract, createEthereumChain } from '@aztec/ethereum';
6
6
  import { pick } from '@aztec/foundation/collection';
7
7
  import { createLogger } from '@aztec/foundation/log';
8
8
  import { DateProvider } from '@aztec/foundation/timer';
9
9
  import { KeystoreManager, loadKeystores, mergeKeystores } from '@aztec/node-keystore';
10
10
  import { trySnapshotSync } from '@aztec/node-lib/actions';
11
+ import { createL1TxUtilsFromEthSignerWithStore } from '@aztec/node-lib/factories';
11
12
  import { NodeRpcTxSource, createP2PClient } from '@aztec/p2p';
12
13
  import { createProverClient } from '@aztec/prover-client';
13
14
  import { createAndStartProvingBroker } from '@aztec/prover-client/broker';
@@ -42,6 +43,7 @@ import { ProverPublisherFactory } from './prover-publisher-factory.js';
42
43
  keyStoreManager = new KeystoreManager(keyStore);
43
44
  }
44
45
  }
46
+ await keyStoreManager?.validateSigners();
45
47
  // Extract the prover signers from the key store and verify that we have one.
46
48
  const proverSigners = keyStoreManager?.createProverSigners();
47
49
  if (proverSigners === undefined) {
@@ -51,6 +53,7 @@ import { ProverPublisherFactory } from './prover-publisher-factory.js';
51
53
  } else if (!keyStoreProvided) {
52
54
  log.warn('KEY STORE CREATED FROM ENVIRONMENT, IT IS RECOMMENDED TO USE A FILE-BASED KEY STORE IN PRODUCTION ENVIRONMENTS');
53
55
  }
56
+ log.info(`Creating prover with publishers ${proverSigners.signers.map((signer)=>signer.address.toString()).join()}`);
54
57
  // Only consider user provided config if it is valid
55
58
  const proverIdInUserConfig = config.proverId === undefined || config.proverId.isZero() ? undefined : config.proverId;
56
59
  // ProverId: Take from key store if provided, otherwise from user config if valid, otherwise address of first signer
@@ -89,12 +92,17 @@ import { ProverPublisherFactory } from './prover-publisher-factory.js';
89
92
  const rollupContract = new RollupContract(publicClient, config.l1Contracts.rollupAddress.toString());
90
93
  const l1TxUtils = deps.l1TxUtils ? [
91
94
  deps.l1TxUtils
92
- ] : proverSigners.signers.map((signer)=>{
93
- return createL1TxUtilsFromEthSigner(publicClient, signer, log, dateProvider, config);
95
+ ] : await createL1TxUtilsFromEthSignerWithStore(publicClient, proverSigners.signers, {
96
+ ...config,
97
+ scope: 'prover'
98
+ }, {
99
+ telemetry,
100
+ logger: log.createChild('l1-tx-utils'),
101
+ dateProvider
94
102
  });
95
103
  const publisherFactory = deps.publisherFactory ?? new ProverPublisherFactory(config, {
96
104
  rollupContract,
97
- publisherManager: new PublisherManager(l1TxUtils),
105
+ publisherManager: new PublisherManager(l1TxUtils, config),
98
106
  telemetry
99
107
  });
100
108
  const proofVerifier = new QueuedIVCVerifier(config, config.realProofs ? await BBCircuitVerifier.new(config) : new TestCircuitVerifier());
@@ -105,10 +113,11 @@ import { ProverPublisherFactory } from './prover-publisher-factory.js';
105
113
  });
106
114
  await p2pClient.start();
107
115
  const proverNodeConfig = {
108
- ...pick(config, 'proverNodeMaxPendingJobs', 'proverNodeMaxParallelBlocksPerEpoch', 'proverNodePollingIntervalMs', 'txGatheringMaxParallelRequests', 'txGatheringIntervalMs', 'txGatheringTimeoutMs', 'proverNodeFailedEpochStore', 'dataDirectory', 'l1ChainId', 'rollupVersion')
116
+ ...pick(config, 'proverNodeMaxPendingJobs', 'proverNodeMaxParallelBlocksPerEpoch', 'proverNodePollingIntervalMs', 'proverNodeEpochProvingDelayMs', 'txGatheringMaxParallelRequests', 'txGatheringIntervalMs', 'txGatheringTimeoutMs', 'proverNodeFailedEpochStore', 'dataDirectory', 'l1ChainId', 'rollupVersion')
109
117
  };
110
118
  const epochMonitor = await EpochMonitor.create(archiver, {
111
- pollingIntervalMs: config.proverNodePollingIntervalMs
119
+ pollingIntervalMs: config.proverNodePollingIntervalMs,
120
+ provingDelayMs: config.proverNodeEpochProvingDelayMs
112
121
  }, telemetry);
113
122
  const l1Metrics = new L1Metrics(telemetry.getMeter('ProverNodeL1Metrics'), publicClient, l1TxUtils.map((utils)=>utils.getSenderAddress()));
114
123
  return new ProverNode(prover, publisherFactory, archiver, archiver, archiver, worldStateSynchronizer, p2pClient, epochMonitor, rollupContract, l1Metrics, proverNodeConfig, telemetry);
@@ -5,6 +5,11 @@ import { type Traceable, type Tracer } from '@aztec/telemetry-client';
5
5
  import type { ProverNodeJobMetrics } from '../metrics.js';
6
6
  import type { ProverNodePublisher } from '../prover-node-publisher.js';
7
7
  import { type EpochProvingJobData } from './epoch-proving-job-data.js';
8
+ export type EpochProvingJobOptions = {
9
+ parallelBlockLimit?: number;
10
+ skipEpochCheck?: boolean;
11
+ skipSubmitProof?: boolean;
12
+ };
8
13
  /**
9
14
  * Job that grabs a range of blocks from the unfinalized chain from L1, gets their txs given their hashes,
10
15
  * re-executes their public calls, generates a rollup proof, and submits it to L1. This job will update the
@@ -27,10 +32,7 @@ export declare class EpochProvingJob implements Traceable {
27
32
  private epochCheckPromise;
28
33
  private deadlineTimeoutHandler;
29
34
  readonly tracer: Tracer;
30
- constructor(data: EpochProvingJobData, dbProvider: Pick<ForkMerkleTreeOperations, 'fork'>, prover: EpochProver, publicProcessorFactory: PublicProcessorFactory, publisher: Pick<ProverNodePublisher, 'submitEpochProof'>, l2BlockSource: L2BlockSource | undefined, metrics: ProverNodeJobMetrics, deadline: Date | undefined, config: {
31
- parallelBlockLimit?: number;
32
- skipEpochCheck?: boolean;
33
- });
35
+ constructor(data: EpochProvingJobData, dbProvider: Pick<ForkMerkleTreeOperations, 'fork'>, prover: EpochProver, publicProcessorFactory: PublicProcessorFactory, publisher: Pick<ProverNodePublisher, 'submitEpochProof'>, l2BlockSource: L2BlockSource | undefined, metrics: ProverNodeJobMetrics, deadline: Date | undefined, config: EpochProvingJobOptions);
34
36
  getId(): string;
35
37
  getState(): EpochProvingJobState;
36
38
  getEpochNumber(): bigint;
@@ -1 +1 @@
1
- {"version":3,"file":"epoch-proving-job.d.ts","sourceRoot":"","sources":["../../src/job/epoch-proving-job.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAmB,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACvF,OAAO,KAAK,EAAW,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,oBAAoB,EACzB,4BAA4B,EAC5B,KAAK,wBAAwB,EAC9B,MAAM,iCAAiC,CAAC;AAGzC,OAAO,EAAc,KAAK,SAAS,EAAE,KAAK,MAAM,EAAa,MAAM,yBAAyB,CAAC;AAI7F,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,EAAE,KAAK,mBAAmB,EAA+B,MAAM,6BAA6B,CAAC;AAEpG;;;;GAIG;AACH,qBAAa,eAAgB,YAAW,SAAS;IAY7C,OAAO,CAAC,IAAI;IACZ,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,sBAAsB;IAC9B,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,MAAM;IAnBhB,OAAO,CAAC,KAAK,CAAuC;IACpD,OAAO,CAAC,GAAG,CAAiD;IAC5D,OAAO,CAAC,IAAI,CAAS;IAErB,OAAO,CAAC,UAAU,CAA4B;IAC9C,OAAO,CAAC,iBAAiB,CAA6B;IACtD,OAAO,CAAC,sBAAsB,CAA6B;IAE3D,SAAgB,MAAM,EAAE,MAAM,CAAC;gBAGrB,IAAI,EAAE,mBAAmB,EACzB,UAAU,EAAE,IAAI,CAAC,wBAAwB,EAAE,MAAM,CAAC,EAClD,MAAM,EAAE,WAAW,EACnB,sBAAsB,EAAE,sBAAsB,EAC9C,SAAS,EAAE,IAAI,CAAC,mBAAmB,EAAE,kBAAkB,CAAC,EACxD,aAAa,EAAE,aAAa,GAAG,SAAS,EACxC,OAAO,EAAE,oBAAoB,EAC7B,QAAQ,EAAE,IAAI,GAAG,SAAS,EAC1B,MAAM,EAAE;QAAE,kBAAkB,CAAC,EAAE,MAAM,CAAC;QAAC,cAAc,CAAC,EAAE,OAAO,CAAA;KAAE;IAOpE,KAAK,IAAI,MAAM;IAIf,QAAQ,IAAI,oBAAoB;IAIhC,cAAc,IAAI,MAAM;IAIxB,WAAW,IAAI,IAAI,GAAG,SAAS;IAI/B,cAAc,IAAI,mBAAmB;IAI5C,OAAO,KAAK,WAAW,GAEtB;IAED,OAAO,KAAK,MAAM,GAEjB;IAED,OAAO,KAAK,GAAG,GAEd;IAED,OAAO,KAAK,YAAY,GAEvB;IAED;;OAEG;IAIU,GAAG;IAwHhB;;;OAGG;YACW,UAAU;IAgBxB,OAAO,CAAC,aAAa;IAKrB,OAAO,CAAC,UAAU;IAML,IAAI,CAAC,KAAK,GAAE,4BAAwC;IASjE,OAAO,CAAC,oBAAoB;IAoB5B;;;OAGG;YACW,kBAAkB;IAiChC,OAAO,CAAC,cAAc;IAiBtB,OAAO,CAAC,MAAM;IAId,OAAO,CAAC,iBAAiB;YAIX,UAAU;CAmBzB;AASD,OAAO,EAAE,KAAK,oBAAoB,EAAE,CAAC"}
1
+ {"version":3,"file":"epoch-proving-job.d.ts","sourceRoot":"","sources":["../../src/job/epoch-proving-job.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAmB,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACvF,OAAO,KAAK,EAAW,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,oBAAoB,EACzB,4BAA4B,EAC5B,KAAK,wBAAwB,EAC9B,MAAM,iCAAiC,CAAC;AAIzC,OAAO,EAAc,KAAK,SAAS,EAAE,KAAK,MAAM,EAAa,MAAM,yBAAyB,CAAC;AAI7F,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,EAAE,KAAK,mBAAmB,EAA+B,MAAM,6BAA6B,CAAC;AAEpG,MAAM,MAAM,sBAAsB,GAAG;IACnC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B,CAAC;AAEF;;;;GAIG;AACH,qBAAa,eAAgB,YAAW,SAAS;IAY7C,OAAO,CAAC,IAAI;IACZ,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,sBAAsB;IAC9B,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,MAAM;IAnBhB,OAAO,CAAC,KAAK,CAAuC;IACpD,OAAO,CAAC,GAAG,CAAiD;IAC5D,OAAO,CAAC,IAAI,CAAS;IAErB,OAAO,CAAC,UAAU,CAA4B;IAC9C,OAAO,CAAC,iBAAiB,CAA6B;IACtD,OAAO,CAAC,sBAAsB,CAA6B;IAE3D,SAAgB,MAAM,EAAE,MAAM,CAAC;gBAGrB,IAAI,EAAE,mBAAmB,EACzB,UAAU,EAAE,IAAI,CAAC,wBAAwB,EAAE,MAAM,CAAC,EAClD,MAAM,EAAE,WAAW,EACnB,sBAAsB,EAAE,sBAAsB,EAC9C,SAAS,EAAE,IAAI,CAAC,mBAAmB,EAAE,kBAAkB,CAAC,EACxD,aAAa,EAAE,aAAa,GAAG,SAAS,EACxC,OAAO,EAAE,oBAAoB,EAC7B,QAAQ,EAAE,IAAI,GAAG,SAAS,EAC1B,MAAM,EAAE,sBAAsB;IAOjC,KAAK,IAAI,MAAM;IAIf,QAAQ,IAAI,oBAAoB;IAIhC,cAAc,IAAI,MAAM;IAIxB,WAAW,IAAI,IAAI,GAAG,SAAS;IAI/B,cAAc,IAAI,mBAAmB;IAI5C,OAAO,KAAK,WAAW,GAEtB;IAED,OAAO,KAAK,MAAM,GAEjB;IAED,OAAO,KAAK,GAAG,GAEd;IAED,OAAO,KAAK,YAAY,GAEvB;IAED;;OAEG;IAIU,GAAG;IAiKhB;;;OAGG;YACW,UAAU;IAgBxB,OAAO,CAAC,aAAa;IAKrB,OAAO,CAAC,UAAU;IAML,IAAI,CAAC,KAAK,GAAE,4BAAwC;IAQjE,OAAO,CAAC,oBAAoB;IAoB5B;;;OAGG;YACW,kBAAkB;IAiChC,OAAO,CAAC,cAAc;IAiBtB,OAAO,CAAC,MAAM;IAId,OAAO,CAAC,iBAAiB;YAIX,UAAU;CAmBzB;AASD,OAAO,EAAE,KAAK,oBAAoB,EAAE,CAAC"}
@@ -4,7 +4,6 @@ function _ts_decorate(decorators, target, key, desc) {
4
4
  else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
5
  return c > 3 && r && Object.defineProperty(target, key, r), r;
6
6
  }
7
- import { BatchedBlob, Blob } from '@aztec/blob-lib';
8
7
  import { NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP } from '@aztec/constants';
9
8
  import { asyncPool } from '@aztec/foundation/async-pool';
10
9
  import { padArrayEnd } from '@aztec/foundation/collection';
@@ -12,7 +11,11 @@ import { Fr } from '@aztec/foundation/fields';
12
11
  import { createLogger } from '@aztec/foundation/log';
13
12
  import { RunningPromise, promiseWithResolvers } from '@aztec/foundation/promise';
14
13
  import { Timer } from '@aztec/foundation/timer';
14
+ import { getVKTreeRoot } from '@aztec/noir-protocol-circuits-types/vk-tree';
15
+ import { protocolContractsHash } from '@aztec/protocol-contracts';
16
+ import { buildFinalBlobChallenges } from '@aztec/prover-client/helpers';
15
17
  import { EpochProvingJobTerminalState } from '@aztec/stdlib/interfaces/server';
18
+ import { CheckpointConstantData } from '@aztec/stdlib/rollup';
16
19
  import { MerkleTreeId } from '@aztec/stdlib/trees';
17
20
  import { Attributes, trackSpan } from '@aztec/telemetry-client';
18
21
  import * as crypto from 'node:crypto';
@@ -108,9 +111,12 @@ import { validateEpochProvingJobData } from './epoch-proving-job-data.js';
108
111
  const { promise, resolve } = promiseWithResolvers();
109
112
  this.runPromise = promise;
110
113
  try {
111
- const allBlobs = (await Promise.all(this.blocks.map(async (block)=>await Blob.getBlobsPerBlock(block.body.toBlobFields())))).flat();
112
- const finalBlobBatchingChallenges = await BatchedBlob.precomputeBatchedBlobChallenges(allBlobs);
113
- this.prover.startNewEpoch(epochNumber, fromBlock, epochSizeBlocks, finalBlobBatchingChallenges);
114
+ const blobFieldsPerCheckpoint = this.blocks.map((block)=>block.getCheckpointBlobFields());
115
+ const finalBlobBatchingChallenges = await buildFinalBlobChallenges(blobFieldsPerCheckpoint);
116
+ // TODO(#17027): Enable multiple blocks per checkpoint.
117
+ // Total number of checkpoints equals number of blocks because we currently build a checkpoint with only one block.
118
+ const totalNumCheckpoints = epochSizeBlocks;
119
+ this.prover.startNewEpoch(epochNumber, totalNumCheckpoints, finalBlobBatchingChallenges);
114
120
  await this.prover.startTubeCircuits(Array.from(this.txs.values()));
115
121
  await asyncPool(this.config.parallelBlockLimit ?? 32, this.blocks, async (block)=>{
116
122
  this.checkState();
@@ -129,11 +135,31 @@ import { validateEpochProvingJobData } from './epoch-proving-job-data.js';
129
135
  uuid: this.uuid,
130
136
  ...globalVariables
131
137
  });
138
+ const checkpointConstants = CheckpointConstantData.from({
139
+ chainId: globalVariables.chainId,
140
+ version: globalVariables.version,
141
+ vkTreeRoot: getVKTreeRoot(),
142
+ protocolContractsHash: protocolContractsHash,
143
+ proverId: this.prover.getProverId().toField(),
144
+ slotNumber: globalVariables.slotNumber,
145
+ coinbase: globalVariables.coinbase,
146
+ feeRecipient: globalVariables.feeRecipient,
147
+ gasFees: globalVariables.gasFees
148
+ });
149
+ // TODO(#17027): Enable multiple blocks per checkpoint.
150
+ // Each checkpoint has only one block.
151
+ const totalNumBlocks = 1;
152
+ const checkpointIndex = block.number - fromBlock;
153
+ await this.prover.startNewCheckpoint(checkpointIndex, checkpointConstants, l1ToL2Messages, totalNumBlocks, blobFieldsPerCheckpoint[checkpointIndex].length, previousHeader);
132
154
  // Start block proving
133
- await this.prover.startNewBlock(globalVariables, l1ToL2Messages, previousHeader);
155
+ await this.prover.startNewBlock(block.number, globalVariables.timestamp, txs.length);
134
156
  // Process public fns
135
157
  const db = await this.createFork(block.number - 1, l1ToL2Messages);
136
- const publicProcessor = this.publicProcessorFactory.create(db, globalVariables, true);
158
+ const publicProcessor = this.publicProcessorFactory.create(db, globalVariables, {
159
+ skipFeeEnforcement: true,
160
+ clientInitiatedSimulation: false,
161
+ proverId: this.prover.getProverId().toField()
162
+ });
137
163
  const processed = await this.processTxs(publicProcessor, txs);
138
164
  await this.prover.addTxs(processed);
139
165
  await db.close();
@@ -143,7 +169,8 @@ import { validateEpochProvingJobData } from './epoch-proving-job-data.js';
143
169
  uuid: this.uuid
144
170
  });
145
171
  // Mark block as completed to pad it
146
- await this.prover.setBlockCompleted(block.number, block.header);
172
+ const expectedBlockHeader = block.getBlockHeader();
173
+ await this.prover.setBlockCompleted(block.number, expectedBlockHeader);
147
174
  });
148
175
  const executionTime = timer.ms();
149
176
  this.progressState('awaiting-prover');
@@ -154,6 +181,12 @@ import { validateEpochProvingJobData } from './epoch-proving-job-data.js';
154
181
  duration: timer.ms()
155
182
  });
156
183
  this.progressState('publishing-proof');
184
+ if (this.config.skipSubmitProof) {
185
+ this.log.info(`Proof publishing is disabled. Dropping valid proof for epoch ${epochNumber} (blocks ${fromBlock} to ${toBlock})`);
186
+ this.state = 'completed';
187
+ this.metrics.recordProvingJob(executionTime, timer.ms(), epochSizeBlocks, epochSizeTxs);
188
+ return;
189
+ }
157
190
  const success = await this.publisher.submitEpochProof({
158
191
  fromBlock,
159
192
  toBlock,
@@ -220,7 +253,6 @@ import { validateEpochProvingJobData } from './epoch-proving-job-data.js';
220
253
  async stop(state = 'stopped') {
221
254
  this.state = state;
222
255
  this.prover.cancel();
223
- // TODO(palla/prover): Stop the publisher as well
224
256
  if (this.runPromise) {
225
257
  await this.runPromise;
226
258
  }
@@ -278,7 +310,7 @@ import { validateEpochProvingJobData } from './epoch-proving-job-data.js';
278
310
  /* Returns the header for the given block number based on the epoch proving job data. */ getBlockHeader(blockNumber) {
279
311
  const block = this.blocks.find((b)=>b.number === blockNumber);
280
312
  if (block) {
281
- return block.header;
313
+ return block.getBlockHeader();
282
314
  }
283
315
  if (blockNumber === Number(this.data.previousBlockHeader.getBlockNumber())) {
284
316
  return this.data.previousBlockHeader;
package/dest/metrics.js CHANGED
@@ -56,7 +56,7 @@ export class ProverNodeRewardsMetrics {
56
56
  this.prevEpoch = -1n;
57
57
  this.proofSubmissionEpochs = 0;
58
58
  this.observe = async (observer)=>{
59
- const epoch = await this.rollup.getEpochNumber();
59
+ const epoch = await this.rollup.getCurrentEpochNumber();
60
60
  if (epoch > this.proofSubmissionEpochs) {
61
61
  // look at the prev epoch so that we get an accurate value, after proof submission window has closed
62
62
  // For example, if proof submission window is 1 epoch, and we are in epoch 2, we should be looking at epoch 0.
@@ -26,9 +26,11 @@ export declare class EpochMonitor implements Traceable {
26
26
  private latestEpochNumber;
27
27
  constructor(l2BlockSource: L2BlockSource, l1Constants: Pick<L1RollupConstants, 'epochDuration'>, options: {
28
28
  pollingIntervalMs: number;
29
+ provingDelayMs?: number;
29
30
  }, telemetry?: TelemetryClient);
30
31
  static create(l2BlockSource: L2BlockSource, options: {
31
32
  pollingIntervalMs: number;
33
+ provingDelayMs?: number;
32
34
  }, telemetry?: TelemetryClient): Promise<EpochMonitor>;
33
35
  start(handler: EpochMonitorHandler): void;
34
36
  /** Exposed for testing */
@@ -1 +1 @@
1
- {"version":3,"file":"epoch-monitor.d.ts","sourceRoot":"","sources":["../../src/monitors/epoch-monitor.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,KAAK,iBAAiB,EAAkB,MAAM,6BAA6B,CAAC;AACrF,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,SAAS,EACd,KAAK,MAAM,EAGZ,MAAM,yBAAyB,CAAC;AAEjC,MAAM,WAAW,mBAAmB;IAClC,uBAAuB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAChE;AAED;;;;;;;;;;GAUG;AACH,qBAAa,YAAa,YAAW,SAAS;IAS1C,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,OAAO;IAVjB,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,GAAG,CAA6C;IACxD,SAAgB,MAAM,EAAE,MAAM,CAAC;IAE/B,OAAO,CAAC,OAAO,CAAkC;IACjD,OAAO,CAAC,iBAAiB,CAAqB;gBAG3B,aAAa,EAAE,aAAa,EAC5B,WAAW,EAAE,IAAI,CAAC,iBAAiB,EAAE,eAAe,CAAC,EAC9D,OAAO,EAAE;QAAE,iBAAiB,EAAE,MAAM,CAAA;KAAE,EAC9C,SAAS,GAAE,eAAsC;WAM/B,MAAM,CACxB,aAAa,EAAE,aAAa,EAC5B,OAAO,EAAE;QAAE,iBAAiB,EAAE,MAAM,CAAA;KAAE,EACtC,SAAS,GAAE,eAAsC,GAChD,OAAO,CAAC,YAAY,CAAC;IAKjB,KAAK,CAAC,OAAO,EAAE,mBAAmB;IAMzC,0BAA0B;IACnB,UAAU,CAAC,OAAO,EAAE,mBAAmB;IAIjC,IAAI;IAMJ,IAAI;YAwBH,qBAAqB;CAYpC"}
1
+ {"version":3,"file":"epoch-monitor.d.ts","sourceRoot":"","sources":["../../src/monitors/epoch-monitor.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,KAAK,iBAAiB,EAAkB,MAAM,6BAA6B,CAAC;AACrF,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,SAAS,EACd,KAAK,MAAM,EAGZ,MAAM,yBAAyB,CAAC;AAEjC,MAAM,WAAW,mBAAmB;IAClC,uBAAuB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAChE;AAED;;;;;;;;;;GAUG;AACH,qBAAa,YAAa,YAAW,SAAS;IAS1C,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,OAAO;IAVjB,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,GAAG,CAA6C;IACxD,SAAgB,MAAM,EAAE,MAAM,CAAC;IAE/B,OAAO,CAAC,OAAO,CAAkC;IACjD,OAAO,CAAC,iBAAiB,CAAqB;gBAG3B,aAAa,EAAE,aAAa,EAC5B,WAAW,EAAE,IAAI,CAAC,iBAAiB,EAAE,eAAe,CAAC,EAC9D,OAAO,EAAE;QAAE,iBAAiB,EAAE,MAAM,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,CAAA;KAAE,EACvE,SAAS,GAAE,eAAsC;WAS/B,MAAM,CACxB,aAAa,EAAE,aAAa,EAC5B,OAAO,EAAE;QAAE,iBAAiB,EAAE,MAAM,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,CAAA;KAAE,EAC/D,SAAS,GAAE,eAAsC,GAChD,OAAO,CAAC,YAAY,CAAC;IAKjB,KAAK,CAAC,OAAO,EAAE,mBAAmB;IAMzC,0BAA0B;IACnB,UAAU,CAAC,OAAO,EAAE,mBAAmB;IAIjC,IAAI;IAMJ,IAAI;YA6BH,qBAAqB;CAYpC"}
@@ -6,6 +6,7 @@ function _ts_decorate(decorators, target, key, desc) {
6
6
  }
7
7
  import { createLogger } from '@aztec/foundation/log';
8
8
  import { RunningPromise } from '@aztec/foundation/running-promise';
9
+ import { sleep } from '@aztec/foundation/sleep';
9
10
  import { getEpochAtSlot } from '@aztec/stdlib/epoch-helpers';
10
11
  import { getTelemetryClient, trackSpan } from '@aztec/telemetry-client';
11
12
  /**
@@ -34,6 +35,9 @@ import { getTelemetryClient, trackSpan } from '@aztec/telemetry-client';
34
35
  this.log = createLogger('prover-node:epoch-monitor');
35
36
  this.tracer = telemetry.getTracer('EpochMonitor');
36
37
  this.runningPromise = new RunningPromise(this.work.bind(this), this.log, this.options.pollingIntervalMs);
38
+ if (this.options.provingDelayMs) {
39
+ this.log.warn(`Prover node epoch monitor running with delay of ${this.options.provingDelayMs}ms`);
40
+ }
37
41
  }
38
42
  static async create(l2BlockSource, options, telemetry = getTelemetryClient()) {
39
43
  const l1Constants = await l2BlockSource.getL1Constants();
@@ -80,6 +84,10 @@ import { getTelemetryClient, trackSpan } from '@aztec/telemetry-client';
80
84
  });
81
85
  return;
82
86
  }
87
+ if (this.options.provingDelayMs) {
88
+ this.log.debug(`Waiting ${this.options.provingDelayMs}ms before proving epoch ${epochToProve}`);
89
+ await sleep(this.options.provingDelayMs);
90
+ }
83
91
  this.log.debug(`Epoch ${epochToProve} is ready to be proven`);
84
92
  if (await this.handler?.handleEpochReadyToProve(epochToProve)) {
85
93
  this.latestEpochNumber = epochToProve;
@@ -1,6 +1,6 @@
1
- import { type BatchedBlob } from '@aztec/blob-lib';
1
+ import type { BatchedBlob } from '@aztec/blob-lib';
2
2
  import { AZTEC_MAX_EPOCH_DURATION } from '@aztec/constants';
3
- import { type L1TxUtils, type RollupContract, type ViemCommitteeAttestation } from '@aztec/ethereum';
3
+ import type { L1TxUtils, RollupContract, ViemCommitteeAttestation } from '@aztec/ethereum';
4
4
  import { EthAddress } from '@aztec/foundation/eth-address';
5
5
  import { Fr } from '@aztec/foundation/fields';
6
6
  import type { Tuple } from '@aztec/foundation/serialize';
@@ -20,8 +20,6 @@ export type L1SubmitEpochProofArgs = {
20
20
  proof: Proof;
21
21
  };
22
22
  export declare class ProverNodePublisher {
23
- private interruptibleSleep;
24
- private sleepTimeMs;
25
23
  private interrupted;
26
24
  private metrics;
27
25
  protected log: import("@aztec/foundation/log").Logger;
@@ -56,6 +54,5 @@ export declare class ProverNodePublisher {
56
54
  private sendSubmitEpochProofTx;
57
55
  private getEpochProofPublicInputsArgs;
58
56
  private getSubmitEpochProofArgs;
59
- protected sleepOrInterrupted(): Promise<void>;
60
57
  }
61
58
  //# sourceMappingURL=prover-node-publisher.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"prover-node-publisher.d.ts","sourceRoot":"","sources":["../src/prover-node-publisher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,WAAW,EAAoC,MAAM,iBAAiB,CAAC;AACrF,OAAO,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EACL,KAAK,SAAS,EACd,KAAK,cAAc,EAEnB,KAAK,wBAAwB,EAC9B,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAC3D,OAAO,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAC;AAE9C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAC;AAIzD,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC/E,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,KAAK,EAAE,YAAY,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAEjF,OAAO,EAAE,KAAK,eAAe,EAAsB,MAAM,yBAAyB,CAAC;AAOnF,sEAAsE;AACtE,MAAM,MAAM,sBAAsB,GAAG;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,EAAE,CAAC;IACpB,UAAU,EAAE,EAAE,CAAC;IACf,YAAY,EAAE,EAAE,CAAC;IACjB,OAAO,EAAE,EAAE,CAAC;IACZ,QAAQ,EAAE,EAAE,CAAC;IACb,IAAI,EAAE,KAAK,CAAC,YAAY,EAAE,OAAO,wBAAwB,CAAC,CAAC;IAC3D,KAAK,EAAE,KAAK,CAAC;CACd,CAAC;AAEF,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,kBAAkB,CAA4B;IACtD,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,OAAO,CAA6B;IAE5C,SAAS,CAAC,GAAG,yCAA+C;IAE5D,SAAS,CAAC,cAAc,EAAE,cAAc,CAAC;IAEzC,SAAgB,SAAS,EAAE,SAAS,CAAC;gBAGnC,MAAM,EAAE,cAAc,GAAG,eAAe,EACxC,IAAI,EAAE;QACJ,cAAc,EAAE,cAAc,CAAC;QAC/B,SAAS,EAAE,SAAS,CAAC;QACrB,SAAS,CAAC,EAAE,eAAe,CAAC;KAC7B;IAYI,iBAAiB;IAIxB;;;;;OAKG;IACI,SAAS;IAKhB,wDAAwD;IACjD,OAAO;IAIP,gBAAgB;IAIV,gBAAgB,CAAC,IAAI,EAAE;QAClC,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;QAChB,YAAY,EAAE,sBAAsB,CAAC;QACrC,KAAK,EAAE,KAAK,CAAC;QACb,iBAAiB,EAAE,WAAW,CAAC;QAC/B,YAAY,EAAE,wBAAwB,EAAE,CAAC;KAC1C,GAAG,OAAO,CAAC,OAAO,CAAC;YAkDN,4BAA4B;YA0D5B,sBAAsB;IAyCpC,OAAO,CAAC,6BAA6B;IAyBrC,OAAO,CAAC,uBAAuB;cAsBf,kBAAkB;CAGnC"}
1
+ {"version":3,"file":"prover-node-publisher.d.ts","sourceRoot":"","sources":["../src/prover-node-publisher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAG3F,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAC3D,OAAO,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAC;AAE9C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAC;AAGzD,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAE/E,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,KAAK,EAAE,YAAY,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAEjF,OAAO,EAAE,KAAK,eAAe,EAAsB,MAAM,yBAAyB,CAAC;AAOnF,sEAAsE;AACtE,MAAM,MAAM,sBAAsB,GAAG;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,EAAE,CAAC;IACpB,UAAU,EAAE,EAAE,CAAC;IACf,YAAY,EAAE,EAAE,CAAC;IACjB,OAAO,EAAE,EAAE,CAAC;IACZ,QAAQ,EAAE,EAAE,CAAC;IACb,IAAI,EAAE,KAAK,CAAC,YAAY,EAAE,OAAO,wBAAwB,CAAC,CAAC;IAC3D,KAAK,EAAE,KAAK,CAAC;CACd,CAAC;AAEF,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,OAAO,CAA6B;IAE5C,SAAS,CAAC,GAAG,yCAA+C;IAE5D,SAAS,CAAC,cAAc,EAAE,cAAc,CAAC;IAEzC,SAAgB,SAAS,EAAE,SAAS,CAAC;gBAGnC,MAAM,EAAE,cAAc,GAAG,eAAe,EACxC,IAAI,EAAE;QACJ,cAAc,EAAE,cAAc,CAAC;QAC/B,SAAS,EAAE,SAAS,CAAC;QACrB,SAAS,CAAC,EAAE,eAAe,CAAC;KAC7B;IAUI,iBAAiB;IAIxB;;;;;OAKG;IACI,SAAS;IAKhB,wDAAwD;IACjD,OAAO;IAKP,gBAAgB;IAIV,gBAAgB,CAAC,IAAI,EAAE;QAClC,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;QAChB,YAAY,EAAE,sBAAsB,CAAC;QACrC,KAAK,EAAE,KAAK,CAAC;QACb,iBAAiB,EAAE,WAAW,CAAC;QAC/B,YAAY,EAAE,wBAAwB,EAAE,CAAC;KAC1C,GAAG,OAAO,CAAC,OAAO,CAAC;YAkDN,4BAA4B;YA2D5B,sBAAsB;IAyCpC,OAAO,CAAC,6BAA6B;IAyBrC,OAAO,CAAC,uBAAuB;CAuBhC"}
@@ -1,28 +1,23 @@
1
- import { FinalBlobAccumulatorPublicInputs } from '@aztec/blob-lib';
2
1
  import { AZTEC_MAX_EPOCH_DURATION } from '@aztec/constants';
3
- import { RollupContract as RollupContractClass } from '@aztec/ethereum';
4
2
  import { makeTuple } from '@aztec/foundation/array';
5
3
  import { areArraysEqual } from '@aztec/foundation/collection';
6
4
  import { EthAddress } from '@aztec/foundation/eth-address';
7
5
  import { Fr } from '@aztec/foundation/fields';
8
6
  import { createLogger } from '@aztec/foundation/log';
9
- import { InterruptibleSleep } from '@aztec/foundation/sleep';
10
7
  import { Timer } from '@aztec/foundation/timer';
11
8
  import { RollupAbi } from '@aztec/l1-artifacts';
9
+ import { CommitteeAttestation, CommitteeAttestationsAndSigners } from '@aztec/stdlib/block';
12
10
  import { getTelemetryClient } from '@aztec/telemetry-client';
13
11
  import { inspect } from 'util';
14
12
  import { encodeFunctionData } from 'viem';
15
13
  import { ProverNodePublisherMetrics } from './metrics.js';
16
14
  export class ProverNodePublisher {
17
- interruptibleSleep = new InterruptibleSleep();
18
- sleepTimeMs;
19
15
  interrupted = false;
20
16
  metrics;
21
17
  log = createLogger('prover-node:l1-tx-publisher');
22
18
  rollupContract;
23
19
  l1TxUtils;
24
20
  constructor(config, deps){
25
- this.sleepTimeMs = config?.l1PublishRetryIntervalMS ?? 60_000;
26
21
  const telemetry = deps.telemetry ?? getTelemetryClient();
27
22
  this.metrics = new ProverNodePublisherMetrics(telemetry, 'ProverNode');
28
23
  this.rollupContract = deps.rollupContract;
@@ -38,10 +33,11 @@ export class ProverNodePublisher {
38
33
  * A call to `restart` is required before you can continue publishing.
39
34
  */ interrupt() {
40
35
  this.interrupted = true;
41
- this.interruptibleSleep.interrupt();
36
+ this.l1TxUtils.interrupt();
42
37
  }
43
38
  /** Restarts the publisher after calling `interrupt`. */ restart() {
44
39
  this.interrupted = false;
40
+ this.l1TxUtils.restart();
45
41
  }
46
42
  getSenderAddress() {
47
43
  return this.l1TxUtils.getSenderAddress();
@@ -89,7 +85,6 @@ export class ProverNodePublisher {
89
85
  }
90
86
  this.metrics.recordFailedTx();
91
87
  this.log.error(`Rollup.submitEpochProof tx status failed ${txReceipt.transactionHash}`, undefined, ctx);
92
- await this.sleepOrInterrupted();
93
88
  }
94
89
  this.log.verbose('L2 block data syncing interrupted', ctx);
95
90
  return false;
@@ -117,8 +112,9 @@ export class ProverNodePublisher {
117
112
  throw new Error(`End archive root mismatch: ${publicInputs.endArchiveRoot.toString()} !== ${endBlockLog.archive}`);
118
113
  }
119
114
  // Check the batched blob inputs from the root rollup against the batched blob computed in ts
120
- if (!publicInputs.blobPublicInputs.equals(FinalBlobAccumulatorPublicInputs.fromBatchedBlob(batchedBlobInputs))) {
121
- throw new Error(`Batched blob mismatch: ${inspect(publicInputs.blobPublicInputs)} !== ${inspect(FinalBlobAccumulatorPublicInputs.fromBatchedBlob(batchedBlobInputs))}`);
115
+ const finalBlobAccumulator = batchedBlobInputs.toFinalBlobAccumulator();
116
+ if (!publicInputs.blobPublicInputs.equals(finalBlobAccumulator)) {
117
+ throw new Error(`Batched blob mismatch: ${inspect(publicInputs.blobPublicInputs)} !== ${inspect(finalBlobAccumulator)}`);
122
118
  }
123
119
  // Compare the public inputs computed by the contract with the ones injected
124
120
  const rollupPublicInputs = await this.rollupContract.getEpochProofPublicInputs(this.getEpochProofPublicInputsArgs(args));
@@ -172,7 +168,7 @@ export class ProverNodePublisher {
172
168
  {
173
169
  previousArchive: args.publicInputs.previousArchiveRoot.toString(),
174
170
  endArchive: args.publicInputs.endArchiveRoot.toString(),
175
- proverId: EthAddress.fromField(args.publicInputs.proverId).toString()
171
+ proverId: EthAddress.fromField(args.publicInputs.constants.proverId).toString()
176
172
  } /*_args*/ ,
177
173
  makeTuple(AZTEC_MAX_EPOCH_DURATION * 2, (i)=>i % 2 === 0 ? args.publicInputs.fees[i / 2].recipient.toField().toString() : args.publicInputs.fees[(i - 1) / 2].value.toString()),
178
174
  args.batchedBlobInputs.getEthBlobEvaluationInputs()
@@ -187,12 +183,9 @@ export class ProverNodePublisher {
187
183
  end: argsArray[1],
188
184
  args: argsArray[2],
189
185
  fees: argsArray[3],
190
- attestations: RollupContractClass.packAttestations(args.attestations),
186
+ attestations: new CommitteeAttestationsAndSigners(args.attestations.map((a)=>CommitteeAttestation.fromViem(a))).getPackedAttestations(),
191
187
  blobInputs: argsArray[4],
192
188
  proof: proofHex
193
189
  };
194
190
  }
195
- async sleepOrInterrupted() {
196
- await this.interruptibleSleep.sleep(this.sleepTimeMs);
197
- }
198
191
  }
@@ -1 +1 @@
1
- {"version":3,"file":"prover-node.d.ts","sourceRoot":"","sources":["../src/prover-node.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"prover-node.d.ts","sourceRoot":"","sources":["../src/prover-node.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAMtD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,KAAK,EAAW,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAEjE,OAAO,EACL,KAAK,kBAAkB,EAEvB,KAAK,aAAa,EAClB,KAAK,OAAO,EACZ,KAAK,oBAAoB,EACzB,KAAK,sBAAsB,EAE5B,MAAM,iCAAiC,CAAC;AACzC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD,OAAO,EAEL,SAAS,EACT,KAAK,eAAe,EACpB,KAAK,SAAS,EACd,KAAK,MAAM,EAGZ,MAAM,yBAAyB,CAAC;AAGjC,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAC3E,OAAO,EAAE,eAAe,EAAE,KAAK,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAExF,OAAO,KAAK,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AACrF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAE5E,KAAK,iBAAiB,GAAG,wBAAwB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;AAC9E,KAAK,gBAAgB,GAAG,IAAI,CAAC,eAAe,EAAE,eAAe,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,WAAW,GAAG,eAAe,CAAC,CAAC;AAElH;;;;GAIG;AACH,qBAAa,UAAW,YAAW,mBAAmB,EAAE,aAAa,EAAE,SAAS;IAc5E,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,kBAAkB;IAC7C,SAAS,CAAC,QAAQ,CAAC,gBAAgB,EAAE,sBAAsB;IAC3D,SAAS,CAAC,QAAQ,CAAC,aAAa,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC;IAClE,SAAS,CAAC,QAAQ,CAAC,mBAAmB,EAAE,mBAAmB;IAC3D,SAAS,CAAC,QAAQ,CAAC,kBAAkB,EAAE,kBAAkB;IACzD,SAAS,CAAC,QAAQ,CAAC,UAAU,EAAE,sBAAsB;IACrD,SAAS,CAAC,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,eAAe,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IACvG,SAAS,CAAC,QAAQ,CAAC,aAAa,EAAE,YAAY;IAC9C,SAAS,CAAC,QAAQ,CAAC,cAAc,EAAE,cAAc;IACjD,SAAS,CAAC,QAAQ,CAAC,SAAS,EAAE,SAAS;IAEvC,SAAS,CAAC,QAAQ,CAAC,eAAe,EAAE,eAAe;IAxBrD,OAAO,CAAC,GAAG,CAA+B;IAC1C,OAAO,CAAC,YAAY,CAAsB;IAE1C,OAAO,CAAC,IAAI,CAA2C;IACvD,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,cAAc,CAA2B;IAEjD,SAAgB,MAAM,EAAE,MAAM,CAAC;IAE/B,SAAS,CAAC,SAAS,EAAE,mBAAmB,GAAG,SAAS,CAAC;gBAGhC,MAAM,EAAE,kBAAkB,EAC1B,gBAAgB,EAAE,sBAAsB,EACxC,aAAa,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,EAC/C,mBAAmB,EAAE,mBAAmB,EACxC,kBAAkB,EAAE,kBAAkB,EACtC,UAAU,EAAE,sBAAsB,EAClC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,eAAe,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,EACpF,aAAa,EAAE,YAAY,EAC3B,cAAc,EAAE,cAAc,EAC9B,SAAS,EAAE,SAAS,EACvC,MAAM,GAAE,OAAO,CAAC,iBAAiB,CAAM,EACpB,eAAe,GAAE,eAAsC;IAyBrE,WAAW;IAIX,MAAM;IAIb;;;;OAIG;IACG,uBAAuB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAwBpE;;;OAGG;IACG,KAAK;IASX;;OAEG;IACG,IAAI;IAgBV,kCAAkC;IACrB,uBAAuB,IAAI,OAAO,CAAC,oBAAoB,CAAC;IAKrE,+BAA+B;IACxB,SAAS;IAIhB;;OAEG;IACU,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM;YAKtC,MAAM;cAyBJ,qBAAqB,CAAC,GAAG,EAAE,eAAe;IAc1D;;OAEG;IACI,SAAS;IAIhB;;OAEG;IACI,OAAO,IAAI,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,oBAAoB,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;cAUhF,qBAAqB,CACnC,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,oBAAoB,CAAA;KAAE,EAAE,CAAC;IAM5D,OAAO,CAAC,uBAAuB;YAQjB,gBAAgB;IAgC9B,OAAO,CAAC,cAAc;YAKR,eAAe;YAYf,YAAY;YAQZ,SAAS;YAeT,cAAc;YAWd,yBAAyB;IAcvC,sCAAsC;IACtC,SAAS,CAAC,uBAAuB,CAC/B,IAAI,EAAE,mBAAmB,EACzB,QAAQ,EAAE,IAAI,GAAG,SAAS,EAC1B,sBAAsB,EAAE,sBAAsB,EAC9C,SAAS,EAAE,mBAAmB,EAC9B,IAAI,GAAE;QAAE,cAAc,CAAC,EAAE,OAAO,CAAA;KAAO;IAgBzC,sCAAsC;cACtB,eAAe;IAI/B,OAAO,CAAC,cAAc;CAcvB"}
@@ -63,6 +63,7 @@ import { ProverNodeJobMetrics, ProverNodeRewardsMetrics } from './metrics.js';
63
63
  txGatheringMaxParallelRequestsPerNode: 100,
64
64
  txGatheringTimeoutMs: 120_000,
65
65
  proverNodeFailedEpochStore: undefined,
66
+ proverNodeEpochProvingDelayMs: undefined,
66
67
  ...compact(config)
67
68
  };
68
69
  this.validateConfig();
@@ -109,6 +110,7 @@ import { ProverNodeJobMetrics, ProverNodeRewardsMetrics } from './metrics.js';
109
110
  * starts proving jobs for them.
110
111
  */ async start() {
111
112
  this.epochsMonitor.start(this);
113
+ await this.publisherFactory.start();
112
114
  this.publisher = await this.publisherFactory.create();
113
115
  await this.rewardsMetrics.start();
114
116
  this.l1Metrics.start();
@@ -122,6 +124,7 @@ import { ProverNodeJobMetrics, ProverNodeRewardsMetrics } from './metrics.js';
122
124
  await this.prover.stop();
123
125
  await tryStop(this.p2pClient);
124
126
  await tryStop(this.l2BlockSource);
127
+ await tryStop(this.publisherFactory);
125
128
  this.publisher?.interrupt();
126
129
  await Promise.all(Array.from(this.jobs.values()).map((job)=>job.stop()));
127
130
  await this.worldState.stop();
@@ -288,9 +291,10 @@ import { ProverNodeJobMetrics, ProverNodeRewardsMetrics } from './metrics.js';
288
291
  return header;
289
292
  }
290
293
  /** Extracted for testing purposes. */ doCreateEpochProvingJob(data, deadline, publicProcessorFactory, publisher, opts = {}) {
291
- const { proverNodeMaxParallelBlocksPerEpoch: parallelBlockLimit } = this.config;
294
+ const { proverNodeMaxParallelBlocksPerEpoch: parallelBlockLimit, proverNodeDisableProofPublish } = this.config;
292
295
  return new EpochProvingJob(data, this.worldState, this.prover.createEpochProver(), publicProcessorFactory, publisher, this.l2BlockSource, this.jobMetrics, deadline, {
293
296
  parallelBlockLimit,
297
+ skipSubmitProof: proverNodeDisableProofPublish,
294
298
  ...opts
295
299
  });
296
300
  }
@@ -10,6 +10,8 @@ export declare class ProverPublisherFactory {
10
10
  publisherManager: PublisherManager<L1TxUtils>;
11
11
  telemetry?: TelemetryClient;
12
12
  });
13
+ start(): Promise<void>;
14
+ stop(): void;
13
15
  /**
14
16
  * Creates a new Prover Publisher instance.
15
17
  * @returns A new ProverNodePublisher instance.
@@ -1 +1 @@
1
- {"version":3,"file":"prover-publisher-factory.d.ts","sourceRoot":"","sources":["../src/prover-publisher-factory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACnF,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC/E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAEjE,qBAAa,sBAAsB;IAE/B,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,IAAI;gBADJ,MAAM,EAAE,cAAc,GAAG,eAAe,EACxC,IAAI,EAAE;QACZ,cAAc,EAAE,cAAc,CAAC;QAC/B,gBAAgB,EAAE,gBAAgB,CAAC,SAAS,CAAC,CAAC;QAC9C,SAAS,CAAC,EAAE,eAAe,CAAC;KAC7B;IAEH;;;OAGG;IACU,MAAM,IAAI,OAAO,CAAC,mBAAmB,CAAC;CAQpD"}
1
+ {"version":3,"file":"prover-publisher-factory.d.ts","sourceRoot":"","sources":["../src/prover-publisher-factory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACnF,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC/E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAEjE,qBAAa,sBAAsB;IAE/B,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,IAAI;gBADJ,MAAM,EAAE,cAAc,GAAG,eAAe,EACxC,IAAI,EAAE;QACZ,cAAc,EAAE,cAAc,CAAC;QAC/B,gBAAgB,EAAE,gBAAgB,CAAC,SAAS,CAAC,CAAC;QAC9C,SAAS,CAAC,EAAE,eAAe,CAAC;KAC7B;IAGU,KAAK;IAIX,IAAI;IAIX;;;OAGG;IACU,MAAM,IAAI,OAAO,CAAC,mBAAmB,CAAC;CAQpD"}
@@ -6,6 +6,12 @@ export class ProverPublisherFactory {
6
6
  this.config = config;
7
7
  this.deps = deps;
8
8
  }
9
+ async start() {
10
+ await this.deps.publisherManager.loadState();
11
+ }
12
+ stop() {
13
+ this.deps.publisherManager.interrupt();
14
+ }
9
15
  /**
10
16
  * Creates a new Prover Publisher instance.
11
17
  * @returns A new ProverNodePublisher instance.