refactor ffi buffer, run libsnark tests consecutively
This commit is contained in:
parent
ef8f76b433
commit
df4add3dd3
6 changed files with 33 additions and 65 deletions
2
test.sh
2
test.sh
|
@ -5,7 +5,7 @@ set -e
|
|||
|
||||
if [ -n "$WITH_LIBSNARK" ]; then
|
||||
# run specifically the libsnark tests inside zokrates_core
|
||||
cargo test --release --package zokrates_core --features="libsnark" libsnark
|
||||
cargo test --release --package zokrates_core --features="libsnark" libsnark -- --test-threads=1
|
||||
fi
|
||||
|
||||
# run all tests without libsnark on
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
#include "ffi.hpp"
|
||||
|
||||
void __free(uint8_t* ptr)
|
||||
void c_free(uint8_t* ptr)
|
||||
{
|
||||
free(ptr);
|
||||
}
|
|
@ -30,7 +30,7 @@ struct proof_result_t {
|
|||
}
|
||||
};
|
||||
|
||||
void __free(uint8_t* ptr);
|
||||
void c_free(uint8_t* ptr);
|
||||
|
||||
#ifdef __cplusplus
|
||||
} // extern "C"
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
#[repr(C)]
|
||||
pub struct Buffer {
|
||||
pub data: *mut u8,
|
||||
pub data: *const u8,
|
||||
pub length: i32,
|
||||
}
|
||||
|
||||
|
@ -16,33 +16,17 @@ pub struct ProofResult {
|
|||
}
|
||||
|
||||
extern "C" {
|
||||
fn __free(ptr: *mut u8);
|
||||
pub fn c_free(ptr: *const u8);
|
||||
}
|
||||
|
||||
impl Buffer {
|
||||
pub fn from_vec(v: &Vec<u8>) -> Buffer {
|
||||
let mut buf = vec![0; v.len()].into_boxed_slice();
|
||||
buf.copy_from_slice(v.as_slice());
|
||||
|
||||
let data = buf.as_mut_ptr();
|
||||
let len = buf.len();
|
||||
|
||||
std::mem::forget(buf);
|
||||
let data = v.as_ptr();
|
||||
let len = v.len();
|
||||
|
||||
Buffer {
|
||||
data,
|
||||
length: len as i32,
|
||||
}
|
||||
}
|
||||
|
||||
pub unsafe fn drop(&self) {
|
||||
let s = std::slice::from_raw_parts_mut(self.data, self.length as usize);
|
||||
let s = s.as_mut_ptr();
|
||||
Box::from_raw(s);
|
||||
}
|
||||
|
||||
/// The purpose of this function is to free memory allocated by C. Do not use otherwise.
|
||||
pub fn free(self) {
|
||||
unsafe { __free(self.data) };
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
use crate::ir::{Prog, Witness};
|
||||
use crate::proof_system::gm17::{ProofPoints, VerificationKey, GM17};
|
||||
use crate::proof_system::libsnark::ffi::{Buffer, ProofResult, SetupResult};
|
||||
use crate::proof_system::libsnark::ffi::{c_free, Buffer, ProofResult, SetupResult};
|
||||
use crate::proof_system::libsnark::{
|
||||
prepare_generate_proof, prepare_public_inputs, prepare_setup, serialization::*, Libsnark,
|
||||
};
|
||||
|
@ -64,8 +64,8 @@ impl Backend<Bn128Field, GM17> for Libsnark {
|
|||
std::slice::from_raw_parts(result.pk.data, result.pk.length as usize).to_vec();
|
||||
|
||||
// free c allocated buffers
|
||||
result.vk.free();
|
||||
result.pk.free();
|
||||
c_free(result.vk.data);
|
||||
c_free(result.pk.data);
|
||||
|
||||
(vk, pk)
|
||||
};
|
||||
|
@ -104,9 +104,9 @@ impl Backend<Bn128Field, GM17> for Libsnark {
|
|||
let (public_inputs_arr, public_inputs_length, private_inputs_arr, private_inputs_length) =
|
||||
prepare_generate_proof(program.clone(), witness.clone());
|
||||
|
||||
let proof = unsafe {
|
||||
let mut pk_buffer = Buffer::from_vec(&proving_key);
|
||||
|
||||
let proof = unsafe {
|
||||
let result = gm17_bn128_generate_proof(
|
||||
&mut pk_buffer as *mut _,
|
||||
public_inputs_arr[0].as_ptr(),
|
||||
|
@ -115,14 +115,11 @@ impl Backend<Bn128Field, GM17> for Libsnark {
|
|||
private_inputs_length as i32,
|
||||
);
|
||||
|
||||
pk_buffer.drop(); // drop the buffer manually
|
||||
|
||||
let proof: Vec<u8> =
|
||||
std::slice::from_raw_parts(result.proof.data, result.proof.length as usize)
|
||||
let proof = std::slice::from_raw_parts(result.proof.data, result.proof.length as usize)
|
||||
.to_vec();
|
||||
|
||||
// free c allocated buffer
|
||||
result.proof.free();
|
||||
c_free(result.proof.data);
|
||||
|
||||
proof
|
||||
};
|
||||
|
@ -175,21 +172,16 @@ impl Backend<Bn128Field, GM17> for Libsnark {
|
|||
|
||||
let (public_inputs_arr, public_inputs_length) = prepare_public_inputs(public_inputs);
|
||||
|
||||
unsafe {
|
||||
let mut vk_buffer = Buffer::from_vec(vk_writer.get_ref());
|
||||
let mut proof_buffer = Buffer::from_vec(proof_writer.get_ref());
|
||||
|
||||
let ans = gm17_bn128_verify(
|
||||
unsafe {
|
||||
gm17_bn128_verify(
|
||||
&mut vk_buffer as *mut _,
|
||||
&mut proof_buffer as *mut _,
|
||||
public_inputs_arr[0].as_ptr(),
|
||||
public_inputs_length as i32,
|
||||
);
|
||||
|
||||
vk_buffer.drop();
|
||||
proof_buffer.drop();
|
||||
|
||||
ans
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
use crate::proof_system::libsnark::ffi::{Buffer, ProofResult, SetupResult};
|
||||
use crate::proof_system::libsnark::ffi::{c_free, Buffer, ProofResult, SetupResult};
|
||||
use crate::proof_system::libsnark::{
|
||||
prepare_generate_proof, prepare_public_inputs, prepare_setup, Libsnark,
|
||||
};
|
||||
|
@ -67,8 +67,8 @@ impl Backend<Bn128Field, PGHR13> for Libsnark {
|
|||
std::slice::from_raw_parts(result.pk.data, result.pk.length as usize).to_vec();
|
||||
|
||||
// free c allocated buffers
|
||||
result.vk.free();
|
||||
result.pk.free();
|
||||
c_free(result.vk.data);
|
||||
c_free(result.pk.data);
|
||||
|
||||
(vk, pk)
|
||||
};
|
||||
|
@ -111,9 +111,9 @@ impl Backend<Bn128Field, PGHR13> for Libsnark {
|
|||
let (public_inputs_arr, public_inputs_length, private_inputs_arr, private_inputs_length) =
|
||||
prepare_generate_proof(program.clone(), witness.clone());
|
||||
|
||||
let proof = unsafe {
|
||||
let mut pk_buffer = Buffer::from_vec(&proving_key);
|
||||
|
||||
let proof = unsafe {
|
||||
let result = pghr13_bn128_generate_proof(
|
||||
&mut pk_buffer as *mut _,
|
||||
public_inputs_arr[0].as_ptr(),
|
||||
|
@ -122,14 +122,11 @@ impl Backend<Bn128Field, PGHR13> for Libsnark {
|
|||
private_inputs_length as i32,
|
||||
);
|
||||
|
||||
pk_buffer.drop(); // drop the buffer manually
|
||||
|
||||
let proof: Vec<u8> =
|
||||
std::slice::from_raw_parts(result.proof.data, result.proof.length as usize)
|
||||
let proof = std::slice::from_raw_parts(result.proof.data, result.proof.length as usize)
|
||||
.to_vec();
|
||||
|
||||
// free c allocated buffer
|
||||
result.proof.free();
|
||||
c_free(result.proof.data);
|
||||
|
||||
proof
|
||||
};
|
||||
|
@ -205,21 +202,16 @@ impl Backend<Bn128Field, PGHR13> for Libsnark {
|
|||
|
||||
let (public_inputs_arr, public_inputs_length) = prepare_public_inputs(public_inputs);
|
||||
|
||||
unsafe {
|
||||
let mut vk_buffer = Buffer::from_vec(vk_writer.get_ref());
|
||||
let mut proof_buffer = Buffer::from_vec(proof_writer.get_ref());
|
||||
|
||||
let ans = pghr13_bn128_verify(
|
||||
unsafe {
|
||||
pghr13_bn128_verify(
|
||||
&mut vk_buffer as *mut _,
|
||||
&mut proof_buffer as *mut _,
|
||||
public_inputs_arr[0].as_ptr(),
|
||||
public_inputs_length as i32,
|
||||
);
|
||||
|
||||
vk_buffer.drop();
|
||||
proof_buffer.drop();
|
||||
|
||||
ans
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue