1
0
Fork 0
mirror of synced 2025-09-23 04:08:33 +00:00

refactor ffi buffer, run libsnark tests consecutively

This commit is contained in:
dark64 2021-07-02 14:51:16 +02:00
parent ef8f76b433
commit df4add3dd3
6 changed files with 33 additions and 65 deletions

View file

@ -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

View file

@ -1,6 +1,6 @@
#include "ffi.hpp"
void __free(uint8_t* ptr)
void c_free(uint8_t* ptr)
{
free(ptr);
}

View file

@ -30,7 +30,7 @@ struct proof_result_t {
}
};
void __free(uint8_t* ptr);
void c_free(uint8_t* ptr);
#ifdef __cplusplus
} // extern "C"

View file

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

View file

@ -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
)
}
}
}

View file

@ -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
)
}
}
}