@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.
- package/dest/config.d.ts +4 -10
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +8 -7
- package/dest/index.d.ts +1 -0
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +2 -1
- package/dest/mocks/test_context.js +3 -2
- package/dest/orchestrator/block-building-helpers.d.ts +5 -2
- package/dest/orchestrator/block-building-helpers.d.ts.map +1 -1
- package/dest/orchestrator/block-building-helpers.js +18 -22
- package/dest/orchestrator/block-proving-state.js +2 -2
- package/dest/orchestrator/orchestrator.d.ts.map +1 -1
- package/dest/orchestrator/orchestrator.js +5 -8
- package/dest/prover-agent/memory-proving-queue.d.ts +10 -8
- package/dest/prover-agent/memory-proving-queue.d.ts.map +1 -1
- package/dest/prover-agent/memory-proving-queue.js +35 -35
- package/dest/prover-agent/prover-agent.d.ts +1 -0
- package/dest/prover-agent/prover-agent.d.ts.map +1 -1
- package/dest/prover-agent/prover-agent.js +12 -9
- package/dest/proving_broker/caching_broker_facade.d.ts +30 -0
- package/dest/proving_broker/caching_broker_facade.d.ts.map +1 -0
- package/dest/proving_broker/caching_broker_facade.js +150 -0
- package/dest/proving_broker/factory.d.ts +4 -0
- package/dest/proving_broker/factory.d.ts.map +1 -0
- package/dest/proving_broker/factory.js +17 -0
- package/dest/proving_broker/index.d.ts +9 -0
- package/dest/proving_broker/index.d.ts.map +1 -0
- package/dest/proving_broker/index.js +9 -0
- package/dest/proving_broker/proof_store.d.ts +46 -0
- package/dest/proving_broker/proof_store.d.ts.map +1 -0
- package/dest/proving_broker/proof_store.js +37 -0
- package/dest/proving_broker/prover_cache/memory.d.ts +9 -0
- package/dest/proving_broker/prover_cache/memory.d.ts.map +1 -0
- package/dest/proving_broker/prover_cache/memory.js +16 -0
- package/dest/proving_broker/proving_agent.d.ts +11 -6
- package/dest/proving_broker/proving_agent.d.ts.map +1 -1
- package/dest/proving_broker/proving_agent.js +48 -20
- package/dest/proving_broker/proving_broker.d.ts +17 -16
- package/dest/proving_broker/proving_broker.d.ts.map +1 -1
- package/dest/proving_broker/proving_broker.js +44 -23
- package/dest/proving_broker/proving_broker_database/memory.d.ts +14 -0
- package/dest/proving_broker/proving_broker_database/memory.d.ts.map +1 -0
- package/dest/proving_broker/proving_broker_database/memory.js +35 -0
- package/dest/proving_broker/proving_broker_database/persisted.d.ts +15 -0
- package/dest/proving_broker/proving_broker_database/persisted.d.ts.map +1 -0
- package/dest/proving_broker/proving_broker_database/persisted.js +35 -0
- package/dest/proving_broker/{proving_job_database.d.ts → proving_broker_database.d.ts} +8 -8
- package/dest/proving_broker/proving_broker_database.d.ts.map +1 -0
- package/dest/proving_broker/proving_broker_database.js +2 -0
- package/dest/proving_broker/proving_job_controller.d.ts +13 -8
- package/dest/proving_broker/proving_job_controller.d.ts.map +1 -1
- package/dest/proving_broker/proving_job_controller.js +43 -43
- package/dest/proving_broker/rpc.d.ts +11 -0
- package/dest/proving_broker/rpc.d.ts.map +1 -0
- package/dest/proving_broker/rpc.js +44 -0
- package/dest/test/mock_prover.d.ts +15 -1
- package/dest/test/mock_prover.d.ts.map +1 -1
- package/dest/test/mock_prover.js +36 -1
- package/dest/tx-prover/factory.d.ts +2 -1
- package/dest/tx-prover/factory.d.ts.map +1 -1
- package/dest/tx-prover/factory.js +3 -3
- package/dest/tx-prover/tx-prover.d.ts +13 -7
- package/dest/tx-prover/tx-prover.d.ts.map +1 -1
- package/dest/tx-prover/tx-prover.js +52 -35
- package/package.json +14 -12
- package/src/config.ts +17 -16
- package/src/index.ts +1 -0
- package/src/mocks/test_context.ts +2 -2
- package/src/orchestrator/block-building-helpers.ts +34 -37
- package/src/orchestrator/block-proving-state.ts +1 -1
- package/src/orchestrator/orchestrator.ts +4 -9
- package/src/prover-agent/memory-proving-queue.ts +43 -44
- package/src/prover-agent/prover-agent.ts +16 -20
- package/src/proving_broker/caching_broker_facade.ts +312 -0
- package/src/proving_broker/factory.ts +21 -0
- package/src/proving_broker/index.ts +8 -0
- package/src/proving_broker/proof_store.ts +106 -0
- package/src/proving_broker/prover_cache/memory.ts +20 -0
- package/src/proving_broker/proving_agent.ts +75 -20
- package/src/proving_broker/proving_broker.ts +98 -65
- package/src/proving_broker/proving_broker_database/memory.ts +43 -0
- package/src/proving_broker/proving_broker_database/persisted.ts +45 -0
- package/src/proving_broker/{proving_job_database.ts → proving_broker_database.ts} +7 -12
- package/src/proving_broker/proving_job_controller.ts +54 -46
- package/src/proving_broker/rpc.ts +64 -0
- package/src/test/mock_prover.ts +51 -0
- package/src/tx-prover/factory.ts +7 -2
- package/src/tx-prover/tx-prover.ts +78 -46
- package/dest/proving_broker/proving_broker_interface.d.ts +0 -61
- package/dest/proving_broker/proving_broker_interface.d.ts.map +0 -1
- package/dest/proving_broker/proving_broker_interface.js +0 -2
- package/dest/proving_broker/proving_job_database/memory.d.ts +0 -14
- package/dest/proving_broker/proving_job_database/memory.d.ts.map +0 -1
- package/dest/proving_broker/proving_job_database/memory.js +0 -35
- package/dest/proving_broker/proving_job_database/persisted.d.ts +0 -15
- package/dest/proving_broker/proving_job_database/persisted.d.ts.map +0 -1
- package/dest/proving_broker/proving_job_database/persisted.js +0 -34
- package/dest/proving_broker/proving_job_database.d.ts.map +0 -1
- package/dest/proving_broker/proving_job_database.js +0 -2
- package/src/proving_broker/proving_broker_interface.ts +0 -74
- package/src/proving_broker/proving_job_database/memory.ts +0 -43
- package/src/proving_broker/proving_job_database/persisted.ts +0 -44
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { type ProofUri, ProvingJob, type ProvingJobId, ProvingJobSettledResult } from '@aztec/circuit-types';
|
|
2
|
+
import { jsonParseWithSchema, jsonStringify } from '@aztec/foundation/json-rpc';
|
|
3
|
+
import { type AztecKVStore, type AztecMap } from '@aztec/kv-store';
|
|
4
|
+
|
|
5
|
+
import { type ProvingBrokerDatabase } from '../proving_broker_database.js';
|
|
6
|
+
|
|
7
|
+
export class KVBrokerDatabase implements ProvingBrokerDatabase {
|
|
8
|
+
private jobs: AztecMap<ProvingJobId, string>;
|
|
9
|
+
private jobResults: AztecMap<ProvingJobId, string>;
|
|
10
|
+
|
|
11
|
+
constructor(private store: AztecKVStore) {
|
|
12
|
+
this.jobs = store.openMap('proving_jobs');
|
|
13
|
+
this.jobResults = store.openMap('proving_job_results');
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
async addProvingJob(job: ProvingJob): Promise<void> {
|
|
17
|
+
await this.jobs.set(job.id, jsonStringify(job));
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
*allProvingJobs(): Iterable<[ProvingJob, ProvingJobSettledResult | undefined]> {
|
|
21
|
+
for (const jobStr of this.jobs.values()) {
|
|
22
|
+
const job = jsonParseWithSchema(jobStr, ProvingJob);
|
|
23
|
+
const resultStr = this.jobResults.get(job.id);
|
|
24
|
+
const result = resultStr ? jsonParseWithSchema(resultStr, ProvingJobSettledResult) : undefined;
|
|
25
|
+
yield [job, result];
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
deleteProvingJobAndResult(id: ProvingJobId): Promise<void> {
|
|
30
|
+
return this.store.transaction(() => {
|
|
31
|
+
void this.jobs.delete(id);
|
|
32
|
+
void this.jobResults.delete(id);
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
async setProvingJobError(id: ProvingJobId, reason: string): Promise<void> {
|
|
37
|
+
const result: ProvingJobSettledResult = { status: 'rejected', reason };
|
|
38
|
+
await this.jobResults.set(id, jsonStringify(result));
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
async setProvingJobResult(id: ProvingJobId, value: ProofUri): Promise<void> {
|
|
42
|
+
const result: ProvingJobSettledResult = { status: 'fulfilled', value };
|
|
43
|
+
await this.jobResults.set(id, jsonStringify(result));
|
|
44
|
+
}
|
|
45
|
+
}
|
|
@@ -1,30 +1,25 @@
|
|
|
1
|
-
import {
|
|
2
|
-
type V2ProofOutput,
|
|
3
|
-
type V2ProvingJob,
|
|
4
|
-
type V2ProvingJobId,
|
|
5
|
-
type V2ProvingJobResult,
|
|
6
|
-
} from '@aztec/circuit-types';
|
|
1
|
+
import { type ProofUri, type ProvingJob, type ProvingJobId, type ProvingJobSettledResult } from '@aztec/circuit-types';
|
|
7
2
|
|
|
8
3
|
/**
|
|
9
4
|
* A database for storing proof requests and their results
|
|
10
5
|
*/
|
|
11
|
-
export interface
|
|
6
|
+
export interface ProvingBrokerDatabase {
|
|
12
7
|
/**
|
|
13
8
|
* Saves a proof request so it can be retrieved later
|
|
14
9
|
* @param request - The proof request to save
|
|
15
10
|
*/
|
|
16
|
-
addProvingJob(request:
|
|
11
|
+
addProvingJob(request: ProvingJob): Promise<void>;
|
|
17
12
|
|
|
18
13
|
/**
|
|
19
14
|
* Removes a proof request from the backend
|
|
20
15
|
* @param id - The ID of the proof request to remove
|
|
21
16
|
*/
|
|
22
|
-
deleteProvingJobAndResult(id:
|
|
17
|
+
deleteProvingJobAndResult(id: ProvingJobId): Promise<void>;
|
|
23
18
|
|
|
24
19
|
/**
|
|
25
20
|
* Returns an iterator over all saved proving jobs
|
|
26
21
|
*/
|
|
27
|
-
allProvingJobs(): Iterable<[
|
|
22
|
+
allProvingJobs(): Iterable<[ProvingJob, ProvingJobSettledResult | undefined]>;
|
|
28
23
|
|
|
29
24
|
/**
|
|
30
25
|
* Saves the result of a proof request
|
|
@@ -32,7 +27,7 @@ export interface ProvingJobDatabase {
|
|
|
32
27
|
* @param ProvingRequestType - The type of proof that was requested
|
|
33
28
|
* @param value - The result of the proof request
|
|
34
29
|
*/
|
|
35
|
-
setProvingJobResult(id:
|
|
30
|
+
setProvingJobResult(id: ProvingJobId, value: ProofUri): Promise<void>;
|
|
36
31
|
|
|
37
32
|
/**
|
|
38
33
|
* Saves an error that occurred while processing a proof request
|
|
@@ -40,5 +35,5 @@ export interface ProvingJobDatabase {
|
|
|
40
35
|
* @param ProvingRequestType - The type of proof that was requested
|
|
41
36
|
* @param err - The error that occurred while processing the proof request
|
|
42
37
|
*/
|
|
43
|
-
setProvingJobError(id:
|
|
38
|
+
setProvingJobError(id: ProvingJobId, err: string): Promise<void>;
|
|
44
39
|
}
|
|
@@ -1,53 +1,68 @@
|
|
|
1
1
|
import {
|
|
2
|
+
type ProvingJobId,
|
|
3
|
+
type ProvingJobInputs,
|
|
4
|
+
type ProvingJobResultsMap,
|
|
2
5
|
ProvingRequestType,
|
|
3
6
|
type ServerCircuitProver,
|
|
4
|
-
type V2ProofOutput,
|
|
5
|
-
type V2ProvingJob,
|
|
6
|
-
type V2ProvingJobId,
|
|
7
7
|
} from '@aztec/circuit-types';
|
|
8
8
|
|
|
9
|
-
export enum
|
|
9
|
+
export enum ProvingJobControllerStatus {
|
|
10
10
|
IDLE = 'idle',
|
|
11
11
|
PROVING = 'proving',
|
|
12
12
|
DONE = 'done',
|
|
13
|
+
ABORTED = 'aborted',
|
|
13
14
|
}
|
|
14
15
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
16
|
+
interface ProvingJobCompletionCallback<T extends ProvingRequestType = ProvingRequestType> {
|
|
17
|
+
(
|
|
18
|
+
jobId: ProvingJobId,
|
|
19
|
+
type: T,
|
|
20
|
+
error: Error | undefined,
|
|
21
|
+
result: ProvingJobResultsMap[T] | undefined,
|
|
22
|
+
): void | Promise<void>;
|
|
23
|
+
}
|
|
19
24
|
|
|
20
25
|
export class ProvingJobController {
|
|
21
|
-
private status:
|
|
26
|
+
private status: ProvingJobControllerStatus = ProvingJobControllerStatus.IDLE;
|
|
22
27
|
private promise?: Promise<void>;
|
|
23
28
|
private abortController = new AbortController();
|
|
24
29
|
|
|
25
30
|
constructor(
|
|
26
|
-
private
|
|
31
|
+
private jobId: ProvingJobId,
|
|
32
|
+
private inputs: ProvingJobInputs,
|
|
27
33
|
private startedAt: number,
|
|
28
34
|
private circuitProver: ServerCircuitProver,
|
|
29
35
|
private onComplete: ProvingJobCompletionCallback,
|
|
30
36
|
) {}
|
|
31
37
|
|
|
32
38
|
public start(): void {
|
|
33
|
-
if (this.status !==
|
|
39
|
+
if (this.status !== ProvingJobControllerStatus.IDLE) {
|
|
34
40
|
return;
|
|
35
41
|
}
|
|
36
42
|
|
|
37
|
-
this.status =
|
|
43
|
+
this.status = ProvingJobControllerStatus.PROVING;
|
|
38
44
|
this.promise = this.generateProof()
|
|
39
45
|
.then(
|
|
40
46
|
result => {
|
|
41
|
-
this.status
|
|
42
|
-
|
|
47
|
+
if (this.status === ProvingJobControllerStatus.ABORTED) {
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
this.status = ProvingJobControllerStatus.DONE;
|
|
52
|
+
return this.onComplete(this.jobId, this.inputs.type, undefined, result);
|
|
43
53
|
},
|
|
44
54
|
error => {
|
|
45
|
-
this.status
|
|
55
|
+
if (this.status === ProvingJobControllerStatus.ABORTED) {
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
|
|
46
59
|
if (error.name === 'AbortError') {
|
|
47
60
|
// Ignore abort errors
|
|
48
61
|
return;
|
|
49
62
|
}
|
|
50
|
-
|
|
63
|
+
|
|
64
|
+
this.status = ProvingJobControllerStatus.DONE;
|
|
65
|
+
return this.onComplete(this.jobId, this.inputs.type, error, undefined);
|
|
51
66
|
},
|
|
52
67
|
)
|
|
53
68
|
.catch(_ => {
|
|
@@ -55,88 +70,81 @@ export class ProvingJobController {
|
|
|
55
70
|
});
|
|
56
71
|
}
|
|
57
72
|
|
|
58
|
-
public getStatus():
|
|
73
|
+
public getStatus(): ProvingJobControllerStatus {
|
|
59
74
|
return this.status;
|
|
60
75
|
}
|
|
61
76
|
|
|
62
77
|
public abort(): void {
|
|
63
|
-
if (this.status !==
|
|
78
|
+
if (this.status !== ProvingJobControllerStatus.PROVING) {
|
|
64
79
|
return;
|
|
65
80
|
}
|
|
66
81
|
|
|
82
|
+
this.status = ProvingJobControllerStatus.ABORTED;
|
|
67
83
|
this.abortController.abort();
|
|
68
84
|
}
|
|
69
85
|
|
|
70
|
-
public getJobId():
|
|
71
|
-
return this.
|
|
86
|
+
public getJobId(): ProvingJobId {
|
|
87
|
+
return this.jobId;
|
|
72
88
|
}
|
|
73
89
|
|
|
74
90
|
public getStartedAt(): number {
|
|
75
91
|
return this.startedAt;
|
|
76
92
|
}
|
|
77
93
|
|
|
78
|
-
|
|
79
|
-
|
|
94
|
+
public getProofTypeName(): string {
|
|
95
|
+
return ProvingRequestType[this.inputs.type];
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
private async generateProof(): Promise<ProvingJobResultsMap[ProvingRequestType]> {
|
|
99
|
+
const { type, inputs } = this.inputs;
|
|
80
100
|
const signal = this.abortController.signal;
|
|
81
101
|
switch (type) {
|
|
82
102
|
case ProvingRequestType.PUBLIC_VM: {
|
|
83
|
-
|
|
84
|
-
return { type, value };
|
|
103
|
+
return await this.circuitProver.getAvmProof(inputs, signal);
|
|
85
104
|
}
|
|
86
105
|
|
|
87
106
|
case ProvingRequestType.PRIVATE_BASE_ROLLUP: {
|
|
88
|
-
|
|
89
|
-
return { type, value };
|
|
107
|
+
return await this.circuitProver.getPrivateBaseRollupProof(inputs, signal);
|
|
90
108
|
}
|
|
91
109
|
|
|
92
110
|
case ProvingRequestType.PUBLIC_BASE_ROLLUP: {
|
|
93
|
-
|
|
94
|
-
return { type, value };
|
|
111
|
+
return await this.circuitProver.getPublicBaseRollupProof(inputs, signal);
|
|
95
112
|
}
|
|
96
113
|
|
|
97
114
|
case ProvingRequestType.MERGE_ROLLUP: {
|
|
98
|
-
|
|
99
|
-
return { type, value };
|
|
115
|
+
return await this.circuitProver.getMergeRollupProof(inputs, signal);
|
|
100
116
|
}
|
|
101
117
|
|
|
102
118
|
case ProvingRequestType.EMPTY_BLOCK_ROOT_ROLLUP: {
|
|
103
|
-
|
|
104
|
-
return { type, value };
|
|
119
|
+
return await this.circuitProver.getEmptyBlockRootRollupProof(inputs, signal);
|
|
105
120
|
}
|
|
106
121
|
|
|
107
122
|
case ProvingRequestType.BLOCK_ROOT_ROLLUP: {
|
|
108
|
-
|
|
109
|
-
return { type, value };
|
|
123
|
+
return await this.circuitProver.getBlockRootRollupProof(inputs, signal);
|
|
110
124
|
}
|
|
111
125
|
|
|
112
126
|
case ProvingRequestType.BLOCK_MERGE_ROLLUP: {
|
|
113
|
-
|
|
114
|
-
return { type, value };
|
|
127
|
+
return await this.circuitProver.getBlockMergeRollupProof(inputs, signal);
|
|
115
128
|
}
|
|
116
129
|
|
|
117
130
|
case ProvingRequestType.ROOT_ROLLUP: {
|
|
118
|
-
|
|
119
|
-
return { type, value };
|
|
131
|
+
return await this.circuitProver.getRootRollupProof(inputs, signal);
|
|
120
132
|
}
|
|
121
133
|
|
|
122
134
|
case ProvingRequestType.BASE_PARITY: {
|
|
123
|
-
|
|
124
|
-
return { type, value };
|
|
135
|
+
return await this.circuitProver.getBaseParityProof(inputs, signal);
|
|
125
136
|
}
|
|
126
137
|
|
|
127
138
|
case ProvingRequestType.ROOT_PARITY: {
|
|
128
|
-
|
|
129
|
-
return { type, value };
|
|
139
|
+
return await this.circuitProver.getRootParityProof(inputs, signal);
|
|
130
140
|
}
|
|
131
141
|
|
|
132
142
|
case ProvingRequestType.PRIVATE_KERNEL_EMPTY: {
|
|
133
|
-
|
|
134
|
-
return { type, value };
|
|
143
|
+
return await this.circuitProver.getEmptyPrivateKernelProof(inputs, signal);
|
|
135
144
|
}
|
|
136
145
|
|
|
137
146
|
case ProvingRequestType.TUBE_PROOF: {
|
|
138
|
-
|
|
139
|
-
return { type, value };
|
|
147
|
+
return await this.circuitProver.getTubeProof(inputs, signal);
|
|
140
148
|
}
|
|
141
149
|
|
|
142
150
|
default: {
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import {
|
|
2
|
+
type GetProvingJobResponse,
|
|
3
|
+
ProofUri,
|
|
4
|
+
ProvingJob,
|
|
5
|
+
type ProvingJobBroker,
|
|
6
|
+
type ProvingJobConsumer,
|
|
7
|
+
ProvingJobId,
|
|
8
|
+
type ProvingJobProducer,
|
|
9
|
+
ProvingJobSettledResult,
|
|
10
|
+
ProvingJobStatus,
|
|
11
|
+
ProvingRequestType,
|
|
12
|
+
} from '@aztec/circuit-types';
|
|
13
|
+
import { createSafeJsonRpcClient, makeFetch } from '@aztec/foundation/json-rpc/client';
|
|
14
|
+
import { type SafeJsonRpcServer, createSafeJsonRpcServer } from '@aztec/foundation/json-rpc/server';
|
|
15
|
+
import { type ApiSchemaFor, optional } from '@aztec/foundation/schemas';
|
|
16
|
+
|
|
17
|
+
import { z } from 'zod';
|
|
18
|
+
|
|
19
|
+
const ProvingJobFilterSchema = z.object({
|
|
20
|
+
allowList: z.array(z.nativeEnum(ProvingRequestType)),
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
const GetProvingJobResponse = z.object({
|
|
24
|
+
job: ProvingJob,
|
|
25
|
+
time: z.number(),
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
export const ProvingJobProducerSchema: ApiSchemaFor<ProvingJobProducer> = {
|
|
29
|
+
enqueueProvingJob: z.function().args(ProvingJob).returns(z.void()),
|
|
30
|
+
getProvingJobStatus: z.function().args(ProvingJobId).returns(ProvingJobStatus),
|
|
31
|
+
removeAndCancelProvingJob: z.function().args(ProvingJobId).returns(z.void()),
|
|
32
|
+
waitForJobToSettle: z.function().args(ProvingJobId).returns(ProvingJobSettledResult),
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
export const ProvingJobConsumerSchema: ApiSchemaFor<ProvingJobConsumer> = {
|
|
36
|
+
getProvingJob: z.function().args(optional(ProvingJobFilterSchema)).returns(GetProvingJobResponse.optional()),
|
|
37
|
+
reportProvingJobError: z.function().args(ProvingJobId, z.string(), optional(z.boolean())).returns(z.void()),
|
|
38
|
+
reportProvingJobProgress: z
|
|
39
|
+
.function()
|
|
40
|
+
.args(ProvingJobId, z.number(), optional(ProvingJobFilterSchema))
|
|
41
|
+
.returns(GetProvingJobResponse.optional()),
|
|
42
|
+
reportProvingJobSuccess: z.function().args(ProvingJobId, ProofUri).returns(z.void()),
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
export const ProvingJobBrokerSchema: ApiSchemaFor<ProvingJobBroker> = {
|
|
46
|
+
...ProvingJobConsumerSchema,
|
|
47
|
+
...ProvingJobProducerSchema,
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
export function createProvingBrokerServer(broker: ProvingJobBroker): SafeJsonRpcServer {
|
|
51
|
+
return createSafeJsonRpcServer(broker, ProvingJobBrokerSchema);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export function createProvingJobBrokerClient(url: string, fetch = makeFetch([1, 2, 3], false)): ProvingJobBroker {
|
|
55
|
+
return createSafeJsonRpcClient(url, ProvingJobBrokerSchema, false, 'proverBroker', fetch);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export function createProvingJobProducerClient(url: string, fetch = makeFetch([1, 2, 3], false)): ProvingJobProducer {
|
|
59
|
+
return createSafeJsonRpcClient(url, ProvingJobProducerSchema, false, 'provingJobProducer', fetch);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export function createProvingJobConsumerClient(url: string, fetch = makeFetch([1, 2, 3], false)): ProvingJobConsumer {
|
|
63
|
+
return createSafeJsonRpcClient(url, ProvingJobConsumerSchema, false, 'provingJobConsumer', fetch);
|
|
64
|
+
}
|
package/src/test/mock_prover.ts
CHANGED
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
import {
|
|
2
2
|
type ProofAndVerificationKey,
|
|
3
|
+
type ProvingJob,
|
|
4
|
+
type ProvingJobId,
|
|
5
|
+
type ProvingJobProducer,
|
|
6
|
+
type ProvingJobSettledResult,
|
|
7
|
+
type ProvingJobStatus,
|
|
3
8
|
type PublicInputsAndRecursiveProof,
|
|
4
9
|
type ServerCircuitProver,
|
|
5
10
|
makeProofAndVerificationKey,
|
|
@@ -37,6 +42,52 @@ import {
|
|
|
37
42
|
makeParityPublicInputs,
|
|
38
43
|
makeRootRollupPublicInputs,
|
|
39
44
|
} from '@aztec/circuits.js/testing';
|
|
45
|
+
import { times } from '@aztec/foundation/collection';
|
|
46
|
+
|
|
47
|
+
import { InlineProofStore, type ProofStore } from '../proving_broker/proof_store.js';
|
|
48
|
+
import { ProvingAgent } from '../proving_broker/proving_agent.js';
|
|
49
|
+
import { ProvingBroker } from '../proving_broker/proving_broker.js';
|
|
50
|
+
import { InMemoryBrokerDatabase } from '../proving_broker/proving_broker_database/memory.js';
|
|
51
|
+
|
|
52
|
+
export class TestBroker implements ProvingJobProducer {
|
|
53
|
+
private broker = new ProvingBroker(new InMemoryBrokerDatabase());
|
|
54
|
+
private agents: ProvingAgent[];
|
|
55
|
+
|
|
56
|
+
constructor(
|
|
57
|
+
agentCount: number,
|
|
58
|
+
prover: ServerCircuitProver,
|
|
59
|
+
private proofStore: ProofStore = new InlineProofStore(),
|
|
60
|
+
) {
|
|
61
|
+
this.agents = times(agentCount, () => new ProvingAgent(this.broker, proofStore, prover));
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
public async start() {
|
|
65
|
+
await this.broker.start();
|
|
66
|
+
this.agents.forEach(agent => agent.start());
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
public async stop() {
|
|
70
|
+
await Promise.all(this.agents.map(agent => agent.stop()));
|
|
71
|
+
await this.broker.stop();
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
public getProofStore(): ProofStore {
|
|
75
|
+
return this.proofStore;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
enqueueProvingJob(job: ProvingJob): Promise<void> {
|
|
79
|
+
return this.broker.enqueueProvingJob(job);
|
|
80
|
+
}
|
|
81
|
+
getProvingJobStatus(id: ProvingJobId): Promise<ProvingJobStatus> {
|
|
82
|
+
return this.broker.getProvingJobStatus(id);
|
|
83
|
+
}
|
|
84
|
+
removeAndCancelProvingJob(id: ProvingJobId): Promise<void> {
|
|
85
|
+
return this.broker.removeAndCancelProvingJob(id);
|
|
86
|
+
}
|
|
87
|
+
waitForJobToSettle(id: ProvingJobId): Promise<ProvingJobSettledResult> {
|
|
88
|
+
return this.broker.waitForJobToSettle(id);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
40
91
|
|
|
41
92
|
export class MockProver implements ServerCircuitProver {
|
|
42
93
|
constructor() {}
|
package/src/tx-prover/factory.ts
CHANGED
|
@@ -1,9 +1,14 @@
|
|
|
1
|
+
import { type ProvingJobBroker } from '@aztec/circuit-types';
|
|
1
2
|
import { type TelemetryClient } from '@aztec/telemetry-client';
|
|
2
3
|
import { NoopTelemetryClient } from '@aztec/telemetry-client/noop';
|
|
3
4
|
|
|
4
5
|
import { type ProverClientConfig } from '../config.js';
|
|
5
6
|
import { TxProver } from './tx-prover.js';
|
|
6
7
|
|
|
7
|
-
export function createProverClient(
|
|
8
|
-
|
|
8
|
+
export function createProverClient(
|
|
9
|
+
config: ProverClientConfig,
|
|
10
|
+
broker: ProvingJobBroker,
|
|
11
|
+
telemetry: TelemetryClient = new NoopTelemetryClient(),
|
|
12
|
+
) {
|
|
13
|
+
return TxProver.new(config, broker, telemetry);
|
|
9
14
|
}
|
|
@@ -1,40 +1,59 @@
|
|
|
1
|
-
import { BBNativeRollupProver, TestCircuitProver } from '@aztec/bb-prover';
|
|
1
|
+
import { type ACVMConfig, type BBConfig, BBNativeRollupProver, TestCircuitProver } from '@aztec/bb-prover';
|
|
2
2
|
import {
|
|
3
|
+
type ActualProverConfig,
|
|
3
4
|
type EpochProver,
|
|
4
5
|
type EpochProverManager,
|
|
5
6
|
type MerkleTreeWriteOperations,
|
|
6
|
-
type
|
|
7
|
+
type ProverCache,
|
|
8
|
+
type ProvingJobBroker,
|
|
9
|
+
type ProvingJobConsumer,
|
|
10
|
+
type ProvingJobProducer,
|
|
7
11
|
type ServerCircuitProver,
|
|
8
12
|
} from '@aztec/circuit-types/interfaces';
|
|
9
13
|
import { Fr } from '@aztec/circuits.js';
|
|
14
|
+
import { times } from '@aztec/foundation/collection';
|
|
15
|
+
import { createDebugLogger } from '@aztec/foundation/log';
|
|
10
16
|
import { NativeACVMSimulator } from '@aztec/simulator';
|
|
11
17
|
import { type TelemetryClient } from '@aztec/telemetry-client';
|
|
12
18
|
|
|
19
|
+
import { join } from 'path';
|
|
20
|
+
|
|
13
21
|
import { type ProverClientConfig } from '../config.js';
|
|
14
22
|
import { ProvingOrchestrator } from '../orchestrator/orchestrator.js';
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
23
|
+
import { CachingBrokerFacade } from '../proving_broker/caching_broker_facade.js';
|
|
24
|
+
import { InlineProofStore } from '../proving_broker/proof_store.js';
|
|
25
|
+
import { InMemoryProverCache } from '../proving_broker/prover_cache/memory.js';
|
|
26
|
+
import { ProvingAgent } from '../proving_broker/proving_agent.js';
|
|
17
27
|
|
|
18
28
|
/**
|
|
19
29
|
* A prover factory.
|
|
20
30
|
* TODO(palla/prover-node): Rename this class
|
|
21
31
|
*/
|
|
22
32
|
export class TxProver implements EpochProverManager {
|
|
23
|
-
private queue: MemoryProvingQueue;
|
|
24
33
|
private running = false;
|
|
34
|
+
private agents: ProvingAgent[] = [];
|
|
35
|
+
|
|
36
|
+
private cacheDir?: string;
|
|
25
37
|
|
|
26
38
|
private constructor(
|
|
27
39
|
private config: ProverClientConfig,
|
|
28
40
|
private telemetry: TelemetryClient,
|
|
29
|
-
private
|
|
41
|
+
private orchestratorClient: ProvingJobProducer,
|
|
42
|
+
private agentClient?: ProvingJobConsumer,
|
|
43
|
+
private log = createDebugLogger('aztec:prover-client:tx-prover'),
|
|
30
44
|
) {
|
|
31
45
|
// TODO(palla/prover-node): Cache the paddingTx here, and not in each proving orchestrator,
|
|
32
46
|
// so it can be reused across multiple ones and not recomputed every time.
|
|
33
|
-
this.
|
|
47
|
+
this.cacheDir = this.config.cacheDir ? join(this.config.cacheDir, `tx_prover_${this.config.proverId}`) : undefined;
|
|
34
48
|
}
|
|
35
49
|
|
|
36
|
-
public createEpochProver(db: MerkleTreeWriteOperations): EpochProver {
|
|
37
|
-
return new ProvingOrchestrator(
|
|
50
|
+
public createEpochProver(db: MerkleTreeWriteOperations, cache: ProverCache = new InMemoryProverCache()): EpochProver {
|
|
51
|
+
return new ProvingOrchestrator(
|
|
52
|
+
db,
|
|
53
|
+
new CachingBrokerFacade(this.orchestratorClient, cache),
|
|
54
|
+
this.telemetry,
|
|
55
|
+
this.config.proverId,
|
|
56
|
+
);
|
|
38
57
|
}
|
|
39
58
|
|
|
40
59
|
public getProverId(): Fr {
|
|
@@ -44,13 +63,12 @@ export class TxProver implements EpochProverManager {
|
|
|
44
63
|
async updateProverConfig(config: Partial<ProverClientConfig>): Promise<void> {
|
|
45
64
|
const newConfig = { ...this.config, ...config };
|
|
46
65
|
|
|
47
|
-
if (
|
|
48
|
-
|
|
49
|
-
this.
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
await this.agent?.setMaxConcurrency(newConfig.proverAgentConcurrency);
|
|
66
|
+
if (
|
|
67
|
+
newConfig.realProofs !== this.config.realProofs ||
|
|
68
|
+
newConfig.proverAgentCount !== this.config.proverAgentCount
|
|
69
|
+
) {
|
|
70
|
+
await this.stopAgents();
|
|
71
|
+
await this.createAndStartAgents();
|
|
54
72
|
}
|
|
55
73
|
|
|
56
74
|
if (!this.config.realProofs && newConfig.realProofs) {
|
|
@@ -63,15 +81,13 @@ export class TxProver implements EpochProverManager {
|
|
|
63
81
|
/**
|
|
64
82
|
* Starts the prover instance
|
|
65
83
|
*/
|
|
66
|
-
public start() {
|
|
84
|
+
public async start(): Promise<void> {
|
|
67
85
|
if (this.running) {
|
|
68
86
|
return Promise.resolve();
|
|
69
87
|
}
|
|
70
88
|
|
|
71
89
|
this.running = true;
|
|
72
|
-
this.
|
|
73
|
-
this.agent?.start(this.queue);
|
|
74
|
-
return Promise.resolve();
|
|
90
|
+
await this.createAndStartAgents();
|
|
75
91
|
}
|
|
76
92
|
|
|
77
93
|
/**
|
|
@@ -82,10 +98,7 @@ export class TxProver implements EpochProverManager {
|
|
|
82
98
|
return;
|
|
83
99
|
}
|
|
84
100
|
this.running = false;
|
|
85
|
-
|
|
86
|
-
// TODO(palla/prover-node): Keep a reference to all proving orchestrators that are alive and stop them?
|
|
87
|
-
await this.agent?.stop();
|
|
88
|
-
await this.queue.stop();
|
|
101
|
+
await this.stopAgents();
|
|
89
102
|
}
|
|
90
103
|
|
|
91
104
|
/**
|
|
@@ -95,36 +108,55 @@ export class TxProver implements EpochProverManager {
|
|
|
95
108
|
* @param worldStateSynchronizer - An instance of the world state
|
|
96
109
|
* @returns An instance of the prover, constructed and started.
|
|
97
110
|
*/
|
|
98
|
-
public static async new(config: ProverClientConfig, telemetry: TelemetryClient) {
|
|
99
|
-
const
|
|
100
|
-
? new ProverAgent(
|
|
101
|
-
await TxProver.buildCircuitProver(config, telemetry),
|
|
102
|
-
config.proverAgentConcurrency,
|
|
103
|
-
config.proverAgentPollInterval,
|
|
104
|
-
)
|
|
105
|
-
: undefined;
|
|
106
|
-
|
|
107
|
-
const prover = new TxProver(config, telemetry, agent);
|
|
111
|
+
public static async new(config: ProverClientConfig, broker: ProvingJobBroker, telemetry: TelemetryClient) {
|
|
112
|
+
const prover = new TxProver(config, telemetry, broker, broker);
|
|
108
113
|
await prover.start();
|
|
109
114
|
return prover;
|
|
110
115
|
}
|
|
111
116
|
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
117
|
+
public getProvingJobSource(): ProvingJobConsumer {
|
|
118
|
+
if (!this.agentClient) {
|
|
119
|
+
throw new Error('Agent client not provided');
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
return this.agentClient;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
private async createAndStartAgents(): Promise<void> {
|
|
126
|
+
if (this.agents.length > 0) {
|
|
127
|
+
throw new Error('Agents already started');
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
if (!this.agentClient) {
|
|
131
|
+
throw new Error('Agent client not provided');
|
|
118
132
|
}
|
|
119
133
|
|
|
120
|
-
const
|
|
121
|
-
|
|
122
|
-
|
|
134
|
+
const proofStore = new InlineProofStore();
|
|
135
|
+
const prover = await buildServerCircuitProver(this.config, this.telemetry);
|
|
136
|
+
this.agents = times(
|
|
137
|
+
this.config.proverAgentCount,
|
|
138
|
+
() => new ProvingAgent(this.agentClient!, proofStore, prover, [], this.config.proverAgentPollIntervalMs),
|
|
139
|
+
);
|
|
140
|
+
|
|
141
|
+
await Promise.all(this.agents.map(agent => agent.start()));
|
|
142
|
+
}
|
|
123
143
|
|
|
124
|
-
|
|
144
|
+
private async stopAgents() {
|
|
145
|
+
await Promise.all(this.agents.map(agent => agent.stop()));
|
|
125
146
|
}
|
|
147
|
+
}
|
|
126
148
|
|
|
127
|
-
|
|
128
|
-
|
|
149
|
+
export function buildServerCircuitProver(
|
|
150
|
+
config: ActualProverConfig & ACVMConfig & BBConfig,
|
|
151
|
+
telemetry: TelemetryClient,
|
|
152
|
+
): Promise<ServerCircuitProver> {
|
|
153
|
+
if (config.realProofs) {
|
|
154
|
+
return BBNativeRollupProver.new(config, telemetry);
|
|
129
155
|
}
|
|
156
|
+
|
|
157
|
+
const simulationProvider = config.acvmBinaryPath
|
|
158
|
+
? new NativeACVMSimulator(config.acvmWorkingDirectory, config.acvmBinaryPath)
|
|
159
|
+
: undefined;
|
|
160
|
+
|
|
161
|
+
return Promise.resolve(new TestCircuitProver(telemetry, simulationProvider, config));
|
|
130
162
|
}
|