@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.
- package/README.md +1 -0
- package/dest/bin/get-proof-inputs.d.ts +2 -0
- package/dest/bin/get-proof-inputs.d.ts.map +1 -0
- package/dest/bin/get-proof-inputs.js +51 -0
- package/dest/block_builder/index.d.ts +6 -0
- package/dest/block_builder/index.d.ts.map +1 -0
- package/dest/block_builder/index.js +1 -0
- package/dest/block_builder/light.d.ts +33 -0
- package/dest/block_builder/light.d.ts.map +1 -0
- package/dest/block_builder/light.js +82 -0
- package/dest/config.d.ts +17 -0
- package/dest/config.d.ts.map +1 -0
- package/dest/config.js +39 -0
- package/dest/index.d.ts +4 -0
- package/dest/index.d.ts.map +1 -0
- package/dest/index.js +2 -0
- package/dest/mocks/fixtures.d.ts +20 -0
- package/dest/mocks/fixtures.d.ts.map +1 -0
- package/dest/mocks/fixtures.js +77 -0
- package/dest/mocks/test_context.d.ts +55 -0
- package/dest/mocks/test_context.d.ts.map +1 -0
- package/dest/mocks/test_context.js +193 -0
- package/dest/orchestrator/block-building-helpers.d.ts +55 -0
- package/dest/orchestrator/block-building-helpers.d.ts.map +1 -0
- package/dest/orchestrator/block-building-helpers.js +285 -0
- package/dest/orchestrator/block-proving-state.d.ts +76 -0
- package/dest/orchestrator/block-proving-state.d.ts.map +1 -0
- package/dest/orchestrator/block-proving-state.js +269 -0
- package/dest/orchestrator/epoch-proving-state.d.ts +60 -0
- package/dest/orchestrator/epoch-proving-state.d.ts.map +1 -0
- package/dest/orchestrator/epoch-proving-state.js +163 -0
- package/dest/orchestrator/index.d.ts +2 -0
- package/dest/orchestrator/index.d.ts.map +1 -0
- package/dest/orchestrator/index.js +1 -0
- package/dest/orchestrator/orchestrator.d.ts +110 -0
- package/dest/orchestrator/orchestrator.d.ts.map +1 -0
- package/dest/orchestrator/orchestrator.js +690 -0
- package/dest/orchestrator/orchestrator_metrics.d.ts +8 -0
- package/dest/orchestrator/orchestrator_metrics.d.ts.map +1 -0
- package/dest/orchestrator/orchestrator_metrics.js +17 -0
- package/dest/orchestrator/tx-proving-state.d.ts +34 -0
- package/dest/orchestrator/tx-proving-state.d.ts.map +1 -0
- package/dest/orchestrator/tx-proving-state.js +94 -0
- package/dest/prover-client/factory.d.ts +6 -0
- package/dest/prover-client/factory.d.ts.map +1 -0
- package/dest/prover-client/factory.js +5 -0
- package/dest/prover-client/index.d.ts +3 -0
- package/dest/prover-client/index.d.ts.map +1 -0
- package/dest/prover-client/index.js +2 -0
- package/dest/prover-client/prover-client.d.ts +42 -0
- package/dest/prover-client/prover-client.d.ts.map +1 -0
- package/dest/prover-client/prover-client.js +110 -0
- package/dest/prover-client/server-epoch-prover.d.ts +28 -0
- package/dest/prover-client/server-epoch-prover.d.ts.map +1 -0
- package/dest/prover-client/server-epoch-prover.js +40 -0
- package/dest/proving_broker/broker_prover_facade.d.ts +46 -0
- package/dest/proving_broker/broker_prover_facade.d.ts.map +1 -0
- package/dest/proving_broker/broker_prover_facade.js +344 -0
- package/dest/proving_broker/config.d.ts +83 -0
- package/dest/proving_broker/config.d.ts.map +1 -0
- package/dest/proving_broker/config.js +104 -0
- package/dest/proving_broker/factory.d.ts +5 -0
- package/dest/proving_broker/factory.d.ts.map +1 -0
- package/dest/proving_broker/factory.js +9 -0
- package/dest/proving_broker/fixtures.d.ts +5 -0
- package/dest/proving_broker/fixtures.d.ts.map +1 -0
- package/dest/proving_broker/fixtures.js +12 -0
- package/dest/proving_broker/index.d.ts +10 -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/factory.d.ts +6 -0
- package/dest/proving_broker/proof_store/factory.d.ts.map +1 -0
- package/dest/proving_broker/proof_store/factory.js +36 -0
- package/dest/proving_broker/proof_store/gcs_proof_store.d.ts +14 -0
- package/dest/proving_broker/proof_store/gcs_proof_store.d.ts.map +1 -0
- package/dest/proving_broker/proof_store/gcs_proof_store.js +51 -0
- package/dest/proving_broker/proof_store/index.d.ts +4 -0
- package/dest/proving_broker/proof_store/index.d.ts.map +1 -0
- package/dest/proving_broker/proof_store/index.js +3 -0
- package/dest/proving_broker/proof_store/inline_proof_store.d.ts +15 -0
- package/dest/proving_broker/proof_store/inline_proof_store.d.ts.map +1 -0
- package/dest/proving_broker/proof_store/inline_proof_store.js +41 -0
- package/dest/proving_broker/proof_store/proof_store.d.ts +36 -0
- package/dest/proving_broker/proof_store/proof_store.d.ts.map +1 -0
- package/dest/proving_broker/proof_store/proof_store.js +3 -0
- package/dest/proving_broker/proving_agent.d.ts +46 -0
- package/dest/proving_broker/proving_agent.d.ts.map +1 -0
- package/dest/proving_broker/proving_agent.js +134 -0
- package/dest/proving_broker/proving_agent_instrumentation.d.ts +8 -0
- package/dest/proving_broker/proving_agent_instrumentation.d.ts.map +1 -0
- package/dest/proving_broker/proving_agent_instrumentation.js +16 -0
- package/dest/proving_broker/proving_broker.d.ts +64 -0
- package/dest/proving_broker/proving_broker.d.ts.map +1 -0
- package/dest/proving_broker/proving_broker.js +570 -0
- package/dest/proving_broker/proving_broker_database/memory.d.ts +16 -0
- package/dest/proving_broker/proving_broker_database/memory.d.ts.map +1 -0
- package/dest/proving_broker/proving_broker_database/memory.js +54 -0
- package/dest/proving_broker/proving_broker_database/persisted.d.ts +25 -0
- package/dest/proving_broker/proving_broker_database/persisted.d.ts.map +1 -0
- package/dest/proving_broker/proving_broker_database/persisted.js +182 -0
- package/dest/proving_broker/proving_broker_database.d.ts +39 -0
- package/dest/proving_broker/proving_broker_database.d.ts.map +1 -0
- package/dest/proving_broker/proving_broker_database.js +3 -0
- package/dest/proving_broker/proving_broker_instrumentation.d.ts +29 -0
- package/dest/proving_broker/proving_broker_instrumentation.d.ts.map +1 -0
- package/dest/proving_broker/proving_broker_instrumentation.js +110 -0
- package/dest/proving_broker/proving_job_controller.d.ts +33 -0
- package/dest/proving_broker/proving_job_controller.d.ts.map +1 -0
- package/dest/proving_broker/proving_job_controller.js +166 -0
- package/dest/proving_broker/rpc.d.ts +27 -0
- package/dest/proving_broker/rpc.d.ts.map +1 -0
- package/dest/proving_broker/rpc.js +66 -0
- package/dest/test/mock_prover.d.ts +35 -0
- package/dest/test/mock_prover.d.ts.map +1 -0
- package/dest/test/mock_prover.js +82 -0
- package/package.json +112 -0
- package/src/bin/get-proof-inputs.ts +59 -0
- package/src/block_builder/index.ts +6 -0
- package/src/block_builder/light.ts +101 -0
- package/src/config.ts +55 -0
- package/src/index.ts +4 -0
- package/src/mocks/fixtures.ts +117 -0
- package/src/mocks/test_context.ts +257 -0
- package/src/orchestrator/block-building-helpers.ts +553 -0
- package/src/orchestrator/block-proving-state.ts +379 -0
- package/src/orchestrator/epoch-proving-state.ts +252 -0
- package/src/orchestrator/index.ts +1 -0
- package/src/orchestrator/orchestrator.ts +971 -0
- package/src/orchestrator/orchestrator_metrics.ts +22 -0
- package/src/orchestrator/tx-proving-state.ts +139 -0
- package/src/prover-client/factory.ts +14 -0
- package/src/prover-client/index.ts +2 -0
- package/src/prover-client/prover-client.ts +162 -0
- package/src/prover-client/server-epoch-prover.ts +51 -0
- package/src/proving_broker/broker_prover_facade.ts +585 -0
- package/src/proving_broker/config.ts +138 -0
- package/src/proving_broker/factory.ts +18 -0
- package/src/proving_broker/fixtures.ts +15 -0
- package/src/proving_broker/index.ts +9 -0
- package/src/proving_broker/proof_store/factory.ts +42 -0
- package/src/proving_broker/proof_store/gcs_proof_store.ts +72 -0
- package/src/proving_broker/proof_store/index.ts +3 -0
- package/src/proving_broker/proof_store/inline_proof_store.ts +63 -0
- package/src/proving_broker/proof_store/proof_store.ts +54 -0
- package/src/proving_broker/proving_agent.ts +181 -0
- package/src/proving_broker/proving_agent_instrumentation.ts +21 -0
- package/src/proving_broker/proving_broker.ts +687 -0
- package/src/proving_broker/proving_broker_database/memory.ts +63 -0
- package/src/proving_broker/proving_broker_database/persisted.ts +218 -0
- package/src/proving_broker/proving_broker_database.ts +44 -0
- package/src/proving_broker/proving_broker_instrumentation.ts +145 -0
- package/src/proving_broker/proving_job_controller.ts +194 -0
- package/src/proving_broker/rpc.ts +95 -0
- package/src/test/mock_prover.ts +253 -0
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { createSafeJsonRpcClient } from '@aztec/foundation/json-rpc/client';
|
|
2
|
+
import { ProofUri, ProvingJob, ProvingJobId, ProvingJobStatus } from '@aztec/stdlib/interfaces/server';
|
|
3
|
+
import { ProvingRequestType } from '@aztec/stdlib/proofs';
|
|
4
|
+
import { optional } from '@aztec/stdlib/schemas';
|
|
5
|
+
import { getVersioningResponseHandler } from '@aztec/stdlib/versioning';
|
|
6
|
+
import { createTracedJsonRpcServer, makeTracedFetch } from '@aztec/telemetry-client';
|
|
7
|
+
import { z } from 'zod';
|
|
8
|
+
const ProvingJobFilterSchema = z.object({
|
|
9
|
+
allowList: z.array(z.nativeEnum(ProvingRequestType))
|
|
10
|
+
});
|
|
11
|
+
const GetProvingJobResponse = z.object({
|
|
12
|
+
job: ProvingJob,
|
|
13
|
+
time: z.number()
|
|
14
|
+
});
|
|
15
|
+
export const ProvingJobProducerSchema = {
|
|
16
|
+
enqueueProvingJob: z.function().args(ProvingJob).returns(ProvingJobStatus),
|
|
17
|
+
getProvingJobStatus: z.function().args(ProvingJobId).returns(ProvingJobStatus),
|
|
18
|
+
cancelProvingJob: z.function().args(ProvingJobId).returns(z.void()),
|
|
19
|
+
getCompletedJobs: z.function().args(z.array(ProvingJobId)).returns(z.array(ProvingJobId))
|
|
20
|
+
};
|
|
21
|
+
export const ProvingJobConsumerSchema = {
|
|
22
|
+
getProvingJob: z.function().args(optional(ProvingJobFilterSchema)).returns(GetProvingJobResponse.optional()),
|
|
23
|
+
reportProvingJobError: z.function().args(ProvingJobId, z.string(), optional(z.boolean()), optional(ProvingJobFilterSchema)).returns(GetProvingJobResponse.optional()),
|
|
24
|
+
reportProvingJobProgress: z.function().args(ProvingJobId, z.number(), optional(ProvingJobFilterSchema)).returns(GetProvingJobResponse.optional()),
|
|
25
|
+
reportProvingJobSuccess: z.function().args(ProvingJobId, ProofUri, optional(ProvingJobFilterSchema)).returns(GetProvingJobResponse.optional())
|
|
26
|
+
};
|
|
27
|
+
export const ProvingJobBrokerSchema = {
|
|
28
|
+
...ProvingJobConsumerSchema,
|
|
29
|
+
...ProvingJobProducerSchema
|
|
30
|
+
};
|
|
31
|
+
export function createProvingBrokerServer(broker) {
|
|
32
|
+
return createTracedJsonRpcServer(broker, ProvingJobBrokerSchema);
|
|
33
|
+
}
|
|
34
|
+
export function createProvingJobBrokerClient(url, versions, fetch = makeTracedFetch([
|
|
35
|
+
1,
|
|
36
|
+
2,
|
|
37
|
+
3
|
|
38
|
+
], false)) {
|
|
39
|
+
return createSafeJsonRpcClient(url, ProvingJobBrokerSchema, {
|
|
40
|
+
namespaceMethods: 'proverBroker',
|
|
41
|
+
fetch,
|
|
42
|
+
onResponse: getVersioningResponseHandler(versions)
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
export function createProvingJobProducerClient(url, versions, fetch = makeTracedFetch([
|
|
46
|
+
1,
|
|
47
|
+
2,
|
|
48
|
+
3
|
|
49
|
+
], false)) {
|
|
50
|
+
return createSafeJsonRpcClient(url, ProvingJobProducerSchema, {
|
|
51
|
+
namespaceMethods: 'provingJobProducer',
|
|
52
|
+
fetch,
|
|
53
|
+
onResponse: getVersioningResponseHandler(versions)
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
export function createProvingJobConsumerClient(url, versions, fetch = makeTracedFetch([
|
|
57
|
+
1,
|
|
58
|
+
2,
|
|
59
|
+
3
|
|
60
|
+
], false)) {
|
|
61
|
+
return createSafeJsonRpcClient(url, ProvingJobConsumerSchema, {
|
|
62
|
+
namespaceMethods: 'provingJobConsumer',
|
|
63
|
+
fetch,
|
|
64
|
+
onResponse: getVersioningResponseHandler(versions)
|
|
65
|
+
});
|
|
66
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH, TUBE_PROOF_LENGTH } from '@aztec/constants';
|
|
2
|
+
import type { AvmCircuitInputs } from '@aztec/stdlib/avm';
|
|
3
|
+
import { type ProofAndVerificationKey, type ProvingJob, type ProvingJobId, type ProvingJobProducer, type ProvingJobStatus, type PublicInputsAndRecursiveProof, type ServerCircuitProver } from '@aztec/stdlib/interfaces/server';
|
|
4
|
+
import type { BaseParityInputs, RootParityInputs } from '@aztec/stdlib/parity';
|
|
5
|
+
import type { BaseOrMergeRollupPublicInputs, BlockMergeRollupInputs, BlockRootOrBlockMergePublicInputs, BlockRootRollupInputs, EmptyBlockRootRollupInputs, MergeRollupInputs, PrivateBaseRollupInputs, PublicBaseRollupInputs, RootRollupInputs, RootRollupPublicInputs, SingleTxBlockRootRollupInputs } from '@aztec/stdlib/rollup';
|
|
6
|
+
import { type ProofStore } from '../proving_broker/proof_store/index.js';
|
|
7
|
+
export declare class TestBroker implements ProvingJobProducer {
|
|
8
|
+
private proofStore;
|
|
9
|
+
private broker;
|
|
10
|
+
private agents;
|
|
11
|
+
constructor(agentCount: number, prover: ServerCircuitProver, proofStore?: ProofStore, agentPollInterval?: number);
|
|
12
|
+
start(): Promise<void>;
|
|
13
|
+
stop(): Promise<void>;
|
|
14
|
+
getProofStore(): ProofStore;
|
|
15
|
+
enqueueProvingJob(job: ProvingJob): Promise<ProvingJobStatus>;
|
|
16
|
+
getProvingJobStatus(id: ProvingJobId): Promise<ProvingJobStatus>;
|
|
17
|
+
cancelProvingJob(id: string): Promise<void>;
|
|
18
|
+
getCompletedJobs(ids: ProvingJobId[]): Promise<ProvingJobId[]>;
|
|
19
|
+
}
|
|
20
|
+
export declare class MockProver implements ServerCircuitProver {
|
|
21
|
+
constructor();
|
|
22
|
+
getAvmProof(_inputs: AvmCircuitInputs, _signal?: AbortSignal, _epochNumber?: number): Promise<ProofAndVerificationKey<4154>>;
|
|
23
|
+
getBaseParityProof(_inputs: BaseParityInputs, _signal?: AbortSignal, _epochNumber?: number): Promise<PublicInputsAndRecursiveProof<import("@aztec/stdlib/parity").ParityPublicInputs, 459>>;
|
|
24
|
+
getRootParityProof(_inputs: RootParityInputs, _signal?: AbortSignal, _epochNumber?: number): Promise<PublicInputsAndRecursiveProof<import("@aztec/stdlib/parity").ParityPublicInputs, 459>>;
|
|
25
|
+
getPrivateBaseRollupProof(_baseRollupInput: PrivateBaseRollupInputs, _signal?: AbortSignal, _epochNumber?: number): Promise<PublicInputsAndRecursiveProof<BaseOrMergeRollupPublicInputs, typeof NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH>>;
|
|
26
|
+
getPublicBaseRollupProof(_inputs: PublicBaseRollupInputs, _signal?: AbortSignal, _epochNumber?: number): Promise<PublicInputsAndRecursiveProof<BaseOrMergeRollupPublicInputs, typeof NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH>>;
|
|
27
|
+
getMergeRollupProof(_input: MergeRollupInputs, _signal?: AbortSignal, _epochNumber?: number): Promise<PublicInputsAndRecursiveProof<BaseOrMergeRollupPublicInputs, typeof NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH>>;
|
|
28
|
+
getBlockMergeRollupProof(_input: BlockMergeRollupInputs, _signal?: AbortSignal, _epochNumber?: number): Promise<PublicInputsAndRecursiveProof<BlockRootOrBlockMergePublicInputs, 538>>;
|
|
29
|
+
getEmptyBlockRootRollupProof(_input: EmptyBlockRootRollupInputs, _signal?: AbortSignal, _epochNumber?: number): Promise<PublicInputsAndRecursiveProof<BlockRootOrBlockMergePublicInputs, typeof NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH>>;
|
|
30
|
+
getBlockRootRollupProof(_input: BlockRootRollupInputs, _signal?: AbortSignal, _epochNumber?: number): Promise<PublicInputsAndRecursiveProof<BlockRootOrBlockMergePublicInputs, typeof NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH>>;
|
|
31
|
+
getSingleTxBlockRootRollupProof(_input: SingleTxBlockRootRollupInputs, _signal?: AbortSignal, _epochNumber?: number): Promise<PublicInputsAndRecursiveProof<BlockRootOrBlockMergePublicInputs, typeof NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH>>;
|
|
32
|
+
getRootRollupProof(_input: RootRollupInputs, _signal?: AbortSignal, _epochNumber?: number): Promise<PublicInputsAndRecursiveProof<RootRollupPublicInputs>>;
|
|
33
|
+
getTubeProof(): Promise<ProofAndVerificationKey<typeof TUBE_PROOF_LENGTH>>;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=mock_prover.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mock_prover.d.ts","sourceRoot":"","sources":["../../src/test/mock_prover.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { AVM_PROOF_LENGTH_IN_FIELDS, AVM_VERIFICATION_KEY_LENGTH_IN_FIELDS, NESTED_RECURSIVE_PROOF_LENGTH, NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH, RECURSIVE_PROOF_LENGTH, TUBE_PROOF_LENGTH } from '@aztec/constants';
|
|
2
|
+
import { times } from '@aztec/foundation/collection';
|
|
3
|
+
import { makeProofAndVerificationKey, makePublicInputsAndRecursiveProof } from '@aztec/stdlib/interfaces/server';
|
|
4
|
+
import { makeEmptyRecursiveProof, makeRecursiveProof } from '@aztec/stdlib/proofs';
|
|
5
|
+
import { makeBaseOrMergeRollupPublicInputs, makeBlockRootOrBlockMergeRollupPublicInputs, makeParityPublicInputs, makeRootRollupPublicInputs } from '@aztec/stdlib/testing';
|
|
6
|
+
import { VerificationKeyData } from '@aztec/stdlib/vks';
|
|
7
|
+
import { InlineProofStore } from '../proving_broker/proof_store/index.js';
|
|
8
|
+
import { ProvingAgent } from '../proving_broker/proving_agent.js';
|
|
9
|
+
import { ProvingBroker } from '../proving_broker/proving_broker.js';
|
|
10
|
+
import { InMemoryBrokerDatabase } from '../proving_broker/proving_broker_database/memory.js';
|
|
11
|
+
export class TestBroker {
|
|
12
|
+
proofStore;
|
|
13
|
+
broker;
|
|
14
|
+
agents;
|
|
15
|
+
constructor(agentCount, prover, proofStore = new InlineProofStore(), agentPollInterval = 100){
|
|
16
|
+
this.proofStore = proofStore;
|
|
17
|
+
this.broker = new ProvingBroker(new InMemoryBrokerDatabase());
|
|
18
|
+
this.agents = times(agentCount, ()=>new ProvingAgent(this.broker, proofStore, prover, undefined, agentPollInterval));
|
|
19
|
+
}
|
|
20
|
+
async start() {
|
|
21
|
+
await this.broker.start();
|
|
22
|
+
this.agents.forEach((agent)=>agent.start());
|
|
23
|
+
}
|
|
24
|
+
async stop() {
|
|
25
|
+
await Promise.all(this.agents.map((agent)=>agent.stop()));
|
|
26
|
+
await this.broker.stop();
|
|
27
|
+
}
|
|
28
|
+
getProofStore() {
|
|
29
|
+
return this.proofStore;
|
|
30
|
+
}
|
|
31
|
+
enqueueProvingJob(job) {
|
|
32
|
+
return this.broker.enqueueProvingJob(job);
|
|
33
|
+
}
|
|
34
|
+
getProvingJobStatus(id) {
|
|
35
|
+
return this.broker.getProvingJobStatus(id);
|
|
36
|
+
}
|
|
37
|
+
cancelProvingJob(id) {
|
|
38
|
+
return this.broker.cancelProvingJob(id);
|
|
39
|
+
}
|
|
40
|
+
getCompletedJobs(ids) {
|
|
41
|
+
return this.broker.getCompletedJobs(ids);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
export class MockProver {
|
|
45
|
+
constructor(){}
|
|
46
|
+
getAvmProof(_inputs, _signal, _epochNumber) {
|
|
47
|
+
return Promise.resolve(makeProofAndVerificationKey(makeEmptyRecursiveProof(AVM_PROOF_LENGTH_IN_FIELDS), VerificationKeyData.makeFake(AVM_VERIFICATION_KEY_LENGTH_IN_FIELDS)));
|
|
48
|
+
}
|
|
49
|
+
getBaseParityProof(_inputs, _signal, _epochNumber) {
|
|
50
|
+
return Promise.resolve(makePublicInputsAndRecursiveProof(makeParityPublicInputs(), makeRecursiveProof(RECURSIVE_PROOF_LENGTH), VerificationKeyData.makeFakeHonk()));
|
|
51
|
+
}
|
|
52
|
+
getRootParityProof(_inputs, _signal, _epochNumber) {
|
|
53
|
+
return Promise.resolve(makePublicInputsAndRecursiveProof(makeParityPublicInputs(), makeRecursiveProof(NESTED_RECURSIVE_PROOF_LENGTH), VerificationKeyData.makeFakeHonk()));
|
|
54
|
+
}
|
|
55
|
+
getPrivateBaseRollupProof(_baseRollupInput, _signal, _epochNumber) {
|
|
56
|
+
return Promise.resolve(makePublicInputsAndRecursiveProof(makeBaseOrMergeRollupPublicInputs(), makeRecursiveProof(NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH), VerificationKeyData.makeFakeRollupHonk()));
|
|
57
|
+
}
|
|
58
|
+
getPublicBaseRollupProof(_inputs, _signal, _epochNumber) {
|
|
59
|
+
return Promise.resolve(makePublicInputsAndRecursiveProof(makeBaseOrMergeRollupPublicInputs(), makeRecursiveProof(NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH), VerificationKeyData.makeFakeRollupHonk()));
|
|
60
|
+
}
|
|
61
|
+
getMergeRollupProof(_input, _signal, _epochNumber) {
|
|
62
|
+
return Promise.resolve(makePublicInputsAndRecursiveProof(makeBaseOrMergeRollupPublicInputs(), makeRecursiveProof(NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH), VerificationKeyData.makeFakeRollupHonk()));
|
|
63
|
+
}
|
|
64
|
+
getBlockMergeRollupProof(_input, _signal, _epochNumber) {
|
|
65
|
+
return Promise.resolve(makePublicInputsAndRecursiveProof(makeBlockRootOrBlockMergeRollupPublicInputs(), makeRecursiveProof(NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH), VerificationKeyData.makeFakeRollupHonk()));
|
|
66
|
+
}
|
|
67
|
+
getEmptyBlockRootRollupProof(_input, _signal, _epochNumber) {
|
|
68
|
+
return Promise.resolve(makePublicInputsAndRecursiveProof(makeBlockRootOrBlockMergeRollupPublicInputs(), makeRecursiveProof(NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH), VerificationKeyData.makeFakeRollupHonk()));
|
|
69
|
+
}
|
|
70
|
+
getBlockRootRollupProof(_input, _signal, _epochNumber) {
|
|
71
|
+
return Promise.resolve(makePublicInputsAndRecursiveProof(makeBlockRootOrBlockMergeRollupPublicInputs(), makeRecursiveProof(NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH), VerificationKeyData.makeFakeRollupHonk()));
|
|
72
|
+
}
|
|
73
|
+
getSingleTxBlockRootRollupProof(_input, _signal, _epochNumber) {
|
|
74
|
+
return Promise.resolve(makePublicInputsAndRecursiveProof(makeBlockRootOrBlockMergeRollupPublicInputs(), makeRecursiveProof(NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH), VerificationKeyData.makeFakeHonk()));
|
|
75
|
+
}
|
|
76
|
+
getRootRollupProof(_input, _signal, _epochNumber) {
|
|
77
|
+
return Promise.resolve(makePublicInputsAndRecursiveProof(makeRootRollupPublicInputs(), makeRecursiveProof(RECURSIVE_PROOF_LENGTH), VerificationKeyData.makeFakeHonk()));
|
|
78
|
+
}
|
|
79
|
+
getTubeProof() {
|
|
80
|
+
return Promise.resolve(makeProofAndVerificationKey(makeRecursiveProof(TUBE_PROOF_LENGTH), VerificationKeyData.makeFakeRollupHonk()));
|
|
81
|
+
}
|
|
82
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@aztec/prover-client",
|
|
3
|
+
"version": "0.0.0-test.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"exports": {
|
|
6
|
+
".": "./dest/index.js",
|
|
7
|
+
"./block-builder": "./dest/block_builder/index.js",
|
|
8
|
+
"./broker": "./dest/proving_broker/index.js",
|
|
9
|
+
"./orchestrator": "./dest/orchestrator/index.js",
|
|
10
|
+
"./helpers": "./dest/orchestrator/block-building-helpers.js",
|
|
11
|
+
"./config": "./dest/config.js"
|
|
12
|
+
},
|
|
13
|
+
"typedocOptions": {
|
|
14
|
+
"entryPoints": [
|
|
15
|
+
"./src/index.ts"
|
|
16
|
+
],
|
|
17
|
+
"name": "Prover Client",
|
|
18
|
+
"tsconfig": "./tsconfig.json"
|
|
19
|
+
},
|
|
20
|
+
"inherits": [
|
|
21
|
+
"../package.common.json",
|
|
22
|
+
"./package.local.json"
|
|
23
|
+
],
|
|
24
|
+
"scripts": {
|
|
25
|
+
"build": "yarn clean && tsc -b",
|
|
26
|
+
"build:dev": "tsc -b --watch",
|
|
27
|
+
"clean": "rm -rf ./dest .tsbuildinfo",
|
|
28
|
+
"formatting": "run -T prettier --check ./src && run -T eslint ./src",
|
|
29
|
+
"formatting:fix": "run -T eslint --fix ./src && run -T prettier -w ./src",
|
|
30
|
+
"bb": "node --no-warnings ./dest/bb/index.js",
|
|
31
|
+
"test": "NODE_NO_WARNINGS=1 node --experimental-vm-modules ../node_modules/.bin/jest --testTimeout=3500000 --forceExit",
|
|
32
|
+
"test:debug": "LOG_LEVEL=debug NODE_NO_WARNINGS=1 node --experimental-vm-modules ../node_modules/.bin/jest --testTimeout=1500000 --forceExit --testNamePattern prover/bb_prover/parity",
|
|
33
|
+
"get-proof-inputs": "node --no-warnings ./dest/bin/get-proof-inputs.js"
|
|
34
|
+
},
|
|
35
|
+
"jest": {
|
|
36
|
+
"moduleNameMapper": {
|
|
37
|
+
"^(\\.{1,2}/.*)\\.[cm]?js$": "$1"
|
|
38
|
+
},
|
|
39
|
+
"testRegex": "./src/.*\\.test\\.(js|mjs|ts)$",
|
|
40
|
+
"rootDir": "./src",
|
|
41
|
+
"transform": {
|
|
42
|
+
"^.+\\.tsx?$": [
|
|
43
|
+
"@swc/jest",
|
|
44
|
+
{
|
|
45
|
+
"jsc": {
|
|
46
|
+
"parser": {
|
|
47
|
+
"syntax": "typescript",
|
|
48
|
+
"decorators": true
|
|
49
|
+
},
|
|
50
|
+
"transform": {
|
|
51
|
+
"decoratorVersion": "2022-03"
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
]
|
|
56
|
+
},
|
|
57
|
+
"extensionsToTreatAsEsm": [
|
|
58
|
+
".ts"
|
|
59
|
+
],
|
|
60
|
+
"reporters": [
|
|
61
|
+
"default"
|
|
62
|
+
],
|
|
63
|
+
"testTimeout": 120000,
|
|
64
|
+
"setupFiles": [
|
|
65
|
+
"../../foundation/src/jest/setup.mjs"
|
|
66
|
+
]
|
|
67
|
+
},
|
|
68
|
+
"dependencies": {
|
|
69
|
+
"@aztec/bb-prover": "0.0.0-test.0",
|
|
70
|
+
"@aztec/blob-lib": "0.0.0-test.0",
|
|
71
|
+
"@aztec/constants": "0.0.0-test.0",
|
|
72
|
+
"@aztec/ethereum": "0.0.0-test.0",
|
|
73
|
+
"@aztec/foundation": "0.0.0-test.0",
|
|
74
|
+
"@aztec/kv-store": "0.0.0-test.0",
|
|
75
|
+
"@aztec/noir-protocol-circuits-types": "0.0.0-test.0",
|
|
76
|
+
"@aztec/protocol-contracts": "0.0.0-test.0",
|
|
77
|
+
"@aztec/simulator": "0.0.0-test.0",
|
|
78
|
+
"@aztec/stdlib": "0.0.0-test.0",
|
|
79
|
+
"@aztec/telemetry-client": "0.0.0-test.0",
|
|
80
|
+
"@aztec/world-state": "0.0.0-test.0",
|
|
81
|
+
"@google-cloud/storage": "^7.15.0",
|
|
82
|
+
"@iarna/toml": "^2.2.5",
|
|
83
|
+
"commander": "^12.1.0",
|
|
84
|
+
"lodash.chunk": "^4.2.0",
|
|
85
|
+
"source-map-support": "^0.5.21",
|
|
86
|
+
"tslib": "^2.4.0",
|
|
87
|
+
"zod": "^3.23.8",
|
|
88
|
+
"@aztec/noir-types": "0.0.0-test.0"
|
|
89
|
+
},
|
|
90
|
+
"devDependencies": {
|
|
91
|
+
"@aztec/noir-contracts.js": "0.0.0-test.0",
|
|
92
|
+
"@jest/globals": "^29.5.0",
|
|
93
|
+
"@types/jest": "^29.5.0",
|
|
94
|
+
"@types/memdown": "^3.0.0",
|
|
95
|
+
"@types/node": "^18.7.23",
|
|
96
|
+
"@types/source-map-support": "^0.5.10",
|
|
97
|
+
"get-port": "^7.1.0",
|
|
98
|
+
"jest": "^29.5.0",
|
|
99
|
+
"jest-mock-extended": "^3.0.3",
|
|
100
|
+
"ts-node": "^10.9.1",
|
|
101
|
+
"typescript": "^5.0.4"
|
|
102
|
+
},
|
|
103
|
+
"files": [
|
|
104
|
+
"dest",
|
|
105
|
+
"src",
|
|
106
|
+
"!*.test.*"
|
|
107
|
+
],
|
|
108
|
+
"types": "./dest/index.d.ts",
|
|
109
|
+
"engines": {
|
|
110
|
+
"node": ">=18"
|
|
111
|
+
}
|
|
112
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/* eslint-disable no-console */
|
|
2
|
+
import { AVM_INPUTS_FILENAME } from '@aztec/bb-prover';
|
|
3
|
+
import { jsonParseWithSchema, jsonStringify } from '@aztec/foundation/json-rpc';
|
|
4
|
+
import { createLogger } from '@aztec/foundation/log';
|
|
5
|
+
import { type ProofUri, ProvingJobInputs } from '@aztec/stdlib/interfaces/server';
|
|
6
|
+
import { ProvingRequestType } from '@aztec/stdlib/proofs';
|
|
7
|
+
|
|
8
|
+
import { mkdirSync, writeFileSync } from 'fs';
|
|
9
|
+
|
|
10
|
+
import { createProofStoreForUri } from '../proving_broker/index.js';
|
|
11
|
+
|
|
12
|
+
const logger = createLogger('prover-client:get-proof-inputs');
|
|
13
|
+
|
|
14
|
+
function printUsage() {
|
|
15
|
+
console.error('Usage: get-proof-inputs <proof-uri> [out-dir=.]');
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
async function main() {
|
|
19
|
+
if (process.argv[2] === '--help') {
|
|
20
|
+
printUsage();
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
const uri = process.argv[2];
|
|
25
|
+
const outDir = process.argv[3] || '.';
|
|
26
|
+
if (!uri) {
|
|
27
|
+
printUsage();
|
|
28
|
+
throw new Error('Missing proof URI');
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
mkdirSync(outDir, { recursive: true });
|
|
32
|
+
|
|
33
|
+
const proofStore = createProofStoreForUri(uri);
|
|
34
|
+
logger.info(`Processing uri ${uri}`);
|
|
35
|
+
const input = await proofStore.getProofInput(uri as ProofUri);
|
|
36
|
+
logger.info(`Found inputs for ${ProvingRequestType[input.type]}`);
|
|
37
|
+
writeProofInputs(input, outDir);
|
|
38
|
+
|
|
39
|
+
console.log((await jsonParseWithSchema(jsonStringify(input), ProvingJobInputs)).inputs);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// This mimics the behavior of bb-prover/src/bb/execute.ts
|
|
43
|
+
function writeProofInputs(input: ProvingJobInputs, outDir: string) {
|
|
44
|
+
switch (input.type) {
|
|
45
|
+
case ProvingRequestType.PUBLIC_VM: {
|
|
46
|
+
writeFileSync(`${outDir}/${AVM_INPUTS_FILENAME}`, input.inputs.serializeWithMessagePack());
|
|
47
|
+
logger.info(`Wrote AVM inputs to ${AVM_INPUTS_FILENAME}`);
|
|
48
|
+
break;
|
|
49
|
+
}
|
|
50
|
+
default: {
|
|
51
|
+
throw new Error(`Unimplemented proving request type: ${ProvingRequestType[input.type]}`);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
main().catch(err => {
|
|
57
|
+
console.error(err);
|
|
58
|
+
process.exit(1);
|
|
59
|
+
});
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { SpongeBlob } from '@aztec/blob-lib';
|
|
2
|
+
import { NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP } from '@aztec/constants';
|
|
3
|
+
import { padArrayEnd } from '@aztec/foundation/collection';
|
|
4
|
+
import { Fr } from '@aztec/foundation/fields';
|
|
5
|
+
import { createLogger } from '@aztec/foundation/log';
|
|
6
|
+
import { L2Block } from '@aztec/stdlib/block';
|
|
7
|
+
import type { BlockBuilder, MerkleTreeWriteOperations } from '@aztec/stdlib/interfaces/server';
|
|
8
|
+
import { MerkleTreeId } from '@aztec/stdlib/trees';
|
|
9
|
+
import { type GlobalVariables, type ProcessedTx, toNumBlobFields } from '@aztec/stdlib/tx';
|
|
10
|
+
import { type TelemetryClient, getTelemetryClient } from '@aztec/telemetry-client';
|
|
11
|
+
|
|
12
|
+
import {
|
|
13
|
+
buildBaseRollupHints,
|
|
14
|
+
buildHeaderAndBodyFromTxs,
|
|
15
|
+
getTreeSnapshot,
|
|
16
|
+
} from '../orchestrator/block-building-helpers.js';
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Builds a block and its header from a set of processed tx without running any circuits.
|
|
20
|
+
*/
|
|
21
|
+
export class LightweightBlockBuilder implements BlockBuilder {
|
|
22
|
+
private spongeBlobState?: SpongeBlob;
|
|
23
|
+
private globalVariables?: GlobalVariables;
|
|
24
|
+
private l1ToL2Messages?: Fr[];
|
|
25
|
+
|
|
26
|
+
private txs: ProcessedTx[] = [];
|
|
27
|
+
|
|
28
|
+
private readonly logger = createLogger('prover-client:block_builder');
|
|
29
|
+
|
|
30
|
+
constructor(private db: MerkleTreeWriteOperations, private telemetry: TelemetryClient = getTelemetryClient()) {}
|
|
31
|
+
|
|
32
|
+
async startNewBlock(globalVariables: GlobalVariables, l1ToL2Messages: Fr[]): Promise<void> {
|
|
33
|
+
this.logger.debug('Starting new block', { globalVariables: globalVariables.toInspect(), l1ToL2Messages });
|
|
34
|
+
this.globalVariables = globalVariables;
|
|
35
|
+
this.l1ToL2Messages = padArrayEnd(l1ToL2Messages, Fr.ZERO, NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP);
|
|
36
|
+
this.txs = [];
|
|
37
|
+
this.spongeBlobState = undefined;
|
|
38
|
+
|
|
39
|
+
// Update L1 to L2 tree
|
|
40
|
+
await this.db.appendLeaves(MerkleTreeId.L1_TO_L2_MESSAGE_TREE, this.l1ToL2Messages!);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
async addTxs(txs: ProcessedTx[]): Promise<void> {
|
|
44
|
+
this.spongeBlobState = SpongeBlob.init(toNumBlobFields(txs));
|
|
45
|
+
for (const tx of txs) {
|
|
46
|
+
this.logger.debug('Adding new tx to block', { txHash: tx.hash.toString() });
|
|
47
|
+
this.txs.push(tx);
|
|
48
|
+
await buildBaseRollupHints(tx, this.globalVariables!, this.db, this.spongeBlobState!);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
setBlockCompleted(): Promise<L2Block> {
|
|
53
|
+
return this.buildBlock();
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
private async buildBlock(): Promise<L2Block> {
|
|
57
|
+
const { header, body } = await buildHeaderAndBodyFromTxs(
|
|
58
|
+
this.txs,
|
|
59
|
+
this.globalVariables!,
|
|
60
|
+
this.l1ToL2Messages!,
|
|
61
|
+
this.db,
|
|
62
|
+
);
|
|
63
|
+
|
|
64
|
+
await this.db.updateArchive(header);
|
|
65
|
+
const newArchive = await getTreeSnapshot(MerkleTreeId.ARCHIVE, this.db);
|
|
66
|
+
|
|
67
|
+
const block = new L2Block(newArchive, header, body);
|
|
68
|
+
this.logger.debug(`Built block ${block.number}`, {
|
|
69
|
+
globalVariables: this.globalVariables?.toInspect(),
|
|
70
|
+
archiveRoot: newArchive.root.toString(),
|
|
71
|
+
blockHash: block.hash.toString(),
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
return block;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export class LightweightBlockBuilderFactory {
|
|
79
|
+
constructor(private telemetry: TelemetryClient = getTelemetryClient()) {}
|
|
80
|
+
|
|
81
|
+
create(db: MerkleTreeWriteOperations): BlockBuilder {
|
|
82
|
+
return new LightweightBlockBuilder(db, this.telemetry);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Creates a block builder under the hood with the given txs and messages and creates a block.
|
|
88
|
+
* @param db - A db fork to use for block building.
|
|
89
|
+
*/
|
|
90
|
+
export async function buildBlock(
|
|
91
|
+
txs: ProcessedTx[],
|
|
92
|
+
globalVariables: GlobalVariables,
|
|
93
|
+
l1ToL2Messages: Fr[],
|
|
94
|
+
db: MerkleTreeWriteOperations,
|
|
95
|
+
telemetry: TelemetryClient = getTelemetryClient(),
|
|
96
|
+
) {
|
|
97
|
+
const builder = new LightweightBlockBuilder(db, telemetry);
|
|
98
|
+
await builder.startNewBlock(globalVariables, l1ToL2Messages);
|
|
99
|
+
await builder.addTxs(txs);
|
|
100
|
+
return await builder.setBlockCompleted();
|
|
101
|
+
}
|
package/src/config.ts
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import type { ACVMConfig, BBConfig } from '@aztec/bb-prover';
|
|
2
|
+
import { type ConfigMappingsType, booleanConfigHelper, getConfigFromMappings } from '@aztec/foundation/config';
|
|
3
|
+
import { type ProverConfig, proverConfigMappings } from '@aztec/stdlib/interfaces/server';
|
|
4
|
+
|
|
5
|
+
import {
|
|
6
|
+
type ProverAgentConfig,
|
|
7
|
+
type ProverBrokerConfig,
|
|
8
|
+
proverAgentConfigMappings,
|
|
9
|
+
proverBrokerConfigMappings,
|
|
10
|
+
} from './proving_broker/config.js';
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* The prover configuration.
|
|
14
|
+
*/
|
|
15
|
+
export type ProverClientConfig = ProverConfig & ProverAgentConfig & ProverBrokerConfig & BBConfig & ACVMConfig;
|
|
16
|
+
|
|
17
|
+
export const bbConfigMappings: ConfigMappingsType<BBConfig & ACVMConfig> = {
|
|
18
|
+
acvmWorkingDirectory: {
|
|
19
|
+
env: 'ACVM_WORKING_DIRECTORY',
|
|
20
|
+
description: 'The working directory to use for simulation/proving',
|
|
21
|
+
},
|
|
22
|
+
acvmBinaryPath: {
|
|
23
|
+
env: 'ACVM_BINARY_PATH',
|
|
24
|
+
description: 'The path to the ACVM binary',
|
|
25
|
+
},
|
|
26
|
+
bbWorkingDirectory: {
|
|
27
|
+
env: 'BB_WORKING_DIRECTORY',
|
|
28
|
+
description: 'The working directory to use for proving',
|
|
29
|
+
},
|
|
30
|
+
bbBinaryPath: {
|
|
31
|
+
env: 'BB_BINARY_PATH',
|
|
32
|
+
description: 'The path to the bb binary',
|
|
33
|
+
},
|
|
34
|
+
bbSkipCleanup: {
|
|
35
|
+
env: 'BB_SKIP_CLEANUP',
|
|
36
|
+
description: 'Whether to skip cleanup of bb temporary files',
|
|
37
|
+
...booleanConfigHelper(false),
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
export const proverClientConfigMappings: ConfigMappingsType<ProverClientConfig> = {
|
|
42
|
+
...bbConfigMappings,
|
|
43
|
+
...proverConfigMappings,
|
|
44
|
+
...proverAgentConfigMappings,
|
|
45
|
+
...proverBrokerConfigMappings,
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Returns the prover configuration from the environment variables.
|
|
50
|
+
* Note: If an environment variable is not set, the default value is used.
|
|
51
|
+
* @returns The prover configuration.
|
|
52
|
+
*/
|
|
53
|
+
export function getProverEnvVars(): ProverClientConfig {
|
|
54
|
+
return getConfigFromMappings<ProverClientConfig>(proverClientConfigMappings);
|
|
55
|
+
}
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { MAX_NOTE_HASHES_PER_TX, MAX_NULLIFIERS_PER_TX, NULLIFIER_TREE_HEIGHT } from '@aztec/constants';
|
|
2
|
+
import { padArrayEnd } from '@aztec/foundation/collection';
|
|
3
|
+
import { randomBytes } from '@aztec/foundation/crypto';
|
|
4
|
+
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
5
|
+
import { Fr } from '@aztec/foundation/fields';
|
|
6
|
+
import type { Logger } from '@aztec/foundation/log';
|
|
7
|
+
import { fileURLToPath } from '@aztec/foundation/url';
|
|
8
|
+
import { NativeACVMSimulator, type SimulationProvider, WASMSimulatorWithBlobs } from '@aztec/simulator/server';
|
|
9
|
+
import { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
10
|
+
import { GasFees } from '@aztec/stdlib/gas';
|
|
11
|
+
import type { MerkleTreeWriteOperations } from '@aztec/stdlib/interfaces/server';
|
|
12
|
+
import { MerkleTreeId } from '@aztec/stdlib/trees';
|
|
13
|
+
import type { ProcessedTx } from '@aztec/stdlib/tx';
|
|
14
|
+
import { GlobalVariables } from '@aztec/stdlib/tx';
|
|
15
|
+
|
|
16
|
+
import { promises as fs } from 'fs';
|
|
17
|
+
import path from 'path';
|
|
18
|
+
|
|
19
|
+
const {
|
|
20
|
+
BB_RELEASE_DIR = 'cpp/build/bin',
|
|
21
|
+
TEMP_DIR = '/tmp',
|
|
22
|
+
BB_BINARY_PATH = '',
|
|
23
|
+
BB_WORKING_DIRECTORY = '',
|
|
24
|
+
BB_SKIP_CLEANUP = '',
|
|
25
|
+
NOIR_RELEASE_DIR = 'noir-repo/target/release',
|
|
26
|
+
ACVM_BINARY_PATH = '',
|
|
27
|
+
ACVM_WORKING_DIRECTORY = '',
|
|
28
|
+
} = process.env;
|
|
29
|
+
|
|
30
|
+
// Determines if we have access to the bb binary and a tmp folder for temp files
|
|
31
|
+
export const getEnvironmentConfig = async (logger: Logger) => {
|
|
32
|
+
try {
|
|
33
|
+
const expectedBBPath = BB_BINARY_PATH
|
|
34
|
+
? BB_BINARY_PATH
|
|
35
|
+
: `${path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../../../../barretenberg/', BB_RELEASE_DIR)}/bb`;
|
|
36
|
+
await fs.access(expectedBBPath, fs.constants.R_OK);
|
|
37
|
+
const tempWorkingDirectory = `${TEMP_DIR}/${randomBytes(4).toString('hex')}`;
|
|
38
|
+
const bbWorkingDirectory = BB_WORKING_DIRECTORY ? BB_WORKING_DIRECTORY : `${tempWorkingDirectory}/bb`;
|
|
39
|
+
await fs.mkdir(bbWorkingDirectory, { recursive: true });
|
|
40
|
+
logger.info(`Found native BB binary at ${expectedBBPath} with working directory ${bbWorkingDirectory}`);
|
|
41
|
+
|
|
42
|
+
const expectedAcvmPath = ACVM_BINARY_PATH
|
|
43
|
+
? ACVM_BINARY_PATH
|
|
44
|
+
: `${path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../../../../noir/', NOIR_RELEASE_DIR)}/acvm`;
|
|
45
|
+
await fs.access(expectedAcvmPath, fs.constants.R_OK);
|
|
46
|
+
const acvmWorkingDirectory = ACVM_WORKING_DIRECTORY ? ACVM_WORKING_DIRECTORY : `${tempWorkingDirectory}/acvm`;
|
|
47
|
+
await fs.mkdir(acvmWorkingDirectory, { recursive: true });
|
|
48
|
+
logger.info(`Found native ACVM binary at ${expectedAcvmPath} with working directory ${acvmWorkingDirectory}`);
|
|
49
|
+
|
|
50
|
+
const bbSkipCleanup = ['1', 'true'].includes(BB_SKIP_CLEANUP);
|
|
51
|
+
bbSkipCleanup && logger.verbose(`Not going to clean up BB working directory ${bbWorkingDirectory} after run`);
|
|
52
|
+
|
|
53
|
+
return {
|
|
54
|
+
acvmWorkingDirectory,
|
|
55
|
+
bbWorkingDirectory,
|
|
56
|
+
expectedAcvmPath,
|
|
57
|
+
expectedBBPath,
|
|
58
|
+
directoryToCleanup: ACVM_WORKING_DIRECTORY && BB_WORKING_DIRECTORY ? undefined : tempWorkingDirectory,
|
|
59
|
+
bbSkipCleanup,
|
|
60
|
+
};
|
|
61
|
+
} catch (err) {
|
|
62
|
+
logger.info(`Native BB not available: ${err}`);
|
|
63
|
+
return undefined;
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
export async function getSimulationProvider(
|
|
68
|
+
config: { acvmWorkingDirectory: string | undefined; acvmBinaryPath: string | undefined },
|
|
69
|
+
logger?: Logger,
|
|
70
|
+
): Promise<SimulationProvider> {
|
|
71
|
+
if (config.acvmBinaryPath && config.acvmWorkingDirectory) {
|
|
72
|
+
try {
|
|
73
|
+
await fs.access(config.acvmBinaryPath, fs.constants.R_OK);
|
|
74
|
+
await fs.mkdir(config.acvmWorkingDirectory, { recursive: true });
|
|
75
|
+
logger?.info(
|
|
76
|
+
`Using native ACVM at ${config.acvmBinaryPath} and working directory ${config.acvmWorkingDirectory}`,
|
|
77
|
+
);
|
|
78
|
+
return new NativeACVMSimulator(config.acvmWorkingDirectory, config.acvmBinaryPath);
|
|
79
|
+
} catch {
|
|
80
|
+
logger?.warn(`Failed to access ACVM at ${config.acvmBinaryPath}, falling back to WASM`);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
logger?.info('Using WASM ACVM simulation');
|
|
84
|
+
return new WASMSimulatorWithBlobs();
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// Updates the expectedDb trees based on the new note hashes, contracts, and nullifiers from these txs
|
|
88
|
+
export const updateExpectedTreesFromTxs = async (db: MerkleTreeWriteOperations, txs: ProcessedTx[]) => {
|
|
89
|
+
await db.appendLeaves(
|
|
90
|
+
MerkleTreeId.NOTE_HASH_TREE,
|
|
91
|
+
txs.flatMap(tx => padArrayEnd(tx.txEffect.noteHashes, Fr.zero(), MAX_NOTE_HASHES_PER_TX)),
|
|
92
|
+
);
|
|
93
|
+
await db.batchInsert(
|
|
94
|
+
MerkleTreeId.NULLIFIER_TREE,
|
|
95
|
+
txs.flatMap(tx => padArrayEnd(tx.txEffect.nullifiers, Fr.zero(), MAX_NULLIFIERS_PER_TX).map(x => x.toBuffer())),
|
|
96
|
+
NULLIFIER_TREE_HEIGHT,
|
|
97
|
+
);
|
|
98
|
+
for (const tx of txs) {
|
|
99
|
+
await db.sequentialInsert(
|
|
100
|
+
MerkleTreeId.PUBLIC_DATA_TREE,
|
|
101
|
+
tx.txEffect.publicDataWrites.map(write => write.toBuffer()),
|
|
102
|
+
);
|
|
103
|
+
}
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
export const makeGlobals = (blockNumber: number) => {
|
|
107
|
+
return new GlobalVariables(
|
|
108
|
+
Fr.ZERO,
|
|
109
|
+
Fr.ZERO,
|
|
110
|
+
new Fr(blockNumber) /** block number */,
|
|
111
|
+
new Fr(blockNumber) /** slot number */,
|
|
112
|
+
new Fr(blockNumber) /** timestamp */,
|
|
113
|
+
EthAddress.ZERO,
|
|
114
|
+
AztecAddress.ZERO,
|
|
115
|
+
GasFees.empty(),
|
|
116
|
+
);
|
|
117
|
+
};
|