mirror of
https://github.com/logos-blockchain/logos-blockchain-rust-rapidsnark.git
synced 2026-06-07 03:39:29 +00:00
feat: verify groth16 proof
This commit is contained in:
parent
85bb9241d6
commit
0866536dcd
66
src/lib.rs
66
src/lib.rs
@ -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(())
|
||||
}
|
||||
}
|
||||
|
||||
1369
test-vectors/keccak256_256_test.vkey.json
Normal file
1369
test-vectors/keccak256_256_test.vkey.json
Normal file
File diff suppressed because it is too large
Load Diff
99
test-vectors/multiplier2.vkey.json
Normal file
99
test-vectors/multiplier2.vkey.json
Normal 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"
|
||||
]
|
||||
]
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user