@aztec/prover-node 0.47.1 → 0.49.2

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 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
@@ -1 +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"}
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQXVCLHdCQUF3QixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDaEYsT0FBTyxFQUEyQixnQkFBZ0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2pGLE9BQU8sRUFBNkMsd0JBQXdCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUM5RyxPQUFPLEVBQXlCLDBCQUEwQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFdkYsT0FBTyxFQUF5QiwwQkFBMEIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBUzVGLE1BQU0sVUFBVSwwQkFBMEI7SUFDeEMsTUFBTSxFQUFFLCtCQUErQixFQUFFLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQztJQUN4RCxPQUFPO1FBQ0wsR0FBRyx3QkFBd0IsRUFBRTtRQUM3QixHQUFHLGdCQUFnQixFQUFFO1FBQ3JCLEdBQUcsMEJBQTBCLEVBQUU7UUFDL0IsR0FBRyx3QkFBd0IsQ0FBQyxRQUFRLENBQUM7UUFDckMsR0FBRywwQkFBMEIsRUFBRTtRQUMvQix3QkFBd0IsRUFBRSwrQkFBK0IsQ0FBQyxDQUFDLENBQUMsQ0FBQywrQkFBK0IsQ0FBQyxDQUFDLENBQUMsSUFBSztLQUNyRyxDQUFDO0FBQ0osQ0FBQyJ9
24
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQXVCLHNCQUFzQixFQUFFLHdCQUF3QixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFeEcsT0FBTyxFQUEyQixnQkFBZ0IsRUFBRSwwQkFBMEIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzdHLE9BQU8sRUFHTCx5QkFBeUIsRUFDekIsMEJBQTBCLEVBQzFCLHdCQUF3QixFQUN4Qix5QkFBeUIsR0FDMUIsTUFBTSx5QkFBeUIsQ0FBQztBQUNqQyxPQUFPLEVBQXlCLDBCQUEwQixFQUFFLHdCQUF3QixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFakgsT0FBTyxFQUF5QiwwQkFBMEIsRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBU3RILE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUF5QztJQUM1RSxHQUFHLHNCQUFzQjtJQUN6QixHQUFHLDBCQUEwQjtJQUM3QixHQUFHLHdCQUF3QjtJQUMzQixHQUFHLDBCQUEwQixDQUFDLFFBQVEsQ0FBQztJQUN2QyxHQUFHLHlCQUF5QixDQUFDLFFBQVEsQ0FBQztJQUN0QyxHQUFHLHdCQUF3QjtDQUM1QixDQUFDO0FBRUYsTUFBTSxVQUFVLDBCQUEwQjtJQUN4QyxPQUFPO1FBQ0wsR0FBRyx3QkFBd0IsRUFBRTtRQUM3QixHQUFHLGdCQUFnQixFQUFFO1FBQ3JCLEdBQUcsMEJBQTBCLEVBQUU7UUFDL0IsR0FBRyx5QkFBeUIsQ0FBQyxRQUFRLENBQUM7UUFDdEMsR0FBRyx3QkFBd0IsQ0FBQyxRQUFRLENBQUM7UUFDckMsR0FBRywwQkFBMEIsRUFBRTtLQUNoQyxDQUFDO0FBQ0osQ0FBQyJ9
@@ -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,uBA8BP"}
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 { PublicProcessorFactory, createSimulationProvider } from '@aztec/simulator';
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, worldStateSynchronizer, archiver);
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, publicProcessorFactory, publisher, archiver, archiver, txProvider);
30
+ return new ProverNode(prover, publisher, archiver, archiver, archiver, worldStateSynchronizer, txProvider, simulationProvider, telemetry);
33
31
  }
