@aztec/prover-client 0.65.0 → 0.65.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.
Files changed (102) hide show
  1. package/dest/config.d.ts +4 -10
  2. package/dest/config.d.ts.map +1 -1
  3. package/dest/config.js +8 -7
  4. package/dest/index.d.ts +1 -0
  5. package/dest/index.d.ts.map +1 -1
  6. package/dest/index.js +2 -1
  7. package/dest/mocks/test_context.js +3 -2
  8. package/dest/orchestrator/block-building-helpers.d.ts +5 -2
  9. package/dest/orchestrator/block-building-helpers.d.ts.map +1 -1
  10. package/dest/orchestrator/block-building-helpers.js +18 -22
  11. package/dest/orchestrator/block-proving-state.js +2 -2
  12. package/dest/orchestrator/orchestrator.d.ts.map +1 -1
  13. package/dest/orchestrator/orchestrator.js +5 -8
  14. package/dest/prover-agent/memory-proving-queue.d.ts +10 -8
  15. package/dest/prover-agent/memory-proving-queue.d.ts.map +1 -1
  16. package/dest/prover-agent/memory-proving-queue.js +35 -35
  17. package/dest/prover-agent/prover-agent.d.ts +1 -0
  18. package/dest/prover-agent/prover-agent.d.ts.map +1 -1
  19. package/dest/prover-agent/prover-agent.js +12 -9
  20. package/dest/proving_broker/caching_broker_facade.d.ts +30 -0
  21. package/dest/proving_broker/caching_broker_facade.d.ts.map +1 -0
  22. package/dest/proving_broker/caching_broker_facade.js +150 -0
  23. package/dest/proving_broker/factory.d.ts +4 -0
  24. package/dest/proving_broker/factory.d.ts.map +1 -0
  25. package/dest/proving_broker/factory.js +17 -0
  26. package/dest/proving_broker/index.d.ts +9 -0
  27. package/dest/proving_broker/index.d.ts.map +1 -0
  28. package/dest/proving_broker/index.js +9 -0
  29. package/dest/proving_broker/proof_store.d.ts +46 -0
  30. package/dest/proving_broker/proof_store.d.ts.map +1 -0
  31. package/dest/proving_broker/proof_store.js +37 -0
  32. package/dest/proving_broker/prover_cache/memory.d.ts +9 -0
  33. package/dest/proving_broker/prover_cache/memory.d.ts.map +1 -0
  34. package/dest/proving_broker/prover_cache/memory.js +16 -0
  35. package/dest/proving_broker/proving_agent.d.ts +11 -6
  36. package/dest/proving_broker/proving_agent.d.ts.map +1 -1
  37. package/dest/proving_broker/proving_agent.js +48 -20
  38. package/dest/proving_broker/proving_broker.d.ts +17 -16
  39. package/dest/proving_broker/proving_broker.d.ts.map +1 -1
  40. package/dest/proving_broker/proving_broker.js +44 -23
  41. package/dest/proving_broker/proving_broker_database/memory.d.ts +14 -0
  42. package/dest/proving_broker/proving_broker_database/memory.d.ts.map +1 -0
  43. package/dest/proving_broker/proving_broker_database/memory.js +35 -0
  44. package/dest/proving_broker/proving_broker_database/persisted.d.ts +15 -0
  45. package/dest/proving_broker/proving_broker_database/persisted.d.ts.map +1 -0
  46. package/dest/proving_broker/proving_broker_database/persisted.js +35 -0
  47. package/dest/proving_broker/{proving_job_database.d.ts → proving_broker_database.d.ts} +8 -8
  48. package/dest/proving_broker/proving_broker_database.d.ts.map +1 -0
  49. package/dest/proving_broker/proving_broker_database.js +2 -0
  50. package/dest/proving_broker/proving_job_controller.d.ts +13 -8
  51. package/dest/proving_broker/proving_job_controller.d.ts.map +1 -1
  52. package/dest/proving_broker/proving_job_controller.js +43 -43
  53. package/dest/proving_broker/rpc.d.ts +11 -0
  54. package/dest/proving_broker/rpc.d.ts.map +1 -0
  55. package/dest/proving_broker/rpc.js +44 -0
  56. package/dest/test/mock_prover.d.ts +15 -1
  57. package/dest/test/mock_prover.d.ts.map +1 -1
  58. package/dest/test/mock_prover.js +36 -1
  59. package/dest/tx-prover/factory.d.ts +2 -1
  60. package/dest/tx-prover/factory.d.ts.map +1 -1
  61. package/dest/tx-prover/factory.js +3 -3
  62. package/dest/tx-prover/tx-prover.d.ts +13 -7
  63. package/dest/tx-prover/tx-prover.d.ts.map +1 -1
  64. package/dest/tx-prover/tx-prover.js +52 -35
  65. package/package.json +14 -12
  66. package/src/config.ts +17 -16
  67. package/src/index.ts +1 -0
  68. package/src/mocks/test_context.ts +2 -2
  69. package/src/orchestrator/block-building-helpers.ts +34 -37
  70. package/src/orchestrator/block-proving-state.ts +1 -1
  71. package/src/orchestrator/orchestrator.ts +4 -9
  72. package/src/prover-agent/memory-proving-queue.ts +43 -44
  73. package/src/prover-agent/prover-agent.ts +16 -20
  74. package/src/proving_broker/caching_broker_facade.ts +312 -0
  75. package/src/proving_broker/factory.ts +21 -0
  76. package/src/proving_broker/index.ts +8 -0
  77. package/src/proving_broker/proof_store.ts +106 -0
  78. package/src/proving_broker/prover_cache/memory.ts +20 -0
  79. package/src/proving_broker/proving_agent.ts +75 -20
  80. package/src/proving_broker/proving_broker.ts +98 -65
  81. package/src/proving_broker/proving_broker_database/memory.ts +43 -0
  82. package/src/proving_broker/proving_broker_database/persisted.ts +45 -0
  83. package/src/proving_broker/{proving_job_database.ts → proving_broker_database.ts} +7 -12
  84. package/src/proving_broker/proving_job_controller.ts +54 -46
  85. package/src/proving_broker/rpc.ts +64 -0
  86. package/src/test/mock_prover.ts +51 -0
  87. package/src/tx-prover/factory.ts +7 -2
  88. package/src/tx-prover/tx-prover.ts +78 -46
  89. package/dest/proving_broker/proving_broker_interface.d.ts +0 -61
  90. package/dest/proving_broker/proving_broker_interface.d.ts.map +0 -1
  91. package/dest/proving_broker/proving_broker_interface.js +0 -2
  92. package/dest/proving_broker/proving_job_database/memory.d.ts +0 -14
  93. package/dest/proving_broker/proving_job_database/memory.d.ts.map +0 -1
  94. package/dest/proving_broker/proving_job_database/memory.js +0 -35
  95. package/dest/proving_broker/proving_job_database/persisted.d.ts +0 -15
  96. package/dest/proving_broker/proving_job_database/persisted.d.ts.map +0 -1
  97. package/dest/proving_broker/proving_job_database/persisted.js +0 -34
  98. package/dest/proving_broker/proving_job_database.d.ts.map +0 -1
  99. package/dest/proving_broker/proving_job_database.js +0 -2
  100. package/src/proving_broker/proving_broker_interface.ts +0 -74
  101. package/src/proving_broker/proving_job_database/memory.ts +0 -43
  102. package/src/proving_broker/proving_job_database/persisted.ts +0 -44
