diff --git a/Cargo.lock b/Cargo.lock index 159ea475..1c6647b0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1111,8 +1111,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" dependencies = [ "cfg-if 1.0.0", + "js-sys", "libc", "wasi 0.9.0+wasi-snapshot-preview1", + "wasm-bindgen", ] [[package]] diff --git a/changelogs/unreleased/1071-dark64 b/changelogs/unreleased/1071-dark64 index 029314b8..d875abc7 100644 --- a/changelogs/unreleased/1071-dark64 +++ b/changelogs/unreleased/1071-dark64 @@ -1 +1 @@ -Support for ark-groth16 implementation \ No newline at end of file +Support for the `groth16` scheme using the ark backend, support the usage of the `bls12_381` curve with the `gm17` and `marlin` scheme \ No newline at end of file diff --git a/zokrates_book/src/toolbox/proving_schemes.md b/zokrates_book/src/toolbox/proving_schemes.md index f1b58063..a5274c8c 100644 --- a/zokrates_book/src/toolbox/proving_schemes.md +++ b/zokrates_book/src/toolbox/proving_schemes.md @@ -23,12 +23,12 @@ When not using the default, the CLI flag has to be provided for the following co ZoKrates supports different proving schemes. We identify the schemes by the reference to the paper that introduced them. Currently the options available are: -| Scheme | CLI flag | Curves | Universal | -| ---- | -------- | ------ | ------------| -| [G16](https://eprint.iacr.org/2016/260) | `--proving-scheme g16` | ALTBN_128, BLS12_381 | No | -| [GM17](https://eprint.iacr.org/2017/540) | `--proving-scheme gm17` | ALTBN_128, BLS12_377, BW6_761 | No | -| [Marlin](https://eprint.iacr.org/2019/1047) | `--proving-scheme marlin` | ALTBN_128, BLS12_377, BW6_761 | Yes | -| [PGHR13](https://eprint.iacr.org/2013/279) | `--proving-scheme pghr13` | ALTBN_128 | No | +| Scheme | CLI flag | Curves | Universal | +| ---- | -------- |------------------------------------------| ------------| +| [G16](https://eprint.iacr.org/2016/260) | `--proving-scheme g16` | ALTBN_128, BLS12_381 | No | +| [GM17](https://eprint.iacr.org/2017/540) | `--proving-scheme gm17` | ALTBN_128, BLS12_381, BLS12_377, BW6_761 | No | +| [Marlin](https://eprint.iacr.org/2019/1047) | `--proving-scheme marlin` | ALTBN_128, BLS12_381, BLS12_377, BW6_761 | Yes | +| [PGHR13](https://eprint.iacr.org/2013/279) | `--proving-scheme pghr13` | ALTBN_128 | No | All schemes have a circuit-specific setup phase called `setup`. Universal schemes also feature a preliminary, circuit-agnostic step called `universal-setup`. The advantage of universal schemes is that only the `universal-setup` step requires trust, so that it can be run a single time and reused trustlessly for many programs. @@ -45,11 +45,11 @@ When not using the default, the CLI flag has to be provided for the following co ZoKrates supports multiple backends. The options are the following: -| Backend | CLI flag | Proving schemes | Curves | -| ---- | -------- | --------------- | ------ | -| Bellman | `--backend bellman` | G16 | ALTBN_128, BLS12_381 | -| Libsnark | `--backend libsnark` | GM17, PGHR13 | ALTBN_128 | -| Ark | `--backend ark` | GM17, MARLIN | ALTBN_128, BLS12_377, BW6_761 | +| Backend | CLI flag | Proving schemes | Curves | +| ---- | -------- |-------------------|------------------------------------------| +| Bellman | `--backend bellman` | G16 | ALTBN_128, BLS12_381 | +| Libsnark | `--backend libsnark` | GM17, PGHR13 | ALTBN_128 | +| Ark | `--backend ark` | G16, GM17, MARLIN | ALTBN_128, BLS12_381, BLS12_377, BW6_761 | Default: `bellman` diff --git a/zokrates_core/Cargo.toml b/zokrates_core/Cargo.toml index c9525f02..59c9846b 100644 --- a/zokrates_core/Cargo.toml +++ b/zokrates_core/Cargo.toml @@ -35,7 +35,7 @@ zokrates_common = { path = "../zokrates_common" } zokrates_embed = { version = "0.1.0", path = "../zokrates_embed" } getrandom = { version = "0.2", features = ["js"] } rand_0_4 = { version = "0.4", package = "rand" } -rand_0_7 = { version = "0.7", package = "rand" } +rand_0_7 = { version = "0.7", package = "rand", features = ["wasm-bindgen"] } csv = "1" phase2 = { git = "https://github.com/Zokrates/phase2", default-features = false } diff --git a/zokrates_core/src/proof_system/ark/gm17.rs b/zokrates_core/src/proof_system/ark/gm17.rs index d3f52490..2cf5f5c3 100644 --- a/zokrates_core/src/proof_system/ark/gm17.rs +++ b/zokrates_core/src/proof_system/ark/gm17.rs @@ -7,7 +7,7 @@ use ark_serialize::{CanonicalDeserialize, CanonicalSerialize}; use zokrates_field::{ArkFieldExtensions, Bw6_761Field, Field}; use crate::ir::{ProgIterator, Statement, Witness}; -use crate::proof_system::ark::{get_random_seed, Computation}; +use crate::proof_system::ark::Computation; use crate::proof_system::ark::{parse_fr, parse_g1, parse_g2, parse_g2_fq}; use crate::proof_system::ark::{serialization, Ark}; use crate::proof_system::gm17::{ProofPoints, VerificationKey, GM17}; @@ -22,7 +22,7 @@ impl NonUniversalBackend SetupKeypair<>::VerificationKey> { let computation = Computation::without_witness(program); - let rng = &mut rand_0_7::rngs::StdRng::from_seed(get_random_seed().unwrap()); + let rng = &mut rand_0_7::rngs::StdRng::from_entropy(); let (pk, vk) = ArkGM17::::circuit_specific_setup(computation, rng).unwrap(); let mut pk_vec: Vec = Vec::new(); @@ -60,7 +60,7 @@ impl Backend for Ark { ) .unwrap(); - let rng = &mut rand_0_7::rngs::StdRng::from_seed(get_random_seed().unwrap()); + let rng = &mut rand_0_7::rngs::StdRng::from_entropy(); let proof = ArkGM17::::prove(&pk, computation, rng).unwrap(); let proof_points = ProofPoints { @@ -118,7 +118,7 @@ impl NonUniversalBackend for Ark { ) -> SetupKeypair<>::VerificationKey> { let computation = Computation::without_witness(program); - let rng = &mut rand_0_7::rngs::StdRng::from_seed(get_random_seed().unwrap()); + let rng = &mut rand_0_7::rngs::StdRng::from_entropy(); let (pk, vk) = ArkGM17::::circuit_specific_setup(computation, rng).unwrap(); let mut pk_vec: Vec = Vec::new(); @@ -157,7 +157,7 @@ impl Backend for Ark { ) .unwrap(); - let rng = &mut rand_0_7::rngs::StdRng::from_seed(get_random_seed().unwrap()); + let rng = &mut rand_0_7::rngs::StdRng::from_entropy(); let proof = ArkGM17::::prove(&pk, computation, rng).unwrap(); let proof_points = ProofPoints { diff --git a/zokrates_core/src/proof_system/ark/groth16.rs b/zokrates_core/src/proof_system/ark/groth16.rs index 87ca9935..01fdf8b2 100644 --- a/zokrates_core/src/proof_system/ark/groth16.rs +++ b/zokrates_core/src/proof_system/ark/groth16.rs @@ -10,7 +10,7 @@ use zokrates_field::{ArkFieldExtensions, Bw6_761Field}; use crate::ir::{ProgIterator, Statement, Witness}; use crate::proof_system::ark::Computation; -use crate::proof_system::ark::{get_random_seed, parse_fr, serialization, Ark}; +use crate::proof_system::ark::{parse_fr, serialization, Ark}; use crate::proof_system::ark::{parse_g1, parse_g2}; use crate::proof_system::groth16::{ProofPoints, VerificationKey, G16}; use crate::proof_system::Scheme; @@ -40,7 +40,7 @@ impl Backend for Ark { ) .unwrap(); - let rng = &mut rand_0_7::rngs::StdRng::from_seed(get_random_seed().unwrap()); + let rng = &mut rand_0_7::rngs::StdRng::from_entropy(); let proof = Groth16::::prove(&pk, computation, rng).unwrap(); let proof_points = ProofPoints { @@ -97,7 +97,7 @@ impl NonUniversalBackend::circuit_specific_setup(computation, rng).unwrap(); let mut pk_vec: Vec = Vec::new(); @@ -134,7 +134,7 @@ impl Backend for Ark { let pk = ProvingKey::::deserialize_uncompressed(&mut proving_key.as_slice()).unwrap(); - let rng = &mut rand_0_7::rngs::StdRng::from_seed(get_random_seed().unwrap()); + let rng = &mut rand_0_7::rngs::StdRng::from_entropy(); let proof = Groth16::::prove(&pk, computation, rng).unwrap(); let proof_points = ProofPoints { @@ -191,7 +191,7 @@ impl NonUniversalBackend for Ark { let computation = Computation::without_witness(program); - let rng = &mut rand_0_7::rngs::StdRng::from_seed(get_random_seed().unwrap()); + let rng = &mut rand_0_7::rngs::StdRng::from_entropy(); let (pk, vk) = Groth16::::circuit_specific_setup(computation, rng).unwrap(); let mut pk_vec: Vec = Vec::new(); diff --git a/zokrates_core/src/proof_system/ark/mod.rs b/zokrates_core/src/proof_system/ark/mod.rs index 33ee9c4b..192d7303 100644 --- a/zokrates_core/src/proof_system/ark/mod.rs +++ b/zokrates_core/src/proof_system/ark/mod.rs @@ -141,12 +141,6 @@ impl>> ProgIt } } -pub fn get_random_seed() -> Result<[u8; 32], getrandom::Error> { - let mut seed = [0u8; 32]; - getrandom::getrandom(&mut seed)?; - Ok(seed) -} - impl>> Computation { pub fn public_inputs_values(&self) -> Vec<::Fr> { self.program