34
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFjdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9mYWN0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBaUIsY0FBYyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFaEUsT0FBTyxFQUFvQixpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzVFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUMxRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLHdCQUF3QixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFcEYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbkUsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFHbEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQzlFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRTVELGdEQUFnRDtBQUNoRCxNQUFNLENBQUMsS0FBSyxVQUFVLGdCQUFnQixDQUNwQyxNQUF3QixFQUN4QixPQU1JLEVBQUU7SUFFTixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksbUJBQW1CLEVBQUUsQ0FBQztJQUM5RCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxJQUFJLGlCQUFpQixDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQzFELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLElBQUksaUJBQWlCLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUV6RSxNQUFNLEtBQUssR0FBRyxNQUFNLFdBQVcsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLFdBQVcsQ0FBQyxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFFcEYsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLE1BQU0sY0FBYyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLEVBQUUsY0FBYyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM3RyxHQUFHLENBQUMsT0FBTyxDQUFDLHdDQUF3QyxNQUFNLFFBQVEsQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFFdkYsTUFBTSxnQkFBZ0IsR0FBRyxFQUFFLEdBQUcsTUFBTSxFQUFFLDBCQUEwQixFQUFFLElBQUksRUFBRSxDQUFDO0lBQ3pFLE1BQU0sc0JBQXNCLEdBQUcsTUFBTSw0QkFBNEIsQ0FBQyxnQkFBZ0IsRUFBRSxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDckcsTUFBTSxzQkFBc0IsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUVyQyxNQUFNLGtCQUFrQixHQUFHLE1BQU0sd0JBQXdCLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBRXZFLE1BQU0sTUFBTSxHQUFHLE1BQU0sa0JBQWtCLENBQUMsTUFBTSxFQUFFLHNCQUFzQixFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBRWxGLG1GQUFtRjtJQUNuRixNQUFNLFNBQVMsR0FBRyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFekMsTUFBTSxnQkFBZ0IsR0FBRyxzQkFBc0IsQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUM1RCxNQUFNLHNCQUFzQixHQUFHLElBQUksc0JBQXNCLENBQUMsZ0JBQWdCLEVBQUUsUUFBUSxFQUFFLGtCQUFrQixFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBRXJILE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxtQkFBbUI7UUFDekMsQ0FBQyxDQUFDLElBQUksbUJBQW1CLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDO1FBQ25ELENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUU3QixPQUFPLElBQUksVUFBVSxDQUFDLE1BQU8sRUFBRSxzQkFBc0IsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQztBQUNwRyxDQUFDIn0=
32
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFjdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9mYWN0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBaUIsY0FBYyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFaEUsT0FBTyxFQUFvQixpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzVFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUMxRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFNUQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbkUsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFHbEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQzlFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRTVELGdEQUFnRDtBQUNoRCxNQUFNLENBQUMsS0FBSyxVQUFVLGdCQUFnQixDQUNwQyxNQUF3QixFQUN4QixPQU1JLEVBQUU7SUFFTixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksbUJBQW1CLEVBQUUsQ0FBQztJQUM5RCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxJQUFJLGlCQUFpQixDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQzFELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLElBQUksaUJBQWlCLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUV6RSxNQUFNLEtBQUssR0FBRyxNQUFNLFdBQVcsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLFdBQVcsQ0FBQyxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFFcEYsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLE1BQU0sY0FBYyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLEVBQUUsY0FBYyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM3RyxHQUFHLENBQUMsT0FBTyxDQUFDLHdDQUF3QyxNQUFNLFFBQVEsQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFFdkYsTUFBTSxnQkFBZ0IsR0FBRyxFQUFFLEdBQUcsTUFBTSxFQUFFLDBCQUEwQixFQUFFLElBQUksRUFBRSxDQUFDO0lBQ3pFLE1BQU0sc0JBQXNCLEdBQUcsTUFBTSw0QkFBNEIsQ0FBQyxnQkFBZ0IsRUFBRSxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDckcsTUFBTSxzQkFBc0IsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUVyQyxNQUFNLGtCQUFrQixHQUFHLE1BQU0sd0JBQXdCLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBRXZFLE1BQU0sTUFBTSxHQUFHLE1BQU0sa0JBQWtCLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBRTNELG1GQUFtRjtJQUNuRixNQUFNLFNBQVMsR0FBRyxjQUFjLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBRXBELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxtQkFBbUI7UUFDekMsQ0FBQyxDQUFDLElBQUksbUJBQW1CLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDO1FBQ25ELENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUU3QixPQUFPLElBQUksVUFBVSxDQUNuQixNQUFPLEVBQ1AsU0FBUyxFQUNULFFBQVEsRUFDUixRQUFRLEVBQ1IsUUFBUSxFQUNSLHNCQUFzQixFQUN0QixVQUFVLEVBQ1Ysa0JBQWtCLEVBQ2xCLFNBQVMsQ0FDVixDQUFDO0FBQ0osQ0FBQyJ9
@@ -13,9 +13,10 @@ export declare class BlockProvingJob {
13
13
  private l2BlockSource;
14
14
  private l1ToL2MessageSource;
15
15
  private txProvider;
16
+ private cleanUp;
16
17
  private state;
17
18
  private log;
18
- constructor(prover: BlockProver, publicProcessorFactory: PublicProcessorFactory, publisher: L1Publisher, l2BlockSource: L2BlockSource, l1ToL2MessageSource: L1ToL2MessageSource, txProvider: TxProvider);
19
+ constructor(prover: BlockProver, publicProcessorFactory: PublicProcessorFactory, publisher: L1Publisher, l2BlockSource: L2BlockSource, l1ToL2MessageSource: L1ToL2MessageSource, txProvider: TxProvider, cleanUp?: () => Promise<void>);
19
20
  getState(): BlockProvingJobState;
20
21
  run(fromBlock: number, toBlock: number): Promise<void>;
21
22
  private getBlock;
@@ -23,5 +24,5 @@ export declare class BlockProvingJob {
23
24
  private getL1ToL2Messages;
24
25
  private processTxs;
25
26
  }
26
- export type BlockProvingJobState = 'initialized' | 'started' | 'processing' | 'awaiting-prover' | 'publishing-proof' | 'completed';
27
+ export type BlockProvingJobState = 'initialized' | 'processing' | 'awaiting-prover' | 'publishing-proof' | 'completed' | 'failed';
27
28
  //# 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,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;YA8DrC,QAAQ;YAQR,MAAM;IAWpB,OAAO,CAAC,iBAAiB;YAIX,UAAU;CAoBzB;AAED,MAAM,MAAM,oBAAoB,GAC5B,aAAa,GACb,SAAS,GACT,YAAY,GACZ,iBAAiB,GACjB,kBAAkB,GAClB,WAAW,CAAC"}
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;IAClB,OAAO,CAAC,OAAO;IAVjB,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,EACtB,OAAO,GAAE,MAAM,OAAO,CAAC,IAAI,CAA2B;IAGzD,QAAQ,IAAI,oBAAoB;IAI1B,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;YA0ErC,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,13 +6,14 @@ 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, l1ToL2MessageSource, txProvider) {
9
+ constructor(prover, publicProcessorFactory, publisher, l2BlockSource, l1ToL2MessageSource, txProvider, cleanUp = () => Promise.resolve()) {
10
10
  this.prover = prover;
11
11
  this.publicProcessorFactory = publicProcessorFactory;
12
12
  this.publisher = publisher;
13
13
  this.l2BlockSource = l2BlockSource;
14
14
  this.l1ToL2MessageSource = l1ToL2MessageSource;
15
15
  this.txProvider = txProvider;
16
+ this.cleanUp = cleanUp;
16
17
  this.state = 'initialized';
17
18
  this.log = createDebugLogger('aztec:block-proving-job');
18
19
  }
@@ -24,48 +25,57 @@ export class BlockProvingJob {
24
25
  throw new Error(`Block ranges are not yet supported`);
25
26
  }
26
27
  this.log.info(`Starting block proving job`, { fromBlock, toBlock });
27
- this.state = 'started';
28
- // TODO: Fast-forward world state to fromBlock and/or await fromBlock to be published to the unproven chain
29
28
  this.state = 'processing';
30
- let historicalHeader = (await this.l2BlockSource.getBlock(fromBlock - 1))?.header;
31
- for (let blockNumber = fromBlock; blockNumber <= toBlock; blockNumber++) {
32
- const block = await this.getBlock(blockNumber);
33
- const globalVariables = block.header.globalVariables;
34
- const txHashes = block.body.txEffects.map(tx => tx.txHash);
35
- const txCount = block.body.numberOfTxsIncludingPadded;
36
- const l1ToL2Messages = await this.getL1ToL2Messages(block);
37
- this.log.verbose(`Starting block processing`, {
38
- number: block.number,
39
- blockHash: block.hash().toString(),
40
- lastArchive: block.header.lastArchive.root,
41
- noteHashTreeRoot: block.header.state.partial.noteHashTree.root,
42
- nullifierTreeRoot: block.header.state.partial.nullifierTree.root,
43
- publicDataTreeRoot: block.header.state.partial.publicDataTree.root,
44
- historicalHeader: historicalHeader?.hash(),
45
- ...globalVariables,
46
- });
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
- const result = await provingTicket.provingPromise;
57
- if (result.status === PROVING_STATUS.FAILURE) {
58
- throw new Error(`Block proving failed: ${result.reason}`);
29
+ try {
30
+ let historicalHeader = (await this.l2BlockSource.getBlock(fromBlock - 1))?.header;
31
+ for (let blockNumber = fromBlock; blockNumber <= toBlock; blockNumber++) {
32
+ const block = await this.getBlock(blockNumber);
33
+ const globalVariables = block.header.globalVariables;
34
+ const txHashes = block.body.txEffects.map(tx => tx.txHash);
35
+ const txCount = block.body.numberOfTxsIncludingPadded;
36
+ const l1ToL2Messages = await this.getL1ToL2Messages(block);
37
+ this.log.verbose(`Starting block processing`, {
38
+ number: block.number,
39
+ blockHash: block.hash().toString(),
40
+ lastArchive: block.header.lastArchive.root,
41
+ noteHashTreeRoot: block.header.state.partial.noteHashTree.root,
42
+ nullifierTreeRoot: block.header.state.partial.nullifierTree.root,
43
+ publicDataTreeRoot: block.header.state.partial.publicDataTree.root,
44
+ historicalHeader: historicalHeader?.hash(),
45
+ ...globalVariables,
46
+ });
47
+ // When we move to proving epochs, this should change into a startNewEpoch and be lifted outside the loop.
48
+ const provingTicket = await this.prover.startNewBlock(txCount, globalVariables, l1ToL2Messages);
49
+ const publicProcessor = this.publicProcessorFactory.create(historicalHeader, globalVariables);
50
+ const txs = await this.getTxs(txHashes);
51
+ await this.processTxs(publicProcessor, txs, txCount);
52
+ this.log.verbose(`Processed all txs for block`, {
53
+ blockNumber: block.number,
54
+ blockHash: block.hash().toString(),
55
+ });
56
+ await this.prover.setBlockCompleted();
57
+ // This should be moved outside the loop to match the creation of the proving ticket when we move to epochs.
58
+ this.state = 'awaiting-prover';
59
+ const result = await provingTicket.provingPromise;
60
+ if (result.status === PROVING_STATUS.FAILURE) {
61
+ throw new Error(`Block proving failed: ${result.reason}`);
62
+ }
63
+ historicalHeader = block.header;
59
64
  }
60
- historicalHeader = block.header;
65
+ const { block, aggregationObject, proof } = await this.prover.finaliseBlock();
66
+ this.log.info(`Finalised proof for block range`, { fromBlock, toBlock });
67
+ this.state = 'publishing-proof';
68
+ await this.publisher.submitProof(block.header, block.archive.root, this.prover.getProverId(), aggregationObject, proof);
69
+ this.log.info(`Submitted proof for block range`, { fromBlock, toBlock });
70
+ this.state = 'completed';
71
+ }
72
+ catch (err) {
73
+ this.log.error(`Error running block prover job: ${err}`);
74
+ this.state = 'failed';
75
+ }
76
+ finally {
77
+ await this.cleanUp();
61
78
  }
62
- this.state = 'awaiting-prover';
63
- const { block, aggregationObject, proof } = await this.prover.finaliseBlock();
64
- this.log.info(`Finalised proof for block range`, { fromBlock, toBlock });
65
- this.state = 'publishing-proof';
66
- await this.publisher.submitProof(block.header, block.archive.root, aggregationObject, proof);
67
- this.log.info(`Submitted proof for block range`, { fromBlock, toBlock });
68
- this.state = 'completed';
69
79
  }
70
80
  async getBlock(blockNumber) {
71
81
  const block = await this.l2BlockSource.getBlock(blockNumber);
@@ -93,4 +103,4 @@ export class BlockProvingJob {
93
103
  return processedTxs;
94
104
  }
95
105
  }
96
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmxvY2stcHJvdmluZy1qb2IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvam9iL2Jsb2NrLXByb3Zpbmctam9iLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxnQkFBZ0IsRUFJaEIsY0FBYyxHQUtmLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFJMUQ7Ozs7R0FJRztBQUNILE1BQU0sT0FBTyxlQUFlO0lBSTFCLFlBQ1UsTUFBbUIsRUFDbkIsc0JBQThDLEVBQzlDLFNBQXNCLEVBQ3RCLGFBQTRCLEVBQzVCLG1CQUF3QyxFQUN4QyxVQUFzQjtRQUx0QixXQUFNLEdBQU4sTUFBTSxDQUFhO1FBQ25CLDJCQUFzQixHQUF0QixzQkFBc0IsQ0FBd0I7UUFDOUMsY0FBUyxHQUFULFNBQVMsQ0FBYTtRQUN0QixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUM1Qix3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXFCO1FBQ3hDLGVBQVUsR0FBVixVQUFVLENBQVk7UUFUeEIsVUFBSyxHQUF5QixhQUFhLENBQUM7UUFDNUMsUUFBRyxHQUFHLGlCQUFpQixDQUFDLHlCQUF5QixDQUFDLENBQUM7SUFTeEQsQ0FBQztJQUVHLFFBQVE7UUFDYixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDcEIsQ0FBQztJQUVNLEtBQUssQ0FBQyxHQUFHLENBQUMsU0FBaUIsRUFBRSxPQUFlO1FBQ2pELElBQUksU0FBUyxLQUFLLE9BQU8sRUFBRSxDQUFDO1lBQzFCLE1BQU0sSUFBSSxLQUFLLENBQUMsb0NBQW9DLENBQUMsQ0FBQztRQUN4RCxDQUFDO1FBRUQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsNEJBQTRCLEVBQUUsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUNwRSxJQUFJLENBQUMsS0FBSyxHQUFHLFNBQVMsQ0FBQztRQUV2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
106
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmxvY2stcHJvdmluZy1qb2IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvam9iL2Jsb2NrLXByb3Zpbmctam9iLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxnQkFBZ0IsRUFJaEIsY0FBYyxHQUtmLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFJMUQ7Ozs7R0FJRztBQUNILE1BQU0sT0FBTyxlQUFlO0lBSTFCLFlBQ1UsTUFBbUIsRUFDbkIsc0JBQThDLEVBQzlDLFNBQXNCLEVBQ3RCLGFBQTRCLEVBQzVCLG1CQUF3QyxFQUN4QyxVQUFzQixFQUN0QixVQUErQixHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFO1FBTnRELFdBQU0sR0FBTixNQUFNLENBQWE7UUFDbkIsMkJBQXNCLEdBQXRCLHNCQUFzQixDQUF3QjtRQUM5QyxjQUFTLEdBQVQsU0FBUyxDQUFhO1FBQ3RCLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzVCLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBcUI7UUFDeEMsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUN0QixZQUFPLEdBQVAsT0FBTyxDQUErQztRQVZ4RCxVQUFLLEdBQXlCLGFBQWEsQ0FBQztRQUM1QyxRQUFHLEdBQUcsaUJBQWlCLENBQUMseUJBQXlCLENBQUMsQ0FBQztJQVV4RCxDQUFDO0lBRUcsUUFBUTtRQUNiLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztJQUNwQixDQUFDO0lBRU0sS0FBSyxDQUFDLEdBQUcsQ0FBQyxTQUFpQixFQUFFLE9BQWU7UUFDakQsSUFBSSxTQUFTLEtBQUssT0FBTyxFQUFFLENBQUM7WUFDMUIsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDO1FBQ3hELENBQUM7UUFFRCxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxF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
@@ -1,6 +1,9 @@
1
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 PublicProcessorFactory } from '@aztec/simulator';
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,15 +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;
14
16
  private l1ToL2MessageSource;
17
+ private contractDataSource;
18
+ private worldState;
15
19
  private txProvider;
20
+ private simulator;
21
+ private telemetryClient;
16
22
  private options;
17
23
  private log;
18
24
  private runningPromise;
19
- constructor(prover: ProverClient, publicProcessorFactory: PublicProcessorFactory, publisher: L1Publisher, l2BlockSource: L2BlockSource, l1ToL2MessageSource: L1ToL2MessageSource, txProvider: TxProvider, options?: {
25
+ private latestBlockWeAreProving;
26
+ constructor(prover: ProverClient, publisher: L1Publisher, l2BlockSource: L2BlockSource, l1ToL2MessageSource: L1ToL2MessageSource, contractDataSource: ContractDataSource, worldState: WorldStateSynchronizer, txProvider: TxProvider, simulator: SimulationProvider, telemetryClient: TelemetryClient, options?: {
20
27
  pollingIntervalMs: number;
21
28
  disableAutomaticProving: boolean;
22
29
  });
@@ -32,7 +39,6 @@ export declare class ProverNode {
32
39
  /**
33
40
  * Single iteration of recurring work. This method is called periodically by the running promise.
34
41
  * Checks whether there are new blocks to prove, proves them, and submits them.
35
- * Only proves one block per job and one job at a time (for now).
36
42
  */
37
43
  protected work(): Promise<void>;
38
44
  /**
@@ -1 +1 @@
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,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,mBAAmB;IAC3B,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,OAAO;IAVjB,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,mBAAmB,EAAE,mBAAmB,EACxC,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;CAUzB"}
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;IAiCpB;;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;CA0B/B"}
@@ -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,16 +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, publicProcessorFactory, publisher, l2BlockSource, l1ToL2MessageSource, txProvider, options = {
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
18
  this.l1ToL2MessageSource = l1ToL2MessageSource;
19
+ this.contractDataSource = contractDataSource;
20
+ this.worldState = worldState;
19
21
  this.txProvider = txProvider;
22
+ this.simulator = simulator;
23
+ this.telemetryClient = telemetryClient;
20
24
  this.options = options;
21
25
  this.log = createDebugLogger('aztec:prover-node');
22
26
  }
@@ -39,40 +43,54 @@ export class ProverNode {
39
43
  await this.l2BlockSource.stop();
40
44
  this.publisher.interrupt();
41
45
  this.log.info('Stopped ProverNode');
46
+ // TODO(palla/prover-node): Keep a reference to all ongoing ProvingJobs and stop them.
42
47
  }
43
48
  /**
44
49
  * Single iteration of recurring work. This method is called periodically by the running promise.
45
50
  * Checks whether there are new blocks to prove, proves them, and submits them.
46
- * Only proves one block per job and one job at a time (for now).
47
51
  */
48
52
  async work() {
49
- if (this.options.disableAutomaticProving) {
50
- return;
53
+ try {
54
+ if (this.options.disableAutomaticProving) {
55
+ return;
56
+ }
57
+ const [latestBlockNumber, latestProvenBlockNumber] = await Promise.all([
58
+ this.l2BlockSource.getBlockNumber(),
59
+ this.l2BlockSource.getProvenBlockNumber(),
60
+ ]);
61
+ // Consider both the latest block we are proving and the last block proven on the chain
62
+ const latestBlockBeingProven = this.latestBlockWeAreProving ?? 0;
63
+ const latestProven = Math.max(latestBlockBeingProven, latestProvenBlockNumber);
64
+ if (latestProven >= latestBlockNumber) {
65
+ this.log.debug(`No new blocks to prove`, {
66
+ latestBlockNumber,
67
+ latestProvenBlockNumber,
68
+ latestBlockBeingProven,
69
+ });
70
+ return;
71
+ }
72
+ const fromBlock = latestProven + 1;
73
+ const toBlock = fromBlock; // We only prove one block at a time for now
74
+ await this.startProof(fromBlock, toBlock);
75
+ this.latestBlockWeAreProving = toBlock;
51
76
  }
52
- const [latestBlockNumber, latestProvenBlockNumber] = await Promise.all([
53
- this.l2BlockSource.getBlockNumber(),
54
- this.l2BlockSource.getProvenBlockNumber(),
55
- ]);
56
- if (latestProvenBlockNumber >= latestBlockNumber) {
57
- this.log.debug(`No new blocks to prove`, { latestBlockNumber, latestProvenBlockNumber });
58
- return;
77
+ catch (err) {
78
+ this.log.error(`Error in prover node work`, err);
59
79
  }
60
- const fromBlock = latestProvenBlockNumber + 1;
61
- const toBlock = fromBlock; // We only prove one block at a time for now
62
- await this.prove(fromBlock, toBlock);
63
80
  }
64
81
  /**
65
82
  * Creates a proof for a block range. Returns once the proof has been submitted to L1.
66
83
  */
67
- prove(fromBlock, toBlock) {
68
- return this.createProvingJob().run(fromBlock, toBlock);
84
+ async prove(fromBlock, toBlock) {
85
+ const job = await this.createProvingJob(fromBlock);
86
+ return job.run(fromBlock, toBlock);
69
87
  }
70
88
  /**
71
89
  * Starts a proving process and returns immediately.
72
90
  */
73
- startProof(fromBlock, toBlock) {
74
- void this.createProvingJob().run(fromBlock, toBlock);
75
- return Promise.resolve();
91
+ async startProof(fromBlock, toBlock) {
92
+ const job = await this.createProvingJob(fromBlock);
93
+ void job.run(fromBlock, toBlock);
76
94
  }
77
95
  /**
78
96
  * Returns the prover instance.
@@ -80,8 +98,15 @@ export class ProverNode {
80
98
  getProver() {
81
99
  return this.prover;
82
100
  }
83
- createProvingJob() {
84
- return new BlockProvingJob(this.prover, this.publicProcessorFactory, this.publisher, this.l2BlockSource, this.l1ToL2MessageSource, this.txProvider);
101
+ async createProvingJob(fromBlock) {
102
+ if ((await this.worldState.status()).syncedToL2Block >= fromBlock) {
103
+ throw new Error(`Cannot create proving job for block ${fromBlock} as it is behind the current world state`);
104
+ }
105
+ // Fast forward world state to right before the target block and get a fork
106
+ const db = await this.worldState.syncImmediateAndFork(fromBlock - 1, true);
107
+ // Create a processor using the forked world state
108
+ const publicProcessorFactory = new PublicProcessorFactory(db, this.contractDataSource, this.simulator, this.telemetryClient);
109
+ return new BlockProvingJob(this.prover.createBlockProver(db), publicProcessorFactory, this.publisher, this.l2BlockSource, this.l1ToL2MessageSource, this.txProvider, () => db.delete());
85
110
  }
86
111
  }
87
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmVyLW5vZGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcHJvdmVyLW5vZGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBSW5FLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUU3RDs7OztHQUlHO0FBQ0gsTUFBTSxPQUFPLFVBQVU7SUFJckIsWUFDVSxNQUFvQixFQUNwQixzQkFBOEMsRUFDOUMsU0FBc0IsRUFDdEIsYUFBNEIsRUFDNUIsbUJBQXdDLEVBQ3hDLFVBQXNCLEVBQ3RCLFVBQTJFO1FBQ2pGLGlCQUFpQixFQUFFLElBQUs7UUFDeEIsdUJBQXVCLEVBQUUsS0FBSztLQUMvQjtRQVRPLFdBQU0sR0FBTixNQUFNLENBQWM7UUFDcEIsMkJBQXNCLEdBQXRCLHNCQUFzQixDQUF3QjtRQUM5QyxjQUFTLEdBQVQsU0FBUyxDQUFhO1FBQ3RCLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzVCLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBcUI7UUFDeEMsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUN0QixZQUFPLEdBQVAsT0FBTyxDQUdkO1FBYkssUUFBRyxHQUFHLGlCQUFpQixDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFjbEQsQ0FBQztJQUVKOzs7T0FHRztJQUNILEtBQUs7UUFDSCxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUMvRixJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLElBQUk7UUFDUixJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQ3JDLE1BQU0sSUFBSSxDQUFDLGNBQWMsRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUNsQyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDekIsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDM0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNPLEtBQUssQ0FBQyxJQUFJO1FBQ2xCLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1lBQ3pDLE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxDQUFDLGlCQUFpQixFQUFFLHVCQUF1QixDQUFDLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDO1lBQ3JFLElBQUksQ0FBQyxhQUFhLENBQUMsY0FBYyxFQUFFO1lBQ25DLElBQUksQ0FBQyxhQUFhLENBQUMsb0JBQW9CLEVBQUU7U0FDMUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSx1QkFBdUIsSUFBSSxpQkFBaUIsRUFBRSxDQUFDO1lBQ2pELElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLHdCQUF3QixFQUFFLEVBQUUsaUJBQWlCLEVBQUUsdUJBQXVCLEVBQUUsQ0FBQyxDQUFDO1lBQ3pGLE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxTQUFTLEdBQUcsdUJBQXVCLEdBQUcsQ0FBQyxDQUFDO1FBQzlDLE1BQU0sT0FBTyxHQUFHLFNBQVMsQ0FBQyxDQUFDLDRDQUE0QztRQUN2RSxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxTQUFpQixFQUFFLE9BQWU7UUFDN0MsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFRDs7T0FFRztJQUNJLFVBQVUsQ0FBQyxTQUFpQixFQUFFLE9BQWU7UUFDbEQsS0FBSyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3JELE9BQU8sT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRDs7T0FFRztJQUNJLFNBQVM7UUFDZCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDckIsQ0FBQztJQUVPLGdCQUFnQjtRQUN0QixPQUFPLElBQUksZUFBZSxDQUN4QixJQUFJLENBQUMsTUFBTSxFQUNYLElBQUksQ0FBQyxzQkFBc0IsRUFDM0IsSUFBSSxDQUFDLFNBQVMsRUFDZCxJQUFJLENBQUMsYUFBYSxFQUNsQixJQUFJLENBQUMsbUJBQW1CLEVBQ3hCLElBQUksQ0FBQyxVQUFVLENBQ2hCLENBQUM7SUFDSixDQUFDO0NBQ0YifQ==
112
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmVyLW5vZGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcHJvdmVyLW5vZGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBRW5FLE9BQU8sRUFBRSxzQkFBc0IsRUFBMkIsTUFBTSxrQkFBa0IsQ0FBQztBQUtuRixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFN0Q7Ozs7R0FJRztBQUNILE1BQU0sT0FBTyxVQUFVO0lBS3JCLFlBQ1UsTUFBb0IsRUFDcEIsU0FBc0IsRUFDdEIsYUFBNEIsRUFDNUIsbUJBQXdDLEVBQ3hDLGtCQUFzQyxFQUN0QyxVQUFrQyxFQUNsQyxVQUFzQixFQUN0QixTQUE2QixFQUM3QixlQUFnQyxFQUNoQyxVQUEyRTtRQUNqRixpQkFBaUIsRUFBRSxJQUFLO1FBQ3hCLHVCQUF1QixFQUFFLEtBQUs7S0FDL0I7UUFaTyxXQUFNLEdBQU4sTUFBTSxDQUFjO1FBQ3BCLGNBQVMsR0FBVCxTQUFTLENBQWE7UUFDdEIsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFxQjtRQUN4Qyx1QkFBa0IsR0FBbEIsa0JBQWtCLENBQW9CO1FBQ3RDLGVBQVUsR0FBVixVQUFVLENBQXdCO1FBQ2xDLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDdEIsY0FBUyxHQUFULFNBQVMsQ0FBb0I7UUFDN0Isb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBQ2hDLFlBQU8sR0FBUCxPQUFPLENBR2Q7UUFqQkssUUFBRyxHQUFHLGlCQUFpQixDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFrQmxELENBQUM7SUFFSjs7O09BR0c7SUFDSCxLQUFLO1FBQ0gsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLGNBQWMsQ0FBQyxJQUFJ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
@@ -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,CAI7D"}
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3R4LXByb3ZpZGVyL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFJQSxNQUFNLFVBQVUsMEJBQTBCO0lBQ3hDLE9BQU87UUFDTCxpQkFBaUIsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLG9CQUFvQixJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYztLQUNsRixDQUFDO0FBQ0osQ0FBQyJ9
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.47.1",
3
+ "version": "0.49.2",
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.47.1",
53
- "@aztec/circuit-types": "0.47.1",
54
- "@aztec/circuits.js": "0.47.1",
55
- "@aztec/foundation": "0.47.1",
56
- "@aztec/kv-store": "0.47.1",
57
- "@aztec/prover-client": "0.47.1",
58
- "@aztec/sequencer-client": "0.47.1",
59
- "@aztec/simulator": "0.47.1",
60
- "@aztec/telemetry-client": "0.47.1",
61
- "@aztec/world-state": "0.47.1",
52
+ "@aztec/archiver": "0.49.2",
53
+ "@aztec/circuit-types": "0.49.2",
54
+ "@aztec/circuits.js": "0.49.2",
55
+ "@aztec/foundation": "0.49.2",
56
+ "@aztec/kv-store": "0.49.2",
57
+ "@aztec/prover-client": "0.49.2",
58
+ "@aztec/sequencer-client": "0.49.2",
59
+ "@aztec/simulator": "0.49.2",
60
+ "@aztec/telemetry-client": "0.49.2",
61
+ "@aztec/world-state": "0.49.2",
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 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';
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 { PublicProcessorFactory, createSimulationProvider } from '@aztec/simulator';
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, worldStateSynchronizer, archiver);
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(prover!, publicProcessorFactory, publisher, archiver, archiver, txProvider);
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
  }
@@ -30,6 +30,7 @@ export class BlockProvingJob {
30
30
  private l2BlockSource: L2BlockSource,
31
31
  private l1ToL2MessageSource: L1ToL2MessageSource,
32
32
  private txProvider: TxProvider,
33
+ private cleanUp: () => Promise<void> = () => Promise.resolve(),
33
34
  ) {}
34
35
 
35
36
  public getState(): BlockProvingJobState {
@@ -42,60 +43,72 @@ export class BlockProvingJob {
42
43
  }
43
44
 
44
45
  this.log.info(`Starting block proving job`, { fromBlock, toBlock });
45
- this.state = 'started';
46
-
47
- // TODO: Fast-forward world state to fromBlock and/or await fromBlock to be published to the unproven chain
48
-
49
46
  this.state = 'processing';
50
-
51
- let historicalHeader = (await this.l2BlockSource.getBlock(fromBlock - 1))?.header;
52
- for (let blockNumber = fromBlock; blockNumber <= toBlock; blockNumber++) {
53
- const block = await this.getBlock(blockNumber);
54
- const globalVariables = block.header.globalVariables;
55
- const txHashes = block.body.txEffects.map(tx => tx.txHash);
56
- const txCount = block.body.numberOfTxsIncludingPadded;
57
- const l1ToL2Messages = await this.getL1ToL2Messages(block);
58
-
59
- this.log.verbose(`Starting block processing`, {
60
- number: block.number,
61
- blockHash: block.hash().toString(),
62
- lastArchive: block.header.lastArchive.root,
63
- noteHashTreeRoot: block.header.state.partial.noteHashTree.root,
64
- nullifierTreeRoot: block.header.state.partial.nullifierTree.root,
65
- publicDataTreeRoot: block.header.state.partial.publicDataTree.root,
66
- historicalHeader: historicalHeader?.hash(),
67
- ...globalVariables,
68
- });
69
- const provingTicket = await this.prover.startNewBlock(txCount, globalVariables, l1ToL2Messages);
70
- const publicProcessor = this.publicProcessorFactory.create(historicalHeader, globalVariables);
71
-
72
- const txs = await this.getTxs(txHashes);
73
- await this.processTxs(publicProcessor, txs, txCount);
74
-
75
- this.log.verbose(`Processed all txs for block`, {
76
- blockNumber: block.number,
77
- blockHash: block.hash().toString(),
78
- });
79
-
80
- await this.prover.setBlockCompleted();
81
-
82
- const result = await provingTicket.provingPromise;
83
- if (result.status === PROVING_STATUS.FAILURE) {
84
- throw new Error(`Block proving failed: ${result.reason}`);
47
+ try {
48
+ let historicalHeader = (await this.l2BlockSource.getBlock(fromBlock - 1))?.header;
49
+ for (let blockNumber = fromBlock; blockNumber <= toBlock; blockNumber++) {
50
+ const block = await this.getBlock(blockNumber);
51
+ const globalVariables = block.header.globalVariables;
52
+ const txHashes = block.body.txEffects.map(tx => tx.txHash);
53
+ const txCount = block.body.numberOfTxsIncludingPadded;
54
+ const l1ToL2Messages = await this.getL1ToL2Messages(block);
55
+
56
+ this.log.verbose(`Starting block processing`, {
57
+ number: block.number,
58
+ blockHash: block.hash().toString(),
59
+ lastArchive: block.header.lastArchive.root,
60
+ noteHashTreeRoot: block.header.state.partial.noteHashTree.root,
61
+ nullifierTreeRoot: block.header.state.partial.nullifierTree.root,
62
+ publicDataTreeRoot: block.header.state.partial.publicDataTree.root,
63
+ historicalHeader: historicalHeader?.hash(),
64
+ ...globalVariables,
65
+ });
66
+
67
+ // When we move to proving epochs, this should change into a startNewEpoch and be lifted outside the loop.
68
+ const provingTicket = await this.prover.startNewBlock(txCount, globalVariables, l1ToL2Messages);
69
+
70
+ const publicProcessor = this.publicProcessorFactory.create(historicalHeader, globalVariables);
71
+
72
+ const txs = await this.getTxs(txHashes);
73
+ await this.processTxs(publicProcessor, txs, txCount);
74
+
75
+ this.log.verbose(`Processed all txs for block`, {
76
+ blockNumber: block.number,
77
+ blockHash: block.hash().toString(),
78
+ });
79
+
80
+ await this.prover.setBlockCompleted();
81
+
82
+ // This should be moved outside the loop to match the creation of the proving ticket when we move to epochs.
83
+ this.state = 'awaiting-prover';
84
+ const result = await provingTicket.provingPromise;
85
+ if (result.status === PROVING_STATUS.FAILURE) {
86
+ throw new Error(`Block proving failed: ${result.reason}`);
87
+ }
88
+
89
+ historicalHeader = block.header;
85
90
  }
86
91
 
87
- historicalHeader = block.header;
88
- }
89
-
90
- this.state = 'awaiting-prover';
91
- const { block, aggregationObject, proof } = await this.prover.finaliseBlock();
92
- this.log.info(`Finalised proof for block range`, { fromBlock, toBlock });
93
-
94
- this.state = 'publishing-proof';
95
- await this.publisher.submitProof(block.header, block.archive.root, aggregationObject, proof);
96
- this.log.info(`Submitted proof for block range`, { fromBlock, toBlock });
92
+ const { block, aggregationObject, proof } = await this.prover.finaliseBlock();
93
+ this.log.info(`Finalised proof for block range`, { fromBlock, toBlock });
97
94
 
98
- this.state = 'completed';
95
+ this.state = 'publishing-proof';
96
+ await this.publisher.submitProof(
97
+ block.header,
98
+ block.archive.root,
99
+ this.prover.getProverId(),
100
+ aggregationObject,
101
+ proof,
102
+ );
103
+ this.log.info(`Submitted proof for block range`, { fromBlock, toBlock });
104
+
105
+ this.state = 'completed';
106
+ } catch (err) {
107
+ this.log.error(`Error running block prover job: ${err}`);
108
+ this.state = 'failed';
109
+ } finally {
110
+ await this.cleanUp();
111
+ }
99
112
  }
100
113
 
101
114
  private async getBlock(blockNumber: number): Promise<L2Block> {
@@ -145,8 +158,8 @@ export class BlockProvingJob {
145
158
 
146
159
  export type BlockProvingJobState =
147
160
  | 'initialized'
148
- | 'started'
149
161
  | 'processing'
150
162
  | 'awaiting-prover'
151
163
  | 'publishing-proof'
152
- | 'completed';
164
+ | 'completed'
165
+ | 'failed';
@@ -2,8 +2,11 @@ import { type L1ToL2MessageSource, type L2BlockSource, type ProverClient, type T
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 PublicProcessorFactory } from '@aztec/simulator';
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,14 +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,
23
26
  private l1ToL2MessageSource: L1ToL2MessageSource,
27
+ private contractDataSource: ContractDataSource,
28
+ private worldState: WorldStateSynchronizer,
24
29
  private txProvider: TxProvider,
30
+ private simulator: SimulationProvider,
31
+ private telemetryClient: TelemetryClient,
25
32
  private options: { pollingIntervalMs: number; disableAutomaticProving: boolean } = {
26
33
  pollingIntervalMs: 1_000,
27
34
  disableAutomaticProving: false,
@@ -48,46 +55,60 @@ export class ProverNode {
48
55
  await this.l2BlockSource.stop();
49
56
  this.publisher.interrupt();
50
57
  this.log.info('Stopped ProverNode');
58
+ // TODO(palla/prover-node): Keep a reference to all ongoing ProvingJobs and stop them.
51
59
  }
52
60
 
53
61
  /**
54
62
  * Single iteration of recurring work. This method is called periodically by the running promise.
55
63
  * Checks whether there are new blocks to prove, proves them, and submits them.
56
- * Only proves one block per job and one job at a time (for now).
57
64
  */
58
65
  protected async work() {
59
- if (this.options.disableAutomaticProving) {
60
- return;
61
- }
66
+ try {
67
+ if (this.options.disableAutomaticProving) {
68
+ return;
69
+ }
62
70
 
63
- const [latestBlockNumber, latestProvenBlockNumber] = await Promise.all([
64
- this.l2BlockSource.getBlockNumber(),
65
- this.l2BlockSource.getProvenBlockNumber(),
66
- ]);
71
+ const [latestBlockNumber, latestProvenBlockNumber] = await Promise.all([
72
+ this.l2BlockSource.getBlockNumber(),
73
+ this.l2BlockSource.getProvenBlockNumber(),
74
+ ]);
67
75
 
68
- if (latestProvenBlockNumber >= latestBlockNumber) {
69
- this.log.debug(`No new blocks to prove`, { latestBlockNumber, latestProvenBlockNumber });
70
- return;
71
- }
76
+ // Consider both the latest block we are proving and the last block proven on the chain
77
+ const latestBlockBeingProven = this.latestBlockWeAreProving ?? 0;
78
+ const latestProven = Math.max(latestBlockBeingProven, latestProvenBlockNumber);
79
+ if (latestProven >= latestBlockNumber) {
80
+ this.log.debug(`No new blocks to prove`, {
81
+ latestBlockNumber,
82
+ latestProvenBlockNumber,
83
+ latestBlockBeingProven,
84
+ });
85
+ return;
86
+ }
87
+
88
+ const fromBlock = latestProven + 1;
89
+ const toBlock = fromBlock; // We only prove one block at a time for now
72
90
 
73
- const fromBlock = latestProvenBlockNumber + 1;
74
- const toBlock = fromBlock; // We only prove one block at a time for now
75
- await this.prove(fromBlock, toBlock);
91
+ await this.startProof(fromBlock, toBlock);
92
+ this.latestBlockWeAreProving = toBlock;
93
+ } catch (err) {
94
+ this.log.error(`Error in prover node work`, err);
95
+ }
76
96
  }
77
97
 
78
98
  /**
79
99
  * Creates a proof for a block range. Returns once the proof has been submitted to L1.
80
100
  */
81
- public prove(fromBlock: number, toBlock: number) {
82
- return this.createProvingJob().run(fromBlock, toBlock);
101
+ public async prove(fromBlock: number, toBlock: number) {
102
+ const job = await this.createProvingJob(fromBlock);
103
+ return job.run(fromBlock, toBlock);
83
104
  }
84
105
 
85
106
  /**
86
107
  * Starts a proving process and returns immediately.
87
108
  */
88
- public startProof(fromBlock: number, toBlock: number) {
89
- void this.createProvingJob().run(fromBlock, toBlock);
90
- return Promise.resolve();
109
+ public async startProof(fromBlock: number, toBlock: number) {
110
+ const job = await this.createProvingJob(fromBlock);
111
+ void job.run(fromBlock, toBlock);
91
112
  }
92
113
 
93
114
  /**
@@ -97,14 +118,30 @@ export class ProverNode {
97
118
  return this.prover;
98
119
  }
99
120
 
100
- private createProvingJob() {
121
+ private async createProvingJob(fromBlock: number) {
122
+ if ((await this.worldState.status()).syncedToL2Block >= fromBlock) {
123
+ throw new Error(`Cannot create proving job for block ${fromBlock} as it is behind the current world state`);
124
+ }
125
+
126
+ // Fast forward world state to right before the target block and get a fork
127
+ const db = await this.worldState.syncImmediateAndFork(fromBlock - 1, true);
128
+
129
+ // Create a processor using the forked world state
130
+ const publicProcessorFactory = new PublicProcessorFactory(
131
+ db,
132
+ this.contractDataSource,
133
+ this.simulator,
134
+ this.telemetryClient,
135
+ );
136
+
101
137
  return new BlockProvingJob(
102
- this.prover,
103
- this.publicProcessorFactory,
138
+ this.prover.createBlockProver(db),
139
+ publicProcessorFactory,
104
140
  this.publisher,
105
141
  this.l2BlockSource,
106
142
  this.l1ToL2MessageSource,
107
143
  this.txProvider,
144
+ () => db.delete(),
108
145
  );
109
146
  }
110
147
  }
@@ -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
  }