1
0
Fork 0
mirror of synced 2025-09-23 12:18:44 +00:00

fix zokrates_libsnark and add it to workspace

This commit is contained in:
schaeff 2022-05-13 13:56:35 +02:00
parent ed04267a9a
commit 3c517d8002
7 changed files with 55 additions and 42 deletions

4
Cargo.lock generated
View file

@ -3027,6 +3027,10 @@ version = "0.1.0"
dependencies = [
"cc",
"cmake",
"hex 0.4.3",
"zokrates_ast",
"zokrates_field",
"zokrates_interpreter",
"zokrates_proof_systems",
]

View file

@ -16,7 +16,8 @@ members = [
"zokrates_interpreter",
"zokrates_embed",
"zokrates_bellman",
"zokrates_libsnark",
"zokrates_proof_systems",
]
exclude = ["zokrates_js", "zokrates_libsnark"]
exclude = ["zokrates_js"]

View file

@ -5,7 +5,10 @@ edition = "2021"
build = "build.rs"
[dependencies]
zokrates_proof_systems = { version = "0.1", path = "../zokrates_proof_systems" }
zokrates_field = { version = "0.5", path = "../zokrates_field", default-features = false }
zokrates_ast = { version = "0.1", path = "../zokrates_ast", default-features = false }
zokrates_proof_systems = { version = "0.1", path = "../zokrates_proof_systems", default-features = false }
hex = "0.4.2"
[dev-dependencies]
zokrates_interpreter = { version = "0.1", path = "../zokrates_interpreter" }

View file