@@ -1,37 +1,43 @@
1
1
  import { BBNativeRollupProver, TestCircuitProver } from '@aztec/bb-prover';
2
2
  import { Fr } from '@aztec/circuits.js';
3
+ import { times } from '@aztec/foundation/collection';
4
+ import { createDebugLogger } from '@aztec/foundation/log';
3
5
  import { NativeACVMSimulator } from '@aztec/simulator';
6
+ import { join } from 'path';
4
7
  import { ProvingOrchestrator } from '../orchestrator/orchestrator.js';
5
- import { MemoryProvingQueue } from '../prover-agent/memory-proving-queue.js';
6
- import { ProverAgent } from '../prover-agent/prover-agent.js';
8
+ import { CachingBrokerFacade } from '../proving_broker/caching_broker_facade.js';
9
+ import { InlineProofStore } from '../proving_broker/proof_store.js';
10
+ import { InMemoryProverCache } from '../proving_broker/prover_cache/memory.js';
11
+ import { ProvingAgent } from '../proving_broker/proving_agent.js';
7
12
  /**
8
13
  * A prover factory.
9
14
  * TODO(palla/prover-node): Rename this class
10
15
  */
11
16
  export class TxProver {
12
- constructor(config, telemetry, agent) {
17
+ constructor(config, telemetry, orchestratorClient, agentClient, log = createDebugLogger('aztec:prover-client:tx-prover')) {
13
18
  this.config = config;
14
19
  this.telemetry = telemetry;
15
- this.agent = agent;
20
+ this.orchestratorClient = orchestratorClient;
21
+ this.agentClient = agentClient;
22
+ this.log = log;
16
23
  this.running = false;
24
+ this.agents = [];
17
25
  // TODO(palla/prover-node): Cache the paddingTx here, and not in each proving orchestrator,
18
26
  // so it can be reused across multiple ones and not recomputed every time.
19
- this.queue = new MemoryProvingQueue(telemetry, config.proverJobTimeoutMs, config.proverJobPollIntervalMs);
27
+ this.cacheDir = this.config.cacheDir ? join(this.config.cacheDir, `tx_prover_${this.config.proverId}`) : undefined;
20
28
  }
21
- createEpochProver(db) {
22
- return new ProvingOrchestrator(db, this.queue, this.telemetry, this.config.proverId);
29
+ createEpochProver(db, cache = new InMemoryProverCache()) {
30
+ return new ProvingOrchestrator(db, new CachingBrokerFacade(this.orchestratorClient, cache), this.telemetry, this.config.proverId);
23
31
  }
24
32
  getProverId() {
25
33
  return this.config.proverId ?? Fr.ZERO;
26
34
  }
27
35
  async updateProverConfig(config) {
28
36
  const newConfig = { ...this.config, ...config };
29
- if (newConfig.realProofs !== this.config.realProofs && this.agent) {
30
- const circuitProver = await TxProver.buildCircuitProver(newConfig, this.telemetry);
31
- this.agent.setCircuitProver(circuitProver);
32
- }
33
- if (this.config.proverAgentConcurrency !== newConfig.proverAgentConcurrency) {
34
- await this.agent?.setMaxConcurrency(newConfig.proverAgentConcurrency);
37
+ if (newConfig.realProofs !== this.config.realProofs ||
38
+ newConfig.proverAgentCount !== this.config.proverAgentCount) {
39
+ await this.stopAgents();
40
+ await this.createAndStartAgents();
35
41
  }
36
42
  if (!this.config.realProofs && newConfig.realProofs) {
37
43
  // TODO(palla/prover-node): Reset padding tx here once we cache it at this class
@@ -41,14 +47,12 @@ export class TxProver {
41
47
  /**
42
48
  * Starts the prover instance
43
49
  */
44
- start() {
50
+ async start() {
45
51
  if (this.running) {
46
52
  return Promise.resolve();
47
53
  }
48
54
  this.running = true;
49
- this.queue.start();
50
- this.agent?.start(this.queue);
51
- return Promise.resolve();
55
+ await this.createAndStartAgents();
52
56
  }
53
57
  /**
54
58
  * Stops the prover instance
@@ -58,9 +62,7 @@ export class TxProver {
58
62
  return;
59
63
  }
60
64
  this.running = false;
61
- // TODO(palla/prover-node): Keep a reference to all proving orchestrators that are alive and stop them?
62
- await this.agent?.stop();
63
- await this.queue.stop();
65
+ await this.stopAgents();
64
66
  }
65
67
  /**
66
68
  * Creates a new prover client and starts it
@@ -69,25 +71,40 @@ export class TxProver {
69
71
  * @param worldStateSynchronizer - An instance of the world state
70
72
  * @returns An instance of the prover, constructed and started.
71
73
  */
72
- static async new(config, telemetry) {
73
- const agent = config.proverAgentEnabled
74
- ? new ProverAgent(await TxProver.buildCircuitProver(config, telemetry), config.proverAgentConcurrency, config.proverAgentPollInterval)
75
- : undefined;
76
- const prover = new TxProver(config, telemetry, agent);
74
+ static async new(config, broker, telemetry) {
75
+ const prover = new TxProver(config, telemetry, broker, broker);
77
76
  await prover.start();
78
77
  return prover;
79
78
  }
80
- static async buildCircuitProver(config, telemetry) {
81
- if (config.realProofs) {
82
- return await BBNativeRollupProver.new(config, telemetry);
79
+ getProvingJobSource() {
80
+ if (!this.agentClient) {
81
+ throw new Error('Agent client not provided');
83
82
  }
84
- const simulationProvider = config.acvmBinaryPath
85
- ? new NativeACVMSimulator(config.acvmWorkingDirectory, config.acvmBinaryPath)
86
- : undefined;
87
- return new TestCircuitProver(telemetry, simulationProvider, config);
83
+ return this.agentClient;
88
84
  }
89
- getProvingJobSource() {
90
- return this.queue;
85
+ async createAndStartAgents() {
86
+ if (this.agents.length > 0) {
87
+ throw new Error('Agents already started');
88
+ }
89
+ if (!this.agentClient) {
90
+ throw new Error('Agent client not provided');
91
+ }
92
+ const proofStore = new InlineProofStore();
93
+ const prover = await buildServerCircuitProver(this.config, this.telemetry);
94
+ this.agents = times(this.config.proverAgentCount, () => new ProvingAgent(this.agentClient, proofStore, prover, [], this.config.proverAgentPollIntervalMs));
95
+ await Promise.all(this.agents.map(agent => agent.start()));
96
+ }
97
+ async stopAgents() {
98
+ await Promise.all(this.agents.map(agent => agent.stop()));
99
+ }
100
+ }
101
+ export function buildServerCircuitProver(config, telemetry) {
102
+ if (config.realProofs) {
103
+ return BBNativeRollupProver.new(config, telemetry);
91
104
  }
105
+ const simulationProvider = config.acvmBinaryPath
106
+ ? new NativeACVMSimulator(config.acvmWorkingDirectory, config.acvmBinaryPath)
107
+ : undefined;
108
+ return Promise.resolve(new TestCircuitProver(telemetry, simulationProvider, config));
92
109
  }
93
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHgtcHJvdmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3R4LXByb3Zlci90eC1wcm92ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLG9CQUFvQixFQUFFLGlCQUFpQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFRM0UsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3hDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBSXZELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQzdFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUU5RDs7O0dBR0c7QUFDSCxNQUFNLE9BQU8sUUFBUTtJQUluQixZQUNVLE1BQTBCLEVBQzFCLFNBQTBCLEVBQzFCLEtBQW1CO1FBRm5CLFdBQU0sR0FBTixNQUFNLENBQW9CO1FBQzFCLGNBQVMsR0FBVCxTQUFTLENBQWlCO1FBQzFCLFVBQUssR0FBTCxLQUFLLENBQWM7UUFMckIsWUFBTyxHQUFHLEtBQUssQ0FBQztRQU90QiwyRkFBMkY7UUFDM0YsMEVBQTBFO1FBQzFFLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxrQkFBa0IsQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLGtCQUFrQixFQUFFLE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO0lBQzVHLENBQUM7SUFFTSxpQkFBaUIsQ0FBQyxFQUE2QjtRQUNwRCxPQUFPLElBQUksbUJBQW1CLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3ZGLENBQUM7SUFFTSxXQUFXO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLE1BQU0s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
110
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHgtcHJvdmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3R4LXByb3Zlci90eC1wcm92ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFrQyxvQkFBb0IsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBWTNHLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN4QyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDckQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDMUQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFHdkQsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUc1QixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUN0RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUNqRixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNwRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUMvRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFFbEU7OztHQUdHO0FBQ0gsTUFBTSxPQUFPLFFBQVE7SUFNbkIsWUFDVSxNQUEwQixFQUMxQixTQUEwQixFQUMxQixrQkFBc0MsRUFDdEMsV0FBZ0MsRUFDaEMsTUFBTSxpQkFBaUIsQ0FBQywrQkFBK0IsQ0FBQztRQUp4RCxXQUFNLEdBQU4sTUFBTSxDQUFvQjtRQUMxQixjQUFTLEdBQVQsU0FBUyxDQUFpQjtRQUMxQix1QkFBa0IsR0FBbEIsa0JBQWtCLENBQW9CO1FBQ3RDLGdCQUFXLEdBQVgsV0FBVyxDQUFxQjtRQUNoQyxRQUFHLEdBQUgsR0FBRyxDQUFxRDtRQVYxRCxZQUFPLEdBQUcsS0FB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
package/package.json CHANGED
@@ -1,9 +1,10 @@
1
1
  {
2
2
  "name": "@aztec/prover-client",
3
- "version": "0.65.0",
3
+ "version": "0.65.2",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": "./dest/index.js",
7
+ "./broker": "./dest/proving_broker/index.js",
7
8
  "./prover-agent": "./dest/prover-agent/index.js",
8
9
  "./orchestrator": "./dest/orchestrator/index.js",
9
10
  "./helpers": "./dest/orchestrator/block-building-helpers.js"
@@ -64,21 +65,22 @@
64
65
  ]
65
66
  },
66
67
  "dependencies": {
67
- "@aztec/bb-prover": "0.65.0",
68
- "@aztec/circuit-types": "0.65.0",
69
- "@aztec/circuits.js": "0.65.0",
70
- "@aztec/foundation": "0.65.0",
71
- "@aztec/kv-store": "0.65.0",
72
- "@aztec/noir-protocol-circuits-types": "0.65.0",
73
- "@aztec/protocol-contracts": "0.65.0",
74
- "@aztec/simulator": "0.65.0",
75
- "@aztec/telemetry-client": "0.65.0",
76
- "@aztec/world-state": "0.65.0",
68
+ "@aztec/bb-prover": "0.65.2",
69
+ "@aztec/circuit-types": "0.65.2",
70
+ "@aztec/circuits.js": "0.65.2",
71
+ "@aztec/foundation": "0.65.2",
72
+ "@aztec/kv-store": "0.65.2",
73
+ "@aztec/noir-protocol-circuits-types": "0.65.2",
74
+ "@aztec/protocol-contracts": "0.65.2",
75
+ "@aztec/simulator": "0.65.2",
76
+ "@aztec/telemetry-client": "0.65.2",
77
+ "@aztec/world-state": "0.65.2",
77
78
  "@noir-lang/types": "portal:../../noir/packages/types",
78
79
  "commander": "^12.1.0",
79
80
  "lodash.chunk": "^4.2.0",
80
81
  "source-map-support": "^0.5.21",
81
- "tslib": "^2.4.0"
82
+ "tslib": "^2.4.0",
83
+ "zod": "^3.23.8"
82
84
  },
83
85
  "devDependencies": {
84
86
  "@jest/globals": "^29.5.0",
package/src/config.ts CHANGED
@@ -1,25 +1,20 @@
1
- import { type BBConfig } from '@aztec/bb-prover';
2
- import { type ProverConfig, proverConfigMappings } from '@aztec/circuit-types';
1
+ import { type ACVMConfig, type BBConfig } from '@aztec/bb-prover';
2
+ import {
3
+ type ProverAgentConfig,
4
+ type ProverBrokerConfig,
5
+ type ProverConfig,
6
+ proverAgentConfigMappings,
7
+ proverBrokerConfigMappings,
8
+ proverConfigMappings,
9
+ } from '@aztec/circuit-types';
3
10
  import { type ConfigMappingsType, booleanConfigHelper, getConfigFromMappings } from '@aztec/foundation/config';
4
11
 
5
12
  /**
6
13
  * The prover configuration.
7
14
  */
8
- export type ProverClientConfig = ProverConfig &
9
- BBConfig & {
10
- /** The URL to the Aztec prover node to take proving jobs from */
11
- proverJobSourceUrl?: string;
12
- /** The working directory to use for simulation/proving */
13
- acvmWorkingDirectory: string;
14
- /** The path to the ACVM binary */
15
- acvmBinaryPath: string;
16
- };
15
+ export type ProverClientConfig = ProverConfig & ProverAgentConfig & ProverBrokerConfig & BBConfig & ACVMConfig;
17
16
 
18
- export const proverClientConfigMappings: ConfigMappingsType<ProverClientConfig> = {
19
- proverJobSourceUrl: {
20
- env: 'PROVER_JOB_SOURCE_URL',
21
- description: 'The URL to the Aztec prover node to take proving jobs from',
22
- },
17
+ export const bbConfigMappings: ConfigMappingsType<BBConfig & ACVMConfig> = {
23
18
  acvmWorkingDirectory: {
24
19
  env: 'ACVM_WORKING_DIRECTORY',
25
20
  description: 'The working directory to use for simulation/proving',
@@ -41,7 +36,13 @@ export const proverClientConfigMappings: ConfigMappingsType<ProverClientConfig>
41
36
  description: 'Whether to skip cleanup of bb temporary files',
42
37
  ...booleanConfigHelper(false),
43
38
  },
39
+ };
40
+
41
+ export const proverClientConfigMappings: ConfigMappingsType<ProverClientConfig> = {
42
+ ...bbConfigMappings,
44
43
  ...proverConfigMappings,
44
+ ...proverAgentConfigMappings,
45
+ ...proverBrokerConfigMappings,
45
46
  };
46
47
 
47
48
  /**
package/src/index.ts CHANGED
@@ -3,3 +3,4 @@ export { EpochProverManager } from '@aztec/circuit-types';
3
3
  export * from './tx-prover/tx-prover.js';
4
4
  export * from './config.js';
5
5
  export * from './tx-prover/factory.js';
6
+ export * from './proving_broker/prover_cache/memory.js';
@@ -9,7 +9,7 @@ import {
9
9
  type TxValidator,
10
10
  } from '@aztec/circuit-types';
11
11
  import { type Gas, type GlobalVariables, Header } from '@aztec/circuits.js';
12
- import { type Fr } from '@aztec/foundation/fields';
12
+ import { Fr } from '@aztec/foundation/fields';
13
13
  import { type DebugLogger } from '@aztec/foundation/log';
14
14
  import { openTmpStore } from '@aztec/kv-store/utils';
15
15
  import {
@@ -118,7 +118,7 @@ export class TestContext {
118
118
  }
119
119
 
120
120
  const queue = new MemoryProvingQueue(telemetry);
121
- const orchestrator = new ProvingOrchestrator(proverDb, queue, telemetry);
121
+ const orchestrator = new ProvingOrchestrator(proverDb, queue, telemetry, Fr.ZERO);
122
122
  const agent = new ProverAgent(localProver, proverCount);
123
123
 
124
124
  queue.start();
@@ -1,5 +1,5 @@
1
1
  import {
2
- type Body,
2
+ Body,
3
3
  MerkleTreeId,
4
4
  type MerkleTreeWriteOperations,
5
5
  type ProcessedTx,
@@ -316,6 +316,7 @@ export function buildHeaderFromCircuitOutputs(
316
316
  state,
317
317
  previousMergeData[0].constants.globalVariables,
318
318
  previousMergeData[0].accumulatedFees.add(previousMergeData[1].accumulatedFees),
319
+ previousMergeData[0].accumulatedManaUsed.add(previousMergeData[1].accumulatedManaUsed),
319
320
  );
320
321
  if (!header.hash().equals(rootRollupOutputs.endBlockHash)) {
321
322
  logger?.error(
@@ -328,8 +329,8 @@ export function buildHeaderFromCircuitOutputs(
328
329
  return header;
329
330
  }
330
331
 
331
- export async function buildHeaderFromTxEffects(
332
- body: Body,
332
+ export async function buildHeaderAndBodyFromTxs(
333
+ txs: ProcessedTx[],
333
334
  globalVariables: GlobalVariables,
334
335
  l1ToL2Messages: Fr[],
335
336
  db: MerkleTreeReadOperations,
@@ -345,6 +346,9 @@ export async function buildHeaderFromTxEffects(
345
346
 
346
347
  const previousArchive = await getTreeSnapshot(MerkleTreeId.ARCHIVE, db);
347
348
 
349
+ const nonEmptyTxEffects: TxEffect[] = txs.map(tx => tx.txEffect).filter(txEffect => !txEffect.isEmpty());
350
+ const body = new Body(nonEmptyTxEffects);
351
+
348
352
  const outHash = computeUnbalancedMerkleRoot(
349
353
  body.txEffects.map(tx => tx.txOutHash()),
350
354
  TxEffect.empty().txOutHash(),
@@ -365,7 +369,11 @@ export async function buildHeaderFromTxEffects(
365
369
  );
366
370
 
367
371
  const fees = body.txEffects.reduce((acc, tx) => acc.add(tx.transactionFee), Fr.ZERO);
368
- return new Header(previousArchive, contentCommitment, stateReference, globalVariables, fees);
372
+ const manaUsed = txs.reduce((acc, tx) => acc.add(new Fr(tx.gasUsed.totalGas.l2Gas)), Fr.ZERO);
373
+
374
+ const header = new Header(previousArchive, contentCommitment, stateReference, globalVariables, fees, manaUsed);
375
+
376
+ return { header, body };
369
377
  }
370
378
 
371
379
  // Validate that the roots of all local trees match the output of the root circuit simulation
@@ -484,41 +492,30 @@ async function processPublicDataUpdateRequests(tx: ProcessedTx, db: MerkleTreeWr
484
492
  ({ leafSlot, value }) => new PublicDataTreeLeaf(leafSlot, value),
485
493
  );
486
494
 
487
- const lowPublicDataWritesPreimages = [];
488
- const lowPublicDataWritesMembershipWitnesses = [];
489
- const publicDataWritesSiblingPaths = [];
490
-
491
- for (const write of allPublicDataWrites) {
492
- if (write.isEmpty()) {
493
- throw new Error(`Empty public data write in tx: ${toFriendlyJSON(tx)}`);
494
- }
495
-
496
- // TODO(Alvaro) write a specialized function for this? Internally add_or_update_value uses batch insertion anyway
497
- const { lowLeavesWitnessData, newSubtreeSiblingPath } = await db.batchInsert(
498
- MerkleTreeId.PUBLIC_DATA_TREE,
499
- [write.toBuffer()],
500
- // TODO(#3675) remove oldValue from update requests
501
- 0,
502
- );
503
-
504
- if (lowLeavesWitnessData === undefined) {
505
- throw new Error(`Could not craft public data batch insertion proofs`);
506
- }
507
-
508
- const [lowLeafWitness] = lowLeavesWitnessData;
509
- lowPublicDataWritesPreimages.push(lowLeafWitness.leafPreimage as PublicDataTreeLeafPreimage);
510
- lowPublicDataWritesMembershipWitnesses.push(
511
- MembershipWitness.fromBufferArray<typeof PUBLIC_DATA_TREE_HEIGHT>(
512
- lowLeafWitness.index,
513
- assertLength(lowLeafWitness.siblingPath.toBufferArray(), PUBLIC_DATA_TREE_HEIGHT),
514
- ),
515
- );
495
+ const { lowLeavesWitnessData, insertionWitnessData } = await db.sequentialInsert(
496
+ MerkleTreeId.PUBLIC_DATA_TREE,
497
+ allPublicDataWrites.map(write => {
498
+ if (write.isEmpty()) {
499
+ throw new Error(`Empty public data write in tx: ${toFriendlyJSON(tx)}`);
500
+ }
501
+ return write.toBuffer();
502
+ }),
503
+ );
516
504
 
517
- const insertionSiblingPath = newSubtreeSiblingPath.toFields();
505
+ const lowPublicDataWritesPreimages = lowLeavesWitnessData.map(
506
+ lowLeafWitness => lowLeafWitness.leafPreimage as PublicDataTreeLeafPreimage,
507
+ );
508
+ const lowPublicDataWritesMembershipWitnesses = lowLeavesWitnessData.map(lowLeafWitness =>
509
+ MembershipWitness.fromBufferArray<typeof PUBLIC_DATA_TREE_HEIGHT>(
510
+ lowLeafWitness.index,
511
+ assertLength(lowLeafWitness.siblingPath.toBufferArray(), PUBLIC_DATA_TREE_HEIGHT),
512
+ ),
513
+ );
514
+ const publicDataWritesSiblingPaths = insertionWitnessData.map(w => {
515
+ const insertionSiblingPath = w.siblingPath.toFields();
518
516
  assertLength(insertionSiblingPath, PUBLIC_DATA_TREE_HEIGHT);
519
-
520
- publicDataWritesSiblingPaths.push(insertionSiblingPath as Tuple<Fr, typeof PUBLIC_DATA_TREE_HEIGHT>);
521
- }
517
+ return insertionSiblingPath as Tuple<Fr, typeof PUBLIC_DATA_TREE_HEIGHT>;
518
+ });
522
519
 
523
520
  return {
524
521
  lowPublicDataWritesPreimages,
@@ -131,7 +131,7 @@ export class BlockProvingState {
131
131
 
132
132
  /** Returns the block number as an epoch number. Used for prioritizing proof requests. */
133
133
  public get epochNumber(): number {
134
- return this.globalVariables.blockNumber.toNumber();
134
+ return this.parentEpoch.epochNumber;
135
135
  }
136
136
 
137
137
  /**
@@ -1,10 +1,8 @@
1
1
  import {
2
- Body,
3
2
  L2Block,
4
3
  MerkleTreeId,
5
4
  type ProcessedTx,
6
5
  type ServerCircuitProver,
7
- type TxEffect,
8
6
  makeEmptyProcessedTx,
9
7
  } from '@aztec/circuit-types';
10
8
  import {
@@ -55,8 +53,8 @@ import { inspect } from 'util';
55
53
 
56
54
  import {
57
55
  buildBaseRollupHints,
56
+ buildHeaderAndBodyFromTxs,
58
57
  buildHeaderFromCircuitOutputs,
59
- buildHeaderFromTxEffects,
60
58
  createBlockMergeRollupInputs,
61
59
  createMergeRollupInputs,
62
60
  getPreviousRollupDataFromPublicInputs,
@@ -416,15 +414,12 @@ export class ProvingOrchestrator implements EpochProver {
416
414
 
417
415
  private async buildBlock(provingState: BlockProvingState, expectedHeader?: Header) {
418
416
  // Collect all new nullifiers, commitments, and contracts from all txs in this block to build body
419
- const nonEmptyTxEffects: TxEffect[] = provingState!.allTxs
420
- .map(txProvingState => txProvingState.processedTx.txEffect)
421
- .filter(txEffect => !txEffect.isEmpty());
422
- const body = new Body(nonEmptyTxEffects);
417
+ const txs = provingState!.allTxs.map(a => a.processedTx);
423
418
 
424
419
  // Given we've applied every change from this block, now assemble the block header
425
420
  // and update the archive tree, so we're ready to start processing the next block
426
- const header = await buildHeaderFromTxEffects(
427
- body,
421
+ const { header, body } = await buildHeaderAndBodyFromTxs(
422
+ txs,
428
423
  provingState.globalVariables,
429
424
  provingState.newL1ToL2Messages,
430
425
  this.db,