@aztec/prover-node 0.47.0 → 0.48.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/dest/config.d.ts +2 -0
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +15 -8
- package/dest/factory.d.ts.map +1 -1
- package/dest/factory.js +5 -7
- package/dest/job/block-proving-job.d.ts +5 -3
- package/dest/job/block-proving-job.d.ts.map +1 -1
- package/dest/job/block-proving-job.js +51 -41
- package/dest/prover-node.d.ts +12 -5
- package/dest/prover-node.d.ts.map +1 -1
- package/dest/prover-node.js +32 -15
- package/dest/tx-provider/config.d.ts +2 -0
- package/dest/tx-provider/config.d.ts.map +1 -1
- package/dest/tx-provider/config.js +10 -4
- package/package.json +11 -11
- package/src/config.ts +23 -7
- package/src/factory.ts +14 -7
- package/src/job/block-proving-job.ts +67 -52
- package/src/prover-node.ts +46 -16
- package/src/tx-provider/config.ts +11 -3
package/dest/config.d.ts
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { type ArchiverConfig } from '@aztec/archiver';
|
|
2
|
+
import { type ConfigMappingsType } from '@aztec/foundation/config';
|
|
2
3
|
import { type ProverClientConfig } from '@aztec/prover-client';
|
|
3
4
|
import { type PublisherConfig, type TxSenderConfig } from '@aztec/sequencer-client';
|
|
4
5
|
import { type WorldStateConfig } from '@aztec/world-state';
|
|
5
6
|
import { type TxProviderConfig } from './tx-provider/config.js';
|
|
6
7
|
export type ProverNodeConfig = ArchiverConfig & ProverClientConfig & WorldStateConfig & PublisherConfig & TxSenderConfig & TxProviderConfig;
|
|
8
|
+
export declare const proverNodeConfigMappings: ConfigMappingsType<ProverNodeConfig>;
|
|
7
9
|
export declare function getProverNodeConfigFromEnv(): ProverNodeConfig;
|
|
8
10
|
//# sourceMappingURL=config.d.ts.map
|
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,
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAoD,MAAM,iBAAiB,CAAC;AACxG,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,EAAE,KAAK,kBAAkB,EAAgD,MAAM,sBAAsB,CAAC;AAC7G,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,cAAc,EAKpB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,KAAK,gBAAgB,EAAwD,MAAM,oBAAoB,CAAC;AAEjH,OAAO,EAAE,KAAK,gBAAgB,EAAwD,MAAM,yBAAyB,CAAC;AAEtH,MAAM,MAAM,gBAAgB,GAAG,cAAc,GAC3C,kBAAkB,GAClB,gBAAgB,GAChB,eAAe,GACf,cAAc,GACd,gBAAgB,CAAC;AAEnB,eAAO,MAAM,wBAAwB,EAAE,kBAAkB,CAAC,gBAAgB,CAOzE,CAAC;AAEF,wBAAgB,0BAA0B,IAAI,gBAAgB,CAS7D"}
|
package/dest/config.js
CHANGED
|
@@ -1,17 +1,24 @@
|
|
|
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';
|
|
1
|
+
import { archiverConfigMappings, getArchiverConfigFromEnv } from '@aztec/archiver';
|
|
2
|
+
import { getProverEnvVars, proverClientConfigMappings } from '@aztec/prover-client';
|
|
3
|
+
import { getPublisherConfigFromEnv, getPublisherConfigMappings, getTxSenderConfigFromEnv, getTxSenderConfigMappings, } from '@aztec/sequencer-client';
|
|
4
|
+
import { getWorldStateConfigFromEnv, worldStateConfigMappings } from '@aztec/world-state';
|
|
5
|
+
import { getTxProviderConfigFromEnv, txProviderConfigMappings } from './tx-provider/config.js';
|
|
6
|
+
export const proverNodeConfigMappings = {
|
|
7
|
+
...archiverConfigMappings,
|
|
8
|
+
...proverClientConfigMappings,
|
|
9
|
+
...worldStateConfigMappings,
|
|
10
|
+
...getPublisherConfigMappings('PROVER'),
|
|
11
|
+
...getTxSenderConfigMappings('PROVER'),
|
|
12
|
+
...txProviderConfigMappings,
|
|
13
|
+
};
|
|
6
14
|
export function getProverNodeConfigFromEnv() {
|
|
7
|
-
const { PROOF_PUBLISH_RETRY_INTERVAL_MS } = process.env;
|
|
8
15
|
return {
|
|
9
16
|
...getArchiverConfigFromEnv(),
|
|
10
17
|
...getProverEnvVars(),
|
|
11
18
|
...getWorldStateConfigFromEnv(),
|
|
19
|
+
...getPublisherConfigFromEnv('PROVER'),
|
|
12
20
|
...getTxSenderConfigFromEnv('PROVER'),
|
|
13
21
|
...getTxProviderConfigFromEnv(),
|
|
14
|
-
l1PublishRetryIntervalMS: PROOF_PUBLISH_RETRY_INTERVAL_MS ? +PROOF_PUBLISH_RETRY_INTERVAL_MS : 1000,
|
|
15
22
|
};
|
|
16
23
|
}
|
|
17
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
24
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQXVCLHNCQUFzQixFQUFFLHdCQUF3QixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFeEcsT0FBTyxFQUEyQixnQkFBZ0IsRUFBRSwwQkFBMEIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzdHLE9BQU8sRUFHTCx5QkFBeUIsRUFDekIsMEJBQTBCLEVBQzFCLHdCQUF3QixFQUN4Qix5QkFBeUIsR0FDMUIsTUFBTSx5QkFBeUIsQ0FBQztBQUNqQyxPQUFPLEVBQXlCLDBCQUEwQixFQUFFLHdCQUF3QixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFakgsT0FBTyxFQUF5QiwwQkFBMEIsRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBU3RILE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUF5QztJQUM1RSxHQUFHLHNCQUFzQjtJQUN6QixHQUFHLDBCQUEwQjtJQUM3QixHQUFHLHdCQUF3QjtJQUMzQixHQUFHLDBCQUEwQixDQUFDLFFBQVEsQ0FBQztJQUN2QyxHQUFHLHlCQUF5QixDQUFDLFFBQVEsQ0FBQztJQUN0QyxHQUFHLHdCQUF3QjtDQUM1QixDQUFDO0FBRUYsTUFBTSxVQUFVLDBCQUEwQjtJQUN4QyxPQUFPO1FBQ0wsR0FBRyx3QkFBd0IsRUFBRTtRQUM3QixHQUFHLGdCQUFnQixFQUFFO1FBQ3JCLEdBQUcsMEJBQTBCLEVBQUU7UUFDL0IsR0FBRyx5QkFBeUIsQ0FBQyxRQUFRLENBQUM7UUFDdEMsR0FBRyx3QkFBd0IsQ0FBQyxRQUFRLENBQUM7UUFDckMsR0FBRywwQkFBMEIsRUFBRTtLQUNoQyxDQUFDO0FBQ0osQ0FBQyJ9
|
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;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,
|
|
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,uBAqCP"}
|
package/dest/factory.js
CHANGED
|
@@ -3,7 +3,7 @@ import { createDebugLogger } from '@aztec/foundation/log';
|
|
|
3
3
|
import { createStore } from '@aztec/kv-store/utils';
|
|
4
4
|
import { createProverClient } from '@aztec/prover-client';
|
|
5
5
|
import { getL1Publisher } from '@aztec/sequencer-client';
|
|
6
|
-
import {
|
|
6
|
+
import { createSimulationProvider } from '@aztec/simulator';
|
|
7
7
|
import { NoopTelemetryClient } from '@aztec/telemetry-client/noop';
|
|
8
8
|
import { createWorldStateSynchronizer } from '@aztec/world-state';
|
|
9
9
|
import { ProverNode } from './prover-node.js';
|
|
@@ -21,14 +21,12 @@ export async function createProverNode(config, deps = {}) {
|
|
|
21
21
|
const worldStateSynchronizer = await createWorldStateSynchronizer(worldStateConfig, store, archiver);
|
|
22
22
|
await worldStateSynchronizer.start();
|
|
23
23
|
const simulationProvider = await createSimulationProvider(config, log);
|
|
24
|
-
const prover = await createProverClient(config,
|
|
24
|
+
const prover = await createProverClient(config, telemetry);
|
|
25
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);
|
|
26
|
+
const publisher = getL1Publisher(config, telemetry);
|
|
29
27
|
const txProvider = deps.aztecNodeTxProvider
|
|
30
28
|
? new AztecNodeTxProvider(deps.aztecNodeTxProvider)
|
|
31
29
|
: createTxProvider(config);
|
|
32
|
-
return new ProverNode(prover,
|
|
30
|
+
return new ProverNode(prover, publisher, archiver, archiver, archiver, worldStateSynchronizer, txProvider, simulationProvider, telemetry);
|
|
33
31
|
}
|
|
34
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
32
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFjdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9mYWN0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBaUIsY0FBYyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFaEUsT0FBTyxFQUFvQixpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzVFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUMxRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFNUQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbkUsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFHbEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQzlFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRTVELGdEQUFnRDtBQUNoRCxNQUFNLENBQUMsS0FBSyxVQUFVLGdCQUFnQixDQUNwQyxNQUF3QixFQUN4QixPQU1JLEVBQUU7SUFFTixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksbUJBQW1CLEVBQUUsQ0FBQztJQUM5RCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxJQUFJLGlCQUFpQixDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQzFELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLElBQUksaUJBQWlCLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUV6RSxNQUFNLEtBQUssR0FBRyxNQUFNLFdBQVcsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLFdBQVcsQ0FBQyxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFFcEYsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLE1BQU0sY0FBYyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLEVBQUUsY0FBYyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM3RyxHQUFHLENBQUMsT0FBTyxDQUFDLHdDQUF3QyxNQUFNLFFBQVEsQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFFdkYsTUFBTSxnQkFBZ0IsR0FBRyxFQUFFLEdBQUcsTUFBTSxFQUFFLDBCQUEwQixFQUFFLElBQUksRUFBRSxDQUFDO0lBQ3pFLE1BQU0sc0JBQXNCLEdBQUcsTUFBTSw0QkFBNEIsQ0FBQyxnQkFBZ0IsRUFBRSxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDckcsTUFBTSxzQkFBc0IsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUVyQyxNQUFNLGtCQUFrQixHQUFHLE1BQU0sd0JBQXdCLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBRXZFLE1BQU0sTUFBTSxHQUFHLE1BQU0sa0JBQWtCLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBRTNELG1GQUFtRjtJQUNuRixNQUFNLFNBQVMsR0FBRyxjQUFjLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBRXBELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxtQkFBbUI7UUFDekMsQ0FBQyxDQUFDLElBQUksbUJBQW1CLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDO1FBQ25ELENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUU3QixPQUFPLElBQUksVUFBVSxDQUNuQixNQUFPLEVBQ1AsU0FBUyxFQUNULFFBQVEsRUFDUixRQUFRLEVBQ1IsUUFBUSxFQUNSLHNCQUFzQixFQUN0QixVQUFVLEVBQ1Ysa0JBQWtCLEVBQ2xCLFNBQVMsQ0FDVixDQUFDO0FBQ0osQ0FBQyJ9
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type BlockProver, type L2BlockSource, type TxProvider } from '@aztec/circuit-types';
|
|
1
|
+
import { type BlockProver, type L1ToL2MessageSource, type L2BlockSource, type TxProvider } from '@aztec/circuit-types';
|
|
2
2
|
import { type L1Publisher } from '@aztec/sequencer-client';
|
|
3
3
|
import { type PublicProcessorFactory } from '@aztec/simulator';
|
|
4
4
|
/**
|
|
@@ -11,15 +11,17 @@ export declare class BlockProvingJob {
|
|
|
11
11
|
private publicProcessorFactory;
|
|
12
12
|
private publisher;
|
|
13
13
|
private l2BlockSource;
|
|
14
|
+
private l1ToL2MessageSource;
|
|
14
15
|
private txProvider;
|
|
15
16
|
private state;
|
|
16
17
|
private log;
|
|
17
|
-
constructor(prover: BlockProver, publicProcessorFactory: PublicProcessorFactory, publisher: L1Publisher, l2BlockSource: L2BlockSource, txProvider: TxProvider);
|
|
18
|
+
constructor(prover: BlockProver, publicProcessorFactory: PublicProcessorFactory, publisher: L1Publisher, l2BlockSource: L2BlockSource, l1ToL2MessageSource: L1ToL2MessageSource, txProvider: TxProvider);
|
|
18
19
|
getState(): BlockProvingJobState;
|
|
19
20
|
run(fromBlock: number, toBlock: number): Promise<void>;
|
|
20
21
|
private getBlock;
|
|
21
22
|
private getTxs;
|
|
23
|
+
private getL1ToL2Messages;
|
|
22
24
|
private processTxs;
|
|
23
25
|
}
|
|
24
|
-
export type BlockProvingJobState = 'initialized' | '
|
|
26
|
+
export type BlockProvingJobState = 'initialized' | 'processing' | 'awaiting-prover' | 'publishing-proof' | 'completed' | 'failed';
|
|
25
27
|
//# sourceMappingURL=block-proving-job.d.ts.map
|
|
@@ -1 +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,
|
|
1
|
+
{"version":3,"file":"block-proving-job.d.ts","sourceRoot":"","sources":["../../src/job/block-proving-job.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,WAAW,EAEhB,KAAK,mBAAmB,EAExB,KAAK,aAAa,EAKlB,KAAK,UAAU,EAChB,MAAM,sBAAsB,CAAC;AAE9B,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,mBAAmB;IAC3B,OAAO,CAAC,UAAU;IATpB,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,mBAAmB,EAAE,mBAAmB,EACxC,UAAU,EAAE,UAAU;IAGzB,QAAQ,IAAI,oBAAoB;IAI1B,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;YAwErC,QAAQ;YAQR,MAAM;IAWpB,OAAO,CAAC,iBAAiB;YAIX,UAAU;CAoBzB;AAED,MAAM,MAAM,oBAAoB,GAC5B,aAAa,GACb,YAAY,GACZ,iBAAiB,GACjB,kBAAkB,GAClB,WAAW,GACX,QAAQ,CAAC"}
|
|
@@ -6,11 +6,12 @@ import { createDebugLogger } from '@aztec/foundation/log';
|
|
|
6
6
|
* world state as part of public call execution via the public processor.
|
|
7
7
|
*/
|
|
8
8
|
export class BlockProvingJob {
|
|
9
|
-
constructor(prover, publicProcessorFactory, publisher, l2BlockSource, txProvider) {
|
|
9
|
+
constructor(prover, publicProcessorFactory, publisher, l2BlockSource, l1ToL2MessageSource, txProvider) {
|
|
10
10
|
this.prover = prover;
|
|
11
11
|
this.publicProcessorFactory = publicProcessorFactory;
|
|
12
12
|
this.publisher = publisher;
|
|
13
13
|
this.l2BlockSource = l2BlockSource;
|
|
14
|
+
this.l1ToL2MessageSource = l1ToL2MessageSource;
|
|
14
15
|
this.txProvider = txProvider;
|
|
15
16
|
this.state = 'initialized';
|
|
16
17
|
this.log = createDebugLogger('aztec:block-proving-job');
|
|
@@ -23,48 +24,54 @@ export class BlockProvingJob {
|
|
|
23
24
|
throw new Error(`Block ranges are not yet supported`);
|
|
24
25
|
}
|
|
25
26
|
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
27
|
this.state = 'processing';
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
28
|
+
try {
|
|
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 = await this.getL1ToL2Messages(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
|
+
// When we move to proving epochs, this should change into a startNewEpoch and be lifted outside the loop.
|
|
47
|
+
const provingTicket = await this.prover.startNewBlock(txCount, globalVariables, l1ToL2Messages);
|
|
48
|
+
const publicProcessor = this.publicProcessorFactory.create(historicalHeader, globalVariables);
|
|
49
|
+
const txs = await this.getTxs(txHashes);
|
|
50
|
+
await this.processTxs(publicProcessor, txs, txCount);
|
|
51
|
+
this.log.verbose(`Processed all txs for block`, {
|
|
52
|
+
blockNumber: block.number,
|
|
53
|
+
blockHash: block.hash().toString(),
|
|
54
|
+
});
|
|
55
|
+
await this.prover.setBlockCompleted();
|
|
56
|
+
// This should be moved outside the loop to match the creation of the proving ticket when we move to epochs.
|
|
57
|
+
this.state = 'awaiting-prover';
|
|
58
|
+
const result = await provingTicket.provingPromise;
|
|
59
|
+
if (result.status === PROVING_STATUS.FAILURE) {
|
|
60
|
+
throw new Error(`Block proving failed: ${result.reason}`);
|
|
61
|
+
}
|
|
62
|
+
historicalHeader = block.header;
|
|
58
63
|
}
|
|
59
|
-
|
|
64
|
+
const { block, aggregationObject, proof } = await this.prover.finaliseBlock();
|
|
65
|
+
this.log.info(`Finalised proof for block range`, { fromBlock, toBlock });
|
|
66
|
+
this.state = 'publishing-proof';
|
|
67
|
+
await this.publisher.submitProof(block.header, block.archive.root, this.prover.getProverId(), aggregationObject, proof);
|
|
68
|
+
this.log.info(`Submitted proof for block range`, { fromBlock, toBlock });
|
|
69
|
+
this.state = 'completed';
|
|
70
|
+
}
|
|
71
|
+
catch (err) {
|
|
72
|
+
this.log.error(`Error running block prover job: ${err}`);
|
|
73
|
+
this.state = 'failed';
|
|
60
74
|
}
|
|
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
75
|
}
|
|
69
76
|
async getBlock(blockNumber) {
|
|
70
77
|
const block = await this.l2BlockSource.getBlock(blockNumber);
|
|
@@ -81,6 +88,9 @@ export class BlockProvingJob {
|
|
|
81
88
|
}
|
|
82
89
|
return txs.map(([_, tx]) => tx);
|
|
83
90
|
}
|
|
91
|
+
getL1ToL2Messages(block) {
|
|
92
|
+
return this.l1ToL2MessageSource.getL1ToL2Messages(BigInt(block.number));
|
|
93
|
+
}
|
|
84
94
|
async processTxs(publicProcessor, txs, totalNumberOfTxs) {
|
|
85
95
|
const [processedTxs, failedTxs] = await publicProcessor.process(txs, totalNumberOfTxs, this.prover, new EmptyTxValidator());
|
|
86
96
|
if (failedTxs.length) {
|
|
@@ -89,4 +99,4 @@ export class BlockProvingJob {
|
|
|
89
99
|
return processedTxs;
|
|
90
100
|
}
|
|
91
101
|
}
|
|
92
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
102
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmxvY2stcHJvdmluZy1qb2IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvam9iL2Jsb2NrLXByb3Zpbmctam9iLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxnQkFBZ0IsRUFJaEIsY0FBYyxHQUtmLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFJMUQ7Ozs7R0FJRztBQUNILE1BQU0sT0FBTyxlQUFlO0lBSTFCLFlBQ1UsTUFBbUIsRUFDbkIsc0JBQThDLEVBQzlDLFNBQXNCLEVBQ3RCLGFBQTRCLEVBQzVCLG1CQUF3QyxFQUN4QyxVQUFzQjtRQUx0QixXQUFNLEdBQU4sTUFBTSxDQUFhO1FBQ25CLDJCQUFzQixHQUF0QixzQkFBc0IsQ0FBd0I7UUFDOUMsY0FBUyxHQUFULFNBQVMsQ0FBYTtRQUN0QixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUM1Qix3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXFCO1FBQ3hDLGVBQVUsR0FBVixVQUFVLENBQVk7UUFUeEIsVUFBSyxHQUF5QixhQUFhLENBQUM7UUFDNUMsUUFBRyxHQUFHLGlCQUFpQixDQUFDLHlCQUF5QixDQUFDLENBQUM7SUFTeEQsQ0FBQztJQUVHLFFBQVE7UUFDYixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDcEIsQ0FBQztJQUVNLEtBQUssQ0FBQyxHQUFHLENBQUMsU0FBaUIsRUFBRSxPQUFlO1FBQ2pELElBQUksU0FBUyxLQUFLLE9BQU8sRUFBRSxDQUFDO1lBQzFCLE1BQU0sSUFBSSxLQUFLLENBQUMsb0NBQW9DLENBQUMsQ0FBQztRQUN4RCxDQUFDO1FBRUQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsNEJBQTRCLEVBQUUsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUNwRSxJQUFJLENBQUMsS0FBSyxHQUFHLFlBQVksQ0FBQztRQUMx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
|
package/dest/prover-node.d.ts
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
|
-
import { type L2BlockSource, type ProverClient, type TxProvider } from '@aztec/circuit-types';
|
|
1
|
+
import { type L1ToL2MessageSource, type L2BlockSource, type ProverClient, type TxProvider } from '@aztec/circuit-types';
|
|
2
2
|
import { type L1Publisher } from '@aztec/sequencer-client';
|
|
3
|
-
import { type
|
|
3
|
+
import { type SimulationProvider } from '@aztec/simulator';
|
|
4
|
+
import { type TelemetryClient } from '@aztec/telemetry-client';
|
|
5
|
+
import { type WorldStateSynchronizer } from '@aztec/world-state';
|
|
6
|
+
import { type ContractDataSource } from '../../types/src/contracts/contract_data_source.js';
|
|
4
7
|
/**
|
|
5
8
|
* An Aztec Prover Node is a standalone process that monitors the unfinalised chain on L1 for unproven blocks,
|
|
6
9
|
* fetches their txs from a tx source in the p2p network or an external node, re-executes their public functions,
|
|
@@ -8,14 +11,19 @@ import { type PublicProcessorFactory } from '@aztec/simulator';
|
|
|
8
11
|
*/
|
|
9
12
|
export declare class ProverNode {
|
|
10
13
|
private prover;
|
|
11
|
-
private publicProcessorFactory;
|
|
12
14
|
private publisher;
|
|
13
15
|
private l2BlockSource;
|
|
16
|
+
private l1ToL2MessageSource;
|
|
17
|
+
private contractDataSource;
|
|
18
|
+
private worldState;
|
|
14
19
|
private txProvider;
|
|
20
|
+
private simulator;
|
|
21
|
+
private telemetryClient;
|
|
15
22
|
private options;
|
|
16
23
|
private log;
|
|
17
24
|
private runningPromise;
|
|
18
|
-
|
|
25
|
+
private latestBlockWeAreProving;
|
|
26
|
+
constructor(prover: ProverClient, publisher: L1Publisher, l2BlockSource: L2BlockSource, l1ToL2MessageSource: L1ToL2MessageSource, contractDataSource: ContractDataSource, worldState: WorldStateSynchronizer, txProvider: TxProvider, simulator: SimulationProvider, telemetryClient: TelemetryClient, options?: {
|
|
19
27
|
pollingIntervalMs: number;
|
|
20
28
|
disableAutomaticProving: boolean;
|
|
21
29
|
});
|
|
@@ -31,7 +39,6 @@ export declare class ProverNode {
|
|
|
31
39
|
/**
|
|
32
40
|
* Single iteration of recurring work. This method is called periodically by the running promise.
|
|
33
41
|
* 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
42
|
*/
|
|
36
43
|
protected work(): Promise<void>;
|
|
37
44
|
/**
|
|
@@ -1 +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;
|
|
1
|
+
{"version":3,"file":"prover-node.d.ts","sourceRoot":"","sources":["../src/prover-node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,mBAAmB,EAAE,KAAK,aAAa,EAAE,KAAK,YAAY,EAAE,KAAK,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAGxH,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAA0B,KAAK,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACnF,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,KAAK,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAEjE,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,mDAAmD,CAAC;AAG5F;;;;GAIG;AACH,qBAAa,UAAU;IAMnB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,mBAAmB;IAC3B,OAAO,CAAC,kBAAkB;IAC1B,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,eAAe;IACvB,OAAO,CAAC,OAAO;IAdjB,OAAO,CAAC,GAAG,CAA0C;IACrD,OAAO,CAAC,cAAc,CAA6B;IACnD,OAAO,CAAC,uBAAuB,CAAqB;gBAG1C,MAAM,EAAE,YAAY,EACpB,SAAS,EAAE,WAAW,EACtB,aAAa,EAAE,aAAa,EAC5B,mBAAmB,EAAE,mBAAmB,EACxC,kBAAkB,EAAE,kBAAkB,EACtC,UAAU,EAAE,sBAAsB,EAClC,UAAU,EAAE,UAAU,EACtB,SAAS,EAAE,kBAAkB,EAC7B,eAAe,EAAE,eAAe,EAChC,OAAO,GAAE;QAAE,iBAAiB,EAAE,MAAM,CAAC;QAAC,uBAAuB,EAAE,OAAO,CAAA;KAG7E;IAGH;;;OAGG;IACH,KAAK;IAML;;OAEG;IACG,IAAI;IAUV;;;OAGG;cACa,IAAI;IAyBpB;;OAEG;IACU,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;IAKrD;;OAEG;IACU,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;IAK1D;;OAEG;IACI,SAAS;YAIF,gBAAgB;CAyB/B"}
|
package/dest/prover-node.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { createDebugLogger } from '@aztec/foundation/log';
|
|
2
2
|
import { RunningPromise } from '@aztec/foundation/running-promise';
|
|
3
|
+
import { PublicProcessorFactory } from '@aztec/simulator';
|
|
3
4
|
import { BlockProvingJob } from './job/block-proving-job.js';
|
|
4
5
|
/**
|
|
5
6
|
* An Aztec Prover Node is a standalone process that monitors the unfinalised chain on L1 for unproven blocks,
|
|
@@ -7,15 +8,19 @@ import { BlockProvingJob } from './job/block-proving-job.js';
|
|
|
7
8
|
* creates a rollup proof, and submits it to L1.
|
|
8
9
|
*/
|
|
9
10
|
export class ProverNode {
|
|
10
|
-
constructor(prover,
|
|
11
|
+
constructor(prover, publisher, l2BlockSource, l1ToL2MessageSource, contractDataSource, worldState, txProvider, simulator, telemetryClient, options = {
|
|
11
12
|
pollingIntervalMs: 1000,
|
|
12
13
|
disableAutomaticProving: false,
|
|
13
14
|
}) {
|
|
14
15
|
this.prover = prover;
|
|
15
|
-
this.publicProcessorFactory = publicProcessorFactory;
|
|
16
16
|
this.publisher = publisher;
|
|
17
17
|
this.l2BlockSource = l2BlockSource;
|
|
18
|
+
this.l1ToL2MessageSource = l1ToL2MessageSource;
|
|
19
|
+
this.contractDataSource = contractDataSource;
|
|
20
|
+
this.worldState = worldState;
|
|
18
21
|
this.txProvider = txProvider;
|
|
22
|
+
this.simulator = simulator;
|
|
23
|
+
this.telemetryClient = telemetryClient;
|
|
19
24
|
this.options = options;
|
|
20
25
|
this.log = createDebugLogger('aztec:prover-node');
|
|
21
26
|
}
|
|
@@ -38,11 +43,11 @@ export class ProverNode {
|
|
|
38
43
|
await this.l2BlockSource.stop();
|
|
39
44
|
this.publisher.interrupt();
|
|
40
45
|
this.log.info('Stopped ProverNode');
|
|
46
|
+
// TODO(palla/prover-node): Keep a reference to all ongoing ProvingJobs and stop them.
|
|
41
47
|
}
|
|
42
48
|
/**
|
|
43
49
|
* Single iteration of recurring work. This method is called periodically by the running promise.
|
|
44
50
|
* 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
51
|
*/
|
|
47
52
|
async work() {
|
|
48
53
|
if (this.options.disableAutomaticProving) {
|
|
@@ -52,26 +57,31 @@ export class ProverNode {
|
|
|
52
57
|
this.l2BlockSource.getBlockNumber(),
|
|
53
58
|
this.l2BlockSource.getProvenBlockNumber(),
|
|
54
59
|
]);
|
|
55
|
-
|
|
56
|
-
|
|
60
|
+
// Consider both the latest block we are proving and the last block proven on the chain
|
|
61
|
+
const latestBlockBeingProven = this.latestBlockWeAreProving ?? 0;
|
|
62
|
+
const latestProven = Math.max(latestBlockBeingProven, latestProvenBlockNumber);
|
|
63
|
+
if (latestProven >= latestBlockNumber) {
|
|
64
|
+
this.log.debug(`No new blocks to prove`, { latestBlockNumber, latestProvenBlockNumber, latestBlockBeingProven });
|
|
57
65
|
return;
|
|
58
66
|
}
|
|
59
|
-
const fromBlock =
|
|
67
|
+
const fromBlock = latestProven + 1;
|
|
60
68
|
const toBlock = fromBlock; // We only prove one block at a time for now
|
|
61
|
-
await this.
|
|
69
|
+
await this.startProof(fromBlock, toBlock);
|
|
70
|
+
this.latestBlockWeAreProving = toBlock;
|
|
62
71
|
}
|
|
63
72
|
/**
|
|
64
73
|
* Creates a proof for a block range. Returns once the proof has been submitted to L1.
|
|
65
74
|
*/
|
|
66
|
-
prove(fromBlock, toBlock) {
|
|
67
|
-
|
|
75
|
+
async prove(fromBlock, toBlock) {
|
|
76
|
+
const job = await this.createProvingJob(fromBlock);
|
|
77
|
+
return job.run(fromBlock, toBlock);
|
|
68
78
|
}
|
|
69
79
|
/**
|
|
70
80
|
* Starts a proving process and returns immediately.
|
|
71
81
|
*/
|
|
72
|
-
startProof(fromBlock, toBlock) {
|
|
73
|
-
|
|
74
|
-
|
|
82
|
+
async startProof(fromBlock, toBlock) {
|
|
83
|
+
const job = await this.createProvingJob(fromBlock);
|
|
84
|
+
void job.run(fromBlock, toBlock);
|
|
75
85
|
}
|
|
76
86
|
/**
|
|
77
87
|
* Returns the prover instance.
|
|
@@ -79,8 +89,15 @@ export class ProverNode {
|
|
|
79
89
|
getProver() {
|
|
80
90
|
return this.prover;
|
|
81
91
|
}
|
|
82
|
-
createProvingJob() {
|
|
83
|
-
|
|
92
|
+
async createProvingJob(fromBlock) {
|
|
93
|
+
if ((await this.worldState.status()).syncedToL2Block >= fromBlock) {
|
|
94
|
+
throw new Error(`Cannot create proving job for block ${fromBlock} as it is behind the current world state`);
|
|
95
|
+
}
|
|
96
|
+
// Fast forward world state to right before the target block and get a fork
|
|
97
|
+
const db = await this.worldState.syncImmediateAndFork(fromBlock - 1, true);
|
|
98
|
+
// Create a processor using the forked world state
|
|
99
|
+
const publicProcessorFactory = new PublicProcessorFactory(db, this.contractDataSource, this.simulator, this.telemetryClient);
|
|
100
|
+
return new BlockProvingJob(this.prover.createBlockProver(db), publicProcessorFactory, this.publisher, this.l2BlockSource, this.l1ToL2MessageSource, this.txProvider);
|
|
84
101
|
}
|
|
85
102
|
}
|
|
86
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
103
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmVyLW5vZGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcHJvdmVyLW5vZGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBRW5FLE9BQU8sRUFBRSxzQkFBc0IsRUFBMkIsTUFBTSxrQkFBa0IsQ0FBQztBQUtuRixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFN0Q7Ozs7R0FJRztBQUNILE1BQU0sT0FBTyxVQUFVO0lBS3JCLFlBQ1UsTUFBb0IsRUFDcEIsU0FBc0IsRUFDdEIsYUFBNEIsRUFDNUIsbUJBQXdDLEVBQ3hDLGtCQUFzQyxFQUN0QyxVQUFrQyxFQUNsQyxVQUFzQixFQUN0QixTQUE2QixFQUM3QixlQUFnQyxFQUNoQyxVQUEyRTtRQUNqRixpQkFBaUIsRUFBRSxJQUFLO1FBQ3hCLHVCQUF1QixFQUFFLEtBQUs7S0FDL0I7UUFaTyxXQUFNLEdBQU4sTUFBTSxDQUFjO1FBQ3BCLGNBQVMsR0FBVCxTQUFTLENBQWE7UUFDdEIsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFxQjtRQUN4Qyx1QkFBa0IsR0FBbEIsa0JBQWtCLENBQW9CO1FBQ3RDLGVBQVUsR0FBVixVQUFVLENBQXdCO1FBQ2xDLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDdEIsY0FBUyxHQUFULFNBQVMsQ0FBb0I7UUFDN0Isb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBQ2hDLFlBQU8sR0FBUCxPQUFPLENBR2Q7UUFqQkssUUFBRyxHQUFHLGlCQUFpQixDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFrQmxELENBQUM7SUFFSjs7O09BR0c7SUFDSCxLQUFLO1FBQ0gsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDL0YsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUM1QixJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxJQUFJO1FBQ1IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUNyQyxNQUFNLElBQUksQ0FBQyxjQUFjLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFDbEMsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3pCLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNoQyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQzNCLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDcEMsc0ZBQXNGO0lBQ3hGLENBQUM7SUFFRDs7O09BR0c7SUFDTyxLQUFLLENBQUMsSUFBSTtRQUNsQixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztZQUN6QyxPQUFPO1FBQ1QsQ0FBQztRQUVELE1BQU0sQ0FBQyxpQkFBaUIsRUFBRSx1QkFBdUIsQ0FBQyxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQztZQUNyRSxJQUFJLENBQUMsYUFBYSxDQUFDLGNBQWMsRUFBRTtZQUNuQyxJQUFJLENBQUMsYUFBYSxDQUFDLG9CQUFvQixFQUFFO1NBQzFDLENBQUMsQ0FBQztRQUVILHVGQUF1RjtRQUN2RixNQUFNLHNCQUFzQixHQUFHLElBQUksQ0FBQyx1QkFBdUIsSUFBSSxDQUFDLENBQUM7UUFDakUsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsRUFBRSx1QkFBdUIsQ0FBQyxDQUFDO1FBQy9FLElBQUksWUFBWSxJQUFJLGlCQUFpQixFQUFFLENBQUM7WUFDdEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsd0JBQXdCLEVBQUUsRUFBRSxpQkFBaUIsRUFBRSx1QkFBdUIsRUFBRSxzQkFBc0IsRUFBRSxDQUFDLENBQUM7WUFDakgsT0FBTztRQUNULENBQUM7UUFFRCxNQUFNLFNBQVMsR0FBRyxZQUFZLEdBQUcsQ0FBQyxDQUFDO1FBQ25DLE1BQU0sT0FBTyxHQUFHLFNBQVMsQ0FBQyxDQUFDLDRDQUE0QztRQUV2RSxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzFDLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxPQUFPLENBQUM7SUFDekMsQ0FBQztJQUVEOztPQUVHO0lBQ0ksS0FBSyxDQUFDLEtBQUssQ0FBQyxTQUFpQixFQUFFLE9BQWU7UUFDbkQsTUFBTSxHQUFHLEdBQUcsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDbkQsT0FBTyxHQUFHLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsVUFBVSxDQUFDLFNBQWlCLEVBQUUsT0FBZTtRQUN4RCxNQUFNLEdBQUcsR0FBRyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNuRCxLQUFLLEdBQUcsQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRDs7T0FFRztJQUNJLFNBQVM7UUFDZCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDckIsQ0FBQztJQUVPLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFpQjtRQUM5QyxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsZUFBZSxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQ2xFLE1BQU0sSUFBSSxLQUFLLENBQUMsdUNBQXVDLFNBQVMsMENBQTBDLENBQUMsQ0FBQztRQUM5RyxDQUFDO1FBRUQsMkVBQTJFO1FBQzNFLE1BQU0sRUFBRSxHQUFHLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBRTNFLGtEQUFrRDtRQUNsRCxNQUFNLHNCQUFzQixHQUFHLElBQUksc0JBQXNCLENBQ3ZELEVBQUUsRUFDRixJQUFJLENBQUMsa0JBQWtCLEVBQ3ZCLElBQUksQ0FBQyxTQUFTLEVBQ2QsSUFBSSxDQUFDLGVBQWUsQ0FDckIsQ0FBQztRQUVGLE9BQU8sSUFBSSxlQUFlLENBQ3hCLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDLEVBQ2pDLHNCQUFzQixFQUN0QixJQUFJLENBQUMsU0FBUyxFQUNkLElBQUksQ0FBQyxhQUFhLEVBQ2xCLElBQUksQ0FBQyxtQkFBbUIsRUFDeEIsSUFBSSxDQUFDLFVBQVUsQ0FDaEIsQ0FBQztJQUNKLENBQUM7Q0FDRiJ9
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
+
import { type ConfigMappingsType } from '@aztec/foundation/config';
|
|
1
2
|
export type TxProviderConfig = {
|
|
2
3
|
txProviderNodeUrl: string | undefined;
|
|
3
4
|
};
|
|
5
|
+
export declare const txProviderConfigMappings: ConfigMappingsType<TxProviderConfig>;
|
|
4
6
|
export declare function getTxProviderConfigFromEnv(): TxProviderConfig;
|
|
5
7
|
//# sourceMappingURL=config.d.ts.map
|
|
@@ -1 +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,
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/tx-provider/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,kBAAkB,EAAyB,MAAM,0BAA0B,CAAC;AAE1F,MAAM,MAAM,gBAAgB,GAAG;IAC7B,iBAAiB,EAAE,MAAM,GAAG,SAAS,CAAC;CACvC,CAAC;AAEF,eAAO,MAAM,wBAAwB,EAAE,kBAAkB,CAAC,gBAAgB,CAMzE,CAAC;AAEF,wBAAgB,0BAA0B,IAAI,gBAAgB,CAE7D"}
|
|
@@ -1,6 +1,12 @@
|
|
|
1
|
+
import { getConfigFromMappings } from '@aztec/foundation/config';
|
|
2
|
+
export const txProviderConfigMappings = {
|
|
3
|
+
txProviderNodeUrl: {
|
|
4
|
+
env: 'TX_PROVIDER_NODE_URL',
|
|
5
|
+
description: 'The URL of the tx provider node',
|
|
6
|
+
parseEnv: (val) => val,
|
|
7
|
+
},
|
|
8
|
+
};
|
|
1
9
|
export function getTxProviderConfigFromEnv() {
|
|
2
|
-
return
|
|
3
|
-
txProviderNodeUrl: process.env.TX_PROVIDER_NODE_URL ?? process.env.AZTEC_NODE_URL,
|
|
4
|
-
};
|
|
10
|
+
return getConfigFromMappings(txProviderConfigMappings);
|
|
5
11
|
}
|
|
6
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
12
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3R4LXByb3ZpZGVyL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQTJCLHFCQUFxQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFNMUYsTUFBTSxDQUFDLE1BQU0sd0JBQXdCLEdBQXlDO0lBQzVFLGlCQUFpQixFQUFFO1FBQ2pCLEdBQUcsRUFBRSxzQkFBc0I7UUFDM0IsV0FBVyxFQUFFLGlDQUFpQztRQUM5QyxRQUFRLEVBQUUsQ0FBQyxHQUFXLEVBQUUsRUFBRSxDQUFDLEdBQUc7S0FDL0I7Q0FDRixDQUFDO0FBRUYsTUFBTSxVQUFVLDBCQUEwQjtJQUN4QyxPQUFPLHFCQUFxQixDQUFtQix3QkFBd0IsQ0FBQyxDQUFDO0FBQzNFLENBQUMifQ==
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/prover-node",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.48.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": "./dest/index.js"
|
|
@@ -49,16 +49,16 @@
|
|
|
49
49
|
]
|
|
50
50
|
},
|
|
51
51
|
"dependencies": {
|
|
52
|
-
"@aztec/archiver": "0.
|
|
53
|
-
"@aztec/circuit-types": "0.
|
|
54
|
-
"@aztec/circuits.js": "0.
|
|
55
|
-
"@aztec/foundation": "0.
|
|
56
|
-
"@aztec/kv-store": "0.
|
|
57
|
-
"@aztec/prover-client": "0.
|
|
58
|
-
"@aztec/sequencer-client": "0.
|
|
59
|
-
"@aztec/simulator": "0.
|
|
60
|
-
"@aztec/telemetry-client": "0.
|
|
61
|
-
"@aztec/world-state": "0.
|
|
52
|
+
"@aztec/archiver": "0.48.0",
|
|
53
|
+
"@aztec/circuit-types": "0.48.0",
|
|
54
|
+
"@aztec/circuits.js": "0.48.0",
|
|
55
|
+
"@aztec/foundation": "0.48.0",
|
|
56
|
+
"@aztec/kv-store": "0.48.0",
|
|
57
|
+
"@aztec/prover-client": "0.48.0",
|
|
58
|
+
"@aztec/sequencer-client": "0.48.0",
|
|
59
|
+
"@aztec/simulator": "0.48.0",
|
|
60
|
+
"@aztec/telemetry-client": "0.48.0",
|
|
61
|
+
"@aztec/world-state": "0.48.0",
|
|
62
62
|
"source-map-support": "^0.5.21",
|
|
63
63
|
"tslib": "^2.4.0"
|
|
64
64
|
},
|
package/src/config.ts
CHANGED
|
@@ -1,9 +1,17 @@
|
|
|
1
|
-
import { type ArchiverConfig, getArchiverConfigFromEnv } from '@aztec/archiver';
|
|
2
|
-
import { type
|
|
3
|
-
import { type
|
|
4
|
-
import {
|
|
1
|
+
import { type ArchiverConfig, archiverConfigMappings, getArchiverConfigFromEnv } from '@aztec/archiver';
|
|
2
|
+
import { type ConfigMappingsType } from '@aztec/foundation/config';
|
|
3
|
+
import { type ProverClientConfig, getProverEnvVars, proverClientConfigMappings } from '@aztec/prover-client';
|
|
4
|
+
import {
|
|
5
|
+
type PublisherConfig,
|
|
6
|
+
type TxSenderConfig,
|
|
7
|
+
getPublisherConfigFromEnv,
|
|
8
|
+
getPublisherConfigMappings,
|
|
9
|
+
getTxSenderConfigFromEnv,
|
|
10
|
+
getTxSenderConfigMappings,
|
|
11
|
+
} from '@aztec/sequencer-client';
|
|
12
|
+
import { type WorldStateConfig, getWorldStateConfigFromEnv, worldStateConfigMappings } from '@aztec/world-state';
|
|
5
13
|
|
|
6
|
-
import { type TxProviderConfig, getTxProviderConfigFromEnv } from './tx-provider/config.js';
|
|
14
|
+
import { type TxProviderConfig, getTxProviderConfigFromEnv, txProviderConfigMappings } from './tx-provider/config.js';
|
|
7
15
|
|
|
8
16
|
export type ProverNodeConfig = ArchiverConfig &
|
|
9
17
|
ProverClientConfig &
|
|
@@ -12,14 +20,22 @@ export type ProverNodeConfig = ArchiverConfig &
|
|
|
12
20
|
TxSenderConfig &
|
|
13
21
|
TxProviderConfig;
|
|
14
22
|
|
|
23
|
+
export const proverNodeConfigMappings: ConfigMappingsType<ProverNodeConfig> = {
|
|
24
|
+
...archiverConfigMappings,
|
|
25
|
+
...proverClientConfigMappings,
|
|
26
|
+
...worldStateConfigMappings,
|
|
27
|
+
...getPublisherConfigMappings('PROVER'),
|
|
28
|
+
...getTxSenderConfigMappings('PROVER'),
|
|
29
|
+
...txProviderConfigMappings,
|
|
30
|
+
};
|
|
31
|
+
|
|
15
32
|
export function getProverNodeConfigFromEnv(): ProverNodeConfig {
|
|
16
|
-
const { PROOF_PUBLISH_RETRY_INTERVAL_MS } = process.env;
|
|
17
33
|
return {
|
|
18
34
|
...getArchiverConfigFromEnv(),
|
|
19
35
|
...getProverEnvVars(),
|
|
20
36
|
...getWorldStateConfigFromEnv(),
|
|
37
|
+
...getPublisherConfigFromEnv('PROVER'),
|
|
21
38
|
...getTxSenderConfigFromEnv('PROVER'),
|
|
22
39
|
...getTxProviderConfigFromEnv(),
|
|
23
|
-
l1PublishRetryIntervalMS: PROOF_PUBLISH_RETRY_INTERVAL_MS ? +PROOF_PUBLISH_RETRY_INTERVAL_MS : 1_000,
|
|
24
40
|
};
|
|
25
41
|
}
|
package/src/factory.ts
CHANGED
|
@@ -4,7 +4,7 @@ import { type DebugLogger, createDebugLogger } from '@aztec/foundation/log';
|
|
|
4
4
|
import { createStore } from '@aztec/kv-store/utils';
|
|
5
5
|
import { createProverClient } from '@aztec/prover-client';
|
|
6
6
|
import { getL1Publisher } from '@aztec/sequencer-client';
|
|
7
|
-
import {
|
|
7
|
+
import { createSimulationProvider } from '@aztec/simulator';
|
|
8
8
|
import { type TelemetryClient } from '@aztec/telemetry-client';
|
|
9
9
|
import { NoopTelemetryClient } from '@aztec/telemetry-client/noop';
|
|
10
10
|
import { createWorldStateSynchronizer } from '@aztec/world-state';
|
|
@@ -40,17 +40,24 @@ export async function createProverNode(
|
|
|
40
40
|
|
|
41
41
|
const simulationProvider = await createSimulationProvider(config, log);
|
|
42
42
|
|
|
43
|
-
const prover = await createProverClient(config,
|
|
43
|
+
const prover = await createProverClient(config, telemetry);
|
|
44
44
|
|
|
45
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);
|
|
46
|
+
const publisher = getL1Publisher(config, telemetry);
|
|
50
47
|
|
|
51
48
|
const txProvider = deps.aztecNodeTxProvider
|
|
52
49
|
? new AztecNodeTxProvider(deps.aztecNodeTxProvider)
|
|
53
50
|
: createTxProvider(config);
|
|
54
51
|
|
|
55
|
-
return new ProverNode(
|
|
52
|
+
return new ProverNode(
|
|
53
|
+
prover!,
|
|
54
|
+
publisher,
|
|
55
|
+
archiver,
|
|
56
|
+
archiver,
|
|
57
|
+
archiver,
|
|
58
|
+
worldStateSynchronizer,
|
|
59
|
+
txProvider,
|
|
60
|
+
simulationProvider,
|
|
61
|
+
telemetry,
|
|
62
|
+
);
|
|
56
63
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
type BlockProver,
|
|
3
3
|
EmptyTxValidator,
|
|
4
|
+
type L1ToL2MessageSource,
|
|
4
5
|
type L2Block,
|
|
5
6
|
type L2BlockSource,
|
|
6
7
|
PROVING_STATUS,
|
|
@@ -9,7 +10,6 @@ import {
|
|
|
9
10
|
type TxHash,
|
|
10
11
|
type TxProvider,
|
|
11
12
|
} from '@aztec/circuit-types';
|
|
12
|
-
import { type Fr } from '@aztec/circuits.js';
|
|
13
13
|
import { createDebugLogger } from '@aztec/foundation/log';
|
|
14
14
|
import { type L1Publisher } from '@aztec/sequencer-client';
|
|
15
15
|
import { type PublicProcessor, type PublicProcessorFactory } from '@aztec/simulator';
|
|
@@ -28,6 +28,7 @@ export class BlockProvingJob {
|
|
|
28
28
|
private publicProcessorFactory: PublicProcessorFactory,
|
|
29
29
|
private publisher: L1Publisher,
|
|
30
30
|
private l2BlockSource: L2BlockSource,
|
|
31
|
+
private l1ToL2MessageSource: L1ToL2MessageSource,
|
|
31
32
|
private txProvider: TxProvider,
|
|
32
33
|
) {}
|
|
33
34
|
|
|
@@ -41,60 +42,70 @@ export class BlockProvingJob {
|
|
|
41
42
|
}
|
|
42
43
|
|
|
43
44
|
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
45
|
this.state = 'processing';
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
46
|
+
try {
|
|
47
|
+
let historicalHeader = (await this.l2BlockSource.getBlock(fromBlock - 1))?.header;
|
|
48
|
+
for (let blockNumber = fromBlock; blockNumber <= toBlock; blockNumber++) {
|
|
49
|
+
const block = await this.getBlock(blockNumber);
|
|
50
|
+
const globalVariables = block.header.globalVariables;
|
|
51
|
+
const txHashes = block.body.txEffects.map(tx => tx.txHash);
|
|
52
|
+
const txCount = block.body.numberOfTxsIncludingPadded;
|
|
53
|
+
const l1ToL2Messages = await this.getL1ToL2Messages(block);
|
|
54
|
+
|
|
55
|
+
this.log.verbose(`Starting block processing`, {
|
|
56
|
+
number: block.number,
|
|
57
|
+
blockHash: block.hash().toString(),
|
|
58
|
+
lastArchive: block.header.lastArchive.root,
|
|
59
|
+
noteHashTreeRoot: block.header.state.partial.noteHashTree.root,
|
|
60
|
+
nullifierTreeRoot: block.header.state.partial.nullifierTree.root,
|
|
61
|
+
publicDataTreeRoot: block.header.state.partial.publicDataTree.root,
|
|
62
|
+
historicalHeader: historicalHeader?.hash(),
|
|
63
|
+
...globalVariables,
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
// When we move to proving epochs, this should change into a startNewEpoch and be lifted outside the loop.
|
|
67
|
+
const provingTicket = await this.prover.startNewBlock(txCount, globalVariables, l1ToL2Messages);
|
|
68
|
+
|
|
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
|
+
// This should be moved outside the loop to match the creation of the proving ticket when we move to epochs.
|
|
82
|
+
this.state = 'awaiting-prover';
|
|
83
|
+
const result = await provingTicket.provingPromise;
|
|
84
|
+
if (result.status === PROVING_STATUS.FAILURE) {
|
|
85
|
+
throw new Error(`Block proving failed: ${result.reason}`);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
historicalHeader = block.header;
|
|
84
89
|
}
|
|
85
90
|
|
|
86
|
-
|
|
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 });
|
|
91
|
+
const { block, aggregationObject, proof } = await this.prover.finaliseBlock();
|
|
92
|
+
this.log.info(`Finalised proof for block range`, { fromBlock, toBlock });
|
|
92
93
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
94
|
+
this.state = 'publishing-proof';
|
|
95
|
+
await this.publisher.submitProof(
|
|
96
|
+
block.header,
|
|
97
|
+
block.archive.root,
|
|
98
|
+
this.prover.getProverId(),
|
|
99
|
+
aggregationObject,
|
|
100
|
+
proof,
|
|
101
|
+
);
|
|
102
|
+
this.log.info(`Submitted proof for block range`, { fromBlock, toBlock });
|
|
96
103
|
|
|
97
|
-
|
|
104
|
+
this.state = 'completed';
|
|
105
|
+
} catch (err) {
|
|
106
|
+
this.log.error(`Error running block prover job: ${err}`);
|
|
107
|
+
this.state = 'failed';
|
|
108
|
+
}
|
|
98
109
|
}
|
|
99
110
|
|
|
100
111
|
private async getBlock(blockNumber: number): Promise<L2Block> {
|
|
@@ -116,6 +127,10 @@ export class BlockProvingJob {
|
|
|
116
127
|
return txs.map(([_, tx]) => tx!);
|
|
117
128
|
}
|
|
118
129
|
|
|
130
|
+
private getL1ToL2Messages(block: L2Block) {
|
|
131
|
+
return this.l1ToL2MessageSource.getL1ToL2Messages(BigInt(block.number));
|
|
132
|
+
}
|
|
133
|
+
|
|
119
134
|
private async processTxs(
|
|
120
135
|
publicProcessor: PublicProcessor,
|
|
121
136
|
txs: Tx[],
|
|
@@ -140,8 +155,8 @@ export class BlockProvingJob {
|
|
|
140
155
|
|
|
141
156
|
export type BlockProvingJobState =
|
|
142
157
|
| 'initialized'
|
|
143
|
-
| 'started'
|
|
144
158
|
| 'processing'
|
|
145
159
|
| 'awaiting-prover'
|
|
146
160
|
| 'publishing-proof'
|
|
147
|
-
| 'completed'
|
|
161
|
+
| 'completed'
|
|
162
|
+
| 'failed';
|
package/src/prover-node.ts
CHANGED
|
@@ -1,9 +1,12 @@
|
|
|
1
|
-
import { type L2BlockSource, type ProverClient, type TxProvider } from '@aztec/circuit-types';
|
|
1
|
+
import { type L1ToL2MessageSource, type L2BlockSource, type ProverClient, type TxProvider } from '@aztec/circuit-types';
|
|
2
2
|
import { createDebugLogger } from '@aztec/foundation/log';
|
|
3
3
|
import { RunningPromise } from '@aztec/foundation/running-promise';
|
|
4
4
|
import { type L1Publisher } from '@aztec/sequencer-client';
|
|
5
|
-
import { type
|
|
5
|
+
import { PublicProcessorFactory, type SimulationProvider } from '@aztec/simulator';
|
|
6
|
+
import { type TelemetryClient } from '@aztec/telemetry-client';
|
|
7
|
+
import { type WorldStateSynchronizer } from '@aztec/world-state';
|
|
6
8
|
|
|
9
|
+
import { type ContractDataSource } from '../../types/src/contracts/contract_data_source.js';
|
|
7
10
|
import { BlockProvingJob } from './job/block-proving-job.js';
|
|
8
11
|
|
|
9
12
|
/**
|
|
@@ -14,13 +17,18 @@ import { BlockProvingJob } from './job/block-proving-job.js';
|
|
|
14
17
|
export class ProverNode {
|
|
15
18
|
private log = createDebugLogger('aztec:prover-node');
|
|
16
19
|
private runningPromise: RunningPromise | undefined;
|
|
20
|
+
private latestBlockWeAreProving: number | undefined;
|
|
17
21
|
|
|
18
22
|
constructor(
|
|
19
23
|
private prover: ProverClient,
|
|
20
|
-
private publicProcessorFactory: PublicProcessorFactory,
|
|
21
24
|
private publisher: L1Publisher,
|
|
22
25
|
private l2BlockSource: L2BlockSource,
|
|
26
|
+
private l1ToL2MessageSource: L1ToL2MessageSource,
|
|
27
|
+
private contractDataSource: ContractDataSource,
|
|
28
|
+
private worldState: WorldStateSynchronizer,
|
|
23
29
|
private txProvider: TxProvider,
|
|
30
|
+
private simulator: SimulationProvider,
|
|
31
|
+
private telemetryClient: TelemetryClient,
|
|
24
32
|
private options: { pollingIntervalMs: number; disableAutomaticProving: boolean } = {
|
|
25
33
|
pollingIntervalMs: 1_000,
|
|
26
34
|
disableAutomaticProving: false,
|
|
@@ -47,12 +55,12 @@ export class ProverNode {
|
|
|
47
55
|
await this.l2BlockSource.stop();
|
|
48
56
|
this.publisher.interrupt();
|
|
49
57
|
this.log.info('Stopped ProverNode');
|
|
58
|
+
// TODO(palla/prover-node): Keep a reference to all ongoing ProvingJobs and stop them.
|
|
50
59
|
}
|
|
51
60
|
|
|
52
61
|
/**
|
|
53
62
|
* Single iteration of recurring work. This method is called periodically by the running promise.
|
|
54
63
|
* 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
64
|
*/
|
|
57
65
|
protected async work() {
|
|
58
66
|
if (this.options.disableAutomaticProving) {
|
|
@@ -64,29 +72,35 @@ export class ProverNode {
|
|
|
64
72
|
this.l2BlockSource.getProvenBlockNumber(),
|
|
65
73
|
]);
|
|
66
74
|
|
|
67
|
-
|
|
68
|
-
|
|
75
|
+
// Consider both the latest block we are proving and the last block proven on the chain
|
|
76
|
+
const latestBlockBeingProven = this.latestBlockWeAreProving ?? 0;
|
|
77
|
+
const latestProven = Math.max(latestBlockBeingProven, latestProvenBlockNumber);
|
|
78
|
+
if (latestProven >= latestBlockNumber) {
|
|
79
|
+
this.log.debug(`No new blocks to prove`, { latestBlockNumber, latestProvenBlockNumber, latestBlockBeingProven });
|
|
69
80
|
return;
|
|
70
81
|
}
|
|
71
82
|
|
|
72
|
-
const fromBlock =
|
|
83
|
+
const fromBlock = latestProven + 1;
|
|
73
84
|
const toBlock = fromBlock; // We only prove one block at a time for now
|
|
74
|
-
|
|
85
|
+
|
|
86
|
+
await this.startProof(fromBlock, toBlock);
|
|
87
|
+
this.latestBlockWeAreProving = toBlock;
|
|
75
88
|
}
|
|
76
89
|
|
|
77
90
|
/**
|
|
78
91
|
* Creates a proof for a block range. Returns once the proof has been submitted to L1.
|
|
79
92
|
*/
|
|
80
|
-
public prove(fromBlock: number, toBlock: number) {
|
|
81
|
-
|
|
93
|
+
public async prove(fromBlock: number, toBlock: number) {
|
|
94
|
+
const job = await this.createProvingJob(fromBlock);
|
|
95
|
+
return job.run(fromBlock, toBlock);
|
|
82
96
|
}
|
|
83
97
|
|
|
84
98
|
/**
|
|
85
99
|
* Starts a proving process and returns immediately.
|
|
86
100
|
*/
|
|
87
|
-
public startProof(fromBlock: number, toBlock: number) {
|
|
88
|
-
|
|
89
|
-
|
|
101
|
+
public async startProof(fromBlock: number, toBlock: number) {
|
|
102
|
+
const job = await this.createProvingJob(fromBlock);
|
|
103
|
+
void job.run(fromBlock, toBlock);
|
|
90
104
|
}
|
|
91
105
|
|
|
92
106
|
/**
|
|
@@ -96,12 +110,28 @@ export class ProverNode {
|
|
|
96
110
|
return this.prover;
|
|
97
111
|
}
|
|
98
112
|
|
|
99
|
-
private createProvingJob() {
|
|
113
|
+
private async createProvingJob(fromBlock: number) {
|
|
114
|
+
if ((await this.worldState.status()).syncedToL2Block >= fromBlock) {
|
|
115
|
+
throw new Error(`Cannot create proving job for block ${fromBlock} as it is behind the current world state`);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// Fast forward world state to right before the target block and get a fork
|
|
119
|
+
const db = await this.worldState.syncImmediateAndFork(fromBlock - 1, true);
|
|
120
|
+
|
|
121
|
+
// Create a processor using the forked world state
|
|
122
|
+
const publicProcessorFactory = new PublicProcessorFactory(
|
|
123
|
+
db,
|
|
124
|
+
this.contractDataSource,
|
|
125
|
+
this.simulator,
|
|
126
|
+
this.telemetryClient,
|
|
127
|
+
);
|
|
128
|
+
|
|
100
129
|
return new BlockProvingJob(
|
|
101
|
-
this.prover,
|
|
102
|
-
|
|
130
|
+
this.prover.createBlockProver(db),
|
|
131
|
+
publicProcessorFactory,
|
|
103
132
|
this.publisher,
|
|
104
133
|
this.l2BlockSource,
|
|
134
|
+
this.l1ToL2MessageSource,
|
|
105
135
|
this.txProvider,
|
|
106
136
|
);
|
|
107
137
|
}
|
|
@@ -1,9 +1,17 @@
|
|
|
1
|
+
import { type ConfigMappingsType, getConfigFromMappings } from '@aztec/foundation/config';
|
|
2
|
+
|
|
1
3
|
export type TxProviderConfig = {
|
|
2
4
|
txProviderNodeUrl: string | undefined;
|
|
3
5
|
};
|
|
4
6
|
|
|
7
|
+
export const txProviderConfigMappings: ConfigMappingsType<TxProviderConfig> = {
|
|
8
|
+
txProviderNodeUrl: {
|
|
9
|
+
env: 'TX_PROVIDER_NODE_URL',
|
|
10
|
+
description: 'The URL of the tx provider node',
|
|
11
|
+
parseEnv: (val: string) => val,
|
|
12
|
+
},
|
|
13
|
+
};
|
|
14
|
+
|
|
5
15
|
export function getTxProviderConfigFromEnv(): TxProviderConfig {
|
|
6
|
-
return
|
|
7
|
-
txProviderNodeUrl: process.env.TX_PROVIDER_NODE_URL ?? process.env.AZTEC_NODE_URL,
|
|
8
|
-
};
|
|
16
|
+
return getConfigFromMappings<TxProviderConfig>(txProviderConfigMappings);
|
|
9
17
|
}
|