@aztec/prover-client 0.0.0-test.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.
Files changed (154) hide show
  1. package/README.md +1 -0
  2. package/dest/bin/get-proof-inputs.d.ts +2 -0
  3. package/dest/bin/get-proof-inputs.d.ts.map +1 -0
  4. package/dest/bin/get-proof-inputs.js +51 -0
  5. package/dest/block_builder/index.d.ts +6 -0
  6. package/dest/block_builder/index.d.ts.map +1 -0
  7. package/dest/block_builder/index.js +1 -0
  8. package/dest/block_builder/light.d.ts +33 -0
  9. package/dest/block_builder/light.d.ts.map +1 -0
  10. package/dest/block_builder/light.js +82 -0
  11. package/dest/config.d.ts +17 -0
  12. package/dest/config.d.ts.map +1 -0
  13. package/dest/config.js +39 -0
  14. package/dest/index.d.ts +4 -0
  15. package/dest/index.d.ts.map +1 -0
  16. package/dest/index.js +2 -0
  17. package/dest/mocks/fixtures.d.ts +20 -0
  18. package/dest/mocks/fixtures.d.ts.map +1 -0
  19. package/dest/mocks/fixtures.js +77 -0
  20. package/dest/mocks/test_context.d.ts +55 -0
  21. package/dest/mocks/test_context.d.ts.map +1 -0
  22. package/dest/mocks/test_context.js +193 -0
  23. package/dest/orchestrator/block-building-helpers.d.ts +55 -0
  24. package/dest/orchestrator/block-building-helpers.d.ts.map +1 -0
  25. package/dest/orchestrator/block-building-helpers.js +285 -0
  26. package/dest/orchestrator/block-proving-state.d.ts +76 -0
  27. package/dest/orchestrator/block-proving-state.d.ts.map +1 -0
  28. package/dest/orchestrator/block-proving-state.js +269 -0
  29. package/dest/orchestrator/epoch-proving-state.d.ts +60 -0
  30. package/dest/orchestrator/epoch-proving-state.d.ts.map +1 -0
  31. package/dest/orchestrator/epoch-proving-state.js +163 -0
  32. package/dest/orchestrator/index.d.ts +2 -0
  33. package/dest/orchestrator/index.d.ts.map +1 -0
  34. package/dest/orchestrator/index.js +1 -0
  35. package/dest/orchestrator/orchestrator.d.ts +110 -0
  36. package/dest/orchestrator/orchestrator.d.ts.map +1 -0
  37. package/dest/orchestrator/orchestrator.js +690 -0
  38. package/dest/orchestrator/orchestrator_metrics.d.ts +8 -0
  39. package/dest/orchestrator/orchestrator_metrics.d.ts.map +1 -0
  40. package/dest/orchestrator/orchestrator_metrics.js +17 -0
  41. package/dest/orchestrator/tx-proving-state.d.ts +34 -0
  42. package/dest/orchestrator/tx-proving-state.d.ts.map +1 -0
  43. package/dest/orchestrator/tx-proving-state.js +94 -0
  44. package/dest/prover-client/factory.d.ts +6 -0
  45. package/dest/prover-client/factory.d.ts.map +1 -0
  46. package/dest/prover-client/factory.js +5 -0
  47. package/dest/prover-client/index.d.ts +3 -0
  48. package/dest/prover-client/index.d.ts.map +1 -0
  49. package/dest/prover-client/index.js +2 -0
  50. package/dest/prover-client/prover-client.d.ts +42 -0
  51. package/dest/prover-client/prover-client.d.ts.map +1 -0
  52. package/dest/prover-client/prover-client.js +110 -0
  53. package/dest/prover-client/server-epoch-prover.d.ts +28 -0
  54. package/dest/prover-client/server-epoch-prover.d.ts.map +1 -0
  55. package/dest/prover-client/server-epoch-prover.js +40 -0
  56. package/dest/proving_broker/broker_prover_facade.d.ts +46 -0
  57. package/dest/proving_broker/broker_prover_facade.d.ts.map +1 -0
  58. package/dest/proving_broker/broker_prover_facade.js +344 -0
  59. package/dest/proving_broker/config.d.ts +83 -0
  60. package/dest/proving_broker/config.d.ts.map +1 -0
  61. package/dest/proving_broker/config.js +104 -0
  62. package/dest/proving_broker/factory.d.ts +5 -0
  63. package/dest/proving_broker/factory.d.ts.map +1 -0
  64. package/dest/proving_broker/factory.js +9 -0
  65. package/dest/proving_broker/fixtures.d.ts +5 -0
  66. package/dest/proving_broker/fixtures.d.ts.map +1 -0
  67. package/dest/proving_broker/fixtures.js +12 -0
  68. package/dest/proving_broker/index.d.ts +10 -0
  69. package/dest/proving_broker/index.d.ts.map +1 -0
  70. package/dest/proving_broker/index.js +9 -0
  71. package/dest/proving_broker/proof_store/factory.d.ts +6 -0
  72. package/dest/proving_broker/proof_store/factory.d.ts.map +1 -0
  73. package/dest/proving_broker/proof_store/factory.js +36 -0
  74. package/dest/proving_broker/proof_store/gcs_proof_store.d.ts +14 -0
  75. package/dest/proving_broker/proof_store/gcs_proof_store.d.ts.map +1 -0
  76. package/dest/proving_broker/proof_store/gcs_proof_store.js +51 -0
  77. package/dest/proving_broker/proof_store/index.d.ts +4 -0
  78. package/dest/proving_broker/proof_store/index.d.ts.map +1 -0
  79. package/dest/proving_broker/proof_store/index.js +3 -0
  80. package/dest/proving_broker/proof_store/inline_proof_store.d.ts +15 -0
  81. package/dest/proving_broker/proof_store/inline_proof_store.d.ts.map +1 -0
  82. package/dest/proving_broker/proof_store/inline_proof_store.js +41 -0
  83. package/dest/proving_broker/proof_store/proof_store.d.ts +36 -0
  84. package/dest/proving_broker/proof_store/proof_store.d.ts.map +1 -0
  85. package/dest/proving_broker/proof_store/proof_store.js +3 -0
  86. package/dest/proving_broker/proving_agent.d.ts +46 -0
  87. package/dest/proving_broker/proving_agent.d.ts.map +1 -0
  88. package/dest/proving_broker/proving_agent.js +134 -0
  89. package/dest/proving_broker/proving_agent_instrumentation.d.ts +8 -0
  90. package/dest/proving_broker/proving_agent_instrumentation.d.ts.map +1 -0
  91. package/dest/proving_broker/proving_agent_instrumentation.js +16 -0
  92. package/dest/proving_broker/proving_broker.d.ts +64 -0
  93. package/dest/proving_broker/proving_broker.d.ts.map +1 -0
  94. package/dest/proving_broker/proving_broker.js +570 -0
  95. package/dest/proving_broker/proving_broker_database/memory.d.ts +16 -0
  96. package/dest/proving_broker/proving_broker_database/memory.d.ts.map +1 -0
  97. package/dest/proving_broker/proving_broker_database/memory.js +54 -0
  98. package/dest/proving_broker/proving_broker_database/persisted.d.ts +25 -0
  99. package/dest/proving_broker/proving_broker_database/persisted.d.ts.map +1 -0
  100. package/dest/proving_broker/proving_broker_database/persisted.js +182 -0
  101. package/dest/proving_broker/proving_broker_database.d.ts +39 -0
  102. package/dest/proving_broker/proving_broker_database.d.ts.map +1 -0
  103. package/dest/proving_broker/proving_broker_database.js +3 -0
  104. package/dest/proving_broker/proving_broker_instrumentation.d.ts +29 -0
  105. package/dest/proving_broker/proving_broker_instrumentation.d.ts.map +1 -0
  106. package/dest/proving_broker/proving_broker_instrumentation.js +110 -0
  107. package/dest/proving_broker/proving_job_controller.d.ts +33 -0
  108. package/dest/proving_broker/proving_job_controller.d.ts.map +1 -0
  109. package/dest/proving_broker/proving_job_controller.js +166 -0
  110. package/dest/proving_broker/rpc.d.ts +27 -0
  111. package/dest/proving_broker/rpc.d.ts.map +1 -0
  112. package/dest/proving_broker/rpc.js +66 -0
  113. package/dest/test/mock_prover.d.ts +35 -0
  114. package/dest/test/mock_prover.d.ts.map +1 -0
  115. package/dest/test/mock_prover.js +82 -0
  116. package/package.json +112 -0
  117. package/src/bin/get-proof-inputs.ts +59 -0
  118. package/src/block_builder/index.ts +6 -0
  119. package/src/block_builder/light.ts +101 -0
  120. package/src/config.ts +55 -0
  121. package/src/index.ts +4 -0
  122. package/src/mocks/fixtures.ts +117 -0
  123. package/src/mocks/test_context.ts +257 -0
  124. package/src/orchestrator/block-building-helpers.ts +553 -0
  125. package/src/orchestrator/block-proving-state.ts +379 -0
  126. package/src/orchestrator/epoch-proving-state.ts +252 -0
  127. package/src/orchestrator/index.ts +1 -0
  128. package/src/orchestrator/orchestrator.ts +971 -0
  129. package/src/orchestrator/orchestrator_metrics.ts +22 -0
  130. package/src/orchestrator/tx-proving-state.ts +139 -0
  131. package/src/prover-client/factory.ts +14 -0
  132. package/src/prover-client/index.ts +2 -0
  133. package/src/prover-client/prover-client.ts +162 -0
  134. package/src/prover-client/server-epoch-prover.ts +51 -0
  135. package/src/proving_broker/broker_prover_facade.ts +585 -0
  136. package/src/proving_broker/config.ts +138 -0
  137. package/src/proving_broker/factory.ts +18 -0
  138. package/src/proving_broker/fixtures.ts +15 -0
  139. package/src/proving_broker/index.ts +9 -0
  140. package/src/proving_broker/proof_store/factory.ts +42 -0
  141. package/src/proving_broker/proof_store/gcs_proof_store.ts +72 -0
  142. package/src/proving_broker/proof_store/index.ts +3 -0
  143. package/src/proving_broker/proof_store/inline_proof_store.ts +63 -0
  144. package/src/proving_broker/proof_store/proof_store.ts +54 -0
  145. package/src/proving_broker/proving_agent.ts +181 -0
  146. package/src/proving_broker/proving_agent_instrumentation.ts +21 -0
  147. package/src/proving_broker/proving_broker.ts +687 -0
  148. package/src/proving_broker/proving_broker_database/memory.ts +63 -0
  149. package/src/proving_broker/proving_broker_database/persisted.ts +218 -0
  150. package/src/proving_broker/proving_broker_database.ts +44 -0
  151. package/src/proving_broker/proving_broker_instrumentation.ts +145 -0
  152. package/src/proving_broker/proving_job_controller.ts +194 -0
  153. package/src/proving_broker/rpc.ts +95 -0
  154. package/src/test/mock_prover.ts +253 -0
