aboutsummaryrefslogtreecommitdiff
path: root/zkvms/zkm/sdk/src/local/snark.rs
blob: de6460f074b11381c19adea5d215b784b07f965e (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
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");
}