@aztec/prover-node 1.0.0-nightly.20250708 → 1.0.0-staging.1
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 +2 -5
- package/dest/factory.d.ts +6 -8
- package/dest/factory.d.ts.map +1 -1
- package/dest/factory.js +10 -13
- package/dest/prover-coordination/combined-prover-coordination.d.ts +22 -0
- package/dest/prover-coordination/combined-prover-coordination.d.ts.map +1 -0
- package/dest/prover-coordination/combined-prover-coordination.js +140 -0
- package/dest/prover-coordination/config.d.ts +7 -0
- package/dest/prover-coordination/config.d.ts.map +1 -0
- package/dest/prover-coordination/config.js +12 -0
- package/dest/prover-coordination/factory.d.ts +23 -0
- package/dest/prover-coordination/factory.d.ts.map +1 -0
- package/dest/prover-coordination/factory.js +52 -0
- package/dest/prover-coordination/index.d.ts +3 -0
- package/dest/prover-coordination/index.d.ts.map +1 -0
- package/dest/prover-coordination/index.js +2 -0
- package/dest/prover-node.d.ts +8 -6
- package/dest/prover-node.d.ts.map +1 -1
- package/dest/prover-node.js +33 -15
- package/package.json +21 -21
- package/src/config.ts +4 -6
- package/src/factory.ts +20 -41
- package/src/prover-coordination/combined-prover-coordination.ts +164 -0
- package/src/prover-coordination/config.ts +18 -0
- package/src/prover-coordination/factory.ts +86 -0
- package/src/prover-coordination/index.ts +2 -0
- package/src/prover-node.ts +38 -13
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
|
-
|
|
12
|
+
import { type ProverCoordinationConfig } from './prover-coordination/config.js';
|
|
13
|
+
export type ProverNodeConfig = ArchiverConfig & ProverClientUserConfig & P2PConfig & WorldStateConfig & PublisherConfig & TxSenderConfig & DataStoreConfig & ProverCoordinationConfig & SharedNodeConfig & SpecificProverNodeConfig & GenesisStateConfig;
|
|
13
14
|
export type SpecificProverNodeConfig = {
|
|
14
15
|
proverNodeMaxPendingJobs: number;
|
|
15
16
|
proverNodePollingIntervalMs: number;
|
|
16
17
|
proverNodeMaxParallelBlocksPerEpoch: number;
|
|
17
18
|
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,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,
|
|
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,OAAO,EAAE,KAAK,wBAAwB,EAAoC,MAAM,iCAAiC,CAAC;AAElH,MAAM,MAAM,gBAAgB,GAAG,cAAc,GAC3C,sBAAsB,GACtB,SAAS,GACT,gBAAgB,GAChB,eAAe,GACf,cAAc,GACd,eAAe,GACf,wBAAwB,GACxB,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,qBAAqB,EAAE,MAAM,CAAC;IAC9B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,qCAAqC,EAAE,MAAM,CAAC;CAC/C,CAAC;AAwCF,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;AAED,wBAAgB,aAAa,CAAC,UAAU,EAAE,gBAAgB,GAAG,gBAAgB,GAAG,kBAAkB,CAMjG"}
|
package/dest/config.js
CHANGED
|
@@ -9,6 +9,7 @@ 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';
|
|
12
13
|
const specificProverNodeConfigMappings = {
|
|
13
14
|
proverNodeMaxPendingJobs: {
|
|
14
15
|
env: 'PROVER_NODE_MAX_PENDING_JOBS',
|
|
@@ -44,11 +45,6 @@ const specificProverNodeConfigMappings = {
|
|
|
44
45
|
env: 'PROVER_NODE_TX_GATHERING_MAX_PARALLEL_REQUESTS_PER_NODE',
|
|
45
46
|
description: 'How many tx requests to make in parallel to each node',
|
|
46
47
|
...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)
|
|
52
48
|
}
|
|
53
49
|
};
|
|
54
50
|
export const proverNodeConfigMappings = {
|
|
@@ -59,6 +55,7 @@ export const proverNodeConfigMappings = {
|
|
|
59
55
|
...worldStateConfigMappings,
|
|
60
56
|
...getPublisherConfigMappings('PROVER'),
|
|
61
57
|
...getTxSenderConfigMappings('PROVER'),
|
|
58
|
+
...proverCoordinationConfigMappings,
|
|
62
59
|
...specificProverNodeConfigMappings,
|
|
63
60
|
...genesisStateConfigMappings,
|
|
64
61
|
...sharedNodeConfigMappings
|
package/dest/factory.d.ts
CHANGED
|
@@ -2,27 +2,25 @@ 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';
|
|
6
5
|
import type { DataStoreConfig } from '@aztec/kv-store/config';
|
|
7
|
-
import type {
|
|
6
|
+
import type { ProvingJobBroker } from '@aztec/stdlib/interfaces/server';
|
|
8
7
|
import type { PublicDataTreeLeaf } from '@aztec/stdlib/trees';
|
|
9
8
|
import { type TelemetryClient } from '@aztec/telemetry-client';
|
|
10
9
|
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
|
-
|
|
13
|
+
/** Creates a new prover node given a config. */
|
|
14
|
+
export declare function createProverNode(userConfig: ProverNodeConfig & DataStoreConfig, deps?: {
|
|
14
15
|
telemetry?: TelemetryClient;
|
|
15
16
|
log?: Logger;
|
|
16
|
-
aztecNodeTxProvider?:
|
|
17
|
+
aztecNodeTxProvider?: TxSource;
|
|
17
18
|
archiver?: Archiver;
|
|
18
19
|
publisher?: ProverNodePublisher;
|
|
19
20
|
blobSinkClient?: BlobSinkClientInterface;
|
|
20
21
|
broker?: ProvingJobBroker;
|
|
21
22
|
l1TxUtils?: L1TxUtils;
|
|
22
|
-
|
|
23
|
-
};
|
|
24
|
-
/** Creates a new prover node given a config. */
|
|
25
|
-
export declare function createProverNode(userConfig: ProverNodeConfig & DataStoreConfig, deps?: ProverNodeDeps, options?: {
|
|
23
|
+
}, options?: {
|
|
26
24
|
prefilledPublicData?: PublicDataTreeLeaf[];
|
|
27
25
|
}): Promise<ProverNode>;
|
|
28
26
|
//# 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;AAChE,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,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAI9D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACxE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAE,KAAK,eAAe,EAAsB,MAAM,yBAAyB,CAAC;AAGnF,OAAO,EAAE,KAAK,gBAAgB,EAAiB,MAAM,aAAa,CAAC;AAEnE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uDAAuD,CAAC;AAEtF,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,gDAAgD;AAChD,wBAAsB,gBAAgB,CACpC,UAAU,EAAE,gBAAgB,GAAG,eAAe,EAC9C,IAAI,GAAE;IACJ,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,mBAAmB,CAAC,EAAE,QAAQ,CAAC;IAC/B,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;CAClB,EACN,OAAO,GAAE;IACP,mBAAmB,CAAC,EAAE,kBAAkB,EAAE,CAAC;CACvC,uBAgFP"}
|
package/dest/factory.js
CHANGED
|
@@ -1,27 +1,22 @@
|
|
|
1
1
|
import { createArchiver } from '@aztec/archiver';
|
|
2
|
-
import { BBCircuitVerifier, QueuedIVCVerifier, TestCircuitVerifier } from '@aztec/bb-prover';
|
|
3
2
|
import { createBlobSinkClient } from '@aztec/blob-sink/client';
|
|
4
3
|
import { EpochCache } from '@aztec/epoch-cache';
|
|
5
4
|
import { L1TxUtils, RollupContract, createEthereumChain, createExtendedL1Client } from '@aztec/ethereum';
|
|
6
5
|
import { pick } from '@aztec/foundation/collection';
|
|
7
6
|
import { createLogger } from '@aztec/foundation/log';
|
|
8
|
-
import { DateProvider } from '@aztec/foundation/timer';
|
|
9
7
|
import { trySnapshotSync } from '@aztec/node-lib/actions';
|
|
10
|
-
import { NodeRpcTxSource, createP2PClient } from '@aztec/p2p';
|
|
11
8
|
import { createProverClient } from '@aztec/prover-client';
|
|
12
9
|
import { createAndStartProvingBroker } from '@aztec/prover-client/broker';
|
|
13
|
-
import { P2PClientType } from '@aztec/stdlib/p2p';
|
|
14
|
-
import { getPackageVersion } from '@aztec/stdlib/update-checker';
|
|
15
10
|
import { getTelemetryClient } from '@aztec/telemetry-client';
|
|
16
11
|
import { createWorldStateSynchronizer } from '@aztec/world-state';
|
|
17
12
|
import { resolveConfig } from './config.js';
|
|
18
13
|
import { EpochMonitor } from './monitors/epoch-monitor.js';
|
|
14
|
+
import { createProverCoordination } from './prover-coordination/factory.js';
|
|
19
15
|
import { ProverNodePublisher } from './prover-node-publisher.js';
|
|
20
16
|
import { ProverNode } from './prover-node.js';
|
|
21
17
|
/** Creates a new prover node given a config. */ export async function createProverNode(userConfig, deps = {}, options = {}) {
|
|
22
18
|
const config = resolveConfig(userConfig);
|
|
23
19
|
const telemetry = deps.telemetry ?? getTelemetryClient();
|
|
24
|
-
const dateProvider = deps.dateProvider ?? new DateProvider();
|
|
25
20
|
const blobSinkClient = deps.blobSinkClient ?? createBlobSinkClient(config, {
|
|
26
21
|
logger: createLogger('prover-node:blob-sink:client')
|
|
27
22
|
});
|
|
@@ -50,18 +45,20 @@ import { ProverNode } from './prover-node.js';
|
|
|
50
45
|
l1TxUtils
|
|
51
46
|
});
|
|
52
47
|
const epochCache = await EpochCache.create(config.l1Contracts.rollupAddress, config);
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
48
|
+
// If config.p2pEnabled is true, createProverCoordination will create a p2p client where txs are requested
|
|
49
|
+
// If config.proverCoordinationNodeUrls is not empty, createProverCoordination will create set of aztec node clients from which txs are requested
|
|
50
|
+
const proverCoordination = await createProverCoordination(config, {
|
|
51
|
+
aztecNodeTxProvider: deps.aztecNodeTxProvider,
|
|
52
|
+
worldStateSynchronizer,
|
|
53
|
+
archiver,
|
|
54
|
+
epochCache,
|
|
55
|
+
telemetry
|
|
58
56
|
});
|
|
59
|
-
await p2pClient.start();
|
|
60
57
|
const proverNodeConfig = {
|
|
61
58
|
...pick(config, 'proverNodeMaxPendingJobs', 'proverNodeMaxParallelBlocksPerEpoch', 'proverNodePollingIntervalMs', 'txGatheringMaxParallelRequests', 'txGatheringIntervalMs', 'txGatheringTimeoutMs', 'proverNodeFailedEpochStore', 'dataDirectory', 'l1ChainId', 'rollupVersion')
|
|
62
59
|
};
|
|
63
60
|
const epochMonitor = await EpochMonitor.create(archiver, {
|
|
64
61
|
pollingIntervalMs: config.proverNodePollingIntervalMs
|
|
65
62
|
}, telemetry);
|
|
66
|
-
return new ProverNode(prover, publisher, archiver, archiver, archiver, worldStateSynchronizer,
|
|
63
|
+
return new ProverNode(prover, publisher, archiver, archiver, archiver, worldStateSynchronizer, proverCoordination, epochMonitor, proverNodeConfig, telemetry);
|
|
67
64
|
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { P2P } from '@aztec/p2p';
|
|
2
|
+
import type { P2PClient, ProverCoordination } from '@aztec/stdlib/interfaces/server';
|
|
3
|
+
import { type Tx, TxHash } from '@aztec/stdlib/tx';
|
|
4
|
+
export type CombinedCoordinationOptions = {
|
|
5
|
+
txGatheringBatchSize: number;
|
|
6
|
+
txGatheringMaxParallelRequestsPerNode: number;
|
|
7
|
+
};
|
|
8
|
+
export interface TxSource {
|
|
9
|
+
getTxsByHash(txHashes: TxHash[]): Promise<(Tx | undefined)[]>;
|
|
10
|
+
}
|
|
11
|
+
export declare class CombinedProverCoordination implements ProverCoordination {
|
|
12
|
+
#private;
|
|
13
|
+
readonly p2p: P2P | undefined;
|
|
14
|
+
readonly aztecNodes: TxSource[];
|
|
15
|
+
private readonly options;
|
|
16
|
+
private readonly log;
|
|
17
|
+
constructor(p2p: P2P | undefined, aztecNodes: TxSource[], options?: CombinedCoordinationOptions, log?: import("@aztec/foundation/log").Logger);
|
|
18
|
+
getP2PClient(): P2PClient | undefined;
|
|
19
|
+
getTxsByHash(txHashes: TxHash[]): Promise<Tx[]>;
|
|
20
|
+
gatherTxs(txHashes: TxHash[]): Promise<void>;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=combined-prover-coordination.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"combined-prover-coordination.d.ts","sourceRoot":"","sources":["../../src/prover-coordination/combined-prover-coordination.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,KAAK,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrF,OAAO,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAEnD,MAAM,MAAM,2BAA2B,GAAG;IAExC,oBAAoB,EAAE,MAAM,CAAC;IAC7B,qCAAqC,EAAE,MAAM,CAAC;CAC/C,CAAC;AASF,MAAM,WAAW,QAAQ;IACvB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,EAAE,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC;CAC/D;AAuCD,qBAAa,0BAA2B,YAAW,kBAAkB;;aAEjD,GAAG,EAAE,GAAG,GAAG,SAAS;aACpB,UAAU,EAAE,QAAQ,EAAE;IACtC,OAAO,CAAC,QAAQ,CAAC,OAAO;IAIxB,OAAO,CAAC,QAAQ,CAAC,GAAG;gBANJ,GAAG,EAAE,GAAG,GAAG,SAAS,EACpB,UAAU,EAAE,QAAQ,EAAE,EACrB,OAAO,GAAE,2BAGzB,EACgB,GAAG,yCAA2D;IAG1E,YAAY,IAAI,SAAS,GAAG,SAAS;IAI/B,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,EAAE,EAAE,CAAC;IAY/C,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;CA4E1D"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { asyncPool } from '@aztec/foundation/async-pool';
|
|
2
|
+
import { createLogger } from '@aztec/foundation/log';
|
|
3
|
+
import { TxHash } from '@aztec/stdlib/tx';
|
|
4
|
+
// Wraps the p2p client into a coordination pool
|
|
5
|
+
class P2PCoordinationPool {
|
|
6
|
+
p2p;
|
|
7
|
+
constructor(p2p){
|
|
8
|
+
this.p2p = p2p;
|
|
9
|
+
}
|
|
10
|
+
getTxsByHash(txHashes) {
|
|
11
|
+
return this.p2p.getTxsByHash(txHashes, undefined);
|
|
12
|
+
}
|
|
13
|
+
hasTxsInPool(txHashes) {
|
|
14
|
+
return this.p2p.hasTxsInPool(txHashes);
|
|
15
|
+
}
|
|
16
|
+
getTxsByHashFromPool(txHashes) {
|
|
17
|
+
return this.p2p.getTxsByHashFromPool(txHashes);
|
|
18
|
+
}
|
|
19
|
+
addTxs(txs) {
|
|
20
|
+
return this.p2p.addTxsToPool(txs);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
// Wraps an in memory tx pool into a coordination pool. Used for testing when no p2p/tx pool is available.
|
|
24
|
+
class InMemoryCoordinationPool {
|
|
25
|
+
txs = new Map();
|
|
26
|
+
getTxsByHash(txHashes) {
|
|
27
|
+
return Promise.resolve(txHashes.map((hash)=>this.txs.get(hash.toString())));
|
|
28
|
+
}
|
|
29
|
+
hasTxsInPool(txHashes) {
|
|
30
|
+
return Promise.resolve(txHashes.map((hash)=>this.txs.has(hash.toString())));
|
|
31
|
+
}
|
|
32
|
+
getTxsByHashFromPool(txHashes) {
|
|
33
|
+
return this.getTxsByHash(txHashes);
|
|
34
|
+
}
|
|
35
|
+
async addTxs(txs) {
|
|
36
|
+
const hashes = await Promise.all(txs.map((tx)=>tx.getTxHash()));
|
|
37
|
+
txs.forEach((tx, index)=>this.txs.set(hashes[index].toString(), tx));
|
|
38
|
+
return txs.length;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
// Class to implement combined transaction retrieval from p2p and any available nodes
|
|
42
|
+
export class CombinedProverCoordination {
|
|
43
|
+
p2p;
|
|
44
|
+
aztecNodes;
|
|
45
|
+
options;
|
|
46
|
+
log;
|
|
47
|
+
constructor(p2p, aztecNodes, options = {
|
|
48
|
+
txGatheringBatchSize: 10,
|
|
49
|
+
txGatheringMaxParallelRequestsPerNode: 10
|
|
50
|
+
}, log = createLogger('prover-node:combined-prover-coordination')){
|
|
51
|
+
this.p2p = p2p;
|
|
52
|
+
this.aztecNodes = aztecNodes;
|
|
53
|
+
this.options = options;
|
|
54
|
+
this.log = log;
|
|
55
|
+
}
|
|
56
|
+
getP2PClient() {
|
|
57
|
+
return this.p2p;
|
|
58
|
+
}
|
|
59
|
+
async getTxsByHash(txHashes) {
|
|
60
|
+
const pool = this.p2p ? new P2PCoordinationPool(this.p2p) : new InMemoryCoordinationPool();
|
|
61
|
+
await this.#gatherTxs(txHashes, pool);
|
|
62
|
+
const availability = await pool.hasTxsInPool(txHashes);
|
|
63
|
+
const notFound = txHashes.filter((_, index)=>!availability[index]);
|
|
64
|
+
if (notFound.length > 0) {
|
|
65
|
+
throw new Error(`Could not find txs: ${notFound.map((tx)=>tx.toString())}`);
|
|
66
|
+
}
|
|
67
|
+
const txs = await pool.getTxsByHashFromPool(txHashes);
|
|
68
|
+
return txs.filter((tx)=>tx !== undefined);
|
|
69
|
+
}
|
|
70
|
+
async gatherTxs(txHashes) {
|
|
71
|
+
const pool = this.p2p ? new P2PCoordinationPool(this.p2p) : new InMemoryCoordinationPool();
|
|
72
|
+
await this.#gatherTxs(txHashes, pool);
|
|
73
|
+
}
|
|
74
|
+
async #gatherTxs(txHashes, pool) {
|
|
75
|
+
const availability = await pool.hasTxsInPool(txHashes);
|
|
76
|
+
const notFound = txHashes.filter((_, index)=>!availability[index]);
|
|
77
|
+
const txsToFind = new Set(notFound.map((tx)=>tx.toString()));
|
|
78
|
+
if (txsToFind.size === 0) {
|
|
79
|
+
this.log.info(`Check for ${txHashes.length} txs found all in the pool`);
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
this.log.info(`Check for ${txHashes.length} txs found ${txsToFind.size} missing. Will gather from nodes and p2p`);
|
|
83
|
+
const originalToFind = txsToFind.size;
|
|
84
|
+
await this.#gatherTxsFromAllNodes(txsToFind, pool);
|
|
85
|
+
if (txsToFind.size === 0) {
|
|
86
|
+
this.log.info(`Found all ${originalToFind} txs directly from nodes`);
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
const toFindFromP2P = txsToFind.size;
|
|
90
|
+
this.log.verbose(`Gathering ${toFindFromP2P} txs from p2p network`);
|
|
91
|
+
const foundFromP2P = await pool.getTxsByHash([
|
|
92
|
+
...txsToFind
|
|
93
|
+
].map((tx)=>TxHash.fromString(tx)));
|
|
94
|
+
// TODO(!!): test for this
|
|
95
|
+
// getTxsByHash returns undefined for transactions that are not found, so it must be filtered to find the true length
|
|
96
|
+
const foundFromP2PLength = foundFromP2P.filter((tx)=>!!tx).length;
|
|
97
|
+
const numFoundFromNodes = originalToFind - toFindFromP2P;
|
|
98
|
+
const numNotFound = toFindFromP2P - foundFromP2PLength;
|
|
99
|
+
if (numNotFound === 0) {
|
|
100
|
+
this.log.info(`Found all ${originalToFind} txs. ${numFoundFromNodes} from nodes, ${foundFromP2PLength} from p2p`);
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
this.log.warn(`Failed to find ${numNotFound} txs from any source. Found ${foundFromP2PLength} from p2p and ${numFoundFromNodes} from nodes`);
|
|
104
|
+
}
|
|
105
|
+
async #gatherTxsFromAllNodes(txsToFind, pool) {
|
|
106
|
+
if (txsToFind.size === 0 || this.aztecNodes.length === 0) {
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
await Promise.all(this.aztecNodes.map((aztecNode)=>this.#gatherTxsFromNode(txsToFind, aztecNode, pool)));
|
|
110
|
+
}
|
|
111
|
+
async #gatherTxsFromNode(txsToFind, aztecNode, pool) {
|
|
112
|
+
const totalTxsRequired = txsToFind.size;
|
|
113
|
+
// It's possible that the set is empty as we already found the txs
|
|
114
|
+
if (totalTxsRequired === 0) {
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
let totalTxsGathered = 0;
|
|
118
|
+
const batches = [];
|
|
119
|
+
const allTxs = [
|
|
120
|
+
...txsToFind
|
|
121
|
+
];
|
|
122
|
+
while(allTxs.length){
|
|
123
|
+
const batch = allTxs.splice(0, this.options.txGatheringBatchSize);
|
|
124
|
+
batches.push(batch);
|
|
125
|
+
}
|
|
126
|
+
await asyncPool(this.options.txGatheringMaxParallelRequestsPerNode, batches, async (batch)=>{
|
|
127
|
+
try {
|
|
128
|
+
const txs = (await aztecNode.getTxsByHash(batch.map((b)=>TxHash.fromString(b)))).filter((tx)=>!!tx);
|
|
129
|
+
const hashes = await Promise.all(txs.map((tx)=>tx.getTxHash()));
|
|
130
|
+
await pool.addTxs(txs);
|
|
131
|
+
hashes.forEach((hash)=>txsToFind.delete(hash.toString()));
|
|
132
|
+
totalTxsGathered += txs.length;
|
|
133
|
+
} catch (err) {
|
|
134
|
+
this.log.error(`Error gathering txs from aztec node: ${err}`);
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
this.log.verbose(`Gathered ${totalTxsGathered} of ${totalTxsRequired} txs from a node`);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type ConfigMappingsType } from '@aztec/foundation/config';
|
|
2
|
+
export type ProverCoordinationConfig = {
|
|
3
|
+
proverCoordinationNodeUrls: string[];
|
|
4
|
+
};
|
|
5
|
+
export declare const proverCoordinationConfigMappings: ConfigMappingsType<ProverCoordinationConfig>;
|
|
6
|
+
export declare function getTxProviderConfigFromEnv(): ProverCoordinationConfig;
|
|
7
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/prover-coordination/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,kBAAkB,EAAyB,MAAM,0BAA0B,CAAC;AAE1F,MAAM,MAAM,wBAAwB,GAAG;IACrC,0BAA0B,EAAE,MAAM,EAAE,CAAC;CACtC,CAAC;AAEF,eAAO,MAAM,gCAAgC,EAAE,kBAAkB,CAAC,wBAAwB,CAOzF,CAAC;AAEF,wBAAgB,0BAA0B,IAAI,wBAAwB,CAErE"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { getConfigFromMappings } from '@aztec/foundation/config';
|
|
2
|
+
export const proverCoordinationConfigMappings = {
|
|
3
|
+
proverCoordinationNodeUrls: {
|
|
4
|
+
env: 'PROVER_COORDINATION_NODE_URLS',
|
|
5
|
+
description: 'The URLs of the tx provider nodes',
|
|
6
|
+
parseEnv: (val)=>val.split(',').map((url)=>url.trim().replace(/\/$/, '')),
|
|
7
|
+
defaultValue: []
|
|
8
|
+
}
|
|
9
|
+
};
|
|
10
|
+
export function getTxProviderConfigFromEnv() {
|
|
11
|
+
return getConfigFromMappings(proverCoordinationConfigMappings);
|
|
12
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { ArchiveSource, Archiver } from '@aztec/archiver';
|
|
2
|
+
import type { EpochCache } from '@aztec/epoch-cache';
|
|
3
|
+
import type { DataStoreConfig } from '@aztec/kv-store/config';
|
|
4
|
+
import type { ProverCoordination, WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server';
|
|
5
|
+
import { type TelemetryClient } from '@aztec/telemetry-client';
|
|
6
|
+
import type { ProverNodeConfig } from '../config.js';
|
|
7
|
+
import { type TxSource } from './combined-prover-coordination.js';
|
|
8
|
+
type ProverCoordinationDeps = {
|
|
9
|
+
aztecNodeTxProvider?: TxSource;
|
|
10
|
+
worldStateSynchronizer: WorldStateSynchronizer;
|
|
11
|
+
archiver: Archiver | ArchiveSource;
|
|
12
|
+
telemetry?: TelemetryClient;
|
|
13
|
+
epochCache: EpochCache;
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Creates a prover coordination service.
|
|
17
|
+
* If p2p is enabled, prover coordination is done via p2p.
|
|
18
|
+
* If an Aztec node URL is provided, prover coordination is done via the Aztec node over http.
|
|
19
|
+
* If an aztec node is provided, it is returned directly.
|
|
20
|
+
*/
|
|
21
|
+
export declare function createProverCoordination(config: ProverNodeConfig & DataStoreConfig, deps: ProverCoordinationDeps): Promise<ProverCoordination>;
|
|
22
|
+
export {};
|
|
23
|
+
//# sourceMappingURL=factory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/prover-coordination/factory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE/D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAK9D,OAAO,KAAK,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AAIlG,OAAO,EAAE,KAAK,eAAe,EAAmB,MAAM,yBAAyB,CAAC;AAEhF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAGL,KAAK,QAAQ,EACd,MAAM,mCAAmC,CAAC;AAG3C,KAAK,sBAAsB,GAAG;IAC5B,mBAAmB,CAAC,EAAE,QAAQ,CAAC;IAC/B,sBAAsB,EAAE,sBAAsB,CAAC;IAC/C,QAAQ,EAAE,QAAQ,GAAG,aAAa,CAAC;IACnC,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,UAAU,EAAE,UAAU,CAAC;CACxB,CAAC;AAEF;;;;;GAKG;AACH,wBAAsB,wBAAwB,CAC5C,MAAM,EAAE,gBAAgB,GAAG,eAAe,EAC1C,IAAI,EAAE,sBAAsB,GAC3B,OAAO,CAAC,kBAAkB,CAAC,CA6C7B"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { BBCircuitVerifier, TestCircuitVerifier } from '@aztec/bb-prover';
|
|
2
|
+
import { createLogger } from '@aztec/foundation/log';
|
|
3
|
+
import { getVKTreeRoot } from '@aztec/noir-protocol-circuits-types/vk-tree';
|
|
4
|
+
import { createP2PClient } from '@aztec/p2p';
|
|
5
|
+
import { protocolContractTreeRoot } from '@aztec/protocol-contracts';
|
|
6
|
+
import { createAztecNodeClient } from '@aztec/stdlib/interfaces/client';
|
|
7
|
+
import { P2PClientType } from '@aztec/stdlib/p2p';
|
|
8
|
+
import { getPackageVersion } from '@aztec/stdlib/update-checker';
|
|
9
|
+
import { getComponentsVersionsFromConfig } from '@aztec/stdlib/versioning';
|
|
10
|
+
import { makeTracedFetch } from '@aztec/telemetry-client';
|
|
11
|
+
import { CombinedProverCoordination } from './combined-prover-coordination.js';
|
|
12
|
+
/**
|
|
13
|
+
* Creates a prover coordination service.
|
|
14
|
+
* If p2p is enabled, prover coordination is done via p2p.
|
|
15
|
+
* If an Aztec node URL is provided, prover coordination is done via the Aztec node over http.
|
|
16
|
+
* If an aztec node is provided, it is returned directly.
|
|
17
|
+
*/ export async function createProverCoordination(config, deps) {
|
|
18
|
+
const log = createLogger('prover-node:prover-coordination');
|
|
19
|
+
const coordinationConfig = {
|
|
20
|
+
txGatheringBatchSize: config.txGatheringBatchSize ?? 10,
|
|
21
|
+
txGatheringMaxParallelRequestsPerNode: config.txGatheringMaxParallelRequestsPerNode ?? 10
|
|
22
|
+
};
|
|
23
|
+
if (deps.aztecNodeTxProvider) {
|
|
24
|
+
log.info('Using prover coordination via aztec node');
|
|
25
|
+
return new CombinedProverCoordination(undefined, [
|
|
26
|
+
deps.aztecNodeTxProvider
|
|
27
|
+
], coordinationConfig);
|
|
28
|
+
}
|
|
29
|
+
if (config.p2pEnabled) {
|
|
30
|
+
log.info('Using prover coordination via p2p');
|
|
31
|
+
if (!deps.archiver || !deps.worldStateSynchronizer || !deps.telemetry || !deps.epochCache) {
|
|
32
|
+
throw new Error('Missing dependencies for p2p prover coordination');
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
let nodes = [];
|
|
36
|
+
if (config.proverCoordinationNodeUrls && config.proverCoordinationNodeUrls.length > 0) {
|
|
37
|
+
log.info('Using prover coordination via node urls');
|
|
38
|
+
const versions = getComponentsVersionsFromConfig(config, protocolContractTreeRoot, getVKTreeRoot());
|
|
39
|
+
nodes = config.proverCoordinationNodeUrls.map((url)=>{
|
|
40
|
+
log.info(`Creating aztec node client for prover coordination with url: ${url}`);
|
|
41
|
+
return createAztecNodeClient(url, versions, makeTracedFetch([
|
|
42
|
+
1,
|
|
43
|
+
2,
|
|
44
|
+
3
|
|
45
|
+
], false));
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
const proofVerifier = config.realProofs ? await BBCircuitVerifier.new(config) : new TestCircuitVerifier();
|
|
49
|
+
const p2pClient = await createP2PClient(P2PClientType.Prover, config, deps.archiver, proofVerifier, deps.worldStateSynchronizer, deps.epochCache, getPackageVersion() ?? '', deps.telemetry);
|
|
50
|
+
await p2pClient.start();
|
|
51
|
+
return new CombinedProverCoordination(p2pClient, nodes, coordinationConfig);
|
|
52
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/prover-coordination/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC"}
|
package/dest/prover-node.d.ts
CHANGED
|
@@ -1,13 +1,11 @@
|
|
|
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';
|
|
4
3
|
import { PublicProcessorFactory } from '@aztec/simulator/server';
|
|
5
4
|
import type { L2BlockSource } from '@aztec/stdlib/block';
|
|
6
5
|
import type { ChainConfig } from '@aztec/stdlib/config';
|
|
7
6
|
import type { ContractDataSource } from '@aztec/stdlib/contract';
|
|
8
|
-
import { type EpochProverManager, type ProverNodeApi, type Service, type WorldStateSyncStatus, type WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server';
|
|
7
|
+
import { type EpochProverManager, type ProverCoordination, type ProverNodeApi, type Service, type WorldStateSyncStatus, type WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server';
|
|
9
8
|
import type { L1ToL2MessageSource } from '@aztec/stdlib/messaging';
|
|
10
|
-
import type { P2PClientType } from '@aztec/stdlib/p2p';
|
|
11
9
|
import { type TelemetryClient, type Traceable, type Tracer } from '@aztec/telemetry-client';
|
|
12
10
|
import type { SpecificProverNodeConfig } from './config.js';
|
|
13
11
|
import type { EpochProvingJobData } from './job/epoch-proving-job-data.js';
|
|
@@ -28,7 +26,7 @@ export declare class ProverNode implements EpochMonitorHandler, ProverNodeApi, T
|
|
|
28
26
|
protected readonly l1ToL2MessageSource: L1ToL2MessageSource;
|
|
29
27
|
protected readonly contractDataSource: ContractDataSource;
|
|
30
28
|
protected readonly worldState: WorldStateSynchronizer;
|
|
31
|
-
protected readonly
|
|
29
|
+
protected readonly coordination: ProverCoordination & Partial<Service>;
|
|
32
30
|
protected readonly epochsMonitor: EpochMonitor;
|
|
33
31
|
protected readonly telemetryClient: TelemetryClient;
|
|
34
32
|
private log;
|
|
@@ -38,10 +36,12 @@ export declare class ProverNode implements EpochMonitorHandler, ProverNodeApi, T
|
|
|
38
36
|
private jobMetrics;
|
|
39
37
|
private rewardsMetrics;
|
|
40
38
|
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, coordination: ProverCoordination & Partial<Service>, epochsMonitor: EpochMonitor, config?: Partial<ProverNodeOptions>, telemetryClient?: TelemetryClient);
|
|
43
43
|
getProverId(): Fr;
|
|
44
|
-
getP2P():
|
|
44
|
+
getP2P(): import("@aztec/stdlib/interfaces/server").P2PClient | undefined;
|
|
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,6 +86,8 @@ 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;
|
|
89
91
|
private gatherEpochData;
|
|
90
92
|
private gatherBlocks;
|
|
91
93
|
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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"}
|