1#![warn(clippy::pedantic)]
9#![allow(clippy::similar_names)]
10#![allow(clippy::cast_possible_wrap)]
11#![allow(clippy::cast_possible_truncation)]
12#![allow(clippy::cast_sign_loss)]
13#![allow(clippy::module_name_repetitions)]
14#![allow(clippy::needless_range_loop)]
15#![allow(clippy::cast_lossless)]
16#![allow(clippy::bool_to_int_with_if)]
17#![allow(clippy::should_panic_without_expect)]
18#![allow(clippy::field_reassign_with_default)]
19#![allow(clippy::manual_assert)]
20#![allow(clippy::unreadable_literal)]
21#![allow(clippy::match_wildcard_for_single_variants)]
22#![allow(clippy::missing_panics_doc)]
23#![allow(clippy::missing_errors_doc)]
24#![allow(clippy::explicit_iter_loop)]
25#![warn(missing_docs)]
26
27pub mod artifacts;
28pub mod client;
29pub mod cpu;
30pub mod cuda;
31pub mod env;
32pub mod install;
33#[cfg(feature = "network")]
34pub mod network;
35pub mod utils;
36
37pub use crate::client::ProverClient;
39
40pub use crate::{cpu::CpuProver, cuda::CudaProver, env::EnvProver};
42
43#[cfg(feature = "network")]
44pub use crate::network::{
45 prover::NetworkProver,
46 signer::{NetworkSigner, NetworkSignerError},
47};
48
49pub mod proof;
51pub use proof::*;
52pub mod prover;
53
54pub use prover::{Prover, SP1VerificationError};
55
56pub use sp1_build::include_elf;
58pub use sp1_core_executor::{ExecutionReport, Executor, HookEnv, SP1Context, SP1ContextBuilder};
59
60pub use sp1_core_machine::io::SP1Stdin;
62pub use sp1_primitives::io::SP1PublicValues;
63pub use sp1_prover::{
64 HashableKey, ProverMode, SP1Prover, SP1ProvingKey, SP1VerifyingKey, SP1_CIRCUIT_VERSION,
65};
66
67pub use utils::setup_logger;
69
70#[cfg(test)]
71mod tests {
72 use sp1_primitives::io::SP1PublicValues;
73
74 use crate::{utils, Prover, ProverClient, SP1Stdin};
75
76 #[test]
77 fn test_execute() {
78 utils::setup_logger();
79 let client = ProverClient::builder().cpu().build();
80 let elf = test_artifacts::FIBONACCI_ELF;
81 let mut stdin = SP1Stdin::new();
82 stdin.write(&10usize);
83 let (_, _) = client.execute(elf, &stdin).run().unwrap();
84 }
85
86 #[test]
87 #[should_panic]
88 fn test_execute_panic() {
89 utils::setup_logger();
90 let client = ProverClient::builder().cpu().build();
91 let elf = test_artifacts::PANIC_ELF;
92 let mut stdin = SP1Stdin::new();
93 stdin.write(&10usize);
94 client.execute(elf, &stdin).run().unwrap();
95 }
96
97 #[should_panic]
98 #[test]
99 fn test_cycle_limit_fail() {
100 utils::setup_logger();
101 let client = ProverClient::builder().cpu().build();
102 let elf = test_artifacts::PANIC_ELF;
103 let mut stdin = SP1Stdin::new();
104 stdin.write(&10usize);
105 client.execute(elf, &stdin).cycle_limit(1).run().unwrap();
106 }
107
108 #[test]
109 fn test_e2e_core() {
110 utils::setup_logger();
111 let client = ProverClient::builder().cpu().build();
112 let elf = test_artifacts::FIBONACCI_ELF;
113 let (pk, vk) = client.setup(elf);
114 let mut stdin = SP1Stdin::new();
115 stdin.write(&10usize);
116
117 let mut proof = client.prove(&pk, &stdin).run().unwrap();
119 client.verify(&proof, &vk).unwrap();
120
121 proof.public_values = SP1PublicValues::from(&[255, 4, 84]);
123 if client.verify(&proof, &vk).is_ok() {
124 panic!("verified proof with invalid public values")
125 }
126 }
127
128 #[test]
129 fn test_e2e_io_override() {
130 utils::setup_logger();
131 let client = ProverClient::builder().cpu().build();
132 let elf = test_artifacts::HELLO_WORLD_ELF;
133
134 let mut stdout = Vec::new();
135
136 let stdin = SP1Stdin::new();
138 let _ = client.execute(elf, &stdin).stdout(&mut stdout).run().unwrap();
139
140 assert_eq!(stdout, b"Hello, world!\n");
141 }
142
143 #[test]
144 fn test_e2e_compressed() {
145 utils::setup_logger();
146 let client = ProverClient::builder().cpu().build();
147 let elf = test_artifacts::FIBONACCI_ELF;
148 let (pk, vk) = client.setup(elf);
149 let mut stdin = SP1Stdin::new();
150 stdin.write(&10usize);
151
152 let mut proof = client.prove(&pk, &stdin).compressed().run().unwrap();
154 client.verify(&proof, &vk).unwrap();
155
156 proof.public_values = SP1PublicValues::from(&[255, 4, 84]);
158 if client.verify(&proof, &vk).is_ok() {
159 panic!("verified proof with invalid public values")
160 }
161 }
162
163 #[test]
164 fn test_e2e_prove_plonk() {
165 utils::setup_logger();
166 let client = ProverClient::builder().cpu().build();
167 let elf = test_artifacts::FIBONACCI_ELF;
168 let (pk, vk) = client.setup(elf);
169 let mut stdin = SP1Stdin::new();
170 stdin.write(&10usize);
171
172 let mut proof = client.prove(&pk, &stdin).plonk().run().unwrap();
174 client.verify(&proof, &vk).unwrap();
175
176 proof.public_values = SP1PublicValues::from(&[255, 4, 84]);
178 if client.verify(&proof, &vk).is_ok() {
179 panic!("verified proof with invalid public values")
180 }
181 }
182
183 #[test]
184 fn test_e2e_prove_plonk_mock() {
185 utils::setup_logger();
186 let client = ProverClient::builder().mock().build();
187 let elf = test_artifacts::FIBONACCI_ELF;
188 let (pk, vk) = client.setup(elf);
189 let mut stdin = SP1Stdin::new();
190 stdin.write(&10usize);
191 let proof = client.prove(&pk, &stdin).plonk().run().unwrap();
192 client.verify(&proof, &vk).unwrap();
193 }
194}
195
196#[cfg(all(feature = "cuda", not(sp1_ci_in_progress)))]
197mod deprecated_check {
198 #[deprecated(
199 since = "4.0.0",
200 note = "The `cuda` feature is deprecated, as the CudaProver is now supported by default."
201 )]
202 #[allow(unused)]
203 fn cuda_is_deprecated() {}
204
205 #[allow(unused, deprecated)]
207 fn show_cuda_warning() {
208 cuda_is_deprecated();
209 }
210}