@aztec/prover-node 4.0.0-nightly.20250907 → 4.0.0-nightly.20260107
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/actions/download-epoch-proving-job.d.ts +4 -4
- package/dest/actions/index.d.ts +1 -1
- package/dest/actions/rerun-epoch-proving-job.d.ts +2 -2
- package/dest/actions/upload-epoch-proof-failure.d.ts +1 -1
- package/dest/bin/run-failed-epoch.d.ts +1 -1
- package/dest/bin/run-failed-epoch.js +1 -1
- package/dest/config.d.ts +7 -4
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +21 -15
- package/dest/factory.d.ts +2 -4
- package/dest/factory.d.ts.map +1 -1
- package/dest/factory.js +24 -13
- package/dest/index.d.ts +1 -1
- package/dest/job/epoch-proving-job-data.d.ts +8 -6
- package/dest/job/epoch-proving-job-data.d.ts.map +1 -1
- package/dest/job/epoch-proving-job-data.js +25 -18
- package/dest/job/epoch-proving-job.d.ts +11 -16
- package/dest/job/epoch-proving-job.d.ts.map +1 -1
- package/dest/job/epoch-proving-job.js +493 -77
- package/dest/metrics.d.ts +4 -3
- package/dest/metrics.d.ts.map +1 -1
- package/dest/metrics.js +9 -3
- package/dest/monitors/epoch-monitor.d.ts +5 -2
- package/dest/monitors/epoch-monitor.d.ts.map +1 -1
- package/dest/monitors/epoch-monitor.js +393 -10
- package/dest/monitors/index.d.ts +1 -1
- package/dest/prover-node-publisher.d.ts +9 -10
- package/dest/prover-node-publisher.d.ts.map +1 -1
- package/dest/prover-node-publisher.js +51 -53
- package/dest/prover-node.d.ts +8 -7
- package/dest/prover-node.d.ts.map +1 -1
- package/dest/prover-node.js +435 -50
- package/dest/prover-publisher-factory.d.ts +6 -2
- package/dest/prover-publisher-factory.d.ts.map +1 -1
- package/dest/prover-publisher-factory.js +6 -0
- package/dest/test/index.d.ts +1 -1
- package/dest/test/index.d.ts.map +1 -1
- package/package.json +26 -25
- package/src/bin/run-failed-epoch.ts +2 -2
- package/src/config.ts +33 -30
- package/src/factory.ts +26 -20
- package/src/job/epoch-proving-job-data.ts +31 -25
- package/src/job/epoch-proving-job.ts +138 -82
- package/src/metrics.ts +16 -4
- package/src/monitors/epoch-monitor.ts +15 -5
- package/src/prover-node-publisher.ts +74 -73
- package/src/prover-node.ts +52 -45
- package/src/prover-publisher-factory.ts +12 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/prover-node",
|
|
3
|
-
"version": "4.0.0-nightly.
|
|
3
|
+
"version": "4.0.0-nightly.20260107",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": "./dest/index.js",
|
|
@@ -11,8 +11,8 @@
|
|
|
11
11
|
"../package.common.json"
|
|
12
12
|
],
|
|
13
13
|
"scripts": {
|
|
14
|
-
"build": "yarn clean && tsc
|
|
15
|
-
"build:dev": "tsc
|
|
14
|
+
"build": "yarn clean && ../scripts/tsc.sh",
|
|
15
|
+
"build:dev": "../scripts/tsc.sh --watch",
|
|
16
16
|
"clean": "rm -rf ./dest .tsbuildinfo",
|
|
17
17
|
"bb": "node --no-warnings ./dest/bb/index.js",
|
|
18
18
|
"test": "NODE_NO_WARNINGS=1 node --experimental-vm-modules ../node_modules/.bin/jest --passWithNoTests --maxWorkers=${JEST_MAX_WORKERS:-8}",
|
|
@@ -56,36 +56,37 @@
|
|
|
56
56
|
]
|
|
57
57
|
},
|
|
58
58
|
"dependencies": {
|
|
59
|
-
"@aztec/archiver": "4.0.0-nightly.
|
|
60
|
-
"@aztec/bb-prover": "4.0.0-nightly.
|
|
61
|
-
"@aztec/blob-
|
|
62
|
-
"@aztec/blob-
|
|
63
|
-
"@aztec/constants": "4.0.0-nightly.
|
|
64
|
-
"@aztec/epoch-cache": "4.0.0-nightly.
|
|
65
|
-
"@aztec/ethereum": "4.0.0-nightly.
|
|
66
|
-
"@aztec/foundation": "4.0.0-nightly.
|
|
67
|
-
"@aztec/kv-store": "4.0.0-nightly.
|
|
68
|
-
"@aztec/l1-artifacts": "4.0.0-nightly.
|
|
69
|
-
"@aztec/node-keystore": "4.0.0-nightly.
|
|
70
|
-
"@aztec/node-lib": "4.0.0-nightly.
|
|
71
|
-
"@aztec/noir-protocol-circuits-types": "4.0.0-nightly.
|
|
72
|
-
"@aztec/p2p": "4.0.0-nightly.
|
|
73
|
-
"@aztec/protocol-contracts": "4.0.0-nightly.
|
|
74
|
-
"@aztec/prover-client": "4.0.0-nightly.
|
|
75
|
-
"@aztec/sequencer-client": "4.0.0-nightly.
|
|
76
|
-
"@aztec/simulator": "4.0.0-nightly.
|
|
77
|
-
"@aztec/stdlib": "4.0.0-nightly.
|
|
78
|
-
"@aztec/telemetry-client": "4.0.0-nightly.
|
|
79
|
-
"@aztec/world-state": "4.0.0-nightly.
|
|
59
|
+
"@aztec/archiver": "4.0.0-nightly.20260107",
|
|
60
|
+
"@aztec/bb-prover": "4.0.0-nightly.20260107",
|
|
61
|
+
"@aztec/blob-client": "4.0.0-nightly.20260107",
|
|
62
|
+
"@aztec/blob-lib": "4.0.0-nightly.20260107",
|
|
63
|
+
"@aztec/constants": "4.0.0-nightly.20260107",
|
|
64
|
+
"@aztec/epoch-cache": "4.0.0-nightly.20260107",
|
|
65
|
+
"@aztec/ethereum": "4.0.0-nightly.20260107",
|
|
66
|
+
"@aztec/foundation": "4.0.0-nightly.20260107",
|
|
67
|
+
"@aztec/kv-store": "4.0.0-nightly.20260107",
|
|
68
|
+
"@aztec/l1-artifacts": "4.0.0-nightly.20260107",
|
|
69
|
+
"@aztec/node-keystore": "4.0.0-nightly.20260107",
|
|
70
|
+
"@aztec/node-lib": "4.0.0-nightly.20260107",
|
|
71
|
+
"@aztec/noir-protocol-circuits-types": "4.0.0-nightly.20260107",
|
|
72
|
+
"@aztec/p2p": "4.0.0-nightly.20260107",
|
|
73
|
+
"@aztec/protocol-contracts": "4.0.0-nightly.20260107",
|
|
74
|
+
"@aztec/prover-client": "4.0.0-nightly.20260107",
|
|
75
|
+
"@aztec/sequencer-client": "4.0.0-nightly.20260107",
|
|
76
|
+
"@aztec/simulator": "4.0.0-nightly.20260107",
|
|
77
|
+
"@aztec/stdlib": "4.0.0-nightly.20260107",
|
|
78
|
+
"@aztec/telemetry-client": "4.0.0-nightly.20260107",
|
|
79
|
+
"@aztec/world-state": "4.0.0-nightly.20260107",
|
|
80
80
|
"source-map-support": "^0.5.21",
|
|
81
81
|
"tslib": "^2.4.0",
|
|
82
|
-
"viem": "2.
|
|
82
|
+
"viem": "npm:@aztec/viem@2.38.2"
|
|
83
83
|
},
|
|
84
84
|
"devDependencies": {
|
|
85
85
|
"@jest/globals": "^30.0.0",
|
|
86
86
|
"@types/jest": "^30.0.0",
|
|
87
87
|
"@types/node": "^22.15.17",
|
|
88
88
|
"@types/source-map-support": "^0.5.10",
|
|
89
|
+
"@typescript/native-preview": "7.0.0-dev.20251126.1",
|
|
89
90
|
"jest": "^30.0.0",
|
|
90
91
|
"jest-mock-extended": "^4.0.0",
|
|
91
92
|
"ts-node": "^10.9.1",
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/* eslint-disable no-console */
|
|
2
|
-
import type { L1ContractAddresses } from '@aztec/ethereum';
|
|
2
|
+
import type { L1ContractAddresses } from '@aztec/ethereum/l1-contract-addresses';
|
|
3
3
|
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
4
4
|
import { jsonParseWithSchema, jsonStringify } from '@aztec/foundation/json-rpc';
|
|
5
5
|
import { createLogger } from '@aztec/foundation/log';
|
|
@@ -25,7 +25,7 @@ async function rerunFailedEpoch(provingJobUrl: string, baseLocalDir: string) {
|
|
|
25
25
|
const config = {
|
|
26
26
|
...getProverNodeConfigFromEnv(),
|
|
27
27
|
dataDirectory: dataDir,
|
|
28
|
-
|
|
28
|
+
dataStoreMapSizeKb: env.dataStoreMapSizeKb ?? 1024 * 1024,
|
|
29
29
|
proverId: env.proverId ?? EthAddress.random(),
|
|
30
30
|
};
|
|
31
31
|
|
package/src/config.ts
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
import { type ArchiverConfig, archiverConfigMappings } from '@aztec/archiver/config';
|
|
2
2
|
import type { ACVMConfig, BBConfig } from '@aztec/bb-prover/config';
|
|
3
|
-
import { type GenesisStateConfig, genesisStateConfigMappings } from '@aztec/ethereum';
|
|
4
|
-
import { type ConfigMappingsType, getConfigFromMappings, numberConfigHelper } from '@aztec/foundation/config';
|
|
5
|
-
import { type DataStoreConfig, dataConfigMappings } from '@aztec/kv-store/config';
|
|
3
|
+
import { type GenesisStateConfig, genesisStateConfigMappings } from '@aztec/ethereum/config';
|
|
6
4
|
import {
|
|
7
|
-
type
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
} from '@aztec/node-keystore';
|
|
5
|
+
type ConfigMappingsType,
|
|
6
|
+
booleanConfigHelper,
|
|
7
|
+
getConfigFromMappings,
|
|
8
|
+
numberConfigHelper,
|
|
9
|
+
} from '@aztec/foundation/config';
|
|
10
|
+
import { type DataStoreConfig, dataConfigMappings } from '@aztec/kv-store/config';
|
|
11
|
+
import { type KeyStoreConfig, keyStoreConfigMappings } from '@aztec/node-keystore/config';
|
|
12
|
+
import { ethPrivateKeySchema } from '@aztec/node-keystore/schemas';
|
|
13
|
+
import type { KeyStore } from '@aztec/node-keystore/types';
|
|
14
14
|
import { type SharedNodeConfig, sharedNodeConfigMappings } from '@aztec/node-lib/config';
|
|
15
15
|
import { type P2PConfig, p2pConfigMappings } from '@aztec/p2p/config';
|
|
16
16
|
import {
|
|
@@ -18,7 +18,7 @@ import {
|
|
|
18
18
|
type ProverBrokerConfig,
|
|
19
19
|
proverAgentConfigMappings,
|
|
20
20
|
proverBrokerConfigMappings,
|
|
21
|
-
} from '@aztec/prover-client/broker';
|
|
21
|
+
} from '@aztec/prover-client/broker/config';
|
|
22
22
|
import { type ProverClientUserConfig, bbConfigMappings, proverClientConfigMappings } from '@aztec/prover-client/config';
|
|
23
23
|
import {
|
|
24
24
|
type PublisherConfig,
|
|
@@ -45,6 +45,8 @@ export type SpecificProverNodeConfig = {
|
|
|
45
45
|
proverNodePollingIntervalMs: number;
|
|
46
46
|
proverNodeMaxParallelBlocksPerEpoch: number;
|
|
47
47
|
proverNodeFailedEpochStore: string | undefined;
|
|
48
|
+
proverNodeEpochProvingDelayMs: number | undefined;
|
|
49
|
+
proverNodeDisableProofPublish?: boolean;
|
|
48
50
|
txGatheringTimeoutMs: number;
|
|
49
51
|
txGatheringIntervalMs: number;
|
|
50
52
|
txGatheringBatchSize: number;
|
|
@@ -72,6 +74,10 @@ const specificProverNodeConfigMappings: ConfigMappingsType<SpecificProverNodeCon
|
|
|
72
74
|
description: 'File store where to upload node state when an epoch fails to be proven',
|
|
73
75
|
defaultValue: undefined,
|
|
74
76
|
},
|
|
77
|
+
proverNodeEpochProvingDelayMs: {
|
|
78
|
+
description: 'Optional delay in milliseconds to wait before proving a new epoch',
|
|
79
|
+
defaultValue: undefined,
|
|
80
|
+
},
|
|
75
81
|
txGatheringIntervalMs: {
|
|
76
82
|
env: 'PROVER_NODE_TX_GATHERING_INTERVAL_MS',
|
|
77
83
|
description: 'How often to check that tx data is available',
|
|
@@ -92,6 +98,11 @@ const specificProverNodeConfigMappings: ConfigMappingsType<SpecificProverNodeCon
|
|
|
92
98
|
description: 'How long to wait for tx data to be available before giving up',
|
|
93
99
|
...numberConfigHelper(120_000),
|
|
94
100
|
},
|
|
101
|
+
proverNodeDisableProofPublish: {
|
|
102
|
+
env: 'PROVER_NODE_DISABLE_PROOF_PUBLISH',
|
|
103
|
+
description: 'Whether the prover node skips publishing proofs to L1',
|
|
104
|
+
...booleanConfigHelper(false),
|
|
105
|
+
},
|
|
95
106
|
};
|
|
96
107
|
|
|
97
108
|
export const proverNodeConfigMappings: ConfigMappingsType<ProverNodeConfig> = {
|
|
@@ -125,19 +136,14 @@ export function getProverNodeAgentConfigFromEnv(): ProverAgentConfig & BBConfig
|
|
|
125
136
|
};
|
|
126
137
|
}
|
|
127
138
|
|
|
128
|
-
function createKeyStoreFromWeb3Signer(config: ProverNodeConfig) {
|
|
129
|
-
// See what we have been given for proverId.
|
|
130
|
-
const proverId = config.proverId ? (config.proverId.toString() as EthAddressHex) : undefined;
|
|
131
|
-
|
|
139
|
+
function createKeyStoreFromWeb3Signer(config: ProverNodeConfig): KeyStore | undefined {
|
|
132
140
|
// If we don't have a valid prover Id then we can't build a valid key store with remote signers
|
|
133
|
-
if (proverId === undefined) {
|
|
141
|
+
if (config.proverId === undefined) {
|
|
134
142
|
return undefined;
|
|
135
143
|
}
|
|
136
144
|
|
|
137
145
|
// Also, we need at least one publisher address.
|
|
138
|
-
const publishers = config.publisherAddresses
|
|
139
|
-
? config.publisherAddresses.map(k => k.toChecksumString() as EthRemoteSignerAccount)
|
|
140
|
-
: [];
|
|
146
|
+
const publishers = config.publisherAddresses ?? [];
|
|
141
147
|
|
|
142
148
|
if (publishers.length === 0) {
|
|
143
149
|
return undefined;
|
|
@@ -147,7 +153,7 @@ function createKeyStoreFromWeb3Signer(config: ProverNodeConfig) {
|
|
|
147
153
|
schemaVersion: 1,
|
|
148
154
|
slasher: undefined,
|
|
149
155
|
prover: {
|
|
150
|
-
id: proverId,
|
|
156
|
+
id: config.proverId,
|
|
151
157
|
publisher: publishers,
|
|
152
158
|
},
|
|
153
159
|
remoteSigner: config.web3SignerUrl,
|
|
@@ -156,10 +162,10 @@ function createKeyStoreFromWeb3Signer(config: ProverNodeConfig) {
|
|
|
156
162
|
return keyStore;
|
|
157
163
|
}
|
|
158
164
|
|
|
159
|
-
function createKeyStoreFromPublisherKeys(config: ProverNodeConfig) {
|
|
165
|
+
function createKeyStoreFromPublisherKeys(config: ProverNodeConfig): KeyStore | undefined {
|
|
160
166
|
// Extract the publisher keys from the provided config.
|
|
161
167
|
const publisherKeys = config.publisherPrivateKeys
|
|
162
|
-
? config.publisherPrivateKeys.map(k => k.getValue()
|
|
168
|
+
? config.publisherPrivateKeys.map((k: { getValue: () => string }) => ethPrivateKeySchema.parse(k.getValue()))
|
|
163
169
|
: [];
|
|
164
170
|
|
|
165
171
|
// There must be at least 1.
|
|
@@ -167,9 +173,6 @@ function createKeyStoreFromPublisherKeys(config: ProverNodeConfig) {
|
|
|
167
173
|
return undefined;
|
|
168
174
|
}
|
|
169
175
|
|
|
170
|
-
// Now see what we have been given for proverId.
|
|
171
|
-
const proverId = config.proverId ? (config.proverId.toString() as EthAddressHex) : undefined;
|
|
172
|
-
|
|
173
176
|
// If we have a valid proverId then create a prover key store of the form { id, publisher: [publisherKeys] }
|
|
174
177
|
// Otherwise create one of the form ("0x12345678....." as EthAccount).
|
|
175
178
|
|
|
@@ -177,11 +180,11 @@ function createKeyStoreFromPublisherKeys(config: ProverNodeConfig) {
|
|
|
177
180
|
schemaVersion: 1,
|
|
178
181
|
slasher: undefined,
|
|
179
182
|
prover:
|
|
180
|
-
proverId === undefined
|
|
181
|
-
?
|
|
183
|
+
config.proverId === undefined
|
|
184
|
+
? publisherKeys[0]
|
|
182
185
|
: {
|
|
183
|
-
id: proverId,
|
|
184
|
-
publisher: publisherKeys
|
|
186
|
+
id: config.proverId,
|
|
187
|
+
publisher: publisherKeys,
|
|
185
188
|
},
|
|
186
189
|
remoteSigner: undefined,
|
|
187
190
|
validators: undefined,
|
|
@@ -189,7 +192,7 @@ function createKeyStoreFromPublisherKeys(config: ProverNodeConfig) {
|
|
|
189
192
|
return keyStore;
|
|
190
193
|
}
|
|
191
194
|
|
|
192
|
-
export function createKeyStoreForProver(config: ProverNodeConfig) {
|
|
195
|
+
export function createKeyStoreForProver(config: ProverNodeConfig): KeyStore | undefined {
|
|
193
196
|
if (config.web3SignerUrl !== undefined && config.web3SignerUrl.length > 0) {
|
|
194
197
|
return createKeyStoreFromWeb3Signer(config);
|
|
195
198
|
}
|
package/src/factory.ts
CHANGED
|
@@ -1,21 +1,18 @@
|
|
|
1
1
|
import { type Archiver, createArchiver } from '@aztec/archiver';
|
|
2
2
|
import { BBCircuitVerifier, QueuedIVCVerifier, TestCircuitVerifier } from '@aztec/bb-prover';
|
|
3
|
-
import {
|
|
3
|
+
import { createBlobClientWithFileStores } from '@aztec/blob-client/client';
|
|
4
4
|
import { EpochCache } from '@aztec/epoch-cache';
|
|
5
|
-
import {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
RollupContract,
|
|
10
|
-
createEthereumChain,
|
|
11
|
-
createL1TxUtilsFromEthSigner,
|
|
12
|
-
} from '@aztec/ethereum';
|
|
5
|
+
import { createEthereumChain } from '@aztec/ethereum/chain';
|
|
6
|
+
import { RollupContract } from '@aztec/ethereum/contracts';
|
|
7
|
+
import { L1TxUtils } from '@aztec/ethereum/l1-tx-utils';
|
|
8
|
+
import { PublisherManager } from '@aztec/ethereum/publisher-manager';
|
|
13
9
|
import { pick } from '@aztec/foundation/collection';
|
|
14
10
|
import { type Logger, createLogger } from '@aztec/foundation/log';
|
|
15
11
|
import { DateProvider } from '@aztec/foundation/timer';
|
|
16
12
|
import type { DataStoreConfig } from '@aztec/kv-store/config';
|
|
17
13
|
import { type KeyStoreConfig, KeystoreManager, loadKeystores, mergeKeystores } from '@aztec/node-keystore';
|
|
18
14
|
import { trySnapshotSync } from '@aztec/node-lib/actions';
|
|
15
|
+
import { createL1TxUtilsFromEthSignerWithStore } from '@aztec/node-lib/factories';
|
|
19
16
|
import { NodeRpcTxSource, createP2PClient } from '@aztec/p2p';
|
|
20
17
|
import { type ProverClientConfig, createProverClient } from '@aztec/prover-client';
|
|
21
18
|
import { createAndStartProvingBroker } from '@aztec/prover-client/broker';
|
|
@@ -39,7 +36,6 @@ export type ProverNodeDeps = {
|
|
|
39
36
|
aztecNodeTxProvider?: Pick<AztecNode, 'getTxsByHash'>;
|
|
40
37
|
archiver?: Archiver;
|
|
41
38
|
publisherFactory?: ProverPublisherFactory;
|
|
42
|
-
blobSinkClient?: BlobSinkClientInterface;
|
|
43
39
|
broker?: ProvingJobBroker;
|
|
44
40
|
l1TxUtils?: L1TxUtils;
|
|
45
41
|
dateProvider?: DateProvider;
|
|
@@ -56,8 +52,7 @@ export async function createProverNode(
|
|
|
56
52
|
const config = { ...userConfig };
|
|
57
53
|
const telemetry = deps.telemetry ?? getTelemetryClient();
|
|
58
54
|
const dateProvider = deps.dateProvider ?? new DateProvider();
|
|
59
|
-
const
|
|
60
|
-
deps.blobSinkClient ?? createBlobSinkClient(config, { logger: createLogger('prover-node:blob-sink:client') });
|
|
55
|
+
const blobClient = await createBlobClientWithFileStores(config, createLogger('prover-node:blob-client:client'));
|
|
61
56
|
const log = deps.log ?? createLogger('prover-node');
|
|
62
57
|
|
|
63
58
|
// Build a key store from file if given or from environment otherwise
|
|
@@ -73,6 +68,8 @@ export async function createProverNode(
|
|
|
73
68
|
}
|
|
74
69
|
}
|
|
75
70
|
|
|
71
|
+
await keyStoreManager?.validateSigners();
|
|
72
|
+
|
|
76
73
|
// Extract the prover signers from the key store and verify that we have one.
|
|
77
74
|
const proverSigners = keyStoreManager?.createProverSigners();
|
|
78
75
|
|
|
@@ -86,6 +83,8 @@ export async function createProverNode(
|
|
|
86
83
|
);
|
|
87
84
|
}
|
|
88
85
|
|
|
86
|
+
log.info(`Creating prover with publishers ${proverSigners.signers.map(signer => signer.address.toString()).join()}`);
|
|
87
|
+
|
|
89
88
|
// Only consider user provided config if it is valid
|
|
90
89
|
const proverIdInUserConfig = config.proverId === undefined || config.proverId.isZero() ? undefined : config.proverId;
|
|
91
90
|
|
|
@@ -104,7 +103,7 @@ export async function createProverNode(
|
|
|
104
103
|
|
|
105
104
|
const archiver =
|
|
106
105
|
deps.archiver ??
|
|
107
|
-
(await createArchiver(config, {
|
|
106
|
+
(await createArchiver(config, { blobClient, epochCache, telemetry, dateProvider }, { blockUntilSync: true }));
|
|
108
107
|
log.verbose(`Created archiver and synced to block ${await archiver.getBlockNumber()}`);
|
|
109
108
|
|
|
110
109
|
const worldStateConfig = { ...config, worldStateProvenBlocksOnly: false };
|
|
@@ -125,7 +124,7 @@ export async function createProverNode(
|
|
|
125
124
|
|
|
126
125
|
const publicClient = createPublicClient({
|
|
127
126
|
chain: chain.chainInfo,
|
|
128
|
-
transport: fallback(config.l1RpcUrls.map((url: string) => http(url))),
|
|
127
|
+
transport: fallback(config.l1RpcUrls.map((url: string) => http(url, { batch: false }))),
|
|
129
128
|
pollingInterval: config.viemPollingIntervalMS,
|
|
130
129
|
});
|
|
131
130
|
|
|
@@ -133,21 +132,26 @@ export async function createProverNode(
|
|
|
133
132
|
|
|
134
133
|
const l1TxUtils = deps.l1TxUtils
|
|
135
134
|
? [deps.l1TxUtils]
|
|
136
|
-
:
|
|
137
|
-
|
|
138
|
-
|
|
135
|
+
: await createL1TxUtilsFromEthSignerWithStore(
|
|
136
|
+
publicClient,
|
|
137
|
+
proverSigners.signers,
|
|
138
|
+
{ ...config, scope: 'prover' },
|
|
139
|
+
{ telemetry, logger: log.createChild('l1-tx-utils'), dateProvider },
|
|
140
|
+
);
|
|
139
141
|
|
|
140
142
|
const publisherFactory =
|
|
141
143
|
deps.publisherFactory ??
|
|
142
144
|
new ProverPublisherFactory(config, {
|
|
143
145
|
rollupContract,
|
|
144
|
-
publisherManager: new PublisherManager(l1TxUtils),
|
|
146
|
+
publisherManager: new PublisherManager(l1TxUtils, config),
|
|
145
147
|
telemetry,
|
|
146
148
|
});
|
|
147
149
|
|
|
148
150
|
const proofVerifier = new QueuedIVCVerifier(
|
|
149
151
|
config,
|
|
150
|
-
config.realProofs
|
|
152
|
+
config.realProofs || config.debugForceTxProofVerification
|
|
153
|
+
? await BBCircuitVerifier.new(config)
|
|
154
|
+
: new TestCircuitVerifier(config.proverTestVerificationDelayMs),
|
|
151
155
|
);
|
|
152
156
|
|
|
153
157
|
const p2pClient = await createP2PClient(
|
|
@@ -175,10 +179,12 @@ export async function createProverNode(
|
|
|
175
179
|
'proverNodeMaxPendingJobs',
|
|
176
180
|
'proverNodeMaxParallelBlocksPerEpoch',
|
|
177
181
|
'proverNodePollingIntervalMs',
|
|
182
|
+
'proverNodeEpochProvingDelayMs',
|
|
178
183
|
'txGatheringMaxParallelRequests',
|
|
179
184
|
'txGatheringIntervalMs',
|
|
180
185
|
'txGatheringTimeoutMs',
|
|
181
186
|
'proverNodeFailedEpochStore',
|
|
187
|
+
'proverNodeDisableProofPublish',
|
|
182
188
|
'dataDirectory',
|
|
183
189
|
'l1ChainId',
|
|
184
190
|
'rollupVersion',
|
|
@@ -187,7 +193,7 @@ export async function createProverNode(
|
|
|
187
193
|
|
|
188
194
|
const epochMonitor = await EpochMonitor.create(
|
|
189
195
|
archiver,
|
|
190
|
-
{ pollingIntervalMs: config.proverNodePollingIntervalMs },
|
|
196
|
+
{ pollingIntervalMs: config.proverNodePollingIntervalMs, provingDelayMs: config.proverNodeEpochProvingDelayMs },
|
|
191
197
|
telemetry,
|
|
192
198
|
);
|
|
193
199
|
|
|
@@ -1,49 +1,55 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { CheckpointNumber, EpochNumber } from '@aztec/foundation/branded-types';
|
|
2
|
+
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
2
3
|
import { BufferReader, serializeToBuffer } from '@aztec/foundation/serialize';
|
|
3
|
-
import { CommitteeAttestation
|
|
4
|
+
import { CommitteeAttestation } from '@aztec/stdlib/block';
|
|
5
|
+
import { Checkpoint } from '@aztec/stdlib/checkpoint';
|
|
4
6
|
import { BlockHeader, Tx } from '@aztec/stdlib/tx';
|
|
5
7
|
|
|
6
8
|
/** All data from an epoch used in proving. */
|
|
7
9
|
export type EpochProvingJobData = {
|
|
8
|
-
epochNumber:
|
|
9
|
-
|
|
10
|
+
epochNumber: EpochNumber;
|
|
11
|
+
checkpoints: Checkpoint[];
|
|
10
12
|
txs: Map<string, Tx>;
|
|
11
|
-
l1ToL2Messages: Record<
|
|
13
|
+
l1ToL2Messages: Record<CheckpointNumber, Fr[]>;
|
|
12
14
|
previousBlockHeader: BlockHeader;
|
|
13
15
|
attestations: CommitteeAttestation[];
|
|
14
16
|
};
|
|
15
17
|
|
|
16
18
|
export function validateEpochProvingJobData(data: EpochProvingJobData) {
|
|
17
|
-
if (data.
|
|
19
|
+
if (data.checkpoints.length === 0) {
|
|
20
|
+
throw new Error('No checkpoints to prove');
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const firstBlockNumber = data.checkpoints[0].blocks[0].number;
|
|
24
|
+
const previousBlockNumber = data.previousBlockHeader.getBlockNumber();
|
|
25
|
+
if (previousBlockNumber + 1 !== firstBlockNumber) {
|
|
18
26
|
throw new Error(
|
|
19
|
-
`Initial block number ${
|
|
20
|
-
data.blocks[0].number
|
|
21
|
-
} does not match previous block header ${data.previousBlockHeader.getBlockNumber()}`,
|
|
27
|
+
`Initial block number ${firstBlockNumber} does not match previous block header ${previousBlockNumber}`,
|
|
22
28
|
);
|
|
23
29
|
}
|
|
24
30
|
|
|
25
|
-
for (const
|
|
26
|
-
if (!(
|
|
27
|
-
throw new Error(`Missing L1 to L2 messages for
|
|
31
|
+
for (const checkpoint of data.checkpoints) {
|
|
32
|
+
if (!(checkpoint.number in data.l1ToL2Messages)) {
|
|
33
|
+
throw new Error(`Missing L1 to L2 messages for checkpoint number ${checkpoint.number}`);
|
|
28
34
|
}
|
|
29
35
|
}
|
|
30
36
|
}
|
|
31
37
|
|
|
32
38
|
export function serializeEpochProvingJobData(data: EpochProvingJobData): Buffer {
|
|
33
|
-
const
|
|
39
|
+
const checkpoints = data.checkpoints.map(checkpoint => checkpoint.toBuffer());
|
|
34
40
|
const txs = Array.from(data.txs.values()).map(tx => tx.toBuffer());
|
|
35
|
-
const l1ToL2Messages = Object.entries(data.l1ToL2Messages).map(([
|
|
36
|
-
Number(
|
|
41
|
+
const l1ToL2Messages = Object.entries(data.l1ToL2Messages).map(([checkpointNumber, messages]) => [
|
|
42
|
+
Number(checkpointNumber),
|
|
37
43
|
messages.length,
|
|
38
44
|
...messages,
|
|
39
45
|
]);
|
|
40
46
|
const attestations = data.attestations.map(attestation => attestation.toBuffer());
|
|
41
47
|
|
|
42
48
|
return serializeToBuffer(
|
|
43
|
-
|
|
49
|
+
data.epochNumber,
|
|
44
50
|
data.previousBlockHeader,
|
|
45
|
-
|
|
46
|
-
...
|
|
51
|
+
checkpoints.length,
|
|
52
|
+
...checkpoints,
|
|
47
53
|
txs.length,
|
|
48
54
|
...txs,
|
|
49
55
|
l1ToL2Messages.length,
|
|
@@ -55,22 +61,22 @@ export function serializeEpochProvingJobData(data: EpochProvingJobData): Buffer
|
|
|
55
61
|
|
|
56
62
|
export function deserializeEpochProvingJobData(buf: Buffer): EpochProvingJobData {
|
|
57
63
|
const reader = BufferReader.asReader(buf);
|
|
58
|
-
const epochNumber =
|
|
64
|
+
const epochNumber = EpochNumber(reader.readNumber());
|
|
59
65
|
const previousBlockHeader = reader.readObject(BlockHeader);
|
|
60
|
-
const
|
|
66
|
+
const checkpoints = reader.readVector(Checkpoint);
|
|
61
67
|
const txArray = reader.readVector(Tx);
|
|
62
68
|
|
|
63
|
-
const
|
|
69
|
+
const l1ToL2MessageCheckpointCount = reader.readNumber();
|
|
64
70
|
const l1ToL2Messages: Record<number, Fr[]> = {};
|
|
65
|
-
for (let i = 0; i <
|
|
66
|
-
const
|
|
71
|
+
for (let i = 0; i < l1ToL2MessageCheckpointCount; i++) {
|
|
72
|
+
const checkpointNumber = CheckpointNumber(reader.readNumber());
|
|
67
73
|
const messages = reader.readVector(Fr);
|
|
68
|
-
l1ToL2Messages[
|
|
74
|
+
l1ToL2Messages[checkpointNumber] = messages;
|
|
69
75
|
}
|
|
70
76
|
|
|
71
77
|
const attestations = reader.readVector(CommitteeAttestation);
|
|
72
78
|
|
|
73
79
|
const txs = new Map<string, Tx>(txArray.map(tx => [tx.getTxHash().toString(), tx]));
|
|
74
80
|
|
|
75
|
-
return { epochNumber, previousBlockHeader,
|
|
81
|
+
return { epochNumber, previousBlockHeader, checkpoints, txs, l1ToL2Messages, attestations };
|
|
76
82
|
}
|