From 24249c2e2290adfce10ea3cb530b2560788dd042 Mon Sep 17 00:00:00 2001 From: "Ryan.K" Date: Fri, 2 Feb 2024 17:10:29 +0800 Subject: [PATCH 1/3] travel circuit --- Cargo.lock | 113 ++++++-------------- crates/snark/Cargo.toml | 2 +- crates/snark/src/circuit/bellman.rs | 11 ++ crates/snark/src/circuit/bellpepper.rs | 7 ++ crates/snark/src/circuit/mod.rs | 22 ++++ crates/snark/src/snark/impls.rs | 2 +- crates/snark/src/snark/mod.rs | 2 +- crates/snark/src/tests/native/test_snark.rs | 1 + 8 files changed, 78 insertions(+), 82 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f47e6dcb5..e149dc925 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -226,12 +226,6 @@ version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545" -[[package]] -name = "arrayvec" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" - [[package]] name = "arrayvec" version = "0.7.4" @@ -494,7 +488,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "935c90240f9b7749c80746bf88ad9cb346f34b01ee30ad4d566dfdecd6e3cc6a" dependencies = [ "thiserror", - "tiny-keccak 2.0.2", + "tiny-keccak", ] [[package]] @@ -517,25 +511,18 @@ checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" [[package]] name = "bellman_ce" -version = "0.3.2" -source = "git+https://github.com/matter-labs/bellman#5520aa2274afe73d281373c92b007a2ecdebfbea" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5ca1343d8690bb4d62e0665116bd4f109e33a642f86908ed107d226a402b0ef" dependencies = [ - "arrayvec 0.7.4", "bit-vec", - "blake2s_const", - "blake2s_simd 0.5.11", "byteorder", - "cfg-if 1.0.0", + "cfg-if 0.1.10", "crossbeam", "futures", - "hex", - "lazy_static", "num_cpus", "pairing_ce", "rand 0.4.6", - "serde", - "smallvec", - "tiny-keccak 1.5.0", ] [[package]] @@ -555,7 +542,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d8abb418570756396d722841b19edfec21d4e89e1cf8990610663040ecb1aea" dependencies = [ - "blake2s_simd 1.0.2", + "blake2s_simd", "byteorder", "ff 0.13.0", "serde", @@ -585,9 +572,6 @@ name = "bit-vec" version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" -dependencies = [ - "serde", -] [[package]] name = "bitflags" @@ -620,29 +604,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "23285ad32269793932e830392f2fe2f83e26488fd3ec778883a93c8323735780" dependencies = [ "arrayref", - "arrayvec 0.7.4", - "constant_time_eq 0.3.0", -] - -[[package]] -name = "blake2s_const" -version = "0.6.0" -source = "git+https://github.com/matter-labs/bellman#5520aa2274afe73d281373c92b007a2ecdebfbea" -dependencies = [ - "arrayref", - "arrayvec 0.5.2", - "constant_time_eq 0.1.5", -] - -[[package]] -name = "blake2s_simd" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e461a7034e85b211a4acb57ee2e6730b32912b06c08cc242243c39fc21ae6a2" -dependencies = [ - "arrayref", - "arrayvec 0.5.2", - "constant_time_eq 0.1.5", + "arrayvec", + "constant_time_eq", ] [[package]] @@ -652,8 +615,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94230421e395b9920d23df13ea5d77a20e1725331f90fbbf6df6040b33f756ae" dependencies = [ "arrayref", - "arrayvec 0.7.4", - "constant_time_eq 0.3.0", + "arrayvec", + "constant_time_eq", ] [[package]] @@ -985,12 +948,6 @@ version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" -[[package]] -name = "constant_time_eq" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" - [[package]] name = "constant_time_eq" version = "0.3.0" @@ -1050,7 +1007,7 @@ version = "0.91.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "98b022ed2a5913a38839dfbafe6cf135342661293b08049843362df4301261dc" dependencies = [ - "arrayvec 0.7.4", + "arrayvec", "bumpalo", "cranelift-bforest", "cranelift-codegen-meta", @@ -1822,7 +1779,7 @@ dependencies = [ "fixed-hash", "impl-rlp", "impl-serde", - "tiny-keccak 2.0.2", + "tiny-keccak", ] [[package]] @@ -1892,15 +1849,14 @@ dependencies = [ [[package]] name = "ff_ce" -version = "0.14.3" +version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b538e4231443a5b9c507caee3356f016d832cf7393d2d90f03ea3180d4e3fbc" +checksum = "4592897f75fd1bd178e5ec12d9d7df3d1943464feda2cbce1e708a484e82c8f6" dependencies = [ "byteorder", "ff_derive_ce", "hex", "rand 0.4.6", - "serde", ] [[package]] @@ -1921,16 +1877,15 @@ dependencies = [ [[package]] name = "ff_derive_ce" -version = "0.11.2" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b96fbccd88dbb1fac4ee4a07c2fcc4ca719a74ffbd9d2b9d41d8c8eb073d8b20" +checksum = "50c052fa6d4c2f12305ec364bfb8ef884836f3f61ea015b202372ff996d1ac4b" dependencies = [ - "num-bigint 0.4.4", + "num-bigint 0.2.6", "num-integer", "num-traits", "proc-macro2", "quote", - "serde", "syn 1.0.109", ] @@ -2737,7 +2692,7 @@ dependencies = [ "regex-syntax 0.6.29", "string_cache", "term", - "tiny-keccak 2.0.2", + "tiny-keccak", "unicode-xid", ] @@ -3014,7 +2969,7 @@ checksum = "06626c9ac04c894e9a23d061ba1309f28506cdc5fe64156d28a15fb57fc8e438" dependencies = [ "bellpepper", "bellpepper-core", - "blake2s_simd 1.0.2", + "blake2s_simd", "blstrs", "byteorder", "ff 0.13.0", @@ -3108,6 +3063,17 @@ dependencies = [ "winapi", ] +[[package]] +name = "num-bigint" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "090c7f9998ee0ff65aa5b723e4009f7b217707f1fb5ea551329cc4d6231fb304" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + [[package]] name = "num-bigint" version = "0.3.3" @@ -3352,15 +3318,13 @@ dependencies = [ [[package]] name = "pairing_ce" -version = "0.28.5" +version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db007b21259660d025918e653508f03050bf23fb96a88601f9936329faadc597" +checksum = "bfc00d65b1d29e0a067a967fcea83d8db261c149f76a557ba73f0304f01cdfde" dependencies = [ "byteorder", - "cfg-if 1.0.0", "ff_ce", "rand 0.4.6", - "serde", ] [[package]] @@ -3369,7 +3333,7 @@ version = "3.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "881331e34fa842a2fb61cc2db9643a8fedc615e47cfcc52597d1af0db9a7e8fe" dependencies = [ - "arrayvec 0.7.4", + "arrayvec", "bitvec", "byte-slice-cast", "impl-trait-for-tuples", @@ -4302,7 +4266,7 @@ dependencies = [ "sled", "subtle", "thiserror", - "tiny-keccak 2.0.2", + "tiny-keccak", "tokio", "tracing", "tracing-subscriber", @@ -5401,15 +5365,6 @@ dependencies = [ "time-core", ] -[[package]] -name = "tiny-keccak" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d8a021c69bb74a44ccedb824a046447e2c84a01df9e5c20779750acb38e11b2" -dependencies = [ - "crunchy", -] - [[package]] name = "tiny-keccak" version = "2.0.2" diff --git a/crates/snark/Cargo.toml b/crates/snark/Cargo.toml index 9d2cfab67..dfa86ba21 100644 --- a/crates/snark/Cargo.toml +++ b/crates/snark/Cargo.toml @@ -26,7 +26,7 @@ log = { version = "0.4", features = ["std"] } pasta_curves = "0.5" # for load r1cs -bellman_ce = { git = "https://github.com/matter-labs/bellman", version = "0.3.2" } +bellman_ce = "0.3.5" bellpepper-core = "0.4.0" byteorder = "1.4.3" crypto-bigint = { version = "0.5.2", features = ["serde"] } diff --git a/crates/snark/src/circuit/bellman.rs b/crates/snark/src/circuit/bellman.rs index 105ea6ef8..2d0f3ce8a 100644 --- a/crates/snark/src/circuit/bellman.rs +++ b/crates/snark/src/circuit/bellman.rs @@ -1,6 +1,7 @@ //! implement bellman proof system for circuit, this is useful for plonk and growth16 use super::Circuit; +use super::TrivialCircuit; use crate::prelude::bellman; use crate::prelude::bellman::pairing::Engine; use crate::prelude::bellman::ConstraintSystem; @@ -54,3 +55,13 @@ where E::Fr: ff::PrimeField Ok(()) } } + + +impl bellman::Circuit for TrivialCircuit +where E::Fr: ff::PrimeField +{ + //noinspection RsBorrowChecker + fn synthesize>(self, _cs: &mut CS) -> Result<(), SynthesisError> { + Ok(()) + } +} diff --git a/crates/snark/src/circuit/bellpepper.rs b/crates/snark/src/circuit/bellpepper.rs index 6b9b67532..edf18c16b 100644 --- a/crates/snark/src/circuit/bellpepper.rs +++ b/crates/snark/src/circuit/bellpepper.rs @@ -1,6 +1,7 @@ //! implement bellpepper proof system for circuit use super::Circuit; +use super::TrivialCircuit; use crate::prelude::bellpepper; use crate::prelude::bellpepper::num::AllocatedNum; use crate::prelude::bellpepper::ConstraintSystem; @@ -53,3 +54,9 @@ impl bellpepper::Circuit for Circuit { Ok(()) } } + +impl bellpepper::Circuit for TrivialCircuit { + fn synthesize>(self, _cs: &mut CS) -> Result<(), SynthesisError> { + Ok(()) + } +} diff --git a/crates/snark/src/circuit/mod.rs b/crates/snark/src/circuit/mod.rs index d10a55c24..1ef261c80 100644 --- a/crates/snark/src/circuit/mod.rs +++ b/crates/snark/src/circuit/mod.rs @@ -291,3 +291,25 @@ impl StepCircuit for Circuit { Ok(z_out) } } + + +/// A trivial step circuit that simply returns the input +/// from +#[derive(Clone, Debug, Default, PartialEq, Eq)] +pub struct TrivialCircuit { + _p: core::marker::PhantomData, +} + +impl StepCircuit for TrivialCircuit { + fn arity(&self) -> usize { + 1 + } + + fn synthesize>( + &self, + _cs: &mut CS, + z: &[AllocatedNum], + ) -> core::result::Result>, SynthesisError> { + Ok(z.to_vec()) + } +} diff --git a/crates/snark/src/snark/impls.rs b/crates/snark/src/snark/impls.rs index afe190079..79a0aad1c 100644 --- a/crates/snark/src/snark/impls.rs +++ b/crates/snark/src/snark/impls.rs @@ -8,7 +8,7 @@ use super::VerifierKey; use super::SNARK; use crate::circuit::Circuit; use crate::prelude::nova; -use crate::prelude::nova::traits::circuit::TrivialCircuit; +use crate::circuit::TrivialCircuit; use crate::prelude::nova::traits::snark::RelaxedR1CSSNARKTrait; use crate::prelude::nova::traits::Engine; use crate::prelude::nova::RecursiveSNARK; diff --git a/crates/snark/src/snark/mod.rs b/crates/snark/src/snark/mod.rs index 64a55fddb..e743a6645 100644 --- a/crates/snark/src/snark/mod.rs +++ b/crates/snark/src/snark/mod.rs @@ -14,7 +14,7 @@ use utils::serialize_forward; use crate::circuit::Circuit; use crate::error::Result; use crate::prelude::nova; -use crate::prelude::nova::traits::circuit::TrivialCircuit; +use crate::circuit::TrivialCircuit; use crate::prelude::nova::traits::snark::RelaxedR1CSSNARKTrait; use crate::prelude::nova::traits::Engine; use crate::prelude::nova::RecursiveSNARK; diff --git a/crates/snark/src/tests/native/test_snark.rs b/crates/snark/src/tests/native/test_snark.rs index 170edae61..25a632e64 100644 --- a/crates/snark/src/tests/native/test_snark.rs +++ b/crates/snark/src/tests/native/test_snark.rs @@ -6,6 +6,7 @@ use crate::error::Result; use crate::prelude::nova::provider::ipa_pc::EvaluationEngine; use crate::prelude::nova::provider::PallasEngine; use crate::prelude::nova::provider::VestaEngine; +use crate::prelude::nova::provider::Bn256Engine; use crate::prelude::nova::spartan::snark::RelaxedR1CSSNARK; use crate::prelude::nova::traits::Engine; use crate::r1cs; From 72271beb2a6c041c88579d6d72045ed1f63aa93f Mon Sep 17 00:00:00 2001 From: "Ryan.K" Date: Sun, 18 Feb 2024 16:04:47 +0800 Subject: [PATCH 2/3] ff --- Cargo.lock | 114 ++++++++++++----- crates/snark/Cargo.toml | 3 +- crates/snark/src/circuit/mod.rs | 2 +- crates/snark/src/ff.rs | 206 +++++++++++++++++++++++++++++++ crates/snark/src/lib.rs | 1 + crates/snark/src/snark/engine.rs | 46 +++++++ crates/snark/src/snark/mod.rs | 3 + 7 files changed, 339 insertions(+), 36 deletions(-) create mode 100644 crates/snark/src/ff.rs create mode 100644 crates/snark/src/snark/engine.rs diff --git a/Cargo.lock b/Cargo.lock index e149dc925..92c711306 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -226,6 +226,12 @@ version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545" +[[package]] +name = "arrayvec" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" + [[package]] name = "arrayvec" version = "0.7.4" @@ -488,7 +494,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "935c90240f9b7749c80746bf88ad9cb346f34b01ee30ad4d566dfdecd6e3cc6a" dependencies = [ "thiserror", - "tiny-keccak", + "tiny-keccak 2.0.2", ] [[package]] @@ -511,18 +517,25 @@ checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" [[package]] name = "bellman_ce" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5ca1343d8690bb4d62e0665116bd4f109e33a642f86908ed107d226a402b0ef" +version = "0.3.2" +source = "git+https://github.com/matter-labs/bellman.git?rev=5520aa2#5520aa2274afe73d281373c92b007a2ecdebfbea" dependencies = [ + "arrayvec 0.7.4", "bit-vec", + "blake2s_const", + "blake2s_simd 0.5.11", "byteorder", - "cfg-if 0.1.10", + "cfg-if 1.0.0", "crossbeam", "futures", + "hex", + "lazy_static", "num_cpus", "pairing_ce", "rand 0.4.6", + "serde", + "smallvec", + "tiny-keccak 1.5.0", ] [[package]] @@ -542,7 +555,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d8abb418570756396d722841b19edfec21d4e89e1cf8990610663040ecb1aea" dependencies = [ - "blake2s_simd", + "blake2s_simd 1.0.2", "byteorder", "ff 0.13.0", "serde", @@ -572,6 +585,9 @@ name = "bit-vec" version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" +dependencies = [ + "serde", +] [[package]] name = "bitflags" @@ -604,8 +620,29 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "23285ad32269793932e830392f2fe2f83e26488fd3ec778883a93c8323735780" dependencies = [ "arrayref", - "arrayvec", - "constant_time_eq", + "arrayvec 0.7.4", + "constant_time_eq 0.3.0", +] + +[[package]] +name = "blake2s_const" +version = "0.6.0" +source = "git+https://github.com/matter-labs/bellman.git?rev=5520aa2#5520aa2274afe73d281373c92b007a2ecdebfbea" +dependencies = [ + "arrayref", + "arrayvec 0.5.2", + "constant_time_eq 0.1.5", +] + +[[package]] +name = "blake2s_simd" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e461a7034e85b211a4acb57ee2e6730b32912b06c08cc242243c39fc21ae6a2" +dependencies = [ + "arrayref", + "arrayvec 0.5.2", + "constant_time_eq 0.1.5", ] [[package]] @@ -615,8 +652,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94230421e395b9920d23df13ea5d77a20e1725331f90fbbf6df6040b33f756ae" dependencies = [ "arrayref", - "arrayvec", - "constant_time_eq", + "arrayvec 0.7.4", + "constant_time_eq 0.3.0", ] [[package]] @@ -948,6 +985,12 @@ version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" +[[package]] +name = "constant_time_eq" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" + [[package]] name = "constant_time_eq" version = "0.3.0" @@ -1007,7 +1050,7 @@ version = "0.91.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "98b022ed2a5913a38839dfbafe6cf135342661293b08049843362df4301261dc" dependencies = [ - "arrayvec", + "arrayvec 0.7.4", "bumpalo", "cranelift-bforest", "cranelift-codegen-meta", @@ -1779,7 +1822,7 @@ dependencies = [ "fixed-hash", "impl-rlp", "impl-serde", - "tiny-keccak", + "tiny-keccak 2.0.2", ] [[package]] @@ -1849,14 +1892,15 @@ dependencies = [ [[package]] name = "ff_ce" -version = "0.10.3" +version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4592897f75fd1bd178e5ec12d9d7df3d1943464feda2cbce1e708a484e82c8f6" +checksum = "5b538e4231443a5b9c507caee3356f016d832cf7393d2d90f03ea3180d4e3fbc" dependencies = [ "byteorder", "ff_derive_ce", "hex", "rand 0.4.6", + "serde", ] [[package]] @@ -1877,15 +1921,16 @@ dependencies = [ [[package]] name = "ff_derive_ce" -version = "0.8.0" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50c052fa6d4c2f12305ec364bfb8ef884836f3f61ea015b202372ff996d1ac4b" +checksum = "b96fbccd88dbb1fac4ee4a07c2fcc4ca719a74ffbd9d2b9d41d8c8eb073d8b20" dependencies = [ - "num-bigint 0.2.6", + "num-bigint 0.4.4", "num-integer", "num-traits", "proc-macro2", "quote", + "serde", "syn 1.0.109", ] @@ -2692,7 +2737,7 @@ dependencies = [ "regex-syntax 0.6.29", "string_cache", "term", - "tiny-keccak", + "tiny-keccak 2.0.2", "unicode-xid", ] @@ -2969,7 +3014,7 @@ checksum = "06626c9ac04c894e9a23d061ba1309f28506cdc5fe64156d28a15fb57fc8e438" dependencies = [ "bellpepper", "bellpepper-core", - "blake2s_simd", + "blake2s_simd 1.0.2", "blstrs", "byteorder", "ff 0.13.0", @@ -3063,17 +3108,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "num-bigint" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "090c7f9998ee0ff65aa5b723e4009f7b217707f1fb5ea551329cc4d6231fb304" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - [[package]] name = "num-bigint" version = "0.3.3" @@ -3318,13 +3352,15 @@ dependencies = [ [[package]] name = "pairing_ce" -version = "0.21.1" +version = "0.28.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfc00d65b1d29e0a067a967fcea83d8db261c149f76a557ba73f0304f01cdfde" +checksum = "db007b21259660d025918e653508f03050bf23fb96a88601f9936329faadc597" dependencies = [ "byteorder", + "cfg-if 1.0.0", "ff_ce", "rand 0.4.6", + "serde", ] [[package]] @@ -3333,7 +3369,7 @@ version = "3.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "881331e34fa842a2fb61cc2db9643a8fedc615e47cfcc52597d1af0db9a7e8fe" dependencies = [ - "arrayvec", + "arrayvec 0.7.4", "bitvec", "byte-slice-cast", "impl-trait-for-tuples", @@ -4266,7 +4302,7 @@ dependencies = [ "sled", "subtle", "thiserror", - "tiny-keccak", + "tiny-keccak 2.0.2", "tokio", "tracing", "tracing-subscriber", @@ -4404,6 +4440,7 @@ dependencies = [ "memory-stats", "nova-snark", "pasta_curves", + "rand 0.4.6", "reqwest", "serde", "serde_json", @@ -5365,6 +5402,15 @@ dependencies = [ "time-core", ] +[[package]] +name = "tiny-keccak" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d8a021c69bb74a44ccedb824a046447e2c84a01df9e5c20779750acb38e11b2" +dependencies = [ + "crunchy", +] + [[package]] name = "tiny-keccak" version = "2.0.2" diff --git a/crates/snark/Cargo.toml b/crates/snark/Cargo.toml index dfa86ba21..9138b3078 100644 --- a/crates/snark/Cargo.toml +++ b/crates/snark/Cargo.toml @@ -26,7 +26,8 @@ log = { version = "0.4", features = ["std"] } pasta_curves = "0.5" # for load r1cs -bellman_ce = "0.3.5" +bellman_ce = { version = "0.3.2", features = ["plonk"], git = "https://github.com/matter-labs/bellman.git", rev = "5520aa2" } +rand = "0.4.6" bellpepper-core = "0.4.0" byteorder = "1.4.3" crypto-bigint = { version = "0.5.2", features = ["serde"] } diff --git a/crates/snark/src/circuit/mod.rs b/crates/snark/src/circuit/mod.rs index 1ef261c80..3ee1792ee 100644 --- a/crates/snark/src/circuit/mod.rs +++ b/crates/snark/src/circuit/mod.rs @@ -25,7 +25,7 @@ pub mod bellpepper; /// Input of witness #[derive(Serialize, Deserialize, Clone)] -pub struct Input { +pub struct Input { /// inner input pub input: Vec<(String, Vec)>, } diff --git a/crates/snark/src/ff.rs b/crates/snark/src/ff.rs new file mode 100644 index 000000000..f029ca653 --- /dev/null +++ b/crates/snark/src/ff.rs @@ -0,0 +1,206 @@ +//! PrimeField implementation of Rings Snark +//! =============== +use crate::prelude::bellman; +use crypto_bigint::rand_core::RngCore; +use crypto_bigint::rand_core; +use serde::de::Deserialize; +use serde::Serialize; +use std::hash::Hash; +use std::hash::Hasher; +use std::marker::PhantomData; + +/// We need this struct to make rand-0.4 and rand-0.8 compatible. +/// RngMutRef holding a mut ref of Rng +pub struct RngMutRef<'a, T: rand::Rng> { + inner: &'a mut T +} + +impl <'a, T: rand::Rng> From<&'a mut T> for RngMutRef<'a, T> { + fn from(inner: &'a mut T) -> Self { + Self { + inner + } + } +} + +impl RngCore for RngMutRef<'_, T> { + fn next_u32(&mut self) -> u32 { + self.inner.next_u32() + } + fn next_u64(&mut self) -> u64 { + self.inner.next_u64() + } + fn fill_bytes(&mut self, dest: &mut [u8]) { + self.inner.fill_bytes(dest) + } + fn try_fill_bytes(&mut self, dest: &mut [u8]) -> Result<(), rand_core::Error> { + Ok(self.inner.fill_bytes(dest)) + } +} + +/// A wrapper structure of [ff::PrimeField] +#[derive(Debug, Clone, Copy, Default, Eq, PartialEq)] +pub struct PrimeField { + inner: T, + _phantom: PhantomData + +} + +impl From for PrimeField { + fn from(f: T) -> PrimeField { + Self { + inner: f, + _phantom: PhantomData + } + } +} + +impl Hash for PrimeField { + fn hash(&self, state: &mut H) { + let repr = self.inner.to_repr(); + repr.as_ref().hash(state); + } +} + +impl Serialize for PrimeField { + fn serialize(&self, serializer: S) -> Result + where S: serde::Serializer { + let data: Vec = self.inner.to_repr().as_ref().to_vec(); + data.serialize(serializer) + } +} + +impl<'de, T> Deserialize<'de> for PrimeField +where + T: ff::PrimeField, +{ + fn deserialize(deserializer: D) -> Result + where + D: serde::Deserializer<'de>, + { + let data: Vec = Vec::deserialize(deserializer)?; + let s = std::str::from_utf8(&data).expect("Found invalid UTF-8"); + if let Some(ret) = T::from_str_vartime(s).map(|inner| inner.into()) + { + Ok(ret) + } else { + Err(serde::de::Error::custom("Failed to parse str repr")) + } + } +} + +impl std::fmt::Display for PrimeField { + fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { + write!(f, "{:?}", self.inner) + } +} + +impl AsRef> for PrimeField { + fn as_ref(&self) -> &Self { + self + } +} + +impl AsRef for PrimeField { + fn as_ref(&self) -> &T { + &self.inner + } +} + +impl rand::Rand for PrimeField { + fn rand(rng: &mut R) -> Self { + let rng: RngMutRef = rng.into(); + T::random(rng).into() + } +} + +impl bellman::Field for PrimeField { + fn zero() -> Self { + T::ZERO.into() + } + fn one() -> Self { + T::ONE.into() + } + fn is_zero(&self) -> bool { + self.inner.is_zero().into() + } + fn square(&mut self) { + self.inner = self.inner.square(); + } + fn double(&mut self) { + self.inner = self.inner.double(); + } + fn negate(&mut self) { + self.inner = self.inner.neg(); + } + fn add_assign(&mut self, other: &Self) { + self.inner.add_assign(other.inner) + } + fn sub_assign(&mut self, other: &Self) { + self.inner.sub_assign(other.inner) + + } + fn mul_assign(&mut self, other: &Self) { + self.inner.mul_assign(other.inner) + + } + fn inverse(&self) -> Option { + let ret: Option = self.inner.invert().into(); + ret.map(|r| r.into()) + } + + // todo: just power? + fn frobenius_map(&mut self, power: usize) { + if power == 0 { + *self = Self::one(); + return; + } + + let mut result = Self::one(); + let mut base = self.clone(); + let mut exp = power; + + while exp > 0 { + if exp % 2 == 1 { + result.mul_assign(&base); + } + base.square(); + exp /= 2; + } + + *self = result; + } + +} + + +// impl bellman::PrimeField for PrimeField +// { +// type Repr = T::Repr; +// const NUM_BITS: u32 = T::NUM_BITS; +// const CAPACITY: u32 = T::CAPACITY; +// const S: u32 = T::S; + +// fn from_repr(repr: Self::Repr) -> Result { +// T::from_repr(repr) +// } +// fn from_raw_repr(repr: Self::Repr) -> Result { +// T::from_repr(repr) +// } +// fn into_repr(&self) -> Self::Repr { +// self.to_repr() +// } +// fn into_raw_repr(&self) -> Self::Repr { +// self.to_repr() +// } +// fn char() -> Self::Repr { +// Self::Repr +// } +// fn multiplicative_generator() -> Self { +// Self +// } +// fn root_of_unity() -> Self { +// Self +// } + +// } diff --git a/crates/snark/src/lib.rs b/crates/snark/src/lib.rs index 3864bb574..01b8da326 100644 --- a/crates/snark/src/lib.rs +++ b/crates/snark/src/lib.rs @@ -12,3 +12,4 @@ pub mod snark; #[cfg(test)] mod tests; pub mod witness; +pub mod ff; diff --git a/crates/snark/src/snark/engine.rs b/crates/snark/src/snark/engine.rs new file mode 100644 index 000000000..7fa36f780 --- /dev/null +++ b/crates/snark/src/snark/engine.rs @@ -0,0 +1,46 @@ +//! Engines of Rings Snark +//! ============ + +use crate::prelude::nova::provider::Bn256Engine; +//use crate::prelude::nova::provider::GrumpkinEngine; +use nova_snark::traits::Engine as NovaEngine; +use crate::prelude::bellman::ScalarEngine; +use crate::prelude::bellman::pairing::bn256::Bn256; +use crate::prelude::nova::traits::commitment::CommitmentEngineTrait; +use crate::prelude::nova::traits::TranscriptEngineTrait; + +/// A wrapper of Nova's Engine +#[derive(Debug, Clone, Copy, Eq, PartialEq)] +pub struct Engine { + inner: T +} + +impl AsRef> for Engine { + fn as_ref(&self) -> &Self { + self + } +} + +impl AsRef for Engine { + fn as_ref(&self) -> &T { + &self.inner + } +} + +impl ScalarEngine for Engine { + type Fr = ::Fr; +} + +impl NovaEngine for Engine +where + ::CE: CommitmentEngineTrait>, + ::TE: TranscriptEngineTrait> +{ + type Base = ::Base; + type Scalar = ::Scalar; + type GE = ::GE; + type RO = ::RO; + type ROCircuit = ::ROCircuit; + type TE = ::TE; + type CE = ::CE; +} diff --git a/crates/snark/src/snark/mod.rs b/crates/snark/src/snark/mod.rs index e743a6645..c74dc69e4 100644 --- a/crates/snark/src/snark/mod.rs +++ b/crates/snark/src/snark/mod.rs @@ -19,6 +19,9 @@ use crate::prelude::nova::traits::snark::RelaxedR1CSSNARKTrait; use crate::prelude::nova::traits::Engine; use crate::prelude::nova::RecursiveSNARK; +//pub mod plonk; +pub mod engine; + /// Rings Snark implementation, a wrapper of nova's recursion snark and compressed snark #[derive(Serialize, Deserialize, Clone, Debug)] pub struct SNARK From 5534aac25d60f61b7eeb02e6ba3db423a35db15b Mon Sep 17 00:00:00 2001 From: "Ryan.K" Date: Sun, 18 Feb 2024 17:11:54 +0800 Subject: [PATCH 3/3] some work around --- crates/snark/src/ff.rs | 107 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 102 insertions(+), 5 deletions(-) diff --git a/crates/snark/src/ff.rs b/crates/snark/src/ff.rs index f029ca653..39a715c78 100644 --- a/crates/snark/src/ff.rs +++ b/crates/snark/src/ff.rs @@ -46,6 +46,69 @@ pub struct PrimeField { } +/// bellman::PrimeField::Repr Sized + Copy + Clone + Eq + Ord + Send + Sync + Default + Debug + Display + 'static + Rand + AsRef<[u64]> + AsMut<[u64]> + From + Hash + Serialize + DeserializeOwned +/// ff::PrimeField::Repr Copy + Default + Send + Sync + 'static + AsRef<[u8]> + AsMut<[u8]> +#[derive(Clone, Debug)] +pub struct PrimeFieldRepr { + _phantom: PhantomData, + data: Vec, +} + +impl From> for PrimeFieldRepr +where + F: ff::PrimeField, +{ + fn from(field: PrimeField) -> Self { + let repr = field.inner.to_repr(); + let data: &[u8] = repr.as_ref(); + let data = bytes_to_u64_vec_with_padding(data); + Self { + _phantom: PhantomData, + data: data + } + } +} + + +impl std::fmt::Display for PrimeFieldRepr +where + F: ff::PrimeField +{ + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{:?}", self.data) + } +} + +impl From for PrimeFieldRepr +where + F: ff::PrimeField +{ + fn from(value: u64) -> Self { + let value = value as u128; + let field: PrimeField = F::from_u128(value).into(); + field.into() + } +} + +impl AsRef<[u64]> for PrimeFieldRepr +where + F: ff::PrimeField +{ + fn as_ref(&self) -> &[u64] { + &self.data + } +} + +impl AsMut<[u64]> for PrimeFieldRepr +where + F: ff::PrimeField +{ + fn as_mut(&mut self) -> &mut [u64] { + &mut self.data + } +} + + impl From for PrimeField { fn from(f: T) -> PrimeField { Self { @@ -181,20 +244,20 @@ impl bellman::Field for PrimeField { // const CAPACITY: u32 = T::CAPACITY; // const S: u32 = T::S; -// fn from_repr(repr: Self::Repr) -> Result { +// fn from_repr(repr: Self::Repr) -> Result { // T::from_repr(repr) // } -// fn from_raw_repr(repr: Self::Repr) -> Result { +// fn from_raw_repr(repr: Self::Repr) -> Result { // T::from_repr(repr) // } // fn into_repr(&self) -> Self::Repr { -// self.to_repr() +// self.inner.to_repr() // } // fn into_raw_repr(&self) -> Self::Repr { -// self.to_repr() +// self.inner.to_repr() // } // fn char() -> Self::Repr { -// Self::Repr +// T::Repr // } // fn multiplicative_generator() -> Self { // Self @@ -204,3 +267,37 @@ impl bellman::Field for PrimeField { // } // } + + +pub(crate) fn bytes_to_u64_vec_with_padding(bytes: &[u8]) -> Vec { + // Calculate the number of bytes needed to pad the array to a multiple of 8 + let padding = if bytes.len() % 8 == 0 { 0 } else { 8 - (bytes.len() % 8) }; + + // Create a new Vec and extend it with the original bytes plus necessary padding + let mut padded_bytes = Vec::with_capacity(bytes.len() + padding); + padded_bytes.extend_from_slice(bytes); + + // Pad with zeros to make the length a multiple of 8 + padded_bytes.resize(bytes.len() + padding, 0); + + // Convert the padded byte slice into a Vec + padded_bytes + .chunks(8) + .map(|chunk| { + let mut arr = [0u8; 8]; + arr.copy_from_slice(chunk); + u64::from_le_bytes(arr) // Or use from_be_bytes, depending on your byte order requirements + }) + .collect() +} + + +#[cfg(test)] +pub mod tests { + use super::*; + + fn test_bytes_to_u64() { + let bytes = &[1, 2, 3, 4, 5]; // Length is not a multiple of 8 + let u64_vec = bytes_to_u64_vec_with_padding(bytes); + } +}