@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.
- package/dest/bin/run-failed-epoch.js +1 -1
- package/dest/config.d.ts +2 -0
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +18 -13
- package/dest/factory.d.ts.map +1 -1
- package/dest/factory.js +15 -6
- 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 +41 -9
- 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 +2 -5
- package/dest/prover-node-publisher.d.ts.map +1 -1
- package/dest/prover-node-publisher.js +8 -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 +23 -23
- package/src/bin/run-failed-epoch.ts +1 -1
- package/src/config.ts +29 -28
- package/src/factory.ts +15 -13
- package/src/job/epoch-proving-job.ts +62 -13
- package/src/metrics.ts +1 -1
- package/src/monitors/epoch-monitor.ts +11 -2
- package/src/prover-node-publisher.ts +13 -22
- package/src/prover-node.ts +5 -2
- package/src/prover-publisher-factory.ts +9 -0
|
@@ -18,7 +18,7 @@ async function rerunFailedEpoch(provingJobUrl, baseLocalDir) {
|
|
|
18
18
|
const config = {
|
|
19
19
|
...getProverNodeConfigFromEnv(),
|
|
20
20
|
dataDirectory: dataDir,
|
|
21
|
-
|
|
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;
|
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,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
|
|
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
|
|
124
|
+
prover: config.proverId === undefined ? publisherKeys[0] : {
|
|
125
|
+
id: config.proverId,
|
|
126
|
+
publisher: publisherKeys
|
|
122
127
|
},
|
|
123
128
|
remoteSigner: undefined,
|
|
124
129
|
validators: undefined
|
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,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
|
|
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
|
|
93
|
-
|
|
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":"
|
|
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
|
|
112
|
-
const finalBlobBatchingChallenges = await
|
|
113
|
-
|
|
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(
|
|
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,
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { BatchedBlob } from '@aztec/blob-lib';
|
|
2
2
|
import { AZTEC_MAX_EPOCH_DURATION } from '@aztec/constants';
|
|
3
|
-
import {
|
|
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,
|
|
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.
|
|
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
|
-
|
|
121
|
-
|
|
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:
|
|
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":"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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.
|