@aztec/prover-client 0.0.0-test.0 → 0.0.1-commit.001888fc
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 +8 -8
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +12 -2
- package/dest/index.d.ts +1 -1
- package/dest/light/index.d.ts +2 -0
- package/dest/light/index.d.ts.map +1 -0
- package/dest/light/index.js +1 -0
- package/dest/light/lightweight_checkpoint_builder.d.ts +52 -0
- package/dest/light/lightweight_checkpoint_builder.d.ts.map +1 -0
- package/dest/light/lightweight_checkpoint_builder.js +223 -0
- package/dest/mocks/fixtures.d.ts +8 -8
- package/dest/mocks/fixtures.d.ts.map +1 -1
- package/dest/mocks/fixtures.js +36 -17
- package/dest/mocks/test_context.d.ts +43 -32
- package/dest/mocks/test_context.d.ts.map +1 -1
- package/dest/mocks/test_context.js +152 -87
- package/dest/orchestrator/block-building-helpers.d.ts +36 -29
- package/dest/orchestrator/block-building-helpers.d.ts.map +1 -1
- package/dest/orchestrator/block-building-helpers.js +170 -189
- package/dest/orchestrator/block-proving-state.d.ts +73 -48
- package/dest/orchestrator/block-proving-state.d.ts.map +1 -1
- package/dest/orchestrator/block-proving-state.js +289 -177
- package/dest/orchestrator/checkpoint-proving-state.d.ts +76 -0
- package/dest/orchestrator/checkpoint-proving-state.d.ts.map +1 -0
- package/dest/orchestrator/checkpoint-proving-state.js +243 -0
- package/dest/orchestrator/epoch-proving-state.d.ts +43 -28
- package/dest/orchestrator/epoch-proving-state.d.ts.map +1 -1
- package/dest/orchestrator/epoch-proving-state.js +179 -73
- package/dest/orchestrator/index.d.ts +1 -1
- package/dest/orchestrator/orchestrator.d.ts +55 -35
- package/dest/orchestrator/orchestrator.d.ts.map +1 -1
- package/dest/orchestrator/orchestrator.js +874 -314
- package/dest/orchestrator/orchestrator_metrics.d.ts +1 -1
- package/dest/orchestrator/orchestrator_metrics.d.ts.map +1 -1
- package/dest/orchestrator/orchestrator_metrics.js +2 -6
- package/dest/orchestrator/tx-proving-state.d.ts +15 -12
- package/dest/orchestrator/tx-proving-state.d.ts.map +1 -1
- package/dest/orchestrator/tx-proving-state.js +27 -44
- package/dest/prover-client/factory.d.ts +3 -3
- package/dest/prover-client/factory.d.ts.map +1 -1
- package/dest/prover-client/index.d.ts +1 -1
- package/dest/prover-client/prover-client.d.ts +8 -8
- package/dest/prover-client/prover-client.d.ts.map +1 -1
- package/dest/prover-client/prover-client.js +19 -13
- package/dest/prover-client/server-epoch-prover.d.ts +16 -12
- package/dest/prover-client/server-epoch-prover.d.ts.map +1 -1
- package/dest/prover-client/server-epoch-prover.js +11 -11
- package/dest/proving_broker/broker_prover_facade.d.ts +28 -19
- package/dest/proving_broker/broker_prover_facade.d.ts.map +1 -1
- package/dest/proving_broker/broker_prover_facade.js +64 -45
- package/dest/proving_broker/config.d.ts +32 -11
- package/dest/proving_broker/config.d.ts.map +1 -1
- package/dest/proving_broker/config.js +42 -8
- package/dest/proving_broker/factory.d.ts +2 -2
- package/dest/proving_broker/factory.d.ts.map +1 -1
- package/dest/proving_broker/factory.js +5 -1
- package/dest/proving_broker/fixtures.d.ts +3 -2
- package/dest/proving_broker/fixtures.d.ts.map +1 -1
- package/dest/proving_broker/fixtures.js +3 -2
- package/dest/proving_broker/index.d.ts +1 -1
- package/dest/proving_broker/proof_store/factory.d.ts +2 -5
- package/dest/proving_broker/proof_store/factory.d.ts.map +1 -1
- package/dest/proving_broker/proof_store/factory.js +7 -30
- package/dest/proving_broker/proof_store/file_store_proof_store.d.ts +18 -0
- package/dest/proving_broker/proof_store/file_store_proof_store.d.ts.map +1 -0
- package/dest/proving_broker/proof_store/file_store_proof_store.js +60 -0
- package/dest/proving_broker/proof_store/index.d.ts +2 -1
- package/dest/proving_broker/proof_store/index.d.ts.map +1 -1
- package/dest/proving_broker/proof_store/index.js +1 -0
- package/dest/proving_broker/proof_store/inline_proof_store.d.ts +1 -1
- package/dest/proving_broker/proof_store/inline_proof_store.d.ts.map +1 -1
- package/dest/proving_broker/proof_store/proof_store.d.ts +1 -1
- package/dest/proving_broker/proving_agent.d.ts +8 -12
- package/dest/proving_broker/proving_agent.d.ts.map +1 -1
- package/dest/proving_broker/proving_agent.js +86 -65
- package/dest/proving_broker/proving_broker.d.ts +17 -5
- package/dest/proving_broker/proving_broker.d.ts.map +1 -1
- package/dest/proving_broker/proving_broker.js +76 -37
- package/dest/proving_broker/proving_broker_database/memory.d.ts +3 -2
- package/dest/proving_broker/proving_broker_database/memory.d.ts.map +1 -1
- package/dest/proving_broker/proving_broker_database/memory.js +1 -1
- package/dest/proving_broker/proving_broker_database/persisted.d.ts +5 -3
- package/dest/proving_broker/proving_broker_database/persisted.d.ts.map +1 -1
- package/dest/proving_broker/proving_broker_database/persisted.js +401 -11
- package/dest/proving_broker/proving_broker_database.d.ts +3 -2
- package/dest/proving_broker/proving_broker_database.d.ts.map +1 -1
- package/dest/proving_broker/proving_broker_instrumentation.d.ts +3 -1
- package/dest/proving_broker/proving_broker_instrumentation.d.ts.map +1 -1
- package/dest/proving_broker/proving_broker_instrumentation.js +22 -35
- package/dest/proving_broker/proving_job_controller.d.ts +11 -10
- package/dest/proving_broker/proving_job_controller.d.ts.map +1 -1
- package/dest/proving_broker/proving_job_controller.js +92 -62
- package/dest/proving_broker/rpc.d.ts +7 -7
- package/dest/proving_broker/rpc.d.ts.map +1 -1
- package/dest/proving_broker/rpc.js +9 -4
- package/dest/test/mock_proof_store.d.ts +9 -0
- package/dest/test/mock_proof_store.d.ts.map +1 -0
- package/dest/test/mock_proof_store.js +10 -0
- package/dest/test/mock_prover.d.ts +23 -17
- package/dest/test/mock_prover.d.ts.map +1 -1
- package/dest/test/mock_prover.js +38 -20
- package/package.json +34 -33
- package/src/config.ts +25 -9
- package/src/light/index.ts +1 -0
- package/src/light/lightweight_checkpoint_builder.ts +312 -0
- package/src/mocks/fixtures.ts +46 -40
- package/src/mocks/test_context.ts +223 -116
- package/src/orchestrator/block-building-helpers.ts +258 -334
- package/src/orchestrator/block-proving-state.ts +334 -231
- package/src/orchestrator/checkpoint-proving-state.ts +349 -0
- package/src/orchestrator/epoch-proving-state.ts +239 -111
- package/src/orchestrator/orchestrator.ts +674 -355
- package/src/orchestrator/orchestrator_metrics.ts +2 -6
- package/src/orchestrator/tx-proving-state.ts +48 -66
- package/src/prover-client/factory.ts +6 -2
- package/src/prover-client/prover-client.ts +49 -38
- package/src/prover-client/server-epoch-prover.ts +40 -22
- package/src/proving_broker/broker_prover_facade.ts +219 -133
- package/src/proving_broker/config.ts +48 -8
- package/src/proving_broker/factory.ts +2 -1
- package/src/proving_broker/fixtures.ts +8 -3
- package/src/proving_broker/proof_store/factory.ts +10 -32
- package/src/proving_broker/proof_store/file_store_proof_store.ts +78 -0
- package/src/proving_broker/proof_store/index.ts +1 -0
- package/src/proving_broker/proof_store/inline_proof_store.ts +1 -1
- package/src/proving_broker/proving_agent.ts +95 -66
- package/src/proving_broker/proving_broker.ts +94 -44
- package/src/proving_broker/proving_broker_database/memory.ts +3 -2
- package/src/proving_broker/proving_broker_database/persisted.ts +29 -13
- package/src/proving_broker/proving_broker_database.ts +2 -1
- package/src/proving_broker/proving_broker_instrumentation.ts +23 -35
- package/src/proving_broker/proving_job_controller.ts +100 -83
- package/src/proving_broker/rpc.ts +14 -5
- package/src/test/mock_proof_store.ts +14 -0
- package/src/test/mock_prover.ts +156 -64
- package/dest/bin/get-proof-inputs.d.ts +0 -2
- package/dest/bin/get-proof-inputs.d.ts.map +0 -1
- package/dest/bin/get-proof-inputs.js +0 -51
- package/dest/block_builder/index.d.ts +0 -6
- package/dest/block_builder/index.d.ts.map +0 -1
- package/dest/block_builder/index.js +0 -1
- package/dest/block_builder/light.d.ts +0 -33
- package/dest/block_builder/light.d.ts.map +0 -1
- package/dest/block_builder/light.js +0 -82
- package/dest/proving_broker/proof_store/gcs_proof_store.d.ts +0 -14
- package/dest/proving_broker/proof_store/gcs_proof_store.d.ts.map +0 -1
- package/dest/proving_broker/proof_store/gcs_proof_store.js +0 -51
- package/dest/proving_broker/proving_agent_instrumentation.d.ts +0 -8
- package/dest/proving_broker/proving_agent_instrumentation.d.ts.map +0 -1
- package/dest/proving_broker/proving_agent_instrumentation.js +0 -16
- package/src/bin/get-proof-inputs.ts +0 -59
- package/src/block_builder/index.ts +0 -6
- package/src/block_builder/light.ts +0 -101
- package/src/proving_broker/proof_store/gcs_proof_store.ts +0 -72
- package/src/proving_broker/proving_agent_instrumentation.ts +0 -21
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { EpochNumber } from '@aztec/foundation/branded-types';
|
|
1
2
|
import {
|
|
2
3
|
type ProofUri,
|
|
3
4
|
type ProvingJob,
|
|
@@ -43,7 +44,7 @@ export class InMemoryBrokerDatabase implements ProvingBrokerDatabase {
|
|
|
43
44
|
return Promise.resolve();
|
|
44
45
|
}
|
|
45
46
|
|
|
46
|
-
deleteAllProvingJobsOlderThanEpoch(epochNumber:
|
|
47
|
+
deleteAllProvingJobsOlderThanEpoch(epochNumber: EpochNumber): Promise<void> {
|
|
47
48
|
const toDelete = [
|
|
48
49
|
...Array.from(this.jobs.keys()).filter(x => getEpochFromProvingJobId(x) < epochNumber),
|
|
49
50
|
...Array.from(this.results.keys()).filter(x => getEpochFromProvingJobId(x) < epochNumber),
|
|
@@ -52,7 +53,7 @@ export class InMemoryBrokerDatabase implements ProvingBrokerDatabase {
|
|
|
52
53
|
}
|
|
53
54
|
|
|
54
55
|
async *allProvingJobs(): AsyncIterableIterator<[ProvingJob, ProvingJobSettledResult | undefined]> {
|
|
55
|
-
for
|
|
56
|
+
for (const item of this.jobs.values()) {
|
|
56
57
|
yield [item, this.results.get(item.id)] as const;
|
|
57
58
|
}
|
|
58
59
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { EpochNumber } from '@aztec/foundation/branded-types';
|
|
1
2
|
import { jsonParseWithSchema, jsonStringify } from '@aztec/foundation/json-rpc';
|
|
2
3
|
import { type Logger, createLogger } from '@aztec/foundation/log';
|
|
3
4
|
import { BatchQueue } from '@aztec/foundation/queue';
|
|
@@ -10,7 +11,14 @@ import {
|
|
|
10
11
|
ProvingJobSettledResult,
|
|
11
12
|
getEpochFromProvingJobId,
|
|
12
13
|
} from '@aztec/stdlib/interfaces/server';
|
|
13
|
-
import {
|
|
14
|
+
import {
|
|
15
|
+
Attributes,
|
|
16
|
+
LmdbMetrics,
|
|
17
|
+
type TelemetryClient,
|
|
18
|
+
type Tracer,
|
|
19
|
+
getTelemetryClient,
|
|
20
|
+
trackSpan,
|
|
21
|
+
} from '@aztec/telemetry-client';
|
|
14
22
|
|
|
15
23
|
import { mkdir, readdir } from 'fs/promises';
|
|
16
24
|
import { join } from 'path';
|
|
@@ -46,9 +54,9 @@ class SingleEpochDatabase {
|
|
|
46
54
|
|
|
47
55
|
async *allProvingJobs(): AsyncIterableIterator<[ProvingJob, ProvingJobSettledResult | undefined]> {
|
|
48
56
|
for await (const jobStr of this.jobs.valuesAsync()) {
|
|
49
|
-
const job =
|
|
57
|
+
const job = jsonParseWithSchema(jobStr, ProvingJob);
|
|
50
58
|
const resultStr = await this.jobResults.getAsync(job.id);
|
|
51
|
-
const result = resultStr ?
|
|
59
|
+
const result = resultStr ? jsonParseWithSchema(resultStr, ProvingJobSettledResult) : undefined;
|
|
52
60
|
yield [job, result];
|
|
53
61
|
}
|
|
54
62
|
}
|
|
@@ -77,6 +85,8 @@ export class KVBrokerDatabase implements ProvingBrokerDatabase {
|
|
|
77
85
|
|
|
78
86
|
private batchQueue: BatchQueue<ProvingJob | [ProvingJobId, ProvingJobSettledResult], number>;
|
|
79
87
|
|
|
88
|
+
public readonly tracer: Tracer;
|
|
89
|
+
|
|
80
90
|
private constructor(
|
|
81
91
|
private epochs: Map<number, SingleEpochDatabase>,
|
|
82
92
|
private config: ProverBrokerConfig,
|
|
@@ -91,6 +101,8 @@ export class KVBrokerDatabase implements ProvingBrokerDatabase {
|
|
|
91
101
|
() => this.estimateSize(),
|
|
92
102
|
);
|
|
93
103
|
|
|
104
|
+
this.tracer = client.getTracer('KVBrokerDatabase');
|
|
105
|
+
|
|
94
106
|
this.batchQueue = new BatchQueue(
|
|
95
107
|
(items, key) => this.commitWrites(items, key),
|
|
96
108
|
config.proverBrokerBatchSize,
|
|
@@ -104,14 +116,15 @@ export class KVBrokerDatabase implements ProvingBrokerDatabase {
|
|
|
104
116
|
const jobsToAdd = items.filter((item): item is ProvingJob => 'id' in item);
|
|
105
117
|
const resultsToAdd = items.filter((item): item is [ProvingJobId, ProvingJobSettledResult] => Array.isArray(item));
|
|
106
118
|
|
|
107
|
-
const db = await this.getEpochDatabase(epochNumber);
|
|
119
|
+
const db = await this.getEpochDatabase(EpochNumber(epochNumber));
|
|
108
120
|
await db.batchWrite(jobsToAdd, resultsToAdd);
|
|
109
121
|
}
|
|
110
122
|
|
|
111
123
|
private async estimateSize() {
|
|
112
124
|
const sizes = await Promise.all(Array.from(this.epochs.values()).map(x => x.estimateSize()));
|
|
113
125
|
return {
|
|
114
|
-
mappingSize: this.config.
|
|
126
|
+
mappingSize: this.config.dataStoreMapSizeKb,
|
|
127
|
+
physicalFileSize: sizes.reduce((prev, curr) => prev + curr.physicalFileSize, 0),
|
|
115
128
|
numItems: sizes.reduce((prev, curr) => prev + curr.numItems, 0),
|
|
116
129
|
actualSize: sizes.reduce((prev, curr) => prev + curr.actualSize, 0),
|
|
117
130
|
};
|
|
@@ -136,13 +149,13 @@ export class KVBrokerDatabase implements ProvingBrokerDatabase {
|
|
|
136
149
|
continue;
|
|
137
150
|
}
|
|
138
151
|
logger.info(
|
|
139
|
-
`Loading broker database for epoch ${epochNumber} from ${fullDirectory} with map size ${config.
|
|
152
|
+
`Loading broker database for epoch ${epochNumber} from ${fullDirectory} with map size ${config.dataStoreMapSizeKb}KB`,
|
|
140
153
|
);
|
|
141
154
|
const db = await openVersionedStoreAt(
|
|
142
155
|
fullDirectory,
|
|
143
156
|
SingleEpochDatabase.SCHEMA_VERSION,
|
|
144
157
|
config.l1Contracts.rollupAddress,
|
|
145
|
-
config.
|
|
158
|
+
config.dataStoreMapSizeKb,
|
|
146
159
|
);
|
|
147
160
|
const epochDb = new SingleEpochDatabase(db);
|
|
148
161
|
epochs.set(epochNumber, epochDb);
|
|
@@ -163,14 +176,17 @@ export class KVBrokerDatabase implements ProvingBrokerDatabase {
|
|
|
163
176
|
}
|
|
164
177
|
}
|
|
165
178
|
|
|
166
|
-
|
|
167
|
-
|
|
179
|
+
@trackSpan('KVBrokerDatabase.deleteAllProvingJobsOlderThanEpoch', epochNumber => ({
|
|
180
|
+
[Attributes.EPOCH_NUMBER]: epochNumber,
|
|
181
|
+
}))
|
|
182
|
+
async deleteAllProvingJobsOlderThanEpoch(epochNumber: EpochNumber): Promise<void> {
|
|
183
|
+
const oldEpochs = Array.from(this.epochs.keys()).filter(e => e < Number(epochNumber));
|
|
168
184
|
for (const old of oldEpochs) {
|
|
169
185
|
const db = this.epochs.get(old);
|
|
170
186
|
if (!db) {
|
|
171
187
|
continue;
|
|
172
188
|
}
|
|
173
|
-
this.logger.
|
|
189
|
+
this.logger.verbose(`Deleting broker database for epoch ${old}`);
|
|
174
190
|
await db.delete();
|
|
175
191
|
this.epochs.delete(old);
|
|
176
192
|
}
|
|
@@ -195,19 +211,19 @@ export class KVBrokerDatabase implements ProvingBrokerDatabase {
|
|
|
195
211
|
return this.batchQueue.put([id, { status: 'fulfilled', value }], getEpochFromProvingJobId(id));
|
|
196
212
|
}
|
|
197
213
|
|
|
198
|
-
private async getEpochDatabase(epochNumber:
|
|
214
|
+
private async getEpochDatabase(epochNumber: EpochNumber): Promise<SingleEpochDatabase> {
|
|
199
215
|
let epochDb = this.epochs.get(epochNumber);
|
|
200
216
|
if (!epochDb) {
|
|
201
217
|
const newEpochDirectory = join(this.config.dataDirectory!, epochNumber.toString());
|
|
202
218
|
await mkdir(newEpochDirectory, { recursive: true });
|
|
203
219
|
this.logger.info(
|
|
204
|
-
`Creating broker database for epoch ${epochNumber} at ${newEpochDirectory} with map size ${this.config.
|
|
220
|
+
`Creating broker database for epoch ${epochNumber} at ${newEpochDirectory} with map size ${this.config.dataStoreMapSizeKb}`,
|
|
205
221
|
);
|
|
206
222
|
const db = await openVersionedStoreAt(
|
|
207
223
|
newEpochDirectory,
|
|
208
224
|
SingleEpochDatabase.SCHEMA_VERSION,
|
|
209
225
|
this.config.l1Contracts.rollupAddress,
|
|
210
|
-
this.config.
|
|
226
|
+
this.config.dataStoreMapSizeKb,
|
|
211
227
|
);
|
|
212
228
|
epochDb = new SingleEpochDatabase(db);
|
|
213
229
|
this.epochs.set(epochNumber, epochDb);
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { EpochNumber } from '@aztec/foundation/branded-types';
|
|
1
2
|
import type { ProofUri, ProvingJob, ProvingJobId, ProvingJobSettledResult } from '@aztec/stdlib/interfaces/server';
|
|
2
3
|
|
|
3
4
|
/**
|
|
@@ -14,7 +15,7 @@ export interface ProvingBrokerDatabase {
|
|
|
14
15
|
* Deletes all proving jobs belonging to epochs older than the given epoch
|
|
15
16
|
* @param epochNumber - The epoch number beyond which jobs should be deleted
|
|
16
17
|
*/
|
|
17
|
-
deleteAllProvingJobsOlderThanEpoch(epochNumber:
|
|
18
|
+
deleteAllProvingJobsOlderThanEpoch(epochNumber: EpochNumber): Promise<void>;
|
|
18
19
|
|
|
19
20
|
/**
|
|
20
21
|
* Returns an iterator over all saved proving jobs
|
|
@@ -8,7 +8,7 @@ import {
|
|
|
8
8
|
type ObservableResult,
|
|
9
9
|
type TelemetryClient,
|
|
10
10
|
type UpDownCounter,
|
|
11
|
-
|
|
11
|
+
createUpDownCounterWithDefault,
|
|
12
12
|
} from '@aztec/telemetry-client';
|
|
13
13
|
|
|
14
14
|
export type MonitorCallback = (proofType: ProvingRequestType) => number;
|
|
@@ -18,6 +18,7 @@ export class ProvingBrokerInstrumentation {
|
|
|
18
18
|
private activeJobs: ObservableGauge;
|
|
19
19
|
private resolvedJobs: UpDownCounter;
|
|
20
20
|
private rejectedJobs: UpDownCounter;
|
|
21
|
+
private abortedJobs: UpDownCounter;
|
|
21
22
|
private timedOutJobs: UpDownCounter;
|
|
22
23
|
private cachedJobs: UpDownCounter;
|
|
23
24
|
private totalJobs: UpDownCounter;
|
|
@@ -28,49 +29,30 @@ export class ProvingBrokerInstrumentation {
|
|
|
28
29
|
constructor(client: TelemetryClient, name = 'ProvingBroker') {
|
|
29
30
|
const meter = client.getMeter(name);
|
|
30
31
|
|
|
31
|
-
this.queueSize = meter.createObservableGauge(Metrics.PROVING_QUEUE_SIZE
|
|
32
|
-
valueType: ValueType.INT,
|
|
33
|
-
});
|
|
32
|
+
this.queueSize = meter.createObservableGauge(Metrics.PROVING_QUEUE_SIZE);
|
|
34
33
|
|
|
35
|
-
this.activeJobs = meter.createObservableGauge(Metrics.PROVING_QUEUE_ACTIVE_JOBS
|
|
36
|
-
valueType: ValueType.INT,
|
|
37
|
-
});
|
|
34
|
+
this.activeJobs = meter.createObservableGauge(Metrics.PROVING_QUEUE_ACTIVE_JOBS);
|
|
38
35
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
});
|
|
36
|
+
const provingJobTypes = Object.values(ProvingRequestType).filter(v => typeof v === 'string');
|
|
37
|
+
const provingJobAttrs = { [Attributes.PROVING_JOB_TYPE]: provingJobTypes };
|
|
42
38
|
|
|
43
|
-
this.
|
|
44
|
-
valueType: ValueType.INT,
|
|
45
|
-
});
|
|
39
|
+
this.resolvedJobs = createUpDownCounterWithDefault(meter, Metrics.PROVING_QUEUE_RESOLVED_JOBS, provingJobAttrs);
|
|
46
40
|
|
|
47
|
-
this.
|
|
48
|
-
valueType: ValueType.INT,
|
|
49
|
-
});
|
|
41
|
+
this.rejectedJobs = createUpDownCounterWithDefault(meter, Metrics.PROVING_QUEUE_REJECTED_JOBS, provingJobAttrs);
|
|
50
42
|
|
|
51
|
-
this.
|
|
52
|
-
valueType: ValueType.INT,
|
|
53
|
-
});
|
|
43
|
+
this.abortedJobs = createUpDownCounterWithDefault(meter, Metrics.PROVING_QUEUE_ABORTED_JOBS, provingJobAttrs);
|
|
54
44
|
|
|
55
|
-
this.
|
|
56
|
-
valueType: ValueType.INT,
|
|
57
|
-
});
|
|
45
|
+
this.retriedJobs = createUpDownCounterWithDefault(meter, Metrics.PROVING_QUEUE_RETRIED_JOBS, provingJobAttrs);
|
|
58
46
|
|
|
59
|
-
this.
|
|
60
|
-
valueType: ValueType.INT,
|
|
61
|
-
});
|
|
47
|
+
this.timedOutJobs = createUpDownCounterWithDefault(meter, Metrics.PROVING_QUEUE_TIMED_OUT_JOBS, provingJobAttrs);
|
|
62
48
|
|
|
63
|
-
this.
|
|
64
|
-
description: 'Records how long a job sits in the queue',
|
|
65
|
-
unit: 'ms',
|
|
66
|
-
valueType: ValueType.INT,
|
|
67
|
-
});
|
|
49
|
+
this.cachedJobs = createUpDownCounterWithDefault(meter, Metrics.PROVING_QUEUE_CACHED_JOBS, provingJobAttrs);
|
|
68
50
|
|
|
69
|
-
this.
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
51
|
+
this.totalJobs = createUpDownCounterWithDefault(meter, Metrics.PROVING_QUEUE_TOTAL_JOBS, provingJobAttrs);
|
|
52
|
+
|
|
53
|
+
this.jobWait = meter.createHistogram(Metrics.PROVING_QUEUE_JOB_WAIT);
|
|
54
|
+
|
|
55
|
+
this.jobDuration = meter.createHistogram(Metrics.PROVING_QUEUE_JOB_DURATION);
|
|
74
56
|
}
|
|
75
57
|
|
|
76
58
|
monitorQueueDepth(fn: MonitorCallback) {
|
|
@@ -93,6 +75,12 @@ export class ProvingBrokerInstrumentation {
|
|
|
93
75
|
});
|
|
94
76
|
}
|
|
95
77
|
|
|
78
|
+
incAbortedJobs(proofType: ProvingRequestType) {
|
|
79
|
+
this.abortedJobs.add(1, {
|
|
80
|
+
[Attributes.PROVING_JOB_TYPE]: ProvingRequestType[proofType],
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
|
|
96
84
|
incRetriedJobs(proofType: ProvingRequestType) {
|
|
97
85
|
this.retriedJobs.add(1, {
|
|
98
86
|
[Attributes.PROVING_JOB_TYPE]: ProvingRequestType[proofType],
|
|
@@ -1,4 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { EpochNumber } from '@aztec/foundation/branded-types';
|
|
2
|
+
import { randomBytes } from '@aztec/foundation/crypto/random';
|
|
3
|
+
import { AbortError } from '@aztec/foundation/error';
|
|
4
|
+
import { type Logger, type LoggerBindings, createLogger } from '@aztec/foundation/log';
|
|
2
5
|
import type {
|
|
3
6
|
ProvingJobId,
|
|
4
7
|
ProvingJobInputs,
|
|
@@ -9,38 +12,35 @@ import { ProvingRequestType } from '@aztec/stdlib/proofs';
|
|
|
9
12
|
|
|
10
13
|
export enum ProvingJobControllerStatus {
|
|
11
14
|
IDLE = 'idle',
|
|
12
|
-
|
|
15
|
+
RUNNING = 'running',
|
|
13
16
|
DONE = 'done',
|
|
14
|
-
ABORTED = 'aborted',
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
interface ProvingJobCompletionCallback<T extends ProvingRequestType = ProvingRequestType> {
|
|
18
|
-
(
|
|
19
|
-
jobId: ProvingJobId,
|
|
20
|
-
type: T,
|
|
21
|
-
error: Error | undefined,
|
|
22
|
-
result: ProvingJobResultsMap[T] | undefined,
|
|
23
|
-
): void | Promise<void>;
|
|
24
17
|
}
|
|
25
18
|
|
|
26
19
|
export class ProvingJobController {
|
|
27
20
|
private status: ProvingJobControllerStatus = ProvingJobControllerStatus.IDLE;
|
|
28
21
|
private promise?: Promise<void>;
|
|
29
22
|
private abortController = new AbortController();
|
|
23
|
+
private result?: ProvingJobResultsMap[ProvingRequestType] | Error;
|
|
24
|
+
private log: Logger;
|
|
30
25
|
|
|
31
26
|
constructor(
|
|
32
27
|
private jobId: ProvingJobId,
|
|
33
28
|
private inputs: ProvingJobInputs,
|
|
34
|
-
private epochNumber:
|
|
29
|
+
private epochNumber: EpochNumber,
|
|
35
30
|
private startedAt: number,
|
|
36
31
|
private circuitProver: ServerCircuitProver,
|
|
37
|
-
private onComplete:
|
|
38
|
-
|
|
39
|
-
) {
|
|
32
|
+
private onComplete: () => void,
|
|
33
|
+
bindings?: LoggerBindings,
|
|
34
|
+
) {
|
|
35
|
+
this.log = createLogger('prover-client:proving-agent:job-controller', {
|
|
36
|
+
instanceId: randomBytes(4).toString('hex'),
|
|
37
|
+
...bindings,
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
40
|
|
|
41
41
|
public start(): void {
|
|
42
42
|
if (this.status !== ProvingJobControllerStatus.IDLE) {
|
|
43
|
-
this.log.
|
|
43
|
+
this.log.warn(
|
|
44
44
|
`Job controller for jobId=${this.jobId} not starting because it is not idle currentStatus=${this.status}`,
|
|
45
45
|
{
|
|
46
46
|
currentStatus: this.status,
|
|
@@ -50,63 +50,23 @@ export class ProvingJobController {
|
|
|
50
50
|
return;
|
|
51
51
|
}
|
|
52
52
|
|
|
53
|
-
this.
|
|
54
|
-
|
|
53
|
+
this.promise = this.run();
|
|
54
|
+
|
|
55
|
+
this.log.info(`Job controller started jobId=${this.jobId}`, {
|
|
55
56
|
jobId: this.jobId,
|
|
56
57
|
});
|
|
57
|
-
|
|
58
|
-
this.promise = this.generateProof()
|
|
59
|
-
.then(
|
|
60
|
-
result => {
|
|
61
|
-
if (this.status === ProvingJobControllerStatus.ABORTED) {
|
|
62
|
-
this.log.warn(`Job controller for jobId=${this.jobId} completed successfully but job was aborted`, {
|
|
63
|
-
currentStatus: this.status,
|
|
64
|
-
jobId: this.jobId,
|
|
65
|
-
});
|
|
66
|
-
return;
|
|
67
|
-
}
|
|
68
|
-
this.status = ProvingJobControllerStatus.DONE;
|
|
69
|
-
this.log.verbose(`Job controller for jobId=${this.jobId} completed successfully`, {
|
|
70
|
-
jobId: this.jobId,
|
|
71
|
-
});
|
|
72
|
-
return this.onComplete(this.jobId, this.inputs.type, undefined, result);
|
|
73
|
-
},
|
|
74
|
-
error => {
|
|
75
|
-
if (this.status === ProvingJobControllerStatus.ABORTED) {
|
|
76
|
-
this.log.warn(`Job controller for jobId=${this.jobId} finished with an error but job was aborted`, {
|
|
77
|
-
currentStatus: this.status,
|
|
78
|
-
jobId: this.jobId,
|
|
79
|
-
});
|
|
80
|
-
return;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
if (error.name === 'AbortError') {
|
|
84
|
-
// Ignore abort errors
|
|
85
|
-
return;
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
this.log.verbose(`Job controller for jobId=${this.jobId} finished with an error`, {
|
|
89
|
-
jobId: this.jobId,
|
|
90
|
-
err: error,
|
|
91
|
-
});
|
|
92
|
-
|
|
93
|
-
this.status = ProvingJobControllerStatus.DONE;
|
|
94
|
-
return this.onComplete(this.jobId, this.inputs.type, error, undefined);
|
|
95
|
-
},
|
|
96
|
-
)
|
|
97
|
-
.catch(err => {
|
|
98
|
-
this.log.error(`Job constroller failed to send result for jobId=${this.jobId}: ${err}`, err, {
|
|
99
|
-
jobId: this.jobId,
|
|
100
|
-
});
|
|
101
|
-
});
|
|
102
58
|
}
|
|
103
59
|
|
|
104
60
|
public getStatus(): ProvingJobControllerStatus {
|
|
105
61
|
return this.status;
|
|
106
62
|
}
|
|
107
63
|
|
|
64
|
+
public getResult(): ProvingJobResultsMap[ProvingRequestType] | Error | undefined {
|
|
65
|
+
return this.result;
|
|
66
|
+
}
|
|
67
|
+
|
|
108
68
|
public abort(): void {
|
|
109
|
-
if (this.status !== ProvingJobControllerStatus.
|
|
69
|
+
if (this.status !== ProvingJobControllerStatus.RUNNING) {
|
|
110
70
|
this.log.warn(`Tried to abort job controller for jobId=${this.jobId} but it is not running`, {
|
|
111
71
|
currentStatus: this.status,
|
|
112
72
|
jobId: this.jobId,
|
|
@@ -114,9 +74,8 @@ export class ProvingJobController {
|
|
|
114
74
|
return;
|
|
115
75
|
}
|
|
116
76
|
|
|
117
|
-
this.status = ProvingJobControllerStatus.ABORTED;
|
|
118
77
|
this.abortController.abort();
|
|
119
|
-
this.log.
|
|
78
|
+
this.log.warn(`Aborted job controller for jobId=${this.jobId}`, {
|
|
120
79
|
jobId: this.jobId,
|
|
121
80
|
});
|
|
122
81
|
}
|
|
@@ -125,6 +84,10 @@ export class ProvingJobController {
|
|
|
125
84
|
return this.jobId;
|
|
126
85
|
}
|
|
127
86
|
|
|
87
|
+
public getProofType(): ProvingRequestType {
|
|
88
|
+
return this.inputs.type;
|
|
89
|
+
}
|
|
90
|
+
|
|
128
91
|
public getStartedAt(): number {
|
|
129
92
|
return this.startedAt;
|
|
130
93
|
}
|
|
@@ -133,6 +96,36 @@ export class ProvingJobController {
|
|
|
133
96
|
return ProvingRequestType[this.inputs.type];
|
|
134
97
|
}
|
|
135
98
|
|
|
99
|
+
private run = async () => {
|
|
100
|
+
this.status = ProvingJobControllerStatus.RUNNING;
|
|
101
|
+
let result: ProvingJobResultsMap[ProvingRequestType] | Error;
|
|
102
|
+
try {
|
|
103
|
+
result = await this.generateProof();
|
|
104
|
+
} catch (err) {
|
|
105
|
+
if (err && err instanceof Error) {
|
|
106
|
+
result = err;
|
|
107
|
+
} else {
|
|
108
|
+
result = new Error('Unknown proving error: ' + String(err), { cause: err });
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
if (this.abortController.signal.aborted) {
|
|
113
|
+
this.log.warn(`Job controller for jobId=${this.jobId} completed but job was aborted`, {
|
|
114
|
+
currentStatus: this.status,
|
|
115
|
+
jobId: this.jobId,
|
|
116
|
+
});
|
|
117
|
+
result = new AbortError('Proof was aborted');
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
this.result = result;
|
|
121
|
+
this.status = ProvingJobControllerStatus.DONE;
|
|
122
|
+
try {
|
|
123
|
+
this.onComplete();
|
|
124
|
+
} catch (err) {
|
|
125
|
+
this.log.warn(`On complete handler error: ${err}`, { jobId: this.jobId });
|
|
126
|
+
}
|
|
127
|
+
};
|
|
128
|
+
|
|
136
129
|
private async generateProof(): Promise<ProvingJobResultsMap[ProvingRequestType]> {
|
|
137
130
|
const { type, inputs } = this.inputs;
|
|
138
131
|
const signal = this.abortController.signal;
|
|
@@ -141,50 +134,74 @@ export class ProvingJobController {
|
|
|
141
134
|
return await this.circuitProver.getAvmProof(inputs, signal, this.epochNumber);
|
|
142
135
|
}
|
|
143
136
|
|
|
144
|
-
case ProvingRequestType.
|
|
145
|
-
return await this.circuitProver.
|
|
137
|
+
case ProvingRequestType.PUBLIC_CHONK_VERIFIER: {
|
|
138
|
+
return await this.circuitProver.getPublicChonkVerifierProof(inputs, signal, this.epochNumber);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
case ProvingRequestType.PRIVATE_TX_BASE_ROLLUP: {
|
|
142
|
+
return await this.circuitProver.getPrivateTxBaseRollupProof(inputs, signal, this.epochNumber);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
case ProvingRequestType.PUBLIC_TX_BASE_ROLLUP: {
|
|
146
|
+
return await this.circuitProver.getPublicTxBaseRollupProof(inputs, signal, this.epochNumber);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
case ProvingRequestType.TX_MERGE_ROLLUP: {
|
|
150
|
+
return await this.circuitProver.getTxMergeRollupProof(inputs, signal, this.epochNumber);
|
|
146
151
|
}
|
|
147
152
|
|
|
148
|
-
case ProvingRequestType.
|
|
149
|
-
return await this.circuitProver.
|
|
153
|
+
case ProvingRequestType.BLOCK_ROOT_FIRST_ROLLUP: {
|
|
154
|
+
return await this.circuitProver.getBlockRootFirstRollupProof(inputs, signal, this.epochNumber);
|
|
150
155
|
}
|
|
151
156
|
|
|
152
|
-
case ProvingRequestType.
|
|
153
|
-
return await this.circuitProver.
|
|
157
|
+
case ProvingRequestType.BLOCK_ROOT_SINGLE_TX_FIRST_ROLLUP: {
|
|
158
|
+
return await this.circuitProver.getBlockRootSingleTxFirstRollupProof(inputs, signal, this.epochNumber);
|
|
154
159
|
}
|
|
155
160
|
|
|
156
|
-
case ProvingRequestType.
|
|
157
|
-
return await this.circuitProver.
|
|
161
|
+
case ProvingRequestType.BLOCK_ROOT_EMPTY_TX_FIRST_ROLLUP: {
|
|
162
|
+
return await this.circuitProver.getBlockRootEmptyTxFirstRollupProof(inputs, signal, this.epochNumber);
|
|
158
163
|
}
|
|
159
164
|
|
|
160
165
|
case ProvingRequestType.BLOCK_ROOT_ROLLUP: {
|
|
161
166
|
return await this.circuitProver.getBlockRootRollupProof(inputs, signal, this.epochNumber);
|
|
162
167
|
}
|
|
163
168
|
|
|
164
|
-
case ProvingRequestType.
|
|
165
|
-
return await this.circuitProver.
|
|
169
|
+
case ProvingRequestType.BLOCK_ROOT_SINGLE_TX_ROLLUP: {
|
|
170
|
+
return await this.circuitProver.getBlockRootSingleTxRollupProof(inputs, signal, this.epochNumber);
|
|
166
171
|
}
|
|
167
172
|
|
|
168
173
|
case ProvingRequestType.BLOCK_MERGE_ROLLUP: {
|
|
169
174
|
return await this.circuitProver.getBlockMergeRollupProof(inputs, signal, this.epochNumber);
|
|
170
175
|
}
|
|
171
176
|
|
|
177
|
+
case ProvingRequestType.CHECKPOINT_ROOT_ROLLUP: {
|
|
178
|
+
return await this.circuitProver.getCheckpointRootRollupProof(inputs, signal, this.epochNumber);
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
case ProvingRequestType.CHECKPOINT_ROOT_SINGLE_BLOCK_ROLLUP: {
|
|
182
|
+
return await this.circuitProver.getCheckpointRootSingleBlockRollupProof(inputs, signal, this.epochNumber);
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
case ProvingRequestType.CHECKPOINT_PADDING_ROLLUP: {
|
|
186
|
+
return await this.circuitProver.getCheckpointPaddingRollupProof(inputs, signal, this.epochNumber);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
case ProvingRequestType.CHECKPOINT_MERGE_ROLLUP: {
|
|
190
|
+
return await this.circuitProver.getCheckpointMergeRollupProof(inputs, signal, this.epochNumber);
|
|
191
|
+
}
|
|
192
|
+
|
|
172
193
|
case ProvingRequestType.ROOT_ROLLUP: {
|
|
173
194
|
return await this.circuitProver.getRootRollupProof(inputs, signal, this.epochNumber);
|
|
174
195
|
}
|
|
175
196
|
|
|
176
|
-
case ProvingRequestType.
|
|
197
|
+
case ProvingRequestType.PARITY_BASE: {
|
|
177
198
|
return await this.circuitProver.getBaseParityProof(inputs, signal, this.epochNumber);
|
|
178
199
|
}
|
|
179
200
|
|
|
180
|
-
case ProvingRequestType.
|
|
201
|
+
case ProvingRequestType.PARITY_ROOT: {
|
|
181
202
|
return await this.circuitProver.getRootParityProof(inputs, signal, this.epochNumber);
|
|
182
203
|
}
|
|
183
204
|
|
|
184
|
-
case ProvingRequestType.TUBE_PROOF: {
|
|
185
|
-
return await this.circuitProver.getTubeProof(inputs, signal, this.epochNumber);
|
|
186
|
-
}
|
|
187
|
-
|
|
188
205
|
default: {
|
|
189
206
|
const _exhaustive: never = type;
|
|
190
207
|
return Promise.reject(new Error(`Invalid proof request type: ${type}`));
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
+
import { EpochNumberSchema } from '@aztec/foundation/branded-types';
|
|
1
2
|
import { createSafeJsonRpcClient } from '@aztec/foundation/json-rpc/client';
|
|
2
|
-
import type { SafeJsonRpcServer } from '@aztec/foundation/json-rpc/server';
|
|
3
3
|
import {
|
|
4
4
|
type GetProvingJobResponse,
|
|
5
5
|
ProofUri,
|
|
6
6
|
ProvingJob,
|
|
7
7
|
type ProvingJobBroker,
|
|
8
|
+
type ProvingJobBrokerDebug,
|
|
8
9
|
type ProvingJobConsumer,
|
|
9
10
|
ProvingJobId,
|
|
10
11
|
type ProvingJobProducer,
|
|
@@ -13,7 +14,7 @@ import {
|
|
|
13
14
|
import { ProvingRequestType } from '@aztec/stdlib/proofs';
|
|
14
15
|
import { type ApiSchemaFor, optional } from '@aztec/stdlib/schemas';
|
|
15
16
|
import { type ComponentsVersions, getVersioningResponseHandler } from '@aztec/stdlib/versioning';
|
|
16
|
-
import {
|
|
17
|
+
import { makeTracedFetch } from '@aztec/telemetry-client';
|
|
17
18
|
|
|
18
19
|
import { z } from 'zod';
|
|
19
20
|
|
|
@@ -54,9 +55,17 @@ export const ProvingJobBrokerSchema: ApiSchemaFor<ProvingJobBroker> = {
|
|
|
54
55
|
...ProvingJobProducerSchema,
|
|
55
56
|
};
|
|
56
57
|
|
|
57
|
-
export
|
|
58
|
-
|
|
59
|
-
|
|
58
|
+
export const ProvingJobBrokerDebugSchema: ApiSchemaFor<ProvingJobBrokerDebug> = {
|
|
59
|
+
replayProvingJob: z
|
|
60
|
+
.function()
|
|
61
|
+
.args(ProvingJobId, z.nativeEnum(ProvingRequestType), EpochNumberSchema, ProofUri)
|
|
62
|
+
.returns(ProvingJobStatus),
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
export const ProvingJobBrokerSchemaWithDebug: ApiSchemaFor<ProvingJobBroker & ProvingJobBrokerDebug> = {
|
|
66
|
+
...ProvingJobBrokerSchema,
|
|
67
|
+
...ProvingJobBrokerDebugSchema,
|
|
68
|
+
};
|
|
60
69
|
|
|
61
70
|
export function createProvingJobBrokerClient(
|
|
62
71
|
url: string,
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { ProvingJobId } from '@aztec/stdlib/interfaces/server';
|
|
2
|
+
import { ProvingRequestType } from '@aztec/stdlib/proofs';
|
|
3
|
+
|
|
4
|
+
// Mock ProofStore for faster benchmarks with realistic Cloud Storage URIs
|
|
5
|
+
export class MockProofStore {
|
|
6
|
+
private mockCounter = 0;
|
|
7
|
+
private readonly bucketName = 'aztec-proving-benchmarks';
|
|
8
|
+
private readonly basePath = 'proving-jobs';
|
|
9
|
+
|
|
10
|
+
saveProofInput(jobId: ProvingJobId, type: ProvingRequestType): Promise<string> {
|
|
11
|
+
const uri = `gs://${this.bucketName}/${this.basePath}/inputs/${type}/${jobId}`;
|
|
12
|
+
return Promise.resolve(uri as any);
|
|
13
|
+
}
|
|
14
|
+
}
|