Skip to main content

sp1_sdk/env/
prove.rs

1use std::{
2    future::{Future, IntoFuture},
3    pin::Pin,
4};
5
6use super::{EnvProver, EnvProvingKey};
7use crate::{prover::BaseProveRequest, ProveRequest, Prover, SP1ProofWithPublicValues};
8use anyhow::Result;
9
10/// A prover request for the [`EnvProver`].
11pub struct EnvProveRequest<'a> {
12    pub(crate) base: BaseProveRequest<'a, EnvProver>,
13}
14
15impl<'a> ProveRequest<'a, EnvProver> for EnvProveRequest<'a> {
16    fn base(&mut self) -> &mut BaseProveRequest<'a, EnvProver> {
17        &mut self.base
18    }
19}
20
21impl<'a> IntoFuture for EnvProveRequest<'a> {
22    type Output = Result<SP1ProofWithPublicValues>;
23
24    type IntoFuture = Pin<Box<dyn Future<Output = Self::Output> + Send + 'a>>;
25
26    fn into_future(self) -> Self::IntoFuture {
27        let BaseProveRequest { prover, pk, stdin, mode, context_builder } = self.base;
28
29        match prover {
30            EnvProver::Cpu(prover) => match pk {
31                EnvProvingKey::Cpu { pk, .. } => {
32                    let mut req = prover.prove(pk, stdin);
33                    req.base.mode = mode;
34                    req.base.context_builder = context_builder;
35
36                    Box::pin(async move { Ok(req.into_future().await?) })
37                }
38                _ => panic!("Invalid proving key type for CPU prover"),
39            },
40            #[cfg(feature = "cuda")]
41            EnvProver::Cuda(prover) => match self.base.pk {
42                EnvProvingKey::Cuda { pk, .. } => {
43                    let mut req = prover.prove(pk, stdin);
44                    req.base.mode = mode;
45                    req.base.context_builder = context_builder;
46
47                    Box::pin(async move { Ok(req.into_future().await?) })
48                }
49                _ => panic!("Invalid proving key type for CUDA prover"),
50            },
51            EnvProver::Mock(prover) => match self.base.pk {
52                EnvProvingKey::Mock { pk, .. } => {
53                    let mut req = prover.prove(pk, stdin);
54                    req.base.mode = mode;
55                    req.base.context_builder = context_builder;
56
57                    Box::pin(async move { req.await })
58                }
59                _ => panic!("Invalid proving key type for Mock prover"),
60            },
61            EnvProver::Light(prover) => match self.base.pk {
62                EnvProvingKey::Light { pk, .. } => {
63                    let mut req = prover.prove(pk, stdin);
64                    req.base.mode = mode;
65                    req.base.context_builder = context_builder;
66
67                    Box::pin(async move { req.await })
68                }
69                _ => panic!("Invalid proving key type for Light prover"),
70            },
71            #[cfg(feature = "network")]
72            EnvProver::Network(prover) => match self.base.pk {
73                EnvProvingKey::Network { pk, .. } => {
74                    let mut req = prover.prove(pk, stdin);
75                    req.base.mode = mode;
76                    req.base.context_builder = context_builder;
77
78                    req.into_future()
79                }
80                _ => panic!("Invalid proving key type for Network prover"),
81            },
82        }
83    }
84}