Skip to main content

sp1_prover/worker/prover/
vk_worker.rs

1use 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}