aboutsummaryrefslogtreecommitdiff
path: root/zkvms/zkm/sdk/src/local/snark.rs
diff options
context:
space:
mode:
Diffstat (limited to 'zkvms/zkm/sdk/src/local/snark.rs')
-rw-r--r--zkvms/zkm/sdk/src/local/snark.rs82
1 files changed, 82 insertions, 0 deletions
diff --git a/zkvms/zkm/sdk/src/local/snark.rs b/zkvms/zkm/sdk/src/local/snark.rs
new file mode 100644
index 0000000..de6460f
--- /dev/null
+++ b/zkvms/zkm/sdk/src/local/snark.rs
@@ -0,0 +1,82 @@
+extern crate libc;
+use anyhow::bail;
+use libc::c_int;
+use std::os::raw::c_char;
+use std::path::Path;
+
+extern "C" {
+ fn Stark2Snark(
+ keypath: *const c_char,
+ inputdir: *const c_char,
+ outputdir: *const c_char,
+ result: *mut *mut libc::c_char,
+ ) -> c_int;
+ fn SetupAndGenerateSolVerifier(
+ inputdir: *const c_char,
+ result: *mut *mut libc::c_char,
+ ) -> c_int;
+}
+
+#[cfg(feature = "snark")]
+pub fn prove_snark(keypath: &str, inputdir: &str, outputdir: &str) -> anyhow::Result<()> {
+ let path = Path::new(keypath);
+ let pk_file = path.join("proving.key");
+ let vk_file = path.join("verifying.key");
+
+ if !pk_file.exists() || !vk_file.exists() {
+ panic!(
+ "The vk or pk doesn't exist in the path: {}. Please first set the SETUP_FLAG=true to run setup_and_generate_sol_verifier.",inputdir
+ );
+ }
+
+ let keypath = std::ffi::CString::new(keypath).unwrap();
+ let inputdir = std::ffi::CString::new(inputdir).unwrap();
+ let outputdir = std::ffi::CString::new(outputdir).unwrap();
+
+ let mut result: *mut libc::c_char = std::ptr::null_mut();
+
+ let ret = unsafe {
+ Stark2Snark(
+ keypath.as_ptr(),
+ inputdir.as_ptr(),
+ outputdir.as_ptr(),
+ &mut result,
+ )
+ };
+ if ret == 0 {
+ Ok(())
+ } else {
+ let error_str = unsafe { std::ffi::CStr::from_ptr(result).to_string_lossy() };
+ // Free the allocated C string
+ unsafe { libc::free(result as *mut libc::c_void) };
+ //Ok(false)
+ bail!("prove_snark error: {}", error_str)
+ }
+}
+
+#[cfg(not(feature = "snark"))]
+pub fn prove_snark(keypath: &str, inputdir: &str, outputdir: &str) -> anyhow::Result<()> {
+ panic!("not support snark");
+}
+
+#[cfg(feature = "snark")]
+pub fn setup_and_generate_sol_verifier(inputdir: &str) -> anyhow::Result<()> {
+ let inputdir = std::ffi::CString::new(inputdir).unwrap();
+ let mut result: *mut libc::c_char = std::ptr::null_mut();
+
+ let ret = unsafe { SetupAndGenerateSolVerifier(inputdir.as_ptr(), &mut result) };
+ if ret == 0 {
+ Ok(())
+ } else {
+ let error_str = unsafe { std::ffi::CStr::from_ptr(result).to_string_lossy() };
+ // Free the allocated C string
+ unsafe { libc::free(result as *mut libc::c_void) };
+
+ bail!("prove_snark error: {}", error_str)
+ }
+}
+
+#[cfg(not(feature = "snark"))]
+pub fn setup_and_generate_sol_verifier(inputdir: &str) -> anyhow::Result<()> {
+ panic!("not support setup_and_generate_sol_verifier");
+}