@aztec/prover-node 2.1.0-rc.1 → 2.1.0-rc.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.
- package/dest/config.d.ts +2 -0
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +10 -1
- package/dest/factory.d.ts.map +1 -1
- package/dest/factory.js +12 -5
- package/dest/job/epoch-proving-job.d.ts +6 -4
- package/dest/job/epoch-proving-job.d.ts.map +1 -1
- package/dest/job/epoch-proving-job.js +6 -0
- package/dest/metrics.js +1 -1
- package/dest/monitors/epoch-monitor.d.ts +2 -0
- package/dest/monitors/epoch-monitor.d.ts.map +1 -1
- package/dest/monitors/epoch-monitor.js +8 -0
- package/dest/prover-node-publisher.d.ts +0 -4
- package/dest/prover-node-publisher.d.ts.map +1 -1
- package/dest/prover-node-publisher.js +2 -15
- package/dest/prover-node.d.ts.map +1 -1
- package/dest/prover-node.js +5 -1
- package/dest/prover-publisher-factory.d.ts +2 -0
- package/dest/prover-publisher-factory.d.ts.map +1 -1
- package/dest/prover-publisher-factory.js +6 -0
- package/package.json +22 -22
- package/src/config.ts +17 -1
- package/src/factory.ts +10 -12
- package/src/job/epoch-proving-job.ts +16 -1
- package/src/metrics.ts +1 -1
- package/src/monitors/epoch-monitor.ts +11 -2
- package/src/prover-node-publisher.ts +2 -19
- package/src/prover-node.ts +5 -2
- package/src/prover-publisher-factory.ts +9 -0
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
|
+
proverNodeDisableProofPublish?: boolean;
|
|
20
|
+
proverNodeEpochProvingDelayMs: number | undefined;
|
|
19
21
|
txGatheringTimeoutMs: number;
|
|
20
22
|
txGatheringIntervalMs: number;
|
|
21
23
|
txGatheringBatchSize: number;
|
package/dest/config.d.ts.map
CHANGED
|
@@ -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,
|
|
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,CAAC,EAAE,OAAO,CAAC;IACxC,6BAA6B,EAAE,MAAM,GAAG,SAAS,CAAC;IAClD,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,6 +1,6 @@
|
|
|
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
5
|
import { ethPrivateKeySchema, keyStoreConfigMappings } from '@aztec/node-keystore';
|
|
6
6
|
import { sharedNodeConfigMappings } from '@aztec/node-lib/config';
|
|
@@ -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 = {
|
package/dest/factory.d.ts.map
CHANGED
|
@@ -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,
|
|
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,uBAsKP"}
|
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
|
|
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';
|
|
@@ -90,8 +91,13 @@ import { ProverPublisherFactory } from './prover-publisher-factory.js';
|
|
|
90
91
|
const rollupContract = new RollupContract(publicClient, config.l1Contracts.rollupAddress.toString());
|
|
91
92
|
const l1TxUtils = deps.l1TxUtils ? [
|
|
92
93
|
deps.l1TxUtils
|
|
93
|
-
] : proverSigners.signers
|
|
94
|
-
|
|
94
|
+
] : await createL1TxUtilsFromEthSignerWithStore(publicClient, proverSigners.signers, {
|
|
95
|
+
...config,
|
|
96
|
+
scope: 'prover'
|
|
97
|
+
}, {
|
|
98
|
+
telemetry,
|
|
99
|
+
logger: log.createChild('l1-tx-utils'),
|
|
100
|
+
dateProvider
|
|
95
101
|
});
|
|
96
102
|
const publisherFactory = deps.publisherFactory ?? new ProverPublisherFactory(config, {
|
|
97
103
|
rollupContract,
|
|
@@ -106,10 +112,11 @@ import { ProverPublisherFactory } from './prover-publisher-factory.js';
|
|
|
106
112
|
});
|
|
107
113
|
await p2pClient.start();
|
|
108
114
|
const proverNodeConfig = {
|
|
109
|
-
...pick(config, 'proverNodeMaxPendingJobs', 'proverNodeMaxParallelBlocksPerEpoch', 'proverNodePollingIntervalMs', 'txGatheringMaxParallelRequests', 'txGatheringIntervalMs', 'txGatheringTimeoutMs', 'proverNodeFailedEpochStore', 'dataDirectory', 'l1ChainId', 'rollupVersion')
|
|
115
|
+
...pick(config, 'proverNodeMaxPendingJobs', 'proverNodeMaxParallelBlocksPerEpoch', 'proverNodePollingIntervalMs', 'proverNodeEpochProvingDelayMs', 'txGatheringMaxParallelRequests', 'txGatheringIntervalMs', 'txGatheringTimeoutMs', 'proverNodeFailedEpochStore', 'dataDirectory', 'l1ChainId', 'rollupVersion')
|
|
110
116
|
};
|
|
111
117
|
const epochMonitor = await EpochMonitor.create(archiver, {
|
|
112
|
-
pollingIntervalMs: config.proverNodePollingIntervalMs
|
|
118
|
+
pollingIntervalMs: config.proverNodePollingIntervalMs,
|
|
119
|
+
provingDelayMs: config.proverNodeEpochProvingDelayMs
|
|
113
120
|
}, telemetry);
|
|
114
121
|
const l1Metrics = new L1Metrics(telemetry.getMeter('ProverNodeL1Metrics'), publicClient, l1TxUtils.map((utils)=>utils.getSenderAddress()));
|
|
115
122
|
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
|
|
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,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;IAiIhB;;;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"}
|
|
@@ -154,6 +154,12 @@ import { validateEpochProvingJobData } from './epoch-proving-job-data.js';
|
|
|
154
154
|
duration: timer.ms()
|
|
155
155
|
});
|
|
156
156
|
this.progressState('publishing-proof');
|
|
157
|
+
if (this.config.skipSubmitProof) {
|
|
158
|
+
this.log.info(`Proof publishing is disabled. Dropping valid proof for epoch ${epochNumber} (blocks ${fromBlock} to ${toBlock})`);
|
|
159
|
+
this.state = 'completed';
|
|
160
|
+
this.metrics.recordProvingJob(executionTime, timer.ms(), epochSizeBlocks, epochSizeTxs);
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
157
163
|
const success = await this.publisher.submitEpochProof({
|
|
158
164
|
fromBlock,
|
|
159
165
|
toBlock,
|
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.
|
|
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":"
|
|
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;
|
|
@@ -20,9 +20,6 @@ export type L1SubmitEpochProofArgs = {
|
|
|
20
20
|
proof: Proof;
|
|
21
21
|
};
|
|
22
22
|
export declare class ProverNodePublisher {
|
|
23
|
-
private enabled;
|
|
24
|
-
private interruptibleSleep;
|
|
25
|
-
private sleepTimeMs;
|
|
26
23
|
private interrupted;
|
|
27
24
|
private metrics;
|
|
28
25
|
protected log: import("@aztec/foundation/log").Logger;
|
|
@@ -57,6 +54,5 @@ export declare class ProverNodePublisher {
|
|
|
57
54
|
private sendSubmitEpochProofTx;
|
|
58
55
|
private getEpochProofPublicInputsArgs;
|
|
59
56
|
private getSubmitEpochProofArgs;
|
|
60
|
-
protected sleepOrInterrupted(): Promise<void>;
|
|
61
57
|
}
|
|
62
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,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;
|
|
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,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;YAiDN,4BAA4B;YA0D5B,sBAAsB;IAyCpC,OAAO,CAAC,6BAA6B;IAyBrC,OAAO,CAAC,uBAAuB;CAuBhC"}
|
|
@@ -5,7 +5,6 @@ import { areArraysEqual } from '@aztec/foundation/collection';
|
|
|
5
5
|
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
6
6
|
import { Fr } from '@aztec/foundation/fields';
|
|
7
7
|
import { createLogger } from '@aztec/foundation/log';
|
|
8
|
-
import { InterruptibleSleep } from '@aztec/foundation/sleep';
|
|
9
8
|
import { Timer } from '@aztec/foundation/timer';
|
|
10
9
|
import { RollupAbi } from '@aztec/l1-artifacts';
|
|
11
10
|
import { CommitteeAttestation, CommitteeAttestationsAndSigners } from '@aztec/stdlib/block';
|
|
@@ -14,17 +13,12 @@ import { inspect } from 'util';
|
|
|
14
13
|
import { encodeFunctionData } from 'viem';
|
|
15
14
|
import { ProverNodePublisherMetrics } from './metrics.js';
|
|
16
15
|
export class ProverNodePublisher {
|
|
17
|
-
enabled;
|
|
18
|
-
interruptibleSleep = new InterruptibleSleep();
|
|
19
|
-
sleepTimeMs;
|
|
20
16
|
interrupted = false;
|
|
21
17
|
metrics;
|
|
22
18
|
log = createLogger('prover-node:l1-tx-publisher');
|
|
23
19
|
rollupContract;
|
|
24
20
|
l1TxUtils;
|
|
25
21
|
constructor(config, deps){
|
|
26
|
-
this.enabled = config.publisherEnabled ?? true;
|
|
27
|
-
this.sleepTimeMs = config?.l1PublishRetryIntervalMS ?? 60_000;
|
|
28
22
|
const telemetry = deps.telemetry ?? getTelemetryClient();
|
|
29
23
|
this.metrics = new ProverNodePublisherMetrics(telemetry, 'ProverNode');
|
|
30
24
|
this.rollupContract = deps.rollupContract;
|
|
@@ -40,10 +34,11 @@ export class ProverNodePublisher {
|
|
|
40
34
|
* A call to `restart` is required before you can continue publishing.
|
|
41
35
|
*/ interrupt() {
|
|
42
36
|
this.interrupted = true;
|
|
43
|
-
this.
|
|
37
|
+
this.l1TxUtils.interrupt();
|
|
44
38
|
}
|
|
45
39
|
/** Restarts the publisher after calling `interrupt`. */ restart() {
|
|
46
40
|
this.interrupted = false;
|
|
41
|
+
this.l1TxUtils.restart();
|
|
47
42
|
}
|
|
48
43
|
getSenderAddress() {
|
|
49
44
|
return this.l1TxUtils.getSenderAddress();
|
|
@@ -55,10 +50,6 @@ export class ProverNodePublisher {
|
|
|
55
50
|
fromBlock,
|
|
56
51
|
toBlock
|
|
57
52
|
};
|
|
58
|
-
if (!this.enabled) {
|
|
59
|
-
this.log.warn(`Publishing L1 txs is disabled`);
|
|
60
|
-
return false;
|
|
61
|
-
}
|
|
62
53
|
if (!this.interrupted) {
|
|
63
54
|
const timer = new Timer();
|
|
64
55
|
// Validate epoch proof range and hashes are correct before submitting
|
|
@@ -95,7 +86,6 @@ export class ProverNodePublisher {
|
|
|
95
86
|
}
|
|
96
87
|
this.metrics.recordFailedTx();
|
|
97
88
|
this.log.error(`Rollup.submitEpochProof tx status failed ${txReceipt.transactionHash}`, undefined, ctx);
|
|
98
|
-
await this.sleepOrInterrupted();
|
|
99
89
|
}
|
|
100
90
|
this.log.verbose('L2 block data syncing interrupted', ctx);
|
|
101
91
|
return false;
|
|
@@ -198,7 +188,4 @@ export class ProverNodePublisher {
|
|
|
198
188
|
proof: proofHex
|
|
199
189
|
};
|
|
200
190
|
}
|
|
201
|
-
async sleepOrInterrupted() {
|
|
202
|
-
await this.interruptibleSleep.sleep(this.sleepTimeMs);
|
|
203
|
-
}
|
|
204
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":"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"}
|
package/dest/prover-node.js
CHANGED
|
@@ -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;
|
|
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.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/prover-node",
|
|
3
|
-
"version": "2.1.0-rc.
|
|
3
|
+
"version": "2.1.0-rc.2",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": "./dest/index.js",
|
|
@@ -56,27 +56,27 @@
|
|
|
56
56
|
]
|
|
57
57
|
},
|
|
58
58
|
"dependencies": {
|
|
59
|
-
"@aztec/archiver": "2.1.0-rc.
|
|
60
|
-
"@aztec/bb-prover": "2.1.0-rc.
|
|
61
|
-
"@aztec/blob-lib": "2.1.0-rc.
|
|
62
|
-
"@aztec/blob-sink": "2.1.0-rc.
|
|
63
|
-
"@aztec/constants": "2.1.0-rc.
|
|
64
|
-
"@aztec/epoch-cache": "2.1.0-rc.
|
|
65
|
-
"@aztec/ethereum": "2.1.0-rc.
|
|
66
|
-
"@aztec/foundation": "2.1.0-rc.
|
|
67
|
-
"@aztec/kv-store": "2.1.0-rc.
|
|
68
|
-
"@aztec/l1-artifacts": "2.1.0-rc.
|
|
69
|
-
"@aztec/node-keystore": "2.1.0-rc.
|
|
70
|
-
"@aztec/node-lib": "2.1.0-rc.
|
|
71
|
-
"@aztec/noir-protocol-circuits-types": "2.1.0-rc.
|
|
72
|
-
"@aztec/p2p": "2.1.0-rc.
|
|
73
|
-
"@aztec/protocol-contracts": "2.1.0-rc.
|
|
74
|
-
"@aztec/prover-client": "2.1.0-rc.
|
|
75
|
-
"@aztec/sequencer-client": "2.1.0-rc.
|
|
76
|
-
"@aztec/simulator": "2.1.0-rc.
|
|
77
|
-
"@aztec/stdlib": "2.1.0-rc.
|
|
78
|
-
"@aztec/telemetry-client": "2.1.0-rc.
|
|
79
|
-
"@aztec/world-state": "2.1.0-rc.
|
|
59
|
+
"@aztec/archiver": "2.1.0-rc.2",
|
|
60
|
+
"@aztec/bb-prover": "2.1.0-rc.2",
|
|
61
|
+
"@aztec/blob-lib": "2.1.0-rc.2",
|
|
62
|
+
"@aztec/blob-sink": "2.1.0-rc.2",
|
|
63
|
+
"@aztec/constants": "2.1.0-rc.2",
|
|
64
|
+
"@aztec/epoch-cache": "2.1.0-rc.2",
|
|
65
|
+
"@aztec/ethereum": "2.1.0-rc.2",
|
|
66
|
+
"@aztec/foundation": "2.1.0-rc.2",
|
|
67
|
+
"@aztec/kv-store": "2.1.0-rc.2",
|
|
68
|
+
"@aztec/l1-artifacts": "2.1.0-rc.2",
|
|
69
|
+
"@aztec/node-keystore": "2.1.0-rc.2",
|
|
70
|
+
"@aztec/node-lib": "2.1.0-rc.2",
|
|
71
|
+
"@aztec/noir-protocol-circuits-types": "2.1.0-rc.2",
|
|
72
|
+
"@aztec/p2p": "2.1.0-rc.2",
|
|
73
|
+
"@aztec/protocol-contracts": "2.1.0-rc.2",
|
|
74
|
+
"@aztec/prover-client": "2.1.0-rc.2",
|
|
75
|
+
"@aztec/sequencer-client": "2.1.0-rc.2",
|
|
76
|
+
"@aztec/simulator": "2.1.0-rc.2",
|
|
77
|
+
"@aztec/stdlib": "2.1.0-rc.2",
|
|
78
|
+
"@aztec/telemetry-client": "2.1.0-rc.2",
|
|
79
|
+
"@aztec/world-state": "2.1.0-rc.2",
|
|
80
80
|
"source-map-support": "^0.5.21",
|
|
81
81
|
"tslib": "^2.4.0",
|
|
82
82
|
"viem": "2.23.7"
|
package/src/config.ts
CHANGED
|
@@ -1,7 +1,12 @@
|
|
|
1
1
|
import { type ArchiverConfig, archiverConfigMappings } from '@aztec/archiver/config';
|
|
2
2
|
import type { ACVMConfig, BBConfig } from '@aztec/bb-prover/config';
|
|
3
3
|
import { type GenesisStateConfig, genesisStateConfigMappings } from '@aztec/ethereum';
|
|
4
|
-
import {
|
|
4
|
+
import {
|
|
5
|
+
type ConfigMappingsType,
|
|
6
|
+
booleanConfigHelper,
|
|
7
|
+
getConfigFromMappings,
|
|
8
|
+
numberConfigHelper,
|
|
9
|
+
} from '@aztec/foundation/config';
|
|
5
10
|
import { type DataStoreConfig, dataConfigMappings } from '@aztec/kv-store/config';
|
|
6
11
|
import { type KeyStore, type KeyStoreConfig, ethPrivateKeySchema, keyStoreConfigMappings } from '@aztec/node-keystore';
|
|
7
12
|
import { type SharedNodeConfig, sharedNodeConfigMappings } from '@aztec/node-lib/config';
|
|
@@ -38,6 +43,8 @@ export type SpecificProverNodeConfig = {
|
|
|
38
43
|
proverNodePollingIntervalMs: number;
|
|
39
44
|
proverNodeMaxParallelBlocksPerEpoch: number;
|
|
40
45
|
proverNodeFailedEpochStore: string | undefined;
|
|
46
|
+
proverNodeDisableProofPublish?: boolean;
|
|
47
|
+
proverNodeEpochProvingDelayMs: number | undefined;
|
|
41
48
|
txGatheringTimeoutMs: number;
|
|
42
49
|
txGatheringIntervalMs: number;
|
|
43
50
|
txGatheringBatchSize: number;
|
|
@@ -65,6 +72,10 @@ const specificProverNodeConfigMappings: ConfigMappingsType<SpecificProverNodeCon
|
|
|
65
72
|
description: 'File store where to upload node state when an epoch fails to be proven',
|
|
66
73
|
defaultValue: undefined,
|
|
67
74
|
},
|
|
75
|
+
proverNodeEpochProvingDelayMs: {
|
|
76
|
+
description: 'Optional delay in milliseconds to wait before proving a new epoch',
|
|
77
|
+
defaultValue: undefined,
|
|
78
|
+
},
|
|
68
79
|
txGatheringIntervalMs: {
|
|
69
80
|
env: 'PROVER_NODE_TX_GATHERING_INTERVAL_MS',
|
|
70
81
|
description: 'How often to check that tx data is available',
|
|
@@ -85,6 +96,11 @@ const specificProverNodeConfigMappings: ConfigMappingsType<SpecificProverNodeCon
|
|
|
85
96
|
description: 'How long to wait for tx data to be available before giving up',
|
|
86
97
|
...numberConfigHelper(120_000),
|
|
87
98
|
},
|
|
99
|
+
proverNodeDisableProofPublish: {
|
|
100
|
+
env: 'PROVER_NODE_DISABLE_PROOF_PUBLISH',
|
|
101
|
+
description: 'Whether the prover node skips publishing proofs to L1',
|
|
102
|
+
...booleanConfigHelper(false),
|
|
103
|
+
},
|
|
88
104
|
};
|
|
89
105
|
|
|
90
106
|
export const proverNodeConfigMappings: ConfigMappingsType<ProverNodeConfig> = {
|
package/src/factory.ts
CHANGED
|
@@ -2,20 +2,14 @@ import { type Archiver, createArchiver } from '@aztec/archiver';
|
|
|
2
2
|
import { BBCircuitVerifier, QueuedIVCVerifier, TestCircuitVerifier } from '@aztec/bb-prover';
|
|
3
3
|
import { type BlobSinkClientInterface, createBlobSinkClient } from '@aztec/blob-sink/client';
|
|
4
4
|
import { EpochCache } from '@aztec/epoch-cache';
|
|
5
|
-
import {
|
|
6
|
-
type EthSigner,
|
|
7
|
-
L1TxUtils,
|
|
8
|
-
PublisherManager,
|
|
9
|
-
RollupContract,
|
|
10
|
-
createEthereumChain,
|
|
11
|
-
createL1TxUtilsFromEthSigner,
|
|
12
|
-
} from '@aztec/ethereum';
|
|
5
|
+
import { L1TxUtils, PublisherManager, RollupContract, createEthereumChain } from '@aztec/ethereum';
|
|
13
6
|
import { pick } from '@aztec/foundation/collection';
|
|
14
7
|
import { type Logger, createLogger } from '@aztec/foundation/log';
|
|
15
8
|
import { DateProvider } from '@aztec/foundation/timer';
|
|
16
9
|
import type { DataStoreConfig } from '@aztec/kv-store/config';
|
|
17
10
|
import { type KeyStoreConfig, KeystoreManager, loadKeystores, mergeKeystores } from '@aztec/node-keystore';
|
|
18
11
|
import { trySnapshotSync } from '@aztec/node-lib/actions';
|
|
12
|
+
import { createL1TxUtilsFromEthSignerWithStore } from '@aztec/node-lib/factories';
|
|
19
13
|
import { NodeRpcTxSource, createP2PClient } from '@aztec/p2p';
|
|
20
14
|
import { type ProverClientConfig, createProverClient } from '@aztec/prover-client';
|
|
21
15
|
import { createAndStartProvingBroker } from '@aztec/prover-client/broker';
|
|
@@ -135,9 +129,12 @@ export async function createProverNode(
|
|
|
135
129
|
|
|
136
130
|
const l1TxUtils = deps.l1TxUtils
|
|
137
131
|
? [deps.l1TxUtils]
|
|
138
|
-
:
|
|
139
|
-
|
|
140
|
-
|
|
132
|
+
: await createL1TxUtilsFromEthSignerWithStore(
|
|
133
|
+
publicClient,
|
|
134
|
+
proverSigners.signers,
|
|
135
|
+
{ ...config, scope: 'prover' },
|
|
136
|
+
{ telemetry, logger: log.createChild('l1-tx-utils'), dateProvider },
|
|
137
|
+
);
|
|
141
138
|
|
|
142
139
|
const publisherFactory =
|
|
143
140
|
deps.publisherFactory ??
|
|
@@ -177,6 +174,7 @@ export async function createProverNode(
|
|
|
177
174
|
'proverNodeMaxPendingJobs',
|
|
178
175
|
'proverNodeMaxParallelBlocksPerEpoch',
|
|
179
176
|
'proverNodePollingIntervalMs',
|
|
177
|
+
'proverNodeEpochProvingDelayMs',
|
|
180
178
|
'txGatheringMaxParallelRequests',
|
|
181
179
|
'txGatheringIntervalMs',
|
|
182
180
|
'txGatheringTimeoutMs',
|
|
@@ -189,7 +187,7 @@ export async function createProverNode(
|
|
|
189
187
|
|
|
190
188
|
const epochMonitor = await EpochMonitor.create(
|
|
191
189
|
archiver,
|
|
192
|
-
{ pollingIntervalMs: config.proverNodePollingIntervalMs },
|
|
190
|
+
{ pollingIntervalMs: config.proverNodePollingIntervalMs, provingDelayMs: config.proverNodeEpochProvingDelayMs },
|
|
193
191
|
telemetry,
|
|
194
192
|
);
|
|
195
193
|
|
|
@@ -24,6 +24,12 @@ import type { ProverNodeJobMetrics } from '../metrics.js';
|
|
|
24
24
|
import type { ProverNodePublisher } from '../prover-node-publisher.js';
|
|
25
25
|
import { type EpochProvingJobData, validateEpochProvingJobData } from './epoch-proving-job-data.js';
|
|
26
26
|
|
|
27
|
+
export type EpochProvingJobOptions = {
|
|
28
|
+
parallelBlockLimit?: number;
|
|
29
|
+
skipEpochCheck?: boolean;
|
|
30
|
+
skipSubmitProof?: boolean;
|
|
31
|
+
};
|
|
32
|
+
|
|
27
33
|
/**
|
|
28
34
|
* Job that grabs a range of blocks from the unfinalized chain from L1, gets their txs given their hashes,
|
|
29
35
|
* re-executes their public calls, generates a rollup proof, and submits it to L1. This job will update the
|
|
@@ -49,7 +55,7 @@ export class EpochProvingJob implements Traceable {
|
|
|
49
55
|
private l2BlockSource: L2BlockSource | undefined,
|
|
50
56
|
private metrics: ProverNodeJobMetrics,
|
|
51
57
|
private deadline: Date | undefined,
|
|
52
|
-
private config:
|
|
58
|
+
private config: EpochProvingJobOptions,
|
|
53
59
|
) {
|
|
54
60
|
validateEpochProvingJobData(data);
|
|
55
61
|
this.uuid = crypto.randomUUID();
|
|
@@ -178,6 +184,15 @@ export class EpochProvingJob implements Traceable {
|
|
|
178
184
|
|
|
179
185
|
this.progressState('publishing-proof');
|
|
180
186
|
|
|
187
|
+
if (this.config.skipSubmitProof) {
|
|
188
|
+
this.log.info(
|
|
189
|
+
`Proof publishing is disabled. Dropping valid proof for epoch ${epochNumber} (blocks ${fromBlock} to ${toBlock})`,
|
|
190
|
+
);
|
|
191
|
+
this.state = 'completed';
|
|
192
|
+
this.metrics.recordProvingJob(executionTime, timer.ms(), epochSizeBlocks, epochSizeTxs);
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
|
|
181
196
|
const success = await this.publisher.submitEpochProof({
|
|
182
197
|
fromBlock,
|
|
183
198
|
toBlock,
|
package/src/metrics.ts
CHANGED
|
@@ -91,7 +91,7 @@ export class ProverNodeRewardsMetrics {
|
|
|
91
91
|
}
|
|
92
92
|
|
|
93
93
|
private observe = async (observer: BatchObservableResult): Promise<void> => {
|
|
94
|
-
const epoch = await this.rollup.
|
|
94
|
+
const epoch = await this.rollup.getCurrentEpochNumber();
|
|
95
95
|
|
|
96
96
|
if (epoch > this.proofSubmissionEpochs) {
|
|
97
97
|
// look at the prev epoch so that we get an accurate value, after proof submission window has closed
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { createLogger } from '@aztec/foundation/log';
|
|
2
2
|
import { RunningPromise } from '@aztec/foundation/running-promise';
|
|
3
|
+
import { sleep } from '@aztec/foundation/sleep';
|
|
3
4
|
import type { L2BlockSource } from '@aztec/stdlib/block';
|
|
4
5
|
import { type L1RollupConstants, getEpochAtSlot } from '@aztec/stdlib/epoch-helpers';
|
|
5
6
|
import {
|
|
@@ -36,16 +37,19 @@ export class EpochMonitor implements Traceable {
|
|
|
36
37
|
constructor(
|
|
37
38
|
private readonly l2BlockSource: L2BlockSource,
|
|
38
39
|
private readonly l1Constants: Pick<L1RollupConstants, 'epochDuration'>,
|
|
39
|
-
private options: { pollingIntervalMs: number },
|
|
40
|
+
private options: { pollingIntervalMs: number; provingDelayMs?: number },
|
|
40
41
|
telemetry: TelemetryClient = getTelemetryClient(),
|
|
41
42
|
) {
|
|
42
43
|
this.tracer = telemetry.getTracer('EpochMonitor');
|
|
43
44
|
this.runningPromise = new RunningPromise(this.work.bind(this), this.log, this.options.pollingIntervalMs);
|
|
45
|
+
if (this.options.provingDelayMs) {
|
|
46
|
+
this.log.warn(`Prover node epoch monitor running with delay of ${this.options.provingDelayMs}ms`);
|
|
47
|
+
}
|
|
44
48
|
}
|
|
45
49
|
|
|
46
50
|
public static async create(
|
|
47
51
|
l2BlockSource: L2BlockSource,
|
|
48
|
-
options: { pollingIntervalMs: number },
|
|
52
|
+
options: { pollingIntervalMs: number; provingDelayMs?: number },
|
|
49
53
|
telemetry: TelemetryClient = getTelemetryClient(),
|
|
50
54
|
): Promise<EpochMonitor> {
|
|
51
55
|
const l1Constants = await l2BlockSource.getL1Constants();
|
|
@@ -87,6 +91,11 @@ export class EpochMonitor implements Traceable {
|
|
|
87
91
|
return;
|
|
88
92
|
}
|
|
89
93
|
|
|
94
|
+
if (this.options.provingDelayMs) {
|
|
95
|
+
this.log.debug(`Waiting ${this.options.provingDelayMs}ms before proving epoch ${epochToProve}`);
|
|
96
|
+
await sleep(this.options.provingDelayMs);
|
|
97
|
+
}
|
|
98
|
+
|
|
90
99
|
this.log.debug(`Epoch ${epochToProve} is ready to be proven`);
|
|
91
100
|
if (await this.handler?.handleEpochReadyToProve(epochToProve)) {
|
|
92
101
|
this.latestEpochNumber = epochToProve;
|
|
@@ -7,7 +7,6 @@ import { EthAddress } from '@aztec/foundation/eth-address';
|
|
|
7
7
|
import { Fr } from '@aztec/foundation/fields';
|
|
8
8
|
import { createLogger } from '@aztec/foundation/log';
|
|
9
9
|
import type { Tuple } from '@aztec/foundation/serialize';
|
|
10
|
-
import { InterruptibleSleep } from '@aztec/foundation/sleep';
|
|
11
10
|
import { Timer } from '@aztec/foundation/timer';
|
|
12
11
|
import { RollupAbi } from '@aztec/l1-artifacts';
|
|
13
12
|
import type { PublisherConfig, TxSenderConfig } from '@aztec/sequencer-client';
|
|
@@ -35,9 +34,6 @@ export type L1SubmitEpochProofArgs = {
|
|
|
35
34
|
};
|
|
36
35
|
|
|
37
36
|
export class ProverNodePublisher {
|
|
38
|
-
private enabled: boolean;
|
|
39
|
-
private interruptibleSleep = new InterruptibleSleep();
|
|
40
|
-
private sleepTimeMs: number;
|
|
41
37
|
private interrupted = false;
|
|
42
38
|
private metrics: ProverNodePublisherMetrics;
|
|
43
39
|
|
|
@@ -55,9 +51,6 @@ export class ProverNodePublisher {
|
|
|
55
51
|
telemetry?: TelemetryClient;
|
|
56
52
|
},
|
|
57
53
|
) {
|
|
58
|
-
this.enabled = config.publisherEnabled ?? true;
|
|
59
|
-
this.sleepTimeMs = config?.l1PublishRetryIntervalMS ?? 60_000;
|
|
60
|
-
|
|
61
54
|
const telemetry = deps.telemetry ?? getTelemetryClient();
|
|
62
55
|
|
|
63
56
|
this.metrics = new ProverNodePublisherMetrics(telemetry, 'ProverNode');
|
|
@@ -78,12 +71,13 @@ export class ProverNodePublisher {
|
|
|
78
71
|
*/
|
|
79
72
|
public interrupt() {
|
|
80
73
|
this.interrupted = true;
|
|
81
|
-
this.
|
|
74
|
+
this.l1TxUtils.interrupt();
|
|
82
75
|
}
|
|
83
76
|
|
|
84
77
|
/** Restarts the publisher after calling `interrupt`. */
|
|
85
78
|
public restart() {
|
|
86
79
|
this.interrupted = false;
|
|
80
|
+
this.l1TxUtils.restart();
|
|
87
81
|
}
|
|
88
82
|
|
|
89
83
|
public getSenderAddress() {
|
|
@@ -101,12 +95,6 @@ export class ProverNodePublisher {
|
|
|
101
95
|
}): Promise<boolean> {
|
|
102
96
|
const { epochNumber, fromBlock, toBlock } = args;
|
|
103
97
|
const ctx = { epochNumber, fromBlock, toBlock };
|
|
104
|
-
|
|
105
|
-
if (!this.enabled) {
|
|
106
|
-
this.log.warn(`Publishing L1 txs is disabled`);
|
|
107
|
-
return false;
|
|
108
|
-
}
|
|
109
|
-
|
|
110
98
|
if (!this.interrupted) {
|
|
111
99
|
const timer = new Timer();
|
|
112
100
|
// Validate epoch proof range and hashes are correct before submitting
|
|
@@ -147,7 +135,6 @@ export class ProverNodePublisher {
|
|
|
147
135
|
|
|
148
136
|
this.metrics.recordFailedTx();
|
|
149
137
|
this.log.error(`Rollup.submitEpochProof tx status failed ${txReceipt.transactionHash}`, undefined, ctx);
|
|
150
|
-
await this.sleepOrInterrupted();
|
|
151
138
|
}
|
|
152
139
|
|
|
153
140
|
this.log.verbose('L2 block data syncing interrupted', ctx);
|
|
@@ -301,8 +288,4 @@ export class ProverNodePublisher {
|
|
|
301
288
|
proof: proofHex,
|
|
302
289
|
};
|
|
303
290
|
}
|
|
304
|
-
|
|
305
|
-
protected async sleepOrInterrupted() {
|
|
306
|
-
await this.interruptibleSleep.sleep(this.sleepTimeMs);
|
|
307
|
-
}
|
|
308
291
|
}
|
package/src/prover-node.ts
CHANGED
|
@@ -87,6 +87,7 @@ export class ProverNode implements EpochMonitorHandler, ProverNodeApi, Traceable
|
|
|
87
87
|
txGatheringMaxParallelRequestsPerNode: 100,
|
|
88
88
|
txGatheringTimeoutMs: 120_000,
|
|
89
89
|
proverNodeFailedEpochStore: undefined,
|
|
90
|
+
proverNodeEpochProvingDelayMs: undefined,
|
|
90
91
|
...compact(config),
|
|
91
92
|
};
|
|
92
93
|
|
|
@@ -143,6 +144,7 @@ export class ProverNode implements EpochMonitorHandler, ProverNodeApi, Traceable
|
|
|
143
144
|
*/
|
|
144
145
|
async start() {
|
|
145
146
|
this.epochsMonitor.start(this);
|
|
147
|
+
await this.publisherFactory.start();
|
|
146
148
|
this.publisher = await this.publisherFactory.create();
|
|
147
149
|
await this.rewardsMetrics.start();
|
|
148
150
|
this.l1Metrics.start();
|
|
@@ -158,6 +160,7 @@ export class ProverNode implements EpochMonitorHandler, ProverNodeApi, Traceable
|
|
|
158
160
|
await this.prover.stop();
|
|
159
161
|
await tryStop(this.p2pClient);
|
|
160
162
|
await tryStop(this.l2BlockSource);
|
|
163
|
+
await tryStop(this.publisherFactory);
|
|
161
164
|
this.publisher?.interrupt();
|
|
162
165
|
await Promise.all(Array.from(this.jobs.values()).map(job => job.stop()));
|
|
163
166
|
await this.worldState.stop();
|
|
@@ -366,7 +369,7 @@ export class ProverNode implements EpochMonitorHandler, ProverNodeApi, Traceable
|
|
|
366
369
|
publisher: ProverNodePublisher,
|
|
367
370
|
opts: { skipEpochCheck?: boolean } = {},
|
|
368
371
|
) {
|
|
369
|
-
const { proverNodeMaxParallelBlocksPerEpoch: parallelBlockLimit } = this.config;
|
|
372
|
+
const { proverNodeMaxParallelBlocksPerEpoch: parallelBlockLimit, proverNodeDisableProofPublish } = this.config;
|
|
370
373
|
return new EpochProvingJob(
|
|
371
374
|
data,
|
|
372
375
|
this.worldState,
|
|
@@ -376,7 +379,7 @@ export class ProverNode implements EpochMonitorHandler, ProverNodeApi, Traceable
|
|
|
376
379
|
this.l2BlockSource,
|
|
377
380
|
this.jobMetrics,
|
|
378
381
|
deadline,
|
|
379
|
-
{ parallelBlockLimit, ...opts },
|
|
382
|
+
{ parallelBlockLimit, skipSubmitProof: proverNodeDisableProofPublish, ...opts },
|
|
380
383
|
);
|
|
381
384
|
}
|
|
382
385
|
|
|
@@ -13,6 +13,15 @@ export class ProverPublisherFactory {
|
|
|
13
13
|
telemetry?: TelemetryClient;
|
|
14
14
|
},
|
|
15
15
|
) {}
|
|
16
|
+
|
|
17
|
+
public async start() {
|
|
18
|
+
await this.deps.publisherManager.loadState();
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
public stop() {
|
|
22
|
+
this.deps.publisherManager.interrupt();
|
|
23
|
+
}
|
|
24
|
+
|
|
16
25
|
/**
|
|
17
26
|
* Creates a new Prover Publisher instance.
|
|
18
27
|
* @returns A new ProverNodePublisher instance.
|