From 2e9c66a5c1ce9c6cfd5be46ba4cca9f5a9f921eb Mon Sep 17 00:00:00 2001 From: dark64 Date: Tue, 4 Apr 2023 18:46:08 +0200 Subject: [PATCH] fix integration test, update book --- zokrates_ast/src/ir/witness.rs | 34 +++++++++++++++++ zokrates_book/src/examples/sha256example.md | 22 ++++------- .../examples/book/sha256_tutorial/test.sh | 4 +- .../tests/code/arithmetics.expected.witness | 1 - .../code/arithmetics.expected.witness.json | 3 ++ .../code/conditional_false.expected.witness | 1 - .../conditional_false.expected.witness.json | 3 ++ .../code/conditional_true.expected.witness | 1 - .../conditional_true.expected.witness.json | 3 ++ .../code/multidim_update.expected.witness | 4 -- .../multidim_update.expected.witness.json | 6 +++ .../tests/code/n_choose_k.expected.witness | 1 - .../code/n_choose_k.expected.witness.json | 3 ++ .../tests/code/no_return.expected.witness | 0 .../code/no_return.expected.witness.json | 1 + .../tests/code/return_array.expected.witness | 8 ---- .../code/return_array.expected.witness.json | 10 +++++ .../tests/code/simple_add.expected.witness | 1 - .../code/simple_add.expected.witness.json | 3 ++ .../tests/code/simple_mul.expected.witness | 1 - .../code/simple_mul.expected.witness.json | 3 ++ .../tests/code/taxation.expected.witness | 1 - .../tests/code/taxation.expected.witness.json | 3 ++ zokrates_cli/tests/integration.rs | 37 ++++++++----------- 24 files changed, 96 insertions(+), 58 deletions(-) delete mode 100644 zokrates_cli/tests/code/arithmetics.expected.witness create mode 100644 zokrates_cli/tests/code/arithmetics.expected.witness.json delete mode 100644 zokrates_cli/tests/code/conditional_false.expected.witness create mode 100644 zokrates_cli/tests/code/conditional_false.expected.witness.json delete mode 100644 zokrates_cli/tests/code/conditional_true.expected.witness create mode 100644 zokrates_cli/tests/code/conditional_true.expected.witness.json delete mode 100644 zokrates_cli/tests/code/multidim_update.expected.witness create mode 100644 zokrates_cli/tests/code/multidim_update.expected.witness.json delete mode 100644 zokrates_cli/tests/code/n_choose_k.expected.witness create mode 100644 zokrates_cli/tests/code/n_choose_k.expected.witness.json delete mode 100644 zokrates_cli/tests/code/no_return.expected.witness create mode 100644 zokrates_cli/tests/code/no_return.expected.witness.json delete mode 100644 zokrates_cli/tests/code/return_array.expected.witness create mode 100644 zokrates_cli/tests/code/return_array.expected.witness.json delete mode 100644 zokrates_cli/tests/code/simple_add.expected.witness create mode 100644 zokrates_cli/tests/code/simple_add.expected.witness.json delete mode 100644 zokrates_cli/tests/code/simple_mul.expected.witness create mode 100644 zokrates_cli/tests/code/simple_mul.expected.witness.json delete mode 100644 zokrates_cli/tests/code/taxation.expected.witness create mode 100644 zokrates_cli/tests/code/taxation.expected.witness.json diff --git a/zokrates_ast/src/ir/witness.rs b/zokrates_ast/src/ir/witness.rs index b2d6e508..8edec854 100644 --- a/zokrates_ast/src/ir/witness.rs +++ b/zokrates_ast/src/ir/witness.rs @@ -80,6 +80,40 @@ impl Witness { serde_json::to_writer_pretty(writer, &map)?; Ok(()) } + + pub fn read_json(reader: R) -> io::Result { + let json: serde_json::Value = serde_json::from_reader(reader)?; + let object = json + .as_object() + .ok_or_else(|| io::Error::new(io::ErrorKind::Other, "Witness must be an object"))?; + + let mut witness = Witness::empty(); + for (k, v) in object { + let variable = Variable::try_from_human_readable(k).map_err(|why| { + io::Error::new( + io::ErrorKind::Other, + format!("Invalid variable in witness: {}", why), + ) + })?; + + let value = v + .as_str() + .ok_or_else(|| { + io::Error::new(io::ErrorKind::Other, "Witness value must be a string") + }) + .and_then(|v| { + T::try_from_dec_str(v).map_err(|_| { + io::Error::new( + io::ErrorKind::Other, + format!("Invalid value in witness: {}", v), + ) + }) + })?; + + witness.insert(variable, value); + } + Ok(witness) + } } impl fmt::Display for Witness { diff --git a/zokrates_book/src/examples/sha256example.md b/zokrates_book/src/examples/sha256example.md index e970d7dc..a933b8cb 100644 --- a/zokrates_book/src/examples/sha256example.md +++ b/zokrates_book/src/examples/sha256example.md @@ -43,20 +43,14 @@ As a next step we can create a witness file using the following command: Using the flag `-a` we pass arguments to the program. Recall that our goal is to compute the hash for the number `5`. Consequently we set `a`, `b` and `c` to `0` and `d` to `5`. -Still here? Great! At this point, we can check the `witness` file for the return values: +Still here? Great! At this point we can check the return values. We should see the following output: ``` -{{#include ../../../zokrates_cli/examples/book/sha256_tutorial/test.sh:13}} +Witness: +["263561599766550617289250058199814760685","65303172752238645975888084098459749904"] ``` -which should lead to the following output: - -```sh -~out_0 263561599766550617289250058199814760685 -~out_1 65303172752238645975888084098459749904 -``` - -Hence, by concatenating the outputs as 128 bit numbers, we arrive at the following value as the hash for our selected pre-image : +By concatenating the outputs as 128 bit numbers, we arrive at the following value as the hash for our selected pre-image : `0xc6481e22c5ff4164af680b8cfaa5e8ed3120eeff89c4f307c4a6faaae059ce10` ## Prove knowledge of pre-image @@ -78,13 +72,13 @@ Note that we now compare the result of `sha256packed` with the hard-coded correc So, having defined the program, Victor is now ready to compile the code: ``` -{{#include ../../../zokrates_cli/examples/book/sha256_tutorial/test.sh:17}} +{{#include ../../../zokrates_cli/examples/book/sha256_tutorial/test.sh:15}} ``` Based on that Victor can run the setup phase and export a verifier smart contract as a Solidity file: ``` -{{#include ../../../zokrates_cli/examples/book/sha256_tutorial/test.sh:18:19}} +{{#include ../../../zokrates_cli/examples/book/sha256_tutorial/test.sh:16:17}} ``` `setup` creates a `verification.key` file and a `proving.key` file. Victor gives the proving key to Peggy. @@ -94,13 +88,13 @@ Based on that Victor can run the setup phase and export a verifier smart contrac Peggy provides the correct pre-image as an argument to the program. ``` -{{#include ../../../zokrates_cli/examples/book/sha256_tutorial/test.sh:20}} +{{#include ../../../zokrates_cli/examples/book/sha256_tutorial/test.sh:18}} ``` Finally, Peggy can run the command to construct the proof: ``` -{{#include ../../../zokrates_cli/examples/book/sha256_tutorial/test.sh:21}} +{{#include ../../../zokrates_cli/examples/book/sha256_tutorial/test.sh:19}} ``` As the inputs were declared as private in the program, they do not appear in the proof thanks to the zero-knowledge property of the protocol. diff --git a/zokrates_cli/examples/book/sha256_tutorial/test.sh b/zokrates_cli/examples/book/sha256_tutorial/test.sh index 664749cc..07756593 100755 --- a/zokrates_cli/examples/book/sha256_tutorial/test.sh +++ b/zokrates_cli/examples/book/sha256_tutorial/test.sh @@ -8,9 +8,7 @@ function zokrates() { } zokrates compile -i hashexample.zok -zokrates compute-witness -a 0 0 0 5 - -grep '~out' witness +zokrates compute-witness -a 0 0 0 5 --verbose cp -f hashexample_updated.zok hashexample.zok diff --git a/zokrates_cli/tests/code/arithmetics.expected.witness b/zokrates_cli/tests/code/arithmetics.expected.witness deleted file mode 100644 index caaf539d..00000000 --- a/zokrates_cli/tests/code/arithmetics.expected.witness +++ /dev/null @@ -1 +0,0 @@ -~out_0 12 diff --git a/zokrates_cli/tests/code/arithmetics.expected.witness.json b/zokrates_cli/tests/code/arithmetics.expected.witness.json new file mode 100644 index 00000000..4e1ae353 --- /dev/null +++ b/zokrates_cli/tests/code/arithmetics.expected.witness.json @@ -0,0 +1,3 @@ +{ + "~out_0": "12" +} diff --git a/zokrates_cli/tests/code/conditional_false.expected.witness b/zokrates_cli/tests/code/conditional_false.expected.witness deleted file mode 100644 index 1b8f13fa..00000000 --- a/zokrates_cli/tests/code/conditional_false.expected.witness +++ /dev/null @@ -1 +0,0 @@ -~out_0 0 \ No newline at end of file diff --git a/zokrates_cli/tests/code/conditional_false.expected.witness.json b/zokrates_cli/tests/code/conditional_false.expected.witness.json new file mode 100644 index 00000000..50655725 --- /dev/null +++ b/zokrates_cli/tests/code/conditional_false.expected.witness.json @@ -0,0 +1,3 @@ +{ + "~out_0": "0" +} diff --git a/zokrates_cli/tests/code/conditional_true.expected.witness b/zokrates_cli/tests/code/conditional_true.expected.witness deleted file mode 100644 index 1e61044c..00000000 --- a/zokrates_cli/tests/code/conditional_true.expected.witness +++ /dev/null @@ -1 +0,0 @@ -~out_0 1 \ No newline at end of file diff --git a/zokrates_cli/tests/code/conditional_true.expected.witness.json b/zokrates_cli/tests/code/conditional_true.expected.witness.json new file mode 100644 index 00000000..cd003d10 --- /dev/null +++ b/zokrates_cli/tests/code/conditional_true.expected.witness.json @@ -0,0 +1,3 @@ +{ + "~out_0": "1" +} diff --git a/zokrates_cli/tests/code/multidim_update.expected.witness b/zokrates_cli/tests/code/multidim_update.expected.witness deleted file mode 100644 index 0b054f2f..00000000 --- a/zokrates_cli/tests/code/multidim_update.expected.witness +++ /dev/null @@ -1,4 +0,0 @@ -~out_0 0 -~out_1 0 -~out_2 0 -~out_3 42 \ No newline at end of file diff --git a/zokrates_cli/tests/code/multidim_update.expected.witness.json b/zokrates_cli/tests/code/multidim_update.expected.witness.json new file mode 100644 index 00000000..98c0fbd7 --- /dev/null +++ b/zokrates_cli/tests/code/multidim_update.expected.witness.json @@ -0,0 +1,6 @@ +{ + "~out_0": "0", + "~out_1": "0", + "~out_2": "0", + "~out_3": "42" +} diff --git a/zokrates_cli/tests/code/n_choose_k.expected.witness b/zokrates_cli/tests/code/n_choose_k.expected.witness deleted file mode 100644 index b51f241b..00000000 --- a/zokrates_cli/tests/code/n_choose_k.expected.witness +++ /dev/null @@ -1 +0,0 @@ -~out_0 5 \ No newline at end of file diff --git a/zokrates_cli/tests/code/n_choose_k.expected.witness.json b/zokrates_cli/tests/code/n_choose_k.expected.witness.json new file mode 100644 index 00000000..839b53c9 --- /dev/null +++ b/zokrates_cli/tests/code/n_choose_k.expected.witness.json @@ -0,0 +1,3 @@ +{ + "~out_0": "5" +} diff --git a/zokrates_cli/tests/code/no_return.expected.witness b/zokrates_cli/tests/code/no_return.expected.witness deleted file mode 100644 index e69de29b..00000000 diff --git a/zokrates_cli/tests/code/no_return.expected.witness.json b/zokrates_cli/tests/code/no_return.expected.witness.json new file mode 100644 index 00000000..0967ef42 --- /dev/null +++ b/zokrates_cli/tests/code/no_return.expected.witness.json @@ -0,0 +1 @@ +{} diff --git a/zokrates_cli/tests/code/return_array.expected.witness b/zokrates_cli/tests/code/return_array.expected.witness deleted file mode 100644 index f9f9cf79..00000000 --- a/zokrates_cli/tests/code/return_array.expected.witness +++ /dev/null @@ -1,8 +0,0 @@ -~out_0 2 -~out_1 1 -~out_2 1 -~out_3 1 -~out_4 3 -~out_5 3 -~out_6 3 -~out_7 3 \ No newline at end of file diff --git a/zokrates_cli/tests/code/return_array.expected.witness.json b/zokrates_cli/tests/code/return_array.expected.witness.json new file mode 100644 index 00000000..d1b0a1d2 --- /dev/null +++ b/zokrates_cli/tests/code/return_array.expected.witness.json @@ -0,0 +1,10 @@ +{ + "~out_0": "2", + "~out_1": "1", + "~out_2": "1", + "~out_3": "1", + "~out_4": "3", + "~out_5": "3", + "~out_6": "3", + "~out_7": "3" +} diff --git a/zokrates_cli/tests/code/simple_add.expected.witness b/zokrates_cli/tests/code/simple_add.expected.witness deleted file mode 100644 index 23b7f950..00000000 --- a/zokrates_cli/tests/code/simple_add.expected.witness +++ /dev/null @@ -1 +0,0 @@ -~out_0 3 diff --git a/zokrates_cli/tests/code/simple_add.expected.witness.json b/zokrates_cli/tests/code/simple_add.expected.witness.json new file mode 100644 index 00000000..ca9fd972 --- /dev/null +++ b/zokrates_cli/tests/code/simple_add.expected.witness.json @@ -0,0 +1,3 @@ +{ + "~out_0": "3" +} diff --git a/zokrates_cli/tests/code/simple_mul.expected.witness b/zokrates_cli/tests/code/simple_mul.expected.witness deleted file mode 100644 index 8eb3a8d7..00000000 --- a/zokrates_cli/tests/code/simple_mul.expected.witness +++ /dev/null @@ -1 +0,0 @@ -~out_0 24 \ No newline at end of file diff --git a/zokrates_cli/tests/code/simple_mul.expected.witness.json b/zokrates_cli/tests/code/simple_mul.expected.witness.json new file mode 100644 index 00000000..7143416e --- /dev/null +++ b/zokrates_cli/tests/code/simple_mul.expected.witness.json @@ -0,0 +1,3 @@ +{ + "~out_0": "24" +} diff --git a/zokrates_cli/tests/code/taxation.expected.witness b/zokrates_cli/tests/code/taxation.expected.witness deleted file mode 100644 index 1b8f13fa..00000000 --- a/zokrates_cli/tests/code/taxation.expected.witness +++ /dev/null @@ -1 +0,0 @@ -~out_0 0 \ No newline at end of file diff --git a/zokrates_cli/tests/code/taxation.expected.witness.json b/zokrates_cli/tests/code/taxation.expected.witness.json new file mode 100644 index 00000000..50655725 --- /dev/null +++ b/zokrates_cli/tests/code/taxation.expected.witness.json @@ -0,0 +1,3 @@ +{ + "~out_0": "0" +} diff --git a/zokrates_cli/tests/integration.rs b/zokrates_cli/tests/integration.rs index 35aff1de..b909082c 100644 --- a/zokrates_cli/tests/integration.rs +++ b/zokrates_cli/tests/integration.rs @@ -16,11 +16,11 @@ mod integration { use std::fs; use std::fs::File; use std::io::{BufReader, Read, Write}; - use std::panic; use std::path::Path; use std::process::Command; use tempdir::TempDir; use zokrates_abi::{parse_strict, Encode}; + use zokrates_ast::ir::Witness; use zokrates_ast::typed::abi::Abi; use zokrates_field::Bn128Field; use zokrates_proof_systems::{ @@ -101,7 +101,9 @@ mod integration { let program_name = Path::new(Path::new(path.file_stem().unwrap()).file_stem().unwrap()); let prog = dir.join(program_name).with_extension("zok"); - let witness = dir.join(program_name).with_extension("expected.witness"); + let witness = dir + .join(program_name) + .with_extension("expected.witness.json"); let json_input = dir.join(program_name).with_extension("arguments.json"); test_compile_and_witness( @@ -250,33 +252,24 @@ mod integration { .unwrap(); // load the expected witness - let mut expected_witness_file = File::open(&expected_witness_path).unwrap(); - let mut expected_witness = String::new(); - expected_witness_file - .read_to_string(&mut expected_witness) - .unwrap(); + let expected_witness_file = File::open(&expected_witness_path).unwrap(); + let expected_witness = + Witness::::read_json(expected_witness_file).unwrap(); // load the actual witness - let mut witness_file = File::open(&witness_path).unwrap(); - let mut witness = String::new(); - witness_file.read_to_string(&mut witness).unwrap(); + let witness_file = File::open(&witness_path).unwrap(); + let witness = Witness::::read(witness_file).unwrap(); // load the actual inline witness - let mut inline_witness_file = File::open(&inline_witness_path).unwrap(); - let mut inline_witness = String::new(); - inline_witness_file - .read_to_string(&mut inline_witness) - .unwrap(); + let inline_witness_file = File::open(&inline_witness_path).unwrap(); + let inline_witness = + Witness::::read(inline_witness_file).unwrap(); assert_eq!(inline_witness, witness); - for line in expected_witness.as_str().split('\n') { - assert!( - witness.contains(line), - "Witness generation failed for {}\n\nLine \"{}\" not found in witness", - program_path.to_str().unwrap(), - line - ); + for (k, v) in expected_witness.0 { + let value = witness.0.get(&k).expect("should contain key"); + assert!(v.eq(value)); } let backends = map! {