@ -1,4 +1,5 @@
fn main() {
#[cfg(not(target_os = "macos"))]
{
use std::env;
use std::path::PathBuf;

View file

@ -1,13 +1,16 @@
use crate::proof_system::gm17::{ProofPoints, VerificationKey, GM17};
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,
use crate::ffi::{c_free, Buffer, ProofResult, SetupResult};
use crate::{prepare_generate_proof, prepare_public_inputs, prepare_setup, Libsnark};
use zokrates_proof_systems::{
Backend, G1Affine, G2Affine, NonUniversalBackend, Proof, SetupKeypair,
};
use crate::proof_system::Scheme;
use crate::proof_system::{Backend, G1Affine, G2Affine, NonUniversalBackend, Proof, SetupKeypair};
use crate::serialization::{read_g1, read_g2, write_g1, write_g2};
use std::io::{BufReader, BufWriter, Write};
use zokrates_ast::ir::{ProgIterator, Statement, Witness};
use zokrates_field::{Bn128Field, Field};
use zokrates_field::Bn128Field;
use zokrates_field::Field;
use zokrates_proof_systems::gm17::{ProofPoints, VerificationKey, GM17};
use zokrates_proof_systems::Scheme;
extern "C" {
fn gm17_bn128_setup(

View file

@ -2,9 +2,9 @@ mod ffi;
pub mod gm17;
pub mod pghr13;
use crate::flat_absy::FlatVariable;
use std::cmp::max;
use std::collections::HashMap;
use zokrates_ast::common::Variable;
use zokrates_ast::ir::{self, Statement};
use zokrates_field::Field;
@ -197,10 +197,7 @@ pub fn prepare_generate_proof<T: Field>(
///
/// * `variables` - A mutual map that maps all existing variables to their index.
/// * `var` - Variable to be searched for.
pub fn provide_variable_idx(
variables: &mut HashMap<FlatVariable, usize>,
var: &FlatVariable,
) -> usize {
pub fn provide_variable_idx(variables: &mut HashMap<Variable, usize>, var: &Variable) -> usize {
let index = variables.len();
*variables.entry(*var).or_insert(index)
}
@ -215,14 +212,14 @@ pub fn provide_variable_idx(
pub fn r1cs_program<T: Field>(
prog: ir::Prog<T>,
) -> (
Vec<FlatVariable>,
Vec<Variable>,
usize,
Vec<Vec<(usize, T)>>,
Vec<Vec<(usize, T)>>,
Vec<Vec<(usize, T)>>,
) {
let mut variables: HashMap<FlatVariable, usize> = HashMap::new();
provide_variable_idx(&mut variables, &FlatVariable::one());
let mut variables: HashMap<Variable, usize> = HashMap::new();
provide_variable_idx(&mut variables, &Variable::one());
for x in prog.arguments.iter().filter(|p| !p.private) {
provide_variable_idx(&mut variables, &x.id);
@ -233,7 +230,7 @@ pub fn r1cs_program<T: Field>(
let main_return_count = prog.returns().len();
for i in 0..main_return_count {
provide_variable_idx(&mut variables, &FlatVariable::public(i));
provide_variable_idx(&mut variables, &Variable::public(i));
}
// position where private part of witness starts
@ -287,18 +284,18 @@ pub fn r1cs_program<T: Field>(
}
// Convert map back into list ordered by index
let mut variables_list = vec![FlatVariable::new(0); variables.len()];
let mut variables_list = vec![Variable::new(0); variables.len()];
for (k, v) in variables.drain() {
assert_eq!(variables_list[v], FlatVariable::new(0));
assert_eq!(variables_list[v], Variable::new(0));
variables_list[v] = k;
}
(variables_list, private_inputs_offset, a, b, c)
}
pub mod serialization {
use crate::proof_system::{G1Affine, G2Affine};
use std::io::Read;
use std::io::Write;
use zokrates_proof_systems::{G1Affine, G2Affine, G2AffineFq2};
#[inline]
fn decode_hex(value: &String) -> Vec<u8> {
@ -324,7 +321,7 @@ pub mod serialization {
let mut buffer = [0; 128];
reader.read_exact(&mut buffer).map_err(|_| ())?;
Ok(G2Affine(
Ok(G2Affine::Fq2(G2AffineFq2(
(
encode_hex(&buffer[0..32].to_vec()),
encode_hex(&buffer[32..64].to_vec()),
@ -333,7 +330,7 @@ pub mod serialization {
encode_hex(&buffer[64..96].to_vec()),
encode_hex(&buffer[96..128].to_vec()),
),
))
)))
}
pub fn write_g1<W: Write>(writer: &mut W, g1: &G1Affine) {
@ -342,9 +339,14 @@ pub mod serialization {
}
pub fn write_g2<W: Write>(writer: &mut W, g2: &G2Affine) {
writer.write(decode_hex(&(g2.0).0).as_ref()).unwrap();
writer.write(decode_hex(&(g2.0).1).as_ref()).unwrap();
writer.write(decode_hex(&(g2.1).0).as_ref()).unwrap();
writer.write(decode_hex(&(g2.1).1).as_ref()).unwrap();
match g2 {
G2Affine::Fq2(g2) => {
writer.write(decode_hex(&(g2.0).0).as_ref()).unwrap();
writer.write(decode_hex(&(g2.0).1).as_ref()).unwrap();
writer.write(decode_hex(&(g2.1).0).as_ref()).unwrap();
writer.write(decode_hex(&(g2.1).1).as_ref()).unwrap();
}
_ => unreachable!(),
}
}
}

View file

@ -1,16 +1,16 @@
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,
use crate::ffi::{c_free, Buffer, ProofResult, SetupResult};
use crate::{prepare_generate_proof, prepare_public_inputs, prepare_setup, Libsnark};
use zokrates_proof_systems::{
Backend, G1Affine, G2Affine, NonUniversalBackend, Proof, SetupKeypair,
};
use crate::proof_system::{Backend, G1Affine, G2Affine, NonUniversalBackend, Proof, SetupKeypair};
use crate::proof_system::libsnark::serialization::{read_g1, read_g2, write_g1, write_g2};
use crate::proof_system::pghr13::{ProofPoints, VerificationKey, PGHR13};
use crate::proof_system::Scheme;
use crate::serialization::{read_g1, read_g2, write_g1, write_g2};
use std::io::{BufReader, BufWriter, Write};
use zokrates_ast::ir::{ProgIterator, Statement, Witness};
use zokrates_field::Bn128Field;
use zokrates_field::Field;
use zokrates_proof_systems::pghr13::{ProofPoints, VerificationKey, PGHR13};
use zokrates_proof_systems::Scheme;
extern "C" {
fn pghr13_bn128_setup(
@ -222,23 +222,22 @@ impl NonUniversalBackend<Bn128Field, PGHR13> for Libsnark {
}
}
#[cfg(feature = "libsnark")]
#[cfg(test)]
#[cfg(not(target_os = "macos"))]
mod tests {
use super::*;
use crate::flat_absy::{FlatParameter, FlatVariable};
use zokrates_ast::ir::{Interpreter, Prog, Statement};
use zokrates_ast::flat::{Parameter, Variable};
use zokrates_ast::ir::{Prog, Statement};
use zokrates_field::Bn128Field;
use zokrates_interpreter::Interpreter;
#[test]
fn verify() {
let program: Prog<Bn128Field> = Prog {
arguments: vec![FlatParameter::private(FlatVariable::new(0))],
arguments: vec![Parameter::private(Variable::new(0))],
return_count: 1,
statements: vec![Statement::constraint(
FlatVariable::new(0),
FlatVariable::public(0),
)],
statements: vec![Statement::constraint(Variable::new(0), Variable::public(0))],
};
let keypair = <Libsnark as NonUniversalBackend<Bn128Field, PGHR13>>::setup(program.clone());