sp1_prover/worker/prover/
vk_worker.rs1use sp1_hypercube::{log2_ceil_usize, prover::ProverSemaphore};
2use sp1_prover_types::ArtifactClient;
3
4use crate::{
5 shapes::build_vk_map,
6 worker::{RawTaskRequest, ShrinkProver, TaskError, VkeyMapChunkInput, VkeyMapChunkOutput},
7 SP1ProverComponents,
8};
9use std::sync::Arc;
10
11pub struct RecursionVkWorker<C: SP1ProverComponents> {
12 pub recursion_prover: Arc<C::RecursionProver>,
13 pub recursion_permits: ProverSemaphore,
14 pub shrink_prover: Arc<ShrinkProver<C>>,
15}
16
17impl<C: SP1ProverComponents> Clone for RecursionVkWorker<C> {
18 fn clone(&self) -> Self {
19 Self {
20 recursion_prover: self.recursion_prover.clone(),
21 recursion_permits: self.recursion_permits.clone(),
22 shrink_prover: self.shrink_prover.clone(),
23 }
24 }
25}
26
27pub async fn run_vk_generation<A: ArtifactClient, C: SP1ProverComponents>(
28 worker: Arc<RecursionVkWorker<C>>,
29 request: RawTaskRequest,
30 client: A,
31) -> Result<(), TaskError> {
32 let RawTaskRequest { inputs, outputs, .. } = request;
33
34 let VkeyMapChunkInput { indices, reduce_batch_size, total_inputs } =
35 client.download(&inputs[0]).await?;
36
37 let (vk_set, panic_indices) = build_vk_map::<A, C>(
38 false,
39 1,
40 1,
41 Some(indices),
42 reduce_batch_size,
43 log2_ceil_usize(total_inputs),
44 worker,
45 )
46 .await;
47
48 let output = VkeyMapChunkOutput { vk_set, panic_indices };
49
50 client.upload(&outputs[0], &output).await?;
51
52 Ok(())
53}