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}