feat: verify groth16 proof

This commit is contained in:
Ya-wen, Jeng 2025-01-31 16:48:04 +08:00
parent 85bb9241d6
commit 0866536dcd
3 changed files with 1516 additions and 18 deletions

View File

@ -5,15 +5,14 @@ use anyhow::Result;
use num_bigint::BigInt;
pub type WtnsFn = fn(HashMap<String, Vec<BigInt>>) -> Vec<BigInt>;
#[derive(Debug)]
pub struct ProofResult {
#[allow(unused)] // TODO: Remove this once we have a proper way to handle this
proof: String,
#[allow(unused)] // TODO: Remove this once we have a proper way to handle this
public_signals: String,
pub proof: String,
pub public_signals: String,
}
extern "C" {
fn groth16_prover_zkey_file(
pub fn groth16_prover_zkey_file(
zkey_file_path: *const std::os::raw::c_char,
wtns_buffer: *const std::os::raw::c_void,
wtns_size: std::ffi::c_ulong,
@ -24,6 +23,14 @@ extern "C" {
error_msg: *mut std::os::raw::c_char,
error_msg_maxsize: std::ffi::c_ulong,
) -> i32;
pub fn groth16_verify(
proof: *const std::os::raw::c_char,
inputs: *const std::os::raw::c_char,
verification_key: *const std::os::raw::c_char,
error_msg: *mut std::os::raw::c_char,
error_msg_maxsize: std::ffi::c_ulong,
) -> i32;
}
use num_traits::ops::bytes::ToBytes;
@ -131,6 +138,31 @@ pub fn groth16_prover_zkey_file_wrapper(
}
}
/// Wrapper for `groth16_verify`
pub fn groth16_verify_wrapper(proof: &str, inputs: &str, verification_key: &str) -> Result<bool> {
let mut error_msg = vec![0u8; 256]; // Error message buffer
let error_msg_ptr = error_msg.as_mut_ptr() as *mut std::ffi::c_char;
unsafe {
let result = groth16_verify(
proof.as_ptr() as *const std::ffi::c_char,
inputs.as_ptr() as *const std::ffi::c_char,
verification_key.as_ptr() as *const std::ffi::c_char,
error_msg_ptr,
error_msg.len() as u64,
);
if result == 2 {
let error_string = std::ffi::CStr::from_ptr(error_msg_ptr)
.to_string_lossy()
.into_owned();
return Err(anyhow::anyhow!(
"Proof verification failed: {}",
error_string
));
}
Ok(result == 0)
}
}
#[cfg(test)]
mod tests {
use anyhow::Result;
@ -197,18 +229,18 @@ mod tests {
)
.unwrap();
let b = BigInt::from(1u8);
// let c = a.clone() * b.clone();
inputs.insert("a".to_string(), vec![a.to_string()]);
inputs.insert("b".to_string(), vec![b.to_string()]);
// Generate Witness Buffer
let wtns_buffer = compute_witness(inputs, multiplier2_witness)?;
// Generate Proof
let proof_result = super::groth16_prover_zkey_file_wrapper(&zkey_path, wtns_buffer)?;
println!("{}", proof_result.proof);
println!("{}", proof_result.public_signals);
// let valid = super::verify_proof(&zkey_path, proof_json)?;
// if !valid {
// bail!("Proof is invalid");
// }
let vkey = std::fs::read_to_string("./test-vectors/multiplier2.vkey.json")?;
let valid = super::groth16_verify_wrapper(&proof_result.proof, &proof_result.public_signals, &vkey)?;
assert!(valid);
Ok(())
}
@ -231,12 +263,10 @@ mod tests {
// Generate Proof
let proof_result = super::groth16_prover_zkey_file_wrapper(&zkey_path, wtns_buffer)?;
println!("{}", proof_result.proof);
println!("{}", proof_result.public_signals);
// let valid = super::verify_proof(&zkey_path, proof_json)?;
// if !valid {
// bail!("Proof is invalid");
// }
let vkey = std::fs::read_to_string("./test-vectors/keccak256_256_test.vkey.json")?;
let valid = super::groth16_verify_wrapper(&proof_result.proof, &proof_result.public_signals, &vkey)?;
assert!(valid);
Ok(())
}
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,99 @@
{
"protocol": "groth16",
"curve": "bn128",
"nPublic": 2,
"vk_alpha_1": [
"20491192805390485299153009773594534940189261866228447918068658471970481763042",
"9383485363053290200918347156157836566562967994039712273449902621266178545958",
"1"
],
"vk_beta_2": [
[
"6375614351688725206403948262868962793625744043794305715222011528459656738731",
"4252822878758300859123897981450591353533073413197771768651442665752259397132"
],
[
"10505242626370262277552901082094356697409835680220590971873171140371331206856",
"21847035105528745403288232691147584728191162732299865338377159692350059136679"
],
[
"1",
"0"
]
],
"vk_gamma_2": [
[
"10857046999023057135944570762232829481370756359578518086990519993285655852781",
"11559732032986387107991004021392285783925812861821192530917403151452391805634"
],
[
"8495653923123431417604973247489272438418190587263600148770280649306958101930",
"4082367875863433681332203403145435568316851327593401208105741076214120093531"
],
[
"1",
"0"
]
],
"vk_delta_2": [
[
"21433406528933179909930745994334927660178418579094216084923767796468271186424",
"13751094566666250787453117075390489314032734336035585479837046065555811806277"
],
[
"16699850258000131247573555544305336535932817397817319735498422046083998163923",
"12877331500166317036475448636193806012569545897268783945479551162026182231936"
],
[
"1",
"0"
]
],
"vk_alphabeta_12": [
[
[
"2029413683389138792403550203267699914886160938906632433982220835551125967885",
"21072700047562757817161031222997517981543347628379360635925549008442030252106"
],
[
"5940354580057074848093997050200682056184807770593307860589430076672439820312",
"12156638873931618554171829126792193045421052652279363021382169897324752428276"
],
[
"7898200236362823042373859371574133993780991612861777490112507062703164551277",
"7074218545237549455313236346927434013100842096812539264420499035217050630853"
]
],
[
[
"7077479683546002997211712695946002074877511277312570035766170199895071832130",
"10093483419865920389913245021038182291233451549023025229112148274109565435465"
],
[
"4595479056700221319381530156280926371456704509942304414423590385166031118820",
"19831328484489333784475432780421641293929726139240675179672856274388269393268"
],
[
"11934129596455521040620786944827826205713621633706285934057045369193958244500",
"8037395052364110730298837004334506829870972346962140206007064471173334027475"
]
]
],
"IC": [
[
"6819801395408938350212900248749732364821477541620635511814266536599629892365",
"9092252330033992554755034971584864587974280972948086568597554018278609861372",
"1"
],
[
"17882351432929302592725330552407222299541667716607588771282887857165175611387",
"18907419617206324833977586007131055763810739835484972981819026406579664278293",
"1"
],
[
"15838138634521468894153380932528531886891906022296751863057552941301429532008",
"10499496224041775125547926627482656159317436804293654376137218419558038465083",
"1"
]
]
}