diff options
| author | Kamen Mladenov <kamen@syndamia.com> | 2025-01-16 12:47:40 +0200 |
|---|---|---|
| committer | Kamen Mladenov <kamen@syndamia.com> | 2025-01-16 12:47:40 +0200 |
| commit | f276736ceba61373fb60216256c477ab2ccffe29 (patch) | |
| tree | 98824fd9e68847c608113aea107cd4e5e627ac5b /zkvms/zkm/sdk/src/local/snark.rs | |
| parent | 818ba1a13973fe64c3d73e2bf90c45e2dcafec72 (diff) | |
| download | zkVMs-benchmarks-f276736ceba61373fb60216256c477ab2ccffe29.tar zkVMs-benchmarks-f276736ceba61373fb60216256c477ab2ccffe29.tar.gz zkVMs-benchmarks-f276736ceba61373fb60216256c477ab2ccffe29.zip | |
feat(zkvms): Add zkm host
Diffstat (limited to 'zkvms/zkm/sdk/src/local/snark.rs')
| -rw-r--r-- | zkvms/zkm/sdk/src/local/snark.rs | 82 |
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"); +} |
