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");
}
|