@@ -0,0 +1,182 @@
1
+ import { jsonParseWithSchema, jsonStringify } from '@aztec/foundation/json-rpc';
2
+ import { createLogger } from '@aztec/foundation/log';
3
+ import { BatchQueue } from '@aztec/foundation/queue';
4
+ import { openVersionedStoreAt } from '@aztec/kv-store/lmdb-v2';
5
+ import { ProvingJob, ProvingJobSettledResult, getEpochFromProvingJobId } from '@aztec/stdlib/interfaces/server';
6
+ import { Attributes, LmdbMetrics, getTelemetryClient } from '@aztec/telemetry-client';
7
+ import { mkdir, readdir } from 'fs/promises';
8
+ import { join } from 'path';
9
+ class SingleEpochDatabase {
10
+ store;
11
+ static SCHEMA_VERSION = 1;
12
+ jobs;
13
+ jobResults;
14
+ constructor(store){
15
+ this.store = store;
16
+ this.jobs = store.openMap('proving_jobs');
17
+ this.jobResults = store.openMap('proving_job_results');
18
+ }
19
+ estimateSize() {
20
+ return this.store.estimateSize();
21
+ }
22
+ async batchWrite(jobs, results) {
23
+ await this.store.transactionAsync(async ()=>{
24
+ for (const job of jobs){
25
+ await this.jobs.set(job.id, jsonStringify(job));
26
+ }
27
+ for (const [id, result] of results){
28
+ await this.jobResults.set(id, jsonStringify(result));
29
+ }
30
+ });
31
+ }
32
+ async *allProvingJobs() {
33
+ for await (const jobStr of this.jobs.valuesAsync()){
34
+ const job = await jsonParseWithSchema(jobStr, ProvingJob);
35
+ const resultStr = await this.jobResults.getAsync(job.id);
36
+ const result = resultStr ? await jsonParseWithSchema(resultStr, ProvingJobSettledResult) : undefined;
37
+ yield [
38
+ job,
39
+ result
40
+ ];
41
+ }
42
+ }
43
+ async setProvingJobError(id, reason) {
44
+ const result = {
45
+ status: 'rejected',
46
+ reason
47
+ };
48
+ await this.jobResults.set(id, jsonStringify(result));
49
+ }
50
+ async setProvingJobResult(id, value) {
51
+ const result = {
52
+ status: 'fulfilled',
53
+ value
54
+ };
55
+ await this.jobResults.set(id, jsonStringify(result));
56
+ }
57
+ delete() {
58
+ return this.store.delete();
59
+ }
60
+ close() {
61
+ return this.store.close();
62
+ }
63
+ }
64
+ export class KVBrokerDatabase {
65
+ epochs;
66
+ config;
67
+ logger;
68
+ metrics;
69
+ batchQueue;
70
+ constructor(epochs, config, client = getTelemetryClient(), logger){
71
+ this.epochs = epochs;
72
+ this.config = config;
73
+ this.logger = logger;
74
+ this.metrics = new LmdbMetrics(client.getMeter('KVBrokerDatabase'), {
75
+ [Attributes.DB_DATA_TYPE]: 'prover-broker'
76
+ }, ()=>this.estimateSize());
77
+ this.batchQueue = new BatchQueue((items, key)=>this.commitWrites(items, key), config.proverBrokerBatchSize, config.proverBrokerBatchIntervalMs, createLogger('proving-client:proving-broker-database:batch-queue'));
78
+ }
79
+ // exposed for testing
80
+ async commitWrites(items, epochNumber) {
81
+ const jobsToAdd = items.filter((item)=>'id' in item);
82
+ const resultsToAdd = items.filter((item)=>Array.isArray(item));
83
+ const db = await this.getEpochDatabase(epochNumber);
84
+ await db.batchWrite(jobsToAdd, resultsToAdd);
85
+ }
86
+ async estimateSize() {
87
+ const sizes = await Promise.all(Array.from(this.epochs.values()).map((x)=>x.estimateSize()));
88
+ return {
89
+ mappingSize: this.config.dataStoreMapSizeKB,
90
+ numItems: sizes.reduce((prev, curr)=>prev + curr.numItems, 0),
91
+ actualSize: sizes.reduce((prev, curr)=>prev + curr.actualSize, 0)
92
+ };
93
+ }
94
+ static async new(config, client = getTelemetryClient(), logger = createLogger('prover-client:proving-broker-database')) {
95
+ const epochs = new Map();
96
+ const files = await readdir(config.dataDirectory, {
97
+ recursive: false,
98
+ withFileTypes: true
99
+ });
100
+ for (const file of files){
101
+ if (!file.isDirectory()) {
102
+ continue;
103
+ }
104
+ const fullDirectory = join(config.dataDirectory, file.name);
105
+ const epochDirectory = file.name;
106
+ const epochNumber = parseInt(epochDirectory, 10);
107
+ if (!Number.isSafeInteger(epochNumber) || epochNumber < 0) {
108
+ logger.warn(`Found invalid epoch directory ${fullDirectory} when loading epoch databases, ignoring`);
109
+ continue;
110
+ }
111
+ logger.info(`Loading broker database for epoch ${epochNumber} from ${fullDirectory} with map size ${config.dataStoreMapSizeKB}KB`);
112
+ const db = await openVersionedStoreAt(fullDirectory, SingleEpochDatabase.SCHEMA_VERSION, config.l1Contracts.rollupAddress, config.dataStoreMapSizeKB);
113
+ const epochDb = new SingleEpochDatabase(db);
114
+ epochs.set(epochNumber, epochDb);
115
+ }
116
+ const db = new KVBrokerDatabase(epochs, config, client, logger);
117
+ db.start();
118
+ return db;
119
+ }
120
+ start() {
121
+ this.batchQueue.start();
122
+ }
123
+ async close() {
124
+ await this.batchQueue.stop();
125
+ for (const [_, v] of this.epochs){
126
+ await v.close();
127
+ }
128
+ }
129
+ async deleteAllProvingJobsOlderThanEpoch(epochNumber) {
130
+ const oldEpochs = Array.from(this.epochs.keys()).filter((e)=>e < epochNumber);
131
+ for (const old of oldEpochs){
132
+ const db = this.epochs.get(old);
133
+ if (!db) {
134
+ continue;
135
+ }
136
+ this.logger.info(`Deleting broker database for epoch ${old}`);
137
+ await db.delete();
138
+ this.epochs.delete(old);
139
+ }
140
+ }
141
+ addProvingJob(job) {
142
+ return this.batchQueue.put(job, job.epochNumber);
143
+ }
144
+ async *allProvingJobs() {
145
+ const iterators = Array.from(this.epochs.values()).map((x)=>x.allProvingJobs());
146
+ for (const it of iterators){
147
+ yield* it;
148
+ }
149
+ }
150
+ setProvingJobError(id, reason) {
151
+ return this.batchQueue.put([
152
+ id,
153
+ {
154
+ status: 'rejected',
155
+ reason
156
+ }
157
+ ], getEpochFromProvingJobId(id));
158
+ }
159
+ setProvingJobResult(id, value) {
160
+ return this.batchQueue.put([
161
+ id,
162
+ {
163
+ status: 'fulfilled',
164
+ value
165
+ }
166
+ ], getEpochFromProvingJobId(id));
167
+ }
168
+ async getEpochDatabase(epochNumber) {
169
+ let epochDb = this.epochs.get(epochNumber);
170
+ if (!epochDb) {
171
+ const newEpochDirectory = join(this.config.dataDirectory, epochNumber.toString());
172
+ await mkdir(newEpochDirectory, {
173
+ recursive: true
174
+ });
175
+ this.logger.info(`Creating broker database for epoch ${epochNumber} at ${newEpochDirectory} with map size ${this.config.dataStoreMapSizeKB}`);
176
+ const db = await openVersionedStoreAt(newEpochDirectory, SingleEpochDatabase.SCHEMA_VERSION, this.config.l1Contracts.rollupAddress, this.config.dataStoreMapSizeKB);
177
+ epochDb = new SingleEpochDatabase(db);
178
+ this.epochs.set(epochNumber, epochDb);
179
+ }
180
+ return epochDb;
181
+ }
182
+ }
@@ -0,0 +1,39 @@
1
+ import type { ProofUri, ProvingJob, ProvingJobId, ProvingJobSettledResult } from '@aztec/stdlib/interfaces/server';
2
+ /**
3
+ * A database for storing proof requests and their results
4
+ */
5
+ export interface ProvingBrokerDatabase {
6
+ /**
7
+ * Saves a proof request so it can be retrieved later
8
+ * @param job - The proof request to save
9
+ */
10
+ addProvingJob(job: ProvingJob): Promise<void>;
11
+ /**
12
+ * Deletes all proving jobs belonging to epochs older than the given epoch
13
+ * @param epochNumber - The epoch number beyond which jobs should be deleted
14
+ */
15
+ deleteAllProvingJobsOlderThanEpoch(epochNumber: number): Promise<void>;
16
+ /**
17
+ * Returns an iterator over all saved proving jobs
18
+ */
19
+ allProvingJobs(): AsyncIterableIterator<[ProvingJob, ProvingJobSettledResult | undefined]>;
20
+ /**
21
+ * Saves the result of a proof request
22
+ * @param id - The ID of the proof request to save the result for
23
+ * @param ProvingRequestType - The type of proof that was requested
24
+ * @param value - The result of the proof request
25
+ */
26
+ setProvingJobResult(id: ProvingJobId, value: ProofUri): Promise<void>;
27
+ /**
28
+ * Saves an error that occurred while processing a proof request
29
+ * @param id - The ID of the proof request to save the error for
30
+ * @param ProvingRequestType - The type of proof that was requested
31
+ * @param err - The error that occurred while processing the proof request
32
+ */
33
+ setProvingJobError(id: ProvingJobId, err: string): Promise<void>;
34
+ /**
35
+ * Closes the database
36
+ */
37
+ close(): Promise<void>;
38
+ }
39
+ //# sourceMappingURL=proving_broker_database.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proving_broker_database.d.ts","sourceRoot":"","sources":["../../src/proving_broker/proving_broker_database.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,YAAY,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAEnH;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC;;;OAGG;IACH,aAAa,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE9C;;;OAGG;IACH,kCAAkC,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvE;;OAEG;IACH,cAAc,IAAI,qBAAqB,CAAC,CAAC,UAAU,EAAE,uBAAuB,GAAG,SAAS,CAAC,CAAC,CAAC;IAE3F;;;;;OAKG;IACH,mBAAmB,CAAC,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEtE;;;;;OAKG;IACH,kBAAkB,CAAC,EAAE,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjE;;OAEG;IACH,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB"}
@@ -0,0 +1,3 @@
1
+ /**
2
+ * A database for storing proof requests and their results
3
+ */ export { };
@@ -0,0 +1,29 @@
1
+ import type { Timer } from '@aztec/foundation/timer';
2
+ import { ProvingRequestType } from '@aztec/stdlib/proofs';
3
+ import { type TelemetryClient } from '@aztec/telemetry-client';
4
+ export type MonitorCallback = (proofType: ProvingRequestType) => number;
5
+ export declare class ProvingBrokerInstrumentation {
6
+ private queueSize;
7
+ private activeJobs;
8
+ private resolvedJobs;
9
+ private rejectedJobs;
10
+ private timedOutJobs;
11
+ private cachedJobs;
12
+ private totalJobs;
13
+ private jobWait;
14
+ private jobDuration;
15
+ private retriedJobs;
16
+ constructor(client: TelemetryClient, name?: string);
17
+ monitorQueueDepth(fn: MonitorCallback): void;
18
+ monitorActiveJobs(fn: MonitorCallback): void;
19
+ incResolvedJobs(proofType: ProvingRequestType): void;
20
+ incRejectedJobs(proofType: ProvingRequestType): void;
21
+ incRetriedJobs(proofType: ProvingRequestType): void;
22
+ incTimedOutJobs(proofType: ProvingRequestType): void;
23
+ incCachedJobs(proofType: ProvingRequestType): void;
24
+ incTotalJobs(proofType: ProvingRequestType): void;
25
+ recordJobWait(proofType: ProvingRequestType, msOrTimer: Timer | number): void;
26
+ recordJobDuration(proofType: ProvingRequestType, msOrTimer: Timer | number): void;
27
+ private observe;
28
+ }
29
+ //# sourceMappingURL=proving_broker_instrumentation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proving_broker_instrumentation.d.ts","sourceRoot":"","sources":["../../src/proving_broker/proving_broker_instrumentation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAML,KAAK,eAAe,EAGrB,MAAM,yBAAyB,CAAC;AAEjC,MAAM,MAAM,eAAe,GAAG,CAAC,SAAS,EAAE,kBAAkB,KAAK,MAAM,CAAC;AAExE,qBAAa,4BAA4B;IACvC,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,UAAU,CAAkB;IACpC,OAAO,CAAC,YAAY,CAAgB;IACpC,OAAO,CAAC,YAAY,CAAgB;IACpC,OAAO,CAAC,YAAY,CAAgB;IACpC,OAAO,CAAC,UAAU,CAAgB;IAClC,OAAO,CAAC,SAAS,CAAgB;IACjC,OAAO,CAAC,OAAO,CAAY;IAC3B,OAAO,CAAC,WAAW,CAAY;IAC/B,OAAO,CAAC,WAAW,CAAgB;gBAEvB,MAAM,EAAE,eAAe,EAAE,IAAI,SAAkB;IAgD3D,iBAAiB,CAAC,EAAE,EAAE,eAAe;IAIrC,iBAAiB,CAAC,EAAE,EAAE,eAAe;IAIrC,eAAe,CAAC,SAAS,EAAE,kBAAkB;IAM7C,eAAe,CAAC,SAAS,EAAE,kBAAkB;IAM7C,cAAc,CAAC,SAAS,EAAE,kBAAkB;IAM5C,eAAe,CAAC,SAAS,EAAE,kBAAkB;IAM7C,aAAa,CAAC,SAAS,EAAE,kBAAkB;IAM3C,YAAY,CAAC,SAAS,EAAE,kBAAkB;IAM1C,aAAa,CAAC,SAAS,EAAE,kBAAkB,EAAE,SAAS,EAAE,KAAK,GAAG,MAAM;IAOtE,iBAAiB,CAAC,SAAS,EAAE,kBAAkB,EAAE,SAAS,EAAE,KAAK,GAAG,MAAM;IAO1E,OAAO,CAAC,OAAO;CAWhB"}
@@ -0,0 +1,110 @@
1
+ import { ProvingRequestType } from '@aztec/stdlib/proofs';
2
+ import { Attributes, Metrics, ValueType } from '@aztec/telemetry-client';
3
+ export class ProvingBrokerInstrumentation {
4
+ queueSize;
5
+ activeJobs;
6
+ resolvedJobs;
7
+ rejectedJobs;
8
+ timedOutJobs;
9
+ cachedJobs;
10
+ totalJobs;
11
+ jobWait;
12
+ jobDuration;
13
+ retriedJobs;
14
+ constructor(client, name = 'ProvingBroker'){
15
+ const meter = client.getMeter(name);
16
+ this.queueSize = meter.createObservableGauge(Metrics.PROVING_QUEUE_SIZE, {
17
+ valueType: ValueType.INT
18
+ });
19
+ this.activeJobs = meter.createObservableGauge(Metrics.PROVING_QUEUE_ACTIVE_JOBS, {
20
+ valueType: ValueType.INT
21
+ });
22
+ this.resolvedJobs = meter.createUpDownCounter(Metrics.PROVING_QUEUE_RESOLVED_JOBS, {
23
+ valueType: ValueType.INT
24
+ });
25
+ this.rejectedJobs = meter.createUpDownCounter(Metrics.PROVING_QUEUE_REJECTED_JOBS, {
26
+ valueType: ValueType.INT
27
+ });
28
+ this.retriedJobs = meter.createUpDownCounter(Metrics.PROVING_QUEUE_RETRIED_JOBS, {
29
+ valueType: ValueType.INT
30
+ });
31
+ this.timedOutJobs = meter.createUpDownCounter(Metrics.PROVING_QUEUE_TIMED_OUT_JOBS, {
32
+ valueType: ValueType.INT
33
+ });
34
+ this.cachedJobs = meter.createUpDownCounter(Metrics.PROVING_QUEUE_CACHED_JOBS, {
35
+ valueType: ValueType.INT
36
+ });
37
+ this.totalJobs = meter.createUpDownCounter(Metrics.PROVING_QUEUE_TOTAL_JOBS, {
38
+ valueType: ValueType.INT
39
+ });
40
+ this.jobWait = meter.createHistogram(Metrics.PROVING_QUEUE_JOB_WAIT, {
41
+ description: 'Records how long a job sits in the queue',
42
+ unit: 'ms',
43
+ valueType: ValueType.INT
44
+ });
45
+ this.jobDuration = meter.createHistogram(Metrics.PROVING_QUEUE_JOB_DURATION, {
46
+ description: 'Records how long a job takes to complete',
47
+ unit: 'ms',
48
+ valueType: ValueType.INT
49
+ });
50
+ }
51
+ monitorQueueDepth(fn) {
52
+ this.queueSize.addCallback((obs)=>this.observe(obs, fn));
53
+ }
54
+ monitorActiveJobs(fn) {
55
+ this.activeJobs.addCallback((obs)=>this.observe(obs, fn));
56
+ }
57
+ incResolvedJobs(proofType) {
58
+ this.resolvedJobs.add(1, {
59
+ [Attributes.PROVING_JOB_TYPE]: ProvingRequestType[proofType]
60
+ });
61
+ }
62
+ incRejectedJobs(proofType) {
63
+ this.rejectedJobs.add(1, {
64
+ [Attributes.PROVING_JOB_TYPE]: ProvingRequestType[proofType]
65
+ });
66
+ }
67
+ incRetriedJobs(proofType) {
68
+ this.retriedJobs.add(1, {
69
+ [Attributes.PROVING_JOB_TYPE]: ProvingRequestType[proofType]
70
+ });
71
+ }
72
+ incTimedOutJobs(proofType) {
73
+ this.timedOutJobs.add(1, {
74
+ [Attributes.PROVING_JOB_TYPE]: ProvingRequestType[proofType]
75
+ });
76
+ }
77
+ incCachedJobs(proofType) {
78
+ this.cachedJobs.add(1, {
79
+ [Attributes.PROVING_JOB_TYPE]: ProvingRequestType[proofType]
80
+ });
81
+ }
82
+ incTotalJobs(proofType) {
83
+ this.totalJobs.add(1, {
84
+ [Attributes.PROVING_JOB_TYPE]: ProvingRequestType[proofType]
85
+ });
86
+ }
87
+ recordJobWait(proofType, msOrTimer) {
88
+ const duration = typeof msOrTimer === 'number' ? msOrTimer : Math.floor(msOrTimer.ms());
89
+ this.jobWait.record(duration, {
90
+ [Attributes.PROVING_JOB_TYPE]: ProvingRequestType[proofType]
91
+ });
92
+ }
93
+ recordJobDuration(proofType, msOrTimer) {
94
+ const duration = typeof msOrTimer === 'number' ? msOrTimer : Math.floor(msOrTimer.ms());
95
+ this.jobDuration.record(duration, {
96
+ [Attributes.PROVING_JOB_TYPE]: ProvingRequestType[proofType]
97
+ });
98
+ }
99
+ observe(obs, fn) {
100
+ for (const proofType of Object.values(ProvingRequestType)){
101
+ // a type predicate for TypeScript to recognize that we're only iterating over enum values
102
+ if (typeof proofType !== 'number') {
103
+ continue;
104
+ }
105
+ obs.observe(fn(proofType), {
106
+ [Attributes.PROVING_JOB_TYPE]: ProvingRequestType[proofType]
107
+ });
108
+ }
109
+ }
110
+ }
@@ -0,0 +1,33 @@
1
+ import type { ProvingJobId, ProvingJobInputs, ProvingJobResultsMap, ServerCircuitProver } from '@aztec/stdlib/interfaces/server';
2
+ import { ProvingRequestType } from '@aztec/stdlib/proofs';
3
+ export declare enum ProvingJobControllerStatus {
4
+ IDLE = "idle",
5
+ PROVING = "proving",
6
+ DONE = "done",
7
+ ABORTED = "aborted"
8
+ }
9
+ interface ProvingJobCompletionCallback<T extends ProvingRequestType = ProvingRequestType> {
10
+ (jobId: ProvingJobId, type: T, error: Error | undefined, result: ProvingJobResultsMap[T] | undefined): void | Promise<void>;
11
+ }
12
+ export declare class ProvingJobController {
13
+ private jobId;
14
+ private inputs;
15
+ private epochNumber;
16
+ private startedAt;
17
+ private circuitProver;
18
+ private onComplete;
19
+ private log;
20
+ private status;
21
+ private promise?;
22
+ private abortController;
23
+ constructor(jobId: ProvingJobId, inputs: ProvingJobInputs, epochNumber: number, startedAt: number, circuitProver: ServerCircuitProver, onComplete: ProvingJobCompletionCallback, log?: import("@aztec/foundation/log").Logger);
24
+ start(): void;
25
+ getStatus(): ProvingJobControllerStatus;
26
+ abort(): void;
27
+ getJobId(): ProvingJobId;
28
+ getStartedAt(): number;
29
+ getProofTypeName(): string;
30
+ private generateProof;
31
+ }
32
+ export {};
33
+ //# sourceMappingURL=proving_job_controller.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proving_job_controller.d.ts","sourceRoot":"","sources":["../../src/proving_broker/proving_job_controller.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,YAAY,EACZ,gBAAgB,EAChB,oBAAoB,EACpB,mBAAmB,EACpB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,oBAAY,0BAA0B;IACpC,IAAI,SAAS;IACb,OAAO,YAAY;IACnB,IAAI,SAAS;IACb,OAAO,YAAY;CACpB;AAED,UAAU,4BAA4B,CAAC,CAAC,SAAS,kBAAkB,GAAG,kBAAkB;IACtF,CACE,KAAK,EAAE,YAAY,EACnB,IAAI,EAAE,CAAC,EACP,KAAK,EAAE,KAAK,GAAG,SAAS,EACxB,MAAM,EAAE,oBAAoB,CAAC,CAAC,CAAC,GAAG,SAAS,GAC1C,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACzB;AAED,qBAAa,oBAAoB;IAM7B,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,WAAW;IACnB,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,GAAG;IAXb,OAAO,CAAC,MAAM,CAA+D;IAC7E,OAAO,CAAC,OAAO,CAAC,CAAgB;IAChC,OAAO,CAAC,eAAe,CAAyB;gBAGtC,KAAK,EAAE,YAAY,EACnB,MAAM,EAAE,gBAAgB,EACxB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,mBAAmB,EAClC,UAAU,EAAE,4BAA4B,EACxC,GAAG,yCAA6D;IAGnE,KAAK,IAAI,IAAI;IA+Db,SAAS,IAAI,0BAA0B;IAIvC,KAAK,IAAI,IAAI;IAgBb,QAAQ,IAAI,YAAY;IAIxB,YAAY,IAAI,MAAM;IAItB,gBAAgB,IAAI,MAAM;YAInB,aAAa;CA0D5B"}
@@ -0,0 +1,166 @@
1
+ import { createLogger } from '@aztec/foundation/log';
2
+ import { ProvingRequestType } from '@aztec/stdlib/proofs';
3
+ export var ProvingJobControllerStatus = /*#__PURE__*/ function(ProvingJobControllerStatus) {
4
+ ProvingJobControllerStatus["IDLE"] = "idle";
5
+ ProvingJobControllerStatus["PROVING"] = "proving";
6
+ ProvingJobControllerStatus["DONE"] = "done";
7
+ ProvingJobControllerStatus["ABORTED"] = "aborted";
8
+ return ProvingJobControllerStatus;
9
+ }({});
10
+ export class ProvingJobController {
11
+ jobId;
12
+ inputs;
13
+ epochNumber;
14
+ startedAt;
15
+ circuitProver;
16
+ onComplete;
17
+ log;
18
+ status;
19
+ promise;
20
+ abortController;
21
+ constructor(jobId, inputs, epochNumber, startedAt, circuitProver, onComplete, log = createLogger('prover-client:proving-agent:job-controller')){
22
+ this.jobId = jobId;
23
+ this.inputs = inputs;
24
+ this.epochNumber = epochNumber;
25
+ this.startedAt = startedAt;
26
+ this.circuitProver = circuitProver;
27
+ this.onComplete = onComplete;
28
+ this.log = log;
29
+ this.status = "idle";
30
+ this.abortController = new AbortController();
31
+ }
32
+ start() {
33
+ if (this.status !== "idle") {
34
+ this.log.verbose(`Job controller for jobId=${this.jobId} not starting because it is not idle currentStatus=${this.status}`, {
35
+ currentStatus: this.status,
36
+ jobId: this.jobId
37
+ });
38
+ return;
39
+ }
40
+ this.status = "proving";
41
+ this.log.verbose(`Job controller started jobId=${this.jobId}`, {
42
+ jobId: this.jobId
43
+ });
44
+ this.promise = this.generateProof().then((result)=>{
45
+ if (this.status === "aborted") {
46
+ this.log.warn(`Job controller for jobId=${this.jobId} completed successfully but job was aborted`, {
47
+ currentStatus: this.status,
48
+ jobId: this.jobId
49
+ });
50
+ return;
51
+ }
52
+ this.status = "done";
53
+ this.log.verbose(`Job controller for jobId=${this.jobId} completed successfully`, {
54
+ jobId: this.jobId
55
+ });
56
+ return this.onComplete(this.jobId, this.inputs.type, undefined, result);
57
+ }, (error)=>{
58
+ if (this.status === "aborted") {
59
+ this.log.warn(`Job controller for jobId=${this.jobId} finished with an error but job was aborted`, {
60
+ currentStatus: this.status,
61
+ jobId: this.jobId
62
+ });
63
+ return;
64
+ }
65
+ if (error.name === 'AbortError') {
66
+ // Ignore abort errors
67
+ return;
68
+ }
69
+ this.log.verbose(`Job controller for jobId=${this.jobId} finished with an error`, {
70
+ jobId: this.jobId,
71
+ err: error
72
+ });
73
+ this.status = "done";
74
+ return this.onComplete(this.jobId, this.inputs.type, error, undefined);
75
+ }).catch((err)=>{
76
+ this.log.error(`Job constroller failed to send result for jobId=${this.jobId}: ${err}`, err, {
77
+ jobId: this.jobId
78
+ });
79
+ });
80
+ }
81
+ getStatus() {
82
+ return this.status;
83
+ }
84
+ abort() {
85
+ if (this.status !== "proving") {
86
+ this.log.warn(`Tried to abort job controller for jobId=${this.jobId} but it is not running`, {
87
+ currentStatus: this.status,
88
+ jobId: this.jobId
89
+ });
90
+ return;
91
+ }
92
+ this.status = "aborted";
93
+ this.abortController.abort();
94
+ this.log.verbose(`Aborted job controller for jobId=${this.jobId}`, {
95
+ jobId: this.jobId
96
+ });
97
+ }
98
+ getJobId() {
99
+ return this.jobId;
100
+ }
101
+ getStartedAt() {
102
+ return this.startedAt;
103
+ }
104
+ getProofTypeName() {
105
+ return ProvingRequestType[this.inputs.type];
106
+ }
107
+ async generateProof() {
108
+ const { type, inputs } = this.inputs;
109
+ const signal = this.abortController.signal;
110
+ switch(type){
111
+ case ProvingRequestType.PUBLIC_VM:
112
+ {
113
+ return await this.circuitProver.getAvmProof(inputs, signal, this.epochNumber);
114
+ }
115
+ case ProvingRequestType.PRIVATE_BASE_ROLLUP:
116
+ {
117
+ return await this.circuitProver.getPrivateBaseRollupProof(inputs, signal, this.epochNumber);
118
+ }
119
+ case ProvingRequestType.PUBLIC_BASE_ROLLUP:
120
+ {
121
+ return await this.circuitProver.getPublicBaseRollupProof(inputs, signal, this.epochNumber);
122
+ }
123
+ case ProvingRequestType.MERGE_ROLLUP:
124
+ {
125
+ return await this.circuitProver.getMergeRollupProof(inputs, signal, this.epochNumber);
126
+ }
127
+ case ProvingRequestType.EMPTY_BLOCK_ROOT_ROLLUP:
128
+ {
129
+ return await this.circuitProver.getEmptyBlockRootRollupProof(inputs, signal, this.epochNumber);
130
+ }
131
+ case ProvingRequestType.BLOCK_ROOT_ROLLUP:
132
+ {
133
+ return await this.circuitProver.getBlockRootRollupProof(inputs, signal, this.epochNumber);
134
+ }
135
+ case ProvingRequestType.SINGLE_TX_BLOCK_ROOT_ROLLUP:
136
+ {
137
+ return await this.circuitProver.getSingleTxBlockRootRollupProof(inputs, signal, this.epochNumber);
138
+ }
139
+ case ProvingRequestType.BLOCK_MERGE_ROLLUP:
140
+ {
141
+ return await this.circuitProver.getBlockMergeRollupProof(inputs, signal, this.epochNumber);
142
+ }
143
+ case ProvingRequestType.ROOT_ROLLUP:
144
+ {
145
+ return await this.circuitProver.getRootRollupProof(inputs, signal, this.epochNumber);
146
+ }
147
+ case ProvingRequestType.BASE_PARITY:
148
+ {
149
+ return await this.circuitProver.getBaseParityProof(inputs, signal, this.epochNumber);
150
+ }
151
+ case ProvingRequestType.ROOT_PARITY:
152
+ {
153
+ return await this.circuitProver.getRootParityProof(inputs, signal, this.epochNumber);
154
+ }
155
+ case ProvingRequestType.TUBE_PROOF:
156
+ {
157
+ return await this.circuitProver.getTubeProof(inputs, signal, this.epochNumber);
158
+ }
159
+ default:
160
+ {
161
+ const _exhaustive = type;
162
+ return Promise.reject(new Error(`Invalid proof request type: ${type}`));
163
+ }
164
+ }
165
+ }
166
+ }
@@ -0,0 +1,27 @@
1
+ import type { SafeJsonRpcServer } from '@aztec/foundation/json-rpc/server';
2
+ import { type ProvingJobBroker, type ProvingJobConsumer, type ProvingJobProducer } from '@aztec/stdlib/interfaces/server';
3
+ import { type ApiSchemaFor } from '@aztec/stdlib/schemas';
4
+ import { type ComponentsVersions } from '@aztec/stdlib/versioning';
5
+ export declare const ProvingJobProducerSchema: ApiSchemaFor<ProvingJobProducer>;
6
+ export declare const ProvingJobConsumerSchema: ApiSchemaFor<ProvingJobConsumer>;
7
+ export declare const ProvingJobBrokerSchema: ApiSchemaFor<ProvingJobBroker>;
8
+ export declare function createProvingBrokerServer(broker: ProvingJobBroker): SafeJsonRpcServer;
9
+ export declare function createProvingJobBrokerClient(url: string, versions: Partial<ComponentsVersions>, fetch?: (host: string, rpcMethod: string, body: any, useApiEndpoints: boolean, extraHeaders?: Record<string, string> | undefined, noRetry?: boolean | undefined) => Promise<{
10
+ response: any;
11
+ headers: {
12
+ get: (header: string) => string | null | undefined;
13
+ };
14
+ }>): ProvingJobBroker;
15
+ export declare function createProvingJobProducerClient(url: string, versions: Partial<ComponentsVersions>, fetch?: (host: string, rpcMethod: string, body: any, useApiEndpoints: boolean, extraHeaders?: Record<string, string> | undefined, noRetry?: boolean | undefined) => Promise<{
16
+ response: any;
17
+ headers: {
18
+ get: (header: string) => string | null | undefined;
19
+ };
20
+ }>): ProvingJobProducer;
21
+ export declare function createProvingJobConsumerClient(url: string, versions: Partial<ComponentsVersions>, fetch?: (host: string, rpcMethod: string, body: any, useApiEndpoints: boolean, extraHeaders?: Record<string, string> | undefined, noRetry?: boolean | undefined) => Promise<{
22
+ response: any;
23
+ headers: {
24
+ get: (header: string) => string | null | undefined;
25
+ };
26
+ }>): ProvingJobConsumer;
27
+ //# sourceMappingURL=rpc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rpc.d.ts","sourceRoot":"","sources":["../../src/proving_broker/rpc.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAC3E,OAAO,EAIL,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EAEvB,KAAK,kBAAkB,EAExB,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EAAE,KAAK,YAAY,EAAY,MAAM,uBAAuB,CAAC;AACpE,OAAO,EAAE,KAAK,kBAAkB,EAAgC,MAAM,0BAA0B,CAAC;AAcjG,eAAO,MAAM,wBAAwB,EAAE,YAAY,CAAC,kBAAkB,CAKrE,CAAC;AAEF,eAAO,MAAM,wBAAwB,EAAE,YAAY,CAAC,kBAAkB,CAcrE,CAAC;AAEF,eAAO,MAAM,sBAAsB,EAAE,YAAY,CAAC,gBAAgB,CAGjE,CAAC;AAEF,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,gBAAgB,GAAG,iBAAiB,CAErF;AAED,wBAAgB,4BAA4B,CAC1C,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,OAAO,CAAC,kBAAkB,CAAC,EACrC,KAAK;;;;;EAAoC,GACxC,gBAAgB,CAMlB;AAED,wBAAgB,8BAA8B,CAC5C,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,OAAO,CAAC,kBAAkB,CAAC,EACrC,KAAK;;;;;EAAoC,GACxC,kBAAkB,CAMpB;AAED,wBAAgB,8BAA8B,CAC5C,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,OAAO,CAAC,kBAAkB,CAAC,EACrC,KAAK;;;;;EAAoC,GACxC,kBAAkB,CAMpB"}