@aztec/prover-node 0.47.0
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/README.md +1 -0
- package/dest/config.d.ts +8 -0
- package/dest/config.d.ts.map +1 -0
- package/dest/config.js +17 -0
- package/dest/factory.d.ts +15 -0
- package/dest/factory.d.ts.map +1 -0
- package/dest/factory.js +34 -0
- package/dest/http.d.ts +9 -0
- package/dest/http.d.ts.map +1 -0
- package/dest/http.js +19 -0
- package/dest/index.d.ts +5 -0
- package/dest/index.d.ts.map +1 -0
- package/dest/index.js +5 -0
- package/dest/job/block-proving-job.d.ts +25 -0
- package/dest/job/block-proving-job.d.ts.map +1 -0
- package/dest/job/block-proving-job.js +92 -0
- package/dest/prover-node.d.ts +51 -0
- package/dest/prover-node.d.ts.map +1 -0
- package/dest/prover-node.js +86 -0
- package/dest/tx-provider/aztec-node-tx-provider.d.ts +8 -0
- package/dest/tx-provider/aztec-node-tx-provider.d.ts.map +1 -0
- package/dest/tx-provider/aztec-node-tx-provider.js +10 -0
- package/dest/tx-provider/config.d.ts +5 -0
- package/dest/tx-provider/config.d.ts.map +1 -0
- package/dest/tx-provider/config.js +6 -0
- package/dest/tx-provider/factory.d.ts +4 -0
- package/dest/tx-provider/factory.d.ts.map +1 -0
- package/dest/tx-provider/factory.js +12 -0
- package/dest/tx-provider/index.d.ts +4 -0
- package/dest/tx-provider/index.d.ts.map +1 -0
- package/dest/tx-provider/index.js +4 -0
- package/package.json +85 -0
- package/src/config.ts +25 -0
- package/src/factory.ts +56 -0
- package/src/http.ts +25 -0
- package/src/index.ts +4 -0
- package/src/job/block-proving-job.ts +147 -0
- package/src/prover-node.ts +108 -0
- package/src/tx-provider/aztec-node-tx-provider.ts +10 -0
- package/src/tx-provider/config.ts +9 -0
- package/src/tx-provider/factory.ts +13 -0
- package/src/tx-provider/index.ts +3 -0
package/README.md
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# Prover Node
|
package/dest/config.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type ArchiverConfig } from '@aztec/archiver';
|
|
2
|
+
import { type ProverClientConfig } from '@aztec/prover-client';
|
|
3
|
+
import { type PublisherConfig, type TxSenderConfig } from '@aztec/sequencer-client';
|
|
4
|
+
import { type WorldStateConfig } from '@aztec/world-state';
|
|
5
|
+
import { type TxProviderConfig } from './tx-provider/config.js';
|
|
6
|
+
export type ProverNodeConfig = ArchiverConfig & ProverClientConfig & WorldStateConfig & PublisherConfig & TxSenderConfig & TxProviderConfig;
|
|
7
|
+
export declare function getProverNodeConfigFromEnv(): ProverNodeConfig;
|
|
8
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAA4B,MAAM,iBAAiB,CAAC;AAChF,OAAO,EAAE,KAAK,kBAAkB,EAAoB,MAAM,sBAAsB,CAAC;AACjF,OAAO,EAAE,KAAK,eAAe,EAAE,KAAK,cAAc,EAA4B,MAAM,yBAAyB,CAAC;AAC9G,OAAO,EAAE,KAAK,gBAAgB,EAA8B,MAAM,oBAAoB,CAAC;AAEvF,OAAO,EAAE,KAAK,gBAAgB,EAA8B,MAAM,yBAAyB,CAAC;AAE5F,MAAM,MAAM,gBAAgB,GAAG,cAAc,GAC3C,kBAAkB,GAClB,gBAAgB,GAChB,eAAe,GACf,cAAc,GACd,gBAAgB,CAAC;AAEnB,wBAAgB,0BAA0B,IAAI,gBAAgB,CAU7D"}
|
package/dest/config.js
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { getArchiverConfigFromEnv } from '@aztec/archiver';
|
|
2
|
+
import { getProverEnvVars } from '@aztec/prover-client';
|
|
3
|
+
import { getTxSenderConfigFromEnv } from '@aztec/sequencer-client';
|
|
4
|
+
import { getWorldStateConfigFromEnv } from '@aztec/world-state';
|
|
5
|
+
import { getTxProviderConfigFromEnv } from './tx-provider/config.js';
|
|
6
|
+
export function getProverNodeConfigFromEnv() {
|
|
7
|
+
const { PROOF_PUBLISH_RETRY_INTERVAL_MS } = process.env;
|
|
8
|
+
return {
|
|
9
|
+
...getArchiverConfigFromEnv(),
|
|
10
|
+
...getProverEnvVars(),
|
|
11
|
+
...getWorldStateConfigFromEnv(),
|
|
12
|
+
...getTxSenderConfigFromEnv('PROVER'),
|
|
13
|
+
...getTxProviderConfigFromEnv(),
|
|
14
|
+
l1PublishRetryIntervalMS: PROOF_PUBLISH_RETRY_INTERVAL_MS ? +PROOF_PUBLISH_RETRY_INTERVAL_MS : 1000,
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQXVCLHdCQUF3QixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDaEYsT0FBTyxFQUEyQixnQkFBZ0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2pGLE9BQU8sRUFBNkMsd0JBQXdCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUM5RyxPQUFPLEVBQXlCLDBCQUEwQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFdkYsT0FBTyxFQUF5QiwwQkFBMEIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBUzVGLE1BQU0sVUFBVSwwQkFBMEI7SUFDeEMsTUFBTSxFQUFFLCtCQUErQixFQUFFLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQztJQUN4RCxPQUFPO1FBQ0wsR0FBRyx3QkFBd0IsRUFBRTtRQUM3QixHQUFHLGdCQUFnQixFQUFFO1FBQ3JCLEdBQUcsMEJBQTBCLEVBQUU7UUFDL0IsR0FBRyx3QkFBd0IsQ0FBQyxRQUFRLENBQUM7UUFDckMsR0FBRywwQkFBMEIsRUFBRTtRQUMvQix3QkFBd0IsRUFBRSwrQkFBK0IsQ0FBQyxDQUFDLENBQUMsQ0FBQywrQkFBK0IsQ0FBQyxDQUFDLENBQUMsSUFBSztLQUNyRyxDQUFDO0FBQ0osQ0FBQyJ9
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type Archiver } from '@aztec/archiver';
|
|
2
|
+
import { type AztecNode } from '@aztec/circuit-types';
|
|
3
|
+
import { type DebugLogger } from '@aztec/foundation/log';
|
|
4
|
+
import { type TelemetryClient } from '@aztec/telemetry-client';
|
|
5
|
+
import { type ProverNodeConfig } from './config.js';
|
|
6
|
+
import { ProverNode } from './prover-node.js';
|
|
7
|
+
/** Creates a new prover node given a config. */
|
|
8
|
+
export declare function createProverNode(config: ProverNodeConfig, deps?: {
|
|
9
|
+
telemetry?: TelemetryClient;
|
|
10
|
+
log?: DebugLogger;
|
|
11
|
+
storeLog?: DebugLogger;
|
|
12
|
+
aztecNodeTxProvider?: AztecNode;
|
|
13
|
+
archiver?: Archiver;
|
|
14
|
+
}): Promise<ProverNode>;
|
|
15
|
+
//# sourceMappingURL=factory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
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,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,KAAK,WAAW,EAAqB,MAAM,uBAAuB,CAAC;AAK5E,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAI/D,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAI9C,gDAAgD;AAChD,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,gBAAgB,EACxB,IAAI,GAAE;IACJ,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,GAAG,CAAC,EAAE,WAAW,CAAC;IAClB,QAAQ,CAAC,EAAE,WAAW,CAAC;IACvB,mBAAmB,CAAC,EAAE,SAAS,CAAC;IAChC,QAAQ,CAAC,EAAE,QAAQ,CAAC;CAChB,uBA8BP"}
|
package/dest/factory.js
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { createArchiver } from '@aztec/archiver';
|
|
2
|
+
import { createDebugLogger } from '@aztec/foundation/log';
|
|
3
|
+
import { createStore } from '@aztec/kv-store/utils';
|
|
4
|
+
import { createProverClient } from '@aztec/prover-client';
|
|
5
|
+
import { getL1Publisher } from '@aztec/sequencer-client';
|
|
6
|
+
import { PublicProcessorFactory, createSimulationProvider } from '@aztec/simulator';
|
|
7
|
+
import { NoopTelemetryClient } from '@aztec/telemetry-client/noop';
|
|
8
|
+
import { createWorldStateSynchronizer } from '@aztec/world-state';
|
|
9
|
+
import { ProverNode } from './prover-node.js';
|
|
10
|
+
import { AztecNodeTxProvider } from './tx-provider/aztec-node-tx-provider.js';
|
|
11
|
+
import { createTxProvider } from './tx-provider/factory.js';
|
|
12
|
+
/** Creates a new prover node given a config. */
|
|
13
|
+
export async function createProverNode(config, deps = {}) {
|
|
14
|
+
const telemetry = deps.telemetry ?? new NoopTelemetryClient();
|
|
15
|
+
const log = deps.log ?? createDebugLogger('aztec:prover');
|
|
16
|
+
const storeLog = deps.storeLog ?? createDebugLogger('aztec:prover:lmdb');
|
|
17
|
+
const store = await createStore(config, config.l1Contracts.rollupAddress, storeLog);
|
|
18
|
+
const archiver = deps.archiver ?? (await createArchiver(config, store, telemetry, { blockUntilSync: true }));
|
|
19
|
+
log.verbose(`Created archiver and synced to block ${await archiver.getBlockNumber()}`);
|
|
20
|
+
const worldStateConfig = { ...config, worldStateProvenBlocksOnly: true };
|
|
21
|
+
const worldStateSynchronizer = await createWorldStateSynchronizer(worldStateConfig, store, archiver);
|
|
22
|
+
await worldStateSynchronizer.start();
|
|
23
|
+
const simulationProvider = await createSimulationProvider(config, log);
|
|
24
|
+
const prover = await createProverClient(config, worldStateSynchronizer, archiver);
|
|
25
|
+
// REFACTOR: Move publisher out of sequencer package and into an L1-related package
|
|
26
|
+
const publisher = getL1Publisher(config);
|
|
27
|
+
const latestWorldState = worldStateSynchronizer.getLatest();
|
|
28
|
+
const publicProcessorFactory = new PublicProcessorFactory(latestWorldState, archiver, simulationProvider, telemetry);
|
|
29
|
+
const txProvider = deps.aztecNodeTxProvider
|
|
30
|
+
? new AztecNodeTxProvider(deps.aztecNodeTxProvider)
|
|
31
|
+
: createTxProvider(config);
|
|
32
|
+
return new ProverNode(prover, publicProcessorFactory, publisher, archiver, txProvider);
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFjdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9mYWN0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBaUIsY0FBYyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFaEUsT0FBTyxFQUFvQixpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzVFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUMxRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLHdCQUF3QixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFcEYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbkUsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFHbEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQzlFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRTVELGdEQUFnRDtBQUNoRCxNQUFNLENBQUMsS0FBSyxVQUFVLGdCQUFnQixDQUNwQyxNQUF3QixFQUN4QixPQU1JLEVBQUU7SUFFTixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksbUJBQW1CLEVBQUUsQ0FBQztJQUM5RCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxJQUFJLGlCQUFpQixDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQzFELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLElBQUksaUJBQWlCLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUV6RSxNQUFNLEtBQUssR0FBRyxNQUFNLFdBQVcsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLFdBQVcsQ0FBQyxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFFcEYsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLE1BQU0sY0FBYyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLEVBQUUsY0FBYyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM3RyxHQUFHLENBQUMsT0FBTyxDQUFDLHdDQUF3QyxNQUFNLFFBQVEsQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFFdkYsTUFBTSxnQkFBZ0IsR0FBRyxFQUFFLEdBQUcsTUFBTSxFQUFFLDBCQUEwQixFQUFFLElBQUksRUFBRSxDQUFDO0lBQ3pFLE1BQU0sc0JBQXNCLEdBQUcsTUFBTSw0QkFBNEIsQ0FBQyxnQkFBZ0IsRUFBRSxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDckcsTUFBTSxzQkFBc0IsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUVyQyxNQUFNLGtCQUFrQixHQUFHLE1BQU0sd0JBQXdCLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBRXZFLE1BQU0sTUFBTSxHQUFHLE1BQU0sa0JBQWtCLENBQUMsTUFBTSxFQUFFLHNCQUFzQixFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBRWxGLG1GQUFtRjtJQUNuRixNQUFNLFNBQVMsR0FBRyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFekMsTUFBTSxnQkFBZ0IsR0FBRyxzQkFBc0IsQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUM1RCxNQUFNLHNCQUFzQixHQUFHLElBQUksc0JBQXNCLENBQUMsZ0JBQWdCLEVBQUUsUUFBUSxFQUFFLGtCQUFrQixFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBRXJILE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxtQkFBbUI7UUFDekMsQ0FBQyxDQUFDLElBQUksbUJBQW1CLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDO1FBQ25ELENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUU3QixPQUFPLElBQUksVUFBVSxDQUFDLE1BQU8sRUFBRSxzQkFBc0IsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBQzFGLENBQUMifQ==
|
package/dest/http.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { JsonRpcServer } from '@aztec/foundation/json-rpc/server';
|
|
2
|
+
import { type ProverNode } from './prover-node.js';
|
|
3
|
+
/**
|
|
4
|
+
* Wrap a ProverNode instance with a JSON RPC HTTP server.
|
|
5
|
+
* @param node - The ProverNode
|
|
6
|
+
* @returns An JSON-RPC HTTP server
|
|
7
|
+
*/
|
|
8
|
+
export declare function createProverNodeRpcServer(node: ProverNode): JsonRpcServer;
|
|
9
|
+
//# sourceMappingURL=http.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAElE,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,UAAU,iBAczD"}
|
package/dest/http.js
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { AztecAddress, EthAddress, Fr, Header } from '@aztec/circuits.js';
|
|
2
|
+
import { JsonRpcServer } from '@aztec/foundation/json-rpc/server';
|
|
3
|
+
/**
|
|
4
|
+
* Wrap a ProverNode instance with a JSON RPC HTTP server.
|
|
5
|
+
* @param node - The ProverNode
|
|
6
|
+
* @returns An JSON-RPC HTTP server
|
|
7
|
+
*/
|
|
8
|
+
export function createProverNodeRpcServer(node) {
|
|
9
|
+
const rpc = new JsonRpcServer(node, {
|
|
10
|
+
AztecAddress,
|
|
11
|
+
EthAddress,
|
|
12
|
+
Fr,
|
|
13
|
+
Header,
|
|
14
|
+
}, {},
|
|
15
|
+
// disable methods not part of the AztecNode interface
|
|
16
|
+
['start', 'stop', 'createProvingJob', 'work', 'getProver']);
|
|
17
|
+
return rpc;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9odHRwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMxRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFJbEU7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSx5QkFBeUIsQ0FBQyxJQUFnQjtJQUN4RCxNQUFNLEdBQUcsR0FBRyxJQUFJLGFBQWEsQ0FDM0IsSUFBSSxFQUNKO1FBQ0UsWUFBWTtRQUNaLFVBQVU7UUFDVixFQUFFO1FBQ0YsTUFBTTtLQUNQLEVBQ0QsRUFBRTtJQUNGLHNEQUFzRDtJQUN0RCxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxFQUFFLFdBQVcsQ0FBQyxDQUMzRCxDQUFDO0lBQ0YsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDIn0=
|
package/dest/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC;AACjC,cAAc,WAAW,CAAC"}
|
package/dest/index.js
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export * from './factory.js';
|
|
2
|
+
export * from './config.js';
|
|
3
|
+
export * from './prover-node.js';
|
|
4
|
+
export * from './http.js';
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxjQUFjLENBQUM7QUFDN0IsY0FBYyxhQUFhLENBQUM7QUFDNUIsY0FBYyxrQkFBa0IsQ0FBQztBQUNqQyxjQUFjLFdBQVcsQ0FBQyJ9
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { type BlockProver, type L2BlockSource, type TxProvider } from '@aztec/circuit-types';
|
|
2
|
+
import { type L1Publisher } from '@aztec/sequencer-client';
|
|
3
|
+
import { type PublicProcessorFactory } from '@aztec/simulator';
|
|
4
|
+
/**
|
|
5
|
+
* Job that grabs a range of blocks from the unfinalised chain from L1, gets their txs given their hashes,
|
|
6
|
+
* re-executes their public calls, generates a rollup proof, and submits it to L1. This job will update the
|
|
7
|
+
* world state as part of public call execution via the public processor.
|
|
8
|
+
*/
|
|
9
|
+
export declare class BlockProvingJob {
|
|
10
|
+
private prover;
|
|
11
|
+
private publicProcessorFactory;
|
|
12
|
+
private publisher;
|
|
13
|
+
private l2BlockSource;
|
|
14
|
+
private txProvider;
|
|
15
|
+
private state;
|
|
16
|
+
private log;
|
|
17
|
+
constructor(prover: BlockProver, publicProcessorFactory: PublicProcessorFactory, publisher: L1Publisher, l2BlockSource: L2BlockSource, txProvider: TxProvider);
|
|
18
|
+
getState(): BlockProvingJobState;
|
|
19
|
+
run(fromBlock: number, toBlock: number): Promise<void>;
|
|
20
|
+
private getBlock;
|
|
21
|
+
private getTxs;
|
|
22
|
+
private processTxs;
|
|
23
|
+
}
|
|
24
|
+
export type BlockProvingJobState = 'initialized' | 'started' | 'processing' | 'awaiting-prover' | 'publishing-proof' | 'completed';
|
|
25
|
+
//# sourceMappingURL=block-proving-job.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"block-proving-job.d.ts","sourceRoot":"","sources":["../../src/job/block-proving-job.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,WAAW,EAGhB,KAAK,aAAa,EAKlB,KAAK,UAAU,EAChB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAwB,KAAK,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAErF;;;;GAIG;AACH,qBAAa,eAAe;IAKxB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,sBAAsB;IAC9B,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,UAAU;IARpB,OAAO,CAAC,KAAK,CAAuC;IACpD,OAAO,CAAC,GAAG,CAAgD;gBAGjD,MAAM,EAAE,WAAW,EACnB,sBAAsB,EAAE,sBAAsB,EAC9C,SAAS,EAAE,WAAW,EACtB,aAAa,EAAE,aAAa,EAC5B,UAAU,EAAE,UAAU;IAGzB,QAAQ,IAAI,oBAAoB;IAI1B,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;YA8DrC,QAAQ;YAQR,MAAM;YAWN,UAAU;CAoBzB;AAED,MAAM,MAAM,oBAAoB,GAC5B,aAAa,GACb,SAAS,GACT,YAAY,GACZ,iBAAiB,GACjB,kBAAkB,GAClB,WAAW,CAAC"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { EmptyTxValidator, PROVING_STATUS, } from '@aztec/circuit-types';
|
|
2
|
+
import { createDebugLogger } from '@aztec/foundation/log';
|
|
3
|
+
/**
|
|
4
|
+
* Job that grabs a range of blocks from the unfinalised chain from L1, gets their txs given their hashes,
|
|
5
|
+
* re-executes their public calls, generates a rollup proof, and submits it to L1. This job will update the
|
|
6
|
+
* world state as part of public call execution via the public processor.
|
|
7
|
+
*/
|
|
8
|
+
export class BlockProvingJob {
|
|
9
|
+
constructor(prover, publicProcessorFactory, publisher, l2BlockSource, txProvider) {
|
|
10
|
+
this.prover = prover;
|
|
11
|
+
this.publicProcessorFactory = publicProcessorFactory;
|
|
12
|
+
this.publisher = publisher;
|
|
13
|
+
this.l2BlockSource = l2BlockSource;
|
|
14
|
+
this.txProvider = txProvider;
|
|
15
|
+
this.state = 'initialized';
|
|
16
|
+
this.log = createDebugLogger('aztec:block-proving-job');
|
|
17
|
+
}
|
|
18
|
+
getState() {
|
|
19
|
+
return this.state;
|
|
20
|
+
}
|
|
21
|
+
async run(fromBlock, toBlock) {
|
|
22
|
+
if (fromBlock !== toBlock) {
|
|
23
|
+
throw new Error(`Block ranges are not yet supported`);
|
|
24
|
+
}
|
|
25
|
+
this.log.info(`Starting block proving job`, { fromBlock, toBlock });
|
|
26
|
+
this.state = 'started';
|
|
27
|
+
// TODO: Fast-forward world state to fromBlock and/or await fromBlock to be published to the unproven chain
|
|
28
|
+
this.state = 'processing';
|
|
29
|
+
let historicalHeader = (await this.l2BlockSource.getBlock(fromBlock - 1))?.header;
|
|
30
|
+
for (let blockNumber = fromBlock; blockNumber <= toBlock; blockNumber++) {
|
|
31
|
+
const block = await this.getBlock(blockNumber);
|
|
32
|
+
const globalVariables = block.header.globalVariables;
|
|
33
|
+
const txHashes = block.body.txEffects.map(tx => tx.txHash);
|
|
34
|
+
const txCount = block.body.numberOfTxsIncludingPadded;
|
|
35
|
+
const l1ToL2Messages = []; // TODO: grab L1 to L2 messages for this block
|
|
36
|
+
this.log.verbose(`Starting block processing`, {
|
|
37
|
+
number: block.number,
|
|
38
|
+
blockHash: block.hash().toString(),
|
|
39
|
+
lastArchive: block.header.lastArchive.root,
|
|
40
|
+
noteHashTreeRoot: block.header.state.partial.noteHashTree.root,
|
|
41
|
+
nullifierTreeRoot: block.header.state.partial.nullifierTree.root,
|
|
42
|
+
publicDataTreeRoot: block.header.state.partial.publicDataTree.root,
|
|
43
|
+
historicalHeader: historicalHeader?.hash(),
|
|
44
|
+
...globalVariables,
|
|
45
|
+
});
|
|
46
|
+
const provingTicket = await this.prover.startNewBlock(txCount, globalVariables, l1ToL2Messages);
|
|
47
|
+
const publicProcessor = this.publicProcessorFactory.create(historicalHeader, globalVariables);
|
|
48
|
+
const txs = await this.getTxs(txHashes);
|
|
49
|
+
await this.processTxs(publicProcessor, txs, txCount);
|
|
50
|
+
this.log.verbose(`Processed all txs for block`, {
|
|
51
|
+
blockNumber: block.number,
|
|
52
|
+
blockHash: block.hash().toString(),
|
|
53
|
+
});
|
|
54
|
+
await this.prover.setBlockCompleted();
|
|
55
|
+
const result = await provingTicket.provingPromise;
|
|
56
|
+
if (result.status === PROVING_STATUS.FAILURE) {
|
|
57
|
+
throw new Error(`Block proving failed: ${result.reason}`);
|
|
58
|
+
}
|
|
59
|
+
historicalHeader = block.header;
|
|
60
|
+
}
|
|
61
|
+
this.state = 'awaiting-prover';
|
|
62
|
+
const { block, aggregationObject, proof } = await this.prover.finaliseBlock();
|
|
63
|
+
this.log.info(`Finalised proof for block range`, { fromBlock, toBlock });
|
|
64
|
+
this.state = 'publishing-proof';
|
|
65
|
+
await this.publisher.submitProof(block.header, block.archive.root, aggregationObject, proof);
|
|
66
|
+
this.log.info(`Submitted proof for block range`, { fromBlock, toBlock });
|
|
67
|
+
this.state = 'completed';
|
|
68
|
+
}
|
|
69
|
+
async getBlock(blockNumber) {
|
|
70
|
+
const block = await this.l2BlockSource.getBlock(blockNumber);
|
|
71
|
+
if (!block) {
|
|
72
|
+
throw new Error(`Block ${blockNumber} not found in L2 block source`);
|
|
73
|
+
}
|
|
74
|
+
return block;
|
|
75
|
+
}
|
|
76
|
+
async getTxs(txHashes) {
|
|
77
|
+
const txs = await Promise.all(txHashes.map(txHash => this.txProvider.getTxByHash(txHash).then(tx => [txHash, tx])));
|
|
78
|
+
const notFound = txs.filter(([_, tx]) => !tx);
|
|
79
|
+
if (notFound.length) {
|
|
80
|
+
throw new Error(`Txs not found: ${notFound.map(([txHash]) => txHash.toString()).join(', ')}`);
|
|
81
|
+
}
|
|
82
|
+
return txs.map(([_, tx]) => tx);
|
|
83
|
+
}
|
|
84
|
+
async processTxs(publicProcessor, txs, totalNumberOfTxs) {
|
|
85
|
+
const [processedTxs, failedTxs] = await publicProcessor.process(txs, totalNumberOfTxs, this.prover, new EmptyTxValidator());
|
|
86
|
+
if (failedTxs.length) {
|
|
87
|
+
throw new Error(`Failed to process txs: ${failedTxs.map(({ tx, error }) => `${tx.getTxHash()} (${error})`).join(', ')}`);
|
|
88
|
+
}
|
|
89
|
+
return processedTxs;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmxvY2stcHJvdmluZy1qb2IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvam9iL2Jsb2NrLXByb3Zpbmctam9iLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxnQkFBZ0IsRUFHaEIsY0FBYyxHQUtmLE1BQU0sc0JBQXNCLENBQUM7QUFFOUIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFJMUQ7Ozs7R0FJRztBQUNILE1BQU0sT0FBTyxlQUFlO0lBSTFCLFlBQ1UsTUFBbUIsRUFDbkIsc0JBQThDLEVBQzlDLFNBQXNCLEVBQ3RCLGFBQTRCLEVBQzVCLFVBQXNCO1FBSnRCLFdBQU0sR0FBTixNQUFNLENBQWE7UUFDbkIsMkJBQXNCLEdBQXRCLHNCQUFzQixDQUF3QjtRQUM5QyxjQUFTLEdBQVQsU0FBUyxDQUFhO1FBQ3RCLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzVCLGVBQVUsR0FBVixVQUFVLENBQVk7UUFSeEIsVUFBSyxHQUF5QixhQUFhLENBQUM7UUFDNUMsUUFBRyxHQUFHLGlCQUFpQixDQUFDLHlCQUF5QixDQUFDLENBQUM7SUFReEQsQ0FBQztJQUVHLFFBQVE7UUFDYixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDcEIsQ0FBQztJQUVNLEtBQUssQ0FBQyxHQUFHLENBQUMsU0FBaUIsRUFBRSxPQUFlO1FBQ2pELElBQUksU0FBUyxLQUFLLE9BQU8sRUFBRSxDQUFDO1lBQzFCLE1BQU0sSUFBSSxLQUFLLENBQUMsb0NBQW9DLENBQUMsQ0FBQztRQUN4RCxDQUFDO1FBRUQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsNEJBQTRCLEVBQUUsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUNwRSxJQUFJLENBQUMsS0FBSyxHQUFHLFNBQVMsQ0FBQztRQUV2QiwyR0FBMkc7UUFFM0csSUFBSSxDQUFDLEtBQUssR0FBRyxZQUFZLENBQUM7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
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { type L2BlockSource, type ProverClient, type TxProvider } from '@aztec/circuit-types';
|
|
2
|
+
import { type L1Publisher } from '@aztec/sequencer-client';
|
|
3
|
+
import { type PublicProcessorFactory } from '@aztec/simulator';
|
|
4
|
+
/**
|
|
5
|
+
* An Aztec Prover Node is a standalone process that monitors the unfinalised chain on L1 for unproven blocks,
|
|
6
|
+
* fetches their txs from a tx source in the p2p network or an external node, re-executes their public functions,
|
|
7
|
+
* creates a rollup proof, and submits it to L1.
|
|
8
|
+
*/
|
|
9
|
+
export declare class ProverNode {
|
|
10
|
+
private prover;
|
|
11
|
+
private publicProcessorFactory;
|
|
12
|
+
private publisher;
|
|
13
|
+
private l2BlockSource;
|
|
14
|
+
private txProvider;
|
|
15
|
+
private options;
|
|
16
|
+
private log;
|
|
17
|
+
private runningPromise;
|
|
18
|
+
constructor(prover: ProverClient, publicProcessorFactory: PublicProcessorFactory, publisher: L1Publisher, l2BlockSource: L2BlockSource, txProvider: TxProvider, options?: {
|
|
19
|
+
pollingIntervalMs: number;
|
|
20
|
+
disableAutomaticProving: boolean;
|
|
21
|
+
});
|
|
22
|
+
/**
|
|
23
|
+
* Starts the prover node so it periodically checks for unproven blocks in the unfinalised chain from L1 and proves them.
|
|
24
|
+
* This may change once we implement a prover coordination mechanism.
|
|
25
|
+
*/
|
|
26
|
+
start(): void;
|
|
27
|
+
/**
|
|
28
|
+
* Stops the prover node and all its dependencies.
|
|
29
|
+
*/
|
|
30
|
+
stop(): Promise<void>;
|
|
31
|
+
/**
|
|
32
|
+
* Single iteration of recurring work. This method is called periodically by the running promise.
|
|
33
|
+
* Checks whether there are new blocks to prove, proves them, and submits them.
|
|
34
|
+
* Only proves one block per job and one job at a time (for now).
|
|
35
|
+
*/
|
|
36
|
+
protected work(): Promise<void>;
|
|
37
|
+
/**
|
|
38
|
+
* Creates a proof for a block range. Returns once the proof has been submitted to L1.
|
|
39
|
+
*/
|
|
40
|
+
prove(fromBlock: number, toBlock: number): Promise<void>;
|
|
41
|
+
/**
|
|
42
|
+
* Starts a proving process and returns immediately.
|
|
43
|
+
*/
|
|
44
|
+
startProof(fromBlock: number, toBlock: number): Promise<void>;
|
|
45
|
+
/**
|
|
46
|
+
* Returns the prover instance.
|
|
47
|
+
*/
|
|
48
|
+
getProver(): ProverClient;
|
|
49
|
+
private createProvingJob;
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=prover-node.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prover-node.d.ts","sourceRoot":"","sources":["../src/prover-node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,YAAY,EAAE,KAAK,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAG9F,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,KAAK,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAI/D;;;;GAIG;AACH,qBAAa,UAAU;IAKnB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,sBAAsB;IAC9B,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,OAAO;IATjB,OAAO,CAAC,GAAG,CAA0C;IACrD,OAAO,CAAC,cAAc,CAA6B;gBAGzC,MAAM,EAAE,YAAY,EACpB,sBAAsB,EAAE,sBAAsB,EAC9C,SAAS,EAAE,WAAW,EACtB,aAAa,EAAE,aAAa,EAC5B,UAAU,EAAE,UAAU,EACtB,OAAO,GAAE;QAAE,iBAAiB,EAAE,MAAM,CAAC;QAAC,uBAAuB,EAAE,OAAO,CAAA;KAG7E;IAGH;;;OAGG;IACH,KAAK;IAML;;OAEG;IACG,IAAI;IASV;;;;OAIG;cACa,IAAI;IAoBpB;;OAEG;IACI,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;IAI/C;;OAEG;IACI,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;IAKpD;;OAEG;IACI,SAAS;IAIhB,OAAO,CAAC,gBAAgB;CASzB"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { createDebugLogger } from '@aztec/foundation/log';
|
|
2
|
+
import { RunningPromise } from '@aztec/foundation/running-promise';
|
|
3
|
+
import { BlockProvingJob } from './job/block-proving-job.js';
|
|
4
|
+
/**
|
|
5
|
+
* An Aztec Prover Node is a standalone process that monitors the unfinalised chain on L1 for unproven blocks,
|
|
6
|
+
* fetches their txs from a tx source in the p2p network or an external node, re-executes their public functions,
|
|
7
|
+
* creates a rollup proof, and submits it to L1.
|
|
8
|
+
*/
|
|
9
|
+
export class ProverNode {
|
|
10
|
+
constructor(prover, publicProcessorFactory, publisher, l2BlockSource, txProvider, options = {
|
|
11
|
+
pollingIntervalMs: 1000,
|
|
12
|
+
disableAutomaticProving: false,
|
|
13
|
+
}) {
|
|
14
|
+
this.prover = prover;
|
|
15
|
+
this.publicProcessorFactory = publicProcessorFactory;
|
|
16
|
+
this.publisher = publisher;
|
|
17
|
+
this.l2BlockSource = l2BlockSource;
|
|
18
|
+
this.txProvider = txProvider;
|
|
19
|
+
this.options = options;
|
|
20
|
+
this.log = createDebugLogger('aztec:prover-node');
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Starts the prover node so it periodically checks for unproven blocks in the unfinalised chain from L1 and proves them.
|
|
24
|
+
* This may change once we implement a prover coordination mechanism.
|
|
25
|
+
*/
|
|
26
|
+
start() {
|
|
27
|
+
this.runningPromise = new RunningPromise(this.work.bind(this), this.options.pollingIntervalMs);
|
|
28
|
+
this.runningPromise.start();
|
|
29
|
+
this.log.info('Started ProverNode');
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Stops the prover node and all its dependencies.
|
|
33
|
+
*/
|
|
34
|
+
async stop() {
|
|
35
|
+
this.log.info('Stopping ProverNode');
|
|
36
|
+
await this.runningPromise?.stop();
|
|
37
|
+
await this.prover.stop();
|
|
38
|
+
await this.l2BlockSource.stop();
|
|
39
|
+
this.publisher.interrupt();
|
|
40
|
+
this.log.info('Stopped ProverNode');
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Single iteration of recurring work. This method is called periodically by the running promise.
|
|
44
|
+
* Checks whether there are new blocks to prove, proves them, and submits them.
|
|
45
|
+
* Only proves one block per job and one job at a time (for now).
|
|
46
|
+
*/
|
|
47
|
+
async work() {
|
|
48
|
+
if (this.options.disableAutomaticProving) {
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
const [latestBlockNumber, latestProvenBlockNumber] = await Promise.all([
|
|
52
|
+
this.l2BlockSource.getBlockNumber(),
|
|
53
|
+
this.l2BlockSource.getProvenBlockNumber(),
|
|
54
|
+
]);
|
|
55
|
+
if (latestProvenBlockNumber >= latestBlockNumber) {
|
|
56
|
+
this.log.debug(`No new blocks to prove`, { latestBlockNumber, latestProvenBlockNumber });
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
const fromBlock = latestProvenBlockNumber + 1;
|
|
60
|
+
const toBlock = fromBlock; // We only prove one block at a time for now
|
|
61
|
+
await this.prove(fromBlock, toBlock);
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Creates a proof for a block range. Returns once the proof has been submitted to L1.
|
|
65
|
+
*/
|
|
66
|
+
prove(fromBlock, toBlock) {
|
|
67
|
+
return this.createProvingJob().run(fromBlock, toBlock);
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Starts a proving process and returns immediately.
|
|
71
|
+
*/
|
|
72
|
+
startProof(fromBlock, toBlock) {
|
|
73
|
+
void this.createProvingJob().run(fromBlock, toBlock);
|
|
74
|
+
return Promise.resolve();
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Returns the prover instance.
|
|
78
|
+
*/
|
|
79
|
+
getProver() {
|
|
80
|
+
return this.prover;
|
|
81
|
+
}
|
|
82
|
+
createProvingJob() {
|
|
83
|
+
return new BlockProvingJob(this.prover, this.publicProcessorFactory, this.publisher, this.l2BlockSource, this.txProvider);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmVyLW5vZGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcHJvdmVyLW5vZGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBSW5FLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUU3RDs7OztHQUlHO0FBQ0gsTUFBTSxPQUFPLFVBQVU7SUFJckIsWUFDVSxNQUFvQixFQUNwQixzQkFBOEMsRUFDOUMsU0FBc0IsRUFDdEIsYUFBNEIsRUFDNUIsVUFBc0IsRUFDdEIsVUFBMkU7UUFDakYsaUJBQWlCLEVBQUUsSUFBSztRQUN4Qix1QkFBdUIsRUFBRSxLQUFLO0tBQy9CO1FBUk8sV0FBTSxHQUFOLE1BQU0sQ0FBYztRQUNwQiwyQkFBc0IsR0FBdEIsc0JBQXNCLENBQXdCO1FBQzlDLGNBQVMsR0FBVCxTQUFTLENBQWE7UUFDdEIsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUN0QixZQUFPLEdBQVAsT0FBTyxDQUdkO1FBWkssUUFBRyxHQUFHLGlCQUFpQixDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFhbEQsQ0FBQztJQUVKOzs7T0FHRztJQUNILEtBQUs7UUFDSCxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUMvRixJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLElBQUk7UUFDUixJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQ3JDLE1BQU0sSUFBSSxDQUFDLGNBQWMsRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUNsQyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDekIsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDM0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNPLEtBQUssQ0FBQyxJQUFJO1FBQ2xCLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1lBQ3pDLE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxDQUFDLGlCQUFpQixFQUFFLHVCQUF1QixDQUFDLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDO1lBQ3JFLElBQUksQ0FBQyxhQUFhLENBQUMsY0FBYyxFQUFFO1lBQ25DLElBQUksQ0FBQyxhQUFhLENBQUMsb0JBQW9CLEVBQUU7U0FDMUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSx1QkFBdUIsSUFBSSxpQkFBaUIsRUFBRSxDQUFDO1lBQ2pELElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLHdCQUF3QixFQUFFLEVBQUUsaUJBQWlCLEVBQUUsdUJBQXVCLEVBQUUsQ0FBQyxDQUFDO1lBQ3pGLE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxTQUFTLEdBQUcsdUJBQXVCLEdBQUcsQ0FBQyxDQUFDO1FBQzlDLE1BQU0sT0FBTyxHQUFHLFNBQVMsQ0FBQyxDQUFDLDRDQUE0QztRQUN2RSxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxTQUFpQixFQUFFLE9BQWU7UUFDN0MsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFRDs7T0FFRztJQUNJLFVBQVUsQ0FBQyxTQUFpQixFQUFFLE9BQWU7UUFDbEQsS0FBSyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3JELE9BQU8sT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRDs7T0FFRztJQUNJLFNBQVM7UUFDZCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDckIsQ0FBQztJQUVPLGdCQUFnQjtRQUN0QixPQUFPLElBQUksZUFBZSxDQUN4QixJQUFJLENBQUMsTUFBTSxFQUNYLElBQUksQ0FBQyxzQkFBc0IsRUFDM0IsSUFBSSxDQUFDLFNBQVMsRUFDZCxJQUFJLENBQUMsYUFBYSxFQUNsQixJQUFJLENBQUMsVUFBVSxDQUNoQixDQUFDO0lBQ0osQ0FBQztDQUNGIn0=
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type AztecNode, type Tx, type TxHash, type TxProvider } from '@aztec/circuit-types';
|
|
2
|
+
/** Implements TxProvider by querying an Aztec node for the txs. */
|
|
3
|
+
export declare class AztecNodeTxProvider implements TxProvider {
|
|
4
|
+
private node;
|
|
5
|
+
constructor(node: AztecNode);
|
|
6
|
+
getTxByHash(txHash: TxHash): Promise<Tx | undefined>;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=aztec-node-tx-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aztec-node-tx-provider.d.ts","sourceRoot":"","sources":["../../src/tx-provider/aztec-node-tx-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,EAAE,EAAE,KAAK,MAAM,EAAE,KAAK,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAE7F,mEAAmE;AACnE,qBAAa,mBAAoB,YAAW,UAAU;IACxC,OAAO,CAAC,IAAI;gBAAJ,IAAI,EAAE,SAAS;IAEnC,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,EAAE,GAAG,SAAS,CAAC;CAGrD"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/** Implements TxProvider by querying an Aztec node for the txs. */
|
|
2
|
+
export class AztecNodeTxProvider {
|
|
3
|
+
constructor(node) {
|
|
4
|
+
this.node = node;
|
|
5
|
+
}
|
|
6
|
+
getTxByHash(txHash) {
|
|
7
|
+
return this.node.getTxByHash(txHash);
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXp0ZWMtbm9kZS10eC1wcm92aWRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eC1wcm92aWRlci9henRlYy1ub2RlLXR4LXByb3ZpZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLG1FQUFtRTtBQUNuRSxNQUFNLE9BQU8sbUJBQW1CO0lBQzlCLFlBQW9CLElBQWU7UUFBZixTQUFJLEdBQUosSUFBSSxDQUFXO0lBQUcsQ0FBQztJQUV2QyxXQUFXLENBQUMsTUFBYztRQUN4QixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7Q0FDRiJ9
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/tx-provider/config.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,gBAAgB,GAAG;IAC7B,iBAAiB,EAAE,MAAM,GAAG,SAAS,CAAC;CACvC,CAAC;AAEF,wBAAgB,0BAA0B,IAAI,gBAAgB,CAI7D"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export function getTxProviderConfigFromEnv() {
|
|
2
|
+
return {
|
|
3
|
+
txProviderNodeUrl: process.env.TX_PROVIDER_NODE_URL ?? process.env.AZTEC_NODE_URL,
|
|
4
|
+
};
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3R4LXByb3ZpZGVyL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFJQSxNQUFNLFVBQVUsMEJBQTBCO0lBQ3hDLE9BQU87UUFDTCxpQkFBaUIsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLG9CQUFvQixJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYztLQUNsRixDQUFDO0FBQ0osQ0FBQyJ9
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/tx-provider/factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,UAAU,EAAyB,MAAM,sBAAsB,CAAC;AAG9E,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEpD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,GAAG,UAAU,CAOrE"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { createAztecNodeClient } from '@aztec/circuit-types';
|
|
2
|
+
import { AztecNodeTxProvider } from './aztec-node-tx-provider.js';
|
|
3
|
+
export function createTxProvider(config) {
|
|
4
|
+
if (config.txProviderNodeUrl) {
|
|
5
|
+
const node = createAztecNodeClient(config.txProviderNodeUrl);
|
|
6
|
+
return new AztecNodeTxProvider(node);
|
|
7
|
+
}
|
|
8
|
+
else {
|
|
9
|
+
throw new Error(`Aztec Node URL for Tx Provider is not set.`);
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFjdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eC1wcm92aWRlci9mYWN0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBbUIscUJBQXFCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUU5RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUdsRSxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsTUFBd0I7SUFDdkQsSUFBSSxNQUFNLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUM3QixNQUFNLElBQUksR0FBRyxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUM3RCxPQUFPLElBQUksbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdkMsQ0FBQztTQUFNLENBQUM7UUFDTixNQUFNLElBQUksS0FBSyxDQUFDLDRDQUE0QyxDQUFDLENBQUM7SUFDaEUsQ0FBQztBQUNILENBQUMifQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tx-provider/index.ts"],"names":[],"mappings":"AAAA,cAAc,6BAA6B,CAAC;AAC5C,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export * from './aztec-node-tx-provider.js';
|
|
2
|
+
export * from './factory.js';
|
|
3
|
+
export * from './config.js';
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHgtcHJvdmlkZXIvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyw2QkFBNkIsQ0FBQztBQUM1QyxjQUFjLGNBQWMsQ0FBQztBQUM3QixjQUFjLGFBQWEsQ0FBQyJ9
|
package/package.json
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@aztec/prover-node",
|
|
3
|
+
"version": "0.47.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"exports": {
|
|
6
|
+
".": "./dest/index.js"
|
|
7
|
+
},
|
|
8
|
+
"inherits": [
|
|
9
|
+
"../package.common.json"
|
|
10
|
+
],
|
|
11
|
+
"scripts": {
|
|
12
|
+
"build": "yarn clean && tsc -b",
|
|
13
|
+
"build:dev": "tsc -b --watch",
|
|
14
|
+
"clean": "rm -rf ./dest .tsbuildinfo",
|
|
15
|
+
"formatting": "run -T prettier --check ./src && run -T eslint ./src",
|
|
16
|
+
"formatting:fix": "run -T eslint --fix ./src && run -T prettier -w ./src",
|
|
17
|
+
"bb": "node --no-warnings ./dest/bb/index.js",
|
|
18
|
+
"test": "NODE_NO_WARNINGS=1 node --experimental-vm-modules ../node_modules/.bin/jest --passWithNoTests"
|
|
19
|
+
},
|
|
20
|
+
"jest": {
|
|
21
|
+
"moduleNameMapper": {
|
|
22
|
+
"^(\\.{1,2}/.*)\\.[cm]?js$": "$1"
|
|
23
|
+
},
|
|
24
|
+
"testRegex": "./src/.*\\.test\\.(js|mjs|ts)$",
|
|
25
|
+
"rootDir": "./src",
|
|
26
|
+
"transform": {
|
|
27
|
+
"^.+\\.tsx?$": [
|
|
28
|
+
"@swc/jest",
|
|
29
|
+
{
|
|
30
|
+
"jsc": {
|
|
31
|
+
"parser": {
|
|
32
|
+
"syntax": "typescript",
|
|
33
|
+
"decorators": true
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
]
|
|
38
|
+
},
|
|
39
|
+
"extensionsToTreatAsEsm": [
|
|
40
|
+
".ts"
|
|
41
|
+
],
|
|
42
|
+
"reporters": [
|
|
43
|
+
[
|
|
44
|
+
"default",
|
|
45
|
+
{
|
|
46
|
+
"summaryThreshold": 9999
|
|
47
|
+
}
|
|
48
|
+
]
|
|
49
|
+
]
|
|
50
|
+
},
|
|
51
|
+
"dependencies": {
|
|
52
|
+
"@aztec/archiver": "0.47.0",
|
|
53
|
+
"@aztec/circuit-types": "0.47.0",
|
|
54
|
+
"@aztec/circuits.js": "0.47.0",
|
|
55
|
+
"@aztec/foundation": "0.47.0",
|
|
56
|
+
"@aztec/kv-store": "0.47.0",
|
|
57
|
+
"@aztec/prover-client": "0.47.0",
|
|
58
|
+
"@aztec/sequencer-client": "0.47.0",
|
|
59
|
+
"@aztec/simulator": "0.47.0",
|
|
60
|
+
"@aztec/telemetry-client": "0.47.0",
|
|
61
|
+
"@aztec/world-state": "0.47.0",
|
|
62
|
+
"source-map-support": "^0.5.21",
|
|
63
|
+
"tslib": "^2.4.0"
|
|
64
|
+
},
|
|
65
|
+
"devDependencies": {
|
|
66
|
+
"@jest/globals": "^29.5.0",
|
|
67
|
+
"@types/jest": "^29.5.0",
|
|
68
|
+
"@types/memdown": "^3.0.0",
|
|
69
|
+
"@types/node": "^18.7.23",
|
|
70
|
+
"@types/source-map-support": "^0.5.10",
|
|
71
|
+
"jest": "^29.5.0",
|
|
72
|
+
"jest-mock-extended": "^3.0.3",
|
|
73
|
+
"ts-node": "^10.9.1",
|
|
74
|
+
"typescript": "^5.0.4"
|
|
75
|
+
},
|
|
76
|
+
"files": [
|
|
77
|
+
"dest",
|
|
78
|
+
"src",
|
|
79
|
+
"!*.test.*"
|
|
80
|
+
],
|
|
81
|
+
"types": "./dest/index.d.ts",
|
|
82
|
+
"engines": {
|
|
83
|
+
"node": ">=18"
|
|
84
|
+
}
|
|
85
|
+
}
|
package/src/config.ts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { type ArchiverConfig, getArchiverConfigFromEnv } from '@aztec/archiver';
|
|
2
|
+
import { type ProverClientConfig, getProverEnvVars } from '@aztec/prover-client';
|
|
3
|
+
import { type PublisherConfig, type TxSenderConfig, getTxSenderConfigFromEnv } from '@aztec/sequencer-client';
|
|
4
|
+
import { type WorldStateConfig, getWorldStateConfigFromEnv } from '@aztec/world-state';
|
|
5
|
+
|
|
6
|
+
import { type TxProviderConfig, getTxProviderConfigFromEnv } from './tx-provider/config.js';
|
|
7
|
+
|
|
8
|
+
export type ProverNodeConfig = ArchiverConfig &
|
|
9
|
+
ProverClientConfig &
|
|
10
|
+
WorldStateConfig &
|
|
11
|
+
PublisherConfig &
|
|
12
|
+
TxSenderConfig &
|
|
13
|
+
TxProviderConfig;
|
|
14
|
+
|
|
15
|
+
export function getProverNodeConfigFromEnv(): ProverNodeConfig {
|
|
16
|
+
const { PROOF_PUBLISH_RETRY_INTERVAL_MS } = process.env;
|
|
17
|
+
return {
|
|
18
|
+
...getArchiverConfigFromEnv(),
|
|
19
|
+
...getProverEnvVars(),
|
|
20
|
+
...getWorldStateConfigFromEnv(),
|
|
21
|
+
...getTxSenderConfigFromEnv('PROVER'),
|
|
22
|
+
...getTxProviderConfigFromEnv(),
|
|
23
|
+
l1PublishRetryIntervalMS: PROOF_PUBLISH_RETRY_INTERVAL_MS ? +PROOF_PUBLISH_RETRY_INTERVAL_MS : 1_000,
|
|
24
|
+
};
|
|
25
|
+
}
|
package/src/factory.ts
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { type Archiver, createArchiver } from '@aztec/archiver';
|
|
2
|
+
import { type AztecNode } from '@aztec/circuit-types';
|
|
3
|
+
import { type DebugLogger, createDebugLogger } from '@aztec/foundation/log';
|
|
4
|
+
import { createStore } from '@aztec/kv-store/utils';
|
|
5
|
+
import { createProverClient } from '@aztec/prover-client';
|
|
6
|
+
import { getL1Publisher } from '@aztec/sequencer-client';
|
|
7
|
+
import { PublicProcessorFactory, createSimulationProvider } from '@aztec/simulator';
|
|
8
|
+
import { type TelemetryClient } from '@aztec/telemetry-client';
|
|
9
|
+
import { NoopTelemetryClient } from '@aztec/telemetry-client/noop';
|
|
10
|
+
import { createWorldStateSynchronizer } from '@aztec/world-state';
|
|
11
|
+
|
|
12
|
+
import { type ProverNodeConfig } from './config.js';
|
|
13
|
+
import { ProverNode } from './prover-node.js';
|
|
14
|
+
import { AztecNodeTxProvider } from './tx-provider/aztec-node-tx-provider.js';
|
|
15
|
+
import { createTxProvider } from './tx-provider/factory.js';
|
|
16
|
+
|
|
17
|
+
/** Creates a new prover node given a config. */
|
|
18
|
+
export async function createProverNode(
|
|
19
|
+
config: ProverNodeConfig,
|
|
20
|
+
deps: {
|
|
21
|
+
telemetry?: TelemetryClient;
|
|
22
|
+
log?: DebugLogger;
|
|
23
|
+
storeLog?: DebugLogger;
|
|
24
|
+
aztecNodeTxProvider?: AztecNode;
|
|
25
|
+
archiver?: Archiver;
|
|
26
|
+
} = {},
|
|
27
|
+
) {
|
|
28
|
+
const telemetry = deps.telemetry ?? new NoopTelemetryClient();
|
|
29
|
+
const log = deps.log ?? createDebugLogger('aztec:prover');
|
|
30
|
+
const storeLog = deps.storeLog ?? createDebugLogger('aztec:prover:lmdb');
|
|
31
|
+
|
|
32
|
+
const store = await createStore(config, config.l1Contracts.rollupAddress, storeLog);
|
|
33
|
+
|
|
34
|
+
const archiver = deps.archiver ?? (await createArchiver(config, store, telemetry, { blockUntilSync: true }));
|
|
35
|
+
log.verbose(`Created archiver and synced to block ${await archiver.getBlockNumber()}`);
|
|
36
|
+
|
|
37
|
+
const worldStateConfig = { ...config, worldStateProvenBlocksOnly: true };
|
|
38
|
+
const worldStateSynchronizer = await createWorldStateSynchronizer(worldStateConfig, store, archiver);
|
|
39
|
+
await worldStateSynchronizer.start();
|
|
40
|
+
|
|
41
|
+
const simulationProvider = await createSimulationProvider(config, log);
|
|
42
|
+
|
|
43
|
+
const prover = await createProverClient(config, worldStateSynchronizer, archiver);
|
|
44
|
+
|
|
45
|
+
// REFACTOR: Move publisher out of sequencer package and into an L1-related package
|
|
46
|
+
const publisher = getL1Publisher(config);
|
|
47
|
+
|
|
48
|
+
const latestWorldState = worldStateSynchronizer.getLatest();
|
|
49
|
+
const publicProcessorFactory = new PublicProcessorFactory(latestWorldState, archiver, simulationProvider, telemetry);
|
|
50
|
+
|
|
51
|
+
const txProvider = deps.aztecNodeTxProvider
|
|
52
|
+
? new AztecNodeTxProvider(deps.aztecNodeTxProvider)
|
|
53
|
+
: createTxProvider(config);
|
|
54
|
+
|
|
55
|
+
return new ProverNode(prover!, publicProcessorFactory, publisher, archiver, txProvider);
|
|
56
|
+
}
|
package/src/http.ts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { AztecAddress, EthAddress, Fr, Header } from '@aztec/circuits.js';
|
|
2
|
+
import { JsonRpcServer } from '@aztec/foundation/json-rpc/server';
|
|
3
|
+
|
|
4
|
+
import { type ProverNode } from './prover-node.js';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Wrap a ProverNode instance with a JSON RPC HTTP server.
|
|
8
|
+
* @param node - The ProverNode
|
|
9
|
+
* @returns An JSON-RPC HTTP server
|
|
10
|
+
*/
|
|
11
|
+
export function createProverNodeRpcServer(node: ProverNode) {
|
|
12
|
+
const rpc = new JsonRpcServer(
|
|
13
|
+
node,
|
|
14
|
+
{
|
|
15
|
+
AztecAddress,
|
|
16
|
+
EthAddress,
|
|
17
|
+
Fr,
|
|
18
|
+
Header,
|
|
19
|
+
},
|
|
20
|
+
{},
|
|
21
|
+
// disable methods not part of the AztecNode interface
|
|
22
|
+
['start', 'stop', 'createProvingJob', 'work', 'getProver'],
|
|
23
|
+
);
|
|
24
|
+
return rpc;
|
|
25
|
+
}
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import {
|
|
2
|
+
type BlockProver,
|
|
3
|
+
EmptyTxValidator,
|
|
4
|
+
type L2Block,
|
|
5
|
+
type L2BlockSource,
|
|
6
|
+
PROVING_STATUS,
|
|
7
|
+
type ProcessedTx,
|
|
8
|
+
type Tx,
|
|
9
|
+
type TxHash,
|
|
10
|
+
type TxProvider,
|
|
11
|
+
} from '@aztec/circuit-types';
|
|
12
|
+
import { type Fr } from '@aztec/circuits.js';
|
|
13
|
+
import { createDebugLogger } from '@aztec/foundation/log';
|
|
14
|
+
import { type L1Publisher } from '@aztec/sequencer-client';
|
|
15
|
+
import { type PublicProcessor, type PublicProcessorFactory } from '@aztec/simulator';
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Job that grabs a range of blocks from the unfinalised chain from L1, gets their txs given their hashes,
|
|
19
|
+
* re-executes their public calls, generates a rollup proof, and submits it to L1. This job will update the
|
|
20
|
+
* world state as part of public call execution via the public processor.
|
|
21
|
+
*/
|
|
22
|
+
export class BlockProvingJob {
|
|
23
|
+
private state: BlockProvingJobState = 'initialized';
|
|
24
|
+
private log = createDebugLogger('aztec:block-proving-job');
|
|
25
|
+
|
|
26
|
+
constructor(
|
|
27
|
+
private prover: BlockProver,
|
|
28
|
+
private publicProcessorFactory: PublicProcessorFactory,
|
|
29
|
+
private publisher: L1Publisher,
|
|
30
|
+
private l2BlockSource: L2BlockSource,
|
|
31
|
+
private txProvider: TxProvider,
|
|
32
|
+
) {}
|
|
33
|
+
|
|
34
|
+
public getState(): BlockProvingJobState {
|
|
35
|
+
return this.state;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
public async run(fromBlock: number, toBlock: number) {
|
|
39
|
+
if (fromBlock !== toBlock) {
|
|
40
|
+
throw new Error(`Block ranges are not yet supported`);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
this.log.info(`Starting block proving job`, { fromBlock, toBlock });
|
|
44
|
+
this.state = 'started';
|
|
45
|
+
|
|
46
|
+
// TODO: Fast-forward world state to fromBlock and/or await fromBlock to be published to the unproven chain
|
|
47
|
+
|
|
48
|
+
this.state = 'processing';
|
|
49
|
+
|
|
50
|
+
let historicalHeader = (await this.l2BlockSource.getBlock(fromBlock - 1))?.header;
|
|
51
|
+
for (let blockNumber = fromBlock; blockNumber <= toBlock; blockNumber++) {
|
|
52
|
+
const block = await this.getBlock(blockNumber);
|
|
53
|
+
const globalVariables = block.header.globalVariables;
|
|
54
|
+
const txHashes = block.body.txEffects.map(tx => tx.txHash);
|
|
55
|
+
const txCount = block.body.numberOfTxsIncludingPadded;
|
|
56
|
+
const l1ToL2Messages: Fr[] = []; // TODO: grab L1 to L2 messages for this block
|
|
57
|
+
|
|
58
|
+
this.log.verbose(`Starting block processing`, {
|
|
59
|
+
number: block.number,
|
|
60
|
+
blockHash: block.hash().toString(),
|
|
61
|
+
lastArchive: block.header.lastArchive.root,
|
|
62
|
+
noteHashTreeRoot: block.header.state.partial.noteHashTree.root,
|
|
63
|
+
nullifierTreeRoot: block.header.state.partial.nullifierTree.root,
|
|
64
|
+
publicDataTreeRoot: block.header.state.partial.publicDataTree.root,
|
|
65
|
+
historicalHeader: historicalHeader?.hash(),
|
|
66
|
+
...globalVariables,
|
|
67
|
+
});
|
|
68
|
+
const provingTicket = await this.prover.startNewBlock(txCount, globalVariables, l1ToL2Messages);
|
|
69
|
+
const publicProcessor = this.publicProcessorFactory.create(historicalHeader, globalVariables);
|
|
70
|
+
|
|
71
|
+
const txs = await this.getTxs(txHashes);
|
|
72
|
+
await this.processTxs(publicProcessor, txs, txCount);
|
|
73
|
+
|
|
74
|
+
this.log.verbose(`Processed all txs for block`, {
|
|
75
|
+
blockNumber: block.number,
|
|
76
|
+
blockHash: block.hash().toString(),
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
await this.prover.setBlockCompleted();
|
|
80
|
+
|
|
81
|
+
const result = await provingTicket.provingPromise;
|
|
82
|
+
if (result.status === PROVING_STATUS.FAILURE) {
|
|
83
|
+
throw new Error(`Block proving failed: ${result.reason}`);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
historicalHeader = block.header;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
this.state = 'awaiting-prover';
|
|
90
|
+
const { block, aggregationObject, proof } = await this.prover.finaliseBlock();
|
|
91
|
+
this.log.info(`Finalised proof for block range`, { fromBlock, toBlock });
|
|
92
|
+
|
|
93
|
+
this.state = 'publishing-proof';
|
|
94
|
+
await this.publisher.submitProof(block.header, block.archive.root, aggregationObject, proof);
|
|
95
|
+
this.log.info(`Submitted proof for block range`, { fromBlock, toBlock });
|
|
96
|
+
|
|
97
|
+
this.state = 'completed';
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
private async getBlock(blockNumber: number): Promise<L2Block> {
|
|
101
|
+
const block = await this.l2BlockSource.getBlock(blockNumber);
|
|
102
|
+
if (!block) {
|
|
103
|
+
throw new Error(`Block ${blockNumber} not found in L2 block source`);
|
|
104
|
+
}
|
|
105
|
+
return block;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
private async getTxs(txHashes: TxHash[]): Promise<Tx[]> {
|
|
109
|
+
const txs = await Promise.all(
|
|
110
|
+
txHashes.map(txHash => this.txProvider.getTxByHash(txHash).then(tx => [txHash, tx] as const)),
|
|
111
|
+
);
|
|
112
|
+
const notFound = txs.filter(([_, tx]) => !tx);
|
|
113
|
+
if (notFound.length) {
|
|
114
|
+
throw new Error(`Txs not found: ${notFound.map(([txHash]) => txHash.toString()).join(', ')}`);
|
|
115
|
+
}
|
|
116
|
+
return txs.map(([_, tx]) => tx!);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
private async processTxs(
|
|
120
|
+
publicProcessor: PublicProcessor,
|
|
121
|
+
txs: Tx[],
|
|
122
|
+
totalNumberOfTxs: number,
|
|
123
|
+
): Promise<ProcessedTx[]> {
|
|
124
|
+
const [processedTxs, failedTxs] = await publicProcessor.process(
|
|
125
|
+
txs,
|
|
126
|
+
totalNumberOfTxs,
|
|
127
|
+
this.prover,
|
|
128
|
+
new EmptyTxValidator(),
|
|
129
|
+
);
|
|
130
|
+
|
|
131
|
+
if (failedTxs.length) {
|
|
132
|
+
throw new Error(
|
|
133
|
+
`Failed to process txs: ${failedTxs.map(({ tx, error }) => `${tx.getTxHash()} (${error})`).join(', ')}`,
|
|
134
|
+
);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
return processedTxs;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
export type BlockProvingJobState =
|
|
142
|
+
| 'initialized'
|
|
143
|
+
| 'started'
|
|
144
|
+
| 'processing'
|
|
145
|
+
| 'awaiting-prover'
|
|
146
|
+
| 'publishing-proof'
|
|
147
|
+
| 'completed';
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { type L2BlockSource, type ProverClient, type TxProvider } from '@aztec/circuit-types';
|
|
2
|
+
import { createDebugLogger } from '@aztec/foundation/log';
|
|
3
|
+
import { RunningPromise } from '@aztec/foundation/running-promise';
|
|
4
|
+
import { type L1Publisher } from '@aztec/sequencer-client';
|
|
5
|
+
import { type PublicProcessorFactory } from '@aztec/simulator';
|
|
6
|
+
|
|
7
|
+
import { BlockProvingJob } from './job/block-proving-job.js';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* An Aztec Prover Node is a standalone process that monitors the unfinalised chain on L1 for unproven blocks,
|
|
11
|
+
* fetches their txs from a tx source in the p2p network or an external node, re-executes their public functions,
|
|
12
|
+
* creates a rollup proof, and submits it to L1.
|
|
13
|
+
*/
|
|
14
|
+
export class ProverNode {
|
|
15
|
+
private log = createDebugLogger('aztec:prover-node');
|
|
16
|
+
private runningPromise: RunningPromise | undefined;
|
|
17
|
+
|
|
18
|
+
constructor(
|
|
19
|
+
private prover: ProverClient,
|
|
20
|
+
private publicProcessorFactory: PublicProcessorFactory,
|
|
21
|
+
private publisher: L1Publisher,
|
|
22
|
+
private l2BlockSource: L2BlockSource,
|
|
23
|
+
private txProvider: TxProvider,
|
|
24
|
+
private options: { pollingIntervalMs: number; disableAutomaticProving: boolean } = {
|
|
25
|
+
pollingIntervalMs: 1_000,
|
|
26
|
+
disableAutomaticProving: false,
|
|
27
|
+
},
|
|
28
|
+
) {}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Starts the prover node so it periodically checks for unproven blocks in the unfinalised chain from L1 and proves them.
|
|
32
|
+
* This may change once we implement a prover coordination mechanism.
|
|
33
|
+
*/
|
|
34
|
+
start() {
|
|
35
|
+
this.runningPromise = new RunningPromise(this.work.bind(this), this.options.pollingIntervalMs);
|
|
36
|
+
this.runningPromise.start();
|
|
37
|
+
this.log.info('Started ProverNode');
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Stops the prover node and all its dependencies.
|
|
42
|
+
*/
|
|
43
|
+
async stop() {
|
|
44
|
+
this.log.info('Stopping ProverNode');
|
|
45
|
+
await this.runningPromise?.stop();
|
|
46
|
+
await this.prover.stop();
|
|
47
|
+
await this.l2BlockSource.stop();
|
|
48
|
+
this.publisher.interrupt();
|
|
49
|
+
this.log.info('Stopped ProverNode');
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Single iteration of recurring work. This method is called periodically by the running promise.
|
|
54
|
+
* Checks whether there are new blocks to prove, proves them, and submits them.
|
|
55
|
+
* Only proves one block per job and one job at a time (for now).
|
|
56
|
+
*/
|
|
57
|
+
protected async work() {
|
|
58
|
+
if (this.options.disableAutomaticProving) {
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
const [latestBlockNumber, latestProvenBlockNumber] = await Promise.all([
|
|
63
|
+
this.l2BlockSource.getBlockNumber(),
|
|
64
|
+
this.l2BlockSource.getProvenBlockNumber(),
|
|
65
|
+
]);
|
|
66
|
+
|
|
67
|
+
if (latestProvenBlockNumber >= latestBlockNumber) {
|
|
68
|
+
this.log.debug(`No new blocks to prove`, { latestBlockNumber, latestProvenBlockNumber });
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
const fromBlock = latestProvenBlockNumber + 1;
|
|
73
|
+
const toBlock = fromBlock; // We only prove one block at a time for now
|
|
74
|
+
await this.prove(fromBlock, toBlock);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Creates a proof for a block range. Returns once the proof has been submitted to L1.
|
|
79
|
+
*/
|
|
80
|
+
public prove(fromBlock: number, toBlock: number) {
|
|
81
|
+
return this.createProvingJob().run(fromBlock, toBlock);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Starts a proving process and returns immediately.
|
|
86
|
+
*/
|
|
87
|
+
public startProof(fromBlock: number, toBlock: number) {
|
|
88
|
+
void this.createProvingJob().run(fromBlock, toBlock);
|
|
89
|
+
return Promise.resolve();
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Returns the prover instance.
|
|
94
|
+
*/
|
|
95
|
+
public getProver() {
|
|
96
|
+
return this.prover;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
private createProvingJob() {
|
|
100
|
+
return new BlockProvingJob(
|
|
101
|
+
this.prover,
|
|
102
|
+
this.publicProcessorFactory,
|
|
103
|
+
this.publisher,
|
|
104
|
+
this.l2BlockSource,
|
|
105
|
+
this.txProvider,
|
|
106
|
+
);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type AztecNode, type Tx, type TxHash, type TxProvider } from '@aztec/circuit-types';
|
|
2
|
+
|
|
3
|
+
/** Implements TxProvider by querying an Aztec node for the txs. */
|
|
4
|
+
export class AztecNodeTxProvider implements TxProvider {
|
|
5
|
+
constructor(private node: AztecNode) {}
|
|
6
|
+
|
|
7
|
+
getTxByHash(txHash: TxHash): Promise<Tx | undefined> {
|
|
8
|
+
return this.node.getTxByHash(txHash);
|
|
9
|
+
}
|
|
10
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type TxProvider, createAztecNodeClient } from '@aztec/circuit-types';
|
|
2
|
+
|
|
3
|
+
import { AztecNodeTxProvider } from './aztec-node-tx-provider.js';
|
|
4
|
+
import { type TxProviderConfig } from './config.js';
|
|
5
|
+
|
|
6
|
+
export function createTxProvider(config: TxProviderConfig): TxProvider {
|
|
7
|
+
if (config.txProviderNodeUrl) {
|
|
8
|
+
const node = createAztecNodeClient(config.txProviderNodeUrl);
|
|
9
|
+
return new AztecNodeTxProvider(node);
|
|
10
|
+
} else {
|
|
11
|
+
throw new Error(`Aztec Node URL for Tx Provider is not set.`);
|
|
12
|
+
}
|
|
13
|
+
}
|