@aztec/prover-node 1.2.0 → 2.0.0-nightly.20250813
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 -2
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +5 -2
- package/dest/factory.d.ts +8 -6
- package/dest/factory.d.ts.map +1 -1
- package/dest/factory.js +22 -14
- package/dest/job/epoch-proving-job-data.d.ts +3 -2
- package/dest/job/epoch-proving-job-data.d.ts.map +1 -1
- package/dest/job/epoch-proving-job-data.js +12 -5
- package/dest/job/epoch-proving-job.d.ts +1 -0
- package/dest/job/epoch-proving-job.d.ts.map +1 -1
- package/dest/job/epoch-proving-job.js +10 -10
- package/dest/prover-node-publisher.d.ts +2 -4
- package/dest/prover-node-publisher.d.ts.map +1 -1
- package/dest/prover-node-publisher.js +4 -2
- package/dest/prover-node.d.ts +6 -8
- package/dest/prover-node.d.ts.map +1 -1
- package/dest/prover-node.js +24 -35
- package/package.json +21 -21
- package/src/config.ts +6 -4
- package/src/factory.ts +46 -23
- package/src/job/epoch-proving-job-data.ts +13 -5
- package/src/job/epoch-proving-job.ts +11 -8
- package/src/prover-node-publisher.ts +14 -6
- package/src/prover-node.ts +19 -40
- package/dest/prover-coordination/combined-prover-coordination.d.ts +0 -22
- package/dest/prover-coordination/combined-prover-coordination.d.ts.map +0 -1
- package/dest/prover-coordination/combined-prover-coordination.js +0 -140
- package/dest/prover-coordination/config.d.ts +0 -7
- package/dest/prover-coordination/config.d.ts.map +0 -1
- package/dest/prover-coordination/config.js +0 -12
- package/dest/prover-coordination/factory.d.ts +0 -23
- package/dest/prover-coordination/factory.d.ts.map +0 -1
- package/dest/prover-coordination/factory.js +0 -52
- package/dest/prover-coordination/index.d.ts +0 -3
- package/dest/prover-coordination/index.d.ts.map +0 -1
- package/dest/prover-coordination/index.js +0 -2
- package/src/prover-coordination/combined-prover-coordination.ts +0 -164
- package/src/prover-coordination/config.ts +0 -18
- package/src/prover-coordination/factory.ts +0 -86
- package/src/prover-coordination/index.ts +0 -2
package/dest/config.d.ts
CHANGED
|
@@ -9,13 +9,13 @@ import { type ProverAgentConfig, type ProverBrokerConfig } from '@aztec/prover-c
|
|
|
9
9
|
import { type ProverClientConfig, type ProverClientUserConfig } from '@aztec/prover-client/config';
|
|
10
10
|
import { type PublisherConfig, type TxSenderConfig } from '@aztec/sequencer-client/config';
|
|
11
11
|
import { type WorldStateConfig } from '@aztec/world-state/config';
|
|
12
|
-
|
|
13
|
-
export type ProverNodeConfig = ArchiverConfig & ProverClientUserConfig & P2PConfig & WorldStateConfig & PublisherConfig & TxSenderConfig & DataStoreConfig & ProverCoordinationConfig & SharedNodeConfig & SpecificProverNodeConfig & GenesisStateConfig;
|
|
12
|
+
export type ProverNodeConfig = ArchiverConfig & ProverClientUserConfig & P2PConfig & WorldStateConfig & PublisherConfig & TxSenderConfig & DataStoreConfig & SharedNodeConfig & SpecificProverNodeConfig & GenesisStateConfig;
|
|
14
13
|
export type SpecificProverNodeConfig = {
|
|
15
14
|
proverNodeMaxPendingJobs: number;
|
|
16
15
|
proverNodePollingIntervalMs: number;
|
|
17
16
|
proverNodeMaxParallelBlocksPerEpoch: number;
|
|
18
17
|
proverNodeFailedEpochStore: string | undefined;
|
|
18
|
+
txGatheringTimeoutMs: number;
|
|
19
19
|
txGatheringIntervalMs: number;
|
|
20
20
|
txGatheringBatchSize: number;
|
|
21
21
|
txGatheringMaxParallelRequestsPerNode: 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,EAAwD,MAAM,iBAAiB,CAAC;AAChH,OAAO,EAAE,KAAK,kBAAkB,EAA6C,MAAM,0BAA0B,CAAC;AAE9G,OAAO,EAAE,KAAK,eAAe,EAAsB,MAAM,wBAAwB,CAAC;AAClF,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,EACL,KAAK,kBAAkB,EACvB,KAAK,sBAAsB,EAG5B,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,cAAc,EAGpB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,KAAK,gBAAgB,EAA4B,MAAM,2BAA2B,CAAC;AAE5F,
|
|
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,EAAwD,MAAM,iBAAiB,CAAC;AAChH,OAAO,EAAE,KAAK,kBAAkB,EAA6C,MAAM,0BAA0B,CAAC;AAE9G,OAAO,EAAE,KAAK,eAAe,EAAsB,MAAM,wBAAwB,CAAC;AAClF,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,EACL,KAAK,kBAAkB,EACvB,KAAK,sBAAsB,EAG5B,MAAM,6BAA6B,CAAC;AACrC,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,gBAAgB,GAChB,wBAAwB,GACxB,kBAAkB,CAAC;AAErB,MAAM,MAAM,wBAAwB,GAAG;IACrC,wBAAwB,EAAE,MAAM,CAAC;IACjC,2BAA2B,EAAE,MAAM,CAAC;IACpC,mCAAmC,EAAE,MAAM,CAAC;IAC5C,0BAA0B,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/C,oBAAoB,EAAE,MAAM,CAAC;IAC7B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,qCAAqC,EAAE,MAAM,CAAC;CAC/C,CAAC;AA6CF,eAAO,MAAM,wBAAwB,EAAE,kBAAkB,CAAC,gBAAgB,CAWzE,CAAC;AAEF,wBAAgB,0BAA0B,IAAI,gBAAgB,CAE7D;AAED,wBAAgB,gCAAgC,IAAI,kBAAkB,CAIrE;AAED,wBAAgB,+BAA+B,IAAI,iBAAiB,GAAG,QAAQ,GAAG,UAAU,CAK3F;AAED,wBAAgB,aAAa,CAAC,UAAU,EAAE,gBAAgB,GAAG,gBAAgB,GAAG,kBAAkB,CAMjG"}
|
package/dest/config.js
CHANGED
|
@@ -9,7 +9,6 @@ import { proverAgentConfigMappings, proverBrokerConfigMappings } from '@aztec/pr
|
|
|
9
9
|
import { bbConfigMappings, proverClientConfigMappings } from '@aztec/prover-client/config';
|
|
10
10
|
import { getPublisherConfigMappings, getTxSenderConfigMappings } from '@aztec/sequencer-client/config';
|
|
11
11
|
import { worldStateConfigMappings } from '@aztec/world-state/config';
|
|
12
|
-
import { proverCoordinationConfigMappings } from './prover-coordination/config.js';
|
|
13
12
|
const specificProverNodeConfigMappings = {
|
|
14
13
|
proverNodeMaxPendingJobs: {
|
|
15
14
|
env: 'PROVER_NODE_MAX_PENDING_JOBS',
|
|
@@ -45,6 +44,11 @@ const specificProverNodeConfigMappings = {
|
|
|
45
44
|
env: 'PROVER_NODE_TX_GATHERING_MAX_PARALLEL_REQUESTS_PER_NODE',
|
|
46
45
|
description: 'How many tx requests to make in parallel to each node',
|
|
47
46
|
...numberConfigHelper(100)
|
|
47
|
+
},
|
|
48
|
+
txGatheringTimeoutMs: {
|
|
49
|
+
env: 'PROVER_NODE_TX_GATHERING_TIMEOUT_MS',
|
|
50
|
+
description: 'How long to wait for tx data to be available before giving up',
|
|
51
|
+
...numberConfigHelper(120_000)
|
|
48
52
|
}
|
|
49
53
|
};
|
|
50
54
|
export const proverNodeConfigMappings = {
|
|
@@ -55,7 +59,6 @@ export const proverNodeConfigMappings = {
|
|
|
55
59
|
...worldStateConfigMappings,
|
|
56
60
|
...getPublisherConfigMappings('PROVER'),
|
|
57
61
|
...getTxSenderConfigMappings('PROVER'),
|
|
58
|
-
...proverCoordinationConfigMappings,
|
|
59
62
|
...specificProverNodeConfigMappings,
|
|
60
63
|
...genesisStateConfigMappings,
|
|
61
64
|
...sharedNodeConfigMappings
|
package/dest/factory.d.ts
CHANGED
|
@@ -2,25 +2,27 @@ import { type Archiver } from '@aztec/archiver';
|
|
|
2
2
|
import { type BlobSinkClientInterface } from '@aztec/blob-sink/client';
|
|
3
3
|
import { L1TxUtils } from '@aztec/ethereum';
|
|
4
4
|
import { type Logger } from '@aztec/foundation/log';
|
|
5
|
+
import { DateProvider } from '@aztec/foundation/timer';
|
|
5
6
|
import type { DataStoreConfig } from '@aztec/kv-store/config';
|
|
6
|
-
import type { ProvingJobBroker } from '@aztec/stdlib/interfaces/server';
|
|
7
|
+
import type { AztecNode, ProvingJobBroker } from '@aztec/stdlib/interfaces/server';
|
|
7
8
|
import type { PublicDataTreeLeaf } from '@aztec/stdlib/trees';
|
|
8
9
|
import { type TelemetryClient } from '@aztec/telemetry-client';
|
|
9
10
|
import { type ProverNodeConfig } from './config.js';
|
|
10
|
-
import type { TxSource } from './prover-coordination/combined-prover-coordination.js';
|
|
11
11
|
import { ProverNodePublisher } from './prover-node-publisher.js';
|
|
12
12
|
import { ProverNode } from './prover-node.js';
|
|
13
|
-
|
|
14
|
-
export declare function createProverNode(userConfig: ProverNodeConfig & DataStoreConfig, deps?: {
|
|
13
|
+
export type ProverNodeDeps = {
|
|
15
14
|
telemetry?: TelemetryClient;
|
|
16
15
|
log?: Logger;
|
|
17
|
-
aztecNodeTxProvider?:
|
|
16
|
+
aztecNodeTxProvider?: Pick<AztecNode, 'getTxsByHash'>;
|
|
18
17
|
archiver?: Archiver;
|
|
19
18
|
publisher?: ProverNodePublisher;
|
|
20
19
|
blobSinkClient?: BlobSinkClientInterface;
|
|
21
20
|
broker?: ProvingJobBroker;
|
|
22
21
|
l1TxUtils?: L1TxUtils;
|
|
23
|
-
|
|
22
|
+
dateProvider?: DateProvider;
|
|
23
|
+
};
|
|
24
|
+
/** Creates a new prover node given a config. */
|
|
25
|
+
export declare function createProverNode(userConfig: ProverNodeConfig & DataStoreConfig, deps?: ProverNodeDeps, options?: {
|
|
24
26
|
prefilledPublicData?: PublicDataTreeLeaf[];
|
|
25
27
|
}): Promise<ProverNode>;
|
|
26
28
|
//# sourceMappingURL=factory.d.ts.map
|
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;
|
|
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,EAA+D,MAAM,iBAAiB,CAAC;AAEzG,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;AAK9D,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAEnF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAE9D,OAAO,EAAE,KAAK,eAAe,EAAsB,MAAM,yBAAyB,CAAC;AAGnF,OAAO,EAAE,KAAK,gBAAgB,EAAiB,MAAM,aAAa,CAAC;AAEnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,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,SAAS,CAAC,EAAE,mBAAmB,CAAC;IAChC,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,EAC9C,IAAI,GAAE,cAAmB,EACzB,OAAO,GAAE;IACP,mBAAmB,CAAC,EAAE,kBAAkB,EAAE,CAAC;CACvC,uBAiGP"}
|
package/dest/factory.js
CHANGED
|
@@ -1,30 +1,41 @@
|
|
|
1
1
|
import { createArchiver } from '@aztec/archiver';
|
|
2
|
+
import { BBCircuitVerifier, QueuedIVCVerifier, TestCircuitVerifier } from '@aztec/bb-prover';
|
|
2
3
|
import { createBlobSinkClient } from '@aztec/blob-sink/client';
|
|
3
4
|
import { EpochCache } from '@aztec/epoch-cache';
|
|
4
5
|
import { L1TxUtils, RollupContract, createEthereumChain, createExtendedL1Client } from '@aztec/ethereum';
|
|
5
6
|
import { pick } from '@aztec/foundation/collection';
|
|
6
7
|
import { createLogger } from '@aztec/foundation/log';
|
|
8
|
+
import { DateProvider } from '@aztec/foundation/timer';
|
|
7
9
|
import { trySnapshotSync } from '@aztec/node-lib/actions';
|
|
10
|
+
import { NodeRpcTxSource, createP2PClient } from '@aztec/p2p';
|
|
8
11
|
import { createProverClient } from '@aztec/prover-client';
|
|
9
12
|
import { createAndStartProvingBroker } from '@aztec/prover-client/broker';
|
|
13
|
+
import { P2PClientType } from '@aztec/stdlib/p2p';
|
|
14
|
+
import { getPackageVersion } from '@aztec/stdlib/update-checker';
|
|
10
15
|
import { getTelemetryClient } from '@aztec/telemetry-client';
|
|
11
16
|
import { createWorldStateSynchronizer } from '@aztec/world-state';
|
|
12
17
|
import { resolveConfig } from './config.js';
|
|
13
18
|
import { EpochMonitor } from './monitors/epoch-monitor.js';
|
|
14
|
-
import { createProverCoordination } from './prover-coordination/factory.js';
|
|
15
19
|
import { ProverNodePublisher } from './prover-node-publisher.js';
|
|
16
20
|
import { ProverNode } from './prover-node.js';
|
|
17
21
|
/** Creates a new prover node given a config. */ export async function createProverNode(userConfig, deps = {}, options = {}) {
|
|
18
22
|
const config = resolveConfig(userConfig);
|
|
19
23
|
const telemetry = deps.telemetry ?? getTelemetryClient();
|
|
24
|
+
const dateProvider = deps.dateProvider ?? new DateProvider();
|
|
20
25
|
const blobSinkClient = deps.blobSinkClient ?? createBlobSinkClient(config, {
|
|
21
26
|
logger: createLogger('prover-node:blob-sink:client')
|
|
22
27
|
});
|
|
23
28
|
const log = deps.log ?? createLogger('prover-node');
|
|
24
29
|
await trySnapshotSync(config, log);
|
|
25
|
-
const
|
|
30
|
+
const epochCache = await EpochCache.create(config.l1Contracts.rollupAddress, config);
|
|
31
|
+
const archiver = deps.archiver ?? await createArchiver(config, {
|
|
32
|
+
blobSinkClient,
|
|
33
|
+
epochCache,
|
|
34
|
+
telemetry,
|
|
35
|
+
dateProvider
|
|
36
|
+
}, {
|
|
26
37
|
blockUntilSync: true
|
|
27
|
-
}
|
|
38
|
+
});
|
|
28
39
|
log.verbose(`Created archiver and synced to block ${await archiver.getBlockNumber()}`);
|
|
29
40
|
const worldStateConfig = {
|
|
30
41
|
...config,
|
|
@@ -38,27 +49,24 @@ import { ProverNode } from './prover-node.js';
|
|
|
38
49
|
const chain = createEthereumChain(rpcUrls, chainId);
|
|
39
50
|
const l1Client = createExtendedL1Client(rpcUrls, publisherPrivateKey.getValue(), chain.chainInfo);
|
|
40
51
|
const rollupContract = new RollupContract(l1Client, config.l1Contracts.rollupAddress.toString());
|
|
41
|
-
const l1TxUtils = deps.l1TxUtils ?? new L1TxUtils(l1Client, log, config);
|
|
52
|
+
const l1TxUtils = deps.l1TxUtils ?? new L1TxUtils(l1Client, log, deps.dateProvider, config);
|
|
42
53
|
const publisher = deps.publisher ?? new ProverNodePublisher(config, {
|
|
43
54
|
telemetry,
|
|
44
55
|
rollupContract,
|
|
45
56
|
l1TxUtils
|
|
46
57
|
});
|
|
47
|
-
const
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
worldStateSynchronizer,
|
|
53
|
-
archiver,
|
|
54
|
-
epochCache,
|
|
55
|
-
telemetry
|
|
58
|
+
const proofVerifier = new QueuedIVCVerifier(config, config.realProofs ? await BBCircuitVerifier.new(config) : new TestCircuitVerifier());
|
|
59
|
+
const p2pClient = await createP2PClient(P2PClientType.Prover, config, archiver, proofVerifier, worldStateSynchronizer, epochCache, getPackageVersion() ?? '', dateProvider, telemetry, {
|
|
60
|
+
txCollectionNodeSources: deps.aztecNodeTxProvider ? [
|
|
61
|
+
new NodeRpcTxSource(deps.aztecNodeTxProvider, 'TestNode')
|
|
62
|
+
] : []
|
|
56
63
|
});
|
|
64
|
+
await p2pClient.start();
|
|
57
65
|
const proverNodeConfig = {
|
|
58
66
|
...pick(config, 'proverNodeMaxPendingJobs', 'proverNodeMaxParallelBlocksPerEpoch', 'proverNodePollingIntervalMs', 'txGatheringMaxParallelRequests', 'txGatheringIntervalMs', 'txGatheringTimeoutMs', 'proverNodeFailedEpochStore', 'dataDirectory', 'l1ChainId', 'rollupVersion')
|
|
59
67
|
};
|
|
60
68
|
const epochMonitor = await EpochMonitor.create(archiver, {
|
|
61
69
|
pollingIntervalMs: config.proverNodePollingIntervalMs
|
|
62
70
|
}, telemetry);
|
|
63
|
-
return new ProverNode(prover, publisher, archiver, archiver, archiver, worldStateSynchronizer,
|
|
71
|
+
return new ProverNode(prover, publisher, archiver, archiver, archiver, worldStateSynchronizer, p2pClient, epochMonitor, proverNodeConfig, telemetry);
|
|
64
72
|
}
|
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
import { Fr } from '@aztec/foundation/fields';
|
|
2
|
-
import { L2Block } from '@aztec/stdlib/block';
|
|
2
|
+
import { CommitteeAttestation, L2Block } from '@aztec/stdlib/block';
|
|
3
3
|
import { BlockHeader, Tx } from '@aztec/stdlib/tx';
|
|
4
4
|
/** All data from an epoch used in proving. */
|
|
5
5
|
export type EpochProvingJobData = {
|
|
6
6
|
epochNumber: bigint;
|
|
7
7
|
blocks: L2Block[];
|
|
8
|
-
txs: Tx
|
|
8
|
+
txs: Map<string, Tx>;
|
|
9
9
|
l1ToL2Messages: Record<number, Fr[]>;
|
|
10
10
|
previousBlockHeader: BlockHeader;
|
|
11
|
+
attestations: CommitteeAttestation[];
|
|
11
12
|
};
|
|
12
13
|
export declare function validateEpochProvingJobData(data: EpochProvingJobData): void;
|
|
13
14
|
export declare function serializeEpochProvingJobData(data: EpochProvingJobData): Buffer;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"epoch-proving-job-data.d.ts","sourceRoot":"","sources":["../../src/job/epoch-proving-job-data.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAC;AAE9C,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"epoch-proving-job-data.d.ts","sourceRoot":"","sources":["../../src/job/epoch-proving-job-data.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAC;AAE9C,OAAO,EAAE,oBAAoB,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACpE,OAAO,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAEnD,8CAA8C;AAC9C,MAAM,MAAM,mBAAmB,GAAG;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,OAAO,EAAE,CAAC;IAClB,GAAG,EAAE,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;IACrC,mBAAmB,EAAE,WAAW,CAAC;IACjC,YAAY,EAAE,oBAAoB,EAAE,CAAC;CACtC,CAAC;AAEF,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,mBAAmB,QAcpE;AAED,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,mBAAmB,GAAG,MAAM,CAsB9E;AAED,wBAAgB,8BAA8B,CAAC,GAAG,EAAE,MAAM,GAAG,mBAAmB,CAoB/E"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Fr } from '@aztec/foundation/fields';
|
|
2
2
|
import { BufferReader, serializeToBuffer } from '@aztec/foundation/serialize';
|
|
3
|
-
import { L2Block } from '@aztec/stdlib/block';
|
|
3
|
+
import { CommitteeAttestation, L2Block } from '@aztec/stdlib/block';
|
|
4
4
|
import { BlockHeader, Tx } from '@aztec/stdlib/tx';
|
|
5
5
|
export function validateEpochProvingJobData(data) {
|
|
6
6
|
if (data.blocks.length > 0 && data.previousBlockHeader.getBlockNumber() + 1 !== data.blocks[0].number) {
|
|
@@ -14,20 +14,21 @@ export function validateEpochProvingJobData(data) {
|
|
|
14
14
|
}
|
|
15
15
|
export function serializeEpochProvingJobData(data) {
|
|
16
16
|
const blocks = data.blocks.map((block)=>block.toBuffer());
|
|
17
|
-
const txs = data.txs.map((tx)=>tx.toBuffer());
|
|
17
|
+
const txs = Array.from(data.txs.values()).map((tx)=>tx.toBuffer());
|
|
18
18
|
const l1ToL2Messages = Object.entries(data.l1ToL2Messages).map(([blockNumber, messages])=>[
|
|
19
19
|
Number(blockNumber),
|
|
20
20
|
messages.length,
|
|
21
21
|
...messages
|
|
22
22
|
]);
|
|
23
|
-
|
|
23
|
+
const attestations = data.attestations.map((attestation)=>attestation.toBuffer());
|
|
24
|
+
return serializeToBuffer(Number(data.epochNumber), data.previousBlockHeader, blocks.length, ...blocks, txs.length, ...txs, l1ToL2Messages.length, ...l1ToL2Messages, attestations.length, ...attestations);
|
|
24
25
|
}
|
|
25
26
|
export function deserializeEpochProvingJobData(buf) {
|
|
26
27
|
const reader = BufferReader.asReader(buf);
|
|
27
28
|
const epochNumber = BigInt(reader.readNumber());
|
|
28
29
|
const previousBlockHeader = reader.readObject(BlockHeader);
|
|
29
30
|
const blocks = reader.readVector(L2Block);
|
|
30
|
-
const
|
|
31
|
+
const txArray = reader.readVector(Tx);
|
|
31
32
|
const l1ToL2MessageBlockCount = reader.readNumber();
|
|
32
33
|
const l1ToL2Messages = {};
|
|
33
34
|
for(let i = 0; i < l1ToL2MessageBlockCount; i++){
|
|
@@ -35,11 +36,17 @@ export function deserializeEpochProvingJobData(buf) {
|
|
|
35
36
|
const messages = reader.readVector(Fr);
|
|
36
37
|
l1ToL2Messages[blockNumber] = messages;
|
|
37
38
|
}
|
|
39
|
+
const attestations = reader.readVector(CommitteeAttestation);
|
|
40
|
+
const txs = new Map(txArray.map((tx)=>[
|
|
41
|
+
tx.getTxHash().toString(),
|
|
42
|
+
tx
|
|
43
|
+
]));
|
|
38
44
|
return {
|
|
39
45
|
epochNumber,
|
|
40
46
|
previousBlockHeader,
|
|
41
47
|
blocks,
|
|
42
48
|
txs,
|
|
43
|
-
l1ToL2Messages
|
|
49
|
+
l1ToL2Messages,
|
|
50
|
+
attestations
|
|
44
51
|
};
|
|
45
52
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"epoch-proving-job.d.ts","sourceRoot":"","sources":["../../src/job/epoch-proving-job.ts"],"names":[],"mappings":"AAKA,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;AAEzC,OAAO,EAAc,KAAK,SAAS,EAAE,KAAK,MAAM,EAAa,MAAM,yBAAyB,CAAC;AAI7F,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,EAAE,KAAK,mBAAmB,EAA+B,MAAM,6BAA6B,CAAC;AAEpG;;;;GAIG;AACH,qBAAa,eAAgB,YAAW,SAAS;IAY7C,OAAO,CAAC,IAAI;IACZ,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,sBAAsB;IAC9B,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,MAAM;IAnBhB,OAAO,CAAC,KAAK,CAAuC;IACpD,OAAO,CAAC,GAAG,CAAiD;IAC5D,OAAO,CAAC,IAAI,CAAS;IAErB,OAAO,CAAC,UAAU,CAA4B;IAC9C,OAAO,CAAC,iBAAiB,CAA6B;IACtD,OAAO,CAAC,sBAAsB,CAA6B;IAE3D,SAAgB,MAAM,EAAE,MAAM,CAAC;gBAGrB,IAAI,EAAE,mBAAmB,EACzB,UAAU,EAAE,IAAI,CAAC,wBAAwB,EAAE,MAAM,CAAC,EAClD,MAAM,EAAE,WAAW,EACnB,sBAAsB,EAAE,sBAAsB,EAC9C,SAAS,EAAE,IAAI,CAAC,mBAAmB,EAAE,kBAAkB,CAAC,EACxD,aAAa,EAAE,aAAa,GAAG,SAAS,EACxC,OAAO,EAAE,oBAAoB,EAC7B,QAAQ,EAAE,IAAI,GAAG,SAAS,EAC1B,MAAM,EAAE;QAAE,kBAAkB,CAAC,EAAE,MAAM,CAAC;QAAC,cAAc,CAAC,EAAE,OAAO,CAAA;KAAE;IAOpE,KAAK,IAAI,MAAM;IAIf,QAAQ,IAAI,oBAAoB;IAIhC,cAAc,IAAI,MAAM;IAIxB,WAAW,IAAI,IAAI,GAAG,SAAS;IAI/B,cAAc,IAAI,mBAAmB;IAI5C,OAAO,KAAK,WAAW,GAEtB;IAED,OAAO,KAAK,MAAM,GAEjB;IAED,OAAO,KAAK,GAAG,GAEd;IAED;;OAEG;IAIU,GAAG;
|
|
1
|
+
{"version":3,"file":"epoch-proving-job.d.ts","sourceRoot":"","sources":["../../src/job/epoch-proving-job.ts"],"names":[],"mappings":"AAKA,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;AAEzC,OAAO,EAAc,KAAK,SAAS,EAAE,KAAK,MAAM,EAAa,MAAM,yBAAyB,CAAC;AAI7F,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,EAAE,KAAK,mBAAmB,EAA+B,MAAM,6BAA6B,CAAC;AAEpG;;;;GAIG;AACH,qBAAa,eAAgB,YAAW,SAAS;IAY7C,OAAO,CAAC,IAAI;IACZ,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,sBAAsB;IAC9B,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,MAAM;IAnBhB,OAAO,CAAC,KAAK,CAAuC;IACpD,OAAO,CAAC,GAAG,CAAiD;IAC5D,OAAO,CAAC,IAAI,CAAS;IAErB,OAAO,CAAC,UAAU,CAA4B;IAC9C,OAAO,CAAC,iBAAiB,CAA6B;IACtD,OAAO,CAAC,sBAAsB,CAA6B;IAE3D,SAAgB,MAAM,EAAE,MAAM,CAAC;gBAGrB,IAAI,EAAE,mBAAmB,EACzB,UAAU,EAAE,IAAI,CAAC,wBAAwB,EAAE,MAAM,CAAC,EAClD,MAAM,EAAE,WAAW,EACnB,sBAAsB,EAAE,sBAAsB,EAC9C,SAAS,EAAE,IAAI,CAAC,mBAAmB,EAAE,kBAAkB,CAAC,EACxD,aAAa,EAAE,aAAa,GAAG,SAAS,EACxC,OAAO,EAAE,oBAAoB,EAC7B,QAAQ,EAAE,IAAI,GAAG,SAAS,EAC1B,MAAM,EAAE;QAAE,kBAAkB,CAAC,EAAE,MAAM,CAAC;QAAC,cAAc,CAAC,EAAE,OAAO,CAAA;KAAE;IAOpE,KAAK,IAAI,MAAM;IAIf,QAAQ,IAAI,oBAAoB;IAIhC,cAAc,IAAI,MAAM;IAIxB,WAAW,IAAI,IAAI,GAAG,SAAS;IAI/B,cAAc,IAAI,mBAAmB;IAI5C,OAAO,KAAK,WAAW,GAEtB;IAED,OAAO,KAAK,MAAM,GAEjB;IAED,OAAO,KAAK,GAAG,GAEd;IAED,OAAO,KAAK,YAAY,GAEvB;IAED;;OAEG;IAIU,GAAG;IAsHhB,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"}
|
|
@@ -74,6 +74,9 @@ import { validateEpochProvingJobData } from './epoch-proving-job-data.js';
|
|
|
74
74
|
get txs() {
|
|
75
75
|
return this.data.txs;
|
|
76
76
|
}
|
|
77
|
+
get attestations() {
|
|
78
|
+
return this.data.attestations;
|
|
79
|
+
}
|
|
77
80
|
/**
|
|
78
81
|
* Proves the given epoch and submits the proof to L1.
|
|
79
82
|
*/ async run() {
|
|
@@ -81,6 +84,7 @@ import { validateEpochProvingJobData } from './epoch-proving-job-data.js';
|
|
|
81
84
|
if (!this.config.skipEpochCheck) {
|
|
82
85
|
await this.scheduleEpochCheck();
|
|
83
86
|
}
|
|
87
|
+
const attestations = this.attestations.map((attestation)=>attestation.toViem());
|
|
84
88
|
const epochNumber = Number(this.epochNumber);
|
|
85
89
|
const epochSizeBlocks = this.blocks.length;
|
|
86
90
|
const epochSizeTxs = this.blocks.reduce((total, current)=>total + current.body.txEffects.length, 0);
|
|
@@ -103,11 +107,11 @@ import { validateEpochProvingJobData } from './epoch-proving-job-data.js';
|
|
|
103
107
|
const allBlobs = (await Promise.all(this.blocks.map(async (block)=>await Blob.getBlobsPerBlock(block.body.toBlobFields())))).flat();
|
|
104
108
|
const finalBlobBatchingChallenges = await BatchedBlob.precomputeBatchedBlobChallenges(allBlobs);
|
|
105
109
|
this.prover.startNewEpoch(epochNumber, fromBlock, epochSizeBlocks, finalBlobBatchingChallenges);
|
|
106
|
-
await this.prover.startTubeCircuits(this.txs);
|
|
110
|
+
await this.prover.startTubeCircuits(Array.from(this.txs.values()));
|
|
107
111
|
await asyncPool(this.config.parallelBlockLimit ?? 32, this.blocks, async (block)=>{
|
|
108
112
|
this.checkState();
|
|
109
113
|
const globalVariables = block.header.globalVariables;
|
|
110
|
-
const txs =
|
|
114
|
+
const txs = this.getTxs(block);
|
|
111
115
|
const l1ToL2Messages = this.getL1ToL2Messages(block);
|
|
112
116
|
const previousHeader = this.getBlockHeader(block.number - 1);
|
|
113
117
|
this.log.verbose(`Starting processing block ${block.number}`, {
|
|
@@ -152,7 +156,8 @@ import { validateEpochProvingJobData } from './epoch-proving-job-data.js';
|
|
|
152
156
|
epochNumber,
|
|
153
157
|
publicInputs,
|
|
154
158
|
proof,
|
|
155
|
-
batchedBlobInputs
|
|
159
|
+
batchedBlobInputs,
|
|
160
|
+
attestations
|
|
156
161
|
});
|
|
157
162
|
if (!success) {
|
|
158
163
|
throw new Error('Failed to submit epoch proof to L1');
|
|
@@ -261,13 +266,8 @@ import { validateEpochProvingJobData } from './epoch-proving-job-data.js';
|
|
|
261
266
|
}
|
|
262
267
|
throw new Error(`Block header not found for block number ${blockNumber} (got ${this.blocks.map((b)=>b.number).join(', ')} and previous header ${this.data.previousBlockHeader.getBlockNumber()})`);
|
|
263
268
|
}
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
const txsAndHashes = await Promise.all(this.txs.map(async (tx)=>({
|
|
267
|
-
tx,
|
|
268
|
-
hash: await tx.getTxHash()
|
|
269
|
-
})));
|
|
270
|
-
return txsAndHashes.filter((txAndHash)=>txHashes.includes(txAndHash.hash.toBigInt())).map((txAndHash)=>txAndHash.tx);
|
|
269
|
+
getTxs(block) {
|
|
270
|
+
return block.body.txEffects.map((txEffect)=>this.txs.get(txEffect.txHash.toString()));
|
|
271
271
|
}
|
|
272
272
|
getL1ToL2Messages(block) {
|
|
273
273
|
return this.data.l1ToL2Messages[block.number];
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { type BatchedBlob } from '@aztec/blob-lib';
|
|
2
2
|
import { AZTEC_MAX_EPOCH_DURATION } from '@aztec/constants';
|
|
3
|
-
import type
|
|
3
|
+
import { type L1TxUtils, type RollupContract, type 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';
|
|
@@ -8,9 +8,6 @@ import type { PublisherConfig, TxSenderConfig } from '@aztec/sequencer-client';
|
|
|
8
8
|
import type { Proof } from '@aztec/stdlib/proofs';
|
|
9
9
|
import type { FeeRecipient, RootRollupPublicInputs } from '@aztec/stdlib/rollup';
|
|
10
10
|
import { type TelemetryClient } from '@aztec/telemetry-client';
|
|
11
|
-
/**
|
|
12
|
-
* Stats for a sent transaction.
|
|
13
|
-
*/
|
|
14
11
|
/** Arguments to the submitEpochProof method of the rollup contract */
|
|
15
12
|
export type L1SubmitEpochProofArgs = {
|
|
16
13
|
epochSize: number;
|
|
@@ -53,6 +50,7 @@ export declare class ProverNodePublisher {
|
|
|
53
50
|
publicInputs: RootRollupPublicInputs;
|
|
54
51
|
proof: Proof;
|
|
55
52
|
batchedBlobInputs: BatchedBlob;
|
|
53
|
+
attestations: ViemCommitteeAttestation[];
|
|
56
54
|
}): Promise<boolean>;
|
|
57
55
|
private validateEpochProofSubmission;
|
|
58
56
|
private sendSubmitEpochProofTx;
|
|
@@ -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,
|
|
1
|
+
{"version":3,"file":"prover-node-publisher.d.ts","sourceRoot":"","sources":["../src/prover-node-publisher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,WAAW,EAAoC,MAAM,iBAAiB,CAAC;AACrF,OAAO,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EACL,KAAK,SAAS,EACd,KAAK,cAAc,EAEnB,KAAK,wBAAwB,EAC9B,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAC3D,OAAO,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAC;AAE9C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAC;AAIzD,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC/E,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,KAAK,EAAE,YAAY,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAEjF,OAAO,EAAE,KAAK,eAAe,EAAsB,MAAM,yBAAyB,CAAC;AAOnF,sEAAsE;AACtE,MAAM,MAAM,sBAAsB,GAAG;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,EAAE,CAAC;IACpB,UAAU,EAAE,EAAE,CAAC;IACf,YAAY,EAAE,EAAE,CAAC;IACjB,OAAO,EAAE,EAAE,CAAC;IACZ,QAAQ,EAAE,EAAE,CAAC;IACb,IAAI,EAAE,KAAK,CAAC,YAAY,EAAE,OAAO,wBAAwB,CAAC,CAAC;IAC3D,KAAK,EAAE,KAAK,CAAC;CACd,CAAC;AAEF,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,kBAAkB,CAA4B;IACtD,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,OAAO,CAA6B;IAE5C,SAAS,CAAC,GAAG,yCAA+C;IAE5D,SAAS,CAAC,cAAc,EAAE,cAAc,CAAC;IAEzC,SAAgB,SAAS,EAAE,SAAS,CAAC;gBAGnC,MAAM,EAAE,cAAc,GAAG,eAAe,EACxC,IAAI,EAAE;QACJ,cAAc,EAAE,cAAc,CAAC;QAC/B,SAAS,EAAE,SAAS,CAAC;QACrB,SAAS,CAAC,EAAE,eAAe,CAAC;KAC7B;IAYI,iBAAiB;IAIxB;;;;;OAKG;IACI,SAAS;IAKhB,wDAAwD;IACjD,OAAO;IAIP,gBAAgB;IAIV,gBAAgB,CAAC,IAAI,EAAE;QAClC,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;QAChB,YAAY,EAAE,sBAAsB,CAAC;QACrC,KAAK,EAAE,KAAK,CAAC;QACb,iBAAiB,EAAE,WAAW,CAAC;QAC/B,YAAY,EAAE,wBAAwB,EAAE,CAAC;KAC1C,GAAG,OAAO,CAAC,OAAO,CAAC;YA+CN,4BAA4B;YA0D5B,sBAAsB;IAyCpC,OAAO,CAAC,6BAA6B;IAyBrC,OAAO,CAAC,uBAAuB;cAsBf,kBAAkB;CAGnC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { FinalBlobAccumulatorPublicInputs } from '@aztec/blob-lib';
|
|
2
2
|
import { AZTEC_MAX_EPOCH_DURATION } from '@aztec/constants';
|
|
3
|
+
import { RollupContract as RollupContractClass } from '@aztec/ethereum';
|
|
3
4
|
import { makeTuple } from '@aztec/foundation/array';
|
|
4
5
|
import { areArraysEqual } from '@aztec/foundation/collection';
|
|
5
6
|
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
@@ -87,10 +88,10 @@ export class ProverNodePublisher {
|
|
|
87
88
|
return true;
|
|
88
89
|
}
|
|
89
90
|
this.metrics.recordFailedTx();
|
|
90
|
-
this.log.error(`Rollup.submitEpochProof tx status failed
|
|
91
|
+
this.log.error(`Rollup.submitEpochProof tx status failed ${txReceipt.transactionHash}`, undefined, ctx);
|
|
91
92
|
await this.sleepOrInterrupted();
|
|
92
93
|
}
|
|
93
|
-
this.log.verbose('L2 block data syncing interrupted
|
|
94
|
+
this.log.verbose('L2 block data syncing interrupted', ctx);
|
|
94
95
|
return false;
|
|
95
96
|
}
|
|
96
97
|
async validateEpochProofSubmission(args) {
|
|
@@ -182,6 +183,7 @@ export class ProverNodePublisher {
|
|
|
182
183
|
end: argsArray[1],
|
|
183
184
|
args: argsArray[2],
|
|
184
185
|
fees: argsArray[3],
|
|
186
|
+
attestations: RollupContractClass.packAttestations(args.attestations),
|
|
185
187
|
blobInputs: argsArray[4],
|
|
186
188
|
proof: proofHex
|
|
187
189
|
};
|
package/dest/prover-node.d.ts
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import type { Fr } from '@aztec/foundation/fields';
|
|
2
2
|
import type { DataStoreConfig } from '@aztec/kv-store/config';
|
|
3
|
+
import type { P2PClient } from '@aztec/p2p';
|
|
3
4
|
import { PublicProcessorFactory } from '@aztec/simulator/server';
|
|
4
5
|
import type { L2BlockSource } from '@aztec/stdlib/block';
|
|
5
6
|
import type { ChainConfig } from '@aztec/stdlib/config';
|
|
6
7
|
import type { ContractDataSource } from '@aztec/stdlib/contract';
|
|
7
|
-
import { type EpochProverManager, type
|
|
8
|
+
import { type EpochProverManager, type ProverNodeApi, type Service, type WorldStateSyncStatus, type WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server';
|
|
8
9
|
import type { L1ToL2MessageSource } from '@aztec/stdlib/messaging';
|
|
10
|
+
import type { P2PClientType } from '@aztec/stdlib/p2p';
|
|
9
11
|
import { type TelemetryClient, type Traceable, type Tracer } from '@aztec/telemetry-client';
|
|
10
12
|
import type { SpecificProverNodeConfig } from './config.js';
|
|
11
13
|
import type { EpochProvingJobData } from './job/epoch-proving-job-data.js';
|
|
@@ -26,7 +28,7 @@ export declare class ProverNode implements EpochMonitorHandler, ProverNodeApi, T
|
|
|
26
28
|
protected readonly l1ToL2MessageSource: L1ToL2MessageSource;
|
|
27
29
|
protected readonly contractDataSource: ContractDataSource;
|
|
28
30
|
protected readonly worldState: WorldStateSynchronizer;
|
|
29
|
-
protected readonly
|
|
31
|
+
protected readonly p2pClient: Pick<P2PClient<P2PClientType.Prover>, 'getTxProvider'> & Partial<Service>;
|
|
30
32
|
protected readonly epochsMonitor: EpochMonitor;
|
|
31
33
|
protected readonly telemetryClient: TelemetryClient;
|
|
32
34
|
private log;
|
|
@@ -36,12 +38,10 @@ export declare class ProverNode implements EpochMonitorHandler, ProverNodeApi, T
|
|
|
36
38
|
private jobMetrics;
|
|
37
39
|
private rewardsMetrics;
|
|
38
40
|
private l1Metrics;
|
|
39
|
-
private txFetcher;
|
|
40
|
-
private lastBlockNumber;
|
|
41
41
|
readonly tracer: Tracer;
|
|
42
|
-
constructor(prover: EpochProverManager, publisher: ProverNodePublisher, l2BlockSource: L2BlockSource & Partial<Service>, l1ToL2MessageSource: L1ToL2MessageSource, contractDataSource: ContractDataSource, worldState: WorldStateSynchronizer,
|
|
42
|
+
constructor(prover: EpochProverManager, publisher: ProverNodePublisher, l2BlockSource: L2BlockSource & Partial<Service>, l1ToL2MessageSource: L1ToL2MessageSource, contractDataSource: ContractDataSource, worldState: WorldStateSynchronizer, p2pClient: Pick<P2PClient<P2PClientType.Prover>, 'getTxProvider'> & Partial<Service>, epochsMonitor: EpochMonitor, config?: Partial<ProverNodeOptions>, telemetryClient?: TelemetryClient);
|
|
43
43
|
getProverId(): Fr;
|
|
44
|
-
getP2P():
|
|
44
|
+
getP2P(): Pick<P2PClient<P2PClientType.Prover>, "getTxProvider"> & Partial<Service>;
|
|
45
45
|
/**
|
|
46
46
|
* Handles an epoch being completed by starting a proof for it if there are no active jobs for it.
|
|
47
47
|
* @param epochNumber - The epoch number that was just completed.
|
|
@@ -86,8 +86,6 @@ export declare class ProverNode implements EpochMonitorHandler, ProverNodeApi, T
|
|
|
86
86
|
private checkMaximumPendingJobs;
|
|
87
87
|
private createProvingJob;
|
|
88
88
|
private getL1Constants;
|
|
89
|
-
/** Monitors for new blocks and requests their txs from the p2p layer to ensure they are available for proving. */
|
|
90
|
-
private checkForTxs;
|
|
91
89
|
private gatherEpochData;
|
|
92
90
|
private gatherBlocks;
|
|
93
91
|
private gatherTxs;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prover-node.d.ts","sourceRoot":"","sources":["../src/prover-node.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAC;
|
|
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
|
@@ -8,7 +8,6 @@ import { assertRequired, compact, pick, sum } from '@aztec/foundation/collection
|
|
|
8
8
|
import { memoize } from '@aztec/foundation/decorators';
|
|
9
9
|
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
10
10
|
import { createLogger } from '@aztec/foundation/log';
|
|
11
|
-
import { RunningPromise } from '@aztec/foundation/running-promise';
|
|
12
11
|
import { DateProvider } from '@aztec/foundation/timer';
|
|
13
12
|
import { PublicProcessorFactory } from '@aztec/simulator/server';
|
|
14
13
|
import { getProofSubmissionDeadlineTimestamp } from '@aztec/stdlib/epoch-helpers';
|
|
@@ -28,7 +27,7 @@ import { ProverNodeJobMetrics, ProverNodeRewardsMetrics } from './metrics.js';
|
|
|
28
27
|
l1ToL2MessageSource;
|
|
29
28
|
contractDataSource;
|
|
30
29
|
worldState;
|
|
31
|
-
|
|
30
|
+
p2pClient;
|
|
32
31
|
epochsMonitor;
|
|
33
32
|
telemetryClient;
|
|
34
33
|
log;
|
|
@@ -38,17 +37,15 @@ import { ProverNodeJobMetrics, ProverNodeRewardsMetrics } from './metrics.js';
|
|
|
38
37
|
jobMetrics;
|
|
39
38
|
rewardsMetrics;
|
|
40
39
|
l1Metrics;
|
|
41
|
-
txFetcher;
|
|
42
|
-
lastBlockNumber;
|
|
43
40
|
tracer;
|
|
44
|
-
constructor(prover, publisher, l2BlockSource, l1ToL2MessageSource, contractDataSource, worldState,
|
|
41
|
+
constructor(prover, publisher, l2BlockSource, l1ToL2MessageSource, contractDataSource, worldState, p2pClient, epochsMonitor, config = {}, telemetryClient = getTelemetryClient()){
|
|
45
42
|
this.prover = prover;
|
|
46
43
|
this.publisher = publisher;
|
|
47
44
|
this.l2BlockSource = l2BlockSource;
|
|
48
45
|
this.l1ToL2MessageSource = l1ToL2MessageSource;
|
|
49
46
|
this.contractDataSource = contractDataSource;
|
|
50
47
|
this.worldState = worldState;
|
|
51
|
-
this.
|
|
48
|
+
this.p2pClient = p2pClient;
|
|
52
49
|
this.epochsMonitor = epochsMonitor;
|
|
53
50
|
this.telemetryClient = telemetryClient;
|
|
54
51
|
this.log = createLogger('prover-node');
|
|
@@ -64,6 +61,7 @@ import { ProverNodeJobMetrics, ProverNodeRewardsMetrics } from './metrics.js';
|
|
|
64
61
|
txGatheringIntervalMs: 1_000,
|
|
65
62
|
txGatheringBatchSize: 10,
|
|
66
63
|
txGatheringMaxParallelRequestsPerNode: 100,
|
|
64
|
+
txGatheringTimeoutMs: 120_000,
|
|
67
65
|
proverNodeFailedEpochStore: undefined,
|
|
68
66
|
...compact(config)
|
|
69
67
|
};
|
|
@@ -72,13 +70,12 @@ import { ProverNodeJobMetrics, ProverNodeRewardsMetrics } from './metrics.js';
|
|
|
72
70
|
this.tracer = telemetryClient.getTracer('ProverNode');
|
|
73
71
|
this.jobMetrics = new ProverNodeJobMetrics(meter, telemetryClient.getTracer('EpochProvingJob'));
|
|
74
72
|
this.rewardsMetrics = new ProverNodeRewardsMetrics(meter, EthAddress.fromField(this.prover.getProverId()), this.publisher.getRollupContract());
|
|
75
|
-
this.txFetcher = new RunningPromise(()=>this.checkForTxs(), this.log, this.config.txGatheringIntervalMs);
|
|
76
73
|
}
|
|
77
74
|
getProverId() {
|
|
78
75
|
return this.prover.getProverId();
|
|
79
76
|
}
|
|
80
77
|
getP2P() {
|
|
81
|
-
return this.
|
|
78
|
+
return this.p2pClient;
|
|
82
79
|
}
|
|
83
80
|
/**
|
|
84
81
|
* Handles an epoch being completed by starting a proof for it if there are no active jobs for it.
|
|
@@ -111,7 +108,6 @@ import { ProverNodeJobMetrics, ProverNodeRewardsMetrics } from './metrics.js';
|
|
|
111
108
|
* Starts the prover node so it periodically checks for unproven epochs in the unfinalised chain from L1 and
|
|
112
109
|
* starts proving jobs for them.
|
|
113
110
|
*/ async start() {
|
|
114
|
-
this.txFetcher.start();
|
|
115
111
|
this.epochsMonitor.start(this);
|
|
116
112
|
this.l1Metrics.start();
|
|
117
113
|
await this.rewardsMetrics.start();
|
|
@@ -121,14 +117,13 @@ import { ProverNodeJobMetrics, ProverNodeRewardsMetrics } from './metrics.js';
|
|
|
121
117
|
* Stops the prover node and all its dependencies.
|
|
122
118
|
*/ async stop() {
|
|
123
119
|
this.log.info('Stopping ProverNode');
|
|
124
|
-
await this.txFetcher.stop();
|
|
125
120
|
await this.epochsMonitor.stop();
|
|
126
121
|
await this.prover.stop();
|
|
122
|
+
await tryStop(this.p2pClient);
|
|
127
123
|
await tryStop(this.l2BlockSource);
|
|
128
124
|
this.publisher.interrupt();
|
|
129
125
|
await Promise.all(Array.from(this.jobs.values()).map((job)=>job.stop()));
|
|
130
126
|
await this.worldState.stop();
|
|
131
|
-
await tryStop(this.coordination);
|
|
132
127
|
this.l1Metrics.stop();
|
|
133
128
|
this.rewardsMetrics.stop();
|
|
134
129
|
await this.telemetryClient.stop();
|
|
@@ -226,30 +221,24 @@ import { ProverNodeJobMetrics, ProverNodeRewardsMetrics } from './metrics.js';
|
|
|
226
221
|
getL1Constants() {
|
|
227
222
|
return this.l2BlockSource.getL1Constants();
|
|
228
223
|
}
|
|
229
|
-
/** Monitors for new blocks and requests their txs from the p2p layer to ensure they are available for proving. */ async checkForTxs() {
|
|
230
|
-
const blockNumber = await this.l2BlockSource.getBlockNumber();
|
|
231
|
-
if (this.lastBlockNumber === undefined || blockNumber > this.lastBlockNumber) {
|
|
232
|
-
const block = await this.l2BlockSource.getBlock(blockNumber);
|
|
233
|
-
if (!block) {
|
|
234
|
-
return;
|
|
235
|
-
}
|
|
236
|
-
const txHashes = block.body.txEffects.map((tx)=>tx.txHash);
|
|
237
|
-
this.log.verbose(`Fetching ${txHashes.length} tx hashes for block number ${blockNumber} from coordination`);
|
|
238
|
-
await this.coordination.gatherTxs(txHashes); // This stores the txs in the tx pool, no need to persist them here
|
|
239
|
-
this.lastBlockNumber = blockNumber;
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
224
|
async gatherEpochData(epochNumber) {
|
|
243
225
|
const blocks = await this.gatherBlocks(epochNumber);
|
|
244
|
-
const
|
|
226
|
+
const txArray = await this.gatherTxs(epochNumber, blocks);
|
|
227
|
+
const txs = new Map(txArray.map((tx)=>[
|
|
228
|
+
tx.getTxHash().toString(),
|
|
229
|
+
tx
|
|
230
|
+
]));
|
|
245
231
|
const l1ToL2Messages = await this.gatherMessages(epochNumber, blocks);
|
|
246
232
|
const previousBlockHeader = await this.gatherPreviousBlockHeader(epochNumber, blocks[0]);
|
|
233
|
+
const [lastBlock] = await this.l2BlockSource.getPublishedBlocks(blocks.at(-1).number, 1);
|
|
234
|
+
const attestations = lastBlock?.attestations ?? [];
|
|
247
235
|
return {
|
|
248
236
|
blocks,
|
|
249
237
|
txs,
|
|
250
238
|
l1ToL2Messages,
|
|
251
239
|
epochNumber,
|
|
252
|
-
previousBlockHeader
|
|
240
|
+
previousBlockHeader,
|
|
241
|
+
attestations
|
|
253
242
|
};
|
|
254
243
|
}
|
|
255
244
|
async gatherBlocks(epochNumber) {
|
|
@@ -260,17 +249,20 @@ import { ProverNodeJobMetrics, ProverNodeRewardsMetrics } from './metrics.js';
|
|
|
260
249
|
return blocks;
|
|
261
250
|
}
|
|
262
251
|
async gatherTxs(epochNumber, blocks) {
|
|
263
|
-
const
|
|
264
|
-
const
|
|
265
|
-
|
|
252
|
+
const deadline = new Date(this.dateProvider.now() + this.config.txGatheringTimeoutMs);
|
|
253
|
+
const txProvider = this.p2pClient.getTxProvider();
|
|
254
|
+
const txsByBlock = await Promise.all(blocks.map((block)=>txProvider.getTxsForBlock(block, {
|
|
255
|
+
deadline
|
|
256
|
+
})));
|
|
257
|
+
const txs = txsByBlock.map(({ txs })=>txs).flat();
|
|
258
|
+
const missingTxs = txsByBlock.map(({ missingTxs })=>missingTxs).flat();
|
|
259
|
+
if (missingTxs.length === 0) {
|
|
266
260
|
this.log.verbose(`Gathered all ${txs.length} txs for epoch ${epochNumber}`, {
|
|
267
261
|
epochNumber
|
|
268
262
|
});
|
|
269
263
|
return txs;
|
|
270
264
|
}
|
|
271
|
-
|
|
272
|
-
const missingTxHashes = txsToFind.filter((txHashToFind)=>!txHashesFound.some((txHashFound)=>txHashToFind.equals(txHashFound))).join(', ');
|
|
273
|
-
throw new Error(`Txs not found for epoch ${epochNumber}: ${missingTxHashes}`);
|
|
265
|
+
throw new Error(`Txs not found for epoch ${epochNumber}: ${missingTxs.map((hash)=>hash.toString()).join(', ')}`);
|
|
274
266
|
}
|
|
275
267
|
async gatherMessages(epochNumber, blocks) {
|
|
276
268
|
const messages = await Promise.all(blocks.map((b)=>this.l1ToL2MessageSource.getL1ToL2Messages(b.number)));
|
|
@@ -318,9 +310,6 @@ _ts_decorate([
|
|
|
318
310
|
_ts_decorate([
|
|
319
311
|
memoize
|
|
320
312
|
], ProverNode.prototype, "getL1Constants", null);
|
|
321
|
-
_ts_decorate([
|
|
322
|
-
trackSpan('ProverNode.checkForTxs')
|
|
323
|
-
], ProverNode.prototype, "checkForTxs", null);
|
|
324
313
|
_ts_decorate([
|
|
325
314
|
trackSpan('ProverNode.gatherEpochData', (epochNumber)=>({
|
|
326
315
|
[Attributes.EPOCH_NUMBER]: Number(epochNumber)
|