From ca53a928eeaffc371a421b5ab0f227f34de360f1 Mon Sep 17 00:00:00 2001 From: schaeff Date: Mon, 24 Feb 2020 10:59:11 +0100 Subject: [PATCH] add tests, add log --- u8.zok | 6 +++-- zokrates_core/src/flat_absy/mod.rs | 6 ++++- zokrates_core/src/flatten/mod.rs | 10 +++++--- zokrates_core/src/ir/folder.rs | 1 + zokrates_core/src/ir/from_flat.rs | 1 + zokrates_core/src/ir/interpreter.rs | 3 ++- zokrates_core/src/ir/mod.rs | 2 ++ zokrates_core/src/optimizer/redefinition.rs | 5 ++-- .../src/static_analysis/flat_propagation.rs | 1 + zokrates_core_test/tests/tests/uint/add.json | 24 +++++++++++++++++-- zokrates_core_test/tests/tests/uint/and.json | 12 +++++----- .../tests/tests/uint/constant.json | 16 +++++++++++++ .../tests/tests/uint/constant.zok | 2 ++ zokrates_core_test/tests/tests/uint/maj.json | 14 +++++++++-- zokrates_core_test/tests/tests/uint/xor.json | 12 +++++----- zokrates_test/src/lib.rs | 22 +++++++++++++---- 16 files changed, 107 insertions(+), 30 deletions(-) create mode 100644 zokrates_core_test/tests/tests/uint/constant.json create mode 100644 zokrates_core_test/tests/tests/uint/constant.zok diff --git a/u8.zok b/u8.zok index e10e0e01..1c94a64c 100644 --- a/u8.zok +++ b/u8.zok @@ -41,7 +41,9 @@ def right_rotate_25(u32 e) -> (u32): bool[32] b = to_bits(e) return from_bits([...b[25..], ...b[..25]]) -def main(u32[1][16] input) -> (u32[8]): +def main() -> (u32[8]): + + u32[1][16] input = [[0x00000000; 16]] u32 h0 = 0x6a09e667 u32 h1 = 0xbb67ae85 @@ -76,7 +78,7 @@ def main(u32[1][16] input) -> (u32[8]): u32 g = h6 u32 h = h7 - for field i in 0..64 do + for field i in 0..0 do u32 S1 = right_rotate_6(e) ^ right_rotate_11(e) ^ right_rotate_25(e) u32 ch = (e + f) ^ (!e + g) diff --git a/zokrates_core/src/flat_absy/mod.rs b/zokrates_core/src/flat_absy/mod.rs index 923d8202..b77860f8 100644 --- a/zokrates_core/src/flat_absy/mod.rs +++ b/zokrates_core/src/flat_absy/mod.rs @@ -92,6 +92,7 @@ pub enum FlatStatement { Condition(FlatExpression, FlatExpression), Definition(FlatVariable, FlatExpression), Directive(FlatDirective), + Log(String), } impl fmt::Display for FlatStatement { @@ -101,6 +102,7 @@ impl fmt::Display for FlatStatement { FlatStatement::Return(ref expr) => write!(f, "return {}", expr), FlatStatement::Condition(ref lhs, ref rhs) => write!(f, "{} == {}", lhs, rhs), FlatStatement::Directive(ref d) => write!(f, "{}", d), + FlatStatement::Log(ref s) => write!(f, "{}", s), } } } @@ -114,6 +116,7 @@ impl fmt::Debug for FlatStatement { write!(f, "FlatCondition({:?}, {:?})", lhs, rhs) } FlatStatement::Directive(ref d) => write!(f, "{:?}", d), + FlatStatement::Log(ref l) => write!(f, "{:?}", l), } } } @@ -150,7 +153,8 @@ impl FlatStatement { inputs, ..d }) - } + }, + FlatStatement::Log(l) => FlatStatement::Log(l) } } } diff --git a/zokrates_core/src/flatten/mod.rs b/zokrates_core/src/flatten/mod.rs index 89063805..73fa0668 100644 --- a/zokrates_core/src/flatten/mod.rs +++ b/zokrates_core/src/flatten/mod.rs @@ -92,7 +92,7 @@ impl FlatUExpression { Some(f) => f, None => match self.bits { Some(bits) => { - assert_eq!(bits.len(), 32); + //assert_eq!(bits.len(), 32); bits.into_iter().rev().enumerate().fold( FlatExpression::Number(T::from(0)), |acc, (index, bit)| { @@ -692,7 +692,8 @@ impl<'ast, T: Field> Flattener<'ast, T> { solver: d.solver, inputs: new_inputs, }) - } + }, + FlatStatement::Log(s) => FlatStatement::Log(s), }) .collect(); @@ -748,6 +749,7 @@ impl<'ast, T: Field> Flattener<'ast, T> { statements_flattened: &mut Vec>, expr: UExpression<'ast, T>, ) -> FlatUExpression { + let target_bitwidth = expr.bitwidth; let metadata = expr.metadata.clone().unwrap().clone(); @@ -1028,6 +1030,7 @@ impl<'ast, T: Field> Flattener<'ast, T> { let left_flattened = self.flatten_uint_expression(symbols, statements_flattened, left); + let right_flattened = self.flatten_uint_expression(symbols, statements_flattened, right); @@ -1112,7 +1115,7 @@ impl<'ast, T: Field> Flattener<'ast, T> { // constants do not require directives! match e.field.clone() { Some(FlatExpression::Number(x)) => { - let bits = vec![FlatExpression::Number(T::from(0)); 32]; + let bits: Vec<_> = Solver::bits(from).execute(&vec![x]).unwrap().into_iter().map(|x| FlatExpression::Number(x)).collect(); self.bits_cache .insert(e.field.clone().unwrap(), bits.clone()); return bits; @@ -1428,6 +1431,7 @@ impl<'ast, T: Field> Flattener<'ast, T> { statements_flattened: &mut Vec>, stat: ZirStatement<'ast, T>, ) { + statements_flattened.push(FlatStatement::Log(format!("{}", stat))); match stat { ZirStatement::Return(exprs) => { let flat_expressions = exprs diff --git a/zokrates_core/src/ir/folder.rs b/zokrates_core/src/ir/folder.rs index 216e443c..d8228609 100644 --- a/zokrates_core/src/ir/folder.rs +++ b/zokrates_core/src/ir/folder.rs @@ -52,6 +52,7 @@ pub fn fold_statement>(f: &mut F, s: Statement) -> Vec f.fold_linear_combination(lin), )], Statement::Directive(dir) => vec![Statement::Directive(f.fold_directive(dir))], + Statement::Log(s) => vec![Statement::Log(s)], } } diff --git a/zokrates_core/src/ir/from_flat.rs b/zokrates_core/src/ir/from_flat.rs index f6bdd710..e56fcfd0 100644 --- a/zokrates_core/src/ir/from_flat.rs +++ b/zokrates_core/src/ir/from_flat.rs @@ -115,6 +115,7 @@ impl From> for Statement { e => Statement::Constraint(LinComb::from(e).into(), var.into()), }, FlatStatement::Directive(ds) => Statement::Directive(ds.into()), + FlatStatement::Log(s) => Statement::Log(s), _ => panic!("return should be handled at the function level"), } } diff --git a/zokrates_core/src/ir/interpreter.rs b/zokrates_core/src/ir/interpreter.rs index 916227b4..da48d4b1 100644 --- a/zokrates_core/src/ir/interpreter.rs +++ b/zokrates_core/src/ir/interpreter.rs @@ -49,7 +49,8 @@ impl Prog { } Err(_) => return Err(Error::Solver), }; - } + }, + _ => {} } } diff --git a/zokrates_core/src/ir/mod.rs b/zokrates_core/src/ir/mod.rs index d90f6fe4..bf20e895 100644 --- a/zokrates_core/src/ir/mod.rs +++ b/zokrates_core/src/ir/mod.rs @@ -20,6 +20,7 @@ pub use self::witness::Witness; pub enum Statement { Constraint(QuadComb, LinComb), Directive(Directive), + Log(String), } impl Statement { @@ -64,6 +65,7 @@ impl fmt::Display for Statement { match *self { Statement::Constraint(ref quad, ref lin) => write!(f, "{} == {}", quad, lin), Statement::Directive(ref s) => write!(f, "{}", s), + Statement::Log(ref l) => write!(f, "\n{}\n", l), } } } diff --git a/zokrates_core/src/optimizer/redefinition.rs b/zokrates_core/src/optimizer/redefinition.rs index 8fd27591..8d24872b 100644 --- a/zokrates_core/src/optimizer/redefinition.rs +++ b/zokrates_core/src/optimizer/redefinition.rs @@ -33,7 +33,7 @@ // - otherwise return `c_0` use crate::flat_absy::flat_variable::FlatVariable; -use crate::ir::folder::{fold_function, Folder}; +use crate::ir::folder::{fold_function, Folder, fold_statement}; use crate::ir::LinComb; use crate::ir::*; use num::Zero; @@ -117,7 +117,8 @@ impl Folder for RedefinitionOptimizer { self.substitution.insert(o.clone(), o.clone().into()); } vec![Statement::Directive(d)] - } + }, + s => fold_statement(self, s) } } diff --git a/zokrates_core/src/static_analysis/flat_propagation.rs b/zokrates_core/src/static_analysis/flat_propagation.rs index a759f8af..a5fa18ae 100644 --- a/zokrates_core/src/static_analysis/flat_propagation.rs +++ b/zokrates_core/src/static_analysis/flat_propagation.rs @@ -81,6 +81,7 @@ impl FlatStatement { .collect(), ..d })), + FlatStatement::Log(s) => Some(FlatStatement::Log(s)), } } } diff --git a/zokrates_core_test/tests/tests/uint/add.json b/zokrates_core_test/tests/tests/uint/add.json index 3b976010..0cd3d067 100644 --- a/zokrates_core_test/tests/tests/uint/add.json +++ b/zokrates_core_test/tests/tests/uint/add.json @@ -4,11 +4,31 @@ "tests": [ { "input": { - "values": ["1", "2"] + "values": ["0xff", "0x01"] }, "output": { "Ok": { - "values": ["3"] + "values": ["0x00"] + } + } + }, + { + "input": { + "values": ["0x00", "0x01"] + }, + "output": { + "Ok": { + "values": ["0x01"] + } + } + }, + { + "input": { + "values": ["0xff", "0xff"] + }, + "output": { + "Ok": { + "values": ["0xfe"] } } } diff --git a/zokrates_core_test/tests/tests/uint/and.json b/zokrates_core_test/tests/tests/uint/and.json index e0e3e773..b121aa95 100644 --- a/zokrates_core_test/tests/tests/uint/and.json +++ b/zokrates_core_test/tests/tests/uint/and.json @@ -4,31 +4,31 @@ "tests": [ { "input": { - "values": ["255", "255"] + "values": ["0xff", "0xff"] }, "output": { "Ok": { - "values": ["255"] + "values": ["0xff"] } } }, { "input": { - "values": ["255", "0"] + "values": ["0xff", "0x00"] }, "output": { "Ok": { - "values": ["0"] + "values": ["0x00"] } } }, { "input": { - "values": ["123", "234"] + "values": ["0x23", "0x34"] }, "output": { "Ok": { - "values": ["106"] + "values": ["0x20"] } } } diff --git a/zokrates_core_test/tests/tests/uint/constant.json b/zokrates_core_test/tests/tests/uint/constant.json new file mode 100644 index 00000000..0da0a090 --- /dev/null +++ b/zokrates_core_test/tests/tests/uint/constant.json @@ -0,0 +1,16 @@ +{ + "entry_point": "./tests/tests/uint/constant.zok", + "constraint_count": 1, + "tests": [ + { + "input": { + "values": [] + }, + "output": { + "Ok": { + "values": ["0x01234567"] + } + } + } + ] +} \ No newline at end of file diff --git a/zokrates_core_test/tests/tests/uint/constant.zok b/zokrates_core_test/tests/tests/uint/constant.zok new file mode 100644 index 00000000..2c2d69ff --- /dev/null +++ b/zokrates_core_test/tests/tests/uint/constant.zok @@ -0,0 +1,2 @@ +def main() -> (u32): + return 0x01234567 \ No newline at end of file diff --git a/zokrates_core_test/tests/tests/uint/maj.json b/zokrates_core_test/tests/tests/uint/maj.json index aa949d41..46a29809 100644 --- a/zokrates_core_test/tests/tests/uint/maj.json +++ b/zokrates_core_test/tests/tests/uint/maj.json @@ -4,11 +4,21 @@ "tests": [ { "input": { - "values": ["0", "0"] + "values": ["0x00000000", "0x00000000"] }, "output": { "Ok": { - "values": ["0"] + "values": ["0x00000000"] + } + } + }, + { + "input": { + "values": ["0x01234567", "0x23456789"] + }, + "output": { + "Ok": { + "values": ["0x03254769"] } } } diff --git a/zokrates_core_test/tests/tests/uint/xor.json b/zokrates_core_test/tests/tests/uint/xor.json index 85c36915..45a8014a 100644 --- a/zokrates_core_test/tests/tests/uint/xor.json +++ b/zokrates_core_test/tests/tests/uint/xor.json @@ -4,31 +4,31 @@ "tests": [ { "input": { - "values": ["255", "255"] + "values": ["0xff", "0xff"] }, "output": { "Ok": { - "values": ["0"] + "values": ["0x00"] } } }, { "input": { - "values": ["255", "0"] + "values": ["0xff", "0x00"] }, "output": { "Ok": { - "values": ["255"] + "values": ["0xff"] } } }, { "input": { - "values": ["123", "234"] + "values": ["0x23", "0x34"] }, "output": { "Ok": { - "values": ["145"] + "values": ["0x17"] } } } diff --git a/zokrates_test/src/lib.rs b/zokrates_test/src/lib.rs index 7ac85738..441ea5bb 100644 --- a/zokrates_test/src/lib.rs +++ b/zokrates_test/src/lib.rs @@ -35,6 +35,16 @@ struct Output { type Val = String; +fn parse_val(s: String) -> T { + let s = if s.starts_with("0x") { + u32::from_str_radix(s.trim_start_matches("0x"), 16).unwrap().to_string() + } else { + s + }; + + T::try_from_dec_str(&s).unwrap() +} + impl From> for ComparableResult { fn from(r: ir::ExecutionResult) -> ComparableResult { ComparableResult(r.map(|v| v.return_values())) @@ -45,8 +55,8 @@ impl From for ComparableResult { fn from(r: TestResult) -> ComparableResult { ComparableResult(r.map(|v| { v.values - .iter() - .map(|v| FieldPrime::try_from_dec_str(v).unwrap()) + .into_iter() + .map(parse_val) .collect() })) } @@ -95,11 +105,13 @@ pub fn test_inner(test_path: &str) { for test in t.tests.into_iter() { let input = &test.input.values; + let output = bin.execute( - &input + &dbg!(input .iter() - .map(|v| FieldPrime::try_from_dec_str(&v.clone()).unwrap()) - .collect(), + .cloned() + .map(parse_val) + .collect()), ); match compare(output, test.output) {