From 74617a36758d18dbdea42e4185074b6f7a9f6ba7 Mon Sep 17 00:00:00 2001 From: Matthias Goergens Date: Fri, 24 Jan 2025 13:06:37 +0800 Subject: [PATCH 1/2] Remove broken feature `spartan` The following already fails on `main`: ``` cd circ_blocks cargo check --features=spartan ``` So we might as well use the broken (and thus guaranteed to be unused) feature `spartan`. --- circ_blocks/Cargo.lock | 235 ++++++----------------------------------- circ_blocks/Cargo.toml | 2 - 2 files changed, 35 insertions(+), 202 deletions(-) diff --git a/circ_blocks/Cargo.lock b/circ_blocks/Cargo.lock index 3ac35621..30f228f2 100644 --- a/circ_blocks/Cargo.lock +++ b/circ_blocks/Cargo.lock @@ -1,6 +1,6 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "addchain" @@ -34,7 +34,7 @@ version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" dependencies = [ - "getrandom 0.2.15", + "getrandom", "once_cell", "version_check", ] @@ -167,8 +167,8 @@ dependencies = [ "merlin", "num_cpus", "pairing", - "rand_chacha 0.3.1", - "rand_core 0.6.4", + "rand_chacha", + "rand_core", "rayon", "serde", "subtle", @@ -232,34 +232,13 @@ dependencies = [ "constant_time_eq", ] -[[package]] -name = "block-buffer" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b" -dependencies = [ - "block-padding", - "byte-tools", - "byteorder", - "generic-array 0.12.4", -] - [[package]] name = "block-buffer" version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" dependencies = [ - "generic-array 0.14.7", -] - -[[package]] -name = "block-padding" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa79dedbb091f449f1f39e53edf88d5dbe95f895dae6135a8d7b881fb5af73f5" -dependencies = [ - "byte-tools", + "generic-array", ] [[package]] @@ -271,16 +250,10 @@ dependencies = [ "ff 0.12.2", "group 0.12.1", "pairing", - "rand_core 0.6.4", + "rand_core", "subtle", ] -[[package]] -name = "byte-tools" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" - [[package]] name = "byteorder" version = "1.5.0" @@ -306,7 +279,7 @@ dependencies = [ "circ_hc", "circ_opt", "circ_waksman", - "curve25519-dalek 4.1.3", + "curve25519-dalek", "env_logger 0.11.5", "ff 0.12.2", "from-pest", @@ -332,8 +305,8 @@ dependencies = [ "petgraph", "quickcheck", "quickcheck_macros", - "rand 0.8.5", - "rand_chacha 0.3.1", + "rand", + "rand_chacha", "rayon", "regex", "rsmt2", @@ -341,7 +314,6 @@ dependencies = [ "serde", "serde_bytes", "serde_json", - "spartan", "spartan_parallel", "thiserror", "typed-arena", @@ -360,7 +332,7 @@ dependencies = [ "lazy_static", "num-traits", "paste", - "rand 0.8.5", + "rand", "rug", "serde", ] @@ -526,24 +498,10 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" dependencies = [ - "generic-array 0.14.7", + "generic-array", "typenum", ] -[[package]] -name = "curve25519-dalek" -version = "3.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b9fdf9972b2bd6af2d913799d9ebc165ea4d2e65878e329d9c6b372c4491b61" -dependencies = [ - "byteorder", - "digest 0.9.0", - "rand_core 0.5.1", - "serde", - "subtle", - "zeroize", -] - [[package]] name = "curve25519-dalek" version = "4.1.3" @@ -592,31 +550,13 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "digest" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5" -dependencies = [ - "generic-array 0.12.4", -] - -[[package]] -name = "digest" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" -dependencies = [ - "generic-array 0.14.7", -] - [[package]] name = "digest" version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ - "block-buffer 0.10.4", + "block-buffer", "crypto-common", ] @@ -698,7 +638,7 @@ dependencies = [ "bitvec", "byteorder", "ff_derive 0.12.2", - "rand_core 0.6.4", + "rand_core", "subtle", ] @@ -709,7 +649,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" dependencies = [ "bitvec", - "rand_core 0.6.4", + "rand_core", "subtle", ] @@ -809,15 +749,6 @@ dependencies = [ "byteorder", ] -[[package]] -name = "generic-array" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffdf9f34f1447443d37393cc6c2b8313aebddcd96906caf34e54c68d8e57d7bd" -dependencies = [ - "typenum", -] - [[package]] name = "generic-array" version = "0.14.7" @@ -828,17 +759,6 @@ dependencies = [ "version_check", ] -[[package]] -name = "getrandom" -version = "0.1.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" -dependencies = [ - "cfg-if", - "libc", - "wasi 0.9.0+wasi-snapshot-preview1", -] - [[package]] name = "getrandom" version = "0.2.15" @@ -847,7 +767,7 @@ checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", "libc", - "wasi 0.11.0+wasi-snapshot-preview1", + "wasi", ] [[package]] @@ -874,7 +794,7 @@ dependencies = [ "ff 0.13.0", "halo2curves", "itertools 0.12.1", - "rand_core 0.6.4", + "rand_core", "serde", "subtle", ] @@ -897,7 +817,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5dfbfb3a6cfbd390d5c9564ab283a0349b9b9fcd46a706c1eb10e0db70bfbac7" dependencies = [ "ff 0.12.2", - "rand_core 0.6.4", + "rand_core", "subtle", ] @@ -908,7 +828,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" dependencies = [ "ff 0.13.0", - "rand_core 0.6.4", + "rand_core", "subtle", ] @@ -926,8 +846,8 @@ dependencies = [ "num-traits", "pasta_curves", "paste", - "rand 0.8.5", - "rand_core 0.6.4", + "rand", + "rand_core", "static_assertions", "subtle", ] @@ -978,7 +898,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d0acd33ff0285af998aaf9b57342af478078f53492322fafc47450e09397e0e9" dependencies = [ "bitmaps", - "rand_core 0.6.4", + "rand_core", "rand_xoshiro", "sized-chunks", "typenum", @@ -1157,7 +1077,7 @@ checksum = "58c38e2799fc0978b65dfff8023ec7843e2330bb462f19198840b34b6582397d" dependencies = [ "byteorder", "keccak", - "rand_core 0.6.4", + "rand_core", "zeroize", ] @@ -1234,12 +1154,6 @@ version = "1.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" -[[package]] -name = "opaque-debug" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c" - [[package]] name = "pairing" version = "0.22.0" @@ -1259,7 +1173,7 @@ dependencies = [ "ff 0.13.0", "group 0.13.0", "lazy_static", - "rand 0.8.5", + "rand", "static_assertions", "subtle", ] @@ -1369,7 +1283,7 @@ checksum = "588f6378e4dd99458b60ec275b4477add41ce4fa9f64dcba6f15adccb19b50d6" dependencies = [ "env_logger 0.8.4", "log", - "rand 0.8.5", + "rand", ] [[package]] @@ -1398,18 +1312,6 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" -[[package]] -name = "rand" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" -dependencies = [ - "getrandom 0.1.16", - "rand_chacha 0.2.2", - "rand_core 0.5.1", - "rand_hc", -] - [[package]] name = "rand" version = "0.8.5" @@ -1417,18 +1319,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", - "rand_chacha 0.3.1", - "rand_core 0.6.4", -] - -[[package]] -name = "rand_chacha" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" -dependencies = [ - "ppv-lite86", - "rand_core 0.5.1", + "rand_chacha", + "rand_core", ] [[package]] @@ -1438,16 +1330,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ "ppv-lite86", - "rand_core 0.6.4", -] - -[[package]] -name = "rand_core" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" -dependencies = [ - "getrandom 0.1.16", + "rand_core", ] [[package]] @@ -1456,16 +1339,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.15", -] - -[[package]] -name = "rand_hc" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" -dependencies = [ - "rand_core 0.5.1", + "getrandom", ] [[package]] @@ -1474,7 +1348,7 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6f97cdb2a36ed4183de61b2f824cc45c9f1037f28afe0a322e9fff4c108b5aaa" dependencies = [ - "rand_core 0.6.4", + "rand_core", ] [[package]] @@ -1637,20 +1511,7 @@ checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ "cfg-if", "cpufeatures", - "digest 0.10.7", -] - -[[package]] -name = "sha3" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd26bc0e7a2e3a7c959bc494caf58b72ee0c71d67704e9520f736ca7e4853ecf" -dependencies = [ - "block-buffer 0.7.3", - "byte-tools", - "digest 0.8.1", - "keccak", - "opaque-debug", + "digest", ] [[package]] @@ -1659,7 +1520,7 @@ version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" dependencies = [ - "digest 0.10.7", + "digest", "keccak", ] @@ -1673,26 +1534,6 @@ dependencies = [ "typenum", ] -[[package]] -name = "spartan" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c17d4afb836b39a3be2969f0ad8e805d51dc07dc1345374fdac9e4f8386a967" -dependencies = [ - "bincode", - "byteorder", - "curve25519-dalek 3.2.0", - "digest 0.8.1", - "flate2", - "itertools 0.10.5", - "merlin", - "rand 0.7.3", - "serde", - "sha3 0.8.2", - "subtle", - "zeroize", -] - [[package]] name = "spartan_parallel" version = "0.8.0" @@ -1700,17 +1541,17 @@ dependencies = [ "bincode", "byteorder", "colored", - "curve25519-dalek 4.1.3", - "digest 0.10.7", + "curve25519-dalek", + "digest", "ff 0.13.0", "flate2", "goldilocks", "itertools 0.13.0", "merlin", - "rand 0.8.5", + "rand", "rayon", "serde", - "sha3 0.10.8", + "sha3", "subtle", "zeroize", ] @@ -1842,12 +1683,6 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" -[[package]] -name = "wasi" -version = "0.9.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" - [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" diff --git a/circ_blocks/Cargo.toml b/circ_blocks/Cargo.toml index 7a97c52a..6f00637b 100644 --- a/circ_blocks/Cargo.toml +++ b/circ_blocks/Cargo.toml @@ -50,7 +50,6 @@ pest-ast = { version = "0.3", optional = true } from-pest = { version = "0.3", optional = true } itertools = "0.10" petgraph = { version = "0.6", optional = true } -spartan = { version = "0.8", default-features = false, optional = true } spartan_parallel = { path = "../spartan_parallel", default-features = false, features = [ "multicore", "profile", @@ -84,7 +83,6 @@ smt = ["rsmt2", "ieee754"] lp = ["good_lp", "lp-solvers"] aby = ["lp"] r1cs = ["bincode", "rayon"] -spartan = ["r1cs", "dep:spartan", "curve25519-dalek", "bincode", "gmp-mpfr-sys"] bellman = [ "r1cs", "dep:bellman", From 285aeeaf278e785f793cc84b14de4f09f3c26e6a Mon Sep 17 00:00:00 2001 From: Matthias Goergens Date: Fri, 24 Jan 2025 14:35:15 +0800 Subject: [PATCH 2/2] Remove spartan everywhere --- circ_blocks/driver.py | 12 +- circ_blocks/examples/cp.rs | 1 - circ_blocks/examples/zk.rs | 19 -- circ_blocks/src/target/r1cs/mod.rs | 2 - circ_blocks/src/target/r1cs/spartan.rs | 254 ------------------------- circ_blocks/util.py | 2 +- 6 files changed, 6 insertions(+), 284 deletions(-) delete mode 100644 circ_blocks/src/target/r1cs/spartan.rs diff --git a/circ_blocks/driver.py b/circ_blocks/driver.py index c3ee4841..3231d53c 100755 --- a/circ_blocks/driver.py +++ b/circ_blocks/driver.py @@ -128,13 +128,11 @@ def test(features, extra_args): if "lp" in features: log_run_check(["./scripts/test_zok_to_ilp.zsh"]) if "r1cs" in features: - if "spartan" in features: # spartan field - log_run_check(["./scripts/spartan_zok_test.zsh"]) - else: # bellman field - log_run_check(["./scripts/zokrates_test.zsh"]) - if "poly" in features: - log_run_check(["./scripts/cp_test.zsh"]) - log_run_check(["./scripts/ram_test.zsh"]) + # bellman field + log_run_check(["./scripts/zokrates_test.zsh"]) + if "poly" in features: + log_run_check(["./scripts/cp_test.zsh"]) + log_run_check(["./scripts/ram_test.zsh"]) if "lp" in features and "r1cs" in features: log_run_check(["./scripts/test_zok_to_ilp_pf.zsh"]) diff --git a/circ_blocks/examples/cp.rs b/circ_blocks/examples/cp.rs index ee4de323..fe862f64 100644 --- a/circ_blocks/examples/cp.rs +++ b/circ_blocks/examples/cp.rs @@ -32,7 +32,6 @@ struct Options { #[derive(PartialEq, Debug, Clone, ValueEnum)] /// `Prove`/`Verify` execute proving/verifying in bellman separately -/// `Spartan` executes both proving/verifying in spartan enum ProofAction { Prove, Verify, diff --git a/circ_blocks/examples/zk.rs b/circ_blocks/examples/zk.rs index c157885d..edde3f83 100644 --- a/circ_blocks/examples/zk.rs +++ b/circ_blocks/examples/zk.rs @@ -9,11 +9,6 @@ use bls12_381::Bls12; #[cfg(feature = "bellman")] use circ::target::r1cs::{bellman::Bellman, mirage::Mirage, proof::ProofSystem}; -#[cfg(feature = "spartan")] -use circ::ir::term::text::parse_value_map; -#[cfg(feature = "spartan")] -use circ::target::r1cs::spartan; - #[derive(Debug, Parser)] #[command(name = "zk", about = "The CirC ZKP runner")] struct Options { @@ -39,11 +34,9 @@ struct Options { #[derive(PartialEq, Debug, Clone, ValueEnum)] /// `Prove`/`Verify` execute proving/verifying in bellman separately -/// `Spartan` executes both proving/verifying in spartan enum ProofAction { Prove, Verify, - Spartan, } #[derive(PartialEq, Debug, Clone, ValueEnum)] @@ -89,17 +82,5 @@ fn main() { } #[cfg(not(feature = "bellman"))] (ProofAction::Prove | ProofAction::Verify, _) => panic!("Missing feature: bellman"), - #[cfg(feature = "spartan")] - (ProofAction::Spartan, _) => { - let prover_input_map = parse_value_map(&std::fs::read(opts.pin).unwrap()); - println!("Spartan Proving"); - let (gens, inst, proof) = spartan::prove(opts.prover_key, &prover_input_map).unwrap(); - - let verifier_input_map = parse_value_map(&std::fs::read(opts.vin).unwrap()); - println!("Spartan Verifying"); - spartan::verify(opts.verifier_key, &verifier_input_map, &gens, &inst, proof).unwrap(); - } - #[cfg(not(feature = "spartan"))] - (ProofAction::Spartan, _) => panic!("Missing feature: spartan"), } } diff --git a/circ_blocks/src/target/r1cs/mod.rs b/circ_blocks/src/target/r1cs/mod.rs index 3679547d..c0b52998 100644 --- a/circ_blocks/src/target/r1cs/mod.rs +++ b/circ_blocks/src/target/r1cs/mod.rs @@ -18,8 +18,6 @@ pub mod bellman; pub mod mirage; pub mod opt; pub mod proof; -#[cfg(feature = "spartan")] -pub mod spartan; pub mod trans; pub mod wit_comp; diff --git a/circ_blocks/src/target/r1cs/spartan.rs b/circ_blocks/src/target/r1cs/spartan.rs deleted file mode 100644 index 80a1a058..00000000 --- a/circ_blocks/src/target/r1cs/spartan.rs +++ /dev/null @@ -1,254 +0,0 @@ -//! Export circ R1cs to Spartan -use crate::target::r1cs::*; -use bincode::{deserialize_from, serialize_into}; -use curve25519_dalek::scalar::Scalar; -use fxhash::FxHashMap as HashMap; -use gmp_mpfr_sys::gmp::limb_t; -use libspartan::{Assignment, InputsAssignment, Instance, NIZKGens, VarsAssignment, NIZK}; -use merlin::Transcript; -use rug::Integer; -use std::fs::File; -use std::io; -use std::io::{BufReader, BufWriter}; -use std::path::Path; - -/// Hold Spartan variables -#[derive(Debug)] -pub struct Variable { - sid: usize, - value: [u8; 32], -} - -/// generate spartan proof -pub fn prove>( - p_path: P, - inputs_map: &HashMap, -) -> io::Result<(NIZKGens, Instance, NIZK)> { - let prover_data = read_prover_data::<_>(p_path)?; - - println!("Converting R1CS to Spartan"); - let (inst, wit, inps, num_cons, num_vars, num_inputs) = - spartan::r1cs_to_spartan(&prover_data, inputs_map); - - println!("Proving with Spartan"); - assert_ne!(num_cons, 0, "No constraints"); - - // produce public parameters - let gens = NIZKGens::new(num_cons, num_vars, num_inputs); - // produce proof - let mut prover_transcript = Transcript::new(b"nizk_example"); - let pf = NIZK::prove(&inst, wit, &inps, &gens, &mut prover_transcript); - - Ok((gens, inst, pf)) -} - -/// verify spartan proof -pub fn verify>( - v_path: P, - inputs_map: &HashMap, - gens: &NIZKGens, - inst: &Instance, - proof: NIZK, -) -> io::Result<()> { - let verifier_data = read_verifier_data::<_>(v_path)?; - - let values = verifier_data.eval(inputs_map); - - let mut inp = Vec::new(); - for v in &values { - let scalar = int_to_scalar(&v.i()); - inp.push(scalar.to_bytes()); - } - let inputs = InputsAssignment::new(&inp).unwrap(); - - println!("Verifying with Spartan"); - let mut verifier_transcript = Transcript::new(b"nizk_example"); - assert!(proof - .verify(inst, &inputs, &mut verifier_transcript, gens) - .is_ok()); - - println!("Proof Verification Successful!"); - Ok(()) -} - -/// circ R1cs -> spartan R1CSInstance -pub fn r1cs_to_spartan( - prover_data: &ProverData, - inputs_map: &HashMap, -) -> (Instance, Assignment, Assignment, usize, usize, usize) { - // spartan format mapper: CirC -> Spartan - let mut wit = Vec::new(); - let mut inp = Vec::new(); - let mut trans: HashMap = HashMap::default(); // Circ -> spartan ids - let mut itrans: HashMap = HashMap::default(); // spartan ids -> Circ - - // check modulus - let f_mod = prover_data.r1cs.field.modulus(); - let s_mod = Integer::from_str_radix( - "7237005577332262213973186563042994240857116359379907606001950938285454250989", - 10, - ) - .unwrap(); - assert_eq!( - &s_mod, f_mod, - "\nR1CS has modulus \n{s_mod},\n but Spartan CS expects \n{f_mod}", - ); - - let values = prover_data.extend_r1cs_witness(inputs_map); - prover_data.r1cs.check_all(&values); - - assert_eq!(values.len(), prover_data.r1cs.vars.len()); - - for var in prover_data.r1cs.vars.iter() { - assert!(matches!(var.ty(), VarType::Inst | VarType::FinalWit)); - if let VarType::FinalWit = var.ty() { - // witness - let id = wit.len(); - itrans.insert(id, *var); - trans.insert(*var, id); - let val = values.get(var).expect("missing R1CS value"); - wit.push(int_to_scalar(&val.i()).to_bytes()); - } - } - - let const_id = wit.len(); - - for var in prover_data.r1cs.vars.iter() { - assert!(matches!(var.ty(), VarType::Inst | VarType::FinalWit)); - if let VarType::Inst = var.ty() { - // input - let id = wit.len() + 1 + inp.len(); - itrans.insert(id, *var); - trans.insert(*var, id); - let val = values.get(var).expect("missing R1CS value"); - inp.push(int_to_scalar(&val.i()).to_bytes()); - } - } - - let num_vars = wit.len(); - let num_inputs = inp.len(); - assert_eq!(wit.len() + inp.len(), prover_data.r1cs.vars.len()); - - let assn_witness = VarsAssignment::new(&wit).unwrap(); - let assn_inputs = InputsAssignment::new(&inp).unwrap(); - - // circuit - let mut m_a: Vec<(usize, usize, [u8; 32])> = Vec::new(); - let mut m_b: Vec<(usize, usize, [u8; 32])> = Vec::new(); - let mut m_c: Vec<(usize, usize, [u8; 32])> = Vec::new(); - - let mut i = 0; // constraint # - for (lc_a, lc_b, lc_c) in prover_data.r1cs.constraints.iter() { - // circ Lc (const, monomials ) -> Vec - let a = lc_to_v(lc_a, const_id, &trans); - let b = lc_to_v(lc_b, const_id, &trans); - let c = lc_to_v(lc_c, const_id, &trans); - - // constraint # x identifier (vars, 1, inp) - for Variable { sid, value } in a { - m_a.push((i, sid, value)); - } - for Variable { sid, value } in b { - m_b.push((i, sid, value)); - } - for Variable { sid, value } in c { - m_c.push((i, sid, value)); - } - - i += 1; - } - - let num_cons = i; - - let inst = Instance::new(num_cons, num_vars, num_inputs, &m_a, &m_b, &m_c).unwrap(); - - // check if the instance we created is satisfiable - let res = inst.is_sat(&assn_witness, &assn_inputs); - assert!(res.unwrap()); - - ( - inst, - assn_witness, - assn_inputs, - num_cons, - num_vars, - num_inputs, - ) -} - -fn int_to_scalar(i: &Integer) -> Scalar { - let mut accumulator = Scalar::zero(); - let limb_bits = (std::mem::size_of::() as u64) << 3; - assert_eq!(limb_bits, 64); - - let two: u64 = 2; - let mut m = Scalar::from(two.pow(63)); - m *= Scalar::from(two); - - // as_ref yeilds a least-significant-first array. - for digit in i.as_ref().iter().rev() { - accumulator *= m; - accumulator += Scalar::from(*digit); - } - accumulator -} - -// circ Lc (const, monomials ) -> Vec -fn lc_to_v(lc: &Lc, const_id: usize, trans: &HashMap) -> Vec { - let mut v: Vec = Vec::new(); - - for (k, m) in &lc.monomials { - let scalar = int_to_scalar(&m.i()); - - let var = Variable { - sid: *trans.get(k).unwrap(), - value: scalar.to_bytes(), - }; - v.push(var); - } - if lc.constant.i() != 0 { - let scalar = int_to_scalar(&lc.constant.i()); - let var = Variable { - sid: const_id, - value: scalar.to_bytes(), - }; - v.push(var); - } - v -} - -/// write prover and verifier data to file -pub fn write_data, P2: AsRef>( - p_path: P1, - v_path: P2, - p_data: &ProverData, - v_data: &VerifierData, -) -> io::Result<()> { - write_prover_data(p_path, p_data)?; - write_verifier_data(v_path, v_data)?; - Ok(()) -} - -fn write_prover_data>(path: P, data: &ProverData) -> io::Result<()> { - let mut file = BufWriter::new(File::create(path)?); - serialize_into(&mut file, &data).unwrap(); - Ok(()) -} - -fn read_prover_data>(path: P) -> io::Result { - let mut file = BufReader::new(File::open(path)?); - let data: ProverData = deserialize_from(&mut file).unwrap(); - Ok(data) -} - -fn write_verifier_data>(path: P, data: &VerifierData) -> io::Result<()> { - let mut file = BufWriter::new(File::create(path)?); - serialize_into(&mut file, &data).unwrap(); - Ok(()) -} - -fn read_verifier_data>(path: P) -> io::Result { - let mut file = BufReader::new(File::open(path)?); - let data: VerifierData = deserialize_from(&mut file).unwrap(); - Ok(data) -} diff --git a/circ_blocks/util.py b/circ_blocks/util.py index 01272e8a..8a086cb7 100644 --- a/circ_blocks/util.py +++ b/circ_blocks/util.py @@ -7,7 +7,7 @@ # TODO: add in "kahip", "kahypar" binaries dependencies when adding new MPC changes cargo_features = {"aby", "c", "lp", "r1cs", "smt", - "zok", "datalog", "bellman", "spartan", "poly"} + "zok", "datalog", "bellman", "poly"} def save_mode(mode):