sp1_sdk/
client.rs

1//! # SP1 Prover Client
2//!
3//! A client for interacting with the prover for the SP1 RISC-V zkVM.
4
5use crate::{cpu::builder::CpuProverBuilder, cuda::builder::CudaProverBuilder, env::EnvProver};
6
7#[cfg(feature = "network")]
8use crate::network::{builder::NetworkProverBuilder, NetworkMode};
9
10/// An entrypoint for interacting with the prover for the SP1 RISC-V zkVM.
11///
12/// IMPORTANT: `ProverClient` only needs to be initialized ONCE and can be reused for subsequent
13/// proving operations (can be shared across tasks by wrapping in an `Arc`). Note that the initial
14/// initialization may be slow as it loads necessary proving parameters and sets up the environment.
15pub struct ProverClient;
16
17impl ProverClient {
18    /// Builds an [`EnvProver`], which loads the mode and any settings from the environment.
19    ///
20    /// # Usage
21    /// ```no_run
22    /// use sp1_sdk::{Prover, ProverClient, SP1Stdin};
23    ///
24    /// std::env::set_var("SP1_PROVER", "network");
25    /// std::env::set_var("NETWORK_PRIVATE_KEY", "...");
26    /// let prover = ProverClient::from_env();
27    ///
28    /// let elf = &[1, 2, 3];
29    /// let stdin = SP1Stdin::new();
30    ///
31    /// let (pk, vk) = prover.setup(elf);
32    /// let proof = prover.prove(&pk, &stdin).compressed().run().unwrap();
33    /// ```
34    #[must_use]
35    pub fn from_env() -> EnvProver {
36        EnvProver::new()
37    }
38
39    /// Creates a new [`ProverClientBuilder`] so that you can configure the prover client.
40    #[must_use]
41    pub fn builder() -> ProverClientBuilder {
42        ProverClientBuilder
43    }
44
45    /// Creates a new [`EnvProver`] from the environment.
46    ///
47    /// # Example
48    /// ```no_run
49    /// use sp1_sdk::ProverClient;
50    ///
51    /// std::env::set_var("SP1_PROVER", "network");
52    /// std::env::set_var("NETWORK_PRIVATE_KEY", "...");
53    /// std::env::set_var("NETWORK_RPC_URL", "...");
54    /// let prover = ProverClient::from_env();
55    /// ```
56    #[deprecated(since = "4.0.0", note = "use `ProverClient::from_env()` instead")]
57    #[allow(clippy::new_ret_no_self)]
58    #[must_use]
59    pub fn new() -> EnvProver {
60        Self::from_env()
61    }
62}
63
64/// A builder to define which proving client to use.
65pub struct ProverClientBuilder;
66
67impl ProverClientBuilder {
68    /// Builds a [`CpuProver`] specifically for mock proving.
69    ///
70    /// # Example
71    /// ```no_run
72    /// use sp1_sdk::{Prover, ProverClient, SP1Stdin};
73    ///
74    /// let elf = &[1, 2, 3];
75    /// let stdin = SP1Stdin::new();
76    ///
77    /// let prover = ProverClient::builder().mock().build();
78    /// let (pk, vk) = prover.setup(elf);
79    /// let proof = prover.prove(&pk, &stdin).compressed().run().unwrap();
80    /// ```
81    #[must_use]
82    pub fn mock(&self) -> CpuProverBuilder {
83        CpuProverBuilder { mock: true }
84    }
85
86    /// Builds a [`CpuProver`] specifically for local CPU proving.
87    ///
88    /// # Usage
89    /// ```no_run
90    /// use sp1_sdk::{Prover, ProverClient, SP1Stdin};
91    ///
92    /// let elf = &[1, 2, 3];
93    /// let stdin = SP1Stdin::new();
94    ///
95    /// let prover = ProverClient::builder().cpu().build();
96    /// let (pk, vk) = prover.setup(elf);
97    /// let proof = prover.prove(&pk, &stdin).compressed().run().unwrap();
98    /// ```
99    #[must_use]
100    pub fn cpu(&self) -> CpuProverBuilder {
101        CpuProverBuilder { mock: false }
102    }
103
104    /// Builds a [`CudaProver`] specifically for local proving on NVIDIA GPUs.
105    ///
106    /// # Example
107    /// ```no_run
108    /// use sp1_sdk::{Prover, ProverClient, SP1Stdin};
109    ///
110    /// let elf = &[1, 2, 3];
111    /// let stdin = SP1Stdin::new();
112    ///
113    /// let prover = ProverClient::builder().cuda().build();
114    /// let (pk, vk) = prover.setup(elf);
115    /// let proof = prover.prove(&pk, &stdin).compressed().run().unwrap();
116    /// ```
117    #[must_use]
118    pub fn cuda(&self) -> CudaProverBuilder {
119        CudaProverBuilder::default()
120    }
121
122    /// Builds a [`NetworkProver`] specifically for proving on the network using default settings.
123    ///
124    /// Uses feature flag default (Reserved if reserved-capacity enabled, Mainnet otherwise).
125    ///
126    /// # Examples
127    /// ```no_run
128    /// use sp1_sdk::{Prover, ProverClient, SP1Stdin};
129    ///
130    /// let elf = &[1, 2, 3];
131    /// let stdin = SP1Stdin::new();
132    ///
133    /// let prover = ProverClient::builder().network().build();
134    ///
135    /// let (pk, vk) = prover.setup(elf);
136    /// let proof = prover.prove(&pk, &stdin).compressed().run().unwrap();
137    /// ```
138    #[cfg(feature = "network")]
139    #[must_use]
140    pub fn network(&self) -> NetworkProverBuilder {
141        let network_mode = NetworkMode::default();
142
143        NetworkProverBuilder {
144            private_key: None,
145            signer: None,
146            rpc_url: None,
147            tee_signers: None,
148            network_mode: Some(network_mode),
149        }
150    }
151
152    /// Builds a [`NetworkProver`] specifically for proving on the network with a specified mode.
153    ///
154    /// # Examples
155    /// ```no_run
156    /// use sp1_sdk::{network::NetworkMode, Prover, ProverClient, SP1Stdin};
157    ///
158    /// let elf = &[1, 2, 3];
159    /// let stdin = SP1Stdin::new();
160    ///
161    /// let prover = ProverClient::builder().network_for(NetworkMode::Mainnet).build();
162    ///
163    /// let (pk, vk) = prover.setup(elf);
164    /// let proof = prover.prove(&pk, &stdin).compressed().run().unwrap();
165    /// ```
166    #[cfg(feature = "network")]
167    #[must_use]
168    pub fn network_for(&self, mode: NetworkMode) -> NetworkProverBuilder {
169        NetworkProverBuilder {
170            private_key: None,
171            signer: None,
172            rpc_url: None,
173            tee_signers: None,
174            network_mode: Some(mode),
175        }
176    }
177}