sp1_sdk/
lib.rs

1//! # SP1 SDK
2//!
3//! A library for interacting with the SP1 RISC-V zkVM.
4//!
5//! Visit the [Getting Started](https://docs.succinct.xyz/docs/sp1/getting-started/install) section
6//! in the official SP1 documentation for a quick start guide.
7
8#![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
37// Re-export the client.
38pub use crate::client::ProverClient;
39
40// Re-export the provers.
41pub 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
49// Re-export the proof and prover traits.
50pub mod proof;
51pub use proof::*;
52pub mod prover;
53
54pub use prover::{Prover, SP1VerificationError};
55
56// Re-export the build utilities and executor primitives.
57pub use sp1_build::include_elf;
58pub use sp1_core_executor::{ExecutionReport, Executor, HookEnv, SP1Context, SP1ContextBuilder};
59
60// Re-export the machine/prover primitives.
61pub 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
67// Re-export the utilities.
68pub 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        // Generate proof & verify.
118        let mut proof = client.prove(&pk, &stdin).run().unwrap();
119        client.verify(&proof, &vk).unwrap();
120
121        // Test invalid public values.
122        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        // Generate proof & verify.
137        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        // Generate proof & verify.
153        let mut proof = client.prove(&pk, &stdin).compressed().run().unwrap();
154        client.verify(&proof, &vk).unwrap();
155
156        // Test invalid public values.
157        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        // Generate proof & verify.
173        let mut proof = client.prove(&pk, &stdin).plonk().run().unwrap();
174        client.verify(&proof, &vk).unwrap();
175
176        // Test invalid public values.
177        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    /// Show a warning if the `cuda` feature is enabled.
206    #[allow(unused, deprecated)]
207    fn show_cuda_warning() {
208        cuda_is_deprecated();
209    }
210}