diff --git a/.gitignore b/.gitignore index da4018e2..44bec624 100644 --- a/.gitignore +++ b/.gitignore @@ -11,6 +11,7 @@ proving.key verification.key verifier.sol proof.json +universal_setup.dat witness # Remove Cargo.lock from gitignore if creating an executable, leave it for libraries diff --git a/Cargo.lock b/Cargo.lock index f80f7ee9..14b2f9fe 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,9 +4,9 @@ version = 3 [[package]] name = "addr2line" -version = "0.14.1" +version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a55f82cfe485775d02112886f4169bde0c5894d75e79ead7eafe7e40a25e45f7" +checksum = "e7a2e47a1fbe209ee101dd6d61285226744c6c8d3c21c8dc878ba6cb9f467f3a" dependencies = [ "gimli", ] @@ -19,11 +19,11 @@ checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] name = "ahash" -version = "0.7.2" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f200cbb1e856866d9eade941cf3aa0c5d7dd36f74311c4273b494f4ef036957" +checksum = "43bb833f0bf979d8475d38fbf09ed3b8a55e1885fe93ad3f93239fc6a4f17b98" dependencies = [ - "getrandom 0.2.2", + "getrandom 0.2.3", "once_cell", "version_check", ] @@ -137,7 +137,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3e8cb28c2137af1ef058aa59616db3f7df67dbb70bf2be4ee6920008cc30d98c" dependencies = [ "quote 1.0.9", - "syn 1.0.67", + "syn 1.0.73", ] [[package]] @@ -149,7 +149,7 @@ dependencies = [ "num-bigint 0.4.0", "num-traits 0.2.14", "quote 1.0.9", - "syn 1.0.67", + "syn 1.0.73", ] [[package]] @@ -170,6 +170,23 @@ dependencies = [ "tracing", ] +[[package]] +name = "ark-marlin" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eea366fcce1487bd8f1bee281fbc9de1d7bce353a89ace8eee6ebc9d65e2d2" +dependencies = [ + "ark-ff", + "ark-poly", + "ark-poly-commit", + "ark-relations", + "ark-serialize", + "ark-std", + "derivative", + "digest 0.9.0", + "rand_chacha 0.2.2", +] + [[package]] name = "ark-nonnative-field" version = "0.2.0" @@ -201,6 +218,22 @@ dependencies = [ "hashbrown", ] +[[package]] +name = "ark-poly-commit" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad7df2d50062d718e5914d013ee2f30dc203324e08070d16b241e869b8717ed6" +dependencies = [ + "ark-ec", + "ark-ff", + "ark-poly", + "ark-serialize", + "ark-std", + "derivative", + "digest 0.9.0", + "tracing", +] + [[package]] name = "ark-r1cs-std" version = "0.2.0" @@ -244,9 +277,9 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5ac3d78c750b01f5df5b2e76d106ed31487a93b3868f14a7f0eb3a74f45e1d8a" dependencies = [ - "proc-macro2 1.0.24", + "proc-macro2 1.0.27", "quote 1.0.9", - "syn 1.0.67", + "syn 1.0.73", ] [[package]] @@ -270,12 +303,6 @@ dependencies = [ "rand_xorshift", ] -[[package]] -name = "arrayref" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544" - [[package]] name = "arrayvec" version = "0.4.12" @@ -285,12 +312,6 @@ dependencies = [ "nodrop", ] -[[package]] -name = "arrayvec" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" - [[package]] name = "assert_cli" version = "0.5.4" @@ -324,11 +345,12 @@ checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" [[package]] name = "backtrace" -version = "0.3.56" +version = "0.3.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d117600f438b1707d4e4ae15d3595657288f8235a0eb593e80ecc98ab34e1bc" +checksum = "b7815ea54e4d821e791162e078acbebfd6d8c8939cd559c9335dceb1c8ca7282" dependencies = [ "addr2line", + "cc", "cfg-if 1.0.0", "libc", "miniz_oxide", @@ -336,12 +358,6 @@ dependencies = [ "rustc-demangle", ] -[[package]] -name = "base64" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" - [[package]] name = "bellman_ce" version = "0.3.5" @@ -399,22 +415,11 @@ version = "0.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdc60350286c7c3db13b98e91dbe5c8b6830a6821bc20af5b0c310ce94d74915" dependencies = [ - "arrayvec 0.4.12", + "arrayvec", "byteorder", "constant_time_eq", ] -[[package]] -name = "blake2b_simd" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afa748e348ad3be8263be728124b24a24f268266f6f5d58af9d75f6a40b5c587" -dependencies = [ - "arrayref", - "arrayvec 0.5.2", - "constant_time_eq", -] - [[package]] name = "block-buffer" version = "0.7.3" @@ -427,6 +432,15 @@ dependencies = [ "generic-array 0.12.4", ] +[[package]] +name = "block-buffer" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +dependencies = [ + "generic-array 0.14.4", +] + [[package]] name = "block-padding" version = "0.1.5" @@ -438,9 +452,9 @@ dependencies = [ [[package]] name = "bstr" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a40b47ad93e1a5404e6c18dec46b628214fee441c70f4ab5d6942142cc268a3d" +checksum = "90682c8d613ad3373e66de8c6411e0ae2ab2571e879d2efbf73558cc66f21279" dependencies = [ "lazy_static", "memchr", @@ -450,9 +464,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.6.1" +version = "3.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63396b8a4b9de3f4fdfb320ab6080762242f66a8ef174c49d8e19b674db4cdbe" +checksum = "9c59e7af012c713f529e7a3ee57ce9b31ddd858d4b512923602f74608b009631" [[package]] name = "byte-tools" @@ -496,9 +510,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.0.67" +version = "1.0.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3c69b077ad434294d3ce9f1f6143a2a4b89a8a2d54ef813d85003a4fd1137fd" +checksum = "4a72c244c1ff497a746a7e1fb3d14bd08420ecda70c8f25c7112f2781652d787" dependencies = [ "jobserver", ] @@ -566,6 +580,15 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" +[[package]] +name = "cpufeatures" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66c99696f6c9dd7f35d486b9d04d7e6e202aa3e8c40d553f2fdf5e7e0c6a71ef" +dependencies = [ + "libc", +] + [[package]] name = "crossbeam" version = "0.7.3" @@ -577,7 +600,7 @@ dependencies = [ "crossbeam-deque", "crossbeam-epoch", "crossbeam-queue", - "crossbeam-utils 0.7.2", + "crossbeam-utils", ] [[package]] @@ -586,7 +609,7 @@ version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b153fe7cbef478c567df0f972e02e6d736db11affe43dfc9c56a9374d1adfb87" dependencies = [ - "crossbeam-utils 0.7.2", + "crossbeam-utils", "maybe-uninit", ] @@ -597,7 +620,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9f02af974daeee82218205558e51ec8768b48cf524bd01d550abe5573a608285" dependencies = [ "crossbeam-epoch", - "crossbeam-utils 0.7.2", + "crossbeam-utils", "maybe-uninit", ] @@ -609,7 +632,7 @@ checksum = "058ed274caafc1f60c4997b5fc07bf7dc7cca454af7c6e81edffe5f33f70dace" dependencies = [ "autocfg", "cfg-if 0.1.10", - "crossbeam-utils 0.7.2", + "crossbeam-utils", "lazy_static", "maybe-uninit", "memoffset", @@ -623,7 +646,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "774ba60a54c213d409d5353bda12d49cd68d14e45036a285234c8d6f91f92570" dependencies = [ "cfg-if 0.1.10", - "crossbeam-utils 0.7.2", + "crossbeam-utils", "maybe-uninit", ] @@ -638,17 +661,6 @@ dependencies = [ "lazy_static", ] -[[package]] -name = "crossbeam-utils" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7e9d99fa91428effe99c5c6d4634cdeba32b8cf784fc428a2a687f61a952c49" -dependencies = [ - "autocfg", - "cfg-if 1.0.0", - "lazy_static", -] - [[package]] name = "crunchy" version = "0.2.2" @@ -694,7 +706,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e98e2ad1a782e33928b96fc3948e7c355e5af34ba4de7670fe8bac2a3b2006d" dependencies = [ "quote 1.0.9", - "syn 1.0.67", + "syn 1.0.73", ] [[package]] @@ -703,9 +715,9 @@ version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" dependencies = [ - "proc-macro2 1.0.24", + "proc-macro2 1.0.27", "quote 1.0.9", - "syn 1.0.67", + "syn 1.0.73", ] [[package]] @@ -740,18 +752,18 @@ dependencies = [ [[package]] name = "dirs" -version = "3.0.1" +version = "3.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "142995ed02755914747cc6ca76fc7e4583cd18578746716d0508ea6ed558b9ff" +checksum = "30baa043103c9d0c2a57cf537cc2f35623889dc0d405e6c3cccfadbc81c71309" dependencies = [ "dirs-sys", ] [[package]] name = "dirs-sys" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e93d7f5705de3e49895a2b5e0b8855a1c27f080192ae9c32a6432d50741a57a" +checksum = "03d86534ed367a67548dc68113a0f5db55432fdfbb6e6f9d77704397d95d5780" dependencies = [ "libc", "redox_users", @@ -804,9 +816,9 @@ version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aa4da3c766cd7a0db8242e326e9e4e081edd567072893ed320008189715366a4" dependencies = [ - "proc-macro2 1.0.24", + "proc-macro2 1.0.27", "quote 1.0.9", - "syn 1.0.67", + "syn 1.0.73", "synstructure", ] @@ -848,9 +860,9 @@ dependencies = [ "num-bigint 0.2.6", "num-integer", "num-traits 0.2.14", - "proc-macro2 1.0.24", + "proc-macro2 1.0.27", "quote 1.0.9", - "syn 1.0.67", + "syn 1.0.73", ] [[package]] @@ -887,9 +899,9 @@ checksum = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" [[package]] name = "futures" -version = "0.3.13" +version = "0.3.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f55667319111d593ba876406af7c409c0ebb44dc4be6132a783ccf163ea14c1" +checksum = "0e7e43a803dae2fa37c1f6a8fe121e1f7bf9548b4dfc0522a42f34145dadfc27" dependencies = [ "futures-channel", "futures-core", @@ -902,9 +914,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.13" +version = "0.3.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c2dd2df839b57db9ab69c2c9d8f3e8c81984781937fe2807dc6dcf3b2ad2939" +checksum = "e682a68b29a882df0545c143dc3646daefe80ba479bcdede94d5a703de2871e2" dependencies = [ "futures-core", "futures-sink", @@ -912,15 +924,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.13" +version = "0.3.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15496a72fabf0e62bdc3df11a59a3787429221dd0710ba8ef163d6f7a9112c94" +checksum = "0402f765d8a89a26043b889b26ce3c4679d268fa6bb22cd7c6aad98340e179d1" [[package]] name = "futures-executor" -version = "0.3.13" +version = "0.3.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "891a4b7b96d84d5940084b2a37632dd65deeae662c114ceaa2c879629c9c0ad1" +checksum = "badaa6a909fac9e7236d0620a2f57f7664640c56575b71a7552fbd68deafab79" dependencies = [ "futures-core", "futures-task", @@ -930,28 +942,29 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.13" +version = "0.3.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71c2c65c57704c32f5241c1223167c2c3294fd34ac020c807ddbe6db287ba59" +checksum = "acc499defb3b348f8d8f3f66415835a9131856ff7714bf10dadfc4ec4bdb29a1" [[package]] name = "futures-sink" -version = "0.3.13" +version = "0.3.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85754d98985841b7d4f5e8e6fbfa4a4ac847916893ec511a2917ccd8525b8bb3" +checksum = "a57bead0ceff0d6dde8f465ecd96c9338121bb7717d3e7b108059531870c4282" [[package]] name = "futures-task" -version = "0.3.13" +version = "0.3.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa189ef211c15ee602667a6fcfe1c1fd9e07d42250d2156382820fba33c9df80" +checksum = "8a16bef9fc1a4dddb5bee51c989e3fbba26569cbb0e31f5b303c184e3dd33dae" [[package]] name = "futures-util" -version = "0.3.13" +version = "0.3.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1812c7ab8aedf8d6f2701a43e1243acdbcc2b36ab26e2ad421eb99ac963d96d1" +checksum = "feb5c238d27e2bf94ffdfd27b2c29e3df4a68c4193bb6427384259e2bf191967" dependencies = [ + "autocfg", "futures-channel", "futures-core", "futures-io", @@ -995,9 +1008,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9495705279e7140bf035dde1f6e750c162df8b625267cd52cc44e0b156732c8" +checksum = "7fcd999463524c52659517fe2cea98493cfe485d10565e7b0fb07dbba7ad2753" dependencies = [ "cfg-if 1.0.0", "js-sys", @@ -1008,15 +1021,15 @@ dependencies = [ [[package]] name = "gimli" -version = "0.23.0" +version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6503fe142514ca4799d4c26297c4248239fe8838d827db6bd6065c6ed29a6ce" +checksum = "0e4075386626662786ddb0ec9081e7c7eeb1ba31951f447ca780ef9f5d568189" [[package]] name = "git2" -version = "0.13.17" +version = "0.13.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d250f5f82326884bd39c2853577e70a121775db76818ffa452ed1e80de12986" +checksum = "d9831e983241f8c5591ed53f17d874833e2fa82cac2625f3888c50cbfe136cba" dependencies = [ "bitflags", "libc", @@ -1050,9 +1063,9 @@ dependencies = [ [[package]] name = "hermit-abi" -version = "0.1.18" +version = "0.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "322f4de77956e22ed0e5032c359a0f1273f1f7f0d79bfa3b8ffbc730d7fbcc5c" +checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" dependencies = [ "libc", ] @@ -1065,9 +1078,9 @@ checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" [[package]] name = "idna" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89829a5d69c23d348314a7ac337fe39173b61149a9864deabd260983aed48c21" +checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" dependencies = [ "matches", "unicode-bidi", @@ -1091,18 +1104,18 @@ checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" [[package]] name = "jobserver" -version = "0.1.21" +version = "0.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c71313ebb9439f74b00d9d2dcec36440beaf57a6aa0623068441dd7cd81a7f2" +checksum = "972f5ae5d1cb9c6ae417789196c803205313edde988685da5e3aae0827b9e7fd" dependencies = [ "libc", ] [[package]] name = "js-sys" -version = "0.3.50" +version = "0.3.51" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d99f9e3e84b8f67f846ef5b4cbbc3b1c29f6c759fcbce6f01aa0e73d932a24c" +checksum = "83bdfbace3a0e81a4253f73b49e960b053e396a11012cbd49b9b74d6a2b67062" dependencies = [ "wasm-bindgen", ] @@ -1115,15 +1128,15 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.92" +version = "0.2.98" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56d855069fafbb9b344c0f962150cd2c1187975cb1c22c1522c240d8c4986714" +checksum = "320cfe77175da3a483efed4bc0adc1968ca050b098ce4f2f1c13a56626128790" [[package]] name = "libgit2-sys" -version = "0.12.18+1.1.0" +version = "0.12.21+1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3da6a42da88fc37ee1ecda212ffa254c25713532980005d5f7c0b0fbe7e6e885" +checksum = "86271bacd72b2b9e854c3dcfb82efd538f15f870e4c11af66900effb462f6825" dependencies = [ "cc", "libc", @@ -1149,9 +1162,9 @@ dependencies = [ [[package]] name = "libz-sys" -version = "1.1.2" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "602113192b08db8f38796c4e85c39e960c145965140e918018bcde1952429655" +checksum = "de5435b8549c16d423ed0c03dbaafe57cf6c3344744f1242520d59c9d8ecec66" dependencies = [ "cc", "libc", @@ -1188,9 +1201,9 @@ checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00" [[package]] name = "memchr" -version = "2.3.4" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ee1c47aaa256ecabcaea351eae4a9b01ef39ed810004e298d2511ed284b1525" +checksum = "b16bd47d9e329435e309c58469fe0791c2d0d1ba96ec0954152a5ae2b04387dc" [[package]] name = "memoffset" @@ -1302,15 +1315,18 @@ dependencies = [ [[package]] name = "object" -version = "0.23.0" +version = "0.25.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9a7ab5d64814df0fe4a4b5ead45ed6c5f181ee3ff04ba344313a6c80446c5d4" +checksum = "a38f2be3697a57b4060074ff41b44c16870d916ad7877c17696e063257482bc7" +dependencies = [ + "memchr", +] [[package]] name = "once_cell" -version = "1.7.2" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af8b08b04175473088b46763e51ee54da5f9a164bc162f615b91bc179dbf15a3" +checksum = "692fcb63b64b1758029e0a96ee63e049ce8c5948587f2f7208df04625e5f6b56" [[package]] name = "opaque-debug" @@ -1326,15 +1342,15 @@ checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" [[package]] name = "openssl-probe" -version = "0.1.2" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77af24da69f9d9341038eba93a073b1fdaaa1b788221b00a69bce9e762cb32de" +checksum = "28988d872ab76095a6e6ac88d99b54fd267702734fd7ffe610ca27f533ddb95a" [[package]] name = "openssl-sys" -version = "0.9.61" +version = "0.9.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "313752393519e876837e09e1fa183ddef0be7735868dced3196f4472d536277f" +checksum = "7a7907e3bfa08bb85105209cdfcb6c63d109f8f6c1ed6ca318fff5c1853fbc1d" dependencies = [ "autocfg", "cc", @@ -1409,9 +1425,9 @@ checksum = "99b8db626e31e5b81787b9783425769681b347011cc59471e33ea46d2ea0cf55" dependencies = [ "pest", "pest_meta", - "proc-macro2 1.0.24", + "proc-macro2 1.0.27", "quote 1.0.9", - "syn 1.0.67", + "syn 1.0.73", ] [[package]] @@ -1427,9 +1443,9 @@ dependencies = [ [[package]] name = "pin-project-lite" -version = "0.2.6" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc0e1f259c92177c30a4c9d177246edd0a3568b25756a977d0632cf8fa37e905" +checksum = "8d31d11c69a6b52a174b42bdc0c30e5e11670f90788b2c471c31c1d17d449443" [[package]] name = "pin-utils" @@ -1472,11 +1488,11 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.24" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e0704ee1a7e00d7bb417d0770ea303c1bccbabf0ef1667dae92b5967f5f8a71" +checksum = "f0d8caf72986c1a598726adc988bb5984792ef84f5ee5aa50209145ee8077038" dependencies = [ - "unicode-xid 0.2.1", + "unicode-xid 0.2.2", ] [[package]] @@ -1505,7 +1521,7 @@ version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7" dependencies = [ - "proc-macro2 1.0.24", + "proc-macro2 1.0.27", ] [[package]] @@ -1536,14 +1552,14 @@ dependencies = [ [[package]] name = "rand" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ef9e7e66b4468674bfcb0c81af8b7fa0bb154fa9f28eb840da5c447baeb8d7e" +checksum = "2e7573632e6454cf6b99d7aac4ccca54be06da05aca2ef7423d22d27d4d4bcd8" dependencies = [ "libc", - "rand_chacha 0.3.0", - "rand_core 0.6.2", - "rand_hc 0.3.0", + "rand_chacha 0.3.1", + "rand_core 0.6.3", + "rand_hc 0.3.1", ] [[package]] @@ -1558,12 +1574,12 @@ dependencies = [ [[package]] name = "rand_chacha" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e12735cf05c9e10bf21534da50a147b924d555dc7a547c42e6bb2d5b6017ae0d" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ "ppv-lite86", - "rand_core 0.6.2", + "rand_core 0.6.3", ] [[package]] @@ -1592,11 +1608,11 @@ dependencies = [ [[package]] name = "rand_core" -version = "0.6.2" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34cf66eb183df1c5876e2dcf6b13d57340741e8dc255b48e40a26de954d06ae7" +checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" dependencies = [ - "getrandom 0.2.2", + "getrandom 0.2.3", ] [[package]] @@ -1610,11 +1626,11 @@ dependencies = [ [[package]] name = "rand_hc" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3190ef7066a446f2e7f42e239d161e905420ccab01eb967c9eb27d21b2322a73" +checksum = "d51e9f596de227fda2ea6c84607f5558e196eeaf43c986b724ba4fb8fdf497e7" dependencies = [ - "rand_core 0.6.2", + "rand_core 0.6.3", ] [[package]] @@ -1637,28 +1653,21 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.1.57" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce" - -[[package]] -name = "redox_syscall" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94341e4e44e24f6b591b59e47a8a027df12e008d73fd5672dbea9cc22f4507d9" +checksum = "5ab49abadf3f9e1c4bc499e8845e152ad87d2ad2d30371841171169e9d75feee" dependencies = [ "bitflags", ] [[package]] name = "redox_users" -version = "0.3.5" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de0737333e7a9502c789a36d7c7fa6092a49895d4faa31ca5df163857ded2e9d" +checksum = "528532f3d801c87aec9def2add9ca802fe569e44a544afe633765267840abe64" dependencies = [ - "getrandom 0.1.16", - "redox_syscall 0.1.57", - "rust-argon2", + "getrandom 0.2.3", + "redox_syscall", ] [[package]] @@ -1682,12 +1691,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.1.9" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae1ded71d66a4a97f5e961fd0cb25a5f366a42a41570d16a763a69c092c26ae4" -dependencies = [ - "byteorder", -] +checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" [[package]] name = "regex-syntax" @@ -1707,23 +1713,11 @@ dependencies = [ "winapi", ] -[[package]] -name = "rust-argon2" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b18820d944b33caa75a71378964ac46f58517c92b6ae5f762636247c09e78fb" -dependencies = [ - "base64", - "blake2b_simd", - "constant_time_eq", - "crossbeam-utils 0.8.3", -] - [[package]] name = "rustc-demangle" -version = "0.1.18" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e3bad0ee36814ca07d7968269dd4b7ec89ec2da10c4bb613928d3077083c232" +checksum = "dead70b0b5e03e9c814bcb6b01e03e68f7c57a80aa48c72ec92152ab3e818d49" [[package]] name = "rustc_version" @@ -1762,7 +1756,7 @@ dependencies = [ "rand 0.4.6", "serde", "serde_derive", - "sha2", + "sha2 0.8.2", "tiny-keccak", ] @@ -1799,22 +1793,22 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.125" +version = "1.0.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "558dc50e1a5a5fa7112ca2ce4effcb321b0300c0d4ccf0776a9f60cd89031171" +checksum = "ec7505abeacaec74ae4778d9d9328fe5a5d04253220a85c4ee022239fc996d03" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.125" +version = "1.0.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b093b7a2bb58203b5da3056c05b4ec1fed827dcfdb37347a8841695263b3d06d" +checksum = "963a7dbc9895aeac7ac90e74f34a5d5261828f79df35cbed41e10189d3804d43" dependencies = [ - "proc-macro2 1.0.24", + "proc-macro2 1.0.27", "quote 1.0.9", - "syn 1.0.67", + "syn 1.0.73", ] [[package]] @@ -1834,7 +1828,7 @@ version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f7d94d0bede923b3cea61f3f1ff57ff8cdfd77b400fb8f9998949e0cf04163df" dependencies = [ - "block-buffer", + "block-buffer 0.7.3", "digest 0.8.1", "fake-simd", "opaque-debug 0.2.3", @@ -1846,12 +1840,25 @@ version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a256f46ea78a0c0d9ff00077504903ac881a1dafdc20da66545699e7776b3e69" dependencies = [ - "block-buffer", + "block-buffer 0.7.3", "digest 0.8.1", "fake-simd", "opaque-debug 0.2.3", ] +[[package]] +name = "sha2" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b362ae5752fd2137731f9fa25fd4d9058af34666ca1966fb969119cc35719f12" +dependencies = [ + "block-buffer 0.9.0", + "cfg-if 1.0.0", + "cpufeatures", + "digest 0.9.0", + "opaque-debug 0.3.0", +] + [[package]] name = "single" version = "1.0.0" @@ -1878,9 +1885,9 @@ dependencies = [ [[package]] name = "slab" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8" +checksum = "f173ac3d1a7e3b28003f40de0b5ce7fe2710f9b9dc3fc38664cebee46b3b6527" [[package]] name = "strsim" @@ -1907,13 +1914,13 @@ dependencies = [ [[package]] name = "syn" -version = "1.0.67" +version = "1.0.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6498a9efc342871f91cc2d0d694c674368b4ceb40f62b65a7a08c3792935e702" +checksum = "f71489ff30030d2ae598524f61326b902466f72a0fb1a8564c001cc63425bcc7" dependencies = [ - "proc-macro2 1.0.24", + "proc-macro2 1.0.27", "quote 1.0.9", - "unicode-xid 0.2.1", + "unicode-xid 0.2.2", ] [[package]] @@ -1922,10 +1929,10 @@ version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b834f2d66f734cb897113e34aaff2f1ab4719ca946f9a7358dba8f8064148701" dependencies = [ - "proc-macro2 1.0.24", + "proc-macro2 1.0.27", "quote 1.0.9", - "syn 1.0.67", - "unicode-xid 0.2.1", + "syn 1.0.73", + "unicode-xid 0.2.2", ] [[package]] @@ -1946,8 +1953,8 @@ checksum = "dac1c663cfc93810f88aed9b8941d48cabf856a1b111c29a40439018d870eb22" dependencies = [ "cfg-if 1.0.0", "libc", - "rand 0.8.3", - "redox_syscall 0.2.5", + "rand 0.8.4", + "redox_syscall", "remove_dir_all", "winapi", ] @@ -1981,9 +1988,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.1.1" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "317cca572a0e89c3ce0ca1f1bdc9369547fe318a683418e42ac8f59d14701023" +checksum = "5b5220f05bb7de7f3f53c7c065e1199b3172696fe2db9f9c4d8ad9b4ee74c342" dependencies = [ "tinyvec_macros", ] @@ -1996,9 +2003,9 @@ checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" [[package]] name = "tracing" -version = "0.1.25" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01ebdc2bb4498ab1ab5f5b73c5803825e60199229ccba0698170e3be0e7f959f" +checksum = "09adeb8c97449311ccd28a427f96fb563e7fd31aabf994189879d9da2394b89d" dependencies = [ "cfg-if 1.0.0", "pin-project-lite", @@ -2012,16 +2019,16 @@ version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c42e6fa53307c8a17e4ccd4dc81cf5ec38db9209f59b222210375b54ee40d1e2" dependencies = [ - "proc-macro2 1.0.24", + "proc-macro2 1.0.27", "quote 1.0.9", - "syn 1.0.67", + "syn 1.0.73", ] [[package]] name = "tracing-core" -version = "0.1.17" +version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f50de3927f93d202783f4513cda820ab47ef17f624b03c096e86ef00c67e6b5f" +checksum = "a9ff14f98b1a4b289c6248a023c1c2fa1491062964e9fed67ab29c4e4da4a052" [[package]] name = "typed-arena" @@ -2058,18 +2065,18 @@ dependencies = [ [[package]] name = "unicode-bidi" -version = "0.3.4" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5" +checksum = "eeb8be209bb1c96b7c177c7420d26e04eccacb0eeae6b980e35fcb74678107e0" dependencies = [ "matches", ] [[package]] name = "unicode-normalization" -version = "0.1.17" +version = "0.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07fbfce1c8a97d547e8b5334978438d9d6ec8c20e38f56d4a4374d181493eaef" +checksum = "d54590932941a9e9266f0832deed84ebe1bf2e4c9e4a3554d393d18f5e854bf9" dependencies = [ "tinyvec", ] @@ -2088,15 +2095,15 @@ checksum = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" [[package]] name = "unicode-xid" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564" +checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" [[package]] name = "url" -version = "2.2.1" +version = "2.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ccd964113622c8e9322cfac19eb1004a07e636c545f325da085d5cdde6f1f8b" +checksum = "a507c383b2d33b5fc35d1861e77e6b383d158b2da5e14fe51b83dfedf6fd578c" dependencies = [ "form_urlencoded", "idna", @@ -2112,9 +2119,9 @@ checksum = "b4ae116fef2b7fea257ed6440d3cfcff7f190865f170cdad00bb6465bf18ecba" [[package]] name = "vcpkg" -version = "0.2.11" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b00bca6106a5e23f3eee943593759b7fcddb00554332e856d990c893966879fb" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" [[package]] name = "vec_map" @@ -2159,9 +2166,9 @@ checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" [[package]] name = "wasm-bindgen" -version = "0.2.73" +version = "0.2.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83240549659d187488f91f33c0f8547cbfef0b2088bc470c116d1d260ef623d9" +checksum = "d54ee1d4ed486f78874278e63e4069fc1ab9f6a18ca492076ffb90c5eb2997fd" dependencies = [ "cfg-if 1.0.0", "wasm-bindgen-macro", @@ -2169,24 +2176,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.73" +version = "0.2.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae70622411ca953215ca6d06d3ebeb1e915f0f6613e3b495122878d7ebec7dae" +checksum = "3b33f6a0694ccfea53d94db8b2ed1c3a8a4c86dd936b13b9f0a15ec4a451b900" dependencies = [ "bumpalo", "lazy_static", "log", - "proc-macro2 1.0.24", + "proc-macro2 1.0.27", "quote 1.0.9", - "syn 1.0.67", + "syn 1.0.73", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.23" +version = "0.4.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81b8b767af23de6ac18bf2168b690bed2902743ddf0fb39252e36f9e2bfc63ea" +checksum = "5fba7978c679d53ce2d0ac80c8c175840feb849a161664365d1287b41f2e67f1" dependencies = [ "cfg-if 1.0.0", "js-sys", @@ -2196,9 +2203,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.73" +version = "0.2.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e734d91443f177bfdb41969de821e15c516931c3c3db3d318fa1b68975d0f6f" +checksum = "088169ca61430fe1e58b8096c24975251700e7b1f6fd91cc9d59b04fb9b18bd4" dependencies = [ "quote 1.0.9", "wasm-bindgen-macro-support", @@ -2206,28 +2213,28 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.73" +version = "0.2.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d53739ff08c8a68b0fdbcd54c372b8ab800b1449ab3c9d706503bc7dd1621b2c" +checksum = "be2241542ff3d9f241f5e2cb6dd09b37efe786df8851c54957683a49f0987a97" dependencies = [ - "proc-macro2 1.0.24", + "proc-macro2 1.0.27", "quote 1.0.9", - "syn 1.0.67", + "syn 1.0.73", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.73" +version = "0.2.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9a543ae66aa233d14bb765ed9af4a33e81b8b58d1584cf1b47ff8cd0b9e4489" +checksum = "d7cff876b8f18eed75a66cf49b65e7f967cb354a7aa16003fb55dbfd25b44b4f" [[package]] name = "wasm-bindgen-test" -version = "0.3.23" +version = "0.3.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e972e914de63aa53bd84865e54f5c761bd274d48e5be3a6329a662c0386aa67a" +checksum = "8cab416a9b970464c2882ed92d55b0c33046b08e0bdc9d59b3b718acd4e1bae8" dependencies = [ "console_error_panic_hook", "js-sys", @@ -2239,19 +2246,19 @@ dependencies = [ [[package]] name = "wasm-bindgen-test-macro" -version = "0.3.23" +version = "0.3.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea6153a8f9bf24588e9f25c87223414fff124049f68d3a442a0f0eab4768a8b6" +checksum = "dd4543fc6cf3541ef0d98bf720104cc6bd856d7eba449fd2aa365ef4fed0e782" dependencies = [ - "proc-macro2 1.0.24", + "proc-macro2 1.0.27", "quote 1.0.9", ] [[package]] name = "web-sys" -version = "0.3.50" +version = "0.3.51" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a905d57e488fec8861446d3393670fb50d27a262344013181c2cdf9fff5481be" +checksum = "e828417b379f3df7111d3a2a9e5753706cae29c41f7c4029ee9fd77f3e09e582" dependencies = [ "js-sys", "wasm-bindgen", @@ -2290,22 +2297,22 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "zeroize" -version = "1.2.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81a974bcdd357f0dca4d41677db03436324d45a4c9ed2d0b873a5a360ce41c36" +checksum = "4756f7db3f7b5574938c3eb1c117038b8e07f95ee6718c0efad4ac21508f1efd" dependencies = [ "zeroize_derive", ] [[package]] name = "zeroize_derive" -version = "1.0.1" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3f369ddb18862aba61aa49bf31e74d29f0f162dec753063200e1dc084345d16" +checksum = "a2c1e130bebaeab2f23886bf9acbaca14b092408c452543c857f66399cd6dab1" dependencies = [ - "proc-macro2 1.0.24", + "proc-macro2 1.0.27", "quote 1.0.9", - "syn 1.0.67", + "syn 1.0.73", "synstructure", ] @@ -2355,6 +2362,9 @@ dependencies = [ "ark-ec", "ark-ff", "ark-gm17", + "ark-marlin", + "ark-poly", + "ark-poly-commit", "ark-relations", "ark-serialize", "bellman_ce", @@ -2364,7 +2374,7 @@ dependencies = [ "cmake", "csv", "ff_ce 0.9.0", - "getrandom 0.2.2", + "getrandom 0.2.3", "git2", "hex", "lazy_static", @@ -2378,6 +2388,7 @@ dependencies = [ "regex", "serde", "serde_json", + "sha2 0.9.5", "typed-arena", "wasm-bindgen-test", "zokrates_common", @@ -2431,7 +2442,7 @@ dependencies = [ "serde", "serde_derive", "serde_json", - "sha2", + "sha2 0.8.2", ] [[package]] diff --git a/changelogs/unreleased/927-schaeff b/changelogs/unreleased/927-schaeff new file mode 100644 index 00000000..c6482053 --- /dev/null +++ b/changelogs/unreleased/927-schaeff @@ -0,0 +1 @@ +Add support for the Marlin proving 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 40f2a6e6..3629c5ee 100644 --- a/zokrates_book/src/toolbox/proving_schemes.md +++ b/zokrates_book/src/toolbox/proving_schemes.md @@ -14,6 +14,7 @@ Proving schemes supported by ZoKrates require a pairing-friendly elliptic curve. Default: `ALT_BN128` When not using the default, the CLI flag has to be provided for the following commands: +- `universal-setup` - `compile` - `export-verifier` - `verify` @@ -22,15 +23,19 @@ 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 | -| ---- | -------- | ------ | -| [G16](https://eprint.iacr.org/2016/260) | `--proving-scheme g16` | ALTBN_128, BLS12_381 | -| [GM17](https://eprint.iacr.org/2017/540) | `--proving-scheme gm17` | ALTBN_128, BLS12_377, BW6_761 | -| [PGHR13](https://eprint.iacr.org/2013/279) | `--proving-scheme pghr13` | ALTBN_128 | +| 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 | -Default: `G16` +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. + +Default: `G16`, except for `universal-setup` for which the default is `Marlin` When not using the default, the CLI flag has to be provided for the following commands: +- `universal-setup` - `setup` - `export-verifier` - `generate-proof` @@ -49,6 +54,7 @@ ZoKrates supports multiple backends. The options are the following: Default: `bellman` When not using the default, the CLI flag has to be provided for the following commands: +- `universal-setup` - `setup` - `generate-proof` - `verify` diff --git a/zokrates_cli/src/bin.rs b/zokrates_cli/src/bin.rs index 3c1e293f..907c65f4 100644 --- a/zokrates_cli/src/bin.rs +++ b/zokrates_cli/src/bin.rs @@ -43,6 +43,8 @@ fn cli() -> Result<(), String> { compile::subcommand(), check::subcommand(), compute_witness::subcommand(), + #[cfg(feature = "ark")] + universal_setup::subcommand(), #[cfg(any(feature = "bellman", feature = "ark", feature = "libsnark"))] setup::subcommand(), export_verifier::subcommand(), @@ -58,6 +60,8 @@ fn cli() -> Result<(), String> { ("compile", Some(sub_matches)) => compile::exec(sub_matches), ("check", Some(sub_matches)) => check::exec(sub_matches), ("compute-witness", Some(sub_matches)) => compute_witness::exec(sub_matches), + #[cfg(feature = "ark")] + ("universal-setup", Some(sub_matches)) => universal_setup::exec(sub_matches), #[cfg(any(feature = "bellman", feature = "ark", feature = "libsnark"))] ("setup", Some(sub_matches)) => setup::exec(sub_matches), ("export-verifier", Some(sub_matches)) => export_verifier::exec(sub_matches), diff --git a/zokrates_cli/src/constants.rs b/zokrates_cli/src/constants.rs index 262674e2..19b2edf4 100644 --- a/zokrates_cli/src/constants.rs +++ b/zokrates_cli/src/constants.rs @@ -5,6 +5,8 @@ pub const PROVING_KEY_DEFAULT_PATH: &str = "proving.key"; pub const VERIFICATION_CONTRACT_DEFAULT_PATH: &str = "verifier.sol"; pub const WITNESS_DEFAULT_PATH: &str = "witness"; pub const JSON_PROOF_PATH: &str = "proof.json"; +pub const UNIVERSAL_SETUP_DEFAULT_PATH: &str = "universal_setup.dat"; +pub const UNIVERSAL_SETUP_DEFAULT_SIZE: &str = "10"; pub const SMTLIB2_DEFAULT_PATH: &str = "out.smt2"; pub const BELLMAN: &str = "bellman"; @@ -54,5 +56,7 @@ pub const CURVES: &[&str] = &[BN128, BLS12_381, BLS12_377, BW6_761]; pub const G16: &str = "g16"; pub const PGHR13: &str = "pghr13"; pub const GM17: &str = "gm17"; +pub const MARLIN: &str = "marlin"; -pub const SCHEMES: &[&str] = &[G16, PGHR13, GM17]; +pub const SCHEMES: &[&str] = &[G16, PGHR13, GM17, MARLIN]; +pub const UNIVERSAL_SCHEMES: &[&str] = &[MARLIN]; diff --git a/zokrates_cli/src/helpers.rs b/zokrates_cli/src/helpers.rs index f68b6d8c..8eb17339 100644 --- a/zokrates_cli/src/helpers.rs +++ b/zokrates_cli/src/helpers.rs @@ -9,6 +9,7 @@ pub enum CurveParameter { Bw6_761, } +#[derive(Debug)] pub enum BackendParameter { #[cfg(feature = "bellman")] Bellman, @@ -19,10 +20,12 @@ pub enum BackendParameter { } #[allow(clippy::upper_case_acronyms)] +#[derive(Debug)] pub enum SchemeParameter { G16, GM17, PGHR13, + MARLIN, } impl TryFrom<&str> for CurveParameter { @@ -63,11 +66,13 @@ impl TryFrom<&str> for SchemeParameter { G16 => Ok(SchemeParameter::G16), GM17 => Ok(SchemeParameter::GM17), PGHR13 => Ok(SchemeParameter::PGHR13), + MARLIN => Ok(SchemeParameter::MARLIN), _ => Err(format!("Unknown proving scheme {}", s)), } } } +#[derive(Debug)] pub struct Parameters( pub BackendParameter, pub CurveParameter, @@ -93,6 +98,12 @@ impl TryFrom<(&str, &str, &str)> for Parameters { (BackendParameter::Ark, CurveParameter::Bw6_761, SchemeParameter::GM17) => Ok(()), #[cfg(feature = "ark")] (BackendParameter::Ark, CurveParameter::Bn128, SchemeParameter::GM17) => Ok(()), + #[cfg(feature = "ark")] + (BackendParameter::Ark, CurveParameter::Bls12_377, SchemeParameter::MARLIN) => Ok(()), + #[cfg(feature = "ark")] + (BackendParameter::Ark, CurveParameter::Bn128, SchemeParameter::MARLIN) => Ok(()), + #[cfg(feature = "ark")] + (BackendParameter::Ark, CurveParameter::Bw6_761, SchemeParameter::MARLIN) => Ok(()), #[cfg(feature = "libsnark")] (BackendParameter::Libsnark, CurveParameter::Bn128, SchemeParameter::GM17) => Ok(()), #[cfg(feature = "libsnark")] diff --git a/zokrates_cli/src/ops/generate_proof.rs b/zokrates_cli/src/ops/generate_proof.rs index f16be759..2900d8a8 100644 --- a/zokrates_cli/src/ops/generate_proof.rs +++ b/zokrates_cli/src/ops/generate_proof.rs @@ -116,6 +116,13 @@ pub fn exec(sub_matches: &ArgMatches) -> Result<(), String> { ProgEnum::Bn128Program(p) => cli_generate_proof::<_, GM17, Ark>(p, sub_matches), _ => unreachable!(), }, + #[cfg(feature = "ark")] + Parameters(BackendParameter::Ark, _, SchemeParameter::MARLIN) => match prog { + ProgEnum::Bls12_377Program(p) => cli_generate_proof::<_, Marlin, Ark>(p, sub_matches), + ProgEnum::Bw6_761Program(p) => cli_generate_proof::<_, Marlin, Ark>(p, sub_matches), + ProgEnum::Bn128Program(p) => cli_generate_proof::<_, Marlin, Ark>(p, sub_matches), + _ => unreachable!(), + }, #[cfg(feature = "libsnark")] Parameters(BackendParameter::Libsnark, CurveParameter::Bn128, SchemeParameter::GM17) => { match prog { diff --git a/zokrates_cli/src/ops/mod.rs b/zokrates_cli/src/ops/mod.rs index 1da6392f..ed570cf8 100644 --- a/zokrates_cli/src/ops/mod.rs +++ b/zokrates_cli/src/ops/mod.rs @@ -8,5 +8,7 @@ pub mod generate_smtlib2; pub mod print_proof; #[cfg(any(feature = "bellman", feature = "ark", feature = "libsnark"))] pub mod setup; +#[cfg(feature = "ark")] +pub mod universal_setup; #[cfg(any(feature = "bellman", feature = "ark", feature = "libsnark"))] pub mod verify; diff --git a/zokrates_cli/src/ops/setup.rs b/zokrates_cli/src/ops/setup.rs index 455d8fb1..0e1eeae0 100644 --- a/zokrates_cli/src/ops/setup.rs +++ b/zokrates_cli/src/ops/setup.rs @@ -70,6 +70,16 @@ pub fn subcommand() -> App<'static, 'static> { .possible_values(constants::SCHEMES) .default_value(constants::G16), ) + .arg( + Arg::with_name("universal-setup-path") + .short("u") + .long("universal-setup-path") + .help("Path of the universal setup file for universal schemes") + .value_name("FILE") + .takes_value(true) + .required(false) + .default_value(constants::UNIVERSAL_SETUP_DEFAULT_PATH), + ) } pub fn exec(sub_matches: &ArgMatches) -> Result<(), String> { @@ -95,28 +105,64 @@ pub fn exec(sub_matches: &ArgMatches) -> Result<(), String> { match parameters { #[cfg(feature = "bellman")] Parameters(BackendParameter::Bellman, _, SchemeParameter::G16) => match prog { - ProgEnum::Bn128Program(p) => cli_setup::<_, G16, Bellman>(p, sub_matches), - ProgEnum::Bls12_381Program(p) => cli_setup::<_, G16, Bellman>(p, sub_matches), + ProgEnum::Bn128Program(p) => cli_setup_non_universal::<_, G16, Bellman>(p, sub_matches), + ProgEnum::Bls12_381Program(p) => { + cli_setup_non_universal::<_, G16, Bellman>(p, sub_matches) + } _ => unreachable!(), }, #[cfg(feature = "ark")] Parameters(BackendParameter::Ark, _, SchemeParameter::GM17) => match prog { - ProgEnum::Bls12_377Program(p) => cli_setup::<_, GM17, Ark>(p, sub_matches), - ProgEnum::Bw6_761Program(p) => cli_setup::<_, GM17, Ark>(p, sub_matches), - ProgEnum::Bn128Program(p) => cli_setup::<_, GM17, Ark>(p, sub_matches), + ProgEnum::Bls12_377Program(p) => { + cli_setup_non_universal::<_, GM17, Ark>(p, sub_matches) + } + ProgEnum::Bw6_761Program(p) => cli_setup_non_universal::<_, GM17, Ark>(p, sub_matches), + ProgEnum::Bn128Program(p) => cli_setup_non_universal::<_, GM17, Ark>(p, sub_matches), _ => unreachable!(), }, + #[cfg(feature = "ark")] + Parameters(BackendParameter::Ark, _, SchemeParameter::MARLIN) => { + let setup_path = Path::new(sub_matches.value_of("universal-setup-path").unwrap()); + let setup_file = File::open(&setup_path) + .map_err(|why| format!("Couldn't open {}: {}\nExpected an universal setup, make sure `zokrates universal-setup` was run`", setup_path.display(), why))?; + + let mut reader = BufReader::new(setup_file); + + let mut setup = vec![]; + use std::io::Read; + + reader + .read_to_end(&mut setup) + .map_err(|_| "Cannot read universal setup".to_string())?; + + match prog { + ProgEnum::Bls12_377Program(p) => { + cli_setup_universal::<_, Marlin, Ark>(p, setup, sub_matches) + } + ProgEnum::Bn128Program(p) => { + cli_setup_universal::<_, Marlin, Ark>(p, setup, sub_matches) + } + ProgEnum::Bw6_761Program(p) => { + cli_setup_universal::<_, Marlin, Ark>(p, setup, sub_matches) + } + _ => unreachable!(), + } + } #[cfg(feature = "libsnark")] Parameters(BackendParameter::Libsnark, CurveParameter::Bn128, SchemeParameter::GM17) => { match prog { - ProgEnum::Bn128Program(p) => cli_setup::<_, GM17, Libsnark>(p, sub_matches), + ProgEnum::Bn128Program(p) => { + cli_setup_non_universal::<_, GM17, Libsnark>(p, sub_matches) + } _ => unreachable!(), } } #[cfg(feature = "libsnark")] Parameters(BackendParameter::Libsnark, CurveParameter::Bn128, SchemeParameter::PGHR13) => { match prog { - ProgEnum::Bn128Program(p) => cli_setup::<_, PGHR13, Libsnark>(p, sub_matches), + ProgEnum::Bn128Program(p) => { + cli_setup_non_universal::<_, PGHR13, Libsnark>(p, sub_matches) + } _ => unreachable!(), } } @@ -124,7 +170,7 @@ pub fn exec(sub_matches: &ArgMatches) -> Result<(), String> { } } -fn cli_setup, B: Backend>( +fn cli_setup_non_universal, B: NonUniversalBackend>( program: ir::Prog, sub_matches: &ArgMatches, ) -> Result<(), String> { @@ -167,3 +213,48 @@ fn cli_setup, B: Backend>( Ok(()) } + +fn cli_setup_universal, B: UniversalBackend>( + program: ir::Prog, + srs: Vec, + sub_matches: &ArgMatches, +) -> Result<(), String> { + println!("Performing setup..."); + + // print deserialized flattened program if in verbose mode + if sub_matches.is_present("verbose") { + println!("{}", program); + } + + // get paths for proving and verification keys + let pk_path = Path::new(sub_matches.value_of("proving-key-path").unwrap()); + let vk_path = Path::new(sub_matches.value_of("verification-key-path").unwrap()); + + // run setup phase + let keypair = B::setup(srs, program)?; + + // write verification key + let mut vk_file = File::create(vk_path) + .map_err(|why| format!("Could not create {}: {}", vk_path.display(), why))?; + vk_file + .write_all( + serde_json::to_string_pretty(&keypair.vk) + .unwrap() + .as_bytes(), + ) + .map_err(|why| format!("Could not write to {}: {}", vk_path.display(), why))?; + + println!("Verification key written to '{}'", vk_path.display()); + + // write proving key + let mut pk_file = File::create(pk_path) + .map_err(|why| format!("Could not create {}: {}", pk_path.display(), why))?; + pk_file + .write_all(keypair.pk.as_ref()) + .map_err(|why| format!("Could not write to {}: {}", pk_path.display(), why))?; + + println!("Proving key written to '{}'", pk_path.display()); + println!("Setup completed"); + + Ok(()) +} diff --git a/zokrates_cli/src/ops/universal_setup.rs b/zokrates_cli/src/ops/universal_setup.rs new file mode 100644 index 00000000..9e7674ce --- /dev/null +++ b/zokrates_cli/src/ops/universal_setup.rs @@ -0,0 +1,110 @@ +use crate::constants; +use crate::helpers::*; +use clap::{App, Arg, ArgMatches, SubCommand}; +use std::convert::TryFrom; +use std::fs::File; +use std::io::Write; +use std::path::Path; +#[cfg(feature = "ark")] +use zokrates_core::proof_system::ark::Ark; +#[cfg(any(feature = "bellman", feature = "ark", feature = "libsnark"))] +use zokrates_core::proof_system::*; +use zokrates_field::{Bls12_377Field, Bn128Field, Bw6_761Field, Field}; + +pub fn subcommand() -> App<'static, 'static> { + SubCommand::with_name("universal-setup") + .about("Performs the universal phase of a trusted setup") + .arg( + Arg::with_name("curve") + .short("c") + .long("curve") + .help("Curve to be used in the universal setup") + .takes_value(true) + .required(false) + .possible_values(constants::CURVES) + .default_value(constants::BN128), + ) + .arg( + Arg::with_name("universal-setup-path") + .short("u") + .long("universal-setup-path") + .help("Path of the generated universal setup file") + .value_name("FILE") + .takes_value(true) + .required(false) + .default_value(constants::UNIVERSAL_SETUP_DEFAULT_PATH), + ) + .arg( + Arg::with_name("proving-scheme") + .short("s") + .long("proving-scheme") + .help("Proving scheme to use in the setup") + .takes_value(true) + .required(false) + .possible_values(constants::UNIVERSAL_SCHEMES) + .default_value(constants::MARLIN), + ) + .arg( + Arg::with_name("size") + .short("n") + .long("size") + .help("Size of the trusted setup passed as an exponent. For example, 8 for 2**8") + .takes_value(true) + .required(false) + .default_value(constants::UNIVERSAL_SETUP_DEFAULT_SIZE), + ) +} + +pub fn exec(sub_matches: &ArgMatches) -> Result<(), String> { + let parameters = Parameters::try_from(( + constants::ARK, + sub_matches.value_of("curve").unwrap(), + sub_matches.value_of("proving-scheme").unwrap(), + ))?; + + match parameters { + #[cfg(feature = "ark")] + Parameters(BackendParameter::Ark, CurveParameter::Bls12_377, SchemeParameter::MARLIN) => { + cli_universal_setup::(sub_matches) + } + #[cfg(feature = "ark")] + Parameters(BackendParameter::Ark, CurveParameter::Bw6_761, SchemeParameter::MARLIN) => { + cli_universal_setup::(sub_matches) + } + #[cfg(feature = "ark")] + Parameters(BackendParameter::Ark, CurveParameter::Bn128, SchemeParameter::MARLIN) => { + cli_universal_setup::(sub_matches) + } + _ => unreachable!(), + } +} + +fn cli_universal_setup, B: UniversalBackend>( + sub_matches: &ArgMatches, +) -> Result<(), String> { + println!("Performing setup..."); + + // get paths for the universal setup + let u_path = Path::new(sub_matches.value_of("universal-setup-path").unwrap()); + + // get the size of the setup + let size = sub_matches.value_of("size").unwrap(); + let size = size + .parse::() + .map_err(|_| format!("Universal setup size {} is invalid", size))?; + + // run universal setup phase + let setup = B::universal_setup(size); + + // write proving key + let mut u_file = File::create(u_path) + .map_err(|why| format!("Could not create {}: {}", u_path.display(), why))?; + u_file + .write_all(setup.as_ref()) + .map_err(|why| format!("Could not write to {}: {}", u_path.display(), why))?; + + println!("Universal setup written to '{}'", u_path.display()); + println!("Universal setup completed"); + + Ok(()) +} diff --git a/zokrates_cli/src/ops/verify.rs b/zokrates_cli/src/ops/verify.rs index febddc6c..4a2cde55 100644 --- a/zokrates_cli/src/ops/verify.rs +++ b/zokrates_cli/src/ops/verify.rs @@ -89,6 +89,18 @@ pub fn exec(sub_matches: &ArgMatches) -> Result<(), String> { Parameters(BackendParameter::Ark, CurveParameter::Bn128, SchemeParameter::GM17) => { cli_verify::(sub_matches) } + #[cfg(feature = "ark")] + Parameters(BackendParameter::Ark, CurveParameter::Bls12_377, SchemeParameter::MARLIN) => { + cli_verify::(sub_matches) + } + #[cfg(feature = "ark")] + Parameters(BackendParameter::Ark, CurveParameter::Bw6_761, SchemeParameter::MARLIN) => { + cli_verify::(sub_matches) + } + #[cfg(feature = "ark")] + Parameters(BackendParameter::Ark, CurveParameter::Bn128, SchemeParameter::MARLIN) => { + cli_verify::(sub_matches) + } #[cfg(feature = "libsnark")] Parameters(BackendParameter::Libsnark, CurveParameter::Bn128, SchemeParameter::GM17) => { cli_verify::(sub_matches) diff --git a/zokrates_cli/tests/integration.rs b/zokrates_cli/tests/integration.rs index f613b9a8..23afd312 100644 --- a/zokrates_cli/tests/integration.rs +++ b/zokrates_cli/tests/integration.rs @@ -212,21 +212,33 @@ mod integration { #[cfg(feature = "libsnark")] let backends = map! { - "bellman" => ["g16"], - "libsnark" => ["pghr13"], - "ark" => ["gm17"] + "bellman" => vec!["g16"], + "libsnark" => vec!["pghr13"], + "ark" => vec!["gm17", "marlin"] }; #[cfg(not(feature = "libsnark"))] let backends = map! { - "bellman" => ["g16"], - "ark" => ["gm17"] + "bellman" => vec!["g16"], + "ark" => vec!["gm17", "marlin"] }; + // GENERATE A UNIVERSAL SETUP + assert_cli::Assert::command(&[ + "../target/release/zokrates", + "universal-setup", + "--size", + "15", + "--proving-scheme", + "marlin", + ]) + .succeeds() + .unwrap(); + for (backend, schemes) in backends { for scheme in &schemes { // SETUP - assert_cli::Assert::command(&[ + let setup = assert_cli::Assert::command(&[ "../target/release/zokrates", "setup", "-i", @@ -241,74 +253,78 @@ mod integration { scheme, ]) .succeeds() - .unwrap(); + .stdout() + .doesnt_contain("This program is too small to generate a setup with Marlin") + .execute(); - // GENERATE-PROOF - assert_cli::Assert::command(&[ - "../target/release/zokrates", - "generate-proof", - "-i", - flattened_path.to_str().unwrap(), - "-w", - witness_path.to_str().unwrap(), - "-p", - proving_key_path.to_str().unwrap(), - "--backend", - backend, - "--proving-scheme", - scheme, - "-j", - proof_path.to_str().unwrap(), - ]) - .succeeds() - .unwrap(); + if setup.is_ok() { + // GENERATE-PROOF + assert_cli::Assert::command(&[ + "../target/release/zokrates", + "generate-proof", + "-i", + flattened_path.to_str().unwrap(), + "-w", + witness_path.to_str().unwrap(), + "-p", + proving_key_path.to_str().unwrap(), + "--backend", + backend, + "--proving-scheme", + scheme, + "-j", + proof_path.to_str().unwrap(), + ]) + .succeeds() + .unwrap(); - // CLI VERIFICATION - assert_cli::Assert::command(&[ - "../target/release/zokrates", - "verify", - "--backend", - backend, - "--proving-scheme", - scheme, - "-j", - proof_path.to_str().unwrap(), - "-v", - verification_key_path.to_str().unwrap(), - ]) - .succeeds() - .unwrap(); + // CLI VERIFICATION + assert_cli::Assert::command(&[ + "../target/release/zokrates", + "verify", + "--backend", + backend, + "--proving-scheme", + scheme, + "-j", + proof_path.to_str().unwrap(), + "-v", + verification_key_path.to_str().unwrap(), + ]) + .succeeds() + .unwrap(); - if backend != "ark" { - for abi_version in &["v1", "v2"] { - // EXPORT-VERIFIER - assert_cli::Assert::command(&[ - "../target/release/zokrates", - "export-verifier", - "-i", - verification_key_path.to_str().unwrap(), - "-o", - verification_contract_path.to_str().unwrap(), - "--proving-scheme", - scheme, - "-a", - abi_version, - ]) - .succeeds() - .unwrap(); + if scheme != &"marlin" { + for abi_version in &["v1", "v2"] { + // EXPORT-VERIFIER + assert_cli::Assert::command(&[ + "../target/release/zokrates", + "export-verifier", + "-i", + verification_key_path.to_str().unwrap(), + "-o", + verification_contract_path.to_str().unwrap(), + "--proving-scheme", + scheme, + "-a", + abi_version, + ]) + .succeeds() + .unwrap(); - // TEST VERIFIER - assert_cli::Assert::command(&[ - "node", - "test.js", - verification_contract_path.to_str().unwrap(), - proof_path.to_str().unwrap(), - scheme, - abi_version, - ]) - .current_dir(concat!(env!("OUT_DIR"), "/contract")) - .succeeds() - .unwrap(); + // TEST VERIFIER + assert_cli::Assert::command(&[ + "node", + "test.js", + verification_contract_path.to_str().unwrap(), + proof_path.to_str().unwrap(), + scheme, + abi_version, + ]) + .current_dir(concat!(env!("OUT_DIR"), "/contract")) + .succeeds() + .unwrap(); + } } } } diff --git a/zokrates_core/Cargo.toml b/zokrates_core/Cargo.toml index 77b7d03d..3eba3114 100644 --- a/zokrates_core/Cargo.toml +++ b/zokrates_core/Cargo.toml @@ -13,7 +13,7 @@ libsnark = ["cc", "cmake", "git2"] bellman = ["bellman_ce", "pairing_ce", "ff_ce", "zokrates_field/bellman"] wasm = ["bellman_ce/nolog", "bellman_ce/wasm"] multicore = ["bellman_ce/multicore"] -ark = ["ark-ff", "ark-ec", "ark-bn254", "ark-bls12-377", "ark-bw6-761", "ark-gm17", "ark-serialize", "ark-relations", "zokrates_field/ark"] +ark = ["ark-ff", "ark-ec", "ark-bn254", "ark-bls12-377", "ark-bw6-761", "ark-gm17", "ark-serialize", "ark-relations", "ark-marlin", "ark-poly", "ark-poly-commit", "zokrates_field/ark", "sha2"] [dependencies] cfg-if = "0.1" @@ -51,6 +51,10 @@ ark-bw6-761 = { version = "^0.2.0", default-features = false, optional = true } ark-gm17 = { version = "^0.2.0", default-features = false, optional = true } ark-serialize = { version = "^0.2.0", default-features = false, optional = true } ark-relations = { version = "^0.2.0", default-features = false, optional = true } +ark-marlin = { version = "^0.2.0", default-features = false, optional = true } +ark-poly = { version = "^0.2.0", default-features = false, optional = true } +ark-poly-commit = { version = "^0.2.0", default-features = false, optional = true } +sha2 = { version = "0.9.3", optional = true } [dev-dependencies] wasm-bindgen-test = "^0.3.0" diff --git a/zokrates_core/src/proof_system/ark/gm17.rs b/zokrates_core/src/proof_system/ark/gm17.rs index ed5f2449..b79a90a6 100644 --- a/zokrates_core/src/proof_system/ark/gm17.rs +++ b/zokrates_core/src/proof_system/ark/gm17.rs @@ -12,9 +12,9 @@ use crate::proof_system::ark::Computation; use crate::proof_system::ark::{parse_fr, parse_g1, parse_g2, parse_g2_fq}; use crate::proof_system::gm17::{NotBw6_761Field, ProofPoints, VerificationKey, GM17}; use crate::proof_system::Scheme; -use crate::proof_system::{Backend, Proof, SetupKeypair}; +use crate::proof_system::{Backend, NonUniversalBackend, Proof, SetupKeypair}; -impl Backend for Ark { +impl NonUniversalBackend for Ark { fn setup(program: Prog) -> SetupKeypair<>::VerificationKey> { let parameters = Computation::without_witness(program).setup(); @@ -37,7 +37,9 @@ impl Backend for Ark { SetupKeypair::new(vk, pk) } +} +impl Backend for Ark { fn generate_proof( program: Prog, witness: Witness, @@ -105,7 +107,7 @@ impl Backend for Ark { } } -impl Backend for Ark { +impl NonUniversalBackend for Ark { fn setup( program: Prog, ) -> SetupKeypair<>::VerificationKey> { @@ -130,7 +132,9 @@ impl Backend for Ark { SetupKeypair::new(vk, pk) } +} +impl Backend for Ark { fn generate_proof( program: Prog, witness: Witness, @@ -267,7 +271,7 @@ mod tests { private: vec![false], }; - let keypair = >::setup(program.clone()); + let keypair = >::setup(program.clone()); let interpreter = Interpreter::default(); let witness = interpreter @@ -296,7 +300,7 @@ mod tests { private: vec![false], }; - let keypair = >::setup(program.clone()); + let keypair = >::setup(program.clone()); let interpreter = Interpreter::default(); let witness = interpreter diff --git a/zokrates_core/src/proof_system/ark/marlin.rs b/zokrates_core/src/proof_system/ark/marlin.rs new file mode 100644 index 00000000..e75bd0a4 --- /dev/null +++ b/zokrates_core/src/proof_system/ark/marlin.rs @@ -0,0 +1,277 @@ +use ark_marlin::{IndexProverKey, IndexVerifierKey, Proof as ArkProof}; + +use ark_marlin::Marlin as ArkMarlin; + +use ark_ec::PairingEngine; +use ark_poly::univariate::DensePolynomial; +use ark_poly_commit::marlin_pc::MarlinKZG10; +use ark_serialize::{CanonicalDeserialize, CanonicalSerialize}; +use sha2::Sha256; + +use zokrates_field::{ArkFieldExtensions, Field}; + +use crate::ir::{Prog, Witness}; +use crate::proof_system::ark::parse_fr; +use crate::proof_system::ark::Ark; +use crate::proof_system::ark::Computation; +use crate::proof_system::marlin::{self, ProofPoints, VerificationKey}; +use crate::proof_system::Scheme; +use crate::proof_system::{Backend, Proof, SetupKeypair, UniversalBackend}; + +const MINIMUM_CONSTRAINT_COUNT: usize = 2; + +impl UniversalBackend for Ark { + fn universal_setup(size: u32) -> Vec { + use rand_0_7::SeedableRng; + + let rng = &mut rand_0_7::rngs::StdRng::from_entropy(); + + let srs = ArkMarlin::< + <::ArkEngine as PairingEngine>::Fr, + MarlinKZG10< + T::ArkEngine, + DensePolynomial<<::ArkEngine as PairingEngine>::Fr>, + >, + Sha256, + >::universal_setup( + 2usize.pow(size), 2usize.pow(size), 2usize.pow(size), rng + ) + .unwrap(); + + let mut res = vec![]; + + srs.serialize(&mut res).unwrap(); + + res + } + + fn setup( + universal_srs: Vec, + program: Prog, + ) -> Result>::VerificationKey>, String> { + if program.constraint_count() < MINIMUM_CONSTRAINT_COUNT { + return Err(format!("Programs must have a least {} constraints. This program is too small to generate a setup with Marlin, see [this issue](https://github.com/arkworks-rs/marlin/issues/79)", MINIMUM_CONSTRAINT_COUNT)); + } + + let computation = Computation::without_witness(program); + + let srs = ark_marlin::UniversalSRS::< + <::ArkEngine as PairingEngine>::Fr, + MarlinKZG10< + T::ArkEngine, + DensePolynomial<<::ArkEngine as PairingEngine>::Fr>, + >, + >::deserialize(&mut universal_srs.as_slice()) + .unwrap(); + + let (pk, vk) = ArkMarlin::< + <::ArkEngine as PairingEngine>::Fr, + MarlinKZG10< + T::ArkEngine, + DensePolynomial<<::ArkEngine as PairingEngine>::Fr>, + >, + Sha256, + >::index(&srs, computation) + .map_err(|e| match e { + ark_marlin::Error::IndexTooLarge => String::from("The universal setup is too small for this program, please provide a larger universal setup"), + _ => String::from("Unknown error specializing the universal setup for this program") + })?; + + let mut serialized_pk: Vec = Vec::new(); + pk.serialize_uncompressed(&mut serialized_pk).unwrap(); + + let mut serialized_vk: Vec = Vec::new(); + vk.serialize_uncompressed(&mut serialized_vk).unwrap(); + + Ok(SetupKeypair::new( + VerificationKey { raw: serialized_vk }, + serialized_pk, + )) + } +} + +impl Backend for Ark { + fn generate_proof( + program: Prog, + witness: Witness, + proving_key: Vec, + ) -> Proof<>::ProofPoints> { + let computation = Computation::with_witness(program, witness); + + use rand_0_7::SeedableRng; + + let rng = &mut rand_0_7::rngs::StdRng::from_entropy(); + + let pk = IndexProverKey::< + <::ArkEngine as PairingEngine>::Fr, + MarlinKZG10< + T::ArkEngine, + DensePolynomial<<::ArkEngine as PairingEngine>::Fr>, + >, + >::deserialize_uncompressed(&mut proving_key.as_slice()) + .unwrap(); + + let inputs = computation + .public_inputs_values() + .iter() + .map(parse_fr::) + .collect::>(); + + let proof = ArkMarlin::< + <::ArkEngine as PairingEngine>::Fr, + MarlinKZG10< + T::ArkEngine, + DensePolynomial<<::ArkEngine as PairingEngine>::Fr>, + >, + Sha256, + >::prove(&pk, computation, rng) + .unwrap(); + + let mut serialized_proof: Vec = Vec::new(); + proof.serialize_uncompressed(&mut serialized_proof).unwrap(); + + Proof::new( + ProofPoints { + raw: serialized_proof, + }, + inputs, + ) + } + + fn verify( + vk: >::VerificationKey, + proof: Proof<>::ProofPoints>, + ) -> bool { + let inputs: Vec<_> = proof + .inputs + .iter() + .map(|s| { + T::try_from_str(s.trim_start_matches("0x"), 16) + .unwrap() + .into_ark() + }) + .collect::>(); + + let proof = ArkProof::< + <::ArkEngine as PairingEngine>::Fr, + MarlinKZG10< + T::ArkEngine, + DensePolynomial<<::ArkEngine as PairingEngine>::Fr>, + >, + >::deserialize_uncompressed(&mut proof.proof.raw.as_slice()) + .unwrap(); + + let vk = IndexVerifierKey::< + <::ArkEngine as PairingEngine>::Fr, + MarlinKZG10< + T::ArkEngine, + DensePolynomial<<::ArkEngine as PairingEngine>::Fr>, + >, + >::deserialize_uncompressed(&mut vk.raw.as_slice()) + .unwrap(); + + use rand_0_7::SeedableRng; + + let rng = &mut rand_0_7::rngs::StdRng::from_entropy(); + + ArkMarlin::< + <::ArkEngine as PairingEngine>::Fr, + MarlinKZG10< + T::ArkEngine, + DensePolynomial<<::ArkEngine as PairingEngine>::Fr>, + >, + Sha256, + >::verify(&vk, &inputs, &proof, rng) + .unwrap() + } +} + +#[cfg(test)] +mod tests { + use crate::flat_absy::FlatVariable; + use crate::ir::{Function, Interpreter, Prog, QuadComb, Statement}; + + use super::*; + use crate::proof_system::scheme::Marlin; + use zokrates_field::{Bls12_377Field, Bw6_761Field}; + + #[test] + fn verify_bls12_377_field() { + let program: Prog = Prog { + main: Function { + id: String::from("main"), + arguments: vec![FlatVariable::new(0)], + returns: vec![FlatVariable::public(0)], + statements: vec![ + Statement::Constraint( + QuadComb::from_linear_combinations( + FlatVariable::new(0).into(), + FlatVariable::new(0).into(), + ), + FlatVariable::new(1).into(), + ), + Statement::Constraint( + FlatVariable::new(1).into(), + FlatVariable::public(0).into(), + ), + ], + }, + private: vec![true], + }; + + let srs = >::universal_setup(5); + let keypair = + >::setup(srs, program.clone()).unwrap(); + let interpreter = Interpreter::default(); + + let witness = interpreter + .execute(&program, &[Bls12_377Field::from(42)]) + .unwrap(); + + let proof = + >::generate_proof(program, witness, keypair.pk); + let ans = >::verify(keypair.vk, proof); + + assert!(ans); + } + + #[test] + fn verify_bw6_761_field() { + let program: Prog = Prog { + main: Function { + id: String::from("main"), + arguments: vec![FlatVariable::new(0)], + returns: vec![FlatVariable::public(0)], + statements: vec![ + Statement::Constraint( + QuadComb::from_linear_combinations( + FlatVariable::new(0).into(), + FlatVariable::new(0).into(), + ), + FlatVariable::new(1).into(), + ), + Statement::Constraint( + FlatVariable::new(1).into(), + FlatVariable::public(0).into(), + ), + ], + }, + private: vec![true], + }; + + let srs = >::universal_setup(5); + let keypair = + >::setup(srs, program.clone()).unwrap(); + let interpreter = Interpreter::default(); + + let witness = interpreter + .execute(&program, &[Bw6_761Field::from(42)]) + .unwrap(); + + let proof = + >::generate_proof(program, witness, keypair.pk); + let ans = >::verify(keypair.vk, proof); + + assert!(ans); + } +} diff --git a/zokrates_core/src/proof_system/ark/mod.rs b/zokrates_core/src/proof_system/ark/mod.rs index aad04f9b..11b25ddb 100644 --- a/zokrates_core/src/proof_system/ark/mod.rs +++ b/zokrates_core/src/proof_system/ark/mod.rs @@ -1,4 +1,5 @@ pub mod gm17; +pub mod marlin; use crate::ir::{CanonicalLinComb, Prog, Statement, Witness}; use ark_gm17::Proof; diff --git a/zokrates_core/src/proof_system/bellman/groth16.rs b/zokrates_core/src/proof_system/bellman/groth16.rs index 796137f7..24cb544b 100644 --- a/zokrates_core/src/proof_system/bellman/groth16.rs +++ b/zokrates_core/src/proof_system/bellman/groth16.rs @@ -4,7 +4,7 @@ use bellman::groth16::{ }; use pairing::{CurveAffine, Engine}; -use crate::proof_system::{Backend, Proof, SetupKeypair}; +use crate::proof_system::{Backend, NonUniversalBackend, Proof, SetupKeypair}; use zokrates_field::BellmanFieldExtensions; use zokrates_field::Field; @@ -18,29 +18,6 @@ use crate::proof_system::Scheme; const G16_WARNING: &str = "WARNING: You are using the G16 scheme which is subject to malleability. See zokrates.github.io/toolbox/proving_schemes.html#g16-malleability for implications."; impl Backend for Bellman { - fn setup(program: Prog) -> SetupKeypair<>::VerificationKey> { - println!("{}", G16_WARNING); - - let parameters = Computation::without_witness(program).setup(); - let mut pk: Vec = Vec::new(); - parameters.write(&mut pk).unwrap(); - - let vk = VerificationKey { - alpha: parse_g1::(¶meters.vk.alpha_g1), - beta: parse_g2::(¶meters.vk.beta_g2), - gamma: parse_g2::(¶meters.vk.gamma_g2), - delta: parse_g2::(¶meters.vk.delta_g2), - gamma_abc: parameters - .vk - .ic - .iter() - .map(|g1| parse_g1::(g1)) - .collect(), - }; - - SetupKeypair::new(vk, pk) - } - fn generate_proof( program: Prog, witness: Witness, @@ -106,6 +83,31 @@ impl Backend for Bellman { } } +impl NonUniversalBackend for Bellman { + fn setup(program: Prog) -> SetupKeypair<>::VerificationKey> { + println!("{}", G16_WARNING); + + let parameters = Computation::without_witness(program).setup(); + let mut pk: Vec = Vec::new(); + parameters.write(&mut pk).unwrap(); + + let vk = VerificationKey { + alpha: parse_g1::(¶meters.vk.alpha_g1), + beta: parse_g2::(¶meters.vk.beta_g2), + gamma: parse_g2::(¶meters.vk.gamma_g2), + delta: parse_g2::(¶meters.vk.delta_g2), + gamma_abc: parameters + .vk + .ic + .iter() + .map(|g1| parse_g1::(g1)) + .collect(), + }; + + SetupKeypair::new(vk, pk) + } +} + mod serialization { use pairing::{from_hex, CurveAffine, Engine}; @@ -152,7 +154,7 @@ mod tests { private: vec![false], }; - let keypair = >::setup(program.clone()); + let keypair = >::setup(program.clone()); let interpreter = Interpreter::default(); let witness = interpreter diff --git a/zokrates_core/src/proof_system/libsnark/gm17.rs b/zokrates_core/src/proof_system/libsnark/gm17.rs index 53779f20..a5d53dc0 100644 --- a/zokrates_core/src/proof_system/libsnark/gm17.rs +++ b/zokrates_core/src/proof_system/libsnark/gm17.rs @@ -5,7 +5,7 @@ use crate::proof_system::libsnark::{ prepare_generate_proof, prepare_public_inputs, prepare_setup, serialization::*, Libsnark, }; use crate::proof_system::Scheme; -use crate::proof_system::{Backend, G1Affine, G2Affine, Proof, SetupKeypair}; +use crate::proof_system::{Backend, G1Affine, G2Affine, NonUniversalBackend, Proof, SetupKeypair}; use std::io::{BufReader, BufWriter, Write}; use zokrates_field::{Bn128Field, Field}; @@ -39,63 +39,6 @@ extern "C" { } impl Backend for Libsnark { - fn setup( - program: Prog, - ) -> SetupKeypair<>::VerificationKey> { - let (a_arr, b_arr, c_arr, a_vec, b_vec, c_vec, num_constraints, num_variables, num_inputs) = - prepare_setup(program); - - let (vk, pk) = unsafe { - let result: SetupResult = gm17_bn128_setup( - a_arr.as_ptr(), - b_arr.as_ptr(), - c_arr.as_ptr(), - a_vec.len() as i32, - b_vec.len() as i32, - c_vec.len() as i32, - num_constraints as i32, - num_variables as i32, - num_inputs as i32, - ); - - let vk: Vec = - std::slice::from_raw_parts(result.vk.data, result.vk.length as usize).to_vec(); - let pk: Vec = - std::slice::from_raw_parts(result.pk.data, result.pk.length as usize).to_vec(); - - // free c allocated buffers - c_free(result.vk.data); - c_free(result.pk.data); - - (vk, pk) - }; - - let vk_slice = vk.as_slice(); - let mut reader = BufReader::new(vk_slice); - - let h = read_g2(&mut reader).unwrap(); - let g_alpha = read_g1(&mut reader).unwrap(); - let h_beta = read_g2(&mut reader).unwrap(); - let g_gamma = read_g1(&mut reader).unwrap(); - let h_gamma = read_g2(&mut reader).unwrap(); - - let mut query = vec![]; - while let Ok(q) = read_g1(&mut reader) { - query.push(q); - } - - let vk = VerificationKey:: { - h, - g_alpha, - h_beta, - g_gamma, - h_gamma, - query, - }; - - SetupKeypair::new(vk, pk) - } - fn generate_proof( program: Prog, witness: Witness, @@ -186,6 +129,65 @@ impl Backend for Libsnark { } } +impl NonUniversalBackend for Libsnark { + fn setup( + program: Prog, + ) -> SetupKeypair<>::VerificationKey> { + let (a_arr, b_arr, c_arr, a_vec, b_vec, c_vec, num_constraints, num_variables, num_inputs) = + prepare_setup(program); + + let (vk, pk) = unsafe { + let result: SetupResult = gm17_bn128_setup( + a_arr.as_ptr(), + b_arr.as_ptr(), + c_arr.as_ptr(), + a_vec.len() as i32, + b_vec.len() as i32, + c_vec.len() as i32, + num_constraints as i32, + num_variables as i32, + num_inputs as i32, + ); + + let vk: Vec = + std::slice::from_raw_parts(result.vk.data, result.vk.length as usize).to_vec(); + let pk: Vec = + std::slice::from_raw_parts(result.pk.data, result.pk.length as usize).to_vec(); + + // free c allocated buffers + c_free(result.vk.data); + c_free(result.pk.data); + + (vk, pk) + }; + + let vk_slice = vk.as_slice(); + let mut reader = BufReader::new(vk_slice); + + let h = read_g2(&mut reader).unwrap(); + let g_alpha = read_g1(&mut reader).unwrap(); + let h_beta = read_g2(&mut reader).unwrap(); + let g_gamma = read_g1(&mut reader).unwrap(); + let h_gamma = read_g2(&mut reader).unwrap(); + + let mut query = vec![]; + while let Ok(q) = read_g1(&mut reader) { + query.push(q); + } + + let vk = VerificationKey:: { + h, + g_alpha, + h_beta, + g_gamma, + h_gamma, + query, + }; + + SetupKeypair::new(vk, pk) + } +} + #[cfg(feature = "libsnark")] #[cfg(test)] mod tests { @@ -209,7 +211,7 @@ mod tests { private: vec![true], }; - let keypair = >::setup(program.clone()); + let keypair = >::setup(program.clone()); let interpreter = Interpreter::default(); let witness = interpreter diff --git a/zokrates_core/src/proof_system/libsnark/pghr13.rs b/zokrates_core/src/proof_system/libsnark/pghr13.rs index 7d3aaf09..e78386c3 100644 --- a/zokrates_core/src/proof_system/libsnark/pghr13.rs +++ b/zokrates_core/src/proof_system/libsnark/pghr13.rs @@ -2,7 +2,7 @@ use crate::proof_system::libsnark::ffi::{c_free, Buffer, ProofResult, SetupResul use crate::proof_system::libsnark::{ prepare_generate_proof, prepare_public_inputs, prepare_setup, Libsnark, }; -use crate::proof_system::{Backend, G1Affine, G2Affine, Proof, SetupKeypair}; +use crate::proof_system::{Backend, G1Affine, G2Affine, NonUniversalBackend, Proof, SetupKeypair}; use crate::ir::{Prog, Witness}; use crate::proof_system::libsnark::serialization::{read_g1, read_g2, write_g1, write_g2}; @@ -42,67 +42,6 @@ extern "C" { } impl Backend for Libsnark { - fn setup( - program: Prog, - ) -> SetupKeypair<>::VerificationKey> { - let (a_arr, b_arr, c_arr, a_vec, b_vec, c_vec, num_constraints, num_variables, num_inputs) = - prepare_setup(program); - - let (vk, pk) = unsafe { - let result: SetupResult = pghr13_bn128_setup( - a_arr.as_ptr(), - b_arr.as_ptr(), - c_arr.as_ptr(), - a_vec.len() as i32, - b_vec.len() as i32, - c_vec.len() as i32, - num_constraints as i32, - num_variables as i32, - num_inputs as i32, - ); - - let vk: Vec = - std::slice::from_raw_parts(result.vk.data, result.vk.length as usize).to_vec(); - let pk: Vec = - std::slice::from_raw_parts(result.pk.data, result.pk.length as usize).to_vec(); - - // free c allocated buffers - c_free(result.vk.data); - c_free(result.pk.data); - - (vk, pk) - }; - - let vk_slice = vk.as_slice(); - let mut reader = BufReader::new(vk_slice); - - let a = read_g2(&mut reader).unwrap(); - let b = read_g1(&mut reader).unwrap(); - let c = read_g2(&mut reader).unwrap(); - let gamma = read_g2(&mut reader).unwrap(); - let gamma_beta_1 = read_g1(&mut reader).unwrap(); - let gamma_beta_2 = read_g2(&mut reader).unwrap(); - let z = read_g2(&mut reader).unwrap(); - - let mut ic = vec![]; - while let Ok(q) = read_g1(&mut reader) { - ic.push(q); - } - - let vk = VerificationKey:: { - a, - b, - c, - gamma, - gamma_beta_1, - gamma_beta_2, - z, - ic, - }; - - SetupKeypair::new(vk, pk) - } - fn generate_proof( program: Prog, witness: Witness, @@ -216,6 +155,69 @@ impl Backend for Libsnark { } } +impl NonUniversalBackend for Libsnark { + fn setup( + program: Prog, + ) -> SetupKeypair<>::VerificationKey> { + let (a_arr, b_arr, c_arr, a_vec, b_vec, c_vec, num_constraints, num_variables, num_inputs) = + prepare_setup(program); + + let (vk, pk) = unsafe { + let result: SetupResult = pghr13_bn128_setup( + a_arr.as_ptr(), + b_arr.as_ptr(), + c_arr.as_ptr(), + a_vec.len() as i32, + b_vec.len() as i32, + c_vec.len() as i32, + num_constraints as i32, + num_variables as i32, + num_inputs as i32, + ); + + let vk: Vec = + std::slice::from_raw_parts(result.vk.data, result.vk.length as usize).to_vec(); + let pk: Vec = + std::slice::from_raw_parts(result.pk.data, result.pk.length as usize).to_vec(); + + // free c allocated buffers + c_free(result.vk.data); + c_free(result.pk.data); + + (vk, pk) + }; + + let vk_slice = vk.as_slice(); + let mut reader = BufReader::new(vk_slice); + + let a = read_g2(&mut reader).unwrap(); + let b = read_g1(&mut reader).unwrap(); + let c = read_g2(&mut reader).unwrap(); + let gamma = read_g2(&mut reader).unwrap(); + let gamma_beta_1 = read_g1(&mut reader).unwrap(); + let gamma_beta_2 = read_g2(&mut reader).unwrap(); + let z = read_g2(&mut reader).unwrap(); + + let mut ic = vec![]; + while let Ok(q) = read_g1(&mut reader) { + ic.push(q); + } + + let vk = VerificationKey:: { + a, + b, + c, + gamma, + gamma_beta_1, + gamma_beta_2, + z, + ic, + }; + + SetupKeypair::new(vk, pk) + } +} + #[cfg(feature = "libsnark")] #[cfg(test)] mod tests { @@ -239,7 +241,7 @@ mod tests { private: vec![true], }; - let keypair = >::setup(program.clone()); + let keypair = >::setup(program.clone()); let interpreter = Interpreter::default(); let witness = interpreter diff --git a/zokrates_core/src/proof_system/mod.rs b/zokrates_core/src/proof_system/mod.rs index 81dd9f48..207e96ff 100644 --- a/zokrates_core/src/proof_system/mod.rs +++ b/zokrates_core/src/proof_system/mod.rs @@ -80,8 +80,6 @@ impl ToString for G2Affine { } pub trait Backend> { - fn setup(program: ir::Prog) -> SetupKeypair; - fn generate_proof( program: ir::Prog, witness: ir::Witness, @@ -90,3 +88,15 @@ pub trait Backend> { fn verify(vk: S::VerificationKey, proof: Proof) -> bool; } +pub trait NonUniversalBackend>: Backend { + fn setup(program: ir::Prog) -> SetupKeypair; +} + +pub trait UniversalBackend>: Backend { + fn universal_setup(size: u32) -> Vec; + + fn setup( + srs: Vec, + program: ir::Prog, + ) -> Result, String>; +} diff --git a/zokrates_core/src/proof_system/scheme/gm17.rs b/zokrates_core/src/proof_system/scheme/gm17.rs index b35889ed..1541533e 100644 --- a/zokrates_core/src/proof_system/scheme/gm17.rs +++ b/zokrates_core/src/proof_system/scheme/gm17.rs @@ -1,4 +1,4 @@ -use crate::proof_system::scheme::Scheme; +use crate::proof_system::scheme::{NonUniversalScheme, Scheme}; use crate::proof_system::solidity::{ SolidityAbi, SOLIDITY_G2_ADDITION_LIB, SOLIDITY_PAIRING_LIB, SOLIDITY_PAIRING_LIB_V2, }; @@ -34,6 +34,10 @@ pub struct VerificationKey { pub query: Vec, } +impl NonUniversalScheme for GM17 {} + +impl NonUniversalScheme for GM17 {} + impl Scheme for GM17 { type VerificationKey = VerificationKey; type ProofPoints = ProofPoints; diff --git a/zokrates_core/src/proof_system/scheme/groth16.rs b/zokrates_core/src/proof_system/scheme/groth16.rs index 1da6489f..908edb86 100644 --- a/zokrates_core/src/proof_system/scheme/groth16.rs +++ b/zokrates_core/src/proof_system/scheme/groth16.rs @@ -1,4 +1,4 @@ -use crate::proof_system::scheme::Scheme; +use crate::proof_system::scheme::{NonUniversalScheme, Scheme}; use crate::proof_system::solidity::{ SolidityAbi, SOLIDITY_G2_ADDITION_LIB, SOLIDITY_PAIRING_LIB, SOLIDITY_PAIRING_LIB_V2, }; @@ -30,6 +30,8 @@ impl Scheme for G16 { type ProofPoints = ProofPoints; } +impl NonUniversalScheme for G16 {} + impl SolidityCompatibleScheme for G16 { fn export_solidity_verifier( vk: >::VerificationKey, diff --git a/zokrates_core/src/proof_system/scheme/marlin.rs b/zokrates_core/src/proof_system/scheme/marlin.rs new file mode 100644 index 00000000..99462631 --- /dev/null +++ b/zokrates_core/src/proof_system/scheme/marlin.rs @@ -0,0 +1,23 @@ +use crate::proof_system::scheme::{Scheme, UniversalScheme}; +use serde::{Deserialize, Serialize}; +use zokrates_field::Field; + +#[allow(clippy::upper_case_acronyms)] +pub struct Marlin; + +#[derive(Serialize, Deserialize)] +pub struct ProofPoints { + pub raw: Vec, +} + +#[derive(Serialize, Deserialize)] +pub struct VerificationKey { + pub raw: Vec, +} + +impl Scheme for Marlin { + type VerificationKey = VerificationKey; + type ProofPoints = ProofPoints; +} + +impl UniversalScheme for Marlin {} diff --git a/zokrates_core/src/proof_system/scheme/mod.rs b/zokrates_core/src/proof_system/scheme/mod.rs index b9a09b80..e3fccaa8 100644 --- a/zokrates_core/src/proof_system/scheme/mod.rs +++ b/zokrates_core/src/proof_system/scheme/mod.rs @@ -4,13 +4,19 @@ use zokrates_field::Field; pub mod gm17; pub mod groth16; +pub mod marlin; pub mod pghr13; pub use self::gm17::GM17; pub use self::groth16::G16; +pub use self::marlin::Marlin; pub use self::pghr13::PGHR13; pub trait Scheme { type VerificationKey: Serialize + DeserializeOwned; type ProofPoints: Serialize + DeserializeOwned; } + +pub trait NonUniversalScheme: Scheme {} + +pub trait UniversalScheme: Scheme {} diff --git a/zokrates_core/src/proof_system/scheme/pghr13.rs b/zokrates_core/src/proof_system/scheme/pghr13.rs index f2ff8f1a..a6256b66 100644 --- a/zokrates_core/src/proof_system/scheme/pghr13.rs +++ b/zokrates_core/src/proof_system/scheme/pghr13.rs @@ -1,4 +1,4 @@ -use crate::proof_system::scheme::Scheme; +use crate::proof_system::scheme::{NonUniversalScheme, Scheme}; use crate::proof_system::solidity::{ SolidityAbi, SOLIDITY_G2_ADDITION_LIB, SOLIDITY_PAIRING_LIB, SOLIDITY_PAIRING_LIB_V2, }; @@ -39,6 +39,8 @@ impl Scheme for PGHR13 { type ProofPoints = ProofPoints; } +impl NonUniversalScheme for PGHR13 {} + impl SolidityCompatibleScheme for PGHR13 { fn export_solidity_verifier( vk: >::VerificationKey, diff --git a/zokrates_core/tests/wasm.rs b/zokrates_core/tests/wasm.rs index b38af18e..7c7799af 100644 --- a/zokrates_core/tests/wasm.rs +++ b/zokrates_core/tests/wasm.rs @@ -6,7 +6,7 @@ extern crate zokrates_field; use wasm_bindgen_test::*; use zokrates_core::flat_absy::FlatVariable; use zokrates_core::ir::{Function, Interpreter, Prog, Statement}; -use zokrates_core::proof_system::Backend; +use zokrates_core::proof_system::{Backend, NonUniversalBackend}; use zokrates_field::Bn128Field; use zokrates_core::proof_system::bellman::Bellman; @@ -32,7 +32,7 @@ fn generate_proof() { .execute(&program, &[Bn128Field::from(42)]) .unwrap(); - let keypair = >::setup(program.clone()); + let keypair = >::setup(program.clone()); let _proof = >::generate_proof(program, witness, keypair.pk); } diff --git a/zokrates_js/Cargo.lock b/zokrates_js/Cargo.lock index 27026784..2566ac33 100644 --- a/zokrates_js/Cargo.lock +++ b/zokrates_js/Cargo.lock @@ -1164,7 +1164,7 @@ version = "0.1.0" [[package]] name = "zokrates_core" -version = "0.6.3" +version = "0.6.4" dependencies = [ "bellman_ce", "bincode", @@ -1192,7 +1192,7 @@ dependencies = [ [[package]] name = "zokrates_embed" -version = "0.1.2" +version = "0.1.3" dependencies = [ "bellman_ce", "sapling-crypto_ce", @@ -1216,7 +1216,7 @@ dependencies = [ [[package]] name = "zokrates_js" -version = "1.0.32" +version = "1.0.33" dependencies = [ "console_error_panic_hook", "js-sys", diff --git a/zokrates_js/src/lib.rs b/zokrates_js/src/lib.rs index cdf98ae2..572c95c7 100644 --- a/zokrates_js/src/lib.rs +++ b/zokrates_js/src/lib.rs @@ -12,7 +12,9 @@ use zokrates_core::imports::Error; use zokrates_core::ir; use zokrates_core::proof_system::bellman::Bellman; use zokrates_core::proof_system::groth16::G16; -use zokrates_core::proof_system::{Backend, Proof, Scheme, SolidityAbi, SolidityCompatibleScheme}; +use zokrates_core::proof_system::{ + Backend, NonUniversalBackend, Proof, Scheme, SolidityAbi, SolidityCompatibleScheme, +}; use zokrates_core::typed_absy::abi::Abi; use zokrates_core::typed_absy::types::ConcreteSignature as Signature; use zokrates_field::Bn128Field; @@ -162,7 +164,7 @@ pub fn compute_witness(program: &[u8], abi: JsValue, args: JsValue) -> Result Result { let program_flattened = deserialize_program(program)?; - let keypair = >::setup(program_flattened); + let keypair = >::setup(program_flattened); Ok(JsValue::from_serde(&keypair).unwrap